Записать 3 варианта (с циклами while, do

advertisement
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;
Download