1) Записать 3 варианта (с циклами while, do-while, for) программы вычисления условной функции в точках хi [х0; хn], хi = х0 + iх, i = 0, 1, …, при х0 = 0.8; хn =2; х = 0.1; a = 1.5. Вывод результатов обеспечить в виде таблиц с «шапкой». x 2 7 / x 2 , x 1.3 y ax 3 7 x , x 1.3 lg( x 7 x ), x 1.3 2) Вычислить значение многочлена для заданного n в точках хi [х0; хn] (х0 = 1, хn =5, х = 0.5) двумя способами: суммируя элементы по возрастанию степени x и по схеме Горнера. Подсчитать количество операций сложения и умножения в том и другом случае. Вывод результатов обеспечить в виде таблицы с «шапкой», не использовать функцию pow и другие функции из cmath или math.h. y nx n ... 9 x 9 7 x 7 5 x 5 3x 3 x 10 . Примеры : Вычисление на отрезке значений функции с условием и оформление результатов в виде таблицы (С++) //пример 1. Составим программу для вычисления и вывода на печать таблицы значений функции с условием cos( x ), при x 3.5 y(х) = sin( x ), при x 3.5 если х изменяется от xn = 2.0 до xk = 5.0 с шагом h=0.5 с помощью цикла while: #include <iomanip> //для манипуляторов вывода #include <math.h> int main() { double xn=2.0, xk=5.0, x, y, h=0.5; const double X_end = xk+h/2 ; //чтобы не делать проверку в цикле // на точное равенство с xk char c,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10; c=char(196); c1=char(218); c2=char(194); c3=char(191); c4=char(179); c5=char(195); c6=char(197); c7=char(180); c8=char(192); c9=char(217); c10=char(193); cout<<c1<<c<<c<<c<<c<<c<<c2<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c3<<'\n'; cout<<c4<<" x " << c4 << " y " << c4 << '\n'; //вывод шапки без завершающей разделительной линии int i=0; x=xn; //первая точка отрезка while (x < X_end) { if (x <= 3.5) { y=cos(x); } else { y=sin(x); } cout<<c5<<c<<c<<c<<c<<c<<c6<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c7<<'\n'; //вывод разделительной линии cout << setiosflags(ios::fixed) << setprecision(2); //подготовка к выводу x: с фиксир.точкой и 2 знаками после точки cout << c4 << setw(5) << x; //вывод х в 5 позиций cout << setiosflags(ios::fixed) << setprecision(6) ; //подготовка к выводу y: с фиксир.точкой и 6 знаками после точки cout << c4 << setw(11) << y << c4 <<"\n"; //вывод y в 11 позиций i++; x=xn+i*0.5; //очередная точка отрезка отсчитывается от xn !!! } //end_while cout<<c8<<c<<c<<c<<c<<c<<c10<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c<<c9<<'\n' ; //вывод завершающей разделительной линии _getch(); return 0; } Вычисление на отрезке значений функции с условием и оформление результатов (C ) //пример 1. Составим программу для вычисления и вывода на печать таблицы значений функции с условием y(х) = cos( x ), при x 3.5 sin( x ), при x 3.5 если х изменяется от xn = 2.0 до xk = 5.0 с шагом h=0.5 с помощью цикла do while: #include <iomanip> //для манипуляторов вывода #include <math.h> #include <conio.h> int main() { double xn=2.0, xk=5.0, x, y, h=0.5; const double X_end = xk+h/2 ; //чтобы не делать проверку в цикле // на точное равенство с xk ////////////////////////////////////////////////////////////////////// printf("\ndo-while:\n"); printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218,196,196,196,196,194,196,196,196,196,196,196,196,196,196,191); printf ("%c x %c y %c\n",179,179,179); x=xn; do { if (x <= 3.5) y=cos(x); else y=sin(x); printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 195,196,196,196,196,197,196,196,196,196,196,196,196,196,196,180); printf("%c%4.2lf%c%9.5lf%c\n", 179, x, 179, y, 179); x+=h; } while (x < X_end); printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192,196,196,196,196,193,196,196,196,196,196,196,196,196,196,217); _getch(); return 0; } Вычисление на отрезке значений функции с условием и оформление результатов (C ) //пример 1. Составим программу для вычисления и вывода на печать таблицы значений функции с условием y(х) = cos( x ), при x 3.5 sin( x ), при x 3.5 если х изменяется от xn = 2.0 до xk = 5.0 с шагом h=0.5 с помощью цикла for: #include <math.h> #include <iostream> #include <conio.h> int main() { double xn = 2.0, xk = 5.0, x, y, h = 0.5; const double X_end = xn+h/2 ; ////////////////////////////////////////////////////////////////////// printf("\nfor_1:\n"); printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218,196,196,196,196,194,196,196,196,196,196,196,196,196,196,191); printf ("%c x %c y %c\n",179, 179, 179); for (x=xn; x< X_end; x+=h) { if (x<=3.5) else y=cos(x); y=sin(x); printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 195,196,196,196,196,197,196,196,196,196,196,196,196,196,196,180); printf("%c%4.2lf%c%9.5lf%c\n",179, x, 179, y, 179); } printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192,196,196,196,196,193,196,196,196,196,196,196,196,196,196,217); ////////////////////////////////////////////////////////////////////// printf("\nfor_2:\n"); const int k = int((xk-xn)/h)+1; //или floor ((xk-xn)/h)+1; //k – счетчик количества выполнений цикла x=xn; printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 218,196,196,196,196,194,196,196,196,196,196,196,196,196,196,191); printf ("%c x %c y %c\n",179, 179, 179); for (int i=1; i<=k; x+=h, i++) { if (x<=3.5) else y=cos(x); y=sin(x); printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 195,196,196,196,196,197,196,196,196,196,196,196,196,196,196,180); printf("%c%4.2lf%c%9.5lf%c\n",179, x, 179, y, 179); } printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 192,196,196,196,196,193,196,196,196,196,196,196,196,196,196,217); _getch(); return 0; } Вычисление значения многочлена Вычисление значения многочлена в точке //пример 1. Вычисление значения многочлена в точке – это пример цикла с параметром (известна степень многочлена). Рассматриваемый алгоритм вычисления в точке значения многочлена предполагает суммирование слагаемых справа налево: p( x) 25 x5 24 x 4 23 x 3 22 x 2 21 x1 1 const int n=5; //степень многочлена int main () { double int x, xpow, result; koef; cout << "x= " ; cin >> x; xpow=1; koef=1; result = 1; //ввод значения точки, в которой надо вычислить значение многочлена //переменная для вычисления значения х в текущей степени, сначала х0=1 //переменная для вычисления текущего значения коэффициента, сначала 20 //переменная для значения многочлена (суммы слагаемых), сначала =1 for (int i=1; i <=n; i++) { xpow *= x; koef *= 2; //или koef <<= 1 !!! result += koef * xpow; } cout << result << endl; _getch(); return 0; } Вычисление значения многочлена на отрезке по схеме Горнера //пример 2. Вычисление значения многочлена на отрезке представляется в виде вложенных циклов. И внешний цикл (организация движения по отрезку) и внутренний (вычисление значения многочлена в точке) являются циклами с параметром. Реализация каждого из них возможна в любом виде: for, while или do-while. Вычисление значения многочлена на отрезке в точках xi [х0; хn] будем выполнять по схеме Горнера, которая представляет собой процесс последовательного вычисления вложенных скобок (от самой внутренней к внешней). Простейшие подсчеты показывают, что такое преобразование позволяет снизить общее количество операций практически в 2 раза. Например, в случае ах4 + bx3 + cx2 + dx +e = (((ax +b) +c) +d) +e от 7 умножений и 4-х сложений приходим к 4-м умножениям и 4-м сложениям. p( x) 25 x5 24 x 4 23 x 3 22 x 2 21 x1 1 p( x) (25 x 4 24 x3 23 x 2 22 x 21 ) x 1 p( x) ((25 x3 24 x 2 23 x1 22 ) x 21 ) x 1 p( x) ((( 25 x 2 24 x1 23 ) x 22 ) x 21 ) x 1 p( x) (((( 25 x1 24 ) x 23 ) x 22 ) x 21 ) x 1 p( x) ((((( 25 ) x 24 ) x 23 ) x 22 ) x 21 ) x 1 Вычисления будем проводить, начиная с самой внутренней скобки. Ее значение (result) равно коэффициенту (koef) при старшем члене многочлена и равно 32. Значение следующей вложенной скобки есть result * x * следующий koef (который пересчитывается в цикле). const int N=5; int //степень многочлена main (){ double xn, xk, h, result, x; int koef; cin >> xn >> xk >> h; //ввод границ отрезка и шага x = xn; //начальная точка отрезка const double B=xk+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 << x += h; setw(7) << x << setw(10) << result << endl; //переход к следующей точке отрезка } //end_while _getch(); return 0; } Отметим в программе следующие моменты: pow(2.0,N); – функция pow() требует аргумент вещественного типа; koef = result; – в результате операции присваивания вещественное значение result приводится к типу int koef >>= 1; – это есть сдвиг вправо на 1 разряд, т.е. деление на 2;