Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > [Паскаль] Работа со списками


Автор: Jolie 21.12.2009, 23:50
Код

uses crt;
type
book=record
author:string[20];
book_name:string[20];
price:integer;
tirazh:integer;
end;
book_n=record
book_name_n:string[20];
price_n:integer;
tirazh_n:integer;
end;
pel=^dbook;
dbook=record
data:book;
next:pel;
end;
pel_n=^dbook_n;
dbook_n=record
data:book_n;
next:pel_n;
end;
procedure ramka1;
begin
writeln;
write('Author':20);
write('Book Name':20);
write('Tirazh':10);
writeln('Price':10);
end;
procedure ramka2;
begin
writeln;
write('Book name':20);
write('Tirazh':10);
writeln('Price':10);
end;
var root,e1,e2:pel; e3,root_n:pel_n;
c:char; seek_author:string[20];
i,j:integer;
begin
clrscr;
new(e1);
root:=e1;
repeat
write('author - ');
readln(e1^.data.author);
write('book name -');
readln(e1^.data.book_name);
write('price -');
readln(e1^.data.price);
write('tirazh -');
readln(e1^.data.tirazh);
write('continue (y/n)');
readln(c);
new(e1^.next);
e1:=e1^.next;
until upcase(c)='N';
e1:=root;               ramka1;
while e1<>nil do begin
write(e1^.data.author:20);
write(e1^.data.book_name:20);
write(e1^.data.tirazh:10);
writeln(e1^.data.price:10);
e1:=e1^.next;
end;
writeln('Enter Author');
readln(seek_author); e1:=root;
while e1<>nil do
if e1^.data.author=seek_author then begin
e3^.data.book_name_n:=e1^.data.book_name;
e3^.data.tirazh_n:=e1^.data.tirazh;
e3^.data.price_n:=e1^.data.tirazh;
e3:=e3^.next;
end;
e3:=root_n;   ramka2;
while e3<>nil do begin
write(e3^.data.book_name_n:20);
write(e3^.data.tirazh_n:10);
writeln(e3^.data.price_n:10);
end;
 end.

при выводе второго списка ничего не выводит по пречине того что он =нил.
хелп

Автор: volvo877 22.12.2009, 01:07
Цитата(Jolie @  21.12.2009,  22:50 Найти цитируемый пост)
при выводе второго списка ничего не выводит по пречине того что он =нил.
До туда программа даже не дойдет. Она вылетит раньше, при попытке пройти до конца по первому списку. Потому что заполняется он неправильно.

Автор: Jolie 22.12.2009, 01:17
cоздаю список с начала в конец.
просто  не добавляю сверху елементы, а наоборот как бы снизу.

список создается и выводится.. только что проверка подтвердила

Автор: volvo877 22.12.2009, 12:18
Цитата(Jolie @  22.12.2009,  00:17 Найти цитируемый пост)
список создается и выводится.. только что проверка подтвердила
Мне тоже подтвердила:
Цитата
author -a
book name -b
price -2
tirazh -3
continue (y/n)n

              Author           Book Name    Tirazh     Price
                   a                   b         3         2
                                                       ∩╛¡▐am Filesב ♀☺,ß♣     s        -1        -1
Exitcode = 216
Runtime error 216 at $0040759B
  $0040759B
  $00408710
Если я говорю, что список создается некорректно, значит, он создается некорректно. Если Турбо-Паскаль этого не видит и не предупреждает тебя - это чья проблема? Моя? Ну, продолжай считать, что список создается корректно, и ищи ошибку...

Автор: Jolie 28.12.2009, 16:36
Код

uses crt;
type
node_ptr=^book;
book=record
author:string[20];
book_name:string[20];
tirazh:integer;
price:integer;
next:node_ptr;
end;
node_ptr_n=^book_n;
book_n=record
Book_name:string[20];
tirazh:integer;
price:integer;
next:node_ptr_n;
end;
procedure ramka2;
begin
write('Book Name':20);
write('Tirazh':10);
writeln('Price':10);
end;
procedure ramka1;
begin
write('Author':20);
write('Book Name':20);
write('Tirazh':10);
writeln('Price':10);
end;
procedure create(var root:node_ptr;n:word);
var temp:node_ptr;
k:word;
begin
root:=nil;
for k:=0 to n-1 do
begin
temp:=root;
new(root);
with root^ do
begin
write('Enter author - ');
readln(author);
write('Enter Book Name - ');
readln(book_name);
write('Enter tirazh - ');
readln(tirazh);
write('Enter price - ');
readln(price);
next:=temp;
end;
end;
end;
procedure vivod(a:node_ptr);
var temp:node_ptr;
begin
temp:=a;
while temp<>nil do begin
write(temp^.author:20);
write(temp^.book_name:20);
write(temp^.tirazh:10);
writeln(temp^.price:10);
temp:=temp^.next;
end;
end;
procedure vivod2(a:node_ptr_n);
var temp:node_ptr_n;
begin
temp:=a;
while temp<>nil do begin
write(temp^.book_name:20);
write(temp^.tirazh:10);
writeln(temp^.price:10);
temp:=temp^.next;
end;
end;
procedure newmas(var a:node_ptr_n; b:node_ptr);
var root:node_ptr_n; temp:node_ptr;
s:string[20];
begin
write('Enter Seeking Author - ');
readln(s);
temp:=b;  a:=nil;
while temp<>nil do begin
if temp^.author=s then
begin
root:=a; new(a);
with a^ do begin
book_name:=temp^.book_name;
tirazh:=temp^.tirazh;
price:=temp^.price;
next:=root; temp:=temp^.next;
end; end; end; end;
procedure sort(var a:node_ptr_n);
var temp,p,q,m:node_ptr_n;s:string;
begin
p:=a;
while p<> nil do begin
q:=p; m:=q;
while q<>nil do begin
if m^.book_name<q^.book_name then m:=q; q:=q^.next; end;
s:=p^.book_name; p^.book_name:=m^.book_name; m^.book_name:=s;
p:=p^.next;
end;
end;
var
el:node_ptr;f:word; el2:node_ptr_n;
begin
clrscr;
writeln('Enter kol-vo');
readln(f);
create(el,f);writeln;ramka1;
vivod(el);writeln; newmas(el2,el);ramka2; vivod2(el2);
sort(el2);writeln; vivod2(el2);
end.



помоги разобратся почему ошибка выскакивает.
почитала литературу, но все равно чтото не выходит
сартировку не дописала, но ошибка то вылетает раньше(

Автор: Jolie 28.12.2009, 17:46
все работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)