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

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

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

здравствуйте, помогите пожалуйста с задачей. Я ее написал, но у меня всегда идет бесконечный цикл, не могу найти ошибку. дан однонопрвленный кольцевой список целых чисел. вставить перед каждым элементом, являющемся простым числом, элемент равный количеству цифр этого простого числа.
type circle=^elem;           {однонаправленное кольцо }
      elem=record
          info:integer;
          next:circle;
          end;
  var  p,q,l:circle;    k:integer;
  procedure create(var l:circle);
  var x:integer;
  begin
  readln(x);
  if x<>0 then begin
  new(l);
  l^.info:=x;
  p:=l;
  p^.next:=nil;
  readln(x); end;
  while x<>0 do begin
  new(q);
  q^.info:=x;
  p^.next:=q;
  p:=q;
  q^.next:=l;
  readln(x); end; end;
 
FUNCTION pr(p:circle):boolean;
  var i,k:integer; l:circle;  f:boolean;
  begin
  k:=0;
  for i:=2 to p^.info div 2 do
  if p^.info mod i =0 then k:=k+1;
  if k=0 then writeln ('pr') else writeln('not pr');
 end;

procedure kol(k:integer);
var p:circle;
begin
while p^.info<>0 do begin
 if p^.info div 10 <>0 then k:=k+1;  p^.info:=p^.info div 10;
 end; end;
 
 Begin
 create(l);
 repeat
 while p<>nil do begin
 if pr(p)=true then begin
 kol(k);
 new(q);
 q^.info:=k;
 q^.next:=p^.next;
 p^.next:=q;  end;  end;
 until p=l;
 readln; end.

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

textual
Листинг программы
program test;
 
type
  circle = ^elem; {однонаправленное кольцо }
 
  elem = record
    info: integer;
    Next: circle;
  end;
 
  procedure ListAdd(var Root: circle; info: integer);
  var
    p: circle;
  begin
    new(p);
    if Root = nil then
    begin
      Root := p;
      p^.Info := info;
      p^.Next := p;
    end
    else
    begin
      p^.Info := Root^.Info;
      p^.Next := Root^.Next;
      Root^.Info := info;
      Root^.Next := p;
      Root := p;
    end;
  end;
 
  procedure ListFree(var ARoot: circle);
  var
    Temp, p: circle;
  begin
    if ARoot <> nil then
    begin
      p := ARoot;
      repeat
        Temp := p;
        p := p^.Next;
        dispose(Temp);
      until p = ARoot;
    end;
    ARoot := nil;
  end;
 
  procedure Create(var l: circle);
  var
    x: integer;
  begin
    for x := 97 to 120 do
      ListAdd(l, x);
  end;
 
  function pr(p: integer): boolean;
  var
    i: integer;
    Res: boolean;
  begin
    Res := (p > 1);
    if p > 3 then
    begin
      i := 2;
      while p div i >= i do
      begin
        Res := Res and (p mod i <> 0);
        i := i + 1;
      end;
    end;
    pr := Res;
  end;
 
  function kol(k: integer): integer;
  var
    Count: integer;
  begin
    Count := 0;
    repeat
      k := k div 10;
      Count := Count + 1;
    until k = 0;
    kol := Count;
  end;
 
  procedure Show(Root: circle);
  var
    p: circle;
  begin
    p := Root;
    Write('< ');
    if Root <> nil then
    begin
      repeat
        Write(p^.Info: 4);
        p := p^.Next;
      until p = Root;
    end;
    writeln('>');
  end;
 
var
  p, l: circle;
begin
  Create(l);
  Show(l);
  p := l;
  if p <> nil then
  begin
    repeat
      if pr(p^.info) then
        ListAdd(p, kol(p^.Info));
      p := p^.Next;
    until p = l;
  end;
  Show(l);
  ListFree(l);
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
Похожие ответы