Помощь - Поиск - Пользователи - Календарь
Полная версия: нахождение простых чисел
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
He!!
В файле А.dat дано натуральное n и массив целых чисел длины n. B файл B.dat выписать все элементы массива X, индексы которых являются простыми числами. Распознование простого числа оформить в виде подпрограммы.
Очень надо решить эту задачу))) ПлиЗ

Добавлено через 2 мин.
вот что я попытался сделать, но тут есть ошибки в самой программе, а исправить незнаю как

program Kurs;

procedure nat(i:integer;var k:integer);
var n,s:integer;
begin
s:=0;
for n:=1 to i-1 do
if i mod n = 0 then s:=s+1;
if s=0 then k:=i; end;

var f:text;
a:array[1..10] of integer;
c:array[1..10] of integer;
n,i,j,k:integer;

begin
assign(f,'a.dat');
reset(f);
read(f,n);

for i:=1 to n do
read(f,a[i]);

for i:=1 to n do
write(f,a[i]);

for j:=1 to 10 do
for i:=1 to n do begin
nat(i,k);
c[j]:=a[k];
end;

writeln;
for j:=1 to 10 do
write(c[j]);

close(f);
assign(f,'b.res');
rewrite(f);
writeln;
for j:=1 to n do
write((f,c[j]);
Close(f);

end.
maksimla
smile.gif все молчю
Lapp
М
He!!, приведи название темы в соответствие с Правилами - или она будет закрыта.

Unconnected
procedure nat(i:integer;var k:integer);
var n,s:integer;
begin
s:=0;
for n:=1 to i-1 do
if i mod n = 0 then s:=s+1;
if s=0 then k:=i;
end;

program Kurs;
var f:text;
a:array[1..10] of integer;
c:array[1..10] of integer;
n,i,j,k:integer;
begin
assign(f,'a.dat');
reset(f);
read(f,n);
for i:=1 to n do
read(f,a[i]);
for i:=1 to n do
write(f,a[i]);
for j:=1 to 10 do
for i:=1 to n do begin
nat(i,k);
c[j]:=a[k];
end;
writeln;
for j:=1 to 10 do
write(c[j]);
close(f);
assign(f,'b.res');
rewrite(f);
writeln;
for j:=1 to n do
write(f,c[j]);
end.


Вот твой код. Он компилируется, нужно было убрать лишнюю скобку в предпоследней строке.
Первое - это ты не закрываешь файл в конце. Второе - я вот не вижу(может,смотрю плохо smile.gif ), где ты делаешь проверку на простое число.
Lapp
Ответ Unconnected скрыт.
Будет открыт после исправления названия.
He!!
все перелазил, не нашел как изменить имя темы. Извините, что заголовок темы не информативный, но решение задачи действительно нужно.
Lapp
Цитата(He!! @ 23.12.2008 2:16) *
все перелазил, не нашел как изменить имя темы(
Редактируй свой первый пост. Там увидишь.
He!!
Название темы успешно отредактировано)
Lapp
спасибо
He!!
Цитата(Unconnected @ 22.12.2008 14:09) *



Вот твой код. Он компилируется, нужно было убрать лишнюю скобку в предпоследней строке.
Первое - это ты не закрываешь файл в конце. Второе - я вот не вижу(может,смотрю плохо smile.gif ), где ты делаешь проверку на простое число.


1) про скобку я непонял, какая именно? в предпоследней стороке все скобки необходимы.
2)проверку на простое числу выполняю в процедуре. см самый верх
Lapp
Вот работающая программа. Извини, твою править было долго и не очень осмысленно - ошибки как в программировании, так и в идее.
Если непонятно, спрашивай.
function IsPrime(n: integer): boolean;
var
i,k: integer;
b: boolean;
begin
b:=(i>1);
i:=2;
k:=Trunc(Sqrt(n));
while (i<=k) and b do begin
b:=(n mod i>0);
Inc(i)
end;
IsPrime:=b
end;

var
f,g: text;
n,i,a: integer;

begin
assign(f,'a.dat');
reset(f);
ReadLn(f,n);
assign(g,'b.dat');
ReWrite(g);
for i:=1 to n do begin
read(f,a);
if IsPrime(i) then WriteLn(g,a)
end;
Close(f);
Close(g)
end.


