Вывести на экран фамилии студентов в порядке увеличения их суммарного числа прогулов - C (СИ)
Формулировка задачи:
Решение задачи: «Вывести на экран фамилии студентов в порядке увеличения их суммарного числа прогулов»
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "kurs.h"
/* MAXRECS - максимальный размер массива */
#define MAXRECS 50
/* DL - максимальная длина считываемой строки */
#define DL 80
/* прототипы */
void DispData(Student x[], char *s);
void ListData(Student x[], int n);
Student FindRec(Student x[], char *str);
Student Assign(Student x);
/* глобальные переменные */
struct STUDENT
{
char fio[15+1];
char predm[5+1];
int prog;
int step;
};
typedef struct STUDENT Student;
/* к-во записей */
int nRecs;
int main()
{
Student studs[MAXRECS];
int i, nr;
/* оформите ввод массива (из файла или как-то иначе */
do
{
printf(Rus("\nРабота с базой данных STUDENT\n"));
printf(Rus("выберите команду:\n"));
printf(Rus("1 - вывод сведений\n"));
printf(Rus("2 - вывод списка\n"));
printf(Rus("3 - сортировка списка \n"));
printf(Rus("4 - поиск по фамилии\n"));
printf(Rus("5 - выход\n"));
printf("-> ");
scanf("%i", &choice);
switch (choice)
{
case 1:
printf(Rus("выбрано: 1 - вывод сведений о студенте\n "));
printf(Rus("введите первые буквы фамилии: "));
scanf("%s", s);
DispData(studs, s);
break;
case 2:
printf(Rus("выбрано: 2 - вывод списка студентов\n "));
ListData(studs, nRecs);
break;
case 3:
printf(Rus("выбрано: 3 - сортировка списка студентов\n "));
SortN(studs, nRecs);
break;
case 4:
printf(Rus("выбрано: 4 - поиск по фамилии\n "));
printf(Rus("введите первые буквы фамилии: "));
scanf("%s", s);
FindRec(studs, s);
break;
case 5:
printf(Rus("выбрано: 5 - выход\n "));
break;
default:
printf(Rus("ошибка ввода номера команды\n"));
choice = 0;
}
} while (choice <5 && choice >0) ;
printf(Rus("нажмите любую клавишу"));
getch();
return 0;
}
void DispData(Student a[], char *s)
{
int i=0, j=0, res=0;
for (i=0; i<nRecs;i++)
{
if (strstr(Rus(a[i].fio),s)!=NULL)
{
res=1;
printf("%15s ",Rus(a[i].fio));
printf(" %5s %3i %i\n",Rus(a[i].predm),a[i].prog, a[i].step);
}
}
if (res==0)
printf("\n%s\n",Rus("фамилии нет в списке"));
}
void ListData(Student a[], int n)
{
int i,j;
printf(Rus("СПИСОК СТУДЕНТОВ\n"));
for(i=0;i<n;i++)
{
printf("%15s ", Rus(a[i].fio));
printf("%5s %4i %i\n", Rus(a[i].predm),a[i].prog, a[i].step);
}
}
void SortN(Student x[],int n)
{
int i,j;
for (i=n-1; i>0; i--)
for (j=0;j<i;j++)
if (x[j].prog>x[j+1].prog)
Swap(&x[j],&x[j+1]);
}
void Swap(Student *x, Student *y)
{
Student tmp;
tmp=Assign(*x); *x=Assign(*y); *y=Assign(tmp);
}
Student Assign(Student x)
{
Student z;
strcpy(z.fio, x.fio); strcpy(z.predm, x.predm);
z.prog=x.prog; z.step=x.step;
return z;
}
Student FindRec(Student x[], char *str)
{
int i=0, res=0;
for (i=0; i<nRecs; i++)
{
if (strstr(Rus(x[i].fio), str)!=NULL)
{
res=1;
printf("%15s ", Rus(x[i].fio));
printf("%5s %4i %i\n", Rus(x[i].predm),x[i].prog, x[i].step);
}
}
if (res==0)
printf("\n%s",
Rus("студента нет в списке"));
}
Объяснение кода листинга программы
В данном коде реализована работа с базой данных студентов. Код начинается с объявления переменных и структур. Затем в функции main() происходит основной процесс работы с базой данных, который включает в себя ввод данных, их вывод и сортировку. Список студентов выводится в функции ListData(), которая принимает массив студентов и его размер. В цикле происходит обход каждого элемента массива и вывод его содержимого на экран. Сортировка списка студентов реализована в функции SortN(). Она работает по принципу сортировки пузырьком, сравнивая значения поля prog двух соседних элементов массива. Если значение поля prog первого элемента больше, чем у второго, то они меняются местами. Поиск студента по фамилии реализован в функции FindRec(). Она принимает массив студентов и строку, которая является частью фамилии искомого студента. В цикле происходит обход каждого элемента массива и сравнение его фамилии с искомым значением. Если совпадение найдено, то информация о найденном студенте выводится на экран. Также в коде присутствуют функции DispData() и Assign(), которые используются для вывода информации о конкретном студенте и для копирования значений из одного объекта типа Student в другой соответственно. В конце кода подключаются заголовочные файлы, которые содержат русские строки для работы с русским языком в консоли.