C Урок 18. Инструкции break, continue, оператор goto и метки



Составляя алгоритм нашего проекта, порой нам хочется, а иногда и это и необходимо, повлиять на ход программы во время её выполнения каким-то нестандартным образом: досрочно выйти из тела условия или цикла, пропустить итерацию в цикле, а также перейти вообще в любое место программы. Для этого существуют определённые инструменты — это инструкции break, continue, а также оператор goto.

break — это инструкция, которая вызывает немедленный выход из самого внутреннего из окружающих её циклов.

 

 

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

continue — инструкция, которая заставляет цикл, в теле которого она используется, прервать текущую итерацию и начать новую.

 

 

Данная инструкция используется реже, чем break.

goto — инструкция, позволяющая совершить переход в то место программы, в котором установлена метка, имя которой следует сразу же после оператора goto.

Метка — это идентификатор, за которым следует двоеточие, обозначающий место в программе, на которое можно перейти с помощью инструкции goto из любого места программы.

 

 

Вообще, советуют избегать данного оператора при составлении программ. Но могут вполне возникать такие ситуации, что без него будет не обойтись.

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

Проект сделан был из проекта MYPROG17 прошлого занятия и имя ему было присвоено MYPROG18.

Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это

 

int main()

{

   return 0; //Return an integer from a function

}

 

Функции int_to_binary, my_div и my_sum удалим вместе с телами, также удалим все макросы.

Попробуем в нашем коде сочинить что-то наподобие меню.

В функции main() добавим небольшой строковый массив

 

 

Добавим вот такой бесконечный цикл, который, как мы теперь знаем, с помощью инструкций goto и break в любой момент может стать конечным

 

 

Так как мы теперь уже много чего знаем в программировании, мы можем уже составлять код более осмысленный, поэтому давайте проверим, во-первых, то, что пользователь ввёл только один символ, а не больше, ну и не меньше (хотя, признаться, я не знаю, как можно ввести меньше, может просто enter нажать).

 

 

Сначала добавим вот сюда метку

 

 

И, если пользователь ввёл не один символ, то перейдём на неё с помощью инструкции goto, сообщив об этом пользователю

 

 

Если пользователь ввёл один символ, то мы в данное условие не попадаем и продолжаем выполнять программу дальше.

А дальше мы проверим пользователя на то, что он ввёл корректный символ — цифру от 0 до 3. Это проверяется по кодам символов, которые мы можем не знать, поэтому просто используем апострофы, что и будет превращать наши циферки в их коды. Если пользователь ушел за диапазон, то мы отправим его на ту же метку и пусть вводит нормально

 

 

Если пользователь ввёл цифру 0, то выйдем из бесконечного цикла, а следовательно из программы. Также можно было вместо break использовать и return, но только в этом случае, потому что данная команда осуществляет выход не из тела цикла и условия, а из тела всей функции, в которой она вызывается. Поэтому не забывайте об этом

 

 

На остальные три вида символов, которые может ввести пользователь, у нас будет конструкция switch

 

 

Давайте проверим работу нашего кода, собрав его и запустив программу на выполнение.

Сначала попробуем ввести цифры от 1 до 3

 

 

Всё работает как надо. Попробуем теперь ввести более одного символа

 

 

Программа, выдав соответствующее сообщение, отфутболила нас куда следует.

 

 

Теперь попробуем ввести неправильный символ

 

 

Программа поступила аналогично.

Попробуем теперь выйти из программы, введя 0

 

 

Мы успешно вышли из программы, то есть, бесконечный цикл стал конечным.

Вот такое вот получилось меню, но это только главное меню, мы же не поупражнялись ещё с оператором continue.

Добавим выше функции main() вот такую функцию для реализации подчинённых меню

 

 

Пока здесь только заготовка. Прежде чем заняться наполнением тела данной функции, вызовем её в функции main() в конце бесконечного цикла

 

 

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

Вернёмся в функцию menu и добавим в неё бесконечный цикл, очень похожий на бесконечный цикл функции main

 

 

Основное отличие то, что мы вместо goto в проверочных условиях используем уже continue, который нас возвращает в начало цикла и опрос пользователя начинается сначала. А при вводе 0 мы фактически выйдем только из функции, но не из программы. Обычно так оно и нужно — из подчинённых меню как правило требуется возврат в главное. Если бы требовался выход из программы, можно было бы реализовать это с помощью возвращаемых значений из функции.

Проверим теперь входы в наши субменю. Например, войдём в меню 1, выберем там пункт 2 и выйдем из него

 

 

Теперь войдём в меню 2, выберем там пункт 3 и также с помощью ввода 0 вернёмся в главное меню

 

 

Теперь войдём в меню 3, выберем там пункт 1, с помощью ввода 0 вернёмся главное меню, а там с помощью ввода 0 выйдем из программы

 

 

Таким образом, данный урок нас научил пользоваться инструкциями break, continue, goto с метками, с помощью которых нам в практической части удалось организовать меню. Конечно, наше меню ничего особенного не делает, но оно уже вполне рабочее и его можно наполнять каким-то полезным кодом. Надеюсь, после данного занятия мы сможем в будущем плодотворно использовать данные инструкции.

Всех благодарю за внимание!

 

 

Предыдущий урок Программирование на C Следующий урок

 

Исходный код

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

C Инструкции break, continue, оператор goto и метки

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

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

*