5.Разработка алгоритма
1.Словесный:
При запуске программы на экране выводится "Programmy raschyota opredelyonogo integrala metodom 2-go pereschyota po formule Simpsona dlya funktsii y=exp(x*x).". Следом выводится надпись: "Vvedite kontsi integrirovaniya", далее на экран выводится"Vvedite nizhnij predel:",после чего пользователю требуетсся ввести значение нижнего предела интегрирования. Далее выводится надпись:"Vvedite verkhnij predel: ",после чего пользователь вводит значение верхнего предела интегрирования.Аналогичные действия для ввода точности интегрирования "Vvedite tochnost’: ".После ввода данных на экран выводится надпись "Znachenie integrala: " и значение расчитаное в программе,далее выводится "Pogreshnost' ravna: " и соответственно значение погрешности.
2.Блок-схема:
Начало
Programmy
raschyota
opredelyonogo
integrala metodom
2-go pereschyota po
formule Simpsona
dlya
funktsii y=exp(x*x). Vvedite
kontsi
integrirovaniya
Vvedite
nizhnij
predel:
Vvedite
verkhnij
predel:
(с
проверкой)
Vvedite
tochnost’:
(с проверкой)
Pogr>=tochnost
h=(verhnij-nignij)/n x1=nignij+h/2 x2=nignij+h
s2=s;
s2*=h/6 Pogr=fabs(si-
s2)/15
si=s2;
n=n*2
s2=s2+4*y(x1)+
2*y(x2) x1+=h x2+=h;
i=1,..,2n+1
Znachenie
integrala: s2 Pogreshnost’
ravna: Pogr
Конец
7. Код программы
#include<iostream.h>
#include <stdio.h>
#include <conio.h>
#include<ctype.h>
#include <string.h>
#include <math.h>
#include<stdlib.h>
#include<proverka.h>
// исходная функция
long double FunkIskh(double k)
{
long double func;
func=exp(k*k);
return func;
}
//тело программы
void main()
{ //задаём переменные
int i,n;
char str[10];
long double nignij, verhnij, Pogr, tochnost, ZnachNachToch, ZnachKonToch, s, PolnSimp, KorotSimp,SHag,x1,x2;
cout << "Programmy raschyota opredelyonogo integrala metodom 2-go pereschyota po formule Simpsona dlya funktsii y=exp(x*x).\n";
cout << "Vvedite kontsi integrirovaniya\n";
cout << "Vvedite nizhnij predel: ";
nignij=proverka2(str);
cout << "\nVvedite verkhnij predel: ";
do
{ //цикл проверки условися
verhnij=proverka2(str);
if(verhnij<nignij)
cout<<"Oshibka! Verkhnij bol'she nizhnego!";
}
while(verhnij<nignij);
cout << "\nVvedite tochnost': ";
do
{//цикл проверки условия
tochnost=proverka2(str);
if(0>tochnost || tochnost>1 )
cout<< "Oshibka!Tochnost' bol'she 0 men'she 1\n";
}
while(0>tochnost || tochnost>1);
ZnachNachToch=FunkIskh(nignij);
ZnachKonToch=FunkIskh(verhnij);
s=ZnachNachToch-ZnachKonToch;
KorotSimp= (verhnij-nignij)*(ZnachNachToch+ZnachKonToch+4*FunkIskh((nignij+verhnij)/2))/6;
n=2;
do
{ //цикл проверки соответствия условию с расчетами
SHag=(verhnij-nignij)/n;
x1=nignij+SHag/2;
x2=nignij+SHag;
PolnSimp=s;
for(i=1;i<=n;i++) //цикл расчётов точного значения интеграла
{
PolnSimp=PolnSimp+4*FunkIskh(x1)+ 2*FunkIskh(x2);
x1+=SHag;
x2+=SHag;
};
PolnSimp*=SHag/6;
Pogr=fabs(KorotSimp-PolnSimp)/15;
KorotSimp=PolnSimp;
n=n*2;
}
while(Pogr>=tochnost);//вывод на экран значения интеграла и погрешности
cout << "Znachenie integrala: "<< PolnSimp;
cout << "\nPogreshnost' ravna: " << Pogr ;
}
В программе использовался вспомогательный код проверки(защиты ввода):
Proverka.h
int proverka1(char *mas)
{
const MaxSizeStr=10;
int i,minus=0,minusindex=0,point=0,letters=0,punct=0,error=0,resint;
char n,str[MaxSizeStr],minussign,pointsign;
minussign='-';
pointsign='.'
do
{
minus=0;
minusindex=0;
point=0;
letters=0;
punct=0;
error=0;
do
{
cin >> str;
n=strlen(str);
if (n>MaxSizeStr)
cout << "error! vvedennoe chislo slishkom dlinnoe!\npovtorite vvod!\n";
}
while(n>MaxSizeStr);
for (i=0;i<n;i++)
{
if (str[i]==minussign && i==0)
{
minus=minus+1;
minusindex=1;
}
if (str[i]==minussign && i!=0)
{
minus=minus+1;
minusindex=2;
}
if (str[i]==pointsign)
{
point=point+1;
}
if (isalpha(str[i])!=0)
{
letters=letters+1;
}
if (ispunct(str[i])!=0 && str[i]!=pointsign && str[i]!=minussign)
{
punct=punct+1;
}
}
//проверка
if (minus>1)
{
cout << "error! nepravilnoe kolichestvo minusov\n";
error=error+1;
}
if (minusindex==2)
{
cout << "error! nepravilnoe pologenie minusa\n";
error=error+1;
}
if (point>0)
{
cout << "error! vvedennoye chislo ne zeloe\n";
error=error+1;
}
if (letters>0)
{
cout << "error! obnarugeni odna ili neskolko bukv\n";
error=error+1;
}
if (punct>0)
{
cout << "error! obnarugen odin ili neskolko postoronnikh znakov punktuazii\n";
error=error+1;
}
if (error>0)
{
cout << "povtorite vvod!\n";
cout << "errors:" << error << "\n";
}
}
while(error>0);//цикл ввода будет повторяться до тех пор, пока не будет ошибок
//результаты
resint=atoi(str);
return resint;
}
double proverka2(char *mas)//проверка для вещественных чисел
{
const MaxSizeStr=10;
double resdouble;
int i,minus=0,minusindex=0,point=0,pointerrors=0,letters=0,punct=0,error=0;
char n,str[MaxSizeStr],minussign,pointsign;
minussign='-';
pointsign='.';
do
{
minus=0;
minusindex=0;
point=0;
pointerrors=0;
letters=0;
punct=0;
error=0;
do
{
cin >> str;
n=strlen(str);
if (n>MaxSizeStr)
cout << "error! vvedennoe chislo slishkom dlinnoe!\npovtorite vvod!\n";
}
while(n>MaxSizeStr);
for (i=0;i<n;i++)
{
if (str[i]==minussign && i==0)
{
minus=minus+1;
minusindex=1;
}
if (str[i]==minussign && i!=0)
{
minus=minus+1;
minusindex=2;
}
if (str[i]==pointsign && i==0)
{
point=point+1;
pointerrors=1;
}
if (str[i]==pointsign && i!=0 && i!=n-1)
{
point=point+1;
}
if (str[i]==pointsign && i==n-1)
{
point=point+1;
pointerrors=1;
}
if (isalpha(str[i])!=0)
{
letters=letters+1;
}
if (ispunct(str[i])!=0 && str[i]!=pointsign && str[i]!=minussign)
{
punct=punct+1;
}
}
//проверка
if (minus>1)
{
cout << "error! nepravilnoe kolichestvo minusov\n";
error=error+1;
}
if (minusindex==2)
{
cout << "error! nepravilnoe pologenie minusa\n";
error=error+1;
}
if (point>1)
{
cout << "error! nepravilnoe kolichestvo tochek\n";
error=error+1;
}
if (pointerrors==1)
{
cout << "error! nepravilnoe pologenie tochki\n";
error=error+1;
}
if (letters>0)
{
cout << "error! obnarugeni odna ili neskolko bukv\n";
error=error+1;
}
if (punct>0)
{
cout << "error! obnarugen odin ili neskolko postoronnikh znakov punktuazii\n";
error=error+1;
}
if (error>0)
{
cout << "povtorite vvod!\n";
cout << "errors:" << error << "\n";
}
}
while(error>0);
//результаты
resdouble=atof(str);
return resdouble;//возвращаем значение переменной в место вызова функции
}