Как вернуться в начало программы на любом языке программирования?

Важной частью процесса создания программы является способность организовывать логику ее выполнения и, при необходимости, вернуться в начало программы. Этот процесс может потребоваться в различных сценариях, например, для обработки ошибок, выполнения повторных итераций или просто для создания интерактивных приложений. В этой статье мы рассмотрим различные способы возврата к началу программы на различных языках программирования. Мы рассмотрим использование циклов, условных операторов и других инструментов, которые помогут вам эффективно управлять потоком выполнения вашей программы и делать ее более гибкой и интерактивной.
Теория
Для возврата к началу программы на любом популярном языке программирования вы можете использовать циклы, такие как for, while или do-while, либо оператор goto. Однако использование оператора goto не рекомендуется, так как он может делать код менее читаемым и управляемым, и может привести к проблемам с поддержкой и отладкой. Рекомендуется использовать циклы и условные операторы для организации логики вашей программы.
Ниже представлены примеры использования цикла while для создания бесконечного цикла, который может быть прерван с помощью условия. В этих примерах программа будет выполняться до тех пор, пока переменная равна true. Как только пользователь введет «нет» в ответ на вопрос, программа завершит выполнение и выйдет из цикла. Вы можете изменить логику внутри цикла в зависимости от ваших потребностей.
C++
Этот код на языке C++ представляет собой простую программу, которая выполняет цикл, позволяя пользователю решать, хочет ли он продолжить выполнение программы или завершить ее.
#include int main() < bool continueProgram = true; while (continueProgram) < // Ваш код здесь std::cout > continueProgram; if (!continueProgram) < std::cout > return 0; >
Давайте разберем, что делает каждая часть кода:
Это объявление переменной continueProgram, которая имеет тип bool (логический тип данных) и инициализируется значением true. Эта переменная будет использоваться для управления выполнением программы.
bool continueProgram = true;
Это цикл while, который выполняется, пока значение переменной continueProgram равно true. Внутри этого цикла находится блок кода, который будет выполняться повторно, пока пользователь не решит завершить программу.
while (continueProgram)
Этот код выводит на экран сообщение, предлагая пользователю выбрать, хочет ли он продолжить выполнение программы.
std::coutЭтот код считывает ввод пользователя и сохраняет его в переменную continueProgram. Если пользователь введет 1, то continueProgram останется равным true, и программа продолжит выполнение. Если пользователь введет 0, то continueProgram станет равным false, и цикл завершится.
std::cin >> continueProgram;Это условный оператор if, который проверяет, если значение continueProgram равно false, т.е., если пользователь выбрал завершить программу, то выводится сообщение «Программа завершена.».
if (!continueProgram)Таким образом, программа будет продолжать выполняться до тех пор, пока пользователь не введет 0 (то есть пока не введен 0 программа будет возвращаться в начало), после чего она завершится.
C#
using System; class Program < static void Main() < bool continueProgram = true; while (continueProgram) < // Ваш код здесь Console.Write("Хотите продолжить? (да/нет): "); string input = Console.ReadLine(); if (input.ToLower() != "да") < continueProgram = false; Console.WriteLine("Программа завершена."); >> > >Python
Рассмотрим пример, как можно вернуться в начало программы на Python.
while True: # Ваш код здесь response = input("Хотите продолжить? (да/нет): ") if response.lower() != "да": print("Программа завершена.") break # Выход из бесконечного циклаЕсли пользователь вводит что-то отличное от «да», программа завершит выполнение и выйдет из цикла с помощью оператора break.
Java
import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); String response; while (true) < // Ваш код здесь System.out.print("Хотите продолжить? (да/нет): "); response = scanner.next(); if (!response.equalsIgnoreCase("да")) < System.out.println("Программа завершена."); break; // Выход из бесконечного цикла >> > >Pascal
program StartOverDemo; var ContinueProgram: Boolean; Response: string; begin ContinueProgram := True; while ContinueProgram do begin // Ваш код здесь Write('Хотите продолжить? (да/нет): '); Readln(Response); if not SameText(Response, 'да') then begin ContinueProgram := False; Writeln('Программа завершена.'); end; end; end.JavaScript
let continueProgram = true; while (continueProgram) < // Ваш код здесь let response = prompt('Хотите продолжить? (да/нет)'); if (response && response.toLowerCase() !== 'да') < continueProgram = false; alert('Программа завершена.'); >>Циклы в программировании. Цикл while
Циклы являются такой же важной частью структурного программирования, как условные операторы. С помощью циклов можно организовать повторение выполнения участков кода. Потребность в этом возникает довольно часто. Например, пользователь последовательно вводит числа, и каждое из них требуется добавлять к общей сумме. Или нужно вывести на экран квадраты ряда натуральных чисел и тому подобные задачи.
Цикл while
"While" переводится с английского как "пока". Но не в смысле "до свидания", а в смысле "пока имеем это, делаем то".
Можно сказать, while является универсальным циклом. Он присутствует во всех языках, поддерживающих структурное программирование, в том числе в Python. Его синтаксис обобщенно для всех языков можно выразить так:
while логическое_выражение
Это похоже на условный оператор if . Однако в случае циклических операторов их тела могут выполняться далеко не один раз. В случае if , если логическое выражение в заголовке возвращает истину, то тело выполняется единожды. После этого поток выполнения программы возвращается в основную ветку и выполняет следующие выражения, расположенные ниже всей конструкции условного оператора.
В случае while , после того как его тело выполнено, поток возвращается к заголовку цикла и снова проверяет условие. Если логическое выражение возвращает истину, то тело снова выполняется. Потом снова возвращаемся к заголовку и так далее.
Цикл завершает свою работу только тогда, когда логическое выражение в заголовке возвращает ложь, то есть условие выполнения цикла больше не соблюдается. После этого поток выполнения перемещается к выражениям, расположенным ниже всего цикла. Говорят, "происходит выход из цикла".
Рассмотрите блок-схему цикла while .
На ней ярко-голубыми прямоугольниками обозначена основная ветка программы, ромбом – заголовок цикла с логическим выражением, бирюзовым прямоугольником – тело цикла.
С циклом while возможны две исключительные ситуации:
- Если при первом заходе в цикл логическое выражение возвращает False , то тело цикла не выполняется ни разу. Эту ситуацию можно считать нормальной, так как при определенных условиях логика программы может предполагать отсутствие необходимости в выполнении выражений тела цикла.
- Если логическое выражение в заголовке while никогда не возвращает False , а всегда остается равным True , то цикл никогда не завершится, если только в его теле нет оператора принудительного выхода из цикла ( break ) или вызовов функций выхода из программы – quit() , exit() в случае Python. Если цикл повторяется и повторяется бесконечное количество раз, то в программе происходит зацикливание. В это время она зависает и самостоятельно завершиться не может.
Вспомним наш пример из урока про исключения. Пользователь должен ввести целое число. Поскольку функция input() возвращает строку, то программный код должен преобразовать введенное к целочисленному типу с помощью функции int() . Однако, если были введены символы, не являющиеся цифрами, то возникает исключение ValueError , которое обрабатывается веткой except . На этом программа завершается.
Другими словами, если бы программа предполагала дальнейшие действия с числом (например, проверку на четность), а она его не получила, то единственное, что программа могла сделать, это закончить свою работу досрочно.
Но ведь можно просить и просить пользователя корректно вести число, пока он его не введет. Вот как может выглядеть реализующий это код:
n = input("Введите целое число: ") while type(n) != int: try: n = int(n) except ValueError: print("Неправильно ввели!") n = input("Введите целое число: ") if n % 2 == 0: print("Четное") else: print("Нечетное")
Примечание 1. Не забываем, в языке программирования Python в конце заголовков сложных инструкций ставится двоеточие.
Примечание 2. В выражении type(n) != int с помощью функции type() проверяется тип переменной n . Если он не равен int , то есть значение n не является целым числом, а является в данном случае строкой, то выражение возвращает истину. Если же тип n равен int , то данное логическое выражение возвращает ложь.
Примечание 3. Оператор % в языке Python используется для нахождения остатка от деления. Так, если число четное, то оно без остатка делится на 2, то есть остаток будет равен нулю. Если число нечетное, то остаток будет равен единице.
Проследим алгоритм выполнения этого кода. Пользователь вводит данные, они имеют строковый тип и присваиваются переменной n . В заголовке while проверяется тип n . При первом входе в цикл тип n всегда строковый, то есть он не равен int . Следовательно, логическое выражение возвращает истину, что позволяет зайти в тело цикла.
Здесь в ветке try совершается попытка преобразования строки к целочисленному типу. Если она была удачной, то ветка except пропускается, и поток выполнения снова возвращается к заголовку while .
Теперь n связана с целым числом, следовательно, ее тип int , который не может быть не равен int . Он ему равен. Таким образом логическое выражение type(n) != int возвращает False , и весь цикл завершает свою работу. Далее поток выполнения переходит к оператору if-else, находящемуся в основной ветке программы. Здесь могло бы находиться что угодно, не обязательно условный оператор.
Вернемся назад. Если в теле try попытка преобразования к числу была неудачной, и было выброшено исключение ValueError , то поток выполнения программы отправляется в ветку except и выполняет находящиеся здесь выражения, последнее из которых просит пользователя снова ввести данные. Переменная n теперь имеет новое значение.
После завершения except снова проверяется логическое выражение в заголовке цикла. Оно даст True , так как значение n по-прежнему строка.
Выход из цикла возможен только тогда, когда значение n будет успешно конвертировано в число.
Рассмотрим следующий пример:
total = 100 i = 0 while i 5: n = int(input()) total = total - n i = i + 1 print("Осталось", total)
Сколько раз "прокрутится" цикл в этой программе, то есть сколько итераций он сделает? Ответ: 5.
- Сначала переменная i равна 0. В заголовке цикла проверяется условие i < 5 , и оно истинно. Тело цикла выполняется. В нем меняется значение i , путем добавления к нему единицы.
- Теперь переменная i равна 1. Это меньше пяти, и тело цикла выполняется второй раз. В нем i меняется, ее новое значение 2.
- Два меньше пяти. Тело цикла выполняется третий раз. Значение i становится равным трем.
- Три меньше пяти. На этой итерации i присваивается 4.
- Четыре по прежнему меньше пяти. К i добавляется единица, и теперь ее значение равно пяти.
"Смысловая нагрузка" данного цикла – это последовательное вычитание из переменной total вводимых чисел. Переменная i в данном случае играет только роль счетчика итераций цикла. В других языках программирования для таких случаев предусмотрен цикл for , который так и называется: "цикл со счетчиком". Его преимущество заключается в том, что в теле цикла не надо изменять переменную-счетчик, ее значение меняется автоматически в заголовке for .
В языке Python тоже есть цикл for . Но это не цикл со счетчиком. В Питоне он предназначен для перебора элементов последовательностей и других сложных объектов. Данный цикл и последовательности будут изучены в последующих уроках.
Для while наличие счетчика не обязательно. Представим, что надо вводить числа, пока переменная total больше нуля. Тогда код будет выглядеть так:
total = 100 while total > 0: n = int(input()) total = total - n print("Ресурс исчерпан")
Сколько раз здесь выполнится цикл? Неизвестно, все зависит от вводимых значений. Поэтому у цикла со счетчиком известно количество итераций, а у цикла без счетчика – нет.
Самое главное для цикла while – чтобы в его теле происходили изменения значений переменных, которые проверяются в его заголовке, и чтобы хоть когда-нибудь наступил случай, когда логическое выражение в заголовке возвращает False . Иначе произойдет зацикливание.
Примечание 1. Не обязательно в выражениях total = total - n и i = i + 1 повторять одну и ту же переменную. В Python допустим сокращенный способ записи подобных выражений: total -= n и i += 1 .
Примечание 2. При использовании счетчика он не обязательно должен увеличиваться на единицу, а может изменяться в любую сторону на любое значение. Например, если надо вывести числа кратные пяти от 100 до 0, то изменение счетчика будет таким i = i - 5 , или i -= 5 .
Примечание 3. Для счетчика не обязательно использовать переменную с идентификатором i . Можно назвать переменную-счетчик как угодно. Однако так принято в программировании, что счетчики обозначают именами i и j (иногда одновременно требуются два счетчика).
Практическая работа
- Измените последний код из урока так, чтобы переменная total не могла уйти в минус. Например, после предыдущих вычитаний ее значение стало равным 25. Пользователь вводит число 30. Однако программа не выполняет вычитание, а выводит сообщение о недопустимости операции, после чего осуществляет выход из цикла.
- Используя цикл while , выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как ** . Фрагмент вывода:
. 32 64 128 256 512 1024 .
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
break, continue, pass#
В Python есть несколько операторов, которые позволяют менять поведение циклов по умолчанию.
Оператор break#
Оператор break позволяет досрочно прервать цикл:
- break прерывает текущий цикл и продолжает выполнение следующих выражений
- если используется несколько вложенных циклов, break прерывает внутренний цикл и продолжает выполнять выражения, следующие за блоком * break может использоваться в циклах for и while
Пример с циклом for:
In [1]: for num in range(10): . : if num 7: . : print(num) . : else: . : break . : 0 1 2 3 4 5 6
Пример с циклом while:
In [2]: i = 0 In [3]: while i 10: . : if i == 5: . : break . : else: . : print(i) . : i += 1 . : 0 1 2 3 4
Использование break в примере с запросом пароля (файл check_password_with_while_break.py):
username = input('Введите имя пользователя: ') password = input('Введите пароль: ') while True: if len(password) 8: print('Пароль слишком короткий\n') elif username in password: print('Пароль содержит имя пользователя\n') else: print('Пароль для пользователя <> установлен'.format(username)) # завершает цикл while break password = input('Введите пароль еще раз: ')
Теперь можно не повторять строку password = input('Введите пароль еще раз: ') в каждом ответвлении, достаточно перенести ее в конец цикла.
И, как только будет введен правильный пароль, break выведет программу из цикла while.
Оператор continue#
Оператор continue возвращает управление в начало цикла. То есть, continue позволяет «перепрыгнуть» оставшиеся выражения в цикле и перейти к следующей итерации.
Пример с циклом for:
In [4]: for num in range(5): . : if num == 3: . : continue . : else: . : print(num) . : 0 1 2 4
Пример с циклом while:
In [5]: i = 0 In [6]: while i 6: . : i += 1 . : if i == 3: . : print("Пропускаем 3") . : continue . : print("Это никто не увидит") . : else: . : print("Текущее значение: ", i) . : Текущее значение: 1 Текущее значение: 2 Пропускаем 3 Текущее значение: 4 Текущее значение: 5 Текущее значение: 6
Использование continue в примере с запросом пароля (файл check_password_with_while_continue.py):
username = input('Введите имя пользователя: ') password = input('Введите пароль: ') password_correct = False while not password_correct: if len(password) 8: print('Пароль слишком короткий\n') elif username in password: print('Пароль содержит имя пользователя\n') else: print('Пароль для пользователя <> установлен'.format(username)) password_correct = True continue password = input('Введите пароль еще раз: ')
Тут выход из цикла выполнятся с помощью проверки флага password_correct. Когда был введен правильный пароль, флаг выставляется равным True, и с помощью continue выполняется переход в начало цикла, перескочив последнюю строку с запросом пароля.
Результат выполнения будет таким:
$ python check_password_with_while_continue.py Введите имя пользователя: nata Введите пароль: nata12 Пароль слишком короткий Введите пароль еще раз: natalksdjflsdjf Пароль содержит имя пользователя Введите пароль еще раз: asdfsujljhdflaskjdfh Пароль для пользователя nata установлен
Оператор pass#
Оператор pass ничего не делает. Фактически, это такая заглушка для объектов.
Например, pass может помочь в ситуации, когда нужно прописать структуру скрипта. Его можно ставить в циклах, функциях, классах. И это не будет влиять на исполнение кода.
Пример использования pass:
In [6]: for num in range(5): . : if num 3: . : pass . : else: . : print(num) . : 3 4
Как вернуться в самое начало цикла?

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

7EVENx @7EVENx Автор вопроса
edward_freedom, на ютубе показаны примеры только как по сообщению вывести чтото типо пока, привет, а как работать с дальнейшими командами - нет, где это можно найти? только по документации работать сложно

7EVENx @7EVENx Автор вопроса
Illia Nezhyhai, тот же вопрос к Вам
заменить while true на чо нибудь более разумное.

7EVENx @7EVENx Автор вопроса
ввести флаг по которому будет продолжаться цикл. При вводе команды "задолбал" вместо числа для перевода флаг сбрасывается. После сброса флага сразу break.
А лучше плюнь на все это и займись тем, что у тебя действительно получается.
Я не совсем сварщик, но ИМХО, тут нужно писать зацикленный обработчик сообщений с изменяющимся (в зависимости от команд пользователя) состоянием.

7EVENx @7EVENx Автор вопроса
lz961, представь бы тебе сказали плюнь на это, когда ты учился программировать
так вы ведь не учитесь, а ерундой страдаете. Освойте сначала базовые вещи, погуглите, что такое "автоматная программа" например, где то потом разберите API VK и только после этого сочиняйте ботов.

edward_freedom @edward_freedom
7EVENx, ты как то не так начал учиться. Ты прочитал книги, освоил всю теорию?
7EVENx, Проблема в том, что евент бейсед это не совсем просто и тут надо иметь знания, и понимание как можно что-то состряпать, по коду же видно, что этого понимания нет. Тебе надо писать обработчики событий которые будут обрабатывать то, что возвращает longpoll.listen() ну и соответственно хранить как, какие, и от кого события нужно обрабатывать.
А уроки надо не на ютубе искать, а читать статьи и книжки
7EVENx, Ниразу не писал бота для вк, но на, раз уж тут на тебя напали и задизморалили, то вот я тебе написал как бы я это делал если бы пришлось писать бота для вк, может быть тебе это поможет. Но как тебе уже писали, нужна база, сразу за сложные вещи браться это не дело.
STATE_CONVERT_CC = 1 STATE_WAIT_CURRENT_CC = 2 STATE_WAIT_NEW_CC = 3 cc_convert = <> def change_cc(peer_id, text): state = cc_convert[peer_id]["state"] if state == STATE_CONVERT_CC: cc_num(peer_id, text) elif state == STATE_WAIT_CURRENT_CC: current_cc(peer_id, text) elif state == STATE_WAIT_NEW_CC: new_cc(peer_id, text) def cc_num(peer_id, text): if text.isdigit(): cc_convert[peer_id]["number"] = int(text) cc_convert[peer_id]["state"] = STATE_WAIT_CURRENT_CC write_msg(event.peer_id, 'Введите изначальную CC') def current_cc(peer_id, text): if text.isdigit(): cc_convert[peer_id]["from_cc"] = int(text) cc_convert[peer_id]["state"] = STATE_WAIT_NEW_CC write_msg(event.peer_id, 'Введите CC, в которую нужно перевести число') def new_cc(peer_id, text): if text.isdigit(): to_cc = int(text) from_cc = cc_convert[peer_id]["from_cc"] number = cc_convert[peer_id]["number"] result = convert_base(number, to_cc, from_cc) cc_convert.pop(peer_id) write_msg(peer_id, result) # . # MAIN for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: request = event.text if request.lower() == "привет": write_msg(event.user_id, "Здравствуй!") elif request.lower() == "пока": write_msg(event.user_id, "Пока((") elif request.lower() == "спасибо": write_msg(event.user_id, "Всегда пожалуйста!") elif request in set(commands_later): write_msg(event.user_id, 'Скоро все будет)') elif request in set(commands): peer_id = event.peer_id if peer_id not in cc_convert: cc_convert[peer_id] = write_msg(event.peer_id, 'Введите число для перевода в другую CC') else: change_cc(peer_id, event.text)
