Операторы цикла в языке Си

Язык Си / Операторы цикла в языке Си

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

  • блока проверки условия повторения цикла
  • тела цикла

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

  • while - цикл с предусловием;
  • do...while - цикл с постусловием;
  • for - параметрический цикл (цикл с заданным числом повторений).


Цикл с предусловием while

Общая форма записи

while(выражение) {
  блок операций;
}

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

Пример

int k=5;
int i=1;
int sum=0;
while(i <=k) {
 sum = sum + i;
 i++;
}

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

while(1) {
  блок операций;
}

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

Пример

int k=5;
int n=10;
while(k>n) {
 printf(" k=%d n=%d \n", k, n);
 k = k + 2;
}
Цикл с постусловием do...while

Общая форма записи

do {
  блок операций;
} while(выражение);

Цикл с постусловием

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

Использовать цикл do...while лучше использовать в тех случаях, когда должна быть выполнена хотя бы одна итерация, либо когда инициализация объектов, участвующих в проверке условия, происходит внутри тела цикла.

Пример. Ввести число от 0 до 10

#include <stdio.h>
#include <stdlib.h>
int main() {
  int num;
  system("chcp 1251");
  system("cls");
  do {
    printf("Введите число от 0 до 10: ");
    scanf("%d", &num);
  } while((num < 0) || (num > 10));
  printf("Вы ввели число %d", num);
  getchar(); getchar();
  return 0;
}

Результат работы программы:
Цикл do...while

Параметрический цикл for

Общая форма записи

for (инициализация параметра; проверка условия окончания; коррекция параметра) {
блок операций;
}

for — параметрический цикл (цикл с фиксированным числом повторений). Для организации такого цикла необходимо осуществить три операции:

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

Эти три операции записываются в скобках и разделяются точкой с запятой (;). Как правило, параметром цикла является целочисленная переменная.
Инициализация параметра осуществляется только один раз — когда цикл for начинает выполняться. Проверка условия окончания осуществляется перед каждым возможным выполнением тела цикла. Когда выражение становится ложным (равным нулю), цикл завершается. Коррекция параметра осуществляется в конце каждого выполнения тела цикла. Параметр может как увеличиваться, так и уменьшаться.

Пример

#include <stdio.h>
int main() {
  int num;
  for(num = 1; num < 5; num++)
      printf("num = %d\n",num);
  getchar();
  return 0;
}

Результат работы программы
Цикл for

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

#include <stdio.h>
int main() {
  int num = 1;
  for(; num < 5; num++)
      printf("num = %d\n",num);
  getchar();
  return 0;
}

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

#include <stdio.h>
int main() {
  int i,j;
  for(i = 1, j=2; i < 5; i++, j=j+2)
       printf("i = %d   j = %d\n",i,j);
  getchar();
  return 0;
}

Результат работы программы
Цикл for
В Си допускаются вложенные циклы, то есть когда один цикл находится внутри другого:

for ( i=0; i<n; i++)  {     // цикл 1
  for( j=0; j<n; j++) {  // цикл 2
    // блок операций цикла 2;
  }
 // блок операций цикла 1;
}

Пример: Вывести числа от 0 до 99

#include <stdio.h>
#include <stdlib.h>
int main() {
  unsigned int i,j;
  for(i=0; i<10; i++) {
    for(j=0; j<10; j++) {
      printf("%2d ",i*10+j);
    }
    printf("\n");    // перевод строки
  }
  getchar();
  return 0;
}

Результат выполнения
Вложенные циклы

Рекомендации по выбору цикла

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

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

В теле любого цикла можно использовать операторы break и continue. Оператор break позволяет выйти из цикла, не завершая его. Оператор continue позволяет пропустить часть операторов тела цикла и начать новую итерацию.

Пример: Вывести числа от 0 до 99 ниже главной диагонали

#include <stdio.h>
#include <stdlib.h>
int main() {
  unsigned int i,j;
  for(i=0; i<10; i++) {
    for(j=0; j<10; j++) {
      if(j>i)
        break;
      printf("%2d ",i*10+j);
    }
    printf("\n");
  }
  getchar();
  return 0;
}

Результат выполнения программы
Вложенные циклы
Пример: Вывести числа от 0 до 99 исключая числа, оканчивающиеся на 5 или 8

#include <stdio.h>
#include <stdlib.h>
int main() {
  unsigned int i,j;
  for(i=0; i<10; i++) {
    for(j=0; j<10; j++) {
      if((j==8) || (j==5)))
        continue;
      printf("%2d ",i*10+j);
    }
    printf("\n");
  }
  getchar();
  return 0;
}

Результат выполнения
Вложенные циклы

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

Оператор безусловного перехода goto

Общая форма записи

goto метка;
. . .
метка : операция;

Выполнение оператора goto вызывает передачу управления в программе операции, помеченной меткой. По сути метка является идентификатором адреса операции, которой должно быть передано управление. Для отделения метки от оператора используется двоеточие (:). Метка может располагаться в программе как до оператора goto, так и после . Имена меток образуются по тем же правилам, что и имена переменных.

Пример

#include <stdio.h>
int main() {
    int k=5;
M1: if(k<0)
      goto M2;
    printf("%d ",k);
    k--;
    goto M1;
M2: getchar();
    return 0;
}

Результат выполнения
Оператор goto
Назад


Назад: Язык Си

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

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