Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Оператор прервать. Не могу понять почему так.

[catena, 05.03.20 - 09:43]
Оператор прервать. Не могу понять почему так.
Я
   Grogan
 
04.03.20 - 22:39
Решаю задачу вывода простых чисел до 1000. Сначала сделал так:

Для НатуральноеЧисло = 2 По 1000 Цикл
ЧислоЯвляетсяПростым = Истина;
Для Делитель=2 По (НатуральноеЧисло-1) Цикл
    Если НатуральноеЧисло%Делитель = 0 Тогда
        ЧислоЯвляетсяПростым = Ложь;
        
        
       КонецЕсли;
    
       Прервать;

    
    КонецЦикла;
    Если ЧислоЯвляетсяПростым = Истина Тогда
        Сообщить(НатуральноеЧисло);
    КонецЕсли;
КонецЦикла;

Программа выводит не простые числа, а числа с шагом в 2. Так: 2, 3, 5, 7 и тд

Но если прерываем цикл до КонецЕсли, то программа работает корректно. Почему так? Влиять не должно по идее.

Для НатуральноеЧисло = 2 По 1000 Цикл
ЧислоЯвляетсяПростым = Истина;
Для Делитель=2 По (НатуральноеЧисло-1) Цикл
    Если НатуральноеЧисло%Делитель = 0 Тогда
        ЧислоЯвляетсяПростым = Ложь;
        
        Прервать;
       КонецЕсли;
    
      

    
    КонецЦикла;
    Если ЧислоЯвляетсяПростым = Истина Тогда
        Сообщить(НатуральноеЧисло);
    КонецЕсли;
КонецЦикла;

Работает корректно. Почему так?
Спасибо! Извините за нубство.
 
 
   azernot
 
1 - 04.03.20 - 22:42
Для Делитель=2 По (НатуральноеЧисло-1) Цикл
    Если НатуральноеЧисло%Делитель = 0 Тогда
        ЧислоЯвляетсяПростым = Ложь;
  
    КонецЕсли;
    
    Прервать; - прерывание идет на первом же ветке цикла. ВСЕГДА
   azernot
 
2 - 04.03.20 - 22:50
Насколько я помню алгоритм решения такой задачи, надо изначально перебирать нечётные числа, и пытатся делить не на любые числа, а а ранее найденные простые. Так будет быстрее.
   АНДР
 
3 - 04.03.20 - 22:51
Для Делитель=2 По (НатуральноеЧисло/2-1) Цикл
   azernot
 
4 - 04.03.20 - 22:59
Лимит = 1000;

МассивПростыхЧисел = Новый Массив();

НатуральноеНечетноеЧисло = 3;
Пока НатуральноеНечетноеЧисло<= Лимит Цикл
  ЧислоЯвляетсяПростым = Истина;
  Для каждого РанееНайденноеПростоеЧисло Из МассивПростыхЧисел Цикл
   Если НатуральноеНечетноеЧисло%РанееНайденноеПростоеЧисло = 0 Тогда
     ЧислоЯвляетсяПростым = Ложь;
     Прервать;
   КонецЕсли;
  КонецЦикла;
  Если ЧислоЯвляетсяПростым Тогда
    МассивПростыхЧисел.Добавить(НатуральноеНечетноеЧисло);
  КОнецЕсли;
  НатуральноеНечетноеЧисло = НатуральноеНечетноеЧисло + 2;
КОнецЦикла;
МассивПростыхЧисел.Вставить(0,2);

Для каждого НайденноеПростоеЧисло Из МассивПростыхЧисел Цикл
  Сообщить(НайденноеПростоеЧисло);
КонецЦикла;
   orefkov
 
5 - 05.03.20 - 00:42
(4)
Эх, молодость моя...
Проверять надо не на весь массив ранее найденных, а пока РанееНайденноеПростоеЧисло меньше либо равно корню из проверяемого числа. Ну или РанееНайденноеПростоеЧисло * РанееНайденноеПростоеЧисло <= НатуральноеНечетноеЧисло, в 1989 году Basic слишком долго считал квадратные корни, делали так.
   catena
 
6 - 05.03.20 - 06:36
(0)"Влиять не должно по идее." - с чего бы? То, что внутри если выполняется только тогда, когда выполняется условие. А вне если работает всегда.
   Grogan
 
7 - 05.03.20 - 08:58
Спасибо всем отписавшимся, но мне бы с циклами и оператором если разобраться до конца надо, а не задачу решить оптимальным способом) Спасибо конечно что накидали, пища для размышлений будет так сказать.
Но все равно для себя до конца не понял... (

У нас два цикла, перед которыми стоит флаг, присваивающий переменной ЧислоЯвляетсяПростым значение Истина.  Внешний цикл перебирает числа, которые нужно проверить на "простоту". Далее внутренний цикл, который перебирает делители. В нем находится условный оператор, если проверяемое число делится на делитель без остатка флаг ЧислоЯвляетсяПростым меняет значение на Ложь. Далее если мы прерываем цикл, перебирающий делители, программа работает корректно, но если мы сначала закрываем оператор условный оператор и ставим КонецЕсли, то программа работает некорректно. Почему так? Что меняется от того что он будет закрыт? Переменные будут иметь одни и те же значения в текущий момент времени, независимо закрыт ли оператор Если. Верно ли? Растолкуйте пожалуйста)
   azernot
 
8 - 05.03.20 - 09:19
(7) Команда "Прервать" - прерывает цикл. Т.е. в коде проверяется только один делитель - Двойка. Если натуральное число -  чётное, при прерывании цикла ЧислоЯвляетсяПростым = Ложь, если нечётное ЧислоЯвляетсяПростым = Истина. И поэтому тебе сообщаются только нечётные числа.

Прерывать цикл по делителям при поиске простого числа надо именно в тот момент когда найден делитель. В остальных случаях, прерывать цикл не надо.

P.S. Может ты путаешь "Прервать" и "Продолжить"?
   catena
 
9 - 05.03.20 - 09:27
(7)Оператору Прервать плевать на значения переменных.

Оператор ЕСЛИ не меняет никакие значения переменных.
   Если НатуральноеЧисло%Делитель = 0 Тогда
        ЧислоЯвляетсяПростым = Ложь;
        Прервать;//Сработает только если число делится без остатка

   КонецЕсли;
   Преравть;//Сработает всегда, независимо, заходили мы в ЕСЛИ или не заходили
   catena
 
10 - 05.03.20 - 09:28
(7)Поставь точку останова и выполни код пошагово.
   Grogan
 
11 - 05.03.20 - 21:23
catena,azernot отдуши! Теперь ясно стало все! Спасибо еще раз!

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.