Определить абитуриентов с максимальным рабочим стажем на каждом факультете - 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
- Невозможно ввести название факультета, если оно уже присутствует в массиве