Определить абитуриентов с максимальным рабочим стажем на каждом факультете - C (СИ)
Формулировка задачи:
Со структурами разобрался, ввод/вывод данных тоже. Но условие не могу составить. Думаю, для начала нужно определить факультеты из массива анкет, далее засунуть их в дин. массив, а оттуда уже смотреть, у кого макс. стаж. На словах нетрудно, но реализовать - проблемка) Спасибо.
//2. Структура элемента массива анкета: фамилия, имя, отчество, дата рождения (число, месяц, год), //домашний адрес (город, улица, дом), оценки в аттестате зрелости (математика, физика, химия), стаж, факультет. //Определить абитуриентов с максимальным рабочим стажем на каждом факультете. Названия факультетов определять из массива анкет. #include <stdio.h> #include <malloc.h> #include <string.h> #include <locale.h> struct fio_type { char fam[21], name[16], ot[21]; //Фамилия, имя, отчество. }; struct date_type { int num; //число; int month; //месяц; int year; //год. }; struct addr_type { char town[36], street[36]; // город, улица; int house;// номер дома. }; struct marks_type { int m1, m2, m3; // оценки по математике, физике и химии. }; struct form_type { fio_type fio; date_type date; addr_type addr; marks_type marks; int exp; // стаж работы. char fac[41]; // факультет. }; int main(){ setlocale(LC_ALL, "Russian"); const int N = 2; bool f; int count = 0, j = 0, i; form_type form[N]; for (i = 0; i < N; i++){ printf("Анкета #%d: \n", i + 1); printf("Введите фамилию, имя, отчество студента: \n"); fflush(stdin); gets_s(form[i].fio.fam); gets_s(form[i].fio.name); gets_s(form[i].fio.ot); printf("Введите дату рождения через пробел(в формате 01 01 1996): \n"); scanf_s("%d", &form[i].date.num); scanf_s("%d", &form[i].date.month); scanf_s("%d", &form[i].date.year); printf("Введите адресс(город, улица, номер дома): \n"); fflush(stdin); gets_s(form[i].addr.town); gets_s(form[i].addr.street); scanf_s("%d", &form[i].addr.house); printf("Введите оценки в аттестате зрелости(математика, физика, химия): \n"); fflush(stdin); scanf_s("%d", &form[i].marks.m1); scanf_s("%d", &form[i].marks.m2); scanf_s("%d", &form[i].marks.m3); printf("Введите Ваш стаж(полных лет): \n"); scanf_s("%d", &form[i].exp); printf("Введите Ваш факультет: \n"); gets_s(form[i].fac); } //УСЛОВИЕ return 0; }
Гляньте, пожалуйста)
Решение задачи: «Определить абитуриентов с максимальным рабочим стажем на каждом факультете»
textual
Листинг программы
//2. Структура элемента массива анкета: фамилия, имя, отчество, дата рождения (число, месяц, год), //домашний адрес (город, улица, дом), оценки в аттестате зрелости (математика, физика, химия), стаж, факультет. //Определить абитуриентов с максимальным рабочим стажем на каждом факультете. Названия факультетов определять из массива анкет. #include <stdio.h> #include <malloc.h> #include <string.h> #include <locale.h> struct fio_type { char fam[21], name[16], ot[21]; //Фамилия, имя, отчество. }; struct date_type { int num; //число; int month; //месяц; int year; //год. }; struct addr_type { char town[36], street[36]; // город, улица; int house;// номер дома. }; struct marks_type { int m1, m2, m3; // оценки по математике, физике и химии. }; struct form_type { fio_type fio; date_type date; addr_type addr; marks_type marks; int exp; // стаж работы. char fac[51]; // факультет. }; int main(){ setlocale(LC_ALL, "Russian"); const int N = 6; int i, j, count = 0; form_type form[N]; for (i = 0; i < N; i++){ printf("\n Анкета #%d: \n", i + 1); printf("Примечание: данные анкеты заполнять латиницей \n\n"); printf("Фамилия, имя, отчество абитуриента: \n"); fflush(stdin); gets_s(form[i].fio.fam); gets_s(form[i].fio.name); gets_s(form[i].fio.ot); do{ printf("Дата рождения через пробел(в формате 01 01 1996): \n"); scanf_s("%d", &form[i].date.num); scanf_s("%d", &form[i].date.month); scanf_s("%d", &form[i].date.year); } 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); printf("Адресс(город, улица, номер дома): \n"); fflush(stdin); gets_s(form[i].addr.town); gets_s(form[i].addr.street); scanf_s("%d", &form[i].addr.house); do{ printf("Оценки в аттестате зрелости(математика, физика, химия): \n"); fflush(stdin); scanf_s("%d", &form[i].marks.m1); scanf_s("%d", &form[i].marks.m2); scanf_s("%d", &form[i].marks.m3); } 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); do{ printf("Ваш стаж работы(полных лет): \n"); scanf_s("%d", &form[i].exp); } while (form[i].exp < 0); fflush(stdin); printf("Введите Ваш факультет: \n"); gets_s(form[i].fac); } for (i = 0; i < N - 1; i++){ for (j = i + 1; j < N; j++){ if (!strcmp(form[i].fac, form[j].fac)) { if(form[i].exp > form[j].exp) strcpy_s(form[j].fac, "NULL"); if (form[i].exp < form[j].exp) strcpy_s(form[i].fac, "NULL"); } } } j = 0; for (i = 0; i < N; i++) if (strcmp(form[i].fac, "NULL")) { strcpy_s(form[j].fac, form[i].fac); strcpy_s(form[j].fio.fam, form[i].fio.fam); strcpy_s(form[j].fio.name, form[i].fio.name); strcpy_s(form[j].fio.ot, form[i].fio.ot); j++; count++ } printf("\n\n"); for (j = 0; j < count;j++) printf("Абитуриент с лучшим стажем на факультете %s - %s %s %s \n", form[j].fac, form[j].fio.fam, form[j].fio.name, form[j].fio.ot); return 0; }
Объяснение кода листинга программы
- Структура программы:
- Включаемые заголовочные файлы:
, , , - Объявление структурных типов данных: fio_type, date_type, addr_type, marks_type, form_type
- Создание массива анкет с помощью оператора malloc
- Заполнение анкеты абитуриента с помощью функции gets_s и scanf_s
- Установка значений переменных с помощью do-while циклов
- Определение абитуриентов с максимальным рабочим стажем на каждом факультете с помощью двух вложенных циклов for
- Вывод информации о найденных абитуриентах с помощью функции printf
- Освобождение памяти с помощью функции free
- Включаемые заголовочные файлы:
- Переменные:
- N - количество абитуриентов
- i, j - индексы для перебора массива анкет
- count - счетчик количества абитуриентов с лучшим стажем
- form - массив анкет
- Условие задачи:
- Определить абитуриентов с максимальным рабочим стажем на каждом факультете
- Требования к вводу:
- Вводить данные анкеты латиницей
- Вводить дату рождения в формате 01 01 1996
- Вводить оценки в аттестате зрелости целыми числами от 1 до 100
- Вводить стаж работы в полных лет
- Вводить название факультета
- Ограничения на ввод:
- Невозможно ввести стаж работы меньше 0 лет
- Невозможно ввести оценку меньше 1 или больше 100 баллов по каждому предмету
- Невозможно ввести дату рождения не в формате 01 01 1996
- Невозможно ввести название факультета, если оно уже присутствует в массиве
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д