C/C++

Помогите со Структурой, найти ошибку

Не знаешь если ошибка и вообще ли правильно, Задание: Создать структура согласно условию и вывести результат на экран: на междугородной АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона абонента.Вывести для заданного города общее время разговоров с ним и сумму.

#include <iostream>
#include <string.h>
#include <conio.h>
#include <math.h>

char OutRus[256];

char* RUS(const char*text)
{
CharToOem(text,OutRus);
return OutRus;
}

int main()
{
struct strc
{
char date[10];
char name[100];
char nameg[100];
double time;
int tarif;
int kod;
char nomer[7];
char nab[7];
} mats[10];
int i,n,stime=0,sum,ssum=0;
char nameg[100];
cout<<RUS("Введите количество абонентов:"); cin>>n;
for (i=0;i<n;i++)
{
cout<<endl<<RUS("Номер:")<<i+1;
cout<<endl<<RUS("Введите дату:"); cin>>mats[i].date;
cout<<endl<<RUS("Введите код города:"); cin>>mats[i].kod;
cout<<endl<<RUS("Введите город:"); cin>>mats[i].name;
cout<<endl<<RUS("Введите время:"); cin>>mats[i].time;
cout<<endl<<RUS("Введите тариф:"); cin>>mats[i].tarif;
cout<<endl<<RUS("Введите номер телефона:"); cin>>mats[i].nomer;
cout<<endl<<RUS("Введите номер абонента:"); cin>>mats[i].nab;
}
cout<<endl<<RUS("Введите город для вывода:"); cin>>nameg;
for (i=0;i<n;i++)
{ if (nameg==mats[i].name) {
stime=stime+mats[i].time;
sum=mats[i].time*mats[i].tarif; }
cout<<endl<<RUS("Сумма абонента ")<<i<<":"<<sum<<endl;}
ssum=ssum+sum;
cout<<endl<<RUS("Общее время разговоров:")<<stime;
cout<<endl<<RUS("Общая сумма разговоров:")<<ssum;
getch();
}
Паша Ларин
Паша Ларин
180
#include <string>
#include <iostream>
#include <vector>
using namespace std;
void clear(istream& inp) {
inp.ignore(numeric_limits<size_t>::max(), '\n');
}
int integer(istream& inp, const char* msg) {
cout << msg;
int value;
inp >> value;
clear(inp);
return value;
}
struct Time {
int h;
int m;
int s;
Time() : h(0), m(0), s(0) {}
Time(int hh, int mm, int ss) : h(hh), m(mm), s(ss) {
while (s >= 60) {
++m;
s -= 60;
}
while (m >= 60) {
++h;
m -= 60;
}
}
Time& operator+=(const Time& t) {
*this = *this + t;
return *this;
}
friend Time operator+(const Time& a, const Time& b) {
Time t(a.h + b.h, a.m + b.m, a.s + b.s);
return t;
}
string time()const {
string box = to_string(h) + ":";
if (m < 10) box += "0";
box += to_string(m) + ":";
if (s < 10) box += "0";
box += to_string(s);
return box;
}
int fullmin()const {
auto min = h * 60 + m;
if (s > 0) ++min;
return min;
}
friend ostream& operator<<(ostream& out, const Time& t) {
return out << t.time();
}
};
Time times(istream& inp, const char* msg) {
puts(msg);
auto h = integer(inp, " - часы: ");
auto m = integer(inp, " - минуты: ");
auto s = integer(inp, " - секунды: ");
Time t{ h, m, s };
return t;
}
struct Money {
int rub;
int cop;
Money() : rub(0), cop(0) {}
Money(int r, int c) : rub(r), cop(c) {
while (cop >= 100) {
++rub;
cop -= 100;
}
}
Money& operator+=(const Money& m) {
*this = *this + m;
return *this;
}
friend Money operator*(const Time& t, const Money& m) {
Money tmp{ m.rub * t.fullmin(), m.cop * t.fullmin() };
return tmp;
}
friend Money operator*(const Money& m, const Time& t) {
Money tmp{ m.rub * t.fullmin(), m.cop * t.fullmin() };
return tmp;
}
friend Money operator+(const Money& a, const Money& b) {
Money m(a.rub + b.rub, a.cop + b.cop);
return m;
}
friend ostream& operator<<(ostream& out, const Money& m) {
out << m.rub << ".";
if (m.cop < 10) out << "0";
return out << m.cop;
}
};
Money money(istream& inp, const char* msg) {
puts(msg);
auto rub = integer(inp, " - рублей: ");
auto cop = integer(inp, " - копеек: ");
Money money{ rub, cop };
return money;
}
string word(istream& inp, const char* msg) {
cout << msg;
string value;
inp >> value;
clear(inp);
return value;
}
string line(istream& inp, const char* msg) {
cout << msg;
string value;
getline(inp, value);
return value;
}
struct Connection {
int code;
Money tariff;
Time time;
string date;
string city;
string number;
Connection() : code(0) {}
Money cost()const {
return tariff * time;
}
friend istream& operator>>(istream& inp, Connection& con) {
con.date = word(inp, "Введите дату: ");
con.code = integer(inp, "Введите код города: ");
con.city = word(inp, "Введите название города: ");
con.time = times(inp, "Введите время разговора: ");
con.tariff = money(inp, "Введите тариф: ");
con.number = word(inp, "Введите номер телефона: ");
return inp;
}
};
class Registrar {
public:
void add(const Connection& con) {
table.push_back(con);
}
Money income(const string& city)const {
Money inc;
for (const auto& record : table)
if (record.city == city)
inc += record.cost();
return inc;
}
Time duration(const string& city)const {
Time dur;
for (const auto& record : table)
if (record.city == city)
dur += record.time;
return dur;
}
private:
vector<Connection> table;
};
int main() {
system("chcp 1251 > nul");
Registrar reg;
auto abn = integer(cin, "Введите количество абонентов: ");
Connection con;
for (auto i = 0; i < abn; ++i) {
puts("");
cin >> con;
reg.add(con);
}
auto city = word(cin, "\nВыберите город: ");
cout
<< "\nОбщее время разговора: " << reg.duration(city) << '\n'
<< "Сумма дохода: " << reg.income(city) << '\n';
system("pause > nul");
}
Алексей Жуков
Алексей Жуков
67 078
Лучший ответ
Паша Ларин main.cpp:6:12: error: ‘numeric_limits’ was not declared in this scope
6 | inp.ignore(numeric_limits::max(), '\n');
| ^~~~~~~~~~~~~~
main.cpp:6:33: error: expected primary-expression before ‘>’ token
6 | inp.ignore(numeric_limits::max(), '\n');
| ^
main.cpp:6:40: error: no matching function for call to ‘max()’
6 | inp.ignore(numeric_limits::max(), '\n');
| ^
0. #include < windows.h > для следующей функции
1. CharToOemA без буквы A в конце работает с wchar
2. using namespace std не хватает
3. sum не задана
Костя Зинин
Костя Зинин
51 411
Значит так, сейчас будет много критики, но она не столько по конкретной реализации сколько по тому, что за ней стоит.
1. Функция RUS тут вообще не нужна никаким боком. Как и getch(). Это все костыли, которые вы вынуждены использовать для борьбы с Windows и вашей IDE. Вместо того, чтобы сразу написать текст в нужной кодировке вы его перекодируете на лету, причем не самым удачным образом. Ну а getch вам нужна потому что вы ленитесь запустить программу из консоли а запуск из IDE закрывает окошко слишком быстро.
2. Для хранения подобных данных лучше использовать не массив структур а связанный список структур. Тогда вам не придется задавать пользователю дурацкие вопросы вроде "А сколько у нас абонентов?".
3. double time - это вообще никуда не годится. Вообще для хранения даты и времени было бы наиболее логично перевести их в time_t и хранить все это вместе в одной переменной. В этом вам поможет функция mktime
4. Использование массивов фиксированной длины, на мой взгляд, не самое удачное решение. Раз уж вы программируете на С++ а не на чистом С, то кто мешает использовать std::string?
5. Ввод информации в структуру логично было бы вынести в отдельную функцию. И сохранять данные в хранилище только при условии, что была введена адекватная информация.
RS
Raximov Sherzod
9 624