Загрузка данных


#define _CRT_SECURE_NO_WARNINGS

#define size 100

#include <stdio.h>
#include <string.h>


struct Transaction {
    char group[5];
    int kt;
    int points;
};

int read(struct Transaction transactions[]) {
    FILE* in_file = fopen("in.txt", "r");

    int count = 0;

    while (3 == fscanf(in_file, "%*d %*s %s %d %d", transactions[count].group, &transactions[count].kt,
        &transactions[count].points)) {
        count++;
    }

    fclose(in_file);

    return count;
}

void calculate(struct Transaction transactions[], int count) {
    char groups[size][5];
    int unique = 0;
    int found = 0;

    // 2.1 поиск уникальных групп
    for (int i = 0; i < count; i++) {
        for (int j = 0; j < unique; j++) {
            if (strcmp(transactions[i].group, groups[j]) == 0) {
                found++;
            }
        }
        if (!found) {
            strcpy(groups[unique], transactions[i].group);
            unique++;
        }
        found = 0;
    }

    // 2.2 расчет по группам
    int counts[size] = { 0 };
    int kts[size] = { 0 };
    int maxs[size] = { 0 };
    int mins[size];
    for (int i = 0; i < unique; i++) {
        mins[i] = 100;
    }

    for (int i = 0; i < count; i++) {
        for (int j = 0; j < unique; j++) {
            if (strcmp(transactions[i].group, groups[j]) == 0) {
                counts[j]++;
                kts[j] = kts[j] + transactions[i].kt;
                if (maxs[j] < transactions[i].kt) {
                    maxs[j] = transactions[i].kt;
                }
                if (mins[j] > transactions[i].kt) {
                    mins[j] = transactions[i].kt;
                }
            }
        }
    }

    float avgs[size];
    for (int i = 0; i < unique; i++) {
        avgs[i] = (float)kts[i] / (float)counts[i];
    }

    // 2.3 сортировка данных по буквам группы

    for (int i = 0; i < unique; i++) {
        for (int j = 0; j < unique - 1 - i; j++) {
            if (strcmp(groups[j], groups[j + 1]) > 0) {
                char temp_s[5];
                int temp_i;
                float temp_f;

                // группы
                strcpy(temp_s, groups[j]);
                strcpy(groups[j], groups[j + 1]);
                strcpy(groups[j + 1], temp_s);

                // maxs, mins, counts, kts, avgs
                temp_i = maxs[j];
                maxs[j] = maxs[j + 1];
                maxs[j + 1] = temp_i;

                temp_i = mins[j];
                mins[j] = mins[j + 1];
                mins[j + 1] = temp_i;

                temp_i = counts[j];
                counts[j] = counts[j + 1];
                counts[j + 1] = temp_i;

                temp_i = kts[j];
                kts[j] = kts[j + 1];
                kts[j + 1] = temp_i;

                temp_f = avgs[j];
                avgs[j] = avgs[j + 1];
                avgs[j + 1] = temp_f;
            }
        }
    }

    // вывод
    FILE* out_file = fopen("out.txt", "a");

    for (int i = 0; i < unique; i++) {
        fprintf(out_file, "%d. %s %d %d %d %.1f\n", (i + 1), groups[i], counts[i],
            maxs[i],
            mins[i], avgs[i]);
    }

    fclose(out_file);
}

int main() {
    // 0. инициализация
    struct Transaction transactions[size];
    int menu;

    // 1. меню-программа консольная
    printf("Выберите действие:\n0 - ввести значения из файла в массив и вывести в файл;\n1 - закрыть программу;\n");
    while (1 == 1) {
        scanf("%d", &menu);

        if (menu == 0) {
            // 1.1. чтение
            int count = read(transactions);

            // 1.2. расчеты
            calculate(transactions, count);
        }
        else if (menu == 1) {
            break;
        }
        else {
            printf("Выберите действие:\n0 - ввести значения из файла в массив и вывести в файл;\n1 - закрыть программу;\n");
        }
    }

    return 0;
}