Читайте также:
|
|
Комп’ютерний практикум №4.1
Тема: Оператори циклу. Робота з масивами.
Завдання:
Написати програму, яка повинна виводити таблицю значень синусів або косинусів
(розрахованих за допомогою розкладання функції в ряд Тейлора) і табличних значень, а
також їх різницю в заданому діапазоні із заданим кроком та точністю.
Текст програми
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <conio.h>
#include <iomanip>
using namespace std;
const double pi=3.141592653589;
double perevod (double x,int &znak)
{
if (x<0) {
x=fabs(x);
znak=-1;
}
else {znak=1;}
while((x/360)>1)
{
x=x-360;
}
x=(x*pi)/180;
return(x);}
int format (float pre)
{
int i=0;
for(i=0;pre<1;i++)
pre*=10;
return(i);}
bool funF (char *s) { //функція перевірки на коректність вводу. у разі виявлення не цифр, та більше ніж одної коми(ввіділення цілої частини від дробової//Нова спеціально для fgets
// у адресу пам'яті повертаетця значення false. У разі корекного вводу, повертаетця true
bool q;
int i=0; // лічильник циклу
int l=0; //лічільник десятичьних крапок
int e=0;//лічильник символа Е або е
int j=0;//наступна позиція після Е або е, бля того щоб відстежити символ -, також на перевірки чи далі іде число, а не перехід на наступну строку
int p=0;//відстежування якщо десятичьна крапка є, за одну позицію до Е
int w=15;//відстежування крапок після Е
int d=0;//наспупна позиція після Е чи після Е-, для перевірки чи далі іде число, а не перехід на наступну строку
int r=0;//
int a=0;
if (strlen(s)>15||strlen(s)<1) { q=false; }
else {
if ((s[0]=='-')&&((s[1]=='0')||(s[1]=='1')||(s[1]=='2')||(s[1]=='3')||(s[1]=='4')||(s[1]=='5')||(s[1]=='6')||(s[1]=='7')||(s[1]=='8')||(s[1]=='9')))
{a=2;q=true;} else {q=false;}
for(i=a;i<strlen(s)-1;i++) {
if ((s[i]=='0')||(s[i]=='1')||(s[i]=='2')||(s[i]=='3')||(s[i]=='4')||(s[i]=='5')||(s[i]=='6')||(s[i]=='7')||(s[i]=='8')||(s[i]=='9'))
{q=true;}
else if((s[i]==',')&&(l==0)&&(w>i)&&(i!=0)) {l++;q=true;r=i+1;if ((s[r]=='0')||(s[r]=='1')||(s[r]=='2')||(s[r]=='3')||(s[r]=='4')||(s[r]=='5')||(s[r]=='6')||(s[r]=='7')||(s[r]=='8')||(s[r]=='9'))
{} else {q=false;break;}
}
else if (((s[i]=='e')||(s[i]=='E'))&&(e==0)) {e++;q=true;j=i+1;p=i-1;w=i;d=i+2;
if (s[j]=='-') {i++;};
if ((s[p]==',')){q=false;break;}
if (((s[j]=='0')||(s[j]=='1')||(s[j]=='2')||(s[j]=='3')||(s[j]=='4')||(s[j]=='5')||(s[j]=='6')||(s[j]=='7')||(s[j]=='8')||(s[j]=='9'))||(s[d]=='0')||(s[d]=='1')||(s[d]=='2')||(s[d]=='3')||(s[d]=='4')||(s[d]=='5')||(s[d]=='6')||(s[d]=='7')||(s[d]=='8')||(s[d]=='9'))
{}else {q=false;break;}
}
else {q=false;break;};
} }
return(q);}
double read (const char a[])
{char v[17];
double vvod=0;
fflush(stdin);
cout <<a;
do{
fflush(stdin);
fgets(v,17,stdin);
if(funF(v)==true) {vvod=atof(v);}
else {cout <<"Не коректный ввод!В вашом вводе были не только цифри,а и символы.\nПопробуйте вместо '.' для разделения целой и дробной части ввести','.\nИли сократите количество символов ввода.\n\n"<<a;
}
} while (funF(v)!=true);
system("cls");
return(vvod);}
void table1 (double a,double b,double c,double d,float presic)
{
cout<<"| "<<setprecision(0)<<setw(0)<<a<<setw(8)<<setprecision(format(presic))<<" |"<<setw(13)<<b<<setw(9)<<" |"<<setw(14)<<c<<setw(11)<<" |"<<setw(10)<<d<<setw(11)<<""<<endl;
}
void table (void)
{
cout<<"--------------------------------------------------------------------------------";
cout<<"| Угол | Тейлор | Табличьное | Разница |\n";
}
double sin1 (double xe,float p)
{
double q,s;
int n=1;
q=s=xe;
while (fabs(q)>=p){
q=q*(-(xe*xe))/((n+1)*(n+2));
s=s+q;
n=n+2;
}
return(s);}
void write (double x1,double x2, double x3,float p){
int i=0,k=0,n=0,w=0,a=0,zn;
double px=0;
bool f=true;
const int raz=10;
table();
if(x1>x2&&x3<0) {
for(x1;x1>=x2;x1+=x3)
{
i++;
px=perevod(x1,zn);
table1(x1,zn*sin1(px,p),zn*sin(px),(fabs(zn*sin1(px,p)-zn*sin(px)))>p?fabs(zn*sin1(px,p)-zn*sin(px)):0,p);
if (i==raz) {cout<<"Выведено "<<i<<" значений\n";
cout<<"Для продолжения 1, для вихода любую кнопку\n";
if(getch()=='1') {
i=0;
system("cls");
table();
}
else {break;}
}
}
if (fabs(x1-x3)==fabs(x2)){}
else
{
px=perevod(x2,zn);
table1(x2,zn*sin1(px,p),zn*sin(px),(fabs(zn*sin1(px,p)-zn*sin(px)))>p?fabs(zn*sin1(px,p)-zn*sin(px)):0,p);
}
}
else{
for(x1;x1<=x2;x1+=x3)
{
i++;
px=perevod(x1,zn);
table1(x1,zn*sin1(px,p),zn*sin(px),(fabs(zn*sin1(px,p)-zn*sin(px)))>p?fabs(zn*sin1(px,p)-zn*sin(px)):0,p);
if (i==raz)
{
cout<<"Выведено "<<i<<" значений\n";
cout<<"Для продолжения 1, для вихода любую кнопку\n";
if(getch()=='1') {
i=0;
system("cls");
table();}
else {break;}
}}
if (fabs(x1-x3)==fabs(x2)){}
else
{
px=perevod(x2,zn);
table1(x2,zn*sin1(px,p),zn*sin(px),(fabs(zn*sin1(px,p)-zn*sin(px)))>p?fabs(zn*sin1(px,p)-zn*sin(px)):0,p);
}}
}
void main ()
{
setlocale(LC_ALL, "Russian");
const char pov1[]="Введите начяльный угол(не больше 32000)=";
const char pov2[]="Введите конечный угол(не больше 32000)=";
const char pov3[]="Введите шаг изменения угла(не бельше 32000)=";
const char pov4[]="Введите точность(не больше 1е-7)=";
const char err1[]="Ошибка!начяльний угол больше чем конечьный";
const char err2[]="Вы ввели шаг который больше заданого диапазона,или равен диапазону";
const char err3[]="Ошибка!Точьность не может быть 0!";
const char err4[]="Ошибка!Шаг не должен быть 0!";
const char err5[]="Для даного диапазона, шаг не может бить отрицателен\n";
const char err6[]="Вы ввели не допустимое сочетание углов!\n";
const char err7[]="Вы вели слишком большое число, или не верную точьность!";
int z;
double x0,xk,xz,x0r,xkr;
float p;
do{ cin.clear();
system("cls");
cout<<"Привет! Эта програма счетает sin (х) в зависимости от заданового Вами начяльно и конечьного угла\n а также шага изменения угла\n";
x0=read(pov1);
xk=read(pov2);
xz=read(pov3);
p=read(pov4);
cout<<"Начяльный угол="<<x0<<" Конечный угол="<<xk<<" Шаг изменения угла="<<xz<<" Точность="<<p<<"\n";
if(x0<32000&&xk<32000&&xz<32000&&p<1&&p>=0&&p>=0.0000001) {
if((p==0)) {cout<<err3<<endl;}
else if ((xz==0)||(x0<xk&&xz<0)||(x0>xk&&xz>0)||(fabs(xz)>=fabs(xk-x0))) {
cout<<err4<<endl;
table();
x0r=perevod(x0,z);
table1(x0,z*sin1(x0r,p),z*sin(x0r),(fabs(z*sin1(x0r,p)-z*sin(x0r)))>p?fabs(z*sin1(x0r,p)-z*sin(x0r)):0,p);
xkr=perevod(xk,z);
table1(xk,z*sin1(xkr,p),z*sin(xkr),(fabs(z*sin1(xkr,p)-z*sin(xkr)))>p?fabs(z*sin1(xkr,p)-z*sin(xkr)):0,p);
}
else if((x0<xk&&xz>0)||(x0>xk&&xz<0)) {write(x0,xk,xz,p);}
else {cout<<err6<<endl;}
} else{cout<<err7<<endl;}
cout<<"Для нового запуска программы нажмите 1, для выхода любую кнопку\n";
}while (getch()=='1');
}
Введені та одержані результати:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Висновок: Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.
Дата добавления: 2015-10-28; просмотров: 94 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Financial Support | | | Создание иерархических объектов и их анимация |