Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ нахождение простых чисел

Автор: He!! 22.12.2008 17:03

В файле А.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 22.12.2008 17:08

smile.gif все молчю

Автор: Lapp 22.12.2008 17:55

М
He!!, приведи название темы в соответствие с Правилами - или она будет закрыта.


Автор: Unconnected 22.12.2008 18:09

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 22.12.2008 18:15

Ответ Unconnected скрыт.
Будет открыт после исправления названия.

Автор: He!! 23.12.2008 6:16

все перелазил, не нашел как изменить имя темы. Извините, что заголовок темы не информативный, но решение задачи действительно нужно.

Автор: Lapp 23.12.2008 6:18

Цитата(He!! @ 23.12.2008 2:16) *
все перелазил, не нашел как изменить имя темы(
Редактируй свой первый пост. Там увидишь.

Автор: He!! 23.12.2008 6:26

Название темы успешно отредактировано)

Автор: Lapp 23.12.2008 6:31

спасибо

Автор: He!! 23.12.2008 6:41

Цитата(Unconnected @ 22.12.2008 14:09) *



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


1) про скобку я непонял, какая именно? в предпоследней стороке все скобки необходимы.
2)проверку на простое числу выполняю в процедуре. см самый верх

Автор: Lapp 23.12.2008 11:17

Вот работающая программа. Извини, твою править было долго и не очень осмысленно - ошибки как в программировании, так и в идее.
Если непонятно, спрашивай.

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 23.12.2008 14:51

Цитата
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 23.12.2008 14:57

Цитата(volvo @ 23.12.2008 10:51) *
- Русская рулетка? Я про отмеченную строку... smile.gif
... Скорее всего N имелся в виду?
Ага! smile.gif)))
что-то меня дернуло поменять буковку в середине написания проги...
Спасибо!

Автор: He!! 24.12.2008 4:12

Функцию совсем не понимаю, какая там идея? И что как там вообще?

Автор: Lapp 24.12.2008 5:05

Вот, привел некоторые комментарии. Попробуй разобраться. Если все же не получится - говори.

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!! 24.12.2008 5:51

я разобрался в программе, но проверяя число три, оно у меня не получается простым. 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 24.12.2008 5:58

Цитата(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!! 24.12.2008 6:06

И еще вопрос, например берем число 27. k=5, тогда от2 до 5 значение b=true, b=false, b=true, b=true. И чего программа делает с этими значениями, как мен кажется она просто их заменяет старый на новый по ходу выполнения цикла. По идее она должна их перемножить что бы ответ был false. Можно уточнить еще этот момент, почему он именно перемножает?

Автор: Lapp 24.12.2008 6:11

Цитата(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!! 24.12.2008 6:15

ММММ, точно))) я все понял, спасибо за внимание. очень благодарен give_rose.gif good.gif good.gif