Помощь - Поиск - Пользователи - Календарь
Полная версия: задачи по файлам
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
PaPoV
задача: создать файл, содержащий сведения о сдаче студентами сессии и организовать поиск по ФИО.

Вот прога:
program q;
type ekz=record
gr:string;
fio:string;
ex:array[1..5] of integer end;
var spf:file of ekz;
spr:ekz;
rej,i:integer; f:string; c:char;
procedure sozd;
begin
rewrite(spf);
with spr do begin
writeln('введите группу');
readln(gr);
writeln('введите ФИО');
readln(fio);
writeln('введите 5 оценок по экзаменам');
for i:=1 to 5 do begin write(i,'-ая оценка');
readln(ex[i]) end;
write(spf,spr);
writeln('продолжить ввод? y/n');
read©;
if (c='n') or (c='N') then exit; end;
end;
procedure obr;
begin
reset(spf);
writeln('введите ФИО для поиска');
readln(f);
with spr do while not Eof(spf) do begin
read(spf,spr);
if f=fio then begin writeln('ФИО:',fio:30,'группа:',gr:7);
writeln('оценки:');
for i:=1 to 5 do write(ex[i]:4,',') end;
close(spf)
end;
begin
assign(spf,'D:\spis.txt');
while true do
begin
writeln('меню:');
writeln('1: создание списка;');
writeln('2: поиск по ФИО студента;');
writeln('3: выход');
readln(rej);
case rej of
1: sozd;
2: obr;
3: halt;
else writeln('ошибка!!! повторите ввод'); end; end;
end.


требует ; после последнего end перед точкой.
Федосеев Павел
Ну, желательно соблюдать отступы - будет легче.
Но если уже такой код, то для форматирования воспользуйся штатной к FreePascal утилитой ptop (её обсуждение "http://forum.pascalnet.ru/index.php?showtopic=24653").

Program q;

Type ekz = Record
gr: string;
fio: string;
ex: array[1..5] Of integer
End;

Var spf: file Of ekz;
spr: ekz;
rej,i: integer;
f: string;
c: char;
Procedure sozd;
Begin
rewrite(spf);
With spr Do
Begin
writeln('введите группу');
readln(gr);
writeln('введите ФИО');
readln(fio);
writeln('введите 5 оценок по экзаменам');
For i:=1 To 5 Do
Begin
write(i,'-ая оценка');
readln(ex[i])
End;
write(spf,spr);
writeln('продолжить ввод? y/n');
read©;
If (c='n') Or (c='N') Then exit;
End;
End;
Procedure obr;
Begin
reset(spf);
writeln('введите фио для поиска');
readln(f);
With spr Do
While Not Eof(spf) Do
Begin
read(spf,spr);
If f=fio Then
Begin
writeln('ФИО:',fio:30,'группа:',gr:7);
writeln('оценки:');
For i:=1 To 5 Do
write(ex[i]:4,',')
End;
close(spf)
End;
Begin
assign(spf,'D:\spis.txt');
While true Do
Begin
writeln('меню:');
writeln('1: создание списка;');
writeln('2: поиск по фамилии');
writeln('3: выход');
readln(rej);
Case rej Of
1: sozd;
2: obr;
3: halt;
Else writeln('ошибка!!! повторите ввод');
End;
End;
End.

Здесь лучше видно отсутствие end в процедуре obr.
PaPoV
большое спасибо! good.gif
Федосеев Павел
Не мне спасибо, а создателям инструмента.
PaPoV
Я turbo pascal-ем пользуюсь, так что спасибо!

Добавлено через 4 мин.
а почему после поиска и вывода результатов появляется ошибка file not open?
Федосеев Павел
Не видя окончательный вариант obr, могу предположить, что end "не туда попал" smile.gif
PaPoV
wacko.gif я совсем замучался:
процедура sozd работает криво после
writeln('продолжить ввод? y/n');

т.е. пропускает чтение группы и ожидает пока будет введена фамилия.
Процедура obr выдает dick read error


ПОМОГИТЕ, ПОЖАЛУЙСТА!!! unsure.gif


const n=99;
type ekz=record
gr:string;
fio:string;
ex:array[1..5] of integer
end;
fl=array[1..n] of ekz;
var spf:file of fl;
spr:fl;
j,rej,i:integer; f:string; c:char;
procedure sozd;
begin
j:=1;
rewrite(spf);
with spr[j] do
while true do
begin
writeln('введите группу');
readln(gr);
writeln('введите ФИО');
readln(fio);
writeln('введите 5 оценок');
for i:=1 to 5 do
begin write(i,'-ая оценка');
readln(ex[i])
end;
writeln('продолжить ввод? y/n');
read©;
if (c='n') or (c='N')
then exit
else j:=j+1
end;
write(spf,spr);
close(spf)
end;
procedure dob;
begin
j:=1;
reset(spf);
seek(spf,filesize(spf));
with spr[i] do
while true do
begin
writeln('введите группу');
readln(gr);
writeln('введите ФИО');
readln(fio);
writeln('введите 5 оценок');
for i:=1 to 5 do
begin write(i,'-ая оценка');
readln(ex[i])
end;
writeln('продолжить ввод? y/n');
read©;
if (c='n') or (c='N')
then exit
else j:=j+1
end;
write(spf,spr);
close(spf)
end;
procedure obr;
begin
j:=1;
reset(spf);
writeln('введите ФИО для поиска');
readln(f);
for j:=1 to n do
with spr[j] do
begin
read(spf,spr);
if f=fio then
begin writeln('ФИО:',fio:30,'группа:':12,gr:7);
writeln('оценки:');
for i:=1 to 5 do write(ex[i]:4,',')
end;
end;
close(spf)
end;
begin
assign(spf,'D:\spis.txt');
while true do
begin
writeln('меню:');
writeln('1: создание списка;');
writeln('2: поиск по ФИО;');
writeln('3: добавление записей;');
writeln('4: выход');
readln(rej);
case rej of
1: sozd;
2: obr;
3: dob;
4: halt;
else writeln('ошибка!!! повторите ввод')
end
end
end.
Федосеев Павел
1) readln( c ) - есть разница
2) а зачем ты заменил правильное (while not eof) чтение из файла на странный в этой ситуации for? Отсюда и ошибка.
PaPoV
Да, ошибок теперь нет, но не выводит информацию по фамилии.
Просто снова выводит меню
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.