Консультация № 187021
23.12.2012, 16:49
90.00 руб.
0 1 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Напишите на языке С программу, считывающую из файла фамилии N студентов и полученные ими оценки по программированию и печатающую в файл список k лучших студентов с указанием их оценок. Список должен быть отсортирован в порядке убывания полученной оценки.
Напишите как можно проще и с большим количеством комментариев.
Спасибо.

Обсуждение

давно
Профессор
399103
482
24.12.2012, 10:05
общий
это ответ
Здравствуйте, Дмитрий!

Код:

#include <stdio.h>
#include <stdlib.h>

// Структура данных, содержащих данные о студенте
struct Student
{
char name[101]; // фамилия(не длиннее 100 символов)
unsigned mark; // оценка
};

// функция сравнения, нужная для сортировки, использующаяся в функции qsort
int compare(const void * a, const void * b)
{
Student* student1 = (Student*) a;
Student* student2 = (Student*) b;

return student2->mark - student1->mark;
}

int main()
{
unsigned n, k; // число всех студентов и лучших, соответственно
Student* students; // указатель на область памяти, содержащую данные о студентах
FILE* file; // файловый дескриптор

file = fopen("students.txt", "r"); // открываем файл
/* Пример допустимого формата файла:
* 5 3
* abc1 4
* abc2 2
* abc3 5
* abc4 3
* abc5 4
*/
// если не получилось открыть - говорим об этом и завераем программу
if (file == 0)
{
printf("Failed to open a file\n");
return -1;
}

// считываем n и k
fscanf(file, "%u %u", &n, &k);

students = (Student*) malloc(n * sizeof(Student)); // выделяем память на всех студентов
// считываем данные
for (unsigned i = 0; i < n; ++i)
{
fscanf(file, "%s %u", &students[i].name, &students[i].mark);
}

/*
// Печатаем всех
for (i = 0; i < n; ++i)
{
printf("%s %u\n", students[i].name, students[i].mark);
}
*/

qsort(students, n, sizeof(Student), compare); // сортируем

// Печатаем лучших
for (unsigned i = 0; i < k; ++i)
{
printf("%s %u\n", students[i].name, students[i].mark);
}

free(students); // освобождаем память
fclose(file); // закрываем файл

return 0;
}
Форма ответа