Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций
6 тем.
Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Формат цикла while:
while ( B ) S ;
где B – выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла: один оператор(простой или составной).
Перед каждым выполнением тела цикла анализируется значение выражения В:если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно – цикл завершается и управление передается на оператор, следующий за оператором S .
Если результат выражения B окажется ложным при первой проверке, то тело цикла не выполнится ни разу. Отметим, что если условие B во время работы цикла не будет изменяться, то возможна ситуация зацикливания, то есть невозможность выхода из цикла. Поэтому внутри тела должны находиться операторы,приводящие к изменению значения выражения B так, чтобы цикл мог корректно завершиться.
В качестве иллюстрации выполнения цикла while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n .
#include <iostream>
using namespace std;
int main()
{
int n, i=1;
cout <<" n ="; cin >> n ;
while ( i <= n ) //пока i меньше или равно n
{
cout << i <<"\ t "; //выводим на экран значение i
++ i ; // увеличиваем i на единицу
}
return 0;
}
Результаты работы программы:
n 10
ответ
1 2 3 4 5 6 7 8 9 10
Оператор цикла do while также организует выполнение одного оператора(простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла. Формат цикла do while:
do S while ( B );
где В –выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла: один оператор (простой или блок).
Сначала выполняется оператор S , а затем анализируется значение выражения В: если оно истинно, то управление передается оператору S , если ложно - цикл завершается, и управление передается на оператор, следующий за условием B .
В операторе do while , также как и в операторе while , возможна ситуация зацикливания в случае, если условие В всегда будет оставаться истинным. Но так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.
В качестве иллюстрации выполнения цикла do while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n .
#include <iostream>
using namespace std;
int main()
{
int n, i=1;
cout <<"n=";
cin >>n;
do
{
//выводим на экран i, а замет увеличиваем
cout<<i++<<"\t";//ее значении на единицу
}
while (i<=n);//до тех пор пока i меньше или равна n
return 0;
}
Результаты работы программы:
n 10
ответ
1 2 3 4 5 6 7 8 9 10
Цикл с параметром for имеет следующую структуру:
for ( <инициализация>; <выражение>; <модификации>) <оператор>;
Инициализация используется
для объявления и присвоения начальных
значений величинам, используемым в цикле.
В этой части можно записать несколько
операторов, разделенных запятой. Областью
действия переменных, объявленных в части
инициализации цикла, является цикл и
вложенные блоки. Инициализация выполняется
один раз в начале исполнения цикла. Выражение определяет
условие выполнения цикла: если его результат
истинен, цикл выполняется. Истинность
выражения проверяется перед каждым выполнением
тела цикла, таким образом, цикл с параметром
реализован как цикл с предусловием. Модификации выпо
Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запятой, определяющую позицию пропускаемой части, надо оставить.
#include <iostream>
using namespace std;
int main()
{
int n;
cout <<"n=";
cin >>n;
for (int i=1; i<=n;i++) //для i от 1 до n с шагом 1
cout << i <<"\t "; //выводить на экран значение i
return 0;
}
Результаты работы программы:
n 10
ответ
1 2 3 4 5 6 7 8 9 10
Циклы могут быть простые или вложенные(кратные, циклы в цикле). Вложенными могут быть циклы любых типов: while , do while , for . Структура вложенных цикловна примере типа for приведена ниже:
Уровни вложенности | |
for ( i=1;i<ik;i++)
{ … for (j=10; j>jk; j--) { … for( k=1; k<kk; j+=2) { … } … } … } |
Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускается.
Рассмотрим пример
использования вложенных
1 | #include <iostream>
using namespace std; int main() { for (int i=1; i<=5; ++i,cout<<endl) //внешний цикл for (int j=1; j<=2*i-1; j+=2) //внутреннийцикл cout<<j<<"\t";//тело внутреннего цикла return 0; } | ||||
1 | 3 | ||||
1 | 3 | 5 | |||
1 | 3 | 5 | 7 | ||
1 | 3 | 5 | 7 | 9 | |
В данном случае таблица
состоит из пяти строчек, в каждой
из которых печатаются только нечетные
числа. Причем последнее нечетное число
в строчке зависит от ее номера. Эта зависимость
выражается через формулуk = 2 i -1 (зависимость
проверить самостоятельно), где k –
последнее число в строке, i – номер
текущей строки. Внешний цикл следит за
номером текущей строки i , а внутренний
цикл будет печатать нечетные числа из
диапазона от 1 до 2 i -1 .
3.5. Примеры использования операторов цикла при решении задач
1. Написать программу,
которая выводит на экран
Указания по решению задачи. Из диапазона целых чисел от А до В необходимо выбрать только четные числа. Напомним, что четными называются числа, которые делятся на два без остатка. Кроме того,четные числа представляют собой упорядоченную последовательность, в которой каждое число отличается от предыдущего на 2. Решить эту задачу можно с помощью каждого оператора цикла.
#include <iostream>
using namespace std; int main() { int a, b, i; cout <<"a="; cin >>a; cout <<"b="; cin >>b; i=(a%2)? a+1: a; while (i<=b) { cout<<i*i<<"\t"; i+=2; } return 0; } |
#include <iostream>
using namespace std; int main() { int a, b, i; cout <<"a="; cin >>a; cout <<"b="; cin >>b; i=(a%2)? a+1: a; do { cout<<i*i<<"\t"; i+=2; } while (i<=b); return 0; } |
Начальное значение переменной i определяется
с помощью тернарной операции. Если a нечетное
число, то при делении на 2 мы получим остаток
1, который трактуется компилятором как истина,
и, следовательно, переменной i будет
присвоено значение a+1.Если же a четное
число, то при делении на 2 мы получим остаток
0, который трактуется компилятором как ложь,
и следовательно переменной i будет
присвоено значение a. В результате
независимо от значения переменной а переменной i буде
#include <iostream>
using namespace std;
int main()
{
int a, b;
cout <<"a="; cin >>a;
cout <<"b="; cin >>b;
for (int i=(a%2)? a+1: a; i<=b; i+=2)
cout<<i*i<<"\t";
return 0;
}
Три программы дадут нам одинаковый результат:
а
3
b
9
ответ
16 3664
2. Постройте таблицу
значений функции
для х из интервала
[ a , b ] с шагом h .
# include < iostream >
# include < cmath >
using namespace std ;
float f(float x) //вспомогательная функция: возвращает значение функции в точке x
{
if(x<0) return pow(pow(x,3)+1,2); //условие первой ветви
else if ( x <1) return 0; //условие второй ветви
else return fabs ( x * x -5* x +1);
}
// по умолчанию третья ветвь
int main() // главная функция
{
float a,b,h,x;
cout <<"a=";
cin>>a;
cout <<"b=";
cin>>b;
cout <<" h =";
cin >> h ;
cout <<" x \ tf ( x )\ n "; //выводим заголовок таблицы
for ( x = a ; x <= b ; x += h ) //перебираем все числа из отрезка [ a , b ] с шагом h и выводим на
cout << x <<"\ t "<< f ( x )<< endl ; //экран значение x и значение функции в точке х
return 0;
}
Результат работы программы для a=-3, b=3, h=1.5
x | f(x) |
-3 | 676 |
-1.5 | 5.64063 |
0 | 0 |
1.5 | 4.25 |
3 | 5 |
3.6. Операторы безусловного перехода