Перейти к содержимому

Как остановить цикл while c

  • автор:

Циклы в языке C

Прежде, чем изучать циклы, следует познакомиться с часто используемым в языке C способом увеличения/уменьшения значений переменных на единицу. Конечно, в C работают такие формы изменения значений как, например, a += 1 или a -= 1. Однако чаще используют операции инкрементирования (оператор инкремента «++») и декрементирования (оператор декремента «—«): i++ или ++i, i— или —i. В результате этих операций переменные увеличиваются или уменьшаются на единицу.

Запомните, когда вы видите выражения типа ++i или i++, то в результате их выполнения значение i меняется. Не надо делать вот так: i = ++i. Это совершенно лишнее.

Когда знак инкремента или декремента стоит перед переменной, то перед нами префиксная форма операции (++i, —i), а когда после переменной, то постфиксная форма (i++, i—). Когда эти выражения не участвуют в построении более сложных выражений, то между префиксной и постфиксной формами никакой разницы нет: что i++, что ++i — без разницы, в результате мы получим значение i на единицу больше.

Однако когда эти выражения участвуют в построении более сложных, то разница между префиксной и постфиксной формами появляется и заключается в следующем: переменная над которой производится операция инкрементирования или декрементирования в постфиксной форме сначала используется в сложном выражении как есть, и только потом увеличивается на единицу; если мы имеем дело с префиксной формой, то переменная сначала изменяется, а затем используется. Например, код:

int a, b, c, d; /* выражение означает, что всем переменным присваивается 0 */ a = b = c = d = 0; printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); c = ++a; d = b++; printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d);

, выведет на экране:

a=0, b=0, c=0, d=0 a=1, b=1, c=1, d=0

Объясняется такой результат так:

  • значение переменной a было увеличено на единицу, после чего это значение было присвоено переменной c;
  • значение переменной b было сначала присвоено переменной d и только потом увеличено на единицу.

Еще один пример:

int x, y; x = y = 0; printf("%d\n", x++ > 0); printf("%d\n", ++y > 0);

На экране будет выведено:

Это результат логических выражений, где 0 означает ложь, а 1 — истину. В данном случае, когда x сравнивается с нулем, то его значение еще не увеличено, а когда сравнивается у, то его значение уже больше нуля.

Применять операторы инкремента и декремента можно также к переменным вещественного типа.

Цикл while

Цикл while в языке программирования C работает также как и в других языках программирования. По аналогии с условным выражением в инструкции if, условное выражение при while заключается в круглые скобки. Если тело цикла включает несколько выражений разделяемых точкой с запятой, то все тело заключается в фигурные скобки.

  1. Присвойте переменной star значение 0. Пока значение star не достигнет 55 выводите на экран в строку по одной звездочке (*).
  2. С помощью цикла while запрограммируйте вывод на экран цифровых кодов и значений таблицы символов ASCII от 31 до 127 включительно. При этом после каждого десятого символа осуществляйте переход на новую строку. (Подсказка: чтобы переходить на новую строку, в цикле while надо использовать инструкцию if , в условии которой остаток 1 от деления на 10 сравнивается с нулем.) Вывод таблицы ASCII с помощью цикла whileВывод таблицы ASCII с помощью цикла while
  3. Используя внешний и вложенный циклы while организуйте вывод таблицы умножения на экран. Вывод таблицы умножения с помощью цикла while

1 Операция нахождения остатка от деления в языке C обозначается знаком процента (%).

Цикл do-while

Цикл do-while отличается от while лишь тем, что его тело будет выполнено хотя бы один раз независимо от условия выполнения цикла. Синтаксис цикла do-while можно описать так (фигурные скобки можно опустить, если выражение только одно):

do < выражение1; …; >while (логич_выражение);

Этот цикл называют циклом с постусловием. Его используют намного реже обычного while. В принципе почти всегда можно обойтись без него, но в определенных ситуациях его использование упрощает код. Допустим требуется вывести на экран отдельные цифры числа. Любое число состоит хотя бы из одной цифры, даже число 0. Можно решить эту задачу с использованием цикла while:

while (a > 0) { printf("%d\n", a % 10); a = a / 10; }

Но в этом случае, если a равно 0, то цикл не выполнится ни разу. Пришлось бы перед циклом использовать инструкцию if, в которой сравнивать переменную с 0. Использование же цикла do-while решает эту проблему, т. к. его тело один раз выполнится даже при нулевом значении переменной:

do { printf("%d\n", a % 10); a = a / 10; } while (a > 0);

Цикл for

Представим синтаксис заголовка цикла for языка программирования C так:

for (часть1; часть2; часть3)

Заголовок цикла for включает три части, разделенных точкой с запятой; причем каждая часть может быть сложной, т. е. состоять из нескольких выражений, разделенных простой запятой. В первой части обычно указываются переменные и часто их начальные значения; во второй – с помощью логического(их) выражения(й) задаются условия, при которых выполняется тело цикла; в третью часть помещаются выражения, которые выполняются в конце каждой итерации цикла (чаще всего здесь изменяется значение переменной, заданной в первой части заголовка).

Вот так будет выглядеть программный код, выводящий таблицу символов на экран, в котором используется цикл for:

unsigned char a; for (a = 31; a  128; a++) { if (a % 10 == 0) printf("\n"); printf("%4d-%c", a, a); } printf("\n");

Напишите программу с использованием цикла for, выводящую на экран таблицу умножения (Подсказка: как и в случае с while следует использовать два цикла — внешний и вложенный.)

Операторы break и continue

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

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

#define N 10 int arr[N] = {6, 5, -4, 3, -7, 2, 7, 0, 3, 9}; int new_arr[N], i, j; for (i=0; iN; i++) { if (arr[i] == 0) { printf("\nIt contains zero"); break; } // не обязательно printf("%d ", arr[i]); } printf("\n");

Второй пример. Требуется из одного массива скопировать в другой только числа, которые больше 0. Можно с помощью continue прерывать итерацию цикла, если очередной элемент меньше либо равен нулю.

for(i=0, j=0; iN; i++) { if (arr[i]  0) continue; new_arr[j] = arr[i]; printf("%d ", new_arr[j]); j++; } printf("\n");

В данном случае использование continue совсем не очевидно с точки зрения надобности, т. к. легко можно обойтись без него, если изменить условие при if на противоположное, удалить continue, а оставшийся код поместить в тело оператора if.

Курс с решением части задач:
pdf-версия

как остановить цикл ?

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

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как остановить цикл?
#include <iostream> #include <algorithm> #include <math.h> using namespace std; int main() < .

Как остановить цикл при прекращении ввода
Как остановить цикл, если не было введено числа(2 раза нажать Enter )? #include<iostream> using.

Как остановить цикл при окончании строки string
Пробую разделять на слова, разделенные пробелом строку string. Внутренний код цикла работает.

Эксперт С++

5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448

Если a — это целочисленная переменная:

1 2 3 4
do { /* . */ } while(a != 0);

Но будет плохо реагировать на неверный ввод.

Добавлено через 15 минут
Предыдущий вариант немного неправильный. Надо так:

1 2 3 4 5 6 7 8 9 10 11
do{ cout"vvedite celoe chislo: "endl; cin>>a; if(a == 0) break; for(i=0; i47; i++) if (a%mas[i]==0) cout"prostie mnozhiteli chisla a: "mas[i]endl; } while(true);

Регистрация: 18.07.2013
Сообщений: 382

1 2 3 4 5 6 7 8 9 10 11
do{ cout"vvedite celoe chislo: "endl; cin>>a; if(a == 0) break; for(i=0; i47; i++) if (a%mas[i]==0) cout"prostie mnozhiteli chisla a: "mas[i]endl; } while(true);

А как в билдере (делфи) остановить цикл?
У меня идет цикл (for, repeat — думаю неважно).
Можно как-то по кнопке на форме затормозить, чтобы типа цикл закончился принудительно. Подскажите пожалуйста!
Спасибо!

Почетный модератор

Эксперт С++

5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907

ЦитатаСообщение от PierL Посмотреть сообщение

чтобы типа цикл закончился принудительно

1) Выполните его условие;
2) Оператором break можно принудительно выйти из одиночного цикла;
3) Конструкцией goto label можно принудительно выйти из вложенных циклов;
4) Разделы по билдеру и делфи специально созданы, чтобы обсуждать именно там их специфику. Учтите это пожалуйста на будущее и вопросы относящиеся не к языку, а к среде задавайте в соответствующих разделах.

Регистрация: 18.07.2013
Сообщений: 382

ЦитатаСообщение от SatanaXIII Посмотреть сообщение

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

Понятно, извиняюсь.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Остановить цикл ввода последовательности, если введенное значение равно нулю.
В простую переменную последовательно вводятся числа. Окончание ввода 0. Сколько чисел больше своих.

Как остановить цикл while?
private void button1_Click(object sender, EventArgs e) < int index =.

Как остановить цикл each?
Подскажите, как остановить полностью цикл each? Получается остановить только отдельную итерацию.

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

BREAK

Оператор break имеет два назначения. Первое — это окончание работы оператора switch. Второе — это принудительное окончание цикла, минуя стандартную проверку условия. Данное назначение здесь и рассматривается. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом. Например:

Данная программа выводит числа от 0 до 10 включительно и заканчивает работу, поскольку break вызывает немедленный выход из цикла, минуя условие t< 100.

Оператор break, как правило, используется в циклах, где особые условия могут вызвать немедленное завершение работы. Ниже приведен пример того, как нажатие на клавишу может остановить выполнение функции look_up():

int look_up(char *name)
char tname[40];
int loc;
loc = -1;
do
loc = read_next_name(tname);
if(kbhit ()) break;
>
while(!strcmp(tname, name));
return loc;
>

Можно использовать функции такого типа для поиска имени в файле базы данных. Если файл слишком длинный и надоело ждать, то можно нажать на клавишу и выйти из функции до окончания работы. Функция kbhit() возвращает 0, если не было нажатия. В противоположном случае она возвращает ненулевое значение, break вызывает выход из самого внутреннего цикла. Например:

выводит числа от 1 до 10 включительно 100 раз. Каждый раз, когда встречается break, контроль передается внешнему циклу for.

break, используемый в операторе switch, влияет только на данный switch, но не на цикл, в котором может находиться switch.

Выход из цикла while

Просто не надо создавать два глухих цикла (и интересно — почему снаружи while , а внутри for ?), если всё-таки из них предполагается когда-то выйти. И переменные для проверки условия продолжения цикла — самый нормальный способ.

9 июн 2015 в 16:35
Старый эпический топик (больше 1000 постов) на эту тему — rsdn.ru/forum/philosophy/57977.flat.1
9 июн 2015 в 19:11

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

К сожалению, в отличие от Джавы, C и C++ не поддерживают механизм вроде break label , поэтому самый чистый вариант — использовать goto:

int main() < while (true) < for (;;) < goto breakAll; >> breakAll: puts("I'm out!"); > 

Также можно использовать флаг:

int main() < bool running = true; // bool определен в stdbool.h while (running) < for (;;) < running = false; break; >> puts("I'm out!"); > 

Большой разницы между этими вариантами нет.

Помимо этого случая, goto также используется в хорошем стиле C для обработки ошибок:

bars_t foo() < bar_t *bar1 = malloc(sizeof(*bar1)); if (!bar1) < goto cleanupNothing; >bar_t *bar2 = malloc(sizeof(*bar2)); if (!bar2) < goto cleanupBar1; >// . return (bars_t) < .one = bar1, .two = bar2 >; // в обратном порядке определения cleanupBar2: free(bar2); cleanupBar1: free(bar1); cleanupNothing: return (bars_t); > 

В C++ подобное не нужно, т.к. есть RAII, но из циклов по-прежнему выходят через goto .

Отслеживать
ответ дан 9 июн 2015 в 16:11
Alexei Averchenko Alexei Averchenko
1,049 6 6 серебряных знаков 11 11 бронзовых знаков
А тут, кстати, много меток и не надо, ибо free() лопает и NULL 🙂
9 июн 2015 в 16:21

Ещё добавлю пару способов.

Указанный код выносится в отдельную функцию. И теперь можно выходить по обычному return .

Способ два — нужно прост создать переменную флаг. И проверять ее. Где то так

bool go = true; while(go) < for(;;) < if (. ) < go = false; break;>> 

Но это плохой способ.

Отслеживать
ответ дан 9 июн 2015 в 16:19
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
Самый нормальный способ.
9 июн 2015 в 16:35
более того, он выходит с циклов любой вложенности:)
9 июн 2015 в 16:36

try < while (true) < for (;;) < throw 1; >> > catch (int) < //вышли из двух вечных циклов одновременно >

Отслеживать
32k 19 19 золотых знаков 79 79 серебряных знаков 105 105 бронзовых знаков
ответ дан 9 июн 2015 в 16:13
175 6 6 бронзовых знаков
Какая-то эзотерика
9 июн 2015 в 16:16
Исключения следует использовать для исключительных ситуаций.
9 июн 2015 в 18:00

«Исключения следует использовать для исключительных ситуаций» — а разве выход сразу из двух вечных циклов это не исключительная ситуация?

9 июн 2015 в 18:02

@outcast: Нет. Это вполне обычная ситуация. Исключительная не значит «мне ни разу не попадалась», значит «в программе должна возникать в виде исключения, а не правила».

9 июн 2015 в 20:01

Выход из 2-х! бесконечных циклов это правило? Вот это да, никогда бы не подумал 🙂 Как не трудно заметить все альтернативные варианты либо предполагают изменение циклов, что очевидно противоречит изначальному условию (один из них перестает быть бесконечным), либо выглядят крайне сомнительно (вариант с goto). За исключением варианта с вынесением внутреннего цикла в отдельную функцию и пары return false/break, но это усложнит программу добавив в нее еще 1 сущность.

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

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