Отсортировать список студентов в зависимости от оценки - C (СИ)
Формулировка задачи:
уважаемые читатели форума. не получается одна задачка.
надо создать список группы: имя студента и его оценка, в последующем надо будет отсортировать список и в зависимости од оценки. у меня возникла проблема на первом этапе. как заполнить массив?
вот мой вариант кода:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct student
{
char name;
int mark;
} student;
void fillGroup1(student *s, char group1[], int n)
{
int i,j;
printf("Enter a student's name and his mark\n");
for(i=0;i<n;i++)
{
scanf("%s %d",&(s.name), &(s.mark));
}
}
//int findMin()
//int findMax()
//int findAvg()
int main()
{
student s;
int n;
char group1[50], group2[50], group1_and_group2[50];
printf("Enter a number of students 'in group I': ");
scanf("%d",&n);
//printf("Enter a number of students 'in group II': ");
//scanf("%d",&n);
fillGroup1(group1,n);
system("pause");
return 0;
}
ах, да строка 19 полный бред
Решение задачи: «Отсортировать список студентов в зависимости от оценки»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LEN 50
struct student_info
{
char name[MAX_NAME_LEN + 1];
unsigned short mark;
};
int get_student_info(struct student_info* student)
{
char format[20];
sprintf(format, "%%%ds %%hu", MAX_NAME_LEN);
return scanf(format, student->name, &student->mark) == 2;
}
void dump_group(struct student_info* student, unsigned count)
{
unsigned i;
putchar('\n');
for(i = 0; i < count; ++i)
printf("Student %s has mark %hu\n", student[i].name,
student[i].mark);
}
int cmp_on_marks(const void* a, const void* b)
{
return ((const struct student_info*) b)->mark -
((const struct student_info*) a)->mark;
}
int main(void)
{
int ex_code = 0;
unsigned group_size, i;
struct student_info* group = NULL;
printf("Input the number of students in the first group: ");
if(scanf("%u", &group_size) != 1)
{
fprintf(stderr, "Input error\n");
ex_code = 1;
goto ex;
}
if((group = malloc(group_size * sizeof(struct student_info))) == NULL)
{
fprintf(stderr, "Memory allocation error\n");
ex_code = 1;
goto ex;
}
printf("Input information about students:\n");
for(i = 0; i < group_size; ++i)
{
printf("%02d> ", i + 1);
if(!get_student_info(&group[i]))
{
fprintf(stderr, "Input error\n");
ex_code = 1;
goto ex_free;
}
}
dump_group(group, group_size);
qsort(group, group_size, sizeof(struct student_info), cmp_on_marks);
printf("\nGroup arranged in the descending orger by marks\n");
dump_group(group, group_size);
ex_free:
if(group)
free(group);
ex:
exit(ex_code);
}
Объяснение кода листинга программы
Список действий в коде:
- Включаем необходимые заголовочные файлы для работы с консолью и структурой данных.
- Объявляем структуру данных для хранения информации о студентах, которая включает имя и оценку.
- Определяем функцию, которая получает информацию о студенте и сохраняет ее в структуре данных.
- Определяем функцию, которая выводит информацию о группе студентов в консоль.
- Определяем функцию сравнения, которая используется для сортировки студентов по оценкам.
- В функции main() запрашиваем у пользователя количество студентов в группе и сохраняем это значение в переменной.
- Выделяем память под массив структур student_info с помощью функции malloc().
- Запрашиваем у пользователя информацию о каждом студенте и сохраняем ее в соответствующей структуре.
- Выводим информацию о каждом студенте в консоль.
- Сортируем массив структур student_info по оценкам с помощью функции qsort().
- Выводим отсортированный список студентов в консоль.
- Освобождаем выделенную память с помощью функции free().
- Завершаем программу с указанным кодом ошибки.