Помощь - Поиск - Пользователи - Календарь
Полная версия: Связные списки Help
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sega
Доброго времени суток.

Описание программы: База данных, в неё заносится следующая информация:
- автор книги
- название книги
- цена книги

Возможные действия с базой данных:
- создание списка
- добавление в список
- нахождение по цене
- удаление элемента по номеру

Вывод БД происходит в таблице по 4 элемента на странице (экране)

Пару слов про переменные:
- book – является основным массивом (в него всё записывается)
- opis – массив, в который записываются книги с одинаковой ценой
- d:mas – массив, содержащий номера элементов из главного массива (book)

program laba3;
uses crt;
type
    mas=array [1..20] of integer;
    zap=record
                FIO:string[15];
                name:string[15];
                cena:real;
    end;
    spisok=array [1..16] of zap;
    ptrspisok=^spisok;
    procname=procedure (n:integer; opis:ptrspisok);
var
   book,opis:ptrspisok;
   j,n,k:integer;
   d:mas;
{$F+}
procedure sozd(var n:integer;  var book:ptrspisok);
var
   i:integer;
begin
     clrscr;
     if book<>nil then begin
        writeln('spisok uge sozdan');
        writeln('dla prodolgenia nagmi Enter');
        readln;
        exit;
     end;
     writeln('vvedite kolichestvo knig: ');
     readln(n);
     clrscr;
     new(book);
     for i:=1 to n do
         with book^[i] do begin
              writeln ('nomer : ',i);
              writeln('vvedite FIO: ');
              readln(FIO);
              writeln('vvedite name: ');
              readln(name);
              writeln ('vvedite cenu: ');
              readln(cena);
              clrscr;
         end;

end;
procedure add( var book:ptrspisok; var n:integer );
var
   k,i:integer;
begin
     clrscr;
     if book=nil then begin
                   writeln('spisok ne sozdan');
                   writeln('dla prodolgenia nagmi Enter');
                   readln;
                   exit;
            end;
     writeln('vvedite kolichesrvo vvodimih knig: ');
     readln(k);
     clrscr;
     for i:=n+1 to n+k do
         with book^[i] do begin
              writeln ('nomer : ',i);
              writeln('vvedite FIO: ');
              readln(FIO);
              writeln('vvedite name: ');
              readln(name);
              writeln ('vvedite cenu: ');
              readln(cena);
              clrscr;
         end;
     n:=n+k;
end;
procedure vivod(n:integer; book:ptrspisok);
var
   i,a,b:integer;
begin
     clrscr;
     if n<3 then b:=n
     else b:=3;
     a:=1;
     while a<=n do begin
           clrscr;
           writeln(b,' ','iz ',n,' ');
           writeln(& #39;ЪДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДД
ДДДДДДВДДДДДДДї');
           writeln('і     і        FIO       і        name      і  cena і');
           writeln(& #39;ГДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДД
ДДДДДДЕДДДДДДДґ');
           for i:=a to b do
               with book^[i] do
               writeln('і  ', i ,'  і ',FIO:15, '  і ',name:15,'  і ',cena:6:2,'і');
           writeln(& #39;АДДДДДБДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДД
ДДДДДДБДДДДДДДЩ');
           writeln;
           a:=b+1;
           if (n-B)<3 then
                b:=n
           else
                b:=b+3;
           readln;
     end;
end;
procedure poisk(book:ptrspisok; n:integer; var opis:ptrspisok; var j:integer; var d:mas);
var
   c:real; i:integer;
begin
     clrscr;
     writeln('vvedite cenu: ');
     readln(c);
     j:=0;
     new(opis);
     for i:=1 to n do
         if c=book^[i].cena then begin
            j:=j+1;
            d[j]:=i;
            opis^[j]:=book^[i];
         end;
end;
procedure delet(var j:integer; vivod:procname;  opis:ptrspisok;  var d:mas; var k,n:integer; var book:ptrspisok);
var
   b,i,c:integer; l:char; m:ptrspisok;
begin
     k:=0;
     repeat
           repeat
                 repeat
                       clrscr;
                       vivod(j,opis);
                       writeln('budete udaliat element (y/n) : ');
                       readln(l);
                       if (l<>'y') and (l<>'n') then begin
                          writeln ('otvet nepravelnei');
                          writeln('poprobuite ehe raz');
                          readln;
                       end;
                 until (l='y') or (l='n');
                 if l='n' then exit;
                 repeat
                       clrscr;
                       vivod(j,opis);
                       writeln('vvedite nomer udaliaemoi knigi: ');
                       readln(B);
                       if (b>j) or (b<1) then begin
                          writeln('takogo nomera v spiske net');
                          writeln('poprobuite v sleduushii raz');
                          readln;
                       end;
                 until (b<=j) and (b>=1);
                 repeat
                       clrscr;
                       writeln(& #39;ЪДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДД
ДДДДДДВДДДДДДДї');
                       writeln('і     і        FIO       і        name      і  cena і');
                       writeln(& #39;ГДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДД
ДДДДДДЕДДДДДДДґ');
                       with opis^[b] do
                            writeln('і  ', b ,'  і ',FIO:15, '  і ',name:15,'  і ',cena:6:2,'і');
                       writeln(& #39;АДДДДДБДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДД
ДДДДДДБДДДДДДДЩ');
                       writeln;
                       writeln('vi tochno hotite udalit etot element (y/n)');
                       readln(l);
                 until (l='y') or (l='n');
           until l='y';
           for i:=1 to j do begin
               if i=b then begin
                  n:=n-1;
                  j:=j-1;
                  for c:=d[i] to n do
                      book^[c]:=book^[c+1];
                  for i:=b to j do begin
                      opis^[i]:=opis^[i+1];
                      d[i]:=d[i+1]-1;
                  end;
               end;
           end;
           clrscr;
           writeln ('element udalen');
           readln;
     until l='n'
end;
procedure menu;
var
   i:integer; l,y,ch:char;
procedure men (var i:integer);
begin
     writeln('spisok knig');
     writeln('1-sozdati spisok');
     writeln('2-dobavit knigu');
     writeln('3-prosmotret spisok');
     writeln('4-poisk po cene i udalenie');
     writeln('0-vihod');
     writeln;
     write(': ');
     readln(i);
end;
begin
     repeat
           clrscr;
           men(i);
           case i of
                1:sozd(n,book);
                2:add(book,n);
                3:vivod(n,book);
                4: begin
                        poisk(book,n,opis,j,d);
                        delet(j,vivod,opis,d,k,n,book);
                   end;
                0:halt;
           else begin
                writeln ('net takoi komandi');
                writeln ('viberete druguu');
                end;
           end;
           readln;
     until i=0;
end;
{F-}
begin
     clrscr;
     menu;
     dispose(book);
     dispose(opis);
end.




Проблема:
Необходимо программу переделать с использованием связного списка
(но не через object)

С теми же операциями над базой данной:
- создание списка
- добавление в список
- нахождение по цене
- удаление элемента по номеру

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