Qellex

8.1 19 в

Apr 25th, 2022 (edited)
766
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.58 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <windows.h>
  6. #include <math.h>
  7. #include <time.h> /// библиотека времени
  8.  
  9. /*Список сведений о животных в зоопарке. Каждая строка списка
  10. содержит наименование вида, пол, дату рождения, необходимую
  11. калорийность ежедневного рациона, логический признак —
  12. требуется ли содержание в теплом помещении в зимнее время.
  13. Обеспечить поиск а) самого молодого животного по заданной
  14. подстроке наименования вида; б) трех животных заданного пола с
  15. наименьшей необходимой калорийностью рациона, требующих
  16. переселения на зиму в теплое помещение.*/
  17.  
  18. typedef struct zoo {
  19.     char name[20]; // нименование вида
  20.     bool pol; // пол
  21.     tm date; // дата рождения
  22.     int cal; // калорийность в день
  23.     bool winter; // требуется ли теплое помощение
  24. }zoo;
  25.  
  26.  
  27. // функция для добавления животного
  28. void add(zoo* pr) {
  29.     int z, x, y; // переменные для временног сохранения
  30.     printf("\nВведите наименование вида животного: ");
  31.     scanf("%19s", pr->name);
  32.     printf("\nВведите пол животного 1 - мужской или 0 - женский: ");
  33.     scanf("%1s", &x);
  34.     pr->pol = (x == 1);
  35.     printf("\nВведите дату рождения (день месяц год): ");
  36.     tm date;
  37.     scanf("%d%d%d", &z, &x, &y);
  38.     date.tm_mon = x; date.tm_year = y; date.tm_mday = z;
  39.     pr->date = date;
  40.     printf("\nВведите каллории требуемые животному в день: ");
  41.     scanf("%d", &pr->cal);
  42.     printf("Требуется ли содержание живтного в теплом помощение(да - 1, нет - 0): ");
  43.     scanf("%d", &x);
  44.     pr->winter = (x == 1);
  45.     printf("\nЖиотное успешно добавлено.\n");
  46. }
  47.  
  48. // функция удаления из спика
  49. void del(zoo* pr, int count) {
  50.     int n;
  51.     printf("\nВведите номер животного, которое хотите удалить из списка: ");
  52.     scanf("%d", &n);
  53.     n--; // уменьшаем на одно т..к. начинается с 0
  54.     while (n < 0 || n > count) {
  55.         printf("\nТакого номера нет, введите существующий: ");
  56.         scanf("%d", &n);
  57.         n--;
  58.     }
  59.     pr[n] = pr[count]; // последний элемент вставляем на место удаленного
  60. }
  61.  
  62. // вывод таблицы
  63. void table(zoo* pr, int count) {
  64.  
  65.     printf("\n\n\nСписок животных:\n");
  66.     printf("Наименование\tПол\tДата\t\tКаллорийность\tПомщение\n");
  67.     for (int i = 0; i < count; i++) {
  68.         printf("%s\t\t%s\t%d.%d.%d г.\t%d\t\t%s\n", pr[i].name, pr[i].pol ? "Женский" : "Мужской", pr[i].date.tm_mday, pr[i].date.tm_mon, pr[i].date.tm_year, pr[i].cal, pr[i].winter ? "Нужно" : "Не нужно");
  69.  
  70.     }
  71. }
  72.  
  73. // поиск животного которого нужно в помещение и меньше каллорий
  74. void search_winter_best_cal(zoo* pr, int count) {
  75.     float min1 = 100000, min2 = 100000, min3 = 100000;
  76.     int name1 = -1, name2 = -1, name3 = -1; // выставляем номера
  77.     int x; bool polx;
  78.     printf("Введите пол животного 1 - мужской или 0 - женский: ");
  79.     scanf("%d", &x);
  80.     polx = (x == 1);
  81.     for (int i = 0; i < count; i++) { // начинаем проверку на совпадения
  82.         if (polx != pr[i].pol && pr[i].winter) { // если пол одиннаковый и нужно помощение начинаем сохранение
  83.             if (min1 > pr[i].cal) { // упорядочная система
  84.                 min3 = min2; min2 = min1; min1 = pr[i].cal; // находим и создаем порядок далее аналогично
  85.                 name3 = name2; name2 = name1; name1 = i;
  86.             }
  87.             else if (min2 > pr[i].cal) {
  88.                 min3 = min2; min2 = pr[i].cal;
  89.                 name3 = name2; name2 = i;
  90.             }
  91.             else if (min3 > pr[i].cal) {
  92.                 min3 = pr[i].cal;
  93.                 name3 = i;
  94.             }
  95.         }
  96.     }
  97.     // проверям существуют ли такие животные
  98.     if (name1 == -1 && name2 == -1 && name3 == -1)
  99.         printf("Животных, нет в списке.\n", x);
  100.     else {
  101.         printf("Животные заданного пола с наименьшей необходимой калорийностью рациона, требующих переселения на зиму в теплое помещение:\n");
  102.         printf("1. %s %d\n", pr[name1].name, pr[name1].cal); // выводим первое и смотри есть ли ещё такие, если да, то выводим
  103.         if (name2 != -1)
  104.             printf("2. %s %d\n", pr[name2].name, pr[name2].cal);
  105.         if (name3 != -1)
  106.             printf("3. %s %d\n", pr[name3].name, pr[name3].cal);
  107.     }
  108. }
  109.  
  110. // ищем самого молодого
  111. void search_best_new_name(zoo* pr, int count) {
  112.     int bestnew = -1; // номер самого молодого
  113.     char name[20]; // иммя
  114.     time_t t = time(NULL);
  115.     struct tm* aTm = localtime(&t); // берем самое малое значение времени
  116.     printf("\nВведите наименование вида животного, которого нужно найти: ");
  117.     scanf("%19s", name);
  118.     for (int i = 0; i < count; i++) {
  119.         if (strcmp(name, pr[i].name) == 0) { // проверка на одиннаковый вид
  120.             // сравниваем кто моложе
  121.             if (pr[i].date.tm_year > aTm->tm_year || (pr[i].date.tm_year == aTm->tm_year && pr[i].date.tm_mon > aTm->tm_mon) || (pr[i].date.tm_year == aTm->tm_year && pr[i].date.tm_mon == aTm->tm_mon && pr[i].date.tm_mday > aTm->tm_mday) || (pr[i].date.tm_year == aTm->tm_year && pr[i].date.tm_mon == aTm->tm_mon && pr[i].date.tm_mday == aTm->tm_mday)) {
  122.                 // сохраняем если тот моложе и переписываем значения
  123.                 aTm->tm_year = pr[i].date.tm_year; aTm->tm_mon = pr[i].date.tm_mon; aTm->tm_mday = pr[i].date.tm_mday;
  124.                 bestnew = i;
  125.             }
  126.         }
  127.     }
  128.     if (bestnew == -1)
  129.         printf("Животного с данных видом нет.");
  130.     else
  131.         printf("Самое молодое животное родилось -  %d.%d.%d г.", pr[bestnew].date.tm_mday, pr[bestnew].date.tm_mon, pr[bestnew].date.tm_year);
  132. }
  133.  
  134. // меню программы
  135. int menu(int count) {
  136.     int use;
  137.     printf("\n\n\t\tМеню\n");
  138.     printf("1. Вывод списка на экран.\n");
  139.     printf("2. Добавить животное в список.\n");
  140.     printf("3. Удалить животное из списка.\n");
  141.     printf("4. Поиск трех животных заданного пола с наименьшей необходимой калорийностью рациона, требующих переселения на зиму в теплое помещение.\n");
  142.     printf("5. Поиск самого молодого животного по наименования вида.\n");
  143.     printf("6. Для выхода из системы.\n");
  144.  
  145.     if (count == 1) {
  146.         printf("Ваш список пуст добавьте в него продукт.\n");
  147.         return 2;
  148.     }
  149.     else {
  150.         do {
  151.             printf("Введите цифру пункта, который вы желаете выполнить.\n");
  152.             scanf("%d", &use);
  153.         } while (use < 1 || use > 6);
  154.         return use;
  155.     }
  156. }
  157.  
  158. void main() {
  159.     system("chcp 1251");
  160.     int count = 1;
  161.     zoo* pr; // создаем структуру
  162.     pr = (zoo*)malloc(sizeof(zoo) * count); // выделяем память
  163.     while (count != -1) { // запускаем меню
  164.         int i = menu(count);
  165.         switch (i) // вводимое значем
  166.         {
  167.         case 1:
  168.             table(pr, count - 1); // выводим таблицу
  169.             break;
  170.         case 2:
  171.             add(&pr[count - 1]); // добавляем элемент
  172.             count++;
  173.             pr = (zoo*)realloc((void*)pr, sizeof(zoo) * count); // регулируем память
  174.             break;
  175.         case 3:
  176.             del(pr, count - 2);  // удаляем элемент
  177.             count--;
  178.             pr = (zoo*)realloc((void*)pr, sizeof(zoo) * count); // регулировка памяти выделенной
  179.  
  180.             break;
  181.         case 4:
  182.             search_winter_best_cal(pr, count - 1); // находим в помощение
  183.             break;
  184.         case 5:
  185.             search_best_new_name(pr, count); // самый молодой
  186.             break;
  187.         default:
  188.             count = -1;
  189.             break;
  190.         }
  191.     }
  192.     system("pause");
  193. }
  194.  
  195. /*Список сведений о животных в зоопарке. Каждая строка списка
  196. содержит наименование вида, пол, дату рождения, необходимую
  197. калорийность ежедневного рациона, логический признак —
  198. требуется ли содержание в теплом помещении в зимнее время.
  199. Обеспечить поиск а) самого молодого животного по заданной
  200. подстроке наименования вида; б) трех животных заданного пола с
  201. наименьшей необходимой калорийностью рациона, требующих
  202. переселения на зиму в теплое помещение.*/
Add Comment
Please, Sign In to add comment