Advertisement
anticlown

Файлы + Структуры

Nov 1st, 2023
1,027
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <locale.h>
  6. #include <string.h>
  7. #include <malloc.h>
  8.  
  9. /* формат файла:
  10. 13
  11. 251001 Арефин Владислав 19
  12. 251001 Асепков Данила 18
  13. 251002 Барановский Артём 19
  14. 251001 Демидовец Степан 20
  15. 251002 Елькин Матвей 19
  16. 251003 Заяц Александра 19
  17. 251003 Иванникова Анна 18
  18. 251004 Иванов Андрей 18
  19. 251004 Калитько Дмитрий 19
  20. 251003 Карась Андрей 19
  21. 251002 Кирлица Дарья 20
  22. 251004 Кротюк Иван 18
  23. 251005 Крутько Андрей 19
  24. */
  25.  
  26. /* student struct start */
  27. typedef struct {
  28.     int group;
  29.     char surname[20];
  30.     char name[20];
  31.     int age;
  32. } student;
  33.  
  34. student* getStudentList(char* filePath) {
  35.     FILE* file;
  36.     file = fopen(filePath, "r");
  37.  
  38.     int size;
  39.     fscanf(file, "%d", &size);
  40.  
  41.     student* list = (student*)malloc(size * sizeof(student));
  42.     for (int i = 0; i < size; i++)
  43.     {
  44.         fscanf(file, "%d", &list[i].group);
  45.         fscanf(file, "%s", &list[i].surname);
  46.         fscanf(file, "%s", &list[i].name);
  47.         fscanf(file, "%d", &list[i].age);
  48.     }
  49.     fclose(file);
  50.     return list;
  51. }
  52.  
  53. student* findOldestStudents(int size, student* list) {
  54.     const int groupNumbers[4] = {251001, 251002, 251003, 251004};
  55.     const int numOfGroups = 4;
  56.     student* oldestStudents = (student*)malloc(numOfGroups * sizeof(student));
  57.     int tempMaxAge;
  58.     for (int i = 0; i < numOfGroups; i++)
  59.     {  
  60.         tempMaxAge = -1;
  61.         for (int j = 0; j < size; j++)
  62.         {
  63.             if (list[j].group == groupNumbers[i] && list[j].age > tempMaxAge)
  64.             {
  65.                 oldestStudents[i].group = list[j].group;
  66.                 strcpy(oldestStudents[i].surname, list[j].surname);
  67.                 strcpy(oldestStudents[i].name, list[j].name);
  68.                 oldestStudents[i].age = list[j].age;
  69.             }
  70.         }
  71.     }
  72.     return oldestStudents;
  73. }
  74. /* student struct end */
  75.  
  76. /* file funcs/procs start */
  77. char* getPathToFile() {
  78.     static char filePath[20];
  79.     printf("\nВведите путь к файлу: ");
  80.     gets_s(filePath, 20);
  81.     return filePath;
  82. }
  83.  
  84. int getSize(char filePath[20]) {
  85.     FILE* file;
  86.     file = fopen(filePath, "r");
  87.     int temp;
  88.     fscanf(file, "%d", &temp);
  89.     fclose(file);
  90.     return temp;
  91. }
  92.  
  93. void endWork(char* filePath, int size, student* list) {
  94.     FILE* file = fopen(filePath, "w");
  95.     fprintf(file, "Кол-во групп: %d\n", size);
  96.     for (int i = 0; i < size; i++)
  97.     {
  98.         fprintf(file, "%d ", list[i].group);
  99.         fprintf(file, "%s ", &list[i].surname);
  100.         fprintf(file, "%s ", &list[i].name);
  101.         fprintf(file, "%d\n", list[i].age);
  102.     }
  103.     fclose(file);
  104.  
  105.     printf("\n\t\t\t\t\t\tРабота с файлом успешно закончена.\n");
  106. }
  107. /* file funcs/procs end */
  108.  
  109. /* print procs start */
  110. void printTaskInfo() {
  111.     printf("\tЗадание 23: Данная программа получает файл, содержащий списки групп студентов.\n");
  112.     printf("\t\tИз списков формируется новый список, содержащий данные студентов, имеющих наибольший возраст.");
  113. }
  114.  
  115. void printStudnetList(int size, student* list) {
  116.     printf("\n\tКоличество студентов: %d\n", size);
  117.     printf("\tВывод списка всех студентов:\n");
  118.     for (int i = 0; i < size; i++)
  119.     {
  120.         printf("%d. Группа %d - %s %s - %d лет;\n", i + 1, list[i].group, list[i].surname, list[i].name, list[i].age);
  121.     }
  122. }
  123.  
  124. void printOldestList(int size, student* oldestList) {
  125.     printf("\n\tВывод списка студентов, \n  имеющих наибольший возраст(по группам):\n");
  126.     for (int i = 0; i < size; i++)
  127.     {
  128.         printf("%d. Группа %d - %s %s - %d лет;\n", i + 1, oldestList[i].group, oldestList[i].surname, oldestList[i].name, oldestList[i].age);
  129.     }
  130. }
  131. /* print procs end */
  132.  
  133. int main()
  134. {
  135.     setlocale(LC_ALL, "Rus");
  136.    
  137.     printTaskInfo();
  138.  
  139.     printf("\n\n\t\t\t\t\tНеобходим файл ввода для считывания информации...\n");
  140.     char* inputPath = getPathToFile();
  141.     int size = getSize(inputPath);
  142.  
  143.     student* list = getStudentList(inputPath);
  144.     printStudnetList(size, list);
  145.  
  146.     const int numOfGroups = 4;
  147.     student* oldestList = findOldestStudents(size, list);
  148.     printOldestList(numOfGroups, oldestList);
  149.  
  150.     printf("\n\n\t\t\t\t\tНеобходим файл вывода для записи информации...\n");
  151.     char* outputPath = getPathToFile();
  152.     endWork(outputPath, numOfGroups, oldestList);
  153.     return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement