
- •Выражение
- •(По убыванию приоритетов, в группе приоритеты одинаковые)
- •2)Оператор вывода данных на экран дисплея.
- •3)Оператор присваивания.
- •4)Составной оператор.Блок.
- •6)Условный оператор. Переключатель.Оператор перехода.
- •If (выражение) оператор1 ;else оператор2 ;
- •If (выражение) { оператор; … оператор;};
- •7) Оператор цикла while.
- •8) Оператор цикла do while.
- •9) Оператор цикла for.
7) Оператор цикла while.
while (выражение) оператор;
Читается так: пока истинно выражение выполнять оператор.
8) Оператор цикла do while.
do оператор; while (выражение);
do {оператор;… оператор;} while (выражение);
Читается так: выполнять оператор (последовательность операторов) пока истинно выражение.
Как правило, при организации цикла одного оператора цикла недостаточно, т.к. выражение содержит некоторые переменные, при входе в цикл while эти переменные должны иметь значение, а значит перед входом в цикл им должно быть присвоено начпальное значение.
Пример 1.Последовательно вводятся целые неотрицательные числа. Определить их сумму, наименьшее из них.
Это пример на обработку последовательности. Последовательность – это конечная совокупность однотипных данных, для которой заранее неизвестно и не может быть вычислено их количество.
Итак есть совокупность x1, x2, … xk ,-1; -1 – это, например, признак конца этой группы. Задача содержит 3 основных элемента действий:
(1)получить очередное x т.е. считать его из последовательности. (2)проверить условие окончания: x=-1?
(3)обработка элемента последовательности: добавление к сумме и проверка на минимум.
Int main()
{
int x,s,min;
cin>>x; // начальные
s=0; min=x; // установки
while (x>=0) // проверка условия окончания
{//обработка элемента
s=s+x; //s+=x; действие накопления
if (x<min) min=x; // min на текущий момент
//получение нового элемента
сin>>x;
}
cout << “s=”<<s<<” min=”<<min<<endl;
return 0;
}
Выводы: использование циклического алгоритма включает два момента 1)повторяющуюся часть алгоритма; 2) начальные установки, текстуально они располагаются до while, а продумываются после написания while.
Рекомендуется: если в цикле идёт накопление, то необходимо позаботиться о начальных установках: для суммы – 0(либо другое нач. значение), для произведения - 1(либо другое нач. значение , не0),для минимума – либо первый элемент,либо максимальное допустимое значение для типа, для максимума – либо первый элемент,либо минимальное допустимое значение для типа.
Схемы циклов.
Цикл
с предусловием Цикл с постусловием
нет
даВыход
да нет
Выход
Различают два типа циклов: итерационные и циклы с параметром
Итерационные циклы.
Это циклы, в которых заранее неизвестно и не может быть вычислено количество повторений цикла.
Рассмотрим пример 2. Для заданного x найти сумму s(x)c заданной точностью ε, где
=
Накопление суммы бесконечного числа слагаемых невозможно, поэтому здесь используется суммирование конечного числа слагаемых и доказанный в Мат. Анализе факт: если в бесконечной сумме слагаемые знакочередующиеся и стремятся к 0 с ростом n, то погрешность накопленной частично суммы определяется модулем первого из отброшенных членов, т.е.если |an|< ε, то найденная сумма вычислена с нужной точностью. Опять те же 3 элемента действий:
Условие окончания: |an|< ε
Обработка очередного слагаемого : S=S+ an
Получение очередного слагаемого нельзя выполнять “в лоб”т.к. возведение х каждый раз в свою степень неэффективно, лучше домножать степень х предыдущего слагаемого на (-x2). Вычисление факториала как целого числа возможно только для 2n<=12(для int)и как вещественного тоже по причине погрешности , возникающей из-за хранения не более 15-16 десятичных знаков (для double).Поэтому самое выгодное получать очередное слагаемое домножением предыдущего на некоторую величину w(обозначим её так).
Для хранения слагаемого можно использовать переменную x, т.е. получение очередного слагаемого x=x*w.
//summa.cpp
#include <iostream>
#include <cmath>
using namespace std;
//сумма бесконечного ряда
const double eps=1.0E-9;
int main ()
{double x,s,r,a;
int k,n;
cout<<"vvedite x\n";
cin>>x;
//начальные установки
s=0;
n=0; r=-x*x;
a=1;
while (fabs(a)>=eps) // проверка на конец
{//обработка слагаемого
s=s+a;
//получение нового слагаемого
n=n+1; k=2*n;
a=a*r/((k-1)*k);
}
cout <<s<<endl;// вывод результата
return 0;
}
Итерационные циклы встречаются в задачах:
=накопления суммы, произведения с заданной точностью(см.пример2)
=обработки рекуррентной последовательности. Говорят: элементы x0,x1,…xk-1,xk,xk+1,…xn-1,xn,… образуют рекуррентную последовательность,если задано к начальных элементов x0,x1,…xk-1 , а следующие вычисляются по формулам
xk=φ(x0,x1,…xk-1)
xk+1=φ(x1,…xk-1,xk)
………….и т.д.
Могут быть поставлены задачи, например
=если последовательность сходится, то можно найти предел последовательности с заданной точностью ε;
=найти N-ый элемент такой последовательности;
= найти такой элемент последовательности, для которого выполняется некоторое условие;
Особенность такого алгоритма в том, что нельзя гарантировать возможность хранить все вычисляемые элементы посл-ти. Хранят минимум элементов т.е. к+1. Для них заводят к+1 рабочие переменные r0,r1,…rk-1,rk и в них хранят к предыдущих элементов и
вычисленный к+1 элемент. Это окно r0,r1,…rk-1,rk в процессе вычислений как бы передвигают по последовательности.
Схема такого алгоритма:
// начальные установки
r1=x0; r2=; … rk= xk-1;
while (условие продолжения)
{r0=r1; r1=r2;….rk_1=rk; rk=φ(r0,r1,…rk_1);}
Замечание: r0 либо ничего не присваивается в нач. установках (если r0 не используется в условии), либо присваивается некоторое фиктивное значение, которое позволит войти в цикл первый раз.
Пример 3. Для заданных целых a и b найти с=nod(a,b).
nod(20,12)=nod(12,8)=nod(8,4)=nod(4,0)=4 Здесь строится последовательность a,b, и остатков , пока не получится остаток =0, т.е. нужны 3 рабочие переменные.
int r0,r1,r2;
r1=abs(a); r2=abs(b);
while (r2!=0) // while (r2)
{r0=r1; r1=r2;r2=r0%r1;}
сout<<”nod=”<<r1<<endl;
Замечание: В случае итерационного цикла удобно предусмотреть в программе аварийный выход из цикла по достижению некоторого количества итераций (например , если не доказана сходимость пос-ти , а решается задача отыскания её предела).
Циклы с параметром. – это циклы, для которых известно или м.б. вычислено заранее количество повторений цикла.Для него заводится счётчик – параметр цикла, который получает начальное значение и для сравнения цикла на конец выполняется проверка некоторого условия после каждого выполнения тела цикла.Это может быть и сравнение параметра с эталоном.