IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> задачи по файлам, помогите найти ошибку!
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


задача: создать файл, содержащий сведения о сдаче студентами сессии и организовать поиск по ФИО.

Вот прога:
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 перед точкой.

Сообщение отредактировано: PaPoV -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Ну, желательно соблюдать отступы - будет легче.
Но если уже такой код, то для форматирования воспользуйся штатной к FreePascal утилитой ptop (её обсуждение "http://forum.pascal.net.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.

Сообщение отредактировано: Федосеев Павел -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


большое спасибо! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Не мне спасибо, а создателям инструмента.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Я turbo pascal-ем пользуюсь, так что спасибо!

Добавлено через 4 мин.
а почему после поиска и вывода результатов появляется ошибка file not open?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Не видя окончательный вариант obr, могу предположить, что end "не туда попал" smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


1) readln( c ) - есть разница
2) а зачем ты заменил правильное (while not eof) чтение из файла на странный в этой ситуации for? Отсюда и ошибка.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Да, ошибок теперь нет, но не выводит информацию по фамилии.
Просто снова выводит меню
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 11.09.2025 20:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name