Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

docck



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
 
uses crt;
type pitem=^item;
       item=record
       data:integer;
       next:pitem;
      end;
 
var A,B,C,headA,headB,headC:pitem;
     i,n1,n2,buf:integer;
     vybor:char;
 
{Вычисление числа элементов списка}
function Kol(head:pitem):integer;
var p:pitem;
     k:integer;
     fl:boolean;
begin
  k:=0;
  fl:=false;
  if head<>nil then  {esli spisok ne pustoi}
   begin
    p:=head;
    while p<>nil do {prohodim ot nachala i do konca}
     begin
      inc(k);       {i uvelichibaem schetchik}
      p:=p^.next;
      if p=head then
      if fl then break  {esli spisok kolcevoi zavershaem cikl}
      else fl:=true;
     end;
   end;
  Kol:=k
end;
 
{Добавление элемента в список: info - chto nuzhno dobavit; poz - na kakuiu poziciu; head - nachalo spiska, v kotoryi vstavliaem}
procedure Add(info,poz:integer; var head:pitem);
var p,work:pitem;
     k:integer;
begin
 
  if (poz<=0) or (poz>Kol(head)+1) then
   begin
    writeln('Element NE mozhet byt vstavlen na etu poziciu!');
    readkey;
    exit;
   end;
  {esli pozicia korrektna}
  new(work);
  work^.data:=info;
  if poz=1 then {esli pervaia}
   begin
    work^.next:=head;
    head:=work;        {zapominaem dobavlennyi element nachalom}
   end
  else         {esli ne pervaia}
   begin
    p:=head;
    for k:=2 to poz-1 do p:=p^.next;  {doshli do nuzhnoi pozicii}
    work^.next:=p^.next;
    p^.next:=work;                    {vstavili ssylku na element}
   end;
end;
 
{ Удаление n-го элемента из списка }
procedure Delete(poz:integer; var head:pitem);
 var work,p:pitem;
     k:integer;
begin
 
  if (poz<=0) or (poz>Kol(head)) then
   begin
    writeln('Na etoi pozicii NET elementa!');
    readkey;
    exit;
   end;
  {esli pozicia korrektna}
 
  if poz=1 then  {esli pervaia}
   begin
    work:=head^.next;
    dispose(head);    {udalili nachalo}
    head:=work;       {zapomnili nachalom sleduiuschii}
   end
  else
   begin
    work:=head;
    for k:=2 to poz-1 do work:=work^.next;  {doshli do pozicii}
    p:=work^.next;
    work^.next:=p^.next;                    {iskluchili ssylku}
    dispose(p);                             {osvobodili pamiat}
   end;
end;
 
{ Создание копии списка }
function Copy(head:pitem):pitem;
var p0,p:pitem;
begin
  p0:=head;
  while p0<>nil do     {prohodim ot nachalo do konca}
   begin
    p:=p0;             {i kopiruem elementy}
    p0:=p0^.next;
   end;
  Copy:=p;
end;
 
{ Сцепление двух списков }
function Concat(head1,head2:pitem):pitem;
var p:pitem;
     ch:char;
begin
  ch:='_';
  if head1=head2 then
   begin
    write('Sceplenie privedet k sozdaniu kolcevogo spiska! Prodolzhit? [y/n] ');
    ch:=upcase(readkey);
    writeln;
   end;
 
  if (head1<>head2) or (ch<>'N') then
   begin
    p:=head1;
    while p^.next<>nil do p:=p^.next; {dohodim do konca pervogo spiska}
    p^.next:=head2;                   {i delaem ssylku, chtoby etot element
                    ukazyval na nachalo vtorogo}
    Concat:=p;
    writeln('Sceplenie spiskov proizvedenno.');
   end
  else
   begin
    Concat:=nil;
    writeln('Sceplenie spiskov NE proizvedenno!');
   end;
end;
 
{ Инвертирование списка, при котором первый элемент становится последним }
procedure Invert(var head:pitem);
var p,p1,p2,head2:pitem;
     k,j,m:integer;
