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

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

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

 
 Ответить  Открыть новую тему 
> задачи по файлам, помогите найти ошибку!
PaPoV
сообщение 12.05.2012 21:23
Сообщение #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 - 12.05.2012 21:58
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 12.05.2012 21:39
Сообщение #2


Бывалый
***

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

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


Ну, желательно соблюдать отступы - будет легче.
Но если уже такой код, то для форматирования воспользуйся штатной к 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.

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





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

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


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


Бывалый
***

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

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


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





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

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


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

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


Бывалый
***

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

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


Не видя окончательный вариант obr, могу предположить, что end "не туда попал" smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
PaPoV
сообщение 12.05.2012 23:37
Сообщение #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 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 13.05.2012 0:09
Сообщение #8


Бывалый
***

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

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


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





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

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


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

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

 



- Текстовая версия 15.07.2025 1:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"