Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_2_метод_указания.doc
Скачиваний:
2
Добавлен:
09.11.2018
Размер:
412.67 Кб
Скачать

Вложенные циклы

В данном примере внешний цикл реализуется разными типами циклов.

В таблице представлены результаты вычислений.

j

k

a

1

1

2

 

1000

1001

2

1

3

 …

 

1000

1002

 …

1000

1000

 2000

int a=0;

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;