Задание №10: Обработка студенческой ведомости
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string>
using namespace std;
const char info[] =
" Задание №10n"
"n"
"5.2.1 Обработка студенческой ведомостиn"
"n"
" Составить программу для обработки информации о некоторыхn"
"объектах - студентах какого-то факультета. Каждый объектn"
"зарактеризуется совокупностью признаков:n"
"n"
"+------+--------+--------+---+------+----------+-----------+---------+n"
"| |Фамилия |Год | |Оценки|Оценки |Оценки | |n"
"|Группа|имя |рождения|Пол|по |по |по |Стипендия|n"
"| |отчество| | |физике|математике|информатике| |n"
"+------+--------+--------+---+------+----------+-----------+---------+n"
"n"
" Для студентов группы Ф3-97, имеющих "5" по физике, увеличитьn"
"величину стипендии на заданную величину и вывести все данные о них,n"
"за исключением пола и группы.n";
struct MAN { string gr; string fio; unsigned year; char sex; unsigned eval[3]; unsigned grants; };
bool yes_man = false; unsigned add; vector<MAN> group; char inp[1024]; const unsigned CNT_PARAM = 10; int cnt;
unsigned char *param[CNT_PARAM]; unsigned num; FILE *f;
bool get_param(void) {
char *s, c; ++num; cnt = 0; s = inp;
for (;;) {
while ((c = *s) == ' ' || c == 't' || c == 'n') ++s;
if (c == 0) break;
if (cnt == CNT_PARAM) { printf_s("Строка файла %u:nСлишком много параметровn", num); fclose(f); return false; }
param[cnt++] = (unsigned char *)s;
while ((c = *s) != ' ' && c != 't' && c != 'n' && c) ++s;
if (c == 0) break;
*s++ = 0;
}
if (cnt == 0 || cnt == CNT_PARAM) return true;
printf_s("Строка файла %u:nОжидалось %u параметровn", num, CNT_PARAM); fclose(f); return false;
}
int test_num(unsigned char *s, const char *name, int min, int max) {
int v; if (!isdigit(*s)) { printf_s("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
v = atoi((char *)s); while (isdigit(*++s));
if (*s) { printf_s("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
if (v < min || v > max) { printf_s("Строка файла %u:nЗначение '%s' не в диапазоне [%d...%d]n", num, name, min, max); fclose(f); return 0; }
return v;
}
bool input(void) {
string name; MAN man;
printf_s("Имя файла с данными студентов: "); getline(cin, name);
if ((f = fopen(name.c_str(), "r")) == NULL) { printf_s("Ошибка открытия файлаn"); return false; }
while (fgets(inp, sizeof(inp) - 2, f)) {
if (!get_param()) return false;
if (cnt == 0) continue;
man.gr = (char *)param[0]; man.fio = (char *)param[1]; man.fio += " "; man.fio += (char *)param[2]; man.fio += " "; man.fio += (char *)param[3];
if ((man.year = test_num(param[4], "год рождения", 1971, 2000)) == 0) return false;
if (strcmp((const char *)param[5], "М") && strcmp((const char *)param[5], "Ж")) { printf_s("Строка файла %u:nПол ошибоченn", num); fclose(f); return false; }
man.sex = param[5][0];
if ((man.eval[0] = test_num(param[6], "оценка по физике", 2, 5)) == 0) return false;
if ((man.eval[1] = test_num(param[7], "оценка по математике", 2, 5)) == 0) return false;
if ((man.eval[2] = test_num(param[8], "оценка по информатике", 2, 5)) == 0) return false;
if ((man.grants = test_num(param[9], "стипендия", 0, 10000)) == 0) return false;
if (man.gr == "Ф3-97" && man.eval[0] == 5) yes_man = true;
group.push_back(man);
}
fclose(f); if (group.size() == 0) { printf_s("Файл не содержит информацию о студентахn"); return false; }
return true;
}
void print(void) {
int i; size_t w1, w2; MAN man; string line;
w1 = strlen("ФИО"); w2 = strlen("Группа");
for (i = 0; i < group.size(); ++i) {
man = group[i]; if (man.gr.length() > w2) w2 = man.gr.length(); if (man.fio.length() > w1) w1 = man.fio.length();
}
line = "+"; for (i = 0; i < w2; ++i) line += '-'; line += '+'; for (i = 0; i < w1; ++i) line += '-'; line += "+------------+---+------+----------+-----------+---------+";
printf_s("nСписок всех студентовn%sn", line.c_str());
printf_s("|%-*s|%-*s|Год рождения|Пол|Физика|Математика|Информатика|Стипендия|n%sn", (int)w2, "Группа", (int)w1, "ФИО", line.c_str());
for (i = 0; i < group.size(); ++i) {
man = group[i];
printf("|%-*s|%-*s| %u | %c | %u | %u | %u |%9u|n", (int)w2, man.gr.c_str(), (int)w1, man.fio.c_str(), man.year, man.sex, man.eval[0], man.eval[1], man.eval[2], man.grants);
}
printf_s("%snn", line.c_str());
}
void print2(void) {
int i; size_t w1; MAN man; string line;
w1 = strlen("ФИО");
for (i = 0; i < group.size(); ++i) {
man = group[i]; if (man.gr == "Ф3-97" && man.eval[0] == 5) { if (man.fio.length() > w1) w1 = man.fio.length(); }
}
line = "+"; for (i = 0; i < w1; ++i) line += '-'; line += "+------------+------+----------+-----------+---------+";
printf_s("nСписок студентов с повышенной стипендиейn%sn", line.c_str());
printf_s("|%-*s|Год рождения|Физика|Математика|Информатика|Стипендия|n%sn", (int)w1, "ФИО", line.c_str());
for (i = 0; i < group.size(); ++i) {
man = group[i]; if (!(man.gr == "Ф3-97" && man.eval[0] == 5)) continue;
man.grants += add;
printf("|%-*s| %u | %u | %u | %u |%9u|n", (int)w1, man.fio.c_str(), man.year, man.eval[0], man.eval[1], man.eval[2], man.grants);
}
printf_s("%snn", line.c_str());
}
int main() {
SetConsoleOutputCP(1251); printf(info);
if (!input()) { system("pause"); return 0; }
print();
if (yes_man) { printf("Увеличение стипендии: "); cin >> add; print2(); }
else printf("Нет кандидатов на увеличение стипендииnn");
system("pause"); return 0;
}