Advertisement
Guest User

Untitled

a guest
Mar 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.14 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "patient.h"
  5. #define PAR 1
  6.  
  7. /* //////////////////////////////////////////
  8.  *  ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
  9.  *///////////////////////////////////////////
  10.  
  11. /* освободение памяти */
  12. void wipe(patient **person)
  13. {
  14.     for (int i = 0; i < NOTES_AMOUNT; i++) {
  15.         if (person[i]) {       
  16.             free(person[i]->date);
  17.             free(person[i]->diagnosis);
  18.             free(person[i]->name->F);
  19.             free(person[i]->name->I);
  20.             free(person[i]->name->O);
  21.             free(person[i]->name);
  22.         }
  23.         free(person[i]);
  24.     }
  25.     free(person);
  26. }
  27.  
  28. void abort_(char *s, patient **page)
  29. {
  30.     printf("%s\n", s);
  31.     wipe(page);
  32.     exit(0);
  33. }
  34.  
  35. /*  проверка на тупого юзера */
  36. void check(patient **page)
  37. {
  38.     if (feof(stdin))
  39.         abort_("input error", page);
  40. }
  41.  
  42. /* выделение памяти под одну запись */
  43. patient* memory(patient *person)
  44. {
  45.     person = malloc(sizeof(patient));
  46.     person->name = malloc(sizeof(NAME));
  47.     person->date = malloc(sizeof(BIRTH));
  48.     person->diagnosis = malloc(sizeof(char) * MAX_DIA_LENGTH);
  49.     person->name->F = malloc(sizeof(char) * MAX_NAME_LENGTH);
  50.     person->name->I = malloc(sizeof(char) * MAX_NAME_LENGTH);
  51.     person->name->O = malloc(sizeof(char) * MAX_NAME_LENGTH);
  52.     return person;
  53. }
  54.  
  55. /*  вывести на экран данные пациента */
  56. void print(patient *person)
  57. {
  58.     printf("\n%s ", person->name->F);
  59.     printf("%s ", person->name->I);
  60.     printf("%s\n", person->name->O);
  61.     printf("%d.", person->date->day);
  62.     printf("%d.", person->date->month);
  63.     printf("%d\n", person->date->year);
  64. }
  65.  
  66. /*  вспомогательная функция для вычисления возраста  */
  67. int number(patient *person)
  68. {
  69.     int i = person->date->year * 10000;
  70.     i += person->date->month * 100;
  71.     i += person->date->day;
  72.     return i;
  73. }
  74.  
  75. int min_age(int a, int b, patient **person)
  76. {
  77.     return number(person[a]) >= number(person[b]) ? a : b;
  78. }
  79.  
  80. /*
  81.  *  FILE INSERT
  82.  */
  83. #if PAR
  84.  
  85. /*  функция ввода записей о пациентах */
  86. patient *insert(patient *person, FILE *fp)
  87. {
  88.     if (feof(fp))
  89.         return person;
  90.     /* выделение памяти под данные пациента */
  91.     person = memory(person);
  92.     /*  чтение из файла    */
  93.     fscanf(fp, "%s %s %s %u %u %u %s",   person->name->F,
  94.     person->name->I, person->name->O, &person->date->day,
  95.     &person->date->month, &person->date->year, person->diagnosis);
  96.     return person;
  97. }  
  98.  
  99. /*  функция создания списка записей о пациентах */
  100. patient **list()
  101. {
  102.     int i;
  103.     FILE *fp = fopen("patients.txt", "r");
  104.     /*  page — массив записей о пациентах     */
  105.     patient **page = calloc(NOTES_AMOUNT, sizeof(patient *));
  106.  
  107.     if (!fp)
  108.         abort_("no such file of directory", page);
  109.  
  110.     /* ввод данных пациента в массив записей */
  111.     for (i = 0; !feof(fp) && i < NOTES_AMOUNT; i++)
  112.         page[i] = insert(page[i], fp);
  113.  
  114.     /*  проверка на тупого юзера  */
  115.     if (i == NOTES_AMOUNT)
  116.         abort_("INPUT ERROR", page);
  117.  
  118.     fclose(fp);
  119.     return page;   
  120. }
  121.  
  122. /*  //////////////////////////////////////////
  123.  *  STDINs
  124.  */ //////////////////////////////////////////
  125. #else
  126. /*  функция ввода записей о пациентах */
  127. patient *insert(patient *person, patient **page)
  128. {
  129.     if (feof(stdin))
  130.         return person;
  131.     /*  выделение памяти под данные пациента    */
  132.     person = memory(person);
  133.     /*  чтение из ввода с проверкой на тупого    */
  134.     scanf("%s", person->name->F);
  135.     check(page);
  136.     scanf("%s", person->name->I);
  137.     check(page);
  138.     scanf("%s", person->name->O);
  139.     check(page);
  140.     scanf("%u", &person->date->day);
  141.     check(page);
  142.     scanf("%u", &person->date->month);
  143.     check(page);
  144.     scanf("%u", &person->date->year);
  145.     check(page);
  146.     scanf("%s", person->diagnosis);
  147.  
  148.     return person;
  149. }  
  150.  
  151. /*  функция создания списка записей о пациентах */
  152. patient **list()
  153. {
  154.     patient **page = calloc(NOTES_AMOUNT, sizeof(patient *));
  155.     for (int i = 0; !feof(stdin) && i < NOTES_AMOUNT; i++)
  156.         page[i] = insert(page[i], page);
  157.     return page;   
  158. }
  159.  
  160. #endif
  161.  
  162. /* поиск самого молодого пациента с заданным диагнозом */
  163. void solve(char *word)
  164. {  
  165.     /* создаётся список */
  166.     patient **person = list();
  167.     int i, k = 0, l = 0;
  168.  
  169.     for (i = 0; person[i] && i < NOTES_AMOUNT; i++)
  170.         /* если данный диагноз в записи */ 
  171.         if (!strcmp(word, person[i]->diagnosis)) {
  172.             k = min_age(i, k, person);
  173.             l++;
  174.         }
  175.  
  176.     if (!l)
  177.         abort_("no such diagnosis", person);   
  178.    
  179.     print(person[k]);
  180.     wipe(person);
  181.    
  182. }
  183.  
  184. int main()
  185. {
  186.     char *dia = calloc(MAX_DIA_LENGTH, sizeof(char));
  187.     printf("enter diagnosis\n");
  188.     fgets(dia, MAX_DIA_LENGTH, stdin);
  189.  
  190.     if (dia[MAX_DIA_LENGTH - 2]) {
  191.         printf("ERROR\n");
  192.         free(dia);
  193.         return 0;
  194.     }
  195.     /*  чтобы в строке не осталось '\n'   */
  196.     dia[strlen(dia) - 1] = '\0';
  197.  
  198.     if (!PAR)
  199.         printf("enter the list and ctrl+D x2\n");
  200.  
  201.     solve(dia);
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement