Помощь - Поиск - Пользователи - Календарь
Полная версия: Странная ошибка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Mars
program kursov;
uses crt;
type
student=record
  name:string[23]; {имя и инициалы}
  number:integer;  {номер группы}
  ball:array[1..5] of integer; {успеваемость}
  srball:real;          {средняя оценка}
end;

const
  max=100;  {количество записей}
  d=' ';
var
  f1:file of student; {файловая переменная массива}
  a:array [1..max] of student; {массив записей}
  zap:student;
  num:integer; {общее количество записей в массиве}
  i,j:integer;
  gg:longint;
  sel:integer; {выбор пункта меню}
  key1,key2:string;
  key3,key4,key5:integer; {ключи для поиска, задаваемые пользователем}
   sum:longint; {сумма значений полей}
   err:integer;
   zap1,zap2:integer; {обмен записей}
   m1,m2:student; {для сортировки записей}
   m,n:string; {строки для сортировки}
   s:boolean; {ключ сортировки}
   buf:student; {буферная запись для обмена}
   filename:string; {имя файла с записями}
   z:string; {фильтрация пробелов}
   pball:string[9]; {Оценки для ввода и вывода}
   error,x,y,dx,dy:integer;

{описание процедур}
procedure menu; forward;
procedure zapis; forward;

procedure shapka; {заголовок таблицы}
begin
writeln ('                      ТАБЛИЦА ЗАПИСЕЙ');
writeln;
writeln('г=========================T============'+
  'T==============T==========¬');
writeln ('¦      ФАМИЛИЯ И.О.       ¦  № Группы  ¦ Успеваемость ¦ Ср. Балл ¦');
writeln('¦=========================+============'+
  '+==============+==========¦');
end;

procedure read; {процедура добавления записи в файл}{(2 подпрограмма)}
begin
  clrscr; {ассоциация с файлом и переход в конец}
  writeln ('                      ДОБАВЛЕНИЕ ЗАПИСЕЙ В ФАЙЛ');
  writeln;
  write ('                      Введите имя файла ');
  readln (filename);
  assign (f1,filename);
  reset (f1);
  if not eof(f1) then begin
    gg:=filesize(f1);
    seek(f1,gg);
  end;
 
clrscr;
writeln ('                      ВВОД ЗАПИСЕЙ');
writeln;
write ('                      Введите количество записей ');
readln (num);
for i:=1 to num do
begin
clrscr;
writeln;
writeln ('                      ЗАПИСЬ ',i);
with zap do
begin
write ('                      Фамилия И.О. ');
readln (name);
write ('                      № Группы ');
readln (number);
Writeln ('                    Успеваемость');
writeln ('                    Введите оценку ');
for j:= 1 to 5 do
begin
write ('                       №',j,' ');
readln (ball[j]);
end;

{Подсчет Среднего Балла}
sum:=0;
for j:=1 to 5 do
sum:=sum+ball[j];
srball:=sum/5;

end;

write(f1,zap);

end;
close(f1);
menu;
end; {процедура добавления записи в файл}{(конец 2 подпрограммы)}

procedure view; {вывод массива на экран}{процедура просмотра файла}
{(5 подпрограмма)}
begin
clrscr;
writeln ('                      ПРОСМОТР ФАЙЛА');
writeln;
write ('                      Введите имя файла ');
readln (filename);
assign (f1,filename);
reset (f1);
clrscr;
shapka;
while (not Eof(f1)) do
begin
read   *******    (f1,zap);   -          Здесь возникает ошибка
with zap do
begin
write ('¦ ',name:23,' ¦ ');
write (number:10,' ¦ ');
for i:=1 to 5 do write(ball,' ');
write ('  ',' ¦ ');
write (srball:6:2,' ¦');
writeln;
end;
end;
writeln('L=========================¦============'+
  '¦==============¦==========-');
readkey;
menu;
end; {вывод массива на экран}{процедура просмотра файла}
{(конец 5 подпрограммы)}

procedure new; {процедура создания нового файла}
{(1 подпрограмма)}
begin
clrscr;
Writeln('          Введите имя файла');
Write('        ');
Readln(filename);
Assign(f1,filename);
Rewrite(f1);
Writeln('Файл с именем ',filename,' создан. Нажмите ENTER.');
readkey;
menu;
close(f1);
end;

procedure menu;
begin
clrscr;
writeln;
writeln;
writeln;
writeln;
writeln ('                  База данных ');
writeln;
writeln ('                  ------------------------------------');
writeln ('                     1. Создание файла');
writeln ('                     2. Добавление записи в файл');
writeln ('                     3. Удаление указанной записи');
writeln ('                     4. Корректировка указанной записи');
writeln ('                     5. Просмотр файла');
writeln ('                     6. Сортировка по возрастанию номера группы');
writeln ('                     7. Вывод на дисплей при условии ср. балл >4.0');
writeln ('                     8. Выход');
writeln ('                  ------------------------------------');
writeln;
write   ('                  > ');
readln (sel);
case sel of
1:new;
2:read;
3:delete;
4:edit;
5:view;
6:sort;
7:display;
8:exit;
end;
end;


BEGIN
clrscr;
menu;
END.



В процедуре, которая под комментариями пятой считается, всё сделано довольно стандартно и вроде не должно появляться никаких ошибок, но вот что странно, на месте считывания с файла {там где ***} постоянно возникает ошибка 85, что пропущено ";". Причем не важно в какой части процедуры поставить этот read, как-будто паскаль специально его ищет и говорит об ошибке. Помогите пожалуйста, уже и не знаю что делать...
volvo
Mars, ну а что ты хотел? Ты же назвал одну из своих процедур Read, и этим ПЕРЕОПРЕДЕЛИЛ стандартную процедуру ввода Паскаля. А так как у твоей процедуры нет параметров, то компилятор совершенно прав, требуя ";" сразу после Read... Поменяй
procedure read; { <--- Здесь !!! }
begin
  ...
end;

имя на любое другое, и функциональность стандартного Read вернется... smile.gif
Но у тебя там дальше есть еще ошибки... :yes:
xds
Также можно воспользоваться указанием полных имён объектов, т. е. в виде <имя модуля>.<имя объекта>. В данном случае вызов стандартной псевдопроцедуры Read будет выглядеть как System.Read;, а вызов переопределённой - Read; или kursiv.Read;.
Mars
Спасибо вам насчёт read! А слона как говорится и не приметил!
p.s. volvo, ошибка наверное в выводе из файла элементов массива? Если да то знаю, это я так, скелет набросал, потом переделывать буду...
volvo
Цитата(Mars @ 17.09.2005 11:15)
volvo, ошибка наверное в выводе из файла элементов массива?

Нет, в косвенной рекурсии: из menu вызываются другие процедуры, в двух (?) из которых в свою очередь вызывается menu... У тебя стек что, резиновый? Ведь ни одна из menu не заканчивается, равно как и New (кстати, тоже зарезервированное слово Паскаля), и Read ...

Поищи по форуму, я уже где-то приводил опасности подобных вызовов, и способы правильной организации меню тоже.
Mars
Нажмите для просмотра прикрепленного файла

Вот программа, вроде всё работает, но может есть какие ошибки? Не подскажет ли кто-нибудь?
И ещё, если в файле, который просматривается >30 записей, то как лучше реализовать постраничное листание по файлу, например показались первые 20 записей, нажали <вниз> - следующие 20, <вверх> - предыдущие?

mars, в следующий раз приаттачивай такие большие исходники, подсветка синтаксиса притормаживает...
Mars
В связи с ненужностью, прошу volvo или других модераторов удалить тему и прикрепленный файл. Спасибо за помощь.

Тема временно скрыта по личной просьбе автора ...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.