Консультация № 181346
14.12.2010, 12:07
0.00 руб.
0 7 1
Здравствуйте, уважаемые эксперты! Прошу Вас помочь с переделыванием структуры программы в приложении, написанной на code blocks, на работу с файлами.
Хочется в готовой программе увидеть следующий вывод: http://s43.radikal.ru/i102/1011/cc/79e92bc876cb.png
Спасибо.

Приложение:
#include <stdio.h>
#include<string.h>
#define SIZE 4
#define MAX_BALLS 4


typedef struct
{
int year;
int month;
int day;
} Born;

typedef struct student
{
char FIO[20];
char Gender[2];
Born b;

char City[30];
int Balls[MAX_BALLS];
} Student;

void Print_Group(Student MyMas[], int quant);
void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1);
void Sort_Group(Student MyMas[], int quant);
int main()
{
int i;
int j;
int n1;
Student GROUP[SIZE], GROUP1[SIZE];


for ( i = 0; i<SIZE; i++)
{
printf("\nNAME: ");
scanf("%s", GROUP[i].FIO);

printf("Gender(m/f): ");
scanf("%s", GROUP[i].Gender);

printf("City : ");
scanf("%s", GROUP[i].City);

printf("Marks[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++)
scanf("%d", &GROUP[i].Balls[j])
;

}

printf("______________________\n");
printf("\nVvednniy spisok[%i]\n",SIZE);
printf("______________________\n");
Print_Group(GROUP, SIZE);
printf("\n");

Izm_Group(GROUP,GROUP1,SIZE, &n1);
printf("______________________\n");
printf("Sokrazhennyi spisok[%i]\n",n1);
printf("______________________\n");
Print_Group(GROUP1,n1);
printf("\n");

Sort_Group(GROUP1,n1);
printf("______________________\n");
printf("Otsortirovannyi spisok[%i]\n",n1);
printf("______________________\n");
Print_Group(GROUP1,n1);

return 0;
}

void Print_Group(Student MyMas[], int quant)
{ int i,j;
double sum;
printf("\Name\tGender\tCity\tMarks\tSredniy ball\n");
for( i=0, sum=0.0; i<quant; i++)

{
printf("%s\t%s\t%s\t", MyMas[i].FIO, MyMas[i].Gender, MyMas[i].City);
for(j=0, sum=0.0; j<MAX_BALLS; j++)
{ sum+=MyMas[i].Balls[j];
printf("%d ", MyMas[i].Balls[j]);
}
printf("%4.2f\n", sum/MAX_BALLS);
}
}


void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1)
{

int i;

for(i=0, *quant1=0; i<quant; i++)
if((strcmp(MyMas[i].Gender,"f")==0)&&(strcmp(MyMas[i].City,"SPb")==0))
{
MyMas1[(*quant1)++]=MyMas[i];
}
}

void Sort_Group(Student MyMas[],int quant)
{

int i, j, k, k1;
int sum, sum1;
Student buf;
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)

{
for (k=0, sum=0; k<MAX_BALLS; k++)
sum+=MyMas[j].Balls[k
];

for (k1=0, sum1=0; k1<MAX_BALLS; k1++)
sum1+=MyMas[j-1].Balls[k1];

if(sum1>sum)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}

}
}

Обсуждение

Неизвестный
18.12.2010, 01:19
общий
это ответ
Здравствуйте, Aptemis!
Если вносить минимальные изменения в исходную программу, то проще всего все scanf-ы заменить на fscanf, а printf-ы, отвечающие за вывод, на fprintf. Число записей тоже можно читать из файла, но тогда уже надо будет использовать динамические массивы. Простейший пример в приложении, в логику программы никаких изменений не вносила.
Удачи!

Приложение:
#include <stdio.h>
#include<string.h>
#define SIZE 1//4
#define MAX_BALLS 4

#define INPUT "input.txt" //входной файл
#define OUTPUT "output.txt" //выходной файл

FILE* f; //переменная файла, если не объявлять её глобально, то надо передавать её как параметр в функцию вывода

typedef struct
{
int year;
int month;
int day;
} Born;

typedef struct student
{
char FIO[20];
char Gender[2];
Born b;

char City[30];
int Balls[MAX_BALLS];
} Student;

