Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с Сортировкой в программе "База Данных"
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Callipso
При запуске сортировки (сортировка выполняется по 2му полю программы, т.е. по годам) выскакивает ошибка процессора и паскаль вырубается. Помогите пожалуйста найти ошибку.

Заранее большое спасибо.


procedure sort;
var
f,f1: file of Lekarstva;
s,t,p: Lekarstva;
log: boolean;
k,i,j,n: integer;
a: array [1..10] of Lekarstva ;
z: string;
b: integer;
begin
clrscr;
assign (f,'c:\Lekarstva.dat');
reset (f);
n:=filesize(f);
i:=0;
while not eof(f) do
 begin
  read (f,s);
  a[i]:=s;
  i:=i+1;
 end;
repeat
 log:=true;
 for i:=0 to n-2 do
  if (a[i].year)>(a[i+1].year)  then
   begin
    b:=a[i].year;
    a[i].year:=a[i+1].year;
    a[i+1].year:=b;
    z:=a[i].name;
    a[i].name:=a[i+1].name;
    a[i+1].name:=z;
    z:=a[i].vipusk;
    a[i].vipusk:=a[i+1].vipusk;
    a[i+1].vipusk:=z;
    z:=a[i].bolesn;
    a[i].bolesn:=a[i+1].bolesn;
    a[i+1].bolesn:=z;
    log:=false
   end;
until log;
clrscr;
writeln (Shapka);
for i:=0 to n-1 do
 begin
  for j:=length(a[i].name) to 20 do
    a[i].name:=a[i].name + ' ';
 
   writeln (':',a[i].name,':',a[i].year,':',a[i].vipusk,'                :',a[i].bolesn);
 end;
 close (f);
 repeat until keypressed;
end;




Ниже прикрепляю всю программу
мисс_граффити
Прикрепи, плз, Lekarstva.dat (запакуй в рар-архив, например).

Вот это страшное место:
    b:=a[i].year;
    a[i].year:=a[i+1].year;
    a[i+1].year:=b;
    z:=a[i].name;
    a[i].name:=a[i+1].name;
    a[i+1].name:=z;
    z:=a[i].vipusk;
    a[i].vipusk:=a[i+1].vipusk;
    a[i+1].vipusk:=z;
    z:=a[i].bolesn;
    a[i].bolesn:=a[i+1].bolesn;
    a[i+1].bolesn:=z;
    log:=false

мне абсолютно не понятно, но хотелось бы потестировать на живом примере.
volvo
Вот это "страшное место" меняется на 3 строки, потому как для того чтобы поменять местами значения записей совсем не обязательно менять местами все ее поля по отдельности... С записью оператор присваивания сработает абсолютно аналогично.
Callipso
Вот архив с кодом программы и файлом Lekarstva.dat (там всего три записи,но я думаю,для примера работы сойдёт).
Большое спасибо за помощь!
мисс_граффити
По-моему, проблема в самом файле.
Запустила примитивный кусочек на этом файле:
uses crt;
type
	Lekarstva=record
	name: string [20];
	year: integer;
	vipusk: string;
	bolesn: string;
   end;
var curr: lekarstva;
f: file of Lekarstva;

begin
clrscr;
assign(f,'c:\1.dat');
reset(f);
while not(eof (f)) do
  begin
  read(f,curr);
  writeln(curr.name);
  end;
readln;
end.

результат превзошел ожидания smile.gif нечто жуткое.

покажешь, как ты заполняешь файл?
volvo
Что-то на самом деле непонятное с файлом... Размер записи (судя по исходнику) = 535 байт, размер файла должен быть ему кратен, однако на самом деле этого не наблюдается.
Callipso
Так я же код программы приложил к предыдущим постам) Там есть процедура создания самой базы...

procedure create;

var
	f: file of Lekarstva;
	s: Lekarstva;
	b: integer;

begin
clrscr;
assign (f,'c:\lekarstva.dat');
rewrite (f);
 repeat
  write ('Enter title of medicine ');
  readln (s.name);
  write ('Enter year of release ');
  readln (s.year);
  write ('Enter form of release ');
  readln (s.vipusk);
  write ('Enter sickness ');
  readln (s.bolesn);
 write (f,s);
 write ('Continue? (1-yes, 2-no) ');
 readln (b);
 until b=2;
close (f);
end;

volvo
А теперь внимательно перечитай пост №6... Почему у тебя этого не происходит? А когда я создал новый файл - все прекрасно читается...

Меня терзают смутные сомнения, что я догадался о причине... Ты каким компилятором пользуешься, расскажи?
мисс_граффити
Создала новый файл.
Стало несколько лучше.
Только в процедуре сортировки не i:=0, а i:=1 нужно. ну и дальше границы циклов переставь...
Callipso
Всё заработало.
Большое прибольшое спасибо за помощь!!!!!))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.