Если говорят что программа зациклилась то это значит
Перейти к содержимому

Если говорят что программа зациклилась то это значит

  • автор:

Цикл с условием (while)

Очень часто заранее невозможно сказать, сколько раз надо выполнить какую-то операцию, но можно определить условие, при котором она должна заканчиваться. Такое задание может выглядеть так: пока условие истинно, выполняй данную операцию. Слово «пока» на английском языке записывается как while, и так же называется еще один вид цикла.

Пример. Ввести целое число и определить, сколько в нем цифр.

Для решения этой задачи обычно применяется такой алгоритм. Число делится на 10 и от-

брасывается остаток, и так до тех пор, пока результат деления не равен нулю. С помощью специальной переменной (она называется счетчиком) считаем, сколько раз выполнялось деление — столько цифр и было в числе. Понятно, что нельзя заранее определить, сколько раз надо разделить число, поэтому надо использовать цикл с условием.

• Цикл while используется тогда, когда количество повторений цикла заранее неизвестно

и не может быть вычислено.

• Цикл while состоит из заголовка и тела цикла.

• В заголовке после слова while в круглых скобках записывается условие, при котором

цикл продолжает выполняться. Когда это условие нарушается (становится ложно), цикл

• В условии можно использовать знаки логических отношений и операций

> < больше, меньше

>= <= больше или равно, меньше или равно

• Если условие неверно в самом начале, то цикл не выполняется ни разу (это цикл с предусловием).

• Если условие никогда не становится ложным (неверным), то цикл никогда не заканчива-

ется; в таком случае говорят, что программа «зациклилась» — это серьезная логическая

• В языке Си любое число, не равное нулю, обозначает истинное условие, а ноль — ложное условие:

while ( 1 ) // бесконечный цикл

while ( 0 ) // цикл не выполнится ни разу

• Тело цикла заключается в фигурные скобки; если в теле цикла стоит всего один оператор,скобки можно не ставить.

• В тело цикла могут входить любые другие операторы, в том числе и другие циклы (такой

прием называется «вложенные циклы»).

• Для того чтобы легче разобраться в программе, все тело цикла и ограничивающие его

скобки сдвигаются вправо на 2-3 символа (запись «лесенкой»).

Цикл с постусловием (do — while)

Существуют также случаи, когда надо выполнить цикл хотя бы один раз, затем на каждом

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

Для этого используется цикл с постусловием (то есть условие проверяется не в начале, а в конце цикла).

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

Любая программа должна обеспечивать защиту от неверного ввода данных. Поскольку пользователь может вводить данные неверно сколько угодно раз, то надо использовать цикл с условием. С другой стороны, один раз обязательно надо ввести число, поэтому нужен цикл с постусловием.

В отличие от предыдущей программы, теперь надо при каждом делении определять оста-

ток (последняя цифра числа равна остатку от деления его на 10) и суммировать все остатки в специальной переменной.

• Цикл do—while используется тогда, когда количество повторений цикла заранее неизвестно и не может быть вычислено.

• Цикл состоит из заголовка do, тела цикла и завершающего условия.

• Условие записывается в круглых скобках после слова while, цикл продолжает выполняться, пока условие верно; когда условие становится неверно, цикл заканчивается.

• Условие проверяется только в конце очередного шага цикла (это цикл с постусловием),

таким образом, цикл всегда выполняется хотя бы один раз.

• Если условие никогда не становится ложным (неверным), то цикл никогда не заканчива-

ется; в таком случае говорят, что программа «зациклилась» — это серьезная логическая

• Тело цикла заключается в фигурные скобки; если в теле цикла стоит всего один оператор, скобки можно не ставить.

• В тело цикла могут входить любые другие операторы, в том числе и другие циклы (такой

прием называется «вложенные циклы»).

• Для того чтобы легче разобраться в программе, все тело цикла и ограничивающие его

Как определить зацикливание программы?

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

1. Как вы определяете, что программа работает?
2. Как вы определяете, что программа зациклилась?
3. Ваша программа выдает какие-то данные о том что она работает?
4. Ваша программа извещает вас. сколько ей осталось работать?
5. Вы оцениваете время работы программы перед ее запуском?
6. Ваша программа может сама определить, что она зависла?
7. Ваша программа может сама остановиться?
8. Ваша программа остановилась. Объяснит она свою остановку?
полагаю, этого достаточно.

Метод Эйлера-Коши (как прервать зацикливание программы)
Подскажите, пожалуйста, как прервать зацикливание данной программы: clear; a=1; b=2; h=0,02;.

Как определить зацикливание процесса?
Собственно, сабж в названии. Как определить, что некоторая программа другого процесса зациклилась.

Зацикливание программы
Как сделать так, чтобы программа запрашивала у пользователя, нужно ли еще раз решать то или иное.

Лучший ответСообщение было отмечено йот как решение

