Кольцевой список, программа входит в бесконечный цикл - Free Pascal

Узнай цену своей работы

Формулировка задачи:

здравствуйте, помогите пожалуйста с задачей. Я ее написал, но у меня всегда идет бесконечный цикл, не могу найти ошибку. дан однонопрвленный кольцевой список целых чисел. вставить перед каждым элементом, являющемся простым числом, элемент равный количеству цифр этого простого числа.
Листинг программы
  1. type circle=^elem; {однонаправленное кольцо }
  2. elem=record
  3. info:integer;
  4. next:circle;
  5. end;
  6. var p,q,l:circle; k:integer;
  7. procedure create(var l:circle);
  8. var x:integer;
  9. begin
  10. readln(x);
  11. if x<>0 then begin
  12. new(l);
  13. l^.info:=x;
  14. p:=l;
  15. p^.next:=nil;
  16. readln(x); end;
  17. while x<>0 do begin
  18. new(q);
  19. q^.info:=x;
  20. p^.next:=q;
  21. p:=q;
  22. q^.next:=l;
  23. readln(x); end; end;
  24. FUNCTION pr(p:circle):boolean;
  25. var i,k:integer; l:circle; f:boolean;
  26. begin
  27. k:=0;
  28. for i:=2 to p^.info div 2 do
  29. if p^.info mod i =0 then k:=k+1;
  30. if k=0 then writeln ('pr') else writeln('not pr');
  31. end;
  32.  
  33. procedure kol(k:integer);
  34. var p:circle;
  35. begin
  36. while p^.info<>0 do begin
  37. if p^.info div 10 <>0 then k:=k+1; p^.info:=p^.info div 10;
  38. end; end;
  39. Begin
  40. create(l);
  41. repeat
  42. while p<>nil do begin
  43. if pr(p)=true then begin
  44. kol(k);
  45. new(q);
  46. q^.info:=k;
  47. q^.next:=p^.next;
  48. p^.next:=q; end; end;
  49. until p=l;
  50. readln; end.

Решение задачи: «Кольцевой список, программа входит в бесконечный цикл»

textual
Листинг программы
  1. program test;
  2.  
  3. type
  4.   circle = ^elem; {однонаправленное кольцо }
  5.  
  6.   elem = record
  7.     info: integer;
  8.     Next: circle;
  9.   end;
  10.  
  11.   procedure ListAdd(var Root: circle; info: integer);
  12.   var
  13.     p: circle;
  14.   begin
  15.     new(p);
  16.     if Root = nil then
  17.     begin
  18.       Root := p;
  19.       p^.Info := info;
  20.       p^.Next := p;
  21.     end
  22.     else
  23.     begin
  24.       p^.Info := Root^.Info;
  25.       p^.Next := Root^.Next;
  26.       Root^.Info := info;
  27.       Root^.Next := p;
  28.       Root := p;
  29.     end;
  30.   end;
  31.  
  32.   procedure ListFree(var ARoot: circle);
  33.   var
  34.     Temp, p: circle;
  35.   begin
  36.     if ARoot <> nil then
  37.     begin
  38.       p := ARoot;
  39.       repeat
  40.         Temp := p;
  41.         p := p^.Next;
  42.         dispose(Temp);
  43.       until p = ARoot;
  44.     end;
  45.     ARoot := nil;
  46.   end;
  47.  
  48.   procedure Create(var l: circle);
  49.   var
  50.     x: integer;
  51.   begin
  52.     for x := 97 to 120 do
  53.       ListAdd(l, x);
  54.   end;
  55.  
  56.   function pr(p: integer): boolean;
  57.   var
  58.     i: integer;
  59.     Res: boolean;
  60.   begin
  61.     Res := (p > 1);
  62.     if p > 3 then
  63.     begin
  64.       i := 2;
  65.       while p div i >= i do
  66.       begin
  67.         Res := Res and (p mod i <> 0);
  68.         i := i + 1;
  69.       end;
  70.     end;
  71.     pr := Res;
  72.   end;
  73.  
  74.   function kol(k: integer): integer;
  75.   var
  76.     Count: integer;
  77.   begin
  78.     Count := 0;
  79.     repeat
  80.       k := k div 10;
  81.       Count := Count + 1;
  82.     until k = 0;
  83.     kol := Count;
  84.   end;
  85.  
  86.   procedure Show(Root: circle);
  87.   var
  88.     p: circle;
  89.   begin
  90.     p := Root;
  91.     Write('< ');
  92.     if Root <> nil then
  93.     begin
  94.       repeat
  95.         Write(p^.Info: 4);
  96.         p := p^.Next;
  97.       until p = Root;
  98.     end;
  99.     writeln('>');
  100.   end;
  101.  
  102. var
  103.   p, l: circle;
  104. begin
  105.   Create(l);
  106.   Show(l);
  107.   p := l;
  108.   if p <> nil then
  109.   begin
  110.     repeat
  111.       if pr(p^.info) then
  112.         ListAdd(p, kol(p^.Info));
  113.       p := p^.Next;
  114.     until p = l;
  115.   end;
  116.   Show(l);
  117.   ListFree(l);
  118. end.

Объяснение кода листинга программы

  1. Объявлены типы данных:
    • circle = ^elem; (однонаправленное кольцо)
    • elem = record info: integer; Next: circle; end;
  2. Объявлены процедуры:
    • ListAdd(var Root: circle; info: integer);
    • ListFree(var ARoot: circle);
    • Create(var l: circle);
    • pr(p: integer): boolean;
    • kol(k: integer): integer;
    • Show(Root: circle);
  3. В процедуре Create создается список из 24 элементов (от 97 до 120), каждый из которых добавляется в список с помощью процедуры ListAdd.
  4. В функции pr проверяется, является ли число простым.
  5. В функции kol число разбивается на цифры и подсчитывается их количество.
  6. В процедуре Show выводится информация о каждом элементе списка.
  7. В основном блоке кода создается список, выводится его содержимое, затем в цикле добавляются новые элементы в список, пока не будет достигнуто условие цикла.
  8. После окончания цикла выводится содержимое списка, затем он освобождается с помощью процедуры ListFree.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы