СЕДЬМАЯ ЛАБОРАТОРНАЯ ЦИФРОВОЙ ПРАКТИКУМ. седьмая лабораторная практикум. Алгоритмы повторений
![]()
|
Санкт-Петербургский политехнический университет Петра Великого Институт машиностроения, материалов и транспорта Высшая школа машиностроения Отчет по лабораторной работе №7 Дисциплина: «Цифровой практикум» Тема: «Алгоритмы повторений» Студент гр. 3331506/10001 Суднеко В.П. Преподаватель Ситкин Д.С. Санкт-Петербург 2021 Цель работы: приобретение умений разработки и программной реализации циклических алгоритмов. Задание I: разработать алгоритм вычисления значений x и y параметрической функции для значений параметра t от a до b с шагом h и реализовать его в проекте ![]() Задание II: разработать алгоритм вычисления конечной суммы или произведения и реализовать его в проекте ![]() Задание III: разработать алгоритм вычисления бесконечной суммы с точностью ![]() ![]() На рисунке 1 представлена блок-схема первого алгоритма. ![]() Рисунок 1 – Алгоритм вычисления таблицы значений x и y Код программы №1 представлен ниже. unit Lab7_1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label4: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a, b, h, t, x, y: real; const m=5; implementation {$R *.dfm} procedure test(var Key: Char; Str: String); begin case Key of '0'..'9': ; #8: ; '-': if Pos('-',Str)<>0 then Key:=#0; ',': if Pos(',',Str)<>0 then Key:=#0; else Key:=#0; end; end; function testStr(Str: String): boolean; begin if Str = '' then testStr:=false else if Str = '-' then testStr:=false else if (Pos('-', Str)<>0) and (Pos('-', Str)<>1) then testStr:=false else testStr := true; end; procedure TForm1.Button1Click(Sender: TObject); begin if (testStr(Edit1.Text) and testStr(Edit2.Text) and testStr(Edit3.Text)) then begin a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); if a>=b then begin ShowMessage('Лево – это лево, право – это право ;)'); Exit; end; h := StrToFloat(Edit3.Text); t := a; Label4.Caption := ''; while t<=b do begin x := m*(t - Sin(t)); y := m*(1 - Cos(t)); Label4.Caption := Label4.Caption + #13 + 'При t = ' + FloatToStr(t) + #9 + #9 + #9 + 'x = ' + FloatToStr(x) + #9 + 'y = ' + FloatToStr(y); t := t + h end end else ShowMessage('Исправьте ошибки в введённых данных'); end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin Test(Key, Edit1.Text); end; procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin Test(Key, Edit2.Text); end; procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char); begin Test(Key, Edit3.Text); end; end; Пример работы приложения представлен на рисунке 2. ![]() Рисунок 2 – Пример работы первого приложения Альтернативный расчёт представлен на рисунке 3: ![]() Рисунок 3 – Альтернативный расчёт для первой программы На рисунке 4 представлена блок-схема алгоритма вычисления конечной суммы. ![]() Рисунок 4 – Блок-схема второго алгоритма Код программы №2 представлен ниже. unit Lab7_2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; x, S, a: real; i: byte; const n=10; implementation {$R *.dfm} procedure test(var Key: Char; Str: String); begin case Key of '0'..'9': ; #8: ; '-': if Pos('-',Str)<>0 then Key:=#0; ',': if Pos(',',Str)<>0 then Key:=#0; else Key:=#0; end; end; function testStr(Str: String): boolean; begin if Str = '' then testStr:=false else if Str = '-' then testStr:=false else if (Pos('-', Str)<>0) and (Pos('-', Str)<>1) then testStr:=false else testStr := true; end; procedure TForm1.Button1Click(Sender: TObject); begin if not (testStr(Edit1.Text)) then begin ShowMessage('Исправьте значение x'); Exit; end; x := StrToFloat(Edit1.Text); a := Exp(x)/6; S := a; for i:=2 to 10 do begin a := a*Exp(x)/(i+2); S := S + a; end; Label2.Caption := 'S = ' + FloatToStr(S); end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin test(Key, Edit1.Text); end; end. Пример работы приложения представлен на рисунке 5. ![]() Рисунок 5 – Пример работы второго приложения Альтернативный расчёт представлен на рисунке 6: ![]() Рисунок 6 – Альтернативный расчёт для третьей программы На рисунке 7 представлена блок-схема алгоритма вычисления бесконечной суммы с точностью ![]() ![]() Рисунок 7 – Блок-схема алгоритма вычисления бесконечной суммы Код третьей программы представлен ниже. unit Lab7_3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Label4: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; k, a, S, e, x: real; implementation {$R *.dfm} procedure test(var Key: Char; Str: String); begin case Key of '0'..'9': ; #8: ; '-': if Pos('-',Str)<>0 then Key:=#0; ',': if Pos(',',Str)<>0 then Key:=#0; else Key:=#0; end; end; function testStr(Str: String): boolean; begin if Str = '' then testStr:=false else if Str = '-' then testStr:=false else if (Pos('-', Str)<>0) and (Pos('-', Str)<>1) then testStr:=false else testStr := true; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin test(Key, Edit1.Text) end; procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin test(Key, Edit2.Text) end; procedure TForm1.Button1Click(Sender: TObject); begin if (testStr(Edit1.Text) and testStr(Edit2.Text) and (0 < StrToFloat(Edit1.Text)) and (StrToFloat(Edit1.Text) <= Pi)) then begin x:=StrToFloat(Edit1.Text); e:=StrToFloat(Edit2.Text); k:=0; S:=0; a := Sin(x); repeat S:=S+a; k:=k+1; a:=Sin((2*k + 1)*x) / (2*k + 1); until Abs(a/S)<=e; Label3.Caption := 'S='+FloatTostrF(S,ffFixed,10,5); Label4.Caption := 'Слагаемых в сумме ' + FloatToStr(k); end else ShowMessage('Исправьте ошибки в введённых данных.'); end; end. Пример работы приложения представлен на рисунке 8. ![]() Рисунок 8 – Пример работы третьего приложения Альтернативный расчёт для третьей программы представлен на рисунке 9. ![]() Рисунок 9 – Альтернативный расчёт для третьей программы. Вывод: были приобретены умения разработки и программной реализации циклических алгоритмов. |