Практические задания по программированию на C/C++ (часть 3)

Задание №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;
}

Оцените статью
Сессия под ключ дистанционно
Добавить комментарий

Заявка на расчет