Технологии программирования

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    864,02 Кб
  • Опубликовано:
    2014-09-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Технологии программирования

Введение

В настоящее время резко возрос интерес к языкам высокого уровня благодаря возможности использования в научных исследованиях, в технике и экономике вычислительных машин, выполняющих построение некоторых величин в точном соответствии с указанным алгоритмом. Эта возможность привлекательна по той причине, что явления и процессы, которые изучаются в рамках упомянутых исследований, часто удается описать с помощью понятий математики - функций, систем уравнений, неравенств - и для получения конкретных сведений об изучаемых явлениях и процессах надо провести некоторые действия над математическими объектами. Человеку достаточно описать алгоритм необходимых преобразований и вычислений, а сами действия (как правило, настолько обширные и громоздкие, что их невозможно выполнить вручную) выполнит вычислительная машина.

Правила записи алгоритма для выполнения его вычислительной машиной оказываются очень жесткими - автомат не может ничего додумывать за человека. Совокупность средств и правил представления алгоритма в виде, пригодном для выполнения вычислительной машиной, называется языком программирования, а каждый алгоритм, записанный на некотором языке программирования, называется программой. Для удобства составления программ предлагаются различные языки программирования.

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

1.Краткое описание предметной области

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


разбивается отрезок интегрирования [a,b] на n равных частей точками


Значения функции y=f(x) в точках разбиения xi обозначено через yi. Непрерывная подынтегральная функция y=f(x) заменяется сплайном - кусочно-полиномиальной функцией S(x), аппроксимирующей данную функцию.

Интегрируя функцию S(x) на отрезке [a,b], получается некоторая формула численного интегрирования (квадратурная формула).

В зависимости от функции , аппроксимирующей подынтегральную функцию, получаются различные квадратурные формулы.

Если на каждой части [xi-1,xi] (i=1,n) деления отрезка [a,b] функцию y=f(x) заменить функцией, принимающей постоянное значение, равное, например, значению функции y=f(x) в серединной точке i-й части


то функция будет иметь ступенчатый вид:


в этом случае:


и получается квадратурную формулу прямоугольников:


Если функцию y=f(x) на каждом отрезке [xi-1,xi] заменить её линейной интерполяцией по точкам (xi-1,yi-1) и (xi,yi), то получится непрерывная кусочно-линейная функция

,

Графиком этой функции является ломаная линия.

В этом случае:

в итоге получена квадратурная формула трапеций:


Можно получить квадратурную формулу Симпсона, называемую также формулой парабол, если сплайн S(x), аппроксимирующий подынтегральную функцию y=f(x), представляет собой непрерывную функцию, составленную из примыкающих парабол. На отрезке [xi-1,xi] парабола проходит через точки (xi-1,yi-1), (xi-1/2,yi-1/2), (xi,yi). Используя построение интерполяционного многочлена Лагранжа второго порядка на отрезке [xi-1,xi], получим сплайн:


Для дальнейших преобразований вводится переменная t € [0,1] с помощью равенства x = xi-1+h*t. Выражают сплайн через новую переменную:


Учитывая, что


В результате получена квадратурная формула парабол(или формула Симпсона):


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

2.Описание последовательности действий программы при вычислении интеграла от заданной функции в заданных пределах по формулам Симпсона, прямоугольников и трапеций

.        Вводим функцию, как она есть, соблюдая правила расстановки знаков и скобок.

.        Вводим нижний предел.

.        Вводим верхний предел.

.        Вводим количество отрезков для разбиения.

.        Выбираем метод для вычисления интеграла

По формуле Симпсона

По формуле прямоугольников

.По формуле трапеций

.        Нажимаем кнопку вычислить.

.        Проверяется выбранный метод, в зависимости от выбора рассчитывается интеграл по соответствующему методу.

.        Для формулы Симпсона, сначала рассчитываются первые два узла интегрирования и шаг.(для других методов аналогично, только меняются пункты 8, 9, 10)

.        После, рассчитываются результаты интегрирования на 3ем узле и 4том. Здесь используются потоки, в зависимости от количества отрезков на каждый узел.

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

.        На экран выводится метка с результатом интегрирования.

.        После расчетов и просмотра результатов, окончание работы программы производится кнопкой выход.

3.Краткая инструкция по работе программы

программирование средний прямоугольник формула

Данная программа разработана для вычисления интеграла от заданной функции в заданных пределах по формуле Симпсона, прямоугольников, трапеций

Для того чтобы начать работу необходимо запустить файл PrIntegral.exe. После запуска на экране появится окно (рис. 1).

Рис 1. Запуск программы.

Далее необходимо ввести функцию (рис. 2).

Рис 2. Ввод функции

