Смекни!
smekni.com

Вычисление интеграла методом Ньютона-Котеса (теория и программа на Паскале) (стр. 2 из 5)

procedure win2(ea:word;var k:word);

procedure wwodn(ea:word;var n:integer);

procedure wwodab(ea:word;var a,b:real);

procedure wwod1(ea:word;var y:array of double;var n:integer;var a,b:real);

procedure wwod2(ea:word;var ea1:word;var n:integer;var a,b:real;var st:string);

procedure win3(ea:word;n:integer;a,b:real;int:double;f:string;h:array of double;var k:word);

implementation

procedure proline(ea:word);

{Проседура полосы процесса}

var

i:integer;

f:string;

c:char;

begin

newsc(ea);

setcolor(15);

setfillstyle(1,7);

bar(160,150,460,260);

rectangle(165,155,455,255);

rectangle(167,157,453,253);

case (ea mod 2) of

0: outtextxy(180,170,' Идет работа .Ждите..');

1: outtextxy(180,170,' Working.Please wait..');

end;

setfillstyle(1,12);

setcolor(0);

rectangle(200,199,401,221);

for i:=1 to 9 do

line(200+i*20,200,200+i*20,220);

delay(20000);

for i:=1 to 100 do

begin

if ((i-1) mod 10)=0 then

line(200+((i-1) div 10)*20,200,200+((i-1) div 10)*20,220);

bar(round(200+2*(i-0.5)),200,200+2*i,220);

delay(1100);

setcolor(15);

setfillstyle(1,7);

bar(280,230,323,250);

str(i,f);

f:=f+'%';

outtextxy(290,235,f);

if (i mod 25) =0 then

bar(170,180,452,198);

if (ea mod 2)=0 then

case (i div 25) of

0:

outtextxy(170,190,'Подготовка ');

1:

outtextxy(170,190,'Расчет коеффициентов в многочлене');

2:

outtextxy(170,190,'Расчет коеффициентов Ньютона-Котеса');

3:

outtextxy(170,190,'Расчет интеграла');

end

else

case (i div 25) of

0:

outtextxy(170,190,'Prepearing');

1:

outtextxy(170,190,'Calculation of mnogochlen coeff.');

2:

outtextxy(170,190,'Calculation of Newton-Cotes coeff. ');

3:

outtextxy(170,190,'Calculation of integral');

end;

setfillstyle(1,12);

setcolor(0);

end;

end;

procedure winwwodn(ea:word);

{Окно ввода числа узлов интерполяции}

var

c:char;

f:string;

begin

helpwin(ea);

if (ea mod 2) =0 then

begin

outtextxy(360,140,' В этом окне необходимо ');

outtextxy(360,155,' ввести количество узлов ');

outtextxy(360,170,' интерполяции, от которого ');

outtextxy(360,185,' будет зависить точность ');

outtextxy(360,200,' вычисления интеграл и ');

outtextxy(360,215,' количество зн чений функции.');

outtextxy(360,240,' ВНИМАНИЕ : НАСТОЯТЕЛЬНО ');

outtextxy(360,250,' РЕКОМЕНДУЕТСЯ НЕ ВВОДИТЬ ');

outtextxy(360,260,' ЗНАЧЕНИЕ N БОЛЬШЕ 12 !! ');

end

else

begin

outtextxy(360,140,' In this window you have to ');

outtextxy(360,155,' put into the number. ');

outtextxy(360,170,' The accuracy of calculation ');

outtextxy(360,185,' and the number of function ');

outtextxy(360,200,' parameters will depend on ');

outtextxy(360,215,' this number. ');

outtextxy(360,240,' WARNING: IT IS HARDLY ');

outtextxy(360,250,' RECOMENDED NOT TO PUT IN ');

outtextxy(360,260,' NUMBER MORE THEN 12 !! ');

end;

setcolor(2);

setfillstyle(1,14);

bar(70,200,340,300);

rectangle(75,205,335,295);

rectangle(77,207,333,293);

if (ea mod 2) =0 then

begin

outtextxy(90,227,'Введите количество узлов(n):');

outtextxy(80,270,'ВНИМАНИЕ: При больших n возможна');

outtextxy(80,280,'некорректная работа компьютера!!');

end

else

begin

outtextxy(80,217,'Put in number of');

outtextxy(80,227,' interpolation units:');

outtextxy(80,270,'WARNING:if you use big number ');

outtextxy(80,280,'of units,PC wont work properly!');

end;

setfillstyle(1,0);

bar(190,240,230,255);

end;

procedure wwodn(ea:word;var n:integer);

{Процедура ввода узлов n}

var

ec,p:integer;

k,f:string;

x:integer;

c:char;

begin

newsc(ea);

winwwodn(ea);

repeat

repeat

winwwodn(ea);

gotoxy(25,16);

read(k);

val(k,p,ec);

if ec<>0 then

begin

error1(ea);

readln;

end;

until ec=0;

n:=p;

if n>12 then

begin

if keypressed then

c:=readkey;

c:='r';

setcolor(15);

setfillstyle(1,12);

bar(140,210,490,300);

rectangle(145,215,485,295);

rectangle(147,217,483,293);

if (ea mod 2) =0 then

begin

outtextxy(150,227,' Предупреждение!');

outtextxy(150,237,' Вы дейcтвительно хотите использовать');

outtextxy(150,250,' большое значение N ???');

end

else

begin

outtextxy(150,227,' Warning!! ');

outtextxy(150,237,' Do you realy want to use a big ');

outtextxy(150,250,' number interpolation units(N)??? ');

end;

sound(600);

delay(4000);

nosound;

setfillstyle(1,2);

bar(320,260,350,280);

setfillstyle(1,12);

bar(250,260,280,280);

repeat

if keypressed then

begin

c:=readkey;

if (c=#80) or (c=#72) or (c=#77) or (c=#75) then

x:=x+1;

setfillstyle(1,2);

if (x mod 2)=0 then

begin

bar(250,260,280,280);

setfillstyle(1,12);

bar(320,260,350,280);

end

else

begin

bar(320,260,350,280);

setfillstyle(1,12);

bar(250,260,280,280);

END;

end;

if (ea mod 2) =0 then

begin

outtextxy(255,267,'ДА');

outtextxy(325,267,'НЕТ');

end

else

begin

outtextxy(255,267,'YES');

outtextxy(325,267,'NO');

end;

until c=#13;

if abs(x mod 2)=1 then

begin

n:=0;

setcolor(15);

setfillstyle(1,2);

bar(160,200,460,280);

rectangle(165,205,455,275);

rectangle(167,207,453,273);

if (ea mod 2)=0 then

begin

outtextxy(180,227,'Для работы программы необходимо');

outtextxy(180,237,' заново ввести N.');

outtextxy(180,247,' Нажмите ENTER для продолжения.');

end

else

begin

outtextxy(180,227,' To continue you have to ');

outtextxy(180,237,' again put in N. ');

outtextxy(180,247,' Press ENTER to continue.');

end;

readln;

readln;

end;

end;

until n>0;

end;

procedure winwwodab(ea:word);

{Окно ввода приделов интегрирования}

var

f:string;

begin

helpwin(ea);

if (ea mod 2)=0 then

begin

outtextxy(360,140,' В этом окне необходимо');

outtextxy(360,155,' ввести сначала нижнее');

outtextxy(360,170,' значение интеграл и нажать');

outtextxy(360,185,' ENTER, а затем ввести');

outtextxy(360,200,' верхнее значение интеграла');

outtextxy(360,215,' и снова нажать ENTER.');

end

else

begin

outtextxy(360,140,' In this window you have to:');

outtextxy(360,155,'firstly, put in lower value ');

outtextxy(360,170,'of integral and press ENTER,');

outtextxy(360,185,'then put in higher value');

outtextxy(360,200,'of integral and press ENTER');

end;

setcolor(2);

setfillstyle(1,5);

bar(10,210,335,320);

rectangle(15,215,330,315);

rectangle(17,217,328,313);

settextstyle(0,0,0);

if (ea mod 2)=0 then

begin

outtextxy(20,230,' Введите нижнее значение');

outtextxy(20,244,' интеграл :');

outtextxy(20,262,' Введите верхнее значение');

outtextxy(20,272,'интеграл :');

end

else

begin

outtextxy(20,230,' Put in lower value of');

outtextxy(20,244,' integral:');

outtextxy(20,262,' Put in higher value of');

outtextxy(20,272,'integral:');

end;

end;

procedure wwodab(ea:word;var a,b:real);

{Процедура ввода приделов интегрирования}

var

f:string;

k:string;

ec:integer;

begin

newsc(ea);

winwwodab(ea);

readln;

repeat

winwwodab(ea);

gotoxy(16,16);

read(k);

val(k,a,ec);

if ec<>0 then

error1(ea);

until ec=0;

readln;

repeat

winwwodab(ea);

str(a:4:2,f);

outtextxy(120,244,f);

gotoxy(16,18);

read(k);

val(k,b,ec);

if ec<>0 then

error1(ea);

until ec=0;

end;

procedure helpwin(ea:word);

{основа окна помощи}

begin

setfillstyle(1,3);

bar(350,100,590,380);

setcolor(0);

rectangle(353,103,587,377);

rectangle(355,105,585,375);

setcolor(14);

if (ea mod 2)=0 then

outtextxy(360,115,' ОКНО ПОМОЩИ')

else

outtextxy(360,115,' HELP WINDOW');

end;

procedure error1(ea:word);

begin

setcolor(15);

setfillstyle(1,12);

bar(140,210,490,280);

rectangle(145,215,485,275);

rectangle(147,217,483,273);

if (ea mod 2)=0 then

begin

outtextxy(150,227,' Ошибка! ');

outtextxy(150,237,' Вводимые параметр не число!! ');

outtextxy(150,250,' Проверьте значение и заново введите его.');

end

else

begin

outtextxy(150,227,' Error! ');

outtextxy(150,237,' The value you entered isn`t a quantity!!');

outtextxy(150,250,' Check it and put it in again. ');

end;

sound(600);

delay(4000);

nosound;

readln;

readln;

end;

procedure error(ea:word);

{Процедура ошибки}

begin

setcolor(15);

setfillstyle(1,12);

bar(140,210,490,260);

rectangle(145,215,485,255);

rectangle(147,217,483,253);

if (ea mod 2)=0 then

begin

outtextxy(150,227,' Ошибка!');

outtextxy(150,237,' Недостаток вводимых параметров!!');

end

else

begin

outtextxy(150,227,' Error!');

outtextxy(150,237,' Not all parameters are set!');

end;

sound(600);

delay(4000);

nosound;

readln;

end;

procedure newsctext(ea:word);

{Текст для процедуры newsc}

begin

if ea mod 2 =0 then

begin

settextstyle(0,0,1);

setcolor(15);

outtextxy(400,440,'Язык - Русский. ');

outtextxy(400,450,'Версия 1.0 Последнее издание');

outtextxy(400,460,'й Все права защищены.');

end

else

begin

settextstyle(0,0,1);

setcolor(15);

outtextxy(400,440,'Language - English.');

outtextxy(400,450,'Version 1.0 Final release.');

outtextxy(400,460,'й All rights reserved.');

end;

end;

procedure newsc(ea:word);

{Процедура обновления экрана}

begin

cleardevice;

setfillstyle(10,8);

floodfill(1,1,15);

setcolor(0);

setfillstyle(1,7);

bar(80,10,580,80);

rectangle(82,12,578,78);

rectangle(85,15,575,75);

settextstyle(0,0,2);

setcolor(10);

if ea mod 2 =0 then

begin

settextstyle(0,0,2);

outtextxy(90,20,' Вычисление интеграл ');

outtextxy(90,50,' методом Ньютона-Котеса.');

newsctext(ea);

end

else

begin

settextstyle(3,0,2);

outtextxy(90,20,' Calculeting of integral');

outtextxy(90,47,' using the Newton-Cotes method.');

newsctext(ea);

end;

settextstyle(0,0,1);

end;

procedure winwin1;

{Окно процедуры win1}

begin

setfillstyle(1,7);

bar(160,110,460,380);

setcolor(0);

rectangle(162,113,457,377);

rectangle(165,115,455,375);

end;

procedure win1(ea:word);

{Вводное окно}

begin

settextstyle(0,0,1);

setcolor(10);

if (ea mod 2)=0 then

begin

outtextxy(168,135,'Министерство Высшего образования РФ);

outtextxy(168,150,'Московский Государственный Институт');

outtextxy(168,160,' Электронной Техники ');

outtextxy(168,170,' (Технический лниверситет) ');

outtextxy(168,180,' Лицей №1557 ');

outtextxy(168,210,' КУРСОВАЯ РАБО'А ');

outtextxy(168,230,' «Вычисление интеграла ');

outtextxy(168,245,' метедом Ньютона-Котеса» ');

outtextxy(158,270,' Написал: Коноплев А.А. ');

outtextxy(158,285,' Руководитель: доцент Колдаев В.Д.');

end

else

begin

outtextxy(168,135,' Department of High Education ');

outtextxy(168,150,' Moscow State Institute of ');

outtextxy(168,160,' Electronic Technics ');

outtextxy(168,170,' (Technics University) ');

outtextxy(168,180,' Lyceum №1557 ');

outtextxy(168,210,' COURSE WORK ');

outtextxy(168,230,' «Calculation of integral ');

outtextxy(168,245,' by Newton-Cotes method» ');

outtextxy(158,270,' Author: Konoplev A.A. ');

outtextxy(158,285,' Supervisor:senior lecturer ');

outtextxy(158,300,' Koldaev V.D. ');

end;

end;

procedure win2(ea:word;var k:word);

{Окно выбора способа подсчета }

var

c:char;

x:integer;

f:string;

begin

setcolor(2);

setfillstyle(1,5);

bar(70,200,340,330);

rectangle(75,205,335,325);

rectangle(77,207,333,323);

settextstyle(0,0,0);

setfillstyle(1,15);

bar(80,250,330,270);

setfillstyle(1,5);

bar(80,285,330,305);

if ea mod 2 =0 then

begin

outtextxy(77,220,'Выбирете способ задания значений');

outtextxy(75,230,' функции. ');

outtextxy(70,255,' По таблице(в ручную)');

outtextxy(70,295,' По расчетам(автом т.)');

end

else

begin

outtextxy(77,220,' Choose a method of putting in');

outtextxy(75,230,' the values of function. ');

outtextxy(70,255,' By the table(by hand)');

outtextxy(70,295,' By calculations(automat.)');

end;

helpwin(ea);

if ea mod 2 =0 then

begin

outtextxy(360,140,'В этом способе необходимо');

outtextxy(360,155,'самостоятельно вводить');

outtextxy(360,170,'значения функции.');

end

else

begin

outtextxy(360,140,'In this method you have');

outtextxy(360,155,'to put in values of ');

outtextxy(360,170,'function by yourself.');

end;

x:=0;

repeat

if keypressed then

begin

c:=readkey;

if (c=#80) or (c=#72) then

x:=x+1;

setfillstyle(1,15);

if (x mod 2)=0 then

begin

bar(80,250,330,270);

setfillstyle(1,5);