Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "patient.h"
- #define PAR 1
- /* //////////////////////////////////////////
- * ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
- *///////////////////////////////////////////
- /* освободение памяти */
- void wipe(patient **person)
- {
- for (int i = 0; i < NOTES_AMOUNT; i++) {
- if (person[i]) {
- free(person[i]->date);
- free(person[i]->diagnosis);
- free(person[i]->name->F);
- free(person[i]->name->I);
- free(person[i]->name->O);
- free(person[i]->name);
- }
- free(person[i]);
- }
- free(person);
- }
- void abort_(char *s, patient **page)
- {
- printf("%s\n", s);
- wipe(page);
- exit(0);
- }
- /* проверка на тупого юзера */
- void check(patient **page)
- {
- if (feof(stdin))
- abort_("input error", page);
- }
- /* выделение памяти под одну запись */
- patient* memory(patient *person)
- {
- person = malloc(sizeof(patient));
- person->name = malloc(sizeof(NAME));
- person->date = malloc(sizeof(BIRTH));
- person->diagnosis = malloc(sizeof(char) * MAX_DIA_LENGTH);
- person->name->F = malloc(sizeof(char) * MAX_NAME_LENGTH);
- person->name->I = malloc(sizeof(char) * MAX_NAME_LENGTH);
- person->name->O = malloc(sizeof(char) * MAX_NAME_LENGTH);
- return person;
- }
- /* вывести на экран данные пациента */
- void print(patient *person)
- {
- printf("\n%s ", person->name->F);
- printf("%s ", person->name->I);
- printf("%s\n", person->name->O);
- printf("%d.", person->date->day);
- printf("%d.", person->date->month);
- printf("%d\n", person->date->year);
- }
- /* вспомогательная функция для вычисления возраста */
- int number(patient *person)
- {
- int i = person->date->year * 10000;
- i += person->date->month * 100;
- i += person->date->day;
- return i;
- }
- int min_age(int a, int b, patient **person)
- {
- return number(person[a]) >= number(person[b]) ? a : b;
- }
- /*
- * FILE INSERT
- */
- #if PAR
- /* функция ввода записей о пациентах */
- patient *insert(patient *person, FILE *fp)
- {
- if (feof(fp))
- return person;
- /* выделение памяти под данные пациента */
- person = memory(person);
- /* чтение из файла */
- fscanf(fp, "%s %s %s %u %u %u %s", person->name->F,
- person->name->I, person->name->O, &person->date->day,
- &person->date->month, &person->date->year, person->diagnosis);
- return person;
- }
- /* функция создания списка записей о пациентах */
- patient **list()
- {
- int i;
- FILE *fp = fopen("patients.txt", "r");
- /* page — массив записей о пациентах */
- patient **page = calloc(NOTES_AMOUNT, sizeof(patient *));
- if (!fp)
- abort_("no such file of directory", page);
- /* ввод данных пациента в массив записей */
- for (i = 0; !feof(fp) && i < NOTES_AMOUNT; i++)
- page[i] = insert(page[i], fp);
- /* проверка на тупого юзера */
- if (i == NOTES_AMOUNT)
- abort_("INPUT ERROR", page);
- fclose(fp);
- return page;
- }
- /* //////////////////////////////////////////
- * STDINs
- */ //////////////////////////////////////////
- #else
- /* функция ввода записей о пациентах */
- patient *insert(patient *person, patient **page)
- {
- if (feof(stdin))
- return person;
- /* выделение памяти под данные пациента */
- person = memory(person);
- /* чтение из ввода с проверкой на тупого */
- scanf("%s", person->name->F);
- check(page);
- scanf("%s", person->name->I);
- check(page);
- scanf("%s", person->name->O);
- check(page);
- scanf("%u", &person->date->day);
- check(page);
- scanf("%u", &person->date->month);
- check(page);
- scanf("%u", &person->date->year);
- check(page);
- scanf("%s", person->diagnosis);
- return person;
- }
- /* функция создания списка записей о пациентах */
- patient **list()
- {
- patient **page = calloc(NOTES_AMOUNT, sizeof(patient *));
- for (int i = 0; !feof(stdin) && i < NOTES_AMOUNT; i++)
- page[i] = insert(page[i], page);
- return page;
- }
- #endif
- /* поиск самого молодого пациента с заданным диагнозом */
- void solve(char *word)
- {
- /* создаётся список */
- patient **person = list();
- int i, k = 0, l = 0;
- for (i = 0; person[i] && i < NOTES_AMOUNT; i++)
- /* если данный диагноз в записи */
- if (!strcmp(word, person[i]->diagnosis)) {
- k = min_age(i, k, person);
- l++;
- }
- if (!l)
- abort_("no such diagnosis", person);
- print(person[k]);
- wipe(person);
- }
- int main()
- {
- char *dia = calloc(MAX_DIA_LENGTH, sizeof(char));
- printf("enter diagnosis\n");
- fgets(dia, MAX_DIA_LENGTH, stdin);
- if (dia[MAX_DIA_LENGTH - 2]) {
- printf("ERROR\n");
- free(dia);
- return 0;
- }
- /* чтобы в строке не осталось '\n' */
- dia[strlen(dia) - 1] = '\0';
- if (!PAR)
- printf("enter the list and ctrl+D x2\n");
- solve(dia);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement