Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика курсач Томаа.doc
Скачиваний:
12
Добавлен:
24.09.2019
Размер:
145.92 Кб
Скачать

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;//возвращаем значение переменной в место вызова функции

}