begin
  k:=Kol(head);
  p:=head;
  j:=0;
  head2:=nil;
  while p<>nil do {prohodim ot nachala do konca}
   begin
    p1:=head;
    for m:=1 to k-1 do p1:=p1^.next; {berem element s konca}
    inc(j);
    Add(p1^.data,j,head2);           {i vstavliem ego v nachalo novogo spiska }
    p:=p^.next;
    if k>1 then dec(k); {elemnty posle k obrabotanny}
   end;
  head:=head2;
  writeln('Invertirovanie proizvedenno.');
end;
 
{Создание списка, представляющего собой объединение (по операции ИЛИ) элементов двух списков}
function A_OR_B(head1,head2:pitem):pitem;
var p1,p2:pitem;
     fl:boolean;
begin
  p1:=head2;
  {posledovatelno sravnivaem elementy pervogo spiska
  s elementami vtorogo}
  while p1<>nil do
   begin
    p2:=head1;
    fl:=true;
    while p2<>nil do
     begin
      if p1^.data=p2^.data then
       begin
        fl:=false;
        break;
       end
      else p2:=p2^.next;
     end;
    if fl=true then {esli vo vtorom spiske est element, kotorogo net v pervom spiske}
     begin
      Add(p1^.data,Kol(head1)+1,head1);  {dobavliem ego v pervyi spisok}
     end;
    p1:=p1^.next;
   end;
  A_OR_B:=head1;
  writeln('Obiedenenie proizvedeno.');
end;
 
{Размещение элементов списка в возрастающем порядке}
function Sort(head:pitem):pitem;
var newh,max,prev,pmax,cur:pitem;
begin
  newh:=nil;
  while head<>nil do
   begin
    max:=head;
    prev:=head;
    cur:=head^.next;
    while cur<>nil do
     begin
      if cur^.data>max^.data then
       begin
        max:=cur;
        pmax:=prev;
       end;
      prev:=cur;
      cur:=cur^.next;
     end;
    if max=head then head:=head^.next
    else pmax^.next:=max^.next;
    max^.next:=newh; newh:=max;
   end;
   Sort:=newh;
   writeln('Sortirovka proizvedenna.');
end;
 
{pechat elementov spiska}
procedure WriteList(head:pitem);
var p:pitem;
     k:integer;
begin
  p:=head;
  k:=0;
  while (p<>nil) and (k<kol(head)) do
   begin
    write(p^.data,' ');
    p:=p^.next;
    inc(k);
    if keypressed then break;
   end;
end;
 