void Print_Group(Student MyMas[], int quant);
void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1);
void Sort_Group(Student MyMas[], int quant);
int main()
{
int i;
int j;
int n1;
Student GROUP[SIZE], GROUP1[SIZE];


f = fopen (INPUT, "rt");


for ( i = 0; i<SIZE; i++)
{
//printf("\nNAME: ");
fscanf(f, "%s", GROUP[i].FIO);

//printf("Gender(m/f): ");
fscanf(f, "%s", GROUP[i].Gender);

//printf("City : ");
fscanf(f, "%s", GROUP[i].City);

//printf("Marks[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++)
fscanf(f, "%d", &GROUP[i].Balls[j])
;

}

fclose (f);

f = fopen (OUTPUT, "wt");

fprintf(f, "______________________\n");
fprintf(f, "\nVvednniy spisok[%i]\n",SIZE);
fprintf(f, "______________________\n");
Print_Group(GROUP, SIZE);
fprintf(f, "\n");

Izm_Group(GROUP,GROUP1,SIZE, &n1);
fprintf(f, "______________________\n");
fprintf(f, "Sokrazhennyi spisok[%i]\n",n1);
fprintf(f,"______________________\n");
Print_Group(GROUP1,n1);
fprintf(f,"\n");

Sort_Group(GROUP1,n1);
fprintf(f,"______________________\n");
fprintf(f,"Otsortirovannyi spisok[%i]\n",n1);
fprintf(f, "______________________\n");
Print_Group(GROUP1,n1);

fclose (f);

return 0;
}

void Print_Group(Student MyMas[], int quant)
{ int i,j;
double sum;
fprintf(f,"\Name\tGender\tCity\tMarks\tSredniy ball\n");
for( i=0, sum=0.0; i<quant; i++)

{
fprintf(f,"%s\t%s\t%s\t", MyMas[i].FIO, MyMas[i].Gender, MyMas[i].City);
for(j=0, sum=0.0; j<MAX_BALLS; j++)
{ sum+=MyMas[i].Balls[j];
fprintf(f,"%d ", MyMas[i].Balls[j]);
}
fprintf(f, "%4.2f\n", sum/MAX_BALLS);
}
}


void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1)
{

int i;

for(i=0, *quant1=0; i<quant; i++)
if((strcmp(MyMas[i].Gender,"f")==0)&&(strcmp(MyMas[i].City,"SPb")==0))
{
MyMas1[(*quant1)++]=MyMas[i];
}
}

void Sort_Group(Student MyMas[],int quant)
{

int i, j, k, k1;
int sum, sum1;
Student buf;
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)

{
for (k=0, sum=0; k<MAX_BALLS; k++)
sum+=MyMas[j].Balls[k
];

for (k1=0, sum1=0; k1<MAX_BALLS; k1++)
sum1+=MyMas[j-1].Balls[k1];

if(sum1>sum)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}

}
}
Неизвестный
18.12.2010, 10:26
общий
Здравствуйте, Verena. Ну если ничего не менять в программе, то совсем страшно получается, если все-таки раскомментить все, что было, то все очень красиво с маленькой проблемой, такой, как отсутствие ввода как такового.
Неизвестный
18.12.2010, 14:27
общий
Здравствуйте!
Ввод происходит из файла input.txt. Если Вам нужно оставить ввод из консоли, а в файл делать только вывод, просто верните часть, отвечающую за ввод, к прежнему виду.
Неизвестный
19.12.2010, 17:53
общий
Верно, ввод должен быть из консоли.
Но вообще-то в файлы нужно вывести все то, что будет на выходе в консоли.
И каждую подпрограмму в отдельности: ввод, мы вводим в консоли, это копируется в файл, изменения, т.е. лишние фамилии в файл уже не идут и в заключение сортировка.
Неизвестный
20.12.2010, 00:09
общий
Не очень Вас поняла. Чтобы сделать ввод из консоли надо вот эту часть
Код:
for ( i = 0; i<SIZE; i++)
{
printf("\nNAME: ");
scanf("%s", GROUP[i].FIO);

printf("Gender(m/f): ");
scanf("%s", GROUP[i].Gender);

printf("City : ");
scanf("%s", GROUP[i].City);

printf("Marks[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++)
scanf("%d", &GROUP[i].Balls[j])
;

}

оставить прежней. Если Вам надо всё, что отображается в консоли, копировать в файл, то добавляете туда fprintf:
Код:
for ( i = 0; i<SIZE; i++)
{
printf("\nNAME: ");
scanf("%s", GROUP[i].FIO);

fprintf(f, "\nNAME: %s", GROUP[i].FIO);

printf("Gender(m/f): ");
scanf("%s", GROUP[i].Gender);

fprintf (f, "Gender(m/f): %s", GROUP[i].Gender);

printf("City : ");
scanf("%s", GROUP[i].City);

fprintf (f, "City : %s", GROUP[i].City);

printf("Marks[%d] : ", MAX_BALLS);
fprintf (f, "Marks[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++) {
scanf("%d", &GROUP[i].Balls[j]);
fprintf (f, "%d", GROUP[i].Balls[j]);

}

Ну и по аналогии - всё, что Вам нужно поместить файл, выводите через fprintf, что не нужно - через printf в консоль.
Неизвестный
20.12.2010, 00:28
общий
Уже шарики за ролики с этой работой заходят, с десяток различных версий у меня есть, в которых надо что-то подправить, дописать, изменить....
Вы можете произвести все аналогичные изменения, чтобы ввод шел только с консоли, а вывод каждой подпрограммы шел в отдельный файл?
Т.е. при запуске программы я ввожу все необходимые данные, затем консоль успешно отображает вывод, одновременно создаются 3 файла, print, izm и sort, где в каждом файле записан соответствующий вывод.
Неизвестный
20.12.2010, 01:18
общий
Так, что ли?
Код:
#include <stdio.h>
#include<string.h>
#define SIZE 4
#define MAX_BALLS 4

typedef struct
{
int year;
int month;
int day;
} Born;

typedef struct student
{
char FIO[20];
char Gender[2];
Born b;

char City[30];
int Balls[MAX_BALLS];
} Student;

void Print_Group(Student MyMas[], int quant);
void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1);
void Sort_Group(Student MyMas[], int quant);
int main()
{
int i;
int j;
int n1;
Student GROUP[SIZE], GROUP1[SIZE];


FILE* f = fopen ("print.txt", "rt");


for ( i = 0; i<SIZE; i++)
{
printf("\nNAME: ");
scanf("%s", GROUP[i].FIO);

fprintf(f, "\nNAME: %s", GROUP[i].FIO);

printf("Gender(m/f): ");
scanf("%s", GROUP[i].Gender);

fprintf (f, "Gender(m/f): %s", GROUP[i].Gender);

printf("City : ");
scanf("%s", GROUP[i].City);

fprintf (f, "City : %s", GROUP[i].City);

printf("Marks[%d] : ", MAX_BALLS);
fprintf (f, "Marks[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++) {
scanf("%d", &GROUP[i].Balls[j]);
fprintf (f, "%d", GROUP[i].Balls[j]);
}

fprintf(f, "______________________\n");
fprintf(f, "\nVvednniy spisok[%i]\n",SIZE);
fprintf(f, "______________________\n");
Print_Group(GROUP, SIZE, f);
fprintf(f, "\n");

fclose (f);

f = fopen ("izm.txt", "wt");



Izm_Group(GROUP,GROUP1,SIZE, &n1);
fprintf(f, "______________________\n");
fprintf(f, "Sokrazhennyi spisok[%i]\n",n1);
fprintf(f,"______________________\n");
Print_Group(GROUP1,n1);
fprintf(f,"\n");

fclose (f);

f = fopen ("sort.txt", "wt");



Sort_Group(GROUP1,n1);
fprintf(f,"______________________\n");
fprintf(f,"Otsortirovannyi spisok[%i]\n",n1);
fprintf(f, "______________________\n");
Print_Group(GROUP1,n1, f);

fclose (f);

return 0;
}

void Print_Group(Student MyMas[], int quant, FILE* f)
{ int i,j;
double sum;
fprintf(f,"\Name\tGender\tCity\tMarks\tSredniy ball\n");
for( i=0, sum=0.0; i<quant; i++)

{
fprintf(f,"%s\t%s\t%s\t", MyMas[i].FIO, MyMas[i].Gender, MyMas[i].City);
for(j=0, sum=0.0; j<MAX_BALLS; j++)
{ sum+=MyMas[i].Balls[j];
fprintf(f,"%d ", MyMas[i].Balls[j]);
}
fprintf(f, "%4.2f\n", sum/MAX_BALLS);
}
}


void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1)
{

int i;

for(i=0, *quant1=0; i<quant; i++)
if((strcmp(MyMas[i].Gender,"f")==0)&&(strcmp(MyMas[i].City,"SPb")==0))
{
MyMas1[(*quant1)++]=MyMas[i];
}
}

void Sort_Group(Student MyMas[],int quant)
{

int i, j, k, k1;
int sum, sum1;
Student buf;
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)

{
for (k=0, sum=0; k<MAX_BALLS; k++)
sum+=MyMas[j].Balls[k
];

for (k1=0, sum1=0; k1<MAX_BALLS; k1++)
sum1+=MyMas[j-1].Balls[k1];

if(sum1>sum)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}

}
}
Форма ответа