Министерство образования Республики Беларусь
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ МОГИЛЕВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра "ЭП и АПУ"
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К курсовой работе по дисциплине
“Вычислительная техника и программирование”
Выполнил студент группы ЭП-012
Гончаров А. М.
Могилев, 2003
Министерство образования Республики Беларусь
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ МОГИЛЕВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра "ЭП и АПУ"
Курсовая работа
Разработка программы расчета определенного интеграла по формуле Буля по схеме двойного пересчета с заданной точностью
Пояснительная записка
БУЛ 07.00.00.000 ПЗ
Руководитель ст. преподаватель
______________ Абрашкин В.П.
Студент группы ЭП-02
______________ Гончаров А.М.
Могилев, 2003
Содержание
Введение
1 Постановка задачи
1.1 Общая характеристика задачи
1.2 Анализ литературных источников
1.3 Расчётные формулы метода
2 Разработка алгоритма задачи
2.1 Описание данных , используемых для решения задачи
2.2 Описание схемы программы
3 Кодирование программы
3.1 Описание структуры разрабатываемого пакета
3.2 Описание используемых типов данных
3.3 Проектирование интерфейса программы
4 Тестирование программы
5 Разработка гипертекстового варианта документа
Заключение
Список используемых источников
Приложение А. Твёрдая копия
Приложение Б. Результаты тестирования программы
Приложение В. Тестирование данных в математическом пакете
Приложение Г. Гипертекстовый вариант документа
Приложение Д.
Акт приёмки программы
Введение
Данный курс «Вычислительной техники и программирования» мы заканчиваем курсовым проектом, в котором нам следует разработать программу согласно полученному заданию.
Стремительное развитие науки и техники, в том числе и вычислительной, требует знания её от каждого, считающего себя образованным, человека. Из-за всё возрастающей сложности многих объектов требуется улучшенная организация процесса программного моделирования и высокая степень образованности специалистов, а повышение требований к функционированию этих объектов делают нашу задачу еще более сложной. Для решения этой задачи применяется математическое моделирование, которое осуществляется опять же с помощью вычислительной техники, в частности компьютера.
Нельзя не упомянуть о том, что широкое применение в современной науке и технике получили дифференциальные уравнения различной степени и вида сложности. В частности, они применяются в электротехнике, машиностроении, электронике, разработке различного рода аппаратного обеспечивания, математике, физике и других видах деятельности человека.
Наша задача: создать способ быстрого, качественного, удобного и недорого решения поставленных перед нами задач.
В данной курсовой работе мы применили численные методы нахождения определенного интеграла.
Данной курсовой работой мы заканчиваем цикл лекций и лабораторных работ по изучению среды программирования C Builder v5.0, программы выполнения расчетов MathCad, работы в многофункциональном текстовом редакторе Word XP, программы выполнения чертежей AutoCad и использованию функциональных возможностей операционной системы Windows XP. Все эти знания я постарался использовать в своем курсовом проекте.
1 Постановка задачи
1.1 Общая характеристика задачи
Численное интегрирование используется для приближенного поиска значения определенного интеграла непрерывной функции f(x) на заданном интервале [a,b] согласно выражению
, ( 1.1 )
где Q[f]
– формула численного интегрирования;
E[f]
– ошибка усечения.
Формула численного интегрирования называется формулой квадратуры. В общем виде она может быть представлена как сумма
( 1.2 )
где X0
, ... , XK
– узлы квадратуры;
w0
, ... , wK
– веса квадратуры.
Степень точности формулы квадратуры равна положительному целому числу n. Величина ошибки отсечения определяется в общем случае согласно выражению
E[f]=K×f(n+1)
(c), ( 1.3 )
где К – определенный коэффициент,
n – степень точности.
1.2 Анализ литературных источников
В зависимости от вида выражения квадратуры для нахождения значения определенного интеграла используются следующие численные методы:
1) правых, левых и средних прямоугольников;
2) трапеций;
3) формулы Симпсона и Буля;
4) Монте-Карло;
5) формулы Гаусса-Лежандра,
6) рекуррентные формулы.
В зависимости от степени производной, учитываемой численным методом, определяется степень точности метода.
Шаг интегрирования может быть постоянным на всём расчётном интервале аргумента X или изменяться в зависимости от величины ошибки определения функции.
1.3 Расчётные формулы метода
Составная формула Буля с порядком m=4 имеет вид
( 1 )
2 Разработка алгоритма решения задачи
2.1 Описание данных, используемых для решения задач
В данной задаче использовались следующие данные:
1) исходные(входные)данные:
- начало отрезка а;
- конец отрезка b;
- точность.
2) выходные результаты решения:
-значение интеграла.
2.2 Описание схемы программы
Схема алгоритма составлена в соответствии с математическим описанием курсовой работы и отображает последовательность операций в программе. При ее изображении используются правила и требования ГОСТ 19.701.90.
Произведено выделение основных этапов в виде подпрограмм, выполняющих следующие действия:
а) ввод исходных данных с клавиатуры;
б) выполнение расчета;
в) вывод полученных результатов на экран и в файл.
Все подпрограммы выполнены в виде процедур [2]. Основные процедуры и программа выполнены на листе. При этом описание функционального назначения блоков схемы алгоритма приведено в комментариях.
3 Кодирование программы
3.1 Описание структуры разрабатываемого пакета
Программа курсовой работы разработана в среде визуального программирования CBuilder 5.0 и состоит из головной программы, блоковUnit1, Unit2, Unit3.
Программа выполнена на основе структурного программирования и содержит следующие процедуры и функции:
а) f;
б) Вооl.
3.2 Описание используемых типов данных
В данной задаче использовались следующие типы данных:
1) переменная: a,b,e,I ,h,s,N типа float;
2) локальные переменные для перебора элементов массивов: i,j,k типа int;
3.3 Проектирование интерфейса программы
Основные процедуры, используемые при составлении
алгоритма:
а) f-вызывает расчётную функцию;
б)
Bool- расчёт определённого интеграла.
4 Тестирование программы
4.1 Тестирование программы в математическом пакете.
4.2 Тестирование программы
Для тестирования использована функция f(x)=5*x5
-x3
.
Рисунок 1- Основное окно.
Рисунок 2 – Ввод данных.
Тестирование проводилось на ЭВМ со следующими характеристиками:
- центральный процессор – Intel Pen tium 2.2 GHz;
- оперативная память – 1024Mb;
- видеоадаптер – GeForce 4 64 Mb;
- монитор – Sony Trinitron;
- операционная система – Windows XP.
5 Разработка гипертекстового варианта документа
Рисунок 3-Гипертекстовый вариант
Для перевода текста программы в формат HTML использовалась команда приложения MicrosoftWord (пакета Office XP) “Сохранить как Web-страницу”.
Вид полученного документа, отображаемого InternetExplorer 5.0 представлен на рисунке 3.
Заключение
В данной курсовой работе разработана программа расчета определенного интеграла по формуле Буля по схеме двойного пересчета с заданной точностью
При работе над программой пройдены все этапы создания программных продуктов. Получены навыки в математическом описании задачи, разработке алгоритма программы, составлении текста программы и проведении тестирования программы. Использована система программирования C Builder v5.0.
Список использованных источников
1 Крылов В.И. Вычислительные методы высшей математики. Т.1./ Под ред. И.П. Мысовских. — Мн.: Вышэйшая школа, 1972.
2 Мудров А.Е. Численные методы для ПЭВМ на языках Бейсик, Фортран, Паскаль - Томск: МП Таско", 1992
3 Херхагер М., Партолль X. MathCAD 2000; полное руководство: Пер. с нем. - К.: Издательская группа BHV, 2000. - 416с.
4 Гусак А.А., Гусак ГМ. Справочник по высшей математике. - Мн.: Наука и техника, 1991.
Приложение А
(обязательное)
Твёрдая копия
Project1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
USEFORM("Unit3.cpp", Form3);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->CreateForm(__classid(TForm3), &Form3);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include<io.h>
#include<math.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include <fcntl.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float a=0,b=10,e=0.01,I[2];
float f(float x)
{
return 5*pow(x,5)-pow(x,3);
}
//-------------------------------------
void Bool()
{
float h,s,x[5],N=2;
int i,l;
do
{
for(l=0;l<=1;l++)
{
s=0;
h=(b-a)/N;
x[0]=a;
x[1]=a+h/4;
x[2]=a+h/2;
x[3]=a+3*h/4;
x[4]=a+h;
for(i=1;i<=N;i++)
{
s=(7*f(x[0])+32*f(x[1])+12*f(x[2])+32*f(x[3])+7*f(x[4]))+s;
x[0]+=h;
x[1]+=h;
x[2]+=h;
x[3]+=h;
x[4]+=h;
}
I[l]=h*s/45/2;
N=N*2;
}
}while(fabs(I[0]-I[1])>e);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1pop(TObject *Sender, TCanvas *ACanvas,
TRect &ARect, bool Selected)
{
SB1->SimpleText="Выход";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
Form2->Show();
SB1->SimpleText="Ввод данных закончен";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Bool();
Form3->Show();
SB1->SimpleText="Произведен расчет";
}
//---------------------------------------------------------------------------
Unit2.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include<iostream.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ibctrls"
#pragma link "ibreg"
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm2 *Form2;
extern float a,b,e;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
float __fastcall TForm2::checkf(TObject *Sender,TEdit *e1,float w)
{
float buf;
do{
try
{
if(e1->Text!="")
buf=StrToFloat(e1->Text);else buf=w;
}
catch(const EConvertError &e)
{
int j=Application->MessageBox("Неверные данные", NULL, MB_OK);
buf=-1;
e1->Text=FloatToStr(w);
}}while((buf==-1));
return buf;
}
//----------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
e=checkf(Sender,Edit4,e);
a=checkf(Sender,Edit1,a);
b=checkf(Sender,Edit2,b);
Form2->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
Edit1->Text=FloatToStr(a);
Edit2->Text=FloatToStr(b);
Edit4->Text=FloatToStr(e);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::GroupBox1Click(TObject *Sender)
{
}
//---------------------------------------------------------------------------
Unit3.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
TForm3 *Form3;
extern float I[2];
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
Form3->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
SaveDialog1->InitialDir= GetCurrentDir();
Edit1->Text=FloatToStr(I[1]);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
TStringList *s;
s= new TStringList;
SaveDialog1->Execute();
s->Add(" Значение интеграла равно"+FloatToStr(I[1]));
s->SaveToFile(SaveDialog1->FileName);
delete s;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Label1Click(TObject *Sender)
{
}
//---------------------------------------------------------------------------
Приложение Б
Результаты тестирования программы.
Рисунок 4 - Результат тестирования
Приложение В.
Тестирование данных в математическом пакете.
Приложение Г
Гипертекстовый вариант документа
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1251">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 9">
<meta name=Originator content="Microsoft Word 9">
<link rel=File-List href="./1%20Постановка%20задач1.files/filelist.xml">
<link rel=Edit-Time-Data href="./1%20Постановка%20задач1.files/editdata.mso">
<link rel=OLE-Object-Data href="./1%20Постановка%20задач1.files/oledata.mso">
<!--[if !mso]>
<style>
v:* {behavior:url(#default#VML);}
o:* {behavior:url(#default#VML);}
w:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<title>1 Постановка задачи</title>
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Author>ДМИТРИЙ</o:Author>
<o:Template>Normal</o:Template>
<o:LastAuthor>ДМИТРИЙ</o:LastAuthor>
<o:Revision>1</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Created>2003-06-07T13:56:00Z</o:Created>
<o:LastSaved>2003-06-07T13:57:00Z</o:LastSaved>
<o:Pages>1</o:Pages>
<o:Company>HOME</o:Company>
<o:Lines>1</o:Lines>
<o:Paragraphs>1</o:Paragraphs>
<o:Version>9.2812</o:Version>
</o:DocumentProperties>
</xml><![endif]-->
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
h2
{mso-style-next:Обычный;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:35.9pt;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
page-break-after:avoid;
mso-outline-level:2;
background:white;
font-size:14.0pt;
mso-bidi-font-size:12.0pt;
font-family:"Courier New";
color:black;
letter-spacing:-.6pt;
mso-bidi-font-weight:normal;}
h6
{mso-style-next:Обычный;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
mso-pagination:widow-orphan;
page-break-after:avoid;
mso-outline-level:6;
tab-stops:61.7pt;
font-size:14.0pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";}
@page Section1
{size:595.3pt 841.9pt;
margin:2.0cm 42.5pt 2.0cm 3.0cm;
mso-header-margin:35.4pt;
mso-footer-margin:35.4pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1134"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
</head>
<body lang=RU style='tab-interval:35.4pt'>
<div class=Section1>
<h6 style='tab-stops:35.4pt'><a name="_Toc11439953">1 Постановка задачи</a></h6>
<p class=MsoNormal><b><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><span
style="mso-spacerun: yes"> </span></span></b><span style='font-size:14.0pt;
mso-bidi-font-size:12.0pt'><span style="mso-spacerun:
yes"> </span><o:p></o:p></span></p>
<h2><a name="_Toc11439954"><span style='font-family:"Times New Roman";
font-weight:normal;mso-bidi-font-weight:bold'>1.1 Общая характеристика задачи</span></a><span
style='font-family:"Times New Roman";font-weight:normal;mso-bidi-font-weight:
bold'><o:p></o:p></span></h2>
<p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:14.0pt;
mso-bidi-font-size:12.0pt'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
<p class=MsoNormal style='text-indent:36.0pt'><span style='font-size:14.0pt;
mso-bidi-font-size:12.0pt'>Численное интегрирование используется для
приближенного поиска значения определенного интеграла непрерывной функции </span><span
lang=EN-US style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:
EN-US'>f</span><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>(</span><span
lang=EN-US style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:
EN-US'>x</span><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>) на
заданном интервале [a,b] согласно выражению<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span
style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><sub><!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1049" type="#_x0000_t75" style='width:180.75pt;
height:45.75pt' o:ole="" fillcolor="window">
<v:imagedata src="./1%20Постановка%20задач1.files/image001.wmz" o:title=""/>
</v:shape><![endif]--><![if !vml]><img width=241 height=61
src="./1%20Постановка%20задач1.files/image002.gif" v:shapes="_x0000_i1049"><![endif]></sub><!--[if gte mso 9]><xml>
<o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1049"
DrawAspect="Content" ObjectID="_1116513810">
</o:OLEObject>
</xml><![endif]-->,<span style='mso-tab-count:3'> </span>(
1.1 )<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><span
style='mso-tab-count:1'> </span>где <span style='mso-tab-count:1'> </span></span><i><span
lang=EN-US style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:
EN-US'>Q</span></i><i><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>[</span></i><i><span
lang=EN-US style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:
EN-US'>f</span></i><i><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>]</span></i><span
style='font-size:14.0pt;mso-bidi-font-size:12.0pt'> – формула численного
интегрирования;<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><span
style='mso-tab-count:2'> </span></span><i><span lang=EN-US
style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:EN-US'>E</span></i><i><span
style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>[</span></i><i><span
lang=EN-US style='font-size:14.0pt;mso-bidi-font-size:12.0pt;mso-ansi-language:
EN-US'>f</span></i><i><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'>]</span></i><span
style='font-size:14.0pt;mso-bidi-font-size:12.0pt'> – ошибка усечения.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><span
style='mso-tab-count:1'> </span>Формула численного интегрирования
называется формулой квадратуры. В общем виде она может быть представлена как
сумма<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;mso-bidi-font-size:12.0pt'><span
style='mso-tab-count:1'> </span><sub><!--[if gte vml 1]><v:shape id="_x0000_i1050"
type="#_x0000_t75" style='width:347.25pt;height:45.75pt' o:ole="" fillcolor="window">
<v:imagedata src="./1%20Постановка%20задач1.files/image003.wmz" o:title=""/>
</v:shape><![endif]--><![if !vml]><img width=463 height=61
src="./1%20Постановка%20задач1.files/image004.gif" v:shapes="_x0000_i1050"><![endif]></sub><!--[if gte mso 9]><xml>
<o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1050"
DrawAspect="Content" ObjectID="_1116513811">
</o:OLEObject>
</xml><![endif]--><span style='mso-tab-count:1'> </span>( 1.2 )<o:p></o:p></span></p>
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
</div>
</body>
</html>
Приложение Д
Акт приёмки программы
Разработанная в ходе выполнения курсового проекта программа расчета определенного интеграла по формуле Буля по схеме двойного пересчета с заданной точностью работоспособна и полностью соответствует требованиям задания.
Студент гр. ЭП-012
Гончаров А.М.
Руководитель работы
старший преподаватель кафедры «ЭП и АПУ»
Абрашкин В.П.