В двоичный файл записать Фамилию, Имя, Занимаемое место, упорядоченные по убыванию и вывести этот файл на экран - C (СИ)
Формулировка задачи:
// Sportsmens.cpp: определяет точку входа для консольного приложения.
//даны количество спортсменов, количество видов спорта и записи (с консоли или текстового файла)
//Фамилия Имя баллы(по каждому виду спорта)
//в двоичный файл записать Фамилию Имя Занимаемое место, упорядоченные по убыванию и вывести этот файл на
//экран
#include "stdafx.h"
#include <iostream>
#include <string.h>
struct sport
{
char sname[20];
char name[20];
int sum=0;
};
void swap(char* n, char* k);
int sportsmen(sport* arr);
void swap2(int& n, int& k);
void sort(sport* arr, int numb);
void vyvod_bin(sport* arr, char*name_out, int numb);
int _tmain(int argc, _TCHAR* argv[])
{
const int n = 5;
sport arr[n];
int z = sportsmen(arr);
}
int sportsmen(sport* arr)
{
char name_in[20], name_out[20];
int ball,numb,vid;
scanf("%s %s", &name_in, &name_out);
FILE*in;
in = fopen(name_in, "rt");
if (in == 0)
{
printf("Error!");
return 1;
}
fscanf(in,"%d %d", &numb, &vid);
for (int k = 0; k < numb; k++)
{
fscanf(in,"%s %s", &arr[k].sname, &arr[k].name);
for (int i = 0; i < vid; i++)
{
fscanf(in,"%d", &ball);
arr[k].sum += ball;
}
}
fclose(in);
sort(arr, numb);
vyvod_bin(arr, name_out, numb);
return 0;
}
void swap(char* n, char* k)
{
char tmp[20];
strcpy(tmp, n);
strcpy(n, k);
strcpy(k, tmp);
}
void swap2(int& n, int& k)
{
int tmp = n;
n = k;
k = tmp;
}
void sort(sport* arr, int numb)
{
for (int i = 0; i < numb; i++)
for (int j = 0; j < numb - 1; j++)
if (arr[j].sum<arr[j + 1].sum)
{
swap(arr[j].sname, arr[j + 1].sname);
swap(arr[j].name, arr[j + 1].name);
swap2(arr[j].sum, arr[j + 1].sum);
}
}
void vyvod_bin(sport* arr, char*name_out,int numb)
{
FILE* out;
out = fopen(name_out, "w+b");
char name1[20], sname1[20];
int pos;
for (int i = 0; i < numb; i++)
{
fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
fwrite(&arr[i].name, sizeof(struct sport), 1, out);
fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
}
for (int i = 0; i < numb; i++)
{
fread(&name1, sizeof(struct sport), 1, out);
fread(&sname1, sizeof(struct sport), 1, out);
printf("%s %s %d\n", name1, sname1, i + 1);
}
fclose(out);
}for (int i = 0; i < numb; i++)
{
fread(&name1, sizeof(struct sport), 1, out);
fread(&sname1, sizeof(struct sport), 1, out);
printf("%s %s %d\n", name1, sname1, i + 1);
}
5 3
1vanya vanyafam 5 5 5
2petya petyafam 0 0 0
3grisha grishafam 3 3 3
4katya katyafam 1 1 1
5vova vovafam 4 4 4
Это лежит во входном файле. (На всякий случай для тестирования). Должно получиться
1vanya vanyafam 1
5vova vovafam 2
3grisha grishafam 3
4katya katyafam 4
2petya petyafam 5
Решение задачи: «В двоичный файл записать Фамилию, Имя, Занимаемое место, упорядоченные по убыванию и вывести этот файл на экран»
textual
Листинг программы
for (int i = 0; i < numb; i++)
{
fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
fwrite(&arr[i].name, sizeof(struct sport), 1, out);
fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
}
Объяснение кода листинга программы
В данном коде используется оператор for для прохода по массиву структур arr определённое количество раз, указанное в переменной numb.
В каждой итерации цикла выполняются следующие действия:
- fwrite(&arr[i].sname, sizeof(struct sport), 1, out) — информация из поля
snameструктурыarr[i]записывается в файлout, указанный в функцииfwrite. Параметрsizeof(struct sport)указывает размер структурыsport, а параметр1указывает, что нужно записать 1 элемент. - fwrite(&arr[i].name, sizeof(struct sport), 1, out) — информация из поля
nameструктурыarr[i]записывается в файлout, указанный в функцииfwrite. Параметрsizeof(struct sport)указывает размер структурыsport, а параметр1указывает, что нужно записать 1 элемент. - fwrite(&arr[i].sum, sizeof(struct sport), 1, out) — информация из поля
sumструктурыarr[i]записывается в файлout, указанный в функцииfwrite. Параметрsizeof(struct sport)указывает размер структурыsport, а параметр1указывает, что нужно записать 1 элемент. После выполнения всех итераций цикла, файлoutбудет содержать информацию о фамилии, имени и занимаемом месте, упорядоченных по убыванию.