Решение

1−3, 8 — решается логированием.
4 — если реализовать просто, то можно и сделать.
5 — в некоторых случаях могут быть ожидания относительно времени работы.
6 — в некоторых случаях возможно, смотря что понимать под зависанием.

На более конкретные вопросы будут более конкретные ответы.

0x10,
допустим у меня обычный цикл с параметром скажем время
работы программы 1 час (условно), то я предпочитаю, чтобы
программа выносила на экран значение параметра цикла
(с каким нибудь шагом) — это все-таки определенная гарантия
того, что программа работает. заодно можно оценить время
работы.
А как поступаете вы в подобном случае или ином другом?

Добавлено через 5 минут
Зависание
Некоторые переменные должны обязательно менять
свое значение (можно поставить элементарный счетчик)
если переменная не меняет своего значения (хотя должна)
— 100%% гарантии того, что программа зависла.

Лучший ответСообщение было отмечено йот как решение

Решение

Сообщение от йот

Можно на каждой итерации, можно с выбранным шагом… Как удобно, зависит от конкретной задачи.

Циклические алгоритмы. Цикл с предусловием

В данный момент вы не можете посмотреть или раздать видеоурок ученикам

Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет.

Получите невероятные возможности

Конспект урока «Циклические алгоритмы. Цикл с предусловием»

· Цикл с предусловием и принцип его работы.

· Программирование цикла с предусловием в языке Python.

В некоторых алгоритмах может потребоваться несколько раз повторить одну и ту же последовательность действий. Рассмотрим, например, алгоритм чтения книги. Для того, чтобы прочесть книгу, необходимо сначала её открыть, после чего, пока книга не закончится, нужно прочитывать по две страницы и переворачивать страницу. После окончания чтения нужно закрыть книгу. Такие алгоритмы, как описанный, называются циклическими. Они содержат циклы. Цикл – это алгоритмическая конструкция, которая представляет собой последовательность действий, повторяющихся многократно. Различают три вида циклов: цикл с заданным условием продолжения работы, который называется также циклом с предусловием; циклы с заданным условием окончания работы или с постусловием, а также циклы с параметром.

Блок-схема алгоритма чтения книги выглядит так.

Алгоритм чтения книги содержит цикл с предусловием. Его исполнение начинается с проверки условия. Если условие выполняется, следуют некоторые действия, которые называются телом цикла. После исполнения тела цикла вновь проверяется его условие. Так продолжается до тех пор, пока условие цикла выполняется. Когда условие цикла станет ложным, цикл завершит свою работу.

Рассмотрим, как описывается цикл с предусловием на языке Python. Его описание начинается со служебного слова while, что в переводе на русский язык означает «пока». Через пробел, после него следует условие продолжения работы цикла. Оно, как и в случае с ветвлением, представляет собой выражение логического типа bool. Дальше следует двоеточие, а со следующей строки, с отступом – тело цикла, то есть инструкции, исполнение которых будет повторяться до тех пор, пока условие цикла истинно. Как и в случае с ветвлением, важно соблюдать отступы, иначе программа работать не будет. По умолчанию отступ в языке Python равен четырём пробелам, хотя интерпретатор распознает и другие пробельные отступы, важно лишь их наличие.

Рассмотрим задачу. Написать программу для вычисления суммы цифр целого числа.

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

Напишем модуль для решения задачи. Вначале, с помощью инструкции print, выведем на экран сообщение о том, что это программа, вычисляющая сумму цифр целого числа, и запрос на его ввод. Дальше запишем инструкцию для считывания числа в переменную n. Так как по условию число целое – при вводе будем преобразовывать его значение в целочисленный тип int. Введённое число необязательно положительное, поэтому для вычисления суммы цифр будем использовать его модуль. Для получения модуля числа присвоим переменной n значение функции abs (n). Прежде чем начать вычисление суммы цифр числа, объявим переменную для её хранения. Назовём её s и присвоим ей значение ноль. Теперь начнём вычисление суммы цифр числа. Для этого запишем цикл while. Условием продолжения его работы будет то, что в числе n ещё остались цифры, то есть оно больше нуля. В теле цикла запишем единственную инструкцию присваивания переменным s и n соответственно s + n % 10, а также n // 10. Таким образом, на каждом шаге цикла к переменной s будет добавляться значение правой цифры n, после чего эта цифра будет убрана из числа. По завершении работы цикла, в переменной s будет храниться значение суммы цифр числа. Поэтому с помощью инструкции pritn выведем на экран сообщение о том, что сумма цифр введённого числа равна значению переменной s.

print (‘Программа, вычисляющая сумму цифр целого числа. Введите число.’)

s, n = s + n % 10, n // 10

print (‘Сумма цифр введённого числа:’, s)

