Определить абитуриентов с максимальным рабочим стажем на каждом факультете - 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
- Невозможно ввести название факультета, если оно уже присутствует в массиве
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д