Получить отсортированных людей по курсам, далее по группам - C (СИ)

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

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

В общем есть такая прога:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<io.h>
 
struct spec {int code;
         char  text [10];
            };
 
struct student {char fac [10],
                 kaf [10],
                     fio [20];
                     spec sp;
                     int kurs;
                     char group[10];
                     int marks[3];
        };
 
struct list_elem {
             struct student data;
                 struct list_elem *next;
             };
 
struct student st;
struct list_elem *s0,*s1,*s2,*se;
int i,n,k,j;
char c, caf[10];
 
void main ()
{clrscr();
s1=new(struct list_elem);
s0=s1;
do {
 
   printf ("=================== Add student =================== \n");
   printf ("Faculty: ");         scanf("%s", st.fac);
   printf ("Kafedra: ");         scanf("%s", st.kaf);
   printf ("Name: ");            scanf("%s", st.fio);
   printf ("Speciality Code: "); scanf("%i", st.sp.code);
   printf ("           Text: "); scanf("%s", st.sp.text);
   printf ("Kurs: ");            scanf("%i", st.kurs);
   printf ("Group: ");           scanf("%s", st.group);
   for (int j=0; j<3; j++)
     {printf ("Ocеnka za %i ekzamen: ", j+1);
      scanf ("%i", st.marks[j]); };
 
   s1->next=(struct list_elem*)malloc(sizeof(struct list_elem));
   s1->data=st;
   s1=s1->next;
   printf ("Continue? (Y/N) \n" );  c=getch();
}
while (c=='y' || c=='Y');
se=s1;

s1=s0;
do
 {if (islower(s1->data.fio[0]))
  s1->data.fio[0]=toupper(s1->data.fio[0]);
  for(j=1;j<strlen(s1->data.fio);j++)
   if(isupper(s1->data.fio[j]))
    s1->data.fio[j]=tolower(s1->data.fio[j]);
  s1=s1->next;}
while (s1!=se);
 
s1=s0;
do{
   s2=s1;
    do{
       if(strcmp(s1->data.fio,s2->data.fio)>0)
         {st=s1->data;
          s1->data=s2->data;
          s2->data=st; }
          s2=s2->next;
      }
    while(s2!=se);
  s1=s1->next;
 }
while(s1!=se);
 
s1=s0;
do{
 strcpy(caf,s1->data.kaf);
   s2=s1->next;
   do{
   if(strcmp(caf,s2->data.kaf)==0)
    {s1=s1->next;
     st=s1->data;
     s1->data=s2->data;
     s2->data=st;}
   s2=s2->next;
      }
      while (s2!=se);
 s1=s1->next;}
while (s1!=se);
 
printf("\nFaculty  Kafedra    Name   Spec.code   Spec.text  Kurs   Group     Marks \n"  );
printf("----------------------------------------------------------------------------\n");
 
s1=s0;
do{
printf("%s   |   %s  |   %s  |   %i  |   %s  |   %i  |   %s  |   %i, %i, %i \n",
         (*s1).data.fac,(*s1).data.kaf,(*s1).data.fio,(*s1).data.sp.code,(*s1).data.sp.text,(*s1).data.kurs,
         (*s1).data.group,(*s1).data.marks[0],(*s1).data.marks[1],(*s1).data.marks[2]);
   s1=s1->next;
   }
while (s1!=se);
getch();
}
Она после ввода сортирует людей по кафедрам и в пределах каждой сортирует их по алфавиту. Мне же из этого нужно получить отсортированных людей по курсам, далее по группам и в пределах группы сортировать имя по алфавиту. Можно ли переделать, если да, то как? Спасибо огромное заранее. Мне нужно хотя бы объяснить как работает прога, остальное думаю сам сделаю, но иногда бывает проще просто переделать, чем объяснять как оно работает. Прошу что-то одно... Еще раз спасибо всем откликнувшимся...

Решение задачи: «Получить отсортированных людей по курсам, далее по группам»

textual
Листинг программы
scanf("%i", st.kurs);

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

  1. Вводится число с помощью функции scanf и сохраняется в переменной st.kurs.

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

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