- •Лабораторная работа 2 Циклы
- •Организация циклов с параметром Цикл while в циклах с параметром Вычисление суммы чисел натурального ряда от 1 до 10
- •Определение наибольшей степени целого числа 100, которую можно вычислить, пользуясь типом long
- •Подсчет количества цифр в числе n
- •Вычисление значений функции на отрезке
- •Вычисление на отрезке значений функции с условием и оформление результатов
- •Цикл do-while в циклах с параметром Вычисление суммы чисел натурального ряда от 1 до 10
- •Калькулятор
- •Проверка входных данных
- •Вычисление значений функции на отрезке
- •Вычисление на отрезке значений функции с условием и оформление результатов
- •Цикл for в циклах с параметром Вычисление суммы чисел натурального ряда от 1 до 10
- •Вычисление на отрезке значений функции с условием и оформление результатов
- •Организация итерационных циклов Цикл while в итерационных циклах Вычисление числа π
- •Вложенные циклы
- •Вычисление значения многочлена на отрезке (схема Горнера)
- •Разложение функции на отрезке в ряд Тейлора
- •Организация работы с последовательностью чисел, вводимых с клавиатуры
- •Корректная организация циклов
- •Оптимизация программы
- •Алгоритм типа «развилка, вложенная в цикл с параметром»
- •Алгоритмы итерационных циклов Пример 1. Нахождение корня нелинейного уравнения методом итераций
- •Пример 2. Нахождение корня нелинейного уравнения методом половинного деления
- •Пример 3. Вычисление суммы членов бесконечного ряда.
- •Алгоритмы с вложенными циклами
- •Алгоритм вложенного цикла с развилкой
Вложенные циклы
В данном примере внешний цикл реализуется разными типами циклов.
В таблице представлены результаты вычислений.
j |
k |
a |
1 |
1 |
2 |
… |
… |
… |
|
1000 |
1001 |
2 |
1 |
3 |
… |
… |
… |
|
1000 |
1002 |
… |
… |
… |
1000 |
1000 |
2000 |
for (int j=1; j <=1000; j++) for (int k=1; k<=1000; k++)
a=k+j;
int j=1;
int a=1;
do
{ for (int k=1; k<=1000; k++) a =k+j;
j++;
} while (j <= 1000);
nt j=1;
int a=1;
while (j <= 1000) {for (int k=1; k<=1000; k++) a =k+j;
j++;
}
Вычисление значения многочлена на отрезке (схема Горнера)
Рассмотрим сначала вычисление значения многочлена в точке.
Вычисление значения многочлена в точке – это пример цикла с параметром (известна степень многочлена). Рассматриваемый алгоритм вычисления в точке значения многочлена предполагает суммирование слагаемых справа налево:
const int n=5; //степень многочлена
int main ()
{
double x, xpow, result;
int koef;
cout << "x= " ;
cin >> x; //ввод значения точки, в которой надо вычислить значение многочлена
xpow=1; //переменная для вычисления значения х в текущей степени, сначала х0=1 koef=1; //переменная для вычисления текущего значения коэффициента, сначала 20
result = 1; //переменная для значения многочлена (суммы слагаемых), сначала =1
for (int i=1; i <=n; i++)
{ xpow *= x;
koef *= 2; //или koef <<= 1 !!!
result += koef * xpow;
}
cout << result << endl;
_getch();
return 0;
}
Вычисление значения многочлена на отрезке представляется в виде вложенных циклов. И внешний цикл (организация движения по отрезку) и внутренний (вычисление значения многочлена в точке) являются циклами с параметром. Реализация каждого из них возможна в любом виде: for, while или do-while.
Вычисление значения многочлена на отрезке в точках xi Î [х0; хn] будем выполнять по схеме Горнера, которая представляет собой процесс последовательного вычисления вложенных скобок (от самой внутренней к внешней). Простейшие подсчеты показывают, что такое преобразование позволяет снизить общее количество операций практически в 2 раза. Например, в случае ах4 + bx3 + cx2 + dx +e = (((ax +b) +c) +d) +e от 7 умножений и 4-х сложений приходим к 4-м умножениям и 4-м сложениям.
const int N=5; //степень многочлена
int main (){
double x0, xn, x,result, h;
int koef;
cin >> x0 >> xn >> h; //ввод границ отрезка и шага
x=x0;
const double B=xn+h/2;
while (x < B) //внешний цикл движения по отрезку
{result = pow(2.0,N); //вычисление значения самой внутренней скобки
koef=result; //вычисление коэффициента приведением к типу int
for (int i=N; i >0; i--) //цикл вычисления значения многочлена в точке
{ koef >>= 1; //вычисление очередного коэффициента делением на 2
result = result * x + koef; //вычисление очередной скобки
} //end_for
cout << setw(7) << x << setw(10) << result << endl;
x=x+h; //переход к другой точке отрезка
} //end_while
_getch();
return 0;
}
Отметим в программе следующие моменты:
pow(2.0,N); – функция pow() требует аргумент вещественного типа;
koef = result; – в результате операции присваивания вещественное значение result приводится к типу int
koef >>= 1; – это есть сдвиг вправо на 1 разряд, т.е. деление на 2;