Другие языки программирования и технологии

C++ помогите пожалуйста! Без вашей помощи никак не получается

Добрый преподаватель Иванов Иван Иваныч решил на последнем занятии улучшить всем ребятам из его класса средний балл. Для этого он решил добавлять им пятерки, пока средний балл не станет равен хотя бы 4.5.

Напишите функцию void add_mark(Student &s, int mark), которая добавляет ученику s оценку mark.

Воспользовавшись функциями, написанными в предыдущем занятии, и функцией add_mark, считайте с клавиатуры 5 учащихся, которые учатся у Ивана Иваныча, подредактируйте их оценки, и выведите новый журнал учащихся.

Формат входных данных
C клавиатуры подряд вводятся описания 5 учеников: имя и фамилия (слова из латинских букв не длиннее 50 символов), возраст (натуральное число, не превышающее 100), класс (целое число от 1 до 11), количество оценок ( целое неотрицательно число, не превышающее 30), оценки. Каждая из оценок — целое число от 2 до 5.

Формат выходных данных
Требуется вывести 5 учащихся в том же формате, в котором они и вводились (но без перевода строк между учениками).
входные данные
Bill Gates 15 7 3
2 5 3

Sergey Brin 10 4 5
5 3 4 5 4

Linus Torvalds 12 5 2
4 5

Larry Ellison 17 11 4
4 4 4 4

выходные данные

Steve Jobs 16 9 3
2 2 3
Bill Gates 15 7 10
2 5 3 5 5 5 5 5 5 5
Sergey Brin 10 4 8
5 3 4 5 4 5 5 5
Linus Torvalds 12 5 2
4 5
Larry Ellison 17 11 8
4 4 4 4 5 5 5 5
Steve Jobs 16 9 16
2 2 3 5 5 5 5 5 5 5 5 5 5 5 5 5

Кому интересно, вот код:

#include < iostream>
#include < cmath>
#include < iomanip>
using namespace std;
struct Student {
char name [56];
char surname [56];
int age;
int grade;
int mark_count;
int *marks;
};
Student read_student() {
Student s;
cin >> s.name >> s.surname >> s.age >> s.grade >> s.mark_count;
s.marks = new int[s.mark_count];
for (int i = 0; i < s.mark_count; i++) cin >> s.marks[i];
return s;
}
void add_mark (Student &person) {
double sum = 0;
for (int i = 0; i < person.mark_count; i++) {
sum += person.marks[i];
}
double rez = sum / person.mark_count;
int counter = 0;
double sum_del = sum;
double rez_del = rez;
int person_mark_count_del = person.mark_count;
if (rez < 4.5) {
while (rez_del < 4.5) {
rez_del = sum_del / person_mark_count_del;
sum_del += 5;
person_mark_count_del += 1;
counter++;
}
counter--;
}
int *marks = new int[person_mark_count_del];
for (int i = 0; i < person.mark_count; i++) marks[i] = person.marks[i];
for (int i = person.mark_count; i < person_mark_count_del; i++) marks[i] = 5;
delete [] person.marks;
person.marks = marks;
person.mark_count = person_mark_count_del;
}
void student (Student &person) {
cout << person.name << " " << person.surname << " " << person.age << " " << person.grade << " " << person.mark_count << " " << endl;
for (int i = 0; i < person.mark_count; i++) cout << person.marks[i] << " ";
cout << endl;
}
int main() {
Student data[5];
for (int i = 0; i < 5; i++)
data[i] = read_student();
for (int i = 0; i < 5; i++)
add_mark(data[i]);
for (int i = 0; i < 5; i++)
student(data[i]);
for (int i = 0; i < 5; i++)
delete [] data[i].marks;
return 0;
}
VT
Viktor Tschanko
73
#include <iostream>
#include <string>
#include <vector>
#include <numeric>
using namespace std;
struct Student {
string name;
string surname;
unsigned age;
unsigned group;
unsigned quantity;
vector<unsigned> box;
double avg() {
return accumulate(box.begin(), box.end(), .0) / box.size();
}
void falsification(double value) {
if (value < 1 || value > 5) return;
auto x = avg();
while (x < value) {
box.push_back(5);
++quantity;
x = avg();
}
}
friend istream& operator>>(istream& in, Student& o) {
cin >> o.name >> o.surname >> o.age >> o.group >> o.quantity;
for (auto i = 0U; i < o.quantity; ++i) {
unsigned x;
in >> x;
o.box.push_back(x);
}
return in;
}
friend ostream& operator<<(ostream& out, const Student& o) {
out << o.name << ' '
<< o.surname << ' '
<< o.age << ' '
<< o.group << ' '
<< o.quantity << '\n';
for (auto v : o.box) out << v << ' ';
return out;
}
};
class StudentJournal {
public:
void add(unsigned n) {
for (auto i = 0U; i < n; ++i) {
Student person;
cin >> person;
box_.push_back(person);
}
}
void fake(double f) {
for (auto& x : box_) x.falsification(f);
}
void show()const {
for (const auto& x : box_) cout << x << '\n';
}
private:
vector<Student> box_;
};
int main() {
auto n = 5U;
StudentJournal journal;
journal.add(n);
cout.put('\n');
journal.fake(4.5);
journal.show();
system("pause > nul");
}
Дмитрий Соколов
Дмитрий Соколов
51 728
Лучший ответ
Если k - количество существующих оценок, s - сумма оценок, n - кол-во добавляемых пятёрок, то:

(s + 5 * n) / (k + n) = 4.5
s + 5 * n = 4.5 * k + 4.5 * n
0.5 * n = 4.5 * k - s
n = 9 * k - 2 * s

По заданию add_mark добавляет ОДНУ оценку:

void add_mark(Student &person, int mark) {
int *old = person.marks;
person.marks = new int[person.mark_count + 1];
for (int i = 0; i < person.mark_count; ++i) { person.marks[i] = old[i]; }
person.marks[person.mark_count++] = mark;
delete[] old;
}

// Добавление пятёрок в коде main
for (int i = 0; i < 5; ++i) {
int s = 0;
for (int j = 0; j < data[i].mark_count; ++j) { s += data[i].marks[j]; }
for (int j = 9 * data[i].mark_count - 2 * s; j > 0; --j) { add_mark(data[i], 5); }
}
Online
Online
92 109
Viktor Tschanko Давайте я прикреплю код выше к задаче и вы посмотрите на него?
Viktor Tschanko Вот, я прикрепил код к задаче, можете пожалуйста посмотреть и сказать в чем я ошибся?
встречный вопрос, этому сейчас в школах учат? (личный интерес, сейчас что-нибудь наваяю)
Viktor Tschanko Это не совсем школа, я хожу на курсы программирования. Но проблема в том что я сейчас не могу сделать эту задачу) У меня есть код, но не совсем верный, могу скинуть посмотрите)