C/C++

Программирование на C++

Опишите структуру Abiturient (ФИО; серия, номер паспорта; балл ЕГЭ по математике; балл ЕГЭ по русскому языку; балл ЕГЭ по обществознанию, направление подготовки). Выведите алфавитный список абитуриентов с общей суммой баллов ЕГЭ по 3- предметам.
RH
Rustam Halimov
106
#include <algorithm>
#include <iostream>
#include <string>
#include <set>
using namespace std;
string line(istream& inp, const char* msg) {
cout << msg;
string str;
getline(inp, str);
return str;
}
short grade(istream& inp, const char* msg, short max) {
short value = 0;
do {
cout << msg;
inp >> value;
inp.ignore(inp.rdbuf()->in_avail());
} while (value > max);
return value;
}
struct Abiturient {
short math;
short russian;
short social;
string name;
string passport;
string direction;
Abiturient() : math(0), russian(0), social(0) {}
int sum()const {
return math + russian + social;
}
private:
friend bool operator<(const Abiturient& a, const Abiturient& b) {
return a.name < b.name;
}
friend istream& operator>>(istream& inp, Abiturient& ab) {
ab.name = line(inp, "Ф. И. О.: ");
ab.passport = line(inp, "Серия и номер паспорта: ");
ab.direction = line(inp, "Направление подготовки: ");
ab.math = grade(inp, "Математика: ", 5);
ab.russian = grade(inp, "Русский язык: ", 5);
ab.social = grade(inp, "Обществознание: ", 5);
return inp;
}
};
int main() {
system("chcp 1251 > nul");
const auto length = 3;
set<Abiturient> list;
cout << "Введите данные на " << length << " абитуриентов: ";
for (auto i = 0; i < length; ++i) {
Abiturient ab;
cin >> ab;
list.emplace(ab);
puts("");
}
for (const auto& item : list) {
cout << item.name << ' ' << item.sum() << '\n';
}
system("pause > nul");
}
Владислав Павловский
Владислав Павловский
98 758
Лучший ответ
Давай по памяти покомпактнее положим. Считаем
ФИО - 3 символа
Балл по ЕГЭ - от 0 до 100, если память не изменяет. Значит, можно в 3 символа уложить, что компактнее, нежели int. А можно и в 1, т. к char до 256 даст
Паспорт: серия - 4 цифры, номер - 6 цифр, итого 10. А вот тут можно и 2 int обойтись, если они у тебя по 4 байта будут
Направление подготовки - понятие не имею, что то, но если направлений меньше 256 - можно как байт записать и приводить к энуму
Итого
class PackedAbiturient
{
char m_data[ 3 + 3 + 1 = 7 ];
int passport[2];
}
Просто Парень
Просто Парень
38 458
class Abiturient{
std::string name;
int EGEMath, EGERussian, EGESocialEducation;
std::string PrepareDirection;
};

// Откуда брать список не понятно, так что вторая часть не очень выполнима из-за не описанных источников данных
Rustam Halimov из головы: D