Далее необходимо ввести пределы интегрирования (верхний и нижний) (рис. 3,4).

Рис 3,4. Ввод верхнего и нижнего пределов интегрирования.

Далее необходимо ввести количество частей, для подготовки функции к разбиению (рис. 5).

Риск 5. Ввод количества частей для разбиения

После выбирается необходимый метод для вычисления интеграла (рис. 6).

Рис 6. Выбор метода для вычисления

Далее после ввода всех данных и выбора метода необходимо нажать кнопку вычислить (рис. 7).

Рис 7. Вычисление.

После появится метка в левом нижнем экране с результатом вычислений (рис. 8).

Рис 8. Результат вычислений.

Для выхода из программы необходимо кликнуть на кнопку Выход (рис. 9).

Рис 9. Результат вычислений

4.Листинг программы

Исходный текст программы (основной модуль)

unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, UFunction, jpeg, ExtCtrls, Unit2, Unit3;= class(TForm): TLabel;: TLabel;: TEdit;: TEdit;: TButton;: TEdit;: TRadioButton;: TRadioButton;: TRadioButton;: TEdit;: TButton;: TImage;: TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;Edit1KeyPress(Sender: TObject; var Key: Char);Edit2KeyPress(Sender: TObject; var Key: Char);Edit4KeyPress(Sender: TObject; var Key: Char);Button1Click(Sender: TObject);Edit5KeyPress(Sender: TObject; var Key: Char);Button4Click(Sender: TObject);FormCreate(Sender: TObject);

{ Private declarations }

{ Public declarations }

simc2,simc3:extended; //переменные для суммирования результатов потока

end;: TForm1;: string;

a, b : extended;//границы интегрирования,счетчик: integer;//разбить на nc частей

implementation

{$R *.dfm}TForm1.FormCreate(Sender: TObject);.Visible:=False;.Visible:=False;;TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);not (key in['0'..'9', 'a'..'z', #8, #13, '-', '+', '*', '/',

'^', ',', '.', '(', ')']) then key:=#0;;TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);not (key in['0'..'9', #8, '-', 'E', 'e', ',', '.']) then key:=#0;;TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);not (key in['0'..'9', #8, '-', 'E', 'e', ',', '.']) then key:=#0;;TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);not (key in['0'..'9', #8]) then key:=#0;;Pr;:=Form1.Edit5.Text;length(OldFStroka) = 0 then;:=FStroka;elseOldFStroka <> FStroka then;;:=FStroka;;;Log: boolean;Form1.Edit5.Text <> '' then Log:=true else Log:=false;Form1.Edit1.Text <> '' then a:=strtofloat(Form1.Edit1.Text) else:=false;Form1.Edit2.Text <> '' then b:=strtofloat(Form1.Edit2.Text) else:=false;Form1.Edit4.Text <> '' then nc:=strtoint(Form1.Edit4.Text) else:=false;;

//формула СимпсонаIntegralSimpson: extended;c0, c1, c2, c3, c4, dx: extended;: integer; Thr: Threadc2;Thr2: Threadc3;: real;:=(b-a)/(3*nc);:=(F(a)+F(b))/2;:=(b-a)/nc;:=0; i:=0;:=0; k:=-0.5;:=i+1;:=Threadc2.Create(False);.Priority:=tpHighest;.FreeOnTerminate:=True;.a:=a;.dx:=dx;.nc:=nc;.i:=i;i = nc-1;:=k+1;:=Threadc3.Create(False);.Priority:=tpHighest;.FreeOnTerminate:=True;.a:=a;.dx:=dx;.nc:=nc;.k:=k;k = nc-0.5;:=c0*(c1+Form1.simc2+2*Form1.simc3);;

//формула прямоугольниковIntegralPrmg: extended;sum, dx: extended;: real;:=(b-a)/nc;:=0; k:=-0.5;:=k+1;:=sum+F(a+dx*k);k = (2*nc-1)/2;:=dx*sum;;

//формула трапецийIntegralTrap: extended;dx, c0, c1: extended;: integer;:=(b-a)/nc;:=(F(a)+F(b))/2;:=0; i:=0;:=i+1;:=c1+F(a+dx*i);i = nc-1;:=dx*(c0+c1);;TForm1.Button1Click(Sender: TObject);;simc2:=0;simc3:=0;.Caption:='';Log thenForm1.RadioButton1.Checked then Form1.Label3.Caption:=floattostr(IntegralSimpson)Form1.RadioButton2.Checked then Form1.Label3.Caption:=floattostr(IntegralPrmg) elseForm1.RadioButton3.Checked then Form1.Label3.Caption:=floattostr(IntegralTrap);.Visible:=True;.Visible:=True;;TForm1.Button4Click(Sender: TObject);;;.

