Удалить из списка информацию о спортсмене с наименьшим количеством очков - 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. Затем в цикле выводятся на экран результаты (имя, номер, очки) каждого спортсмена, кроме последнего, так как последний спортсмен будет удален из списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д