Работа с текстовым файлом

  • Автор темы IaElka
  • Дата начала
I

IaElka

#1
Написать программу обработки файла типа запись, содержащую следую-щие пункты меню: «Создание», «Просмотр», «Коррекция» (добавление новых данных или редактирование старых), «Решение индивидуального задания».
Каждая запись должна содержать следующую информацию о студентах:
– фамилия и инициалы;
– год рождения;
– номер группы;
– оценки за семестр: по физике, математике, информатике, химии;
– средний балл.
Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.
Содержимое всего файла и результаты решения индивидувльного задания записать в текстовый файл.

ИНДИВИД. ЗАДАНИЕ:Вычислить общий средний балл всех студентов и распечатать список студентов интересующей вас группы, имеющих средний балл выше общего среднего бал-ла.

Подскажите, как исправить ошибку при нахождении среднего балла?...считается только целая часть. А как сделать, чтобы и дробная была.?

#include<conio.h>
#include<stdio.h>
#include<io.h>

struct TZap{
char FIO[30];
int DataRojd;
int NomGr;
int Fizika;
int Math;
int Inform;
int Himia;
double s_b;
}Zap;
int size = sizeof(TZap);
FILE *Fz, *Ft;
char File_Zap[]="zapisi.dat";
char File_Rez[]="rezult.txt";
void Out(TZap);

void main()
{
clrscr();
int kod, D_f,i=0,j,kol;
long len;
TZap st, *mas_Z;
Ft = fopen(File_Rez, "w");
while(1){
puts("\nSOZDANIE-1\n-REDAKTIROVANIE-2\nPROSMOTR-3");
puts("-RESHENIE INDIVIDUALNOGO ZADANIA-4\nVIHOD-0");
scanf("%d",&kod);
switch(kod){
case 1:
if((Fz=fopen(File_Zap, "wb"))==NULL){
puts("\nCREATE ERROR!");
return;
}
fclose(Fz);
printf("\nCreate New File %s!\n",File_Zap);
break;
case 2:
Fz=fopen(File_Zap,"ab");
printf("\nF.I.O. - ");
fflush(stdin);
gets(Zap.FIO);
printf("\nData rojdenia - ");
scanf("%d",&Zap.DataRojd);
printf("\nNomer gruppi - ");
scanf("%d",&Zap.NomGr);
printf("\nOcenka po fizike - ");
scanf("%d",&Zap.Fizika);
printf("\nOcenka po matematike - ");
scanf("%d",&Zap.Math);
printf("\nOcenka po informatike - ");
scanf("%d",&Zap.Inform);
printf("\nOcenka po himii - ");
scanf("%d",&Zap.Himia);
Zap.s_b=(Zap.Fizika+Zap.Math+Zap.Inform+Zap.Himia)/4;
fwrite(&Zap,size,1,Fz);
fclose(Fz);
break;
case 3:
if((Fz=fopen(File_Zap,"rb"))==NULL){
puts("\nOPEN ERROR!");
return;
}
printf("\n\t------INFORMATIONS------");
fprintf(Ft,"\n\t------INFORMATIONS------");
while(1){
if(!fread(&Zap,size,1,Fz))break;
Out(Zap);
}
fclose(Fz);
break;
/*case 4:
Fz=fopen(File_Zap,"rb");
D_f=fileno(Fz);
len=filelength(D_f);
kol=len/size;
mas_Z=new TZap[kol];
for(i=0;i<kol;i++)
fread((mas_Z+i),size,1,Fz);
fclose(Fz);
printf("\n\t------SORT------");
fprintf(Ft,"\n\t------SORT------");
for(i=0;i<kol-1;i++)
for(j=i+1;j<kol;j++)
if(mas_Z.s_b>mas_Z[j].s_:rolleyes:{
st=mas_Z;
mas_Z=mas_Z[j];
mas_Z[j]=st;
}
for(i=0;i<kol;i++)
Out(mas_Z);
delete []mas_Z;
break;*/
case 0:
fclose(Ft);
return;
}
}
}
void Out(TZap z)
{
printf("\n%20s,%d,%6d,%d,%d,%d,%d,%5.2lf.",z.FIO,z.DataRojd,z.NomGr,z.Fizika,z.Math,z.Inform,z.Himia,z.s_:ya_lamo:;
fprintf(Ft,"\n%20s,%d,%d,%d,%d,%d,%d,%5.2lf.",z.FIO,z.DataRojd,z.NomGr,z.Fizika,z.Math,z.Inform,z.Himia,z.s_B);
}
 

SunSanych

Well-known member
28.06.2006
71
0
#4
Из покрывшихся пылью школных знаний мне вспоминается, что квадратный корень в виде дроби записывается как 1/2. А кубический корень как 1/3.
 
I

IaElka

#5
всёравно не выходит. Думаецца, что предложенные варианты ответа неверны.
 

SunSanych

Well-known member
28.06.2006
71
0
#6
Общий алгоритм решения таких задач это:
1. Определить входные данные чтобы можно было легко считать;
2. Посчитать все эти a,b,c,d,f... вручную;
3. Вывести расчитываемые значения (эти самые a,b,c,d,f... ) на экран и сравнить какие из них отличаются от посчитанных вручную;
4. Повторять пока не будут выявлены и исправлены все ошибки.

Если есть сомнения в ответе есть только один способ проверить - посчитать самому :(

Добавлено: Вижу ты поправил. Я заметил z сначала задаётся как входной параметр, а потом считается как y-x.
 

SunSanych

Well-known member
28.06.2006
71
0
#8
c=pow((y/x),(1.0/3))

Во, так правильно. Иначе действовали правила целочисленной арифметики и деление 1 на 3 давало 0.
 
I

IaElka

#9
как же тогда заменить функцию pow?

Добавлено: Получилось!!!! Спасибо!!! :(
 

SunSanych

Well-known member
28.06.2006
71
0
#10
Задача №4

Лишний цикл while. z не уменьшается и происходит зацикливание если последнее введеное значение было не ноль. Лучше так:

Код:
for(z = n-1; z >= 0; z--)
{
if( a[z]!=0 )
s = s + a[z];
else
break;
}
или немного короче:
Код:
for(z = n-1; z >= 0 && a[z]!=0; z--)
{
s = s + a[z];
}
Кроме того правила хорошего стиля требует проверять ввод пользователя, тем более что для этого достаточно написать:

Код:
cin >> n;

if(n > 50)
n = 50;
else if(n < 1)
n = 0;
В противном случае может получиться запись за границы массива, что скорее всего приведет к краху программы. Понимаю, что пример учебный, но ничего с собой поделать не могу, слишком мазолит глаза. :(

Удачи.