">
Информатика Программирование
Информация о работе

Тема: Программа вычисления определенного интеграла методом двойного пересчета по формуле Симпсона.

Описание: Формальная постановка задачи. Математический метод решения. Словесный метод. Внешняя спецификация. Разработка алгоритма. Код программы. Стратегия для проведения тестирования. Надежность программы. Удобство сопровождения текста. Определённый интеграл в границах .
Предмет: Информатика.
Дисциплина: Программирование.
Тип: Курсовая работа
Дата: 22.08.2012 г.
Язык: Русский
Скачиваний: 28
Поднять уникальность

Похожие работы:

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего

профессионального образования

"МАТИ" - РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ

университет им. К.Э. Циолковского

Факультет №3

Кафедра "ИТ"

Курсовая работа

по дисциплине «Алгоритмические языки и программирование».

Тема: Программа вычисления определенного интеграла методом двойного пересчета по формуле Симпсона.

Оценка:______

Дата:________

Москва 2012

Содержание

1.Постановка задачи3

2.Формальная постановка задачи4

3.Метод решения5

4.Внешняя спецификация6

5.Разработка алгоритма7

5.1.Словесный:7

5.2.Блок-схема:8

7.КОД ПРОГРАММЫ9

8.Тестирование14

9.Заключение15

1.Постановка задачи

Составить программу вычисления определенного интеграла методом двойного пересчета по формуле Симпсона для функции y=exp(x*x).

2.Формальная постановка задачи

Задача: вычислить определенный интеграл методом двойного пересчета по формуле Симпсона. y=exp(x*x).

Дано: y=exp(x*x).

3.Метод решения

1.Математический метод решения:

Для вычисления интеграла методом двойного пересчёта по формуле Симпсона для y=exp(x*x). Проводится ввод пределов интегрирования и подстановка их в формулу Симпсона:



где  величина шага, а  границы отрезков.

2.Словесный метод:

Разделим все на ряд этапов:

В начале программы вводится отрезок интегрирования [a,b],и точность значения интеграла;

затем задаём цикл в котором производится расчёт значения интеграла для перехода к полной формуле Симпсона;

по окончании цикла расчёта значений , эти значения передаются в тело программы где проводится расчёт значения интеграла по точной формуле Симпсона;

далее происходит расчёт погрешности по формуле (S-S’)/15, где S’ точное значение интеграла, S- значение рассчитываемое по краткой формуле;

после на экран выводится значение интеграла по формуле Симпсона и полученная погрешность погрешность.

4.Внешняя спецификация

Назначение: Рассчитать значение интеграла, вывести на экран значение и погрешность расчёта.

Входные данные: nignij, verhnij, tochnost – нижний, верхний пределы и точность соответственно.

Выходные данные:

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:>=

=

Аномалии входных данных

Совпадение границ интегрирования nignij=verhnij -значение интеграла равно 0;

точность равная нулю или отрицательная выводится ошибка «Oshibka!Tochnost bolshe 0 menshe 1».

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.Блок-схема:

7. КОД ПРОГРАММЫ

#include

#include

#include

#include

#include

#include

#include

#include

// исходная функция

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). ";

cout << "Vvedite kontsi integrirovaniya ";

cout << "Vvedite nizhnij predel: ";

nignij=proverka2(str);

cout << " Vvedite verkhnij predel: ";

do

{//цикл проверки условися

verhnij=proverka2(str);

if(verhnijcout<<"Oshibka! Verkhnij bolshe nizhnego!";

}

while(verhnijcout << " Vvedite tochnost: ";

do

{//цикл проверки условия

tochnost=proverka2(str);

if(0>tochnost || tochnost>1 )

cout<< "Oshibka!Tochnost bolshe 0 menshe 1 ";

}

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 << " Pogreshnost 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! povtorite vvod! ";

}

while(n>MaxSizeStr);

for (i=0;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 ";

error=error+1;

}

if (minusindex==2)

{

cout << "error! nepravilnoe pologenie minusa ";

error=error+1;

}

if (point>0)

{

cout << "error! vvedennoye chislo ne zeloe ";

error=error+1;

}

if (letters>0)

{

cout << "error! obnarugeni odna ili neskolko bukv ";

error=error+1;

}

if (punct>0)

{

cout << "error! obnarugen odin ili neskolko postoronnikh znakov punktuazii ";

error=error+1;

}

if (error>0)

{

cout << "povtorite vvod! ";

cout << "errors:" << error << " ";

}

}

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! povtorite vvod! ";

}

while(n>MaxSizeStr);

for (i=0;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 ";

error=error+1;

}

if (minusindex==2)

{

cout << "error! nepravilnoe pologenie minusa ";

error=error+1;

}

if (point>1)

{

cout << "error! nepravilnoe kolichestvo tochek ";

error=error+1;

}

if (pointerrors==1)

{

cout << "error! nepravilnoe pologenie tochki ";

error=error+1;

}

if (letters>0)

{

cout << "error! obnarugeni odna ili neskolko bukv ";

error=error+1;

}

if (punct>0)

{

cout << "error! obnarugen odin ili neskolko postoronnikh znakov punktuazii ";

error=error+1;

}

if (error>0)

{

cout << "povtorite vvod! ";

cout << "errors:" << error << " ";

}

}

while(error>0);

//результаты

resdouble=atof(str);

return resdouble;//возвращаем значение переменной в место вызова функции

}

8.Тестирование

Для проведения тестирования была выбрана

Стратегия “Черный ящик”. Название теста Исходные данные Результат 

Эталонный результат  1. Проверка совпадения концов интегрирования nignij =0

verhnij=0

tochnost’=2 Poln Simp=0



Poln Simp=0

 2 Проверка точности nignij =2

verhnij=4

tochnost’=0.1 PolnSimp=1,1493e+006

Pogr=0,0064329 PolnSimp=1,1493e+006

Pogr=0,0064329  3 Проверка ввода nignij=кен

verhnij=

tochnost’= error! obnarugen odin ili neskolko postoronnikh znakov punktuazii

povtorite vvod!

errors:1 error! obnarugen odin ili neskolko postoronnikh znakov punktuazii

povtorite vvod!

errors:1  4 Проверка ввода nignij=5

verhnij=кен

tochnost’= Oshibka!Tochnost bolshe 0 menshe 1 Oshibka!Tochnost bolshe 0 menshe 1  5 Проверка ввода nignij=7

verhnij=9

tochnost=ghf error! obnarugen odin ili neskolko bukv

povtorite vvod!

errors:1 error! obnarugen odin ili neskolko bukv

povtorite vvod!

errors:1  6 Проверка знаков

+ - * / nignij=45-45

verhnij=

tochnost’= error! nepravilnoe pologenie minusa

povtorite vvod!

errors:1 error! nepravilnoe pologenie minusa

povtorite vvod!

errors:1  7 Проверка знаков

пунктуации nignij=45

verhnij=

tochnost’= error! nepravilnoe pologenie tochek punktuazii

povtorite vvod!

errors:1 error! nepravilnoe pologenie tochek punktuazii

povtorite vvod!

errors:1  

9.Заключение

Данная программа рассчитывает определённый интеграл в границах [a,b] для функции y=exp(x*x),выводит на значение погрешности расчёта интеграла.

Удобство сопровождения текста программы обеспечивается правильным оформлением, а также достаточным количеством комментариев, которые позволяют быстрее ориентироваться в её коде.

Пояснительная записка содержит всю необходимую информацию о модулях, подпрограммах, структурах данных, а так же методах тестирования. Существует возможность корректного исполнения исходных кодов с другими версиями среды разработки С++.

Разработанная программа, по моему мнению, полностью соответствует поставленной задаче. В программе используется вспомогательный код проверки, который более чем в три раза превышает объем самой программы вычисления. Он способствует сведению к минимуму вероятности некорректного завершения программы, за счет проверки правильности исходных вводимых данных.

Надежность программы была проверена по стратегии черного ящика и полученные результаты вычисления были полностью идентичны эталонному значению.