Исходный текс потока 1(Unit2)Unit2;;= class(TThread)

{ Private declarations }Execute; override;SIMP;,a,tr2,c,cc,c0,c1,c2,c3,nc,k:Extended;

i:integer;

end;unit1, Forms, SysUtils, UFunction;

{ Threadc2 }Threadc2.SIMP;:=F(a+dx*i);.simc2:=Form1.simc2+c2;;Threadc2.Execute;;

end;.

Исходный текс потока 2(Unit3)

unit Unit3;;= class(TThread)

{ Private declarations }Execute; override;SIMP;,a,tr2,c,cc,c0,c1,c2,c3,nc,k:Extended;

i:integer;;

implementationunit1, Forms, SysUtils, UFunction;

{ Threadc3 }Threadc3.SIMP;:=F(a+dx*i);.simc3:=Form1.simc3+c3;;Threadc3.Execute;;

end;.

Дополнительный модуль(UFunction):UFunction;, SysUtils, Math;: array[1..10] of string[6] = ('arcsin', 'arccos', 'arctan', 'sin', 'cos', 'tan', 'ctg', 'ln', 'exp', 'abs');= ^extended;= ^Dat;= record, R: PExt;: integer;: extended;: ElemSh;;

Var

FStroka: string;//функция в виде строки

Mch: array of PExt;, nn: integer;: PExt;: extended;: ElemSh;: ElemSh;F(X: extended): extended;//функцияCreateSh;//создать схемуDeleteSh;//удалить схемуStrToLogstr(str: string): string;i, k: integer;: string;:=str;pos(' ', s) <> 0 do delete(s, pos(' ', s), 1);s[1] = '-' then insert('0', s, 1);;pos('(-', s) <> 0 do insert('0', s, pos('(-', s)+1);i:=low(a) to high(a) dopos(a[i], s) <> 0 do('f'+inttostr(i), s, pos(a[i], s));(s, pos(a[i], s), length(a[i]));;:=0;:=i+1;s[i] = 'f' then:=i+1;s[k] <> '(' do:=k+1;k > length(s) then break;;:=i+(k-i-1);elses[i] in ['0'..'9', ',', '.'] then:=i;s[k] in['0'..'9', ',', '.'] do:=k+1;k > length(s) then break;;:=n+1;:=new(PExt);(MCh, n+1);[n]:=p;^:=strtofloat(copy(s, i, k-i));(s, i, k-i);('<'+inttostr(n)+'>', s, i);n < 10 then i:=i+2 else if n < 100 then i:=i+3 else if n < 1000 then i:=i+4;else(s[i] = 'p') or (s[i] = 'e') then:=new(PExt);s[i] = 'p' then p^:=pi else p^:=exp(1);s[i] = 'p' then delete(s, i, 2) else delete(s, i, 1);:=n+1;('<'+inttostr(n)+'>', s, i);(MCh, n+1);[n]:=p;n < 10 then i:=i+2 else if n < 100 then i:=i+3 else if n < 1000 then i:=i+4;elses[i] = 'x' then(s, i, 1);:=n+1;('<'+inttostr(n)+'>', s, i);(MCh, n+1);[n]:=@FX;n < 10 then i:=i+2 else if n < 100 then i:=i+3 else if n < 1000 then i:=i+4;;i >= length(s);:=n;:=s;;InsUz(AddrL, AddrR: PExt; fnd: integer; var U: ElemSh);(U);^.L:=AddrL;^.R:=AddrR;^.fn:=fnd;^.Next:=nil;;Fbs(str: string): string;i, k, t, m, NOper: integer;: string;: ElemSh;:=str;(pos('^', s) <> 0) or (pos('*', s) <> 0) or (pos('/', s) <> 0) do:=U;:=4;not (s[i] in['^', '*', '/']) do i:=i+1;:=0;s[i] = '*' then NOper:=high(a)+3 elses[i] = '/' then NOper:=high(a)+4 elses[i] = '^' then NOper:=high(a)+5;:=i-2;s[k-1] <> '<' do k:=k-1;//(k-1) - поз. '<':=strtoint(copy(s, k, i-k-1));:=k;:=i+2;s[k+1] <> '>' do k:=k+1;//(k+1) - поз. '>'(Mch[m], Mch[strtoint(copy(s, i+2, k-i-1))], NOper, U);Q <> nil then Q^.Next:=U else BeginUz:=U;:=n+1;(MCh, n+1);[n]:=@U^.Rez;(s, t, k-t+1);(inttostr(n), s, t);;(pos('+', s) <> 0) or (pos('-', s) <> 0) do:=U;:=2;not (s[i] in['+', '-']) do i:=i+1;:=0;s[i] = '+' then NOper:=high(a)+1 elses[i] = '-' then NOper:=high(a)+2;:=i-2;s[k-1] <> '<' do k:=k-1;//(k-1) - поз. '<':=strtoint(copy(s, k, i-k-1));:=k;:=i+2;s[k+1] <> '>' do k:=k+1;//(k+1) - поз. '>'(Mch[m], Mch[strtoint(copy(s, i+2, k-i-1))], NOper, U);Q <> nil then Q^.Next:=U else BeginUz:=U;:=n+1;(MCh, n+1);[n]:=@U^.Rez;(s, t, k-t+1);(inttostr(n), s, t);;:=s;;Skb(str: string; var U: ElemSh);i, k, g: integer;, sc: string;: ElemSh;:=str;pos('(', s) <> 0 do:=pos(')', s);:=i-4;s[k] <> '(' do k:=k-1;s[k-1] in['0'..'9'] then:=Fbs(copy(s, k+1, i-k-1));:=U;:=k-1;s[g-1] <> 'f' do g:=g-1;(MCh[strtoint(copy(sc, 2, length(sc)-2))], nil, strtoint(copy(s, g, k-g)), U);Q <> nil then Q^.Next:=U else BeginUz:=U;:=n+1;(MCh, n+1);[n]:=@U^.Rez;(s, g-1, i-g+2);('<'+inttostr(n)+'>', s, g-1);else(k-1 = 0) or (s[k-1] in['+', '-', '*', '/', '^', '(']) then:=Fbs(copy(s, k+1, i-k-1));(s, k, i-k+1);(sc, s, k);; end;:=Fbs(s);U <> nil then if BeginUz <> U then U^.Next:=BeginUz;;CompileUz(var U: ElemSh);U^.fn of

: U^.Rez:=arcsin(U^.L^);

: U^.Rez:=arccos(U^.L^);

: U^.Rez:=arctan(U^.L^);

: U^.Rez:=sin(U^.L^);

: U^.Rez:=cos(U^.L^);

: U^.Rez:=sin(U^.L^)/cos(U^.L^);

: U^.Rez:=cos(U^.L^)/sin(U^.L^);

: U^.Rez:=ln(U^.L^);

: U^.Rez:=exp(U^.L^);

: U^.Rez:=abs(U^.L^);

: U^.Rez:=U^.L^+U^.R^;

: U^.Rez:=U^.L^-U^.R^;

: U^.Rez:=U^.L^*U^.R^;

: U^.Rez:=U^.L^/U^.R^;

: if U^.L^ = 0 then U^.Rez:=0 else U^.Rez:=exp(U^.R^*ln(U^.L^));;;CreateSh;(strtologstr(FStroka), U);:=-1;(MCh, nn+1);;DeleteSh;Q: ElemSh;: integer;:=BeginUz;U <> nil then if U^.Next = nil then Dispose(U) else:=U;:=U^.Next;(Q);U^.Next = BeginUz;(U);;:=nil;i:=low(Mch) to nn do if Mch[i] <> @FX then dispose(Mch[i]);(MCh, 0);:=nil;;F(X: extended): extended;:=X;:=BeginUz;U = nil then F:=Mch[0]^ elseU^.Next = nil then CompileUz(U) else(U);:=U^.Next;U^.Next = BeginUz;(U);;:=U^.Rez;;;:=-1;.

Заключение

В заключение хотелось бы отметить, что методы структурного программирования позволяют более мобильно и качественно проводить работу по модернизации программного обеспечения. Так достаточно усовершенствовать отдельный модуль откомпилировать его и главный модуль, для достижения, желаемого результата. Более того, текст главной программы более читаем, и занимает меньше места. Имеющиеся наработки в отдельных модулях можно использовать в других программах, не задумываясь об их работоспособности. Четко вычерченная структура позволяет яснее представить цели и задачи стоящие перед программистом. Не нужно все время перемещаться по тексту взад и вперед. В любой промежуток времени работы над очень большой программной появляется возможность сконцентрироваться на отдельном модуле. Открывается возможность совместной работы нескольких человек над одной громоздкой программной. Удачно разработанный модуль одного программиста становиться, доступен другим.

Список литературы

1. Культин Н.П. Delphi в задачах и примерах.- БХВ-Петербург, 2010. - 288 с

. Амосов А. А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров.- М.: Высшая школа, 2008. - 544 с

. Хомосенко А.А, Гофман В.А., Мещеряков Е.В., Никифоров И.П. Delphi 7. Наиболее полное руководство.- БХВ - Петербург, 2009. - 355 с.

1. 


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!