Операторы цикла и передачи управления

Операторы цикла задают многократное исполнение операторов тела цикла. Определены три разных оператора цикла:

· цикл с предусловием

while (выражение_условие)

тело_цикла;

· цикл с постусловием

do

тело_цикла

while (выражение_условие)

· цикл for

for (инициализация_цикла; выражение_условие; список_выражений)

тело_цикла

Тело_цикла не может быть описанием, это либо один (может быть и пустой) оператор, который всегда завершается точкой с запятой, либо блок операторов, заключенных в скобки {}. Выражение_условие – это выражение, определяющее условие продолжения итераций. Операторы тела цикла выполняются, пока условие истинно (не равно нулю). Инициализация_цикла в цикле for - это последовательность определений и выражений, разделяемых запятыми. Даже если она пустая, точка с запятой должна присутствовать. Чаще всего здесь устанавливается начальные значения счетчиков и параметров цикла. Выражения из списка_выражений выполняются после выполнения операторов тела цикла и до следующей проверки выражения_условия.

Приведем примеры, иллюстрирующие разные решения задачи нахождения суммы s квадратов первых k членов натурального ряда.

 

for (int i=1,s=0;i<=k; i++) s+=i*i;

for (int i=0,s=0;i<=k; s+=++i*i);// тело цикла - пустой оператор;

for (int i=0,s=0;i<=k;) s+=++i*i; //отсутствует список выражений;

for (int i=0,s=0;i<=k; ) {int j; j=++i; s+=j*j;}

 

Конструкцию for чаще применяют для организации детерминированных циклов, то есть циклов, число повторений которых заранее определено. А конструкции do и while чаще применяют для итерационных циклов, то есть циклов, число повторений которых зависит от выполнения условий, изменяющихся в теле цикла и заранее не определено. Хотя такое функциональное разделение довольно условно.

Каждый цикл может содержать вложенные циклы. Для принудительного выхода из цикла используется оператор break. Необходимость в его использовании возникает, когда условия продолжения итераций надо проверять не только в начале или конце итерации, но и в середине тела цикла. Например, если начальные значения переменных i,j таковы, что i<j, то следующий цикл определяет наименьшее целое, не меньшее их среднего арифметического.

 

while (i<j)

{ i++;

if (i==j) break;

j--;

}

 

Для i=0, j=3 результат i=j=2 достигается при выходе из цикла с помощью оператора break, а для i=0, j=2 результат i=j=1 достигается при естественном завершении цикла.

Массивы

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

Массивы могут состоять из арифметических данных, символов, строк, структур, указателей, файлов.

Массив - такая структура данных, которая характеризуется:

· фиксированным набором элементов одного и того же типа;

· каждый элемент имеет уникальный набор значений индексов;

· количество индексов определяют размерность массива, например, два индекса - двумерный массив, три индекса - трехмерный массив, один индекс - одномерный массив или вектор;

· обращение к элементу массива выполняется по имени массива и значениям индексов для данного элемента

Таким образом, объявление массива должно включать параметры, характерные только для массивов –

· размерность (количество измерений), которая определяет число индексов при обращении к элементам массива

· размер массива – это количество его элементов

Описание массива имеет два формата:

 

тип идентификатор[размерность];

 

или

 

тип идентификатор [размерность]={элемент1, элемент2,…};

 

Размерность – это константное выражение целого типа, обозначающее количество элементов в массиве. Если в первом случая описания размерность необходимо указывать, то во втором его указание не обязательно. Когда массив объявлен без указания размерности, но при этом инициализирован списком, его размерность вычисляется путем подсчета числа элементов этого списка. Явная инициализация массива разрешена только при его определении и возможна двумя способами: либо с указанием размера массива в квадратных скобках, либо без его явного указания, например,

 

int а[6]={1,2,3,4};//массив из 6 целых чисел с инициализацией

//первых четырех

char str[]={‘a’, ‘b’, ‘c’};// массив из 3 элементов типа char

 

Одним из способов доступа к элементам массива является использование индексов. То есть, чтобы обратится к i- тому элементу массива а, используют запись а[i], при этом первый элемент массива имеет индекс 0. Например, ввод элементов массива с клавиатуры можно реализовать следующим образом:

 

const int n=10;

int a[n];

for (i=0;i<n;i++)

{ printf(“Введите a[i]:” );

scanf(“%d”,&a[i]); }

 

Специальным образом в языке С обрабатываются массивы, называемые С-строками. С-строка - это массив символов, последний из которых символ ‘\0’. Дело в том, что в С нет специального типа данных для описания строк, но есть библиотека функций языка С для работы С-строками (описанная в заголовочном файле string.h), которые обеспечивают различные операции для манипулирования строками.

Многомерные массивы описываются как массивы массивов, например,

 

int a2[3][2] // массив из 3 массивов, содержащих по 2 целых элемента

 

Для обращения к элементу двумерного массива используется два индекса, например, a2[i][j].