2 Unconnected:
вопрос был не только в том, чтоб заставить программу компилироваться. Иначе всегда можно предложить вариант
begin
end.
volvo
Цитата
function IsPrime(n: integer): boolean;
var
i,k: integer;
b: boolean;
begin
b:=(i>1); { <--- !!! }
i:=2;
k:=Trunc(Sqrt(n));
while (i<=k) and b do begin
b:=(n mod i>0);
Inc(i)
end;
IsPrime:=b
end;
- Русская рулетка? Я про отмеченную строку... smile.gif

i - локальная переменная, может быть и все время равна 0 или 1, как повезет, тогда ни одно число простым не будет... Скорее всего N имелся в виду?
Lapp
Цитата(volvo @ 23.12.2008 10:51) *
- Русская рулетка? Я про отмеченную строку... smile.gif
... Скорее всего N имелся в виду?
Ага! smile.gif)))
что-то меня дернуло поменять буковку в середине написания проги...
Спасибо!
He!!
Функцию совсем не понимаю, какая там идея? И что как там вообще?
Lapp
Вот, привел некоторые комментарии. Попробуй разобраться. Если все же не получится - говори.

function IsPrime(n: integer): boolean;  { IsPrime = ЯвляетсяПростым (с английского) } 
var
i,k: integer;
b: boolean; { будет true, пока (и если) не обнаружится, что число составное }

begin

b:=(n>1); { инициализация b, заодно отсечение числа 1, которое не простое, равно true, если n>1 }

i:=2; { инициализация счетчика цикла }

k:=Trunc(Sqrt(n)); { верхний предел цикла - квадратный корень из числа. Дальше проверять нет смысла }

while (i<=k) and b do begin { цикл до верхнего предела или пока не поделится нацело }

b:=(n mod i>0); { true, если число НЕ делится нацело на i (то есть остаток есть) }

Inc(i) { увеличиваем параметр цикла }

end;

IsPrime:=b { Присваиваем возвращаемый результат }

end;

He!!
я разобрался в программе, но проверяя число три, оно у меня не получается простым. k получается равным 1, а
i=2,тоесть у нас i<k, значит цикл ниразу не выполняется

Добавлено через 5 мин.
Цитата(He!! @ 24.12.2008 1:51) *

я разобрался в программе, но проверяя число три, оно у меня не получается простым. k получается равным 1, а
i=2,тоесть у нас i<k, значит цикл ниразу не выполняется



Наверное значиние true к b присваевается когда b:=(n>1) и так и остается то конца функции, те число три простое
Lapp
Цитата(He!! @ 24.12.2008 1:51) *
я разобрался в программе, но проверяя число три,

Ты исправил ошибку, которую заметил volvo? Первая строка исполняемого кода в функции.

неправильно:
b:=(i>1);

нужно:
b:=(n>1);


Добавлено через 5 мин.
Цитата(He!! @ 24.12.2008 1:51) *
Наверное значиние true к b присваевается когда b:=(n>1) и так и остается то конца функции, те число три простое
Именно так.
He!!
И еще вопрос, например берем число 27. k=5, тогда от2 до 5 значение b=true, b=false, b=true, b=true. И чего программа делает с этими значениями, как мен кажется она просто их заменяет старый на новый по ходу выполнения цикла. По идее она должна их перемножить что бы ответ был false. Можно уточнить еще этот момент, почему он именно перемножает?
Lapp
Цитата(He!! @ 24.12.2008 2:06) *
И еще вопрос, например берем число 27. k=5, тогда от2 до 5 значение b=true, b=false, b=true, b=true. И чего программа делает с этими значениями, как мен кажется она просто их заменяет старый на новый по ходу выполнения цикла. По идее она должна их перемножить что бы ответ был false. Можно уточнить еще этот момент, почему он именно перемножает?

Посмотри на условия цикла:
while (i<=k) and b do begin

- как только b становится false, цикл прекращается.
He!!
ММММ, точно))) я все понял, спасибо за внимание. очень благодарен give_rose.gif good.gif good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.