Запустим модуль на выполнение и введём число 32768. Сумма его цифр действительно равна 26. Ещё раз запустим модуль и введём число -256. Сумма его цифр действительно равна 13. Программа работает правильно. Задача решена.

Ещё раз обратим внимание на принцип работы цикла с предусловием. Перед началом выполнения тела цикла проверяется его условие, поэтому если условие такого цикла изначально ложно, то тело цикла не будет выполнено ни разу. Исполнение тела цикла повторяется до тех пор, пока условие цикла истинно. Поэтому если условие цикла будет всегда истинно, то цикл будет повторяться бесконечно, то есть исполнение программы никогда не будет завершено само по себе. Оно будет завершено либо ошибкой при переполнении одной из переменных, либо его прервёт пользователь. В таких случаях говорят, что программа зациклилась. Однако и бесконечные циклы также нашли применение в некоторых языках программирования, его мы рассмотрим в следующих уроках. Заголовок наиболее простого бесконечный цикла: while True.

Рассмотрим ещё одну задачу. Написать программу, которая определяет, является ли простым введённое целое положительное число.

Простым называется целое число, которое без остатка делится только на себя и на единицу. Услышав это определение, многие из вас наверняка догадались, что для того, чтобы узнать, является ли число Эн простым, достаточно проверить его делимость на все целые числа на промежутке от двух до Эн минус один.

Напишем программу для решения задачи. Вначале, с помощью инструкции print, выведем сообщение о том, что это программа, определяющая, является ли целое положительное число простым, и запрос на ввод числа. Дальше запишем инструкцию для считывания введённого числа в переменную n. Так как по условию задачи число целое, то при вводе мы будем преобразовывать его значение в целочисленный тип int. Истинность высказывания о том, что число n – простое мы будем хранить в логической переменной p. Предположим, что n – простое число, поэтому присвоим переменной p значение «истина». Также нам понадобится переменная, в которой мы будем перебирать предполагаемые делители n. Назовём её m, присвоим ей значение наименьшего предполагаемого делителя, то есть два. Дальше запишем цикл while, для проверки того, является ли число простым. Он будет продолжать свою работу, пока значение m меньше n. В цикле запишем инструкцию ветвления с условием, что остаток от деления n на m равен нулю; если это условие выполняется, значит n не является простым числом и мы присвоим логической переменной p значение «ложь», в противном случае – ничего делать не будем. Далее, для перехода к следующему предполагаемому делителю, увеличим значение m на единицу. Таким образом, по завершении работы цикла в переменной p, будет храниться истинность высказывания о том, что n – простое число. Для вывода ответа на вопрос задачи запишем инструкцию ветвления с переменной p в качестве условия. Если переменная p имеет значение «истина», выведем на экран сообщение о том, что число n является простым, в противном случае – выведем на экран сообщение о том, что число n не является простым.

print (‘Программа, определяющая, является ли целое положительное число простым. Введите число.’)

print (‘Введённое число является простым.’)

print (‘Введённое число не является простым.’)

Сохраним модуль и запустим его на выполнение. Введём число 6. Оно делится на 2 и на 3, поэтому не является простым. Программа вывела сообщение об этом. Снова запустим модуль и введём число 13. Это число действительно является простым. Программа работает правильно, но запустим её ещё раз и введём число 16 769 023. Программа вернула результат с заметной временной паузой. Это произошло потому, что в написанной программе при увеличении числа увеличивается количество проверок.

Для решения этой задачи есть несколько вариантов сокращения перебора чисел. Прежде всего, единожды проверив делимость числа на 2, можно больше не проверять его делимость на чётные числа, так как все они содержат двойку в разложении на простые множители. Таким образом мы сократим количество предполагаемых делителей почти в два раза. Так как n равно произведению двух квадратных корней из n, то при его разложении на два множителя, если один из них будет больше квадратного корня из n, то второй будет меньше квадратного корня из n. Поэтому нам достаточно перебирать возможные множители до квадратного корня из n. Также, найдя хотя бы один делитель числа, мы докажем, что оно не является простым, и после этого проверку продолжать не требуется. Таким образом, нам достаточно проверить делимость n на два и на все нечётные числа на промежутке [3; sqrt (n)].

Изменим написанную программу. Вначале проверим, не делится ли n без остатка на 2 и присвоим результат этой проверки переменной p. Так как мы проверили делимость n на 2, присвоим переменной m новое начальное значение – 3. В дальнейшем нам понадобится функция извлечения квадратного корня из модуля math. Подключим этот модуль. Теперь изменим цикл проверки делимости числа n. Он будет работать пока m меньше либо равно квадратному корню из n. Так как квадратный корень из n – вещественная функция, в её значении может быть вычислительная ошибка, поэтому прибавим к её значению ещё единицу. Чтобы цикл завершил свою работу, как только будет доказано, что n не является простым, усложним условие цикла, соединив нынешнее условие конъюнкцией со значением переменной p. То есть цикл будет работать, пока значение m меньше или равно квадратному корню из n плюс один И в переменной p хранится значение «истина». В цикле значение переменной m будем увеличивать на 2, чтобы, пропуская чётное число, сразу переходить к следующему, нечётному.

print (‘Программа, определяющая, является ли целое положительное число простым. Введите число.’)

while m < math.sqrt (n) + 1 and p:

print (‘Введённое число является простым.’)

print (‘Введённое число не является простым.’)

Сохраним изменённый модуль и запустим его на выполнение. Чтобы подтвердить, что модуль работает правильно, сначала введём число 4. Оно делится на два, а потому не является простым. Снова запустим модуль и введём число 5. Это число действительно является простым. Теперь введём число 16 769 023. Программа мгновенно вывела сообщение о том, что это простое число. То есть сокращение перебора предполагаемых делителей подействовало. Не сложно рассчитать, что для последнего теста при изменении программы мы сократили количество проверок с 16.8 миллиона до 2 тысяч, поэтому скорость исполнения программы значительно увеличилась.

· Циклическим называется алгоритм, содержащий циклы.

· Цикл – это алгоритмическая конструкция, которая представляет собой последовательность действий, повторяющихся многократно.

· Цикл с заданным условием продолжения работы или с предусловием работает пока выполняется его условие.

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

Операторы управления циклом. Зацикливание

Существует два оператора, которые позволяют управлять выполнением цикла. Это операторы break и continue .

Давайте рассмотрим их работу на следующем примере: Модифицируем программу из прошлого урока.

Программа: Игральный кубик.

Программа заменяет обычный игральный кубик.

  • 1 — бросить кубик;
  • 0 — закончить игру.

В конце игры программа должна выводить количество бросков кубика, сделанных в игре.
После 50 бросков программа автоматически завершается. Выводится сообщение "Game over!" .

Код такой программы будет выглядеть следующим образом:

Давайте поясню некоторые новые операторы, которые там используются.

Оператор break

Оператор break прекращает выполнение цикла. Помните, мы уже использовали данную команду в операторе switch . Здесь всё точно так же. Мы используем данный оператор, чтобы выйти из цикла, когда произойдёт 50 бросков.

Важный момент. Оператор break работает и во всех циклических конструкциях, и в операторе выбора.

В нашем примере он используется и там, и там. Возникает вопрос: а как он решает, откуда надо выйти: из switch или из цикла. Очень просто.

Оператор break всегда завершает ближайший внешний оператор, внутри которого он находится.

Например, в нашей программе первый раз оператор break встречается в ветке case 0 . Значит он находится внутри оператора switch , который находится внутри цикла do-while . Ближайший оператор, внутри которого он расположен, – это switch . Следовательно, завершается оператор switch . Аналогично и с другими ветками оператора switch .

Последний оператор break находится внутри if , который находится внутри цикла do-while . Т.к. на конструкцию if оператор break не действует, то ближайшим оператором, в котором он находится, является цикл do-while . Поэтому в этом случае break завершает цикл.

Оператор continue

Данный оператор применяется только внутри циклов. Он позволяет прервать текущую итерацию цикла. После того, как компьютер встречает оператор continue , он завершает исполнение тела цикла и переходит к проверке условия (в циклах while и do-while ) или к изменению счётчика (выражение 3 в цикле for ).

В нашей программе он используется для того, чтобы не учитывать плохие ходы. Например, пользователь ввёл число 2 . Программа выдаёт ему сообщение об ошибке и сразу же переходит к проверке условия. При этом все команды ниже пропускаются, а значит не увеличивается счётчик ходов, и не проверяется превышение предела в 50 ходов на игру. Если здесь убрать оператор, то после вывода сообщения об ошибке тело цикла продолжит выполняться дальше и увеличится счётчик ходов.

Зацикливание

Иногда бывает так, что условие, при котором работа цикла должна прекратиться, никогда не выполняется. В таких случаях говорят, что программа «зациклилась» .

Зачастую это происходит при использовании циклов do-while и while .

Пример: программа сложения пяти введённых чисел.

На первый взгляд всё верно, но попробуйте скомпилировать и запустить эту программу. Вы заметите, что она не спешит останавливаться после того, как мы ввели первые пять чисел.

Когда мы используем эти циклы, необходимо внимательно отслеживать, что переменные, входящие в условия цикла, в теле цикла хоть как-то изменяются.

В нашем примере допущена именно такая ошибка. Условие записано верно, переменная k (счётчик считанных чисел) объявлена и инициализирована, но внутри тела цикла мы забыли её увеличить. Поэтому нашему условию окончания цикла k < 5 не суждено стать истинным.

Не всегда подобные ошибки так очевидны, как в нашем случае. Поэтому будьте внимательны, когда используете циклы с условиями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *