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

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

Intersap

#1
Вот такой вопрос:
Написать две программы.

Первая программа должна формировать начальные ведомости про студентов и записывать их в типизированный файл.
Вроде бы так:
Код:
program lab14;
uses crt;
type Stud = record
Name,Group: String;
Data: Integer;
Gender: String;
end;
Ispit1 = record
Teormeh,Mathematica,Phisics,Geometry:Integer;
end;
Ispit2 = record
Teormeh,Mathematica,Sopromat:Integer;
end;
var i,mat0,mat,phys0,phys,meh0,meh,geom0,geom,porivn1,porivn2,predmet: Integer;
Student:Stud;
Exam1:Ispit1;
Exam2:Ispit2;
ft: text;
begin
clrscr;
writeln;
for i:=1 to 17 do begin
textcolor(14);
write(i);
textcolor(white);
write(' ФИО студента:	');
readln(Student.Name);
write(' Группа:			 ');
readln(Student.Group);
write(' Дата рождения: ');
readln(Student.Data);
write(' Пол студента:	');
readln(Student.Gender);
writeln(' Оценки за первую сессию:');
write('	 Физика:							 ');
readln(Exam1.Phisics);
write('	 Математика:					  ');
readln(Exam1.Mathematica);
write('	 Теоретическая механика:  ');
readln(Exam1.Teormeh);
write('	 Начертательная геометрия: ');
readln(Exam1.Geometry);
writeln(' Оценки за вторую сессию:');
write('	 Математика:						');
readln(Exam2.Mathematica); 
write('	 Теоретическая механика:	');
readln(Exam2.Teormeh);
write('	 Сопротивление материалов: ');
readln(Exam2.Sopromat);
writeln;
end;
assign(ft,'stud.txt');
rewrite(ft);
for i:=1 to 17 do
begin
writeln(ft,i,' ФИО:				 ',Student.Name);
writeln(ft,'  Группа:			 ',Student.Group);
writeln(ft,'  Дата рождения: ',Student.Data);
writeln(ft,'  Пол:				 ',Student.Gender);
writeln(ft,'  Оценки за первую сессию:');
writeln(ft,'		 Физика:							 ',Exam1.Phisics);
writeln(ft,'		 Математика:					  ',Exam1.Mathematica);
writeln(ft,'		 Теоретическая механика:  ',Exam1.Teormeh);
writeln(ft,'		 Начертательная геометрия: ',Exam1.Geometry);
writeln(ft,'  Оценки за вторую сессию:');
writeln(ft,'		 Математика:						',Exam2.Mathematica);
writeln(ft,'		 Теоретическая механика:	',Exam2.Teormeh);
writeln(ft,'		 Сопротивление материалов: ',Exam2.Sopromat);
writeln;
end;
close(ft);
end.
Вторая программа должна считывать информацию с типизированного файла (созданого первой программой), находить предмет, который суденты сдали лучше всего, а результаты записывать в текстовый файл.
Программа сделана не до конца:
Код:
program lab14;
uses crt;
type Ispit1 = record
Teormeh,Mathematica,Phisics,Geometry:Integer;
end;
var Exam1:Ispit1;
ft: text;
i,mat0,mat,phys0,phys,meh0,meh,geom0,geom,porivn1,porivn2,predmet:Integer;
begin
clrscr;
writeln;
assign(ft,'stud.txt');
reset(ft);

считать данные - ?	 

mat0:=0;
phys0:=0;
meh0:=0;
geom:=0;
for i:=1 to 17 do begin
phys:=Exam1.Phisics;
phys0:=phys0+phys;
mat:=Exam1.Mathematica;
mat0:=mat0+mat;
meh:=Exam1.Teormeh;
meh0:=meh0+meh;
geom:=Exam1.Geometry;
geom0:=geom0+geom;
end;
if (mat0>phys0) then porivn1:=mat0
else porivn1:=phys0;
if (meh0>geom0) then porivn2:=meh0
else porivn2:=geom0;
if (porivn1>porivn2) then predmet:=porivn1
else predmet:=porivn2;
if (predmet=phys0) then N:='Лучше стали физику'
if (predmet=mat0) then N:='Лучше стали математику';
if (predmet=meh0) then N:='Лучше стали механику';
if (predmet=geom0) then N:='Лучше стали графику';
writeln(ft,N);
readkey;
close(ft);
end.
Помогите чем могите
 
I

Intersap

#3
сейчас у меня получается 3 типа, а в файле указывается ток 1. соответсвенно мне надо сделать один типа:
Код:
type Stud = record
Name,Group: String;
Data: Integer;
Gender: String;
Teormeh1,Mathematica1,Phisics,Geometry,Teormeh2,Mathematica2,Sopromat:Integer;
end;
var Student:Stud;
ft: file of Stud или ft: file of Student; -?
C одним разобралить, а как во второй порграмме выцепить дынные с файла?
 

hosm

* so what *
18.05.2009
2 442
6
#4
Stud - это тип, Student - переменная.
Поэтому надо
ft: file of Stud;
И разобраться, как с ним работать - чтение и запись в типизированный файл.
Пример вот в конце темы: http://www.learn-programming.za.net/progra...al_learn11.html
там не сложно. =) Только учтите, что типизированный файл - это не текстовый файл и перепишите в 1й программе
т.е. будет в цикле write(ft, Student) для 1й или read(ft, Student) для 2й.
 
I

Intersap

#5
сделал так:
Код:
program lab14;
uses crt;
type Stud = record
Name,Group: String;
Data: Integer;
Gender: String;
Teormeh1,Mathematica1,Phisics,Geometry:Integer;
Teormeh2,Mathematica2,Sopromat:Integer;
end;
var i: Integer;
Student:Stud;
ft: file of Stud;
begin
clrscr;
writeln;
for i:=1 to 17 do
with Student do
begin
textcolor(14);
write(i);
textcolor(white);
write(' ФИО студента:	');
readln(Student.Name);
write(' Группа:			 ');
readln(Student.Group);
write(' Дата рождения: ');
readln(Student.Data);
write(' Пол студента:	');
readln(Student.Gender);
writeln(' Оценки за первую сессию:');
write('	 Физика:							 ');
readln(Student.Phisics);
write('	 Математика:					  ');
readln(Student.Mathematica1);
write('	 Теоретическая механика:  ');
readln(Student.Teormeh1);
write('	 Начертательная геометрия: ');
readln(Student.Geometry);
writeln(' Оценки за вторую сессию:');
write('	 Математика:						');
readln(Student.Mathematica2); 
write('	 Теоретическая механика:	');
readln(Student.Teormeh2);
write('	 Сопротивление материалов: ');
readln(Student.Sopromat);
writeln;
end;
assign(ft,'stud.txt');
rewrite(ft);
for i:=1 to 17 do
with Student do
begin
writeln(i,' ФИО:				 ',Student.Name);
writeln('  Группа:			 ',Student.Group);
writeln('  Дата рождения: ',Student.Data);
writeln('  Пол:				 ',Student.Gender);
writeln('  Оценки за первую сессию:');
writeln('		 Физика:							 ',Student.Phisics);
writeln('		 Математика:					  ',Student.Mathematica1);
writeln('		 Теоретическая механика:  ',Student.Teormeh1);
writeln('		 Начертательная геометрия: ',Student.Geometry);
writeln('  Оценки за вторую сессию:');
writeln('		 Математика:						',Student.Mathematica2);
writeln('		 Теоретическая механика:	',Student.Teormeh2);
writeln('		 Сопротивление материалов: ',Student.Sopromat);
writeln;
end;
close(ft);
end.
А теперь файл создает пустой. В чем ошибка?
 

BashOrgRu

Well-known member
15.03.2009
77
0
#6
Такого вида записи "writeln(' Группа: ',Student.Group);" замени на "writeln(ft,' Группа: ',Student.Group);"
 
I

Intersap

#8
нашли кому фразы кидать - Я НЕ ПРОГРАММИСТ - я не пойму куда его писать!!!
 

hosm

* so what *
18.05.2009
2 442
6
#9
write(ft, Student) вместо этого
writeln(i,' ФИО: ',Student.Name); writeln(' Группа: ',Student.Group); writeln(' Дата рождения: ',Student.Data); writeln(' Пол: ',Student.Gender); writeln(' Оценки за первую сессию:'); writeln(' Физика: ',Student.Phisics); writeln(' Математика: ',Student.Mathematica1); writeln(' Теоретическая механика: ',Student.Teormeh1); writeln(' Начертательная геометрия: ',Student.Geometry); writeln(' Оценки за вторую сессию:'); writeln(' Математика: ',Student.Mathematica2); writeln(' Теоретическая механика: ',Student.Teormeh2); writeln(' Сопротивление материалов: ',Student.Sopromat); writeln;
кстати, я тоже не повар, но это не значит, что я и моя семья ходим голодные =) и что я не смогу приготовить еду по простому рецепту, который я прочитаю...
надо решить задачу? тогда либо учимся читать, что пишут и включаем немного мозг - тогда форумчане подскажут дальше, либо обращаемся в темы типа таких Пишу программы на заказ Delphi, Pascal, Perl, Sql ...

Дальше. во второй задаче описание файловой переменной и типов точно такое же, как и в 1й.
считывание примерно так
assign(ft,'stud.txt');
//обнулить нужные переменные
for i:=1 to 17 do begin
read(ft, Student); // считали запись
// дальше вычисления (суммирование оценок)
end;
close(ft);//закрыли типизированный файл данных
Вычисления на правильность сейчас не смотрела - спать хочу =)))
И еще есть результирующий текстовый файл t:text, куда запишете результаты как
assign(t,'result.txt'); rewrite(t); writeln(t, N); close(t);
Высшая математика? :)
 
I

Intersap

#12
смотря кто попадется.

А у наших баранов: я так и не понял как записать информацию в файл. Это write(ft, Student) не проходит. Создает файл, в котором и половины значений нет
 

hosm

* so what *
18.05.2009
2 442
6
#13
Создает файл, в котором и половины значений нет
А Вы считывать пробовали? что получается?
И чем смотрели? Что увидели?

Добавлено: кста, Gender: String - это, конечно, слишком жирно, достаточно символа или перечислимого типа
 
I

Intersap

#15
1.
Код:
type Stud = record
Name,Group: String[100];
Data: byte;
Gender: char;
Teormeh1,Mathematica1,Phisics,Geometry:byte;
Teormeh2,Mathematica2,Sopromat:byte;
end;
var i: byte;
Student:Stud;
ft: file of Stud;
2. а почему это два раза!? a как тогда надо это описать?

3. а черт его знает
 

hosm

* so what *
18.05.2009
2 442
6
#16
2. а почему это два раза!? a как тогда надо это описать?
кинуть в один цикл "фор" запрос данных у пользователя и сразу же запись в файл.
3. пошлите их к нему, не надо они, явно указаны уже в коде Student.Name, etc.
 
I

Intersap

#17
так прикол в том что в файле как таковых данных нет а набор символов (которые даже не вводились) и ОЧЕНЬ много пробелов

Добавлено: или я такой тупой или лыжи не едут
"моя попытка №5":

Код:
begin
clrscr;
writeln;
assign(ft,'stud.txt');
rewrite(ft);
for i:=1 to 17 do
with Student do
begin
textcolor(14);
write(i);
textcolor(white);
write(' ФИО студента:	');
readln(Student.Name);
write(' Группа:			 ');
readln(Student.Group);
write(' Дата рождения: ');
readln(Student.Data);
write(' Пол студента:	');
readln(Student.Gender);
writeln(' Оценки за первую сессию:');
write('	 Физика:							 ');
readln(Student.Phisics);
write('	 Математика:					  ');
readln(Student.Mathematica1);
write('	 Теоретическая механика:  ');
readln(Student.Teormeh1);
write('	 Начертательная геометрия: ');
readln(Student.Geometry);
writeln(' Оценки за вторую сессию:');
write('	 Математика:						');
readln(Student.Mathematica2); 
write('	 Теоретическая механика:	');
readln(Student.Teormeh2);
write('	 Сопротивление материалов: ');
readln(Student.Sopromat);
writeln;
write (ft,Student) -? (я так понял)
end;		
close(ft);
end.
 

hosm

* so what *
18.05.2009
2 442
6
#20
вот эе среди прочего указывалось выше:
считывание примерно так
Код:
assign(ft,'stud.txt');
//обнулить нужные переменные
for i:=1 to 17 do begin
read(ft, Student); // считали запись
// дальше вычисления (суммирование оценок)
end;
close(ft);//закрыли типизированный файл данных