Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С(часть1-3).doc
Скачиваний:
23
Добавлен:
12.02.2015
Размер:
854.02 Кб
Скачать

6. Конструкции цикла и передачи управления

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

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

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

Рекомендуется задавать размерность массива, не как числовую, а как именованную константу. Например, запись constintn=5;inta[n]; предпочтительнее записиinta[5];.

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

const int n=10;

int a[n];

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

{

printf("\nЕnter a[%d%s",i, "] ");

scanf ("%d",&a[i]);

}

Если требуется сгенирировать элементы случайным образом, то используют функцию rand() из библиотекиstdlib.h. Данная функция возвращает случайное целое число в диапозоне от 0 до 255. Для того, чтобы изменить диапозон можно вязть остаток от деления результата этой функции на нужное границ диапазаона. Например, сгенирировать элементы массива в диапозоне[0,40]можно следующим образом:

const int n=10;

int a[n];

const int k=40;//граница диапозона [0,40]

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

a[i]= rand()%(k+1) //генерируем массив случайных чисел

//в диапазоне [0..k]

Если в задачи указано, что размерность массива не превышает, например N=20, то можно задать эту размерность константой, а реальное количество обрабатываемых элементов n(n[0,N]) запросить у пользователя:

const int N=20;

int a[N],n;

do

{

printf("\nEnter n (1-%d%s",N,"): ");

scanf("%d",&n);

}

while (n<=0 || n>N); // проверка корректности ввода n[0,N]

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

тип *имя_указателя инициализатор;

Например,