Вывести на экран фамилии студентов в порядке увеличения их суммарного числа прогулов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

1. В деканате составлена ведомость , в которой указаны фамилия студентов, название предметов и количество прогулов по каждому предмету. Вывести на экран фамилии студентов в порядке увеличения их суммарного числа прогулов по всем предметам. (в этой задаче преподаватель разрешил заменить фамилии студентов и названия предметов цифрами).

Решение задачи: «Вывести на экран фамилии студентов в порядке увеличения их суммарного числа прогулов»

textual
Листинг программы
#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 в другой соответственно. В конце кода подключаются заголовочные файлы, которые содержат русские строки для работы с русским языком в консоли.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5
Похожие ответы