IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Кольцевой список и простые числа, (разделено)
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Не знаю как лучше, создать отдельную тему или написать в эту....
Отдельную тему я бы назвал "Кольцевой список и простые числа"
Есть задачка на динамическую память... Необходимо составить программу, которая каждый элемент кольцевого однонаправленного списка с заглавным элементом увеличивает на 3, а затем вычеркивает те из них, которые будут простыми.
Так вот проблема в поиске простых чисел (удаление пока не трогаю, хотя оно тоже криво работает, выдает ошибку "ссылка на не существующий указатель). До 14и она работает нормально, а с 15и начинается дребедень:
1. 15 - простое, дальше правильно, 21 - опять считает простым, потом 25, потом 35, дальше не проверял...
2. Если в списке присутствует 1 (кроме случая, когда она последняя), то система проверки на простые числа вообще не работает.
Вот код:

program kos;

{$APPTYPE CONSOLE}

uses
SysUtils;

Type pe=^el; {Указатель на элемент списковой структуры}
el=record {Элемент списка}
inf:integer; {Информационное поле типа integer}
next:pe {Указатель на следующий элемент}
end;


//функция вывода на экран списка P
function vivod(p:pe):boolean;
var lastp:pe;
begin
lastp := p^.next;
while lastp <> p do
begin
Write(lastp^.inf, ' ');
lastp := lastp^.next;
end;
WriteLn(' ]');
vivod := true;
end;


Var
temp, lastp, p: pe;
i, n, k: integer;



Begin

//контроль значения количества элементов
{$I-}
Write('Vvedite kolichestvo elementov: ');
ReadLn(n);
Writeln;
while (n<=0) or (ioresult<>0) do
begin
Writeln('Kolichestvo elementov dolgno bit` celim CHISLOM, HE men`she i HE ravno `0` ');
Write('Vvedite kolichestvo elementov: ');
ReadLn(n);
Writeln;
end;
{$I+}

//построения КОС с включенным заглавным элементом
Writeln('Vvedite ', n, ' celih chisel!');
new(p);
p^.next:=p;
lastp:=p;
For i:=1 to n do
begin
new(lastp^.next);
lastp:=lastp^.next;
Write('Vvedite ',i,' element spiska: ');
ReadLn(lastp^.inf);
end;
lastp^.next:=p;


//вывод списка P на экран
Write('Spiska P = [ ');
vivod(p);


//удаление элементов, являющихся простыми числами
lastp := p^.next;
while lastp <> p do
begin
if (lastp^.inf=2) or (lastp^.inf=3) then
begin
writeln('prostie (2 ili 3) - ', lastp^.inf);
{ temp := lastp^.next;
dispose(lastp);
lastp := temp;
break; //удаление тоже криво работает }
end
else
if lastp^.inf<2 then
begin
break;
end
else
for k:=2 to trunc(sqrt(lastp^.inf)) do
if lastp^.inf mod k = 0 then
begin
break;
end
else
begin
writeln('prostie - ', lastp^.inf);
{ temp := lastp^.next;
dispose(lastp);
lastp := temp;
break; //удаление тоже криво работает }
break;
end;
lastp := lastp^.next;
end;


Write('It`s FINISH');
readln

end.


Подскажите плиз, в чем ошибка!? unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 424
Пол: Мужской

Репутация: -  2  +


15 - простое я всегда думал что 15= 3 * 5


--------------------
Чего хочет женщина – того хочет Бог
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Ты бы читал повнимательнее (а не просто SPAM-mode включал dry.gif ), тогда бы увидел, что:
Цитата
Так вот проблема в поиске простых чисел (удаление пока не трогаю, хотя оно тоже криво работает, выдает ошибку "ссылка на не существующий указатель). До 14и она работает нормально, а с 15и начинается дребедень:
1. 15 - простое
, дальше правильно, 21 - опять считает простым, потом 25, потом 35, дальше не проверял...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Bush, проблема у тебя - вот в этом цикле:

for k:=2 to trunc(sqrt(lastp^.inf)) do
if lastp^.inf mod k = 0 then
begin
break;
end
else ... { <--- Вот тут !!! }

Смотри, что происходит: Как только число НЕ 2 и НЕ 3, и оно НЕ делится нацело на 2, срабвтывает отмеченная мной ветка Else, гда и печатается, что число - простое... Я бы переделал весь цикл While вот так:

  lastp := p^.next;
while lastp <> p do begin

if (lastp^.inf=2) or (lastp^.inf=3) then begin
writeln('prostie (2 ili 3) - ', lastp^.inf);
{
temp := lastp^.next;
dispose(lastp);
lastp := temp;
break;
}
end
else
if lastp^.inf<2 then begin
break;
end

else begin
is_simple := true;
for k:=2 to trunc(sqrt(lastp^.inf)) do
if lastp^.inf mod k = 0 then begin
is_simple := false; { <--- Нашел делитель, и выходишь }
break;
end;

{ Если делитель не был найден - то печатать сообщение о простоте числа }
if is_simple then begin
writeln('prostie - ', lastp^.inf);
{
temp := lastp^.next;
dispose(lastp);
lastp := temp;
break;
}
break;
end;
end;
lastp := lastp^.next;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Спасибо volvo, теперь поиск простых чисел работает, правда если искать по одному... smile.gif
А не посмотришь что не так с проходом по списку... Цифра 1 в начале списка по прежнему все сбивает, да и вааще из всего списка выписывает только первое найденное простое число...)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


     if is_simple then begin
writeln('prostie - ', lastp^.inf);
break; {как думаешь, какой цикл прерывается?}


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Я бы сделал вот так:
program kos;

uses
SysUtils;

Type
pe=^el;
el = record
inf: integer;
next: pe;
end;

function vivod(p:pe):boolean;
var lastp: pe;
begin
lastp := p^.next;
while lastp <> p do begin
Write(lastp^.inf, ' ');
lastp := lastp^.next;
end;
WriteLn(' ]');
vivod := true;
end;


Var
T, lastp, p, pp: pe;
i, n, k: integer;

is_simple: boolean;

Begin

{$I-}
Write('Vvedite kolichestvo elementov: '); ReadLn(n);
Writeln;
while (n<=0) or (ioresult<>0) do begin
Writeln('Kolichestvo elementov dolgno bit` celim CHISLOM, HE men`she i HE ravno `0` ');
Write('Vvedite kolichestvo elementov: ');
ReadLn(n);
Writeln;
end;
{$I+}

Writeln('Vvedite ', n, ' celih chisel!');
new(p);
p^.next:=p;
lastp:=p;

For i:=1 to n do begin
new(lastp^.next);
lastp:=lastp^.next;
Write('Vvedite ',i,' element spiska: ');
ReadLn(lastp^.inf);
end;
lastp^.next:=p;


Write('start list: [ '); vivod(p);


{ inc every, 3 }
lastp := p^.next;
while lastp <> p do begin
inc(lastp^.inf, 3);
lastp := lastp^.next;
end;

write('after inc: ['); vivod(p);

lastp := p^.next;
while lastp <> p do begin

if (lastp^.inf > 0) and (lastp^.inf <= 3) then begin

if lastp^.inf > 1 then begin
writeln('prostie (2 ili 3) - ', lastp^.inf);
is_simple := true;
end;

end
else begin

is_simple := true;
for k:=2 to trunc(sqrt(lastp^.inf)) do
if lastp^.inf mod k = 0 then begin
is_simple := false;
break;
end;

if is_simple then begin
writeln('prostie - ', lastp^.inf);
end;

end;

if is_simple then begin

T := lastp;
pp := p^.next;
while pp^.next <> T do pp := pp^.next;
pp^.next := T^.next;
lastp := lastp^.next;
dispose(T);
end
else lastp := lastp^.next;

end;

write('finally: ['); vivod(p);

Write('It`s FINISH');
readln

end.

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 13:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name