{OSNOVNAIA PROGRAMMA}
begin
  {do nachala vseh operacii vse spiski pustye}
  HeadA:=nil;
  HeadB:=nil;
  HeadC:=nil;
 
  clrscr;
  write('Zadaite kol-vo elementov pervogo spiska: ');
  readln(n1);
  writeln('Vvodite elementy: ');
  for i:=1 to n1 do
   begin
    write('-> ');
    readln(buf);
    Add(buf,i,HeadA);{zapolnili pervyi spisok}
   end;
  write('Spisok: ');
  WriteList(HeadA);  {vyveli ego}
  writeln;
 
  writeln;
  write('Hotite dobavit element na proizvolnuiu poziciu? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    write('Vvedite element: ');
    readln(buf);
    write('Vvedite poziciu: ');
    readln(n1);
    Add(buf,n1,HeadA); {dobavliem element}
    write('Spisok: ');
    WriteList(HeadA);  {vyvodim izemennenyi spisok}
    writeln;
    writeln('Kol-vo elementov: ',Kol(HeadA)); {vyvodim kol-vo elementov spiska}
   end;
 
  writeln;
  write('Hotite udalit element na proizvolnoi poziciu? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    write('Vvedite poziciu: ');
    readln(n1);
    Delete(n1,HeadA); {udaliaem element}
    write('Spisok: ');
    WriteList(HeadA); {vyvodim izemennenyi spisok}
    writeln;
    writeln('Kol-vo elementov: ',Kol(HeadA)); {vyvodim kol-vo elementov spiska}
    readln;
   end;
 
  {analogichno s pervym zapolniem vtoroi spisok}
  clrscr;
  write('Zadaite kol-vo elementov vtorogo spiska: ');
  readln(n2);
  writeln('Vvodite elementy: ');
  for i:=1 to n2 do
   begin
    write('-> ');
    readln(buf);
    Add(buf,i,HeadB);
   end;
  write('Spisok: ');
  WriteList(HeadB);
  writeln;
 
  writeln;
  write('Hotite dobavit element na proizvolnuiu poziciu? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    write('Vvedite element: ');
    readln(buf);
    write('Vvedite poziciu: ');
    readln(n1);
    Add(buf,n1,HeadB);
    write('Spisok: ');
    WriteList(HeadB);
    writeln;
    writeln('Kol-vo elementov: ',Kol(HeadB));
   end;
 
  writeln;
  write('Hotite udalit element na proizvolnoi poziciu? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    write('Vvedite poziciu: ');
    readln(n1);
    Delete(n1,HeadB);
    write('Spisok: ');
    WriteList(HeadB);
    writeln;
    writeln('Kol-vo elementov: ',Kol(HeadB));
    readln;
   end;
  {konec zapolnenia vtorogo spiska}
 
  {vyvodim spiski; predlagaem objedenit}
  repeat
   clrscr;
   write('Spisok A: ');
   WriteList(HeadA);
   writeln;
   write('Spisok B: ');
   WriteList(HeadB);
   writeln;
   writeln;
   writeln('Vyberite variant obiedenenia spiskov:');
   writeln('1 - prostoe scepleneie');
   writeln('2 - obiedenenie po operacii "or"');
   write('-> ');
   vybor:=readkey;
   write(vybor);
  until (vybor='1') or (vybor='2') or (vybor=#27);
  writeln;
  writeln;
 
  case vybor of
   '1':begin
       C:=Concat(HeadA,HeadB); {scepliem spiski}
       write('Spisok C: ');
       WriteList(HeadA);    {vyvodim poluchennyi}
       writeln;
       writeln('Kol-vo elementov: ',Kol(HeadA));
       readln;
      end;
 
   '2':begin
       C:=A_OR_B(HeadA,HeadB); {objedeniaem po "ili" (or)}
       write('Spisok C: ');
       WriteList(C);           {vyvodim poluchennyi}
       writeln;
       writeln('Kol-vo elementov: ',Kol(C));
       readln;
      end;
 
   #27:halt;
  end;
 
  write('Hotite uporiadochit spisok? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    C:=Sort(HeadA); {sortiruem spisok}
    write('Spisok: ');
    WriteList(C);   {vyvodim ego}
    readln;
   end;
 
  writeln;
  write('Hotite invertirovat spisok? [y/n] ');
  vybor:=upcase(readkey);
  writeln;
  if vybor='Y' then
   begin
    Invert(C);    {invertiruem spisok}
    write('Spisok: ');
    WriteList(C); {vyvodim ego}
   end;
 
  writeln;
  writeln;
  write('Press any key to EXIT... ');
  readkey;
end.
 
uses crt;
type pitem=^item;
       item=record
       data:integer;
       next:pitem;
      end;
 
var A,B,C,headA,headB,headC:pitem;
     i,el,kol_poz:integer;
     vybor:char;
     fl:boolean;
 
{Добавление в конец списка}
procedure Add(info:integer; var head:pitem);
var p,work:pitem;
begin
  new(work);
  work^.data:=info;
  work^.next:=nil;   {sformirovali neobhodimyi element}
  if head=nil then head:=work {esli spisok pustoi zapomili ego kak nachalo}
  else
   begin   {inache}
    p:=head;
    while p^.next<>nil do p:=p^.next; {prohodim do konca spiska}
    p^.next:=work;                    {i vstavliem ssylku na element}
   end;
end;
 
{Освобождение памяти}
procedure Free(var head:pitem);
var p,p0:pitem;
begin
  p:=head;
  while p<>nil do
   begin
    p0:=p^.next;
    Dispose(p);
    p:=p0;
   end;
end;
 
{udalenie poslednego elementa iz spiska nachinaiuschegosia s head}
procedure Delete(var head:pitem);
 var p:pitem;
begin
  if head<>nil then {esli spisok ne pustoi}
   begin
    p:=head;
    while p^.next^.next<>nil do p:=p^.next; {prohodim do predposlednego}
    dispose(p^.next);                       {udaliem posledlii}
    p^.next:=nil;                           {udaliem ssylku}
   end;
end;
 
{vozvraschaet summu elementov spiska nachinauschegosia s head}
function Sum(head:pitem):integer;
var p:pitem;
     all:integer;
begin
  p:=head;
  all:=0;
  while p<>nil do
   begin
    all:=all+p^.data;
    p:=p^.next;
   end;
  Sum:=all;
end;
 
{udalenie kazhdogo vtorogo elementa}
procedure DelMod2(head:pitem);
var p,p0,p1:pitem;
     k,dx:integer;
begin
  p:=head;
  k:=0;
  dx:=0;
  while p<>nil do   {prohodim po spisku}
   begin
    inc(k);
    if ((k-dx) mod 2 <> 0) and (p^.next<>nil) then {esli sleduishii element nuzhnyi}
     begin
      p0:=p^.next;
      p1:=p0^.next; {zapomnili ssylki}
      Dispose(p0);  {ubrali element}
      p^.next:=p1;  {iskluchili ssylku}
      if dx=0 then dx:=1
      else dx:=0;
     end;
    p:=p^.next;
   end;
end;
 
{slianie po operacii "i" vozvraschaet ukazatel na nachalo objedenennogo spiska}
function AandB(head1,head2:pitem):pitem;
function in_(data:integer; head_:pitem):boolean;
{vhodit li element v spisok}
  var p:pitem;
   begin
    p:=head_;
    while p<>nil do
    if p^.data<>data then p:=p^.next
    else
     begin
      in_:=true;
      exit;
     end;
    in_:=false;
   end;
var p1,p2,Rez:pitem;
begin
  Rez:=nil;
  p1:=head1;
  while p1<>nil do
   begin                 {sravnivaem elementy spiskov}
    p2:=head2;
    while p2<>nil do
     begin
      if p1^.data=p2^.data then  {ischem ravnye elementy}
       begin                     {esli nashli}
        if not in_(p1^.data,Rez) then Add(p1^.data,Rez); {esli element esche ne vhodit v spisok
                    to dobavliem ego}
        break;
       end;
      p2:=p2^.next;
     end;
    p1:=p1^.next;
   end;
  AandB:=Rez;
end;
 
{vyvod elementov spiska}
procedure WriteSpisok(head:pitem);
var p:pitem;
begin
  p:=head;
  while p<>nil do
   begin
    write(p^.data,' ');
    p:=p^.next;
   end;
end;
 
{peremeshenie elementa data na n pozicii vpered v spiske, nachinaiuschemsia s head}
procedure Move(data,n:integer; var head:pitem);
var p0,p,p1,p2:pitem;
     j,k:integer;
begin
  if n<=0 then exit;
  k:=0;
  p:=head;
  p0:=nil;
  p1:=head^.next;
  while p<>nil do  {prohodim po spisku}
   begin
    inc(k);
    if p^.data=data then {nashli nuzhnyi element}
     begin
      if k=1 then head:=p1;
      p2:=p;
      p:=p0;               {iskluchili element}
      p^.next:=p1;
      for j:=k to k+n-1 do {doshli do nuzhnoi pozicii}
       begin
        p:=p^.next;
        if p^.next=nil then break;
       end;
      p2^.next:=p^.next;
      p^.next:=p2;        {vstavili element na poziciu}
      exit;
     end;
    p0:=p;
    p:=p^.next;
    p1:=p^.next;
   end;
end;
 
function APlusBSort(head1,head2:pitem):pitem;
{prinimaem spiski i sortiruem objedeniaem v odin i sortiruem ego}
function Sort(head:pitem):pitem;
  var newh,max,prev,pmax,cur:pitem;
   begin
    newh:=nil;
    while head<>nil do
     begin
      max:=head;
      prev:=head;
      cur:=head^.next;
      while cur<>nil do
       begin
        if cur^.data>max^.data then
         begin
          max:=cur;
          pmax:=prev;
         end;
        prev:=cur;
        cur:=cur^.next;
       end;
      if max=head then head:=head^.next
      else pmax^.next:=max^.next;
      max^.next:=newh; newh:=max;
     end;
    Sort:=newh;
   end;
var rez,p:pitem;
begin
  APlusBSort:=nil;
  if head1<>head2 then
   begin
    rez:=nil;
    p:=head1;
    while p^.next<>nil do
     begin
      Add(p^.data,rez);
      p:=p^.next;
     end;
    p:=head2;
    while p^.next<>nil do
     begin
      Add(p^.data,rez);
      p:=p^.next;
     end;
    APlusBSort:=Sort(Rez);
   end;
end;
 
procedure Out;
{objedenennyi vyvod}
begin
  write(' A: ');
  WriteSpisok(HeadA);
  writeln;
  write(' B: ');
  WriteSpisok(HeadB);
  writeln;
end;
 
begin
  TextBackGround(Lightblue);
  clrscr;
  TextColor(white);
  randomize;
  HeadA:=nil;
  for i:=1 to 15 do Add(random(20)-10,HeadA);
  HeadB:=nil;
  for i:=1 to 15 do Add(random(20)-10,HeadB);
  writeln(' Sozdanno 2 spiska');
  Out;
  write(' Press any key to Continue...');
  readkey;
  fl:=false;
  repeat
   repeat
    clrscr;
    writeln(' 1 - Summa elementov');
    writeln(' 2 - Udalenie poslednego elementa');
    writeln(' 3 - Udalenie kazhdogo 2-ogo elementa');
    writeln(' 4 - Peremeschenie elementa na N pozicii vpered');
    writeln(' 5 - Obschie elementy spiskov');
    writeln(' 6 - Objedenenie spiskov v odin uporiadochennyi');
    writeln(' ESC - EXIT');
    write(' -> ');
    vybor:=readkey;
    if ((vybor in ['1'..'6'])=false) and (vybor<>#27) then
     begin
      textcolor(red);
      write('Nepravilnyi vybor!');
      readkey;
      textcolor(white);
     end
    else if vybor<>#27 then write(vybor);
   until (vybor in ['1'..'6']) or (vybor=#27);
   writeln;
   case vybor of
    '1':begin
         Out;
         writeln(' Summa A=',Sum(HeadA));
         writeln(' Summa B=',Sum(HeadB));
        end;
    '2':begin
         writeln(' Do udalenia: ');
         Out;
         Delete(HeadA);
         Delete(HeadB);
         writeln(' Posle udalenia: ');
         Out;
        end;
    '3':begin
         writeln(' Do udalenia: ');
         Out;
         DelMod2(HeadA);
         DelMod2(HeadB);
         writeln(' Posle udalenia: ');
         Out;
        end;
    '4':begin
         writeln(' Do peremeschenia: ');
         Out;
         write(' Vvedite element: ');
         readln(el);
         write(' Kol-vo pozicii: ');
         readln(kol_poz);
         Move(el,kol_poz,HeadA);
         Move(el,kol_poz,HeadB);
         writeln(' Posle peremeschenia: ');
         Out;
        end;
    '5':begin
         writeln(' Spiski: ');
         Out;
         HeadC:=nil;
         HeadC:=AandB(HeadA,HeadB);
         write(' Obschie elementy: ');
         WriteSpisok(HeadC);
         writeln;
         fl:=true;
        end;
    '6':begin
         writeln(' Spiski: ');
         Out;
         writeln(' Poluchennyi spisok: ');
         write(' ');
         HeadC:=nil;
         HeadC:=APlusBSort(HeadA,HeadB);
         WriteSpisok(HeadC);
         writeln;
         fl:=true;
        end;
   end;
   if vybor<>#27 then
    begin
     write(' Press any key to Continue... ');
     readkey;
    end;
  until vybor=#27;
  Free(HeadA);
  Free(HeadB);
  if fl then Free(C);
end.
 
 

Всего записей: 613 | Зарегистр. 06-01-2004 | Отправлено: 19:02 03-06-2010 | Исправлено: docck, 12:55 08-06-2010
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи на Pascal/Object Pascal/Free Pascal (Delphi/Lazarus)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru