Определить абитуриентов с максимальным рабочим стажем на каждом факультете - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Со структурами разобрался, ввод/вывод данных тоже. Но условие не могу составить. Думаю, для начала нужно определить факультеты из массива анкет, далее засунуть их в дин. массив, а оттуда уже смотреть, у кого макс. стаж. На словах нетрудно, но реализовать - проблемка) Спасибо.
Листинг программы
  1. //2. Структура элемента массива анкета: фамилия, имя, отчество, дата рождения (число, месяц, год),
  2. //домашний адрес (город, улица, дом), оценки в аттестате зрелости (математика, физика, химия), стаж, факультет.
  3. //Определить абитуриентов с максимальным рабочим стажем на каждом факультете. Названия факультетов определять из массива анкет.
  4.  
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <string.h>
  8. #include <locale.h>
  9. struct fio_type {
  10. char fam[21], name[16], ot[21]; //Фамилия, имя, отчество.
  11. };
  12. struct date_type
  13. {
  14. int num; //число;
  15. int month; //месяц;
  16. int year; //год.
  17. };
  18. struct addr_type
  19. {
  20. char town[36], street[36]; // город, улица;
  21. int house;// номер дома.
  22. };
  23. struct marks_type
  24. {
  25. int m1, m2, m3; // оценки по математике, физике и химии.
  26. };
  27. struct form_type {
  28. fio_type fio;
  29. date_type date;
  30. addr_type addr;
  31. marks_type marks;
  32. int exp; // стаж работы.
  33. char fac[41]; // факультет.
  34. };
  35.  
  36. int main(){
  37. setlocale(LC_ALL, "Russian");
  38. const int N = 2;
  39. bool f;
  40. int count = 0, j = 0, i;
  41. form_type form[N];
  42. for (i = 0; i < N; i++){
  43. printf("Анкета #%d: \n", i + 1);
  44. printf("Введите фамилию, имя, отчество студента: \n");
  45. fflush(stdin);
  46. gets_s(form[i].fio.fam);
  47. gets_s(form[i].fio.name);
  48. gets_s(form[i].fio.ot);
  49. printf("Введите дату рождения через пробел(в формате 01 01 1996): \n");
  50. scanf_s("%d", &form[i].date.num);
  51. scanf_s("%d", &form[i].date.month);
  52. scanf_s("%d", &form[i].date.year);
  53. printf("Введите адресс(город, улица, номер дома): \n");
  54. fflush(stdin);
  55. gets_s(form[i].addr.town);
  56. gets_s(form[i].addr.street);
  57. scanf_s("%d", &form[i].addr.house);
  58. printf("Введите оценки в аттестате зрелости(математика, физика, химия): \n");
  59. fflush(stdin);
  60. scanf_s("%d", &form[i].marks.m1);
  61. scanf_s("%d", &form[i].marks.m2);
  62. scanf_s("%d", &form[i].marks.m3);
  63. printf("Введите Ваш стаж(полных лет): \n");
  64. scanf_s("%d", &form[i].exp);
  65. printf("Введите Ваш факультет: \n");
  66. gets_s(form[i].fac);
  67. }
  68.  
  69. //УСЛОВИЕ
  70.  
  71. return 0;
  72. }
Гляньте, пожалуйста)

Решение задачи: «Определить абитуриентов с максимальным рабочим стажем на каждом факультете»

textual
Листинг программы
  1. //2.    Структура элемента массива анкета: фамилия, имя, отчество, дата рождения (число, месяц, год),
  2. //домашний адрес (город, улица, дом), оценки в аттестате зрелости (математика, физика, химия), стаж, факультет.
  3. //Определить абитуриентов с максимальным рабочим стажем на каждом факультете. Названия факультетов определять из массива анкет.
  4.  
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <string.h>
  8. #include <locale.h>
  9.  
  10. struct fio_type {
  11.     char fam[21], name[16], ot[21]; //Фамилия, имя, отчество.
  12. };
  13. struct date_type
  14. {
  15.     int num; //число;
  16.     int month; //месяц;
  17.     int year; //год.
  18. };
  19. struct addr_type
  20. {
  21.     char town[36], street[36]; // город, улица;
  22.     int house;// номер дома.
  23. };
  24. struct marks_type
  25. {
  26.     int m1, m2, m3; // оценки по математике, физике и химии.
  27. };
  28.  
  29. struct form_type {
  30.     fio_type fio;
  31.     date_type date;
  32.     addr_type addr;
  33.     marks_type marks;
  34.     int exp; // стаж работы.
  35.     char fac[51]; // факультет.
  36. };
  37.  
  38. int main(){
  39.     setlocale(LC_ALL, "Russian");
  40.     const int N = 6;
  41.     int i, j, count = 0;
  42.     form_type form[N];
  43.     for (i = 0; i < N; i++){
  44.         printf("\n Анкета #%d: \n", i + 1);
  45.         printf("Примечание: данные анкеты заполнять латиницей \n\n");
  46.         printf("Фамилия, имя, отчество абитуриента: \n");
  47.         fflush(stdin);
  48.  
  49.         gets_s(form[i].fio.fam);
  50.         gets_s(form[i].fio.name);
  51.         gets_s(form[i].fio.ot);
  52.  
  53.         do{
  54.             printf("Дата рождения через пробел(в формате 01 01 1996): \n");
  55.             scanf_s("%d", &form[i].date.num);
  56.             scanf_s("%d", &form[i].date.month);
  57.             scanf_s("%d", &form[i].date.year);
  58.         } while (form[i].date.num < 1 || form[i].date.num > 31 || form[i].date.month < 1 || form[i].date.month>12 || form[i].date.year<1970 || form[i].date.year > 2000);
  59.  
  60.         printf("Адресс(город, улица, номер дома): \n");
  61.         fflush(stdin);
  62.         gets_s(form[i].addr.town);
  63.         gets_s(form[i].addr.street);
  64.         scanf_s("%d", &form[i].addr.house);
  65.  
  66.         do{
  67.             printf("Оценки в аттестате зрелости(математика, физика, химия): \n");
  68.             fflush(stdin);
  69.             scanf_s("%d", &form[i].marks.m1);
  70.             scanf_s("%d", &form[i].marks.m2);
  71.             scanf_s("%d", &form[i].marks.m3);
  72.         } while (form[i].marks.m1 < 1 || form[i].marks.m1> 100 || form[i].marks.m2 < 1 || form[i].marks.m2 > 100 || form[i].marks.m3 < 1 || form[i].marks.m3>100);
  73.        
  74.         do{
  75.             printf("Ваш стаж работы(полных лет): \n");
  76.             scanf_s("%d", &form[i].exp);
  77.         } while (form[i].exp < 0);
  78.         fflush(stdin);
  79.        
  80.         printf("Введите Ваш факультет: \n");
  81.         gets_s(form[i].fac);
  82.     }
  83.    
  84.     for (i = 0; i < N - 1; i++){
  85.         for (j = i + 1; j < N; j++){
  86.             if (!strcmp(form[i].fac, form[j].fac))
  87.             {
  88.                 if(form[i].exp > form[j].exp)
  89.                 strcpy_s(form[j].fac, "NULL");
  90.                 if (form[i].exp < form[j].exp)
  91.                 strcpy_s(form[i].fac, "NULL");
  92.             }
  93.         }
  94.     }
  95.    
  96.     j = 0;
  97.     for (i = 0; i < N; i++)
  98.     if (strcmp(form[i].fac, "NULL"))
  99.     {
  100.         strcpy_s(form[j].fac, form[i].fac);
  101.         strcpy_s(form[j].fio.fam, form[i].fio.fam);
  102.         strcpy_s(form[j].fio.name, form[i].fio.name);
  103.         strcpy_s(form[j].fio.ot, form[i].fio.ot);
  104.         j++;
  105.                 count++
  106.     }
  107.     printf("\n\n");
  108.     for (j = 0; j < count;j++)
  109.     printf("Абитуриент с лучшим стажем на факультете %s - %s %s %s \n", form[j].fac, form[j].fio.fam, form[j].fio.name, form[j].fio.ot);
  110.  
  111.     return 0;
  112. }

Объяснение кода листинга программы

  1. Структура программы:
    • Включаемые заголовочные файлы: , , ,
    • Объявление структурных типов данных: fio_type, date_type, addr_type, marks_type, form_type
    • Создание массива анкет с помощью оператора malloc
    • Заполнение анкеты абитуриента с помощью функции gets_s и scanf_s
    • Установка значений переменных с помощью do-while циклов
    • Определение абитуриентов с максимальным рабочим стажем на каждом факультете с помощью двух вложенных циклов for
    • Вывод информации о найденных абитуриентах с помощью функции printf
    • Освобождение памяти с помощью функции free
  2. Переменные:
    • N - количество абитуриентов
    • i, j - индексы для перебора массива анкет
    • count - счетчик количества абитуриентов с лучшим стажем
    • form - массив анкет
  3. Условие задачи:
    • Определить абитуриентов с максимальным рабочим стажем на каждом факультете
  4. Требования к вводу:
    • Вводить данные анкеты латиницей
    • Вводить дату рождения в формате 01 01 1996
    • Вводить оценки в аттестате зрелости целыми числами от 1 до 100
    • Вводить стаж работы в полных лет
    • Вводить название факультета
  5. Ограничения на ввод:
    • Невозможно ввести стаж работы меньше 0 лет
    • Невозможно ввести оценку меньше 1 или больше 100 баллов по каждому предмету
    • Невозможно ввести дату рождения не в формате 01 01 1996
    • Невозможно ввести название факультета, если оно уже присутствует в массиве

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы