Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Товарищи-программисты, прошу у вас помощи с написанием кода на с++, трудно написать, с учетом работы ранее на паскале.

korov Ka Ученик (87), открыт 1 неделю назад
Использовать <stdio.h>,
FILE *fopen(const char *path, const char *mode),
int fclose(FILE *f) и тд
Сформировать текстовый файл, в котором для группы спортсменов указаны сведения о фамилии и результате в беге на дистанцию 5000м (минуты, секунды, десятые и сотые доли секунды). Сформировать второй файл, куда занести информацию о шести лучших спортсменах.
3 ответа
Пользователь удален Мастер (1436) 1 неделю назад
Ойойой, в майл ру вряд ли айтишники найдутся
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ Мыслитель (9354) 1 неделю назад
Конечно! Давайте разобьем задачу на шаги и создадим решение на C++ с использованием стандартной библиотеки и функций для работы с файлами, как указано в задании.

### Задача:
1. Нужно создать текстовый файл с данными о спортсменах.
2. Для каждого спортсмена указать фамилию и результат в беге на дистанцию 5000 м (в минутах, секундах и долях секунды).
3. Из первого файла выбрать 6 лучших спортсменов (по времени) и записать их в новый файл.

### Подход:
- Мы будем использовать `FILE *fopen()` для открытия файлов для чтения и записи.
- Будем работать с результатами в формате минут, секунд и сотых долей.
- Для сортировки спортсменов будем использовать стандартные функции сортировки.

### Реализация:

```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SPORTSMEN 100

// Структура для хранения данных о спортсмене
typedef struct {
char lastName[100]; // Фамилия
int minutes; // Минуты
int seconds; // Секунды
int hundredths; // Сотые доли секунды
} Athlete;

// Функция для сравнения двух спортсменов по времени
int compare(const void *a, const void *b) {
Athlete *athleteA = (Athlete*)a;
Athlete *athleteB = (Athlete*)b;

// Сравниваем сначала по минутам
if (athleteA->minutes != athleteB->minutes)
return athleteA->minutes - athleteB->minutes;

// Если минуты одинаковы, сравниваем по секундам
if (athleteA->seconds != athleteB->seconds)
return athleteA->seconds - athleteB->seconds;

// Если секунды одинаковы, сравниваем по сотым долям
return athleteA->hundredths - athleteB->hundredths;
}

int main() {
FILE *inputFile = fopen("athletes.txt", "r"); // Открываем файл для чтения
FILE *outputFile = fopen("best_athletes.txt", "w"); // Открываем файл для записи

if (inputFile == NULL) {
printf("Ошибка открытия файла для чтения!\n");
return 1;
}
if (outputFile == NULL) {
printf("Ошибка открытия файла для записи!\n");
return 1;
}

Athlete athletes[MAX_SPORTSMEN];
int athleteCount = 0;

// Чтение данных из первого файла
while (fscanf(inputFile, "%s %d:%d.%d", athletes[athleteCount].lastName,
&athletes[athleteCount].minutes,
&athletes[athleteCount].seconds,
&athletes[athleteCount].hundredths) == 4) {
athleteCount++;
if (athleteCount >= MAX_SPORTSMEN) break;
}

// Сортировка спортсменов по времени (сначала минуты, затем секунды, потом сотые доли)
qsort(athletes, athleteCount, sizeof(Athlete), compare);

// Запись в выходной файл данных о шести лучших спортсменах
for (int i = 0; i < 6 && i < athleteCount; i++) {
fprintf(outputFile, "%s %d:%02d.%02d\n", athletes[i].lastName,
athletes[i].minutes, athletes[i].seconds, athletes[i].hundredths);
}

// Закрытие файлов
fclose(inputFile);
fclose(outputFile);

printf("Шесть лучших спортсменов записаны в файл best_athletes.txt\n");
return 0;
}
```
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡Мыслитель (9354) 1 неделю назад
Пояснение:
Структура Athlete:

Хранит фамилию спортсмена и его результат в беге: минуты, секунды и сотые доли.
Функция compare:

Эта функция используется для сортировки спортсменов. Сначала сравниваются минуты, затем секунды, и если они равны, то сотые доли.
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡Мыслитель (9354) 1 неделю назад
Основная логика:

Мы открываем файл athletes.txt для чтения и файл best_athletes.txt для записи.
С помощью fscanf считываем данные о спортсменах.
Сортируем массив спортсменов по времени.
Записываем данные о шести лучших спортсменах в новый файл best_athletes.txt.
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡Мыслитель (9354) 1 неделю назад
Пример формата входных данных (athletes.txt):
python-repl
Копировать код
Ivanov 15:30.12
Petrov 14:45.80
Sidorov 16:20.15
Mikhailov 14:35.25
Smirnov 15:05.50
Borisov 14:55.75
...
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡ ⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡Мыслитель (9354) 1 неделю назад
Пример формата выходных данных (best_athletes.txt):
python-repl
Копировать код
Petrov 14:45.80
Mikhailov 14:35.25
Borisov 14:55.75
...
Теперь у вас есть рабочий код, который формирует два файла, как было указано в задаче.
Cogni Просветленный (46578) 1 неделю назад
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME 50
typedef struct { char surname[MAX_NAME]; int minutes, seconds, tenths, hundredths; double totalTime; } Athlete;
int compareAthlete(const void *a, const void *b) {
double t1 = ((Athlete*)a)->totalTime, t2 = ((Athlete*)b)->totalTime;
return (t1 < t2) ? -1 : (t1 > t2) ? 1 : 0;
}
int main() {
int n;
printf("Введите количество спортсменов: ");
if(scanf("%d", &n)!=1 || n<=0){ printf("Некорректное количество.\n"); return 1; }
Athlete *athletes = (Athlete*)malloc(n * sizeof(Athlete));
if(!athletes){ printf("Ошибка выделения памяти.\n"); return 1; }
for(int i=0;i<n;i++){
printf("Введите фамилию и время (мин сек десятки сотни) для спортсмена %d: ", i+1);
scanf("%s %d %d %d %d", athletes[i].surname, &athletes[i].minutes, &athletes[i].seconds, &athletes[i].tenths, &athletes[i].hundredths);
athletes[i].totalTime = athletes[i].minutes * 60 + athletes[i].seconds + athletes[i].tenths * 0.1 + athletes[i].hundredths * 0.01;
}
FILE *f = fopen("athletes.txt", "w");
if(!f){ printf("Ошибка открытия файла athletes.txt.\n"); free(athletes); return 1; }
for(int i=0;i<n;i++) fprintf(f, "%s %02d:%02d.%d%d\n", athletes[i].surname, athletes[i].minutes, athletes[i].seconds, athletes[i].tenths, athletes[i].hundredths);
fclose(f);
qsort(athletes, n, sizeof(Athlete), compareAthlete);
FILE *f_top = fopen("top6.txt", "w");
if(!f_top){ printf("Ошибка открытия файла top6.txt.\n"); free(athletes); return 1; }
int topCount = n < 6 ? n : 6;
for(int i=0;i<topCount;i++) fprintf(f_top, "%s %02d:%02d.%d%d\n", athletes[i].surname, athletes[i].minutes, athletes[i].seconds, athletes[i].tenths, athletes[i].hundredths);
fclose(f_top);
free(athletes);
return 0;
}
Похожие вопросы