Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2012, 00:14   #1
sergio212
Пользователь
 
Регистрация: 29.10.2012
Сообщений: 10
По умолчанию Работа с процедурой (Delphi)

Требуется ввести два числа N1 и N2, программа должна вывести в столбик все простые числа в диапозоне от N1 до N2.
Примечание: простые числа - это числа которые делятся на 1 и на самих себя без остатка.
У меня просто выводит все числа подряд в столбик не выполняя процедуры нахождения простого числа prover.
Вот мой интерфейс и код:
Код:
{$R *.dfm}

//проверяет простые ли числа

procedure prover(N:integer; var ok:Boolean);
 var d,r:integer;
  begin
  d:=2;
repeat
 r:=N mod d;
 if r<>0 then
           d:=d+1;
until r=0;
ok:=true;
end;

//вывод простых чисел

procedure TForm1.Button1Click(Sender: TObject);
 var
   i:integer;
   st:string;
   yes:boolean;
 begin
  prover(StrToInt(Edit1.Text), yes );
  st:='';
    for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
     if yes=true then
     st:=st+inttostr(i)+#13;
     label5.caption:=st;
end;
end.

Например в данном случае вывод должен быть таким:
101
103
107
109

Последний раз редактировалось sergio212; 30.10.2012 в 00:40.
sergio212 вне форума Ответить с цитированием
Старый 30.10.2012, 00:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну для начала, Вы же в цикле не вызываете свою prover!!! в этом и есть главная Ваша ошибка!

Кроме того, на форуме 100500! раз писался код для проверки числа на простоту.
Возьмите нормальный рабочий алгоритм, а не то, что Вы написали!
вот, например, функция:
Код:
function isPrime(X: LongInt): boolean;
var i: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     while i <= sqrt(x) do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;
использовать так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
   i:integer;
   st:string;
 begin
  prover(StrToInt(Edit1.Text), yes );
  st:='';
  for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
       if isPrime(i) then
           st:=st+inttostr(i)+#13;
  label5.caption:=st;
end;
p.s. а зачем для вывод использовать TLabel ?! TMemo на порядок удобнее и проще задействовать. Да и скроллирование там уже есть...
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
   i:integer;
begin
  Memo1.Lines.Clear;  
  for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
       if isPrime(i) then
           Memo1.Lines.Append(inttostr(i));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.10.2012, 14:25   #3
sergio212
Пользователь
 
Регистрация: 29.10.2012
Сообщений: 10
По умолчанию

Большое спасибо все работает!
Просто преподаватель дал этот алгоритм нахождения простого числа и он работал в отдельной программе, но главное что в этом случае ваш алгоритм работает.
Да и еще когда я вводил в свою неправильную программу числа от 1, то компьютер долго думал а только потом выводил все числа подряд, даже если я ввел числа от 1 до 2, но если я вводил числа от выше чем 1 до любого числа, выводилось все моментально. Почему так?

Последний раз редактировалось sergio212; 30.10.2012 в 14:27.
sergio212 вне форума Ответить с цитированием
Старый 30.10.2012, 14:36   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от sergio212 Посмотреть сообщение
Большое спасибо все работает!
Просто преподаватель дал этот алгоритм нахождения простого числа и он работал в отдельной программе, но главное что в этом случае ваш алгоритм работает.
Да и еще когда я вводил в свою неправильную программу числа от 1, то компьютер долго думал а только потом выводил все числа подряд, даже если я ввел числа от 1 до 2, но если я вводил числа от выше чем 1 до любого числа, выводилось все моментально. Почему так?
Пройдём по коду: prover(1, ok).
d:=2.
r := 1 mod 2
r равно 1 и не равно 0. Увеличиваем d.
r := 1 mod 3
Опять 1. Странно, правда? Ещё увеличиваем d...
Вопрос: когда r станет равно 0 (ведь это условие выхода из цикла)?
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:45   #5
sergio212
Пользователь
 
Регистрация: 29.10.2012
Сообщений: 10
По умолчанию

Вот на алгоритме преподавателя, если интересно.
Он мне сказал чтобы я использовал только его, пришлось переделать. Но его алгоритм плохо работает если ввести с 1 до n, приходиться ждать.
Может его и можно как-нибудь оптимизировать.
Код:
{$R *.dfm}

//проверяет простое ли число N1
function prover(N:Integer):boolean;
  var i:integer;
      d:Integer;
      r:Integer;
Begin
  prover:=false;
  d:=2;
  repeat
   r:=N mod d;
   if r<>0
    then d:=d+1;
until r=0;
if d=N
 then prover:=true;
End;

procedure TForm1.Button1Click(Sender: TObject);
  var
   i:integer;
   st:string;
begin
 prover(StrToInt(Edit1.Text));
  st:='';
    for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
    if prover(i) then
     st:=st+inttostr(i)+#13;
label5.caption:=st;
end;

end.
До этого у меня была ошибка, потому что нужно было дописать вот это:
Код:
if d=N
 then prover:=true;

Последний раз редактировалось sergio212; 01.11.2012 в 16:51.
sergio212 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка памяти процедурой .FormClose Delphi Человек Панда Помощь студентам 0 24.10.2011 21:08
Проблема с хранимой процедурой в Delphi Innnni Помощь студентам 0 01.05.2011 18:54
Работа с хранимой процедурой MargoNik БД в Delphi 13 14.05.2009 20:53