Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проблема с Сортировкой в программе "База Данных"

Автор: Callipso 28.05.2007 16:33

При запуске сортировки (сортировка выполняется по 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;




Ниже прикрепляю всю программу


Прикрепленные файлы
Прикрепленный файл  2MY.PAS ( 6.29 килобайт ) Кол-во скачиваний: 299

Автор: мисс_граффити 28.05.2007 20:42

Прикрепи, плз, 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 28.05.2007 20:48

Вот это "страшное место" меняется на 3 строки, потому как для того чтобы поменять местами значения записей совсем не обязательно менять местами все ее поля по отдельности... С записью оператор присваивания сработает абсолютно аналогично.

Автор: Callipso 28.05.2007 21:00

Вот архив с кодом программы и файлом Lekarstva.dat (там всего три записи,но я думаю,для примера работы сойдёт).
Большое спасибо за помощь!


Прикрепленные файлы
Прикрепленный файл  pascal_lek.rar ( 2.35 килобайт ) Кол-во скачиваний: 158

Автор: мисс_граффити 28.05.2007 21:21

По-моему, проблема в самом файле.
Запустила примитивный кусочек на этом файле:

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 28.05.2007 21:41

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

Автор: Callipso 28.05.2007 22:06

Так я же код программы приложил к предыдущим постам) Там есть процедура создания самой базы...


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 28.05.2007 22:37

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

Меня терзают смутные сомнения, что я догадался о причине... Ты каким компилятором пользуешься, расскажи?

Автор: мисс_граффити 28.05.2007 22:47

Создала новый файл.
Стало несколько лучше.
Только в процедуре сортировки не i:=0, а i:=1 нужно. ну и дальше границы циклов переставь...

Автор: Callipso 28.05.2007 23:37

Всё заработало.
Большое прибольшое спасибо за помощь!!!!!))