Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.02.2010, 11:30
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию Неожиданная проблема с кодом

Мне надо было написать код функции проверки числа на простоту. Вот написал:
Код:
function IsSimp(i:integer):boolean;
 var
 j:integer;
 begin
   for j := 2 to i - 1 do
   begin
   if (i mod j)=0 then
    begin
IsSimp:=true;
    end;
   end;
IsSimp:=false;
 end;    
. И дельфи пишет: значение присваиваемое в блоке if никак не используется, хотя основной текст программы таков:
Код:
 var
chis:integer;
begin
chis:=4;
if IsSimp(chis)=true then
begin
 writeln('Prostoe');
end;
readln;
end.
Если можно помогите разобраться, я вот не пойму разве функция не прекращает работу после IsSimp:=true;?Хотя вот если приписать exit в if то все ок, но не хотелось бы прибегать к таким мерам
Ответить с цитированием
  #2  
Старый 12.02.2010, 12:17
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

во первых твоя функция криво считает. простое число - это число которое делиться на себя и на единицу. вот функция которая правильно считает:
Код:
function IsSimp(i:integer):boolean;
 var
 j:integer;
 begin
   for j := 2 to i  do
   if ((i mod j)=0) then result:=true
                        else result:=false;

 end;
во вторых: после "result:=" - функция не прекращает работу.
Ответить с цитированием
  #3  
Старый 12.02.2010, 12:21
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Функция не прекращает работу до последнего end или exit
поэтому надо И ничего страшного в этой мере нет. Наоборот, Вы не прокручиваете весь цикл ( который можно проверять не до самого числа а до его квадратного корня ) и экономите время.
В Delphi 2010 можно записать Exit(True);
Тоже не обратил внимания. Надо наоборот

Код:
function IsSimp(i:integer):boolean;
 var
 j:integer;
 begin
   for j := 2 to Trunc(Sqrt(i)) + 1  do
    if ((i mod j)=0) then
    begin
     result:=false; // делиться значит не простое
     exit;
    end;
   result:=true;
 end;

Последний раз редактировалось s0Creator, 12.02.2010 в 12:33.
Ответить с цитированием
  #4  
Старый 12.02.2010, 17:55
guranvir guranvir вне форума
Начинающий
 
Регистрация: 19.01.2010
Сообщения: 113
Репутация: 11
По умолчанию

Большое спасибо, насчет того что работает до последнего end я то же экспериментальным путем понял, просто решил уточнить) Да правильно насчет квадратного корня, еще раз спасибо
Ответить с цитированием
  #5  
Старый 12.02.2010, 20:28
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Есть выражение еще короче: Result:= ((i mod j)=0);
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:47.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025