C/C++

Помогите пожалуйста с задачей по С++

Ваня учится в школе на пятерки. Почти каждый день он забывает взять с собой дневник, и поэтому его ругают завучи, а учителя не ставят заслуженные оценки. Ваня знает, что его забывчивость безнадежна, поэтому попросил вас сделать для него свой собственный электронный дневник, который не нужно будет брать с собой.

Он сам уже немного изучал на информатике ООП, поэтому смог написать класс Оценка (Mark):

#include < iostream>
#include < iomanip>
#include < string>
#include < vector>

using namespace std ;

class Mark {
public :
// сама оценка
int score ;
// вес оценки
int weight ;
// комментарий к оценке
string comment ;

// считывание данных об оценке с клавиатуры
void read( ) {
cin > > score > > weight > > comment;
}
} ;
Дальше Ваня писать уже не может - не умеет, но он хочет, чтобы все его оценки хранились в массиве, преподаватели могли ставить оценки в дневник с помощью команды add оценка вес комментарий, а он сам мог узнавать свой текущий средний балл по команде average (каждая оценка умножается на свой вес, все это суммируется, а потом делится на сумму всех весов). Помогите ему - опишите за него функцию main() и отправьте ее в качестве решения к этой задаче.

Формат входных данных
В первой строке вводится количество команд n.

В последующих n строках вводятся команды: average или add оценка вес комментарий

Формат выходных данных
В качестве реакции на каждую команду average ваша программа должна выводить одно вещественное число с точностью до 2 знаков после запятой - средний балл Вани.

Примечания
Отправьте только описание функции main().

Не забывайте про arr.push_back() и arr.size().

Вывод вещественного числа: cout << fixed << setprecision(2) << a;

входные данные
3
add 5 3 homework
add 4 5 test
average
выходные данные
4.38
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
class Mark {
public:
int score;
int weight;
string comment;
void read() {
cin >> score >> weight >> comment;
}
};
void flush(istream& inp) {
inp.ignore(numeric_limits<streamsize>::max(), '\n');
}
int main() {
size_t n;
cin >> n;
flush(cin);
vector<Mark> box;
string line;
for (auto i = 0U; i < n; ++i) {
getline(cin, line);
istringstream iss(line);
string command;
iss >> command;
if (command == "add") {
Mark mark;
iss >> mark.score >> mark.weight >> mark.comment;
box.emplace_back(mark);
flush(iss);
} else if (command == "average") {
int sum = 0;
double weight = 0;
for (const auto& mark : box) {
sum += mark.score * mark.weight;
weight += mark.weight;
}
cout << fixed << setprecision(2) << sum / weight << '\n';
}
}
system("pause > nul");
}
Вадим Старовойтов
Вадим Старовойтов
76 046
Лучший ответ
Я не спорю с предыдущим решением но я увидел несколько незнакомых приёмов и решил сам решить

int main() {
double sum = 0, count = 0, arr=0;

string s;
int n;
cin >> n;
vector <Mark> line;
cin >> s;
for (int i = 0; i < n; i++) {
Mark p;
if (s == "add") {
p.read ();
line.push_back(p);
sum += p.score * p.weight;
count += p.weight;
}
if (s == "average")
{
if (sum / count>0) { cout << fixed << setprecision(2) << sum / count << endl; }
else { cout << fixed << setprecision(2)<< arr; }
}
cin >> s;
}
}
Рахим Икромов не работает