Удалить из списка информацию о спортсмене с наименьшим количеством очков - C (СИ) (69729)
Формулировка задачи:
Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.
Нашел в интернете код
Но выдаёт ошибки следующие :
Помогите разобраться в чём проблема.
Листинг программы
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>*
- #include <locale.h>
- struct sportsmen{
- char FirstName[32];
- int number[10], points[128];
- };
- void read(struct sportsmen *sportsmen, int i)
- {
- for (int j = 0; j < i; j++){
- printf("enter FirstName \n");
- scanf("%s", &sportsmen[j].FirstName);
- printf("enter number \n");
- scanf("%i", &sportsmen[j].number);
- printf("enter points \n");
- scanf("%i", &sportsmen[j].points);
- }
- }
- int main()
- {
- setlocale(LC_ALL, "ukr");
- struct sportsmen sportsmen[5];
- read(sportsmen, 5);
- FILE *f, *fdell;
- if ((f = fopen("f.txt ", "wb")) == NULL)
- {
- printf("Помилка при відкритті файлу");
- return 1;
- }
- }
Листинг программы
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
- #include <windows.h>
- char c;
- struct sports { char fam[20]; int number, score; } spr;
- void inputdata(FILE *);
- void updatedata(FILE *);
- void printdata(FILE *);
- void deletedata(FILE *);
- void inputdata(FILE *st)
- {
- char ch;
- st = fopen("file1.dat", "wb");
- do
- {
- printf("\nВведите данные спортсмена через пробел - фамилия, номер, количество набранных очков.\n");
- scanf("%s%d%d", spr.fam, &spr.number, &spr.score);
- fwrite(&spr, sizeof(spr), 1, st);
- printf("\nЗакончить ввод данных?\n");
- ch = getch();
- } while (ch != 'y');
- fclose(st);
- system("cls");
- printf("Данные о спортсменах записаны!\n");
- }
- void printdata(FILE *st)
- {
- system("cls");
- int i;
- st = fopen("file1.dat", "rb");
- i = 1;
- fread(&spr, sizeof(spr), 1, st);
- while (!feof(st))
- {
- printf("\n%d. Фамилия спортсмена: %s, номер: %d, количество очков: %d", i, spr.fam, spr.number, spr.score);
- fread(&spr, sizeof(spr), 1, st);
- i++;
- }
- printf("\n\nНажмите любую клавишу для выхода в меню.\n");
- getch();
- system("cls");
- }
- void updatedata(FILE *st)
- {
- char ch;
- st = fopen("file1.dat", "ab");
- do
- {
- printf("\nВведите данные о спортсмене через пробел - фамилия, номер, количество набранных очков.\n");
- scanf("%s%d%d", spr.fam, &spr.number, &spr.score);
- fwrite(&spr, sizeof(spr), 1, st);
- printf("\nЗакончить добавление данных? y/n\n");
- ch = getch();
- } while (ch != 'y');
- fclose(st);
- system("cls");
- }
- void deletedata(FILE *st)
- {
- system("cls");
- char ch;
- int i, n, min;
- sports *p, temp;
- st = fopen("file1.dat", "rb");
- n = 0;
- fseek(st, 0, 2);
- n = ftell(st) / sizeof(sports);
- fseek(st, 0, 0);
- p = (sports *)malloc(n*sizeof(sports));
- for (i = 0; i<n; ++i)
- {
- fread(&spr, sizeof(spr), 1, st);
- p[i] = spr;
- }
- fclose(st);
- st = fopen("file1.dat", "wb");
- min = 0;
- for (i = 1; i<n; ++i)
- if (p[i].score<p[min].score)
- min = i;
- for (i = 0; i<n; ++i)
- if (i != min)
- fwrite(&p[i], sizeof(spr), 1, st);
- getch();
- free(p);
- fclose(st);
- }
- main()
- {
- FILE *st;
- system("cls");
- while (1)
- {
- printf("\n1. Ввести данные о спортсменах.\n");
- printf("2. Вывести список спортсменов.\n");
- printf("3. Добавить данные о новом спортсмене.\n");
- printf("4. Удалить данные о спортсмене с минимальным количеством очков.\n");
- printf("5. Выход.\n");
- c = getch();
- switch (c)
- {
- case '1':inputdata(st); break;
- case '2':printdata(st); break;
- case '3':updatedata(st); break;
- case '4':deletedata(st); break;
- case '5':return 0; break;
- default:system("cls"); printf("\nНеверно выбран пункт меню!\n\n");
- }
- }
- }
Решение задачи: «Удалить из списка информацию о спортсмене с наименьшим количеством очков»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #define NUMBER_OF_ATHLETES 10
- struct Athlete
- {
- char name[16];
- unsigned int number, points;
- };
- int compFunc(const void *a, const void *b);
- int main()
- {
- struct Athlete athlete[NUMBER_OF_ATHLETES];
- for (size_t i = 0; i < NUMBER_OF_ATHLETES; ++i) {
- printf("Name, number, points: ");
- scanf("%s%u%u", &athlete[i].name, &athlete[i].number, &athlete[i].points);
- }
- qsort(athlete, NUMBER_OF_ATHLETES, sizeof(struct Athlete), compFunc);
- for (size_t i = 0; i < NUMBER_OF_ATHLETES - 1; ++i) {
- printf("Name, number, points: %s, %u, %u \n", athlete[i].name, athlete[i].number, athlete[i].points);
- }
- }
- int compFunc(const void *a, const void *b)
- {
- struct Athlete *ath1 = (struct Athlete *)a;
- struct Athlete *ath2 = (struct Athlete *)b;
- return ath1->points < ath2->points;
- }
Объяснение кода листинга программы
В представленном коде реализована задача по удалению из списка информации о спортсмене с наименьшим количеством очков. Описание переменных и функций:
- NUMBER_OF_ATHLETES - определяет количество спортсменов, для которых будет вестись учет результатов.
- struct Athlete - структура, представляющая одного спортсмена. Содержит поля: имя ( name ), номер ( number ), очки ( points ).
- compFunc - функция сравнения, используемая в функции qsort для сортировки списка спортсменов по убыванию количества очков.
- main - основная функция программы, в которой происходит ввод данных о спортсменах с помощью функции scanf и вывод на экран результатов с помощью функции printf .
- qsort - функция сортировки, применяемая к массиву структур athlete с использованием функции сравнения compFunc.
- athlete - массив структур, представляющий список спортсменов. В основной функции программы после ввода данных о спортсменах происходит их сортировка по убыванию количества очков с помощью функции qsort и функции сравнения compFunc. Затем в цикле выводятся на экран результаты (имя, номер, очки) каждого спортсмена, кроме последнего, так как последний спортсмен будет удален из списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д