Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программированиние в Ф И.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
353 Кб
Скачать
☆

7. Оператор безусловного цикла for.

Оператор for позволяет выполнить некоторую последовательность операторов С (тело цикла) заданное число раз. Цикл for имеет следующую структуру:

for(начальное значениесчетчика; условие выполнения; новое значение счетчика)

{

Блок из одного или нескольких предложений языка C

}

Пример цикла for для вычисления суммы квадратов целых чисел от 0 до 19:

int i, j=0;//Объявляются целые переменные i и j

for(i=0;i<20;i++)//Цикл из 20 шагов для i от 0 до 19

j=j+i*i; //В j заносятся квадраты целых чисел

Начальное значение счетчика цикла вычисляется один раз при входе в цикл. Обычно это операция присваивания вроде i=0. Условие выполнения представляет собой операцию отношения, например i<20. Пока указанное условие выполняется, цикл продолжается.

Новое значение счетчика вычисляется перед каждым очередным шагом цикла. Часто (хотя совсем не обязательно) здесь используется операция инкремента i++.

Если тело цикла состоит лишь из одного оператора, то фигурные скобки, ограничивающие цикл, можно опустить. Если же цикл состоит из нескольких операторов, то их следует заключить в фигурные скобки:

int i, k=0, m=0; // Объявляются целые переменные i , k и m

for(i=1;i<21;i++) // Цикл из 20 шагов для i от 1 до 20

{ // Начало тела цикла

j=j+i*i; // В j заносятся квадраты целых чисел

m=m + i ; // В m заносятся целые числа

} // Конец тела цикла

Счетчик цикла может быть инициализирован любым числом и получать любые приращения, не обязательно 1:

for(k=10; k<20; k+=2) // 5 шагов, k изменяется

// от 10 до 18 через 2

Счетчик цикла может работать в обратном направлении:

for(j=50; j>=0; j--) // 51 шаг, j изменяется от 50 до 0 через 1

Счетчик цикла не обязательно должен быть целым числом:

float f, Tf[400];

int n=0;

for(f=0.01; f<3.14; f+=0.01)

{

Tfinsагов, n ючить в сляется в чисел от 1 до 20:000000000000000000000000000000000000000000000000000000000000000000000000000000[n]=sin(f)/f; // Массив заполняется значениями sin(f)/f

n++; // Инкремент индекса массива

}

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

Задание 2.

Какая информация появится на экране дисплея после выполнения данной программы:

#include <stdio.h>

Void main()

{ int i, j=0, k=0;

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

{ j = ++i;

k = i++;

printf("\n %d %d %d",j, k, i);

};

}

Правильный ответ: 1 1 2 .

8. Циклы while и do/while

Конструкция while служит для повторения цикла все время, пока выполняется заданное условие. Цикл while имеет следующую структуру (если операторный блок состоит из одного оператора, фигурные скобки можно опустить):

while( условие )

{

Блок из одного или нескольких операторов C

}

Блок операторов в фигурных скобках будет выполняться многократно, пока условие при операторе while остается истинным. Как только выражение станет ложным, управление передается на оператор, следующий за циклом while. Очевидно, что тело цикла должно как-то влиять на выражение, определяющее условие выполнения, и в конце концов, сделать его ложным, иначе цикл никогда не завершится. Следует отметить, что в языке С на месте условия может быть любое вычисляемое выражение. Если значение выражения не равно нулю, условие считается истинным. Таким образом, бесконечный цикл может записан в следующим виде:

while(1)

{

Блок из одного или нескольких операторов C

}

В отличие от цикла for, с помощью которого обычно обрабатываются массивы с известным числом элементов, цикл while удобно использовать в тех случаях, когда размер массива неизвестен. Пусть, например, в символьном массиве st была программно сформирована некоторая фраза и нам надо определить ее длину. Учитывая, что любая символьная строка завершается символом \0 , достаточно перебирать все элементы массива до нахождения элемента со значением ‘\0’:

char* st = "qwerghknc";

int i = 0, length;

while( *(st++) != '\0' ) i++;

length=i;

Здесь в тело цикла входит единственное предложение i++, т. е. в цикле нет ни одного "содержательного" предложения. Действительно, нам ничего не надо делать с символами строки, а только перебирать их до нахождения требуемого. С другой стороны конструкция while (в отличие от конструкции for) не наращивает значение индекса. Поэтому инкремент индекса, если он используется, необходимо выполнять явным образом.

Как только сравнение *(st++) и ‘\0’ даст положительный результат, действие i++ будет пропущено и управление передастся за пределы цикла while, т. е. на предложение length=i. Таким образом, в переменную length будет занесено значение индекса i, соответствующее завершающему нолю. Это значение совпадает с длиной фразы.

В цикле do/while проверка условия производится после исполнения тела цикла. Это означает, что оператор или блок операторов, связанный с циклом, будет обязательно исполняться хотя бы один раз. Синтаксис оператора имеет следующий вид:

do { оператор или блок операторов }

while ( условие )

Цикл do/while весьма полезен, когда нужно спросить у пользователя следует ли повторять определенную операцию. Например:

char answer;

int i = 0;

do{

// Блок операторов

i++;

printf ("Хотите завершить исполнение ?");

answer = getche();

} while ( answer != 'Y' && answer! = 'y');

printf ("Число операций = %d", i );