Кольцевой список, программа входит в бесконечный цикл - 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.
Объяснение кода листинга программы
- Объявлены типы данных:
- circle = ^elem; (однонаправленное кольцо)
- elem = record info: integer; Next: circle; end;
- Объявлены процедуры:
- 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);
- В процедуре Create создается список из 24 элементов (от 97 до 120), каждый из которых добавляется в список с помощью процедуры ListAdd.
- В функции pr проверяется, является ли число простым.
- В функции kol число разбивается на цифры и подсчитывается их количество.
- В процедуре Show выводится информация о каждом элементе списка.
- В основном блоке кода создается список, выводится его содержимое, затем в цикле добавляются новые элементы в список, пока не будет достигнуто условие цикла.
- После окончания цикла выводится содержимое списка, затем он освобождается с помощью процедуры ListFree.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д