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

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

  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
Похожие ответы