Екатерина Куст. Версия 2

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Project_19.05.2014.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
class detal{
private:
char *name;//название детали
char *status;//статус
double *weight;//вес
int *size;//количество деталей одного вида(добавлено для показа перегрузки оператора "+")
public:
detal(){//конструктор
name = new char[20];
status = new char[];
weight = new double[];
size = new int[];
}
virtual ~detal(){//деструктор
//delete name;
///*delete weight;
//delete size;
//delete[]status; */
}
char *GetStatus(){return status;}//функция получения статуса детали: заказан(+) или нет(-).
double *GetWeight(){return weight;}//функция получения веса детали
int *GetSize(){return size;}//функция получения количества деталей даного вида
char *GetName(){return name;};
friend ostream& operator<<(ostream& os, detal &temp){//перегруженный оператор бинарного сдвига влево
return os<<"\n\t|"<<setw(10)<<temp.name<<" | "<<setw(5)<<temp.status<<" | "<<setw(5)<<*temp.weight<<" | "<<setw(5)<<*temp.size<<" | ";
}
friend istream& operator>>(istream& in, detal &temp){//перегруженный оператор бинарного сдвига вправо
return in>>temp.name>>temp.status>>*temp.weight>>*temp.size;
}
friend detal& operator+=(detal& a, const detal& b){//перегруженный оператор +=//из-за его "полезности" пришлось добавить кучку лишнего кода
*a.size+=*b.size;
return a;
}
};
class partia_detaley{
private:
detal *NaborDetaley;//массив хранящий список деталей
int *num; //количество всех деталей в партии
double *all_weight; //масса деталей в партии
detal *ZaDet;//список Заказанных деталей
int *kolZakDet;//количество Заказанных деталей
public:
partia_detaley(char *filename){ //инициализирующий конструктор
num=new int(0);
all_weight=new double(0);
ZaDet = new detal();
kolZakDet = new int(0);
NaborDetaley = Load(filename);
}
~partia_detaley(){ //деструктор
delete[]NaborDetaley;
delete[]num;
delete[]all_weight;
delete[]ZaDet;
delete[]kolZakDet;
}
detal *Load(char *filename){//функция считывания из файла
ifstream in(filename);
int j=0;
bool v=false;
if (!in) cout<<"File is not exist!";
else{
in>>*num>>*kolZakDet;//вводим количество всех и заказанных деталей
NaborDetaley = new detal[*num];
ZaDet = new detal[*kolZakDet];
for(int i=0; i<*num;i++){
in>>NaborDetaley[i];
*all_weight+=*NaborDetaley[i].GetWeight()*(*NaborDetaley[i].GetSize());
if(*NaborDetaley[i].GetStatus() == '+') {
if(j>0){
v=false;
for(int k=0;k<j;k++){
if(*ZaDet[k].GetName()==*NaborDetaley[i].GetName()){
ZaDet[k]+=NaborDetaley[i];//"полезная" перегрузка оператора "+"
v = true;
}
}
if(v==false){
ZaDet[j]=NaborDetaley[i];
j++;
}
}
else {
ZaDet[j]=NaborDetaley[i];
j++;
}
}
}
*kolZakDet=j;
}
return NaborDetaley;
}
void Upload(char *filename){
ofstream out(filename);
out<<"Общий вес всех деталей: "<<*all_weight<<"\nНазвания заказанных деталей:";
for(int i=0;i<*kolZakDet;i++) out<<ZaDet[i];
out.close();
}
};
void main(){ //главная функция
setlocale(LC_ALL,"russian");
partia_detaley *first = new partia_detaley("input.txt");
first->Upload("output.txt");
delete first;
cin.get();
}
----------------------------------------
input.txt
----------------------------------------
8 5
Болт + 1.1 20
Шуруп + 0.05 50
Гайка - 0.8 5
Шуруп + 0.05 60
Молоток + 0.5 3
Проволока - 0.9 4
Болт + 1.1 9
Гайка - 0.8 8