страница 1 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Похожие работы
|
Решение задач по математике, физике, программированию, химии и другим предметам недорого - страница №1/1
![]()
Задание: имеющийся курсовой проект переделать в vs2010 и скомпилировать Пояснительная записка курсового проекта (работы) 33 с., 16 рис., 4 источника. ОПРЕДЕЛЕННЫЙ ИНТЕГРАЛ, МЕТОД ПРЯМОУГОЛЬНИКОВ, МЕТОД КРИВОЛИНЕЙНЫХ ТРАПЕЦИЙ, МЕТОД СИМПСОНА (ПАРАБОЛ), ПОСТРОЕНИЕ ГРАФИКА. Объектом исследования является численное интегрирование с применением языка C# и применение принципов объектно-ориентированного программирования. Цель работы состоит в разработке программы на языке C# демонстрирующей интегрирование различными методами и получении результатов. К полученным результатам относятся построенный график функции с отображенными пределами интегрирования, численные значения интеграла, вычисленного разными способами, определенные погрешности вычислений. СОДЕРЖАНИЕ ВВЕДЕНИЕ 1 Спецификации задачи 6 2 Формулировка задачи 7 3 Описание методов вычислительной математики, используемых при решении 8 3.1 Численное интегрирование 8 3.1.1 Метод прямоугольников 8 3.1.2 Математический вывод формулы метода прямоугольников 10 3.1.3 Метод криволинейных трапеций 11 3.2 Метод Симпсона (парабол) 12 4 Описание методов программирования, примененных в работе 16 4.1 Среда разработки и организация решения 16 4.2 Проект библиотеки классов «IntegralClassLibrary» 16 4.3 Проект «Курсовая работа по ООП» 17 5 Листинги программы 19 5.1 Листинг файла «Integrals.cs» 19 5.2 Листинг файла «MainForm.cs» 21 6 Описание программы 27 7 Результаты тестирования программы 30 8 Заключение 31 Нормативные ссылки Список используемой литературы ВВЕДЕНИЕ Цель курсовой работы является приобретение и углубление знаний в области высокоуровневых методов информатики и программирования, получения дополнительных практических навыков в использовании основных приёмов обработки экспериментальных данных, численного решения определенных интегралов. Численное интегральное исчисление – часто используемая тема в математике. При решении ряда актуальных физических и технических задач встречаются определенные интегралы от функций, первообразные которых не выражаются через элементарные функции. Кроме того, в приложениях приходится иметь дело с определенными интегралами, сами подынтегральные функции которых не являются элементарными. Это приводит к необходимости использования приближенных методов вычисления определенных интегралов. 1 Спецификации задачиРазрабатываемая программа должна обладать следующими качествами:
2Формулировка задачиДанная курсовая работа посвящена разработке программы на языке C#, которая вычисляет определенный интеграл от функции, имеющей первообразную, которую можно вычислить с помощью той или иной приближенной формулы. Для решения этой задачи применяются методы прямоугольников, трапеций и парабол (Симпсона). Задача курсового проекта – разработать программу на языке C#, такую, чтобы при работе с этой программой пользователь имел возможность: a) Найти определенный интеграл выше упомянутыми методами от следующей функции:
б) ввести с клавиатуры пределы интегрирования и количество интервалов разбиения (a, b и n); в) увидеть результаты вычислений на экране в удобном для восприятия виде с отображением графика функции, на введенном с клавиатуры отрезке. При помощи данной программы нетрудно будет сравнить результаты вычислений одного и того же определенного интеграла найденные разными методами. Программа должна отвечать следующим требованиям: a) иметь простой интерфейс; б) иметь защиту от некорректно введенных данных. Актуальность реализации программы на компьютере заключается в простом использовании и возможности доработки дизайна и программного кода. 3Описание методов вычислительной математики, используемых при решении3.1Численное интегрированиеОпределенный интеграл
с пределами интегрирования a и b можно трактовать как площадь фигуры, ограниченной ординатами a и b, осью абсцисс x и графиком подынтегральной функции ![]() ![]() ![]() ![]() На практике часто встречаются интегралы, которые не выражаются через элементарные функции или выражаются очень сложно. Нередко подынтегральная функция задается таблицей или графиком. В этих случаях интегралы находятся приближенными методами, которые заключаются в интерполяции 3.1.1Метод прямоугольниковПромежуток интегрирования ![]() ![]() ![]() Для единообразия полагаем ![]() ![]() Формулой прямоугольников называются следующие приближенные равенства:
Выражения (2), (3), (4) дают площади ступенчатых фигур, изображенных на рисунках 1, 2, 3 соответственно. В большинстве случаев при данном n формула (4) точнее, чем (2) и (3). С увеличением n точность формул (2), (3), (4) неограниченно возрастает. Предельная погрешность формулы (4) составляет: где ![]() Рисунок 1 – Ступенчатая фигура, полученная по методу левых прямоугольников ![]() Рисунок 2 – Ступенчатая фигура, полученная по методу правых прямоугольников ![]() Рисунок 3 – Ступенчатая фигура, полученная по методу средних прямоугольников Формула (4) наиболее точная, и погрешность по сравнению с формулами (2) и (3) уменьшается в приблизительно 50 раз. Отметим, что для линейной функции ![]() ![]() 3.1.2Математический вывод формулы метода прямоугольниковПусть на отрезке ![]() ![]() ![]() ![]() Рисунок 4 – Ступенчатая фигура, состоящая из элементарных прямоугольников Разобьем основание этой трапеции, т.е. отрезок ![]() ![]() ![]() ![]() ![]() В середине Тогда сумма площадей всех n прямоугольников дает площадь ступенчатой фигуры, представляющую собой приближенное значение искомого определенного интеграла
![]() Рисунок 5 – Блок-схема к алгоритму решения определенных интегралов по методу прямоугольников 3.1.3Метод криволинейных трапецийФормула трапеций выводится аналогично формуле прямоугольников: на каждом частичном отрезке криволинейная трапеция заменяется обычной. ![]() Рисунок 6 – Криволинейная фигура, полученная по методу криволинейных трапеций Разобьем промежуток Заменим кривую
Абсолютная погрешность ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3.2Метод Симпсона (парабол)Если заменить график функции ![]() ![]() ![]() Предварительно найдем площадь S криволинейной трапеции, ограниченной сверху графиком параболы ![]() Рисунок 7 – Криволинейная фигура, ограниченная по сторонам прямыми Пусть парабола проходит через три точки ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Площадь криволинейной фигуры, показанной на рисунке 7 равна
Выразим эту площадь через ![]() ![]() ![]() ![]() Подставляя эти значения c и a в равенство (8), получаем
Получим теперь формулу парабол для вычисления интеграла ![]() Для этого отрезок ![]() Рисунок 8 – Криволинейная фигура, полученная по методу Симпсона (парабол) Заменяем каждую пару соседних элементарных криволинейных трапеций с основаниями, равным h, одной элементарной параболической трапецией с основанием, равным 2h. На отрезке Аналогично находим ![]() ![]() Сложив полученные равенства, имеем ![]() или
Формула (10) называется формулой Симпсона (парабол). Абсолютная погрешность вычисления по формуле (10) оценивается соотношением ![]() ![]() Отметим, что формула (9) дает точное значение интеграла ![]() Рисунок 9 – Блок-схема к алгоритму решения определенных интегралов по методу Симпсона (парабол) 4Описание методов программирования, примененных в работе4.1Среда разработки и организация решенияКурсовая работа выполнена в интегрированной среде программирования MS Visual Studio 2008. Решение состоит из 2-х проектов:
4.2Проект библиотеки классов «IntegralClassLibrary»Проект включает в себя файл «Integrals.cs», в котором определены классы, содержащие методы для осуществления вычислений и свойства для получения результатов расчетов и погрешностей. Этот проект представляет собой библиотеку классов, после компиляции, которой образуется файл «IntegralClassLibrary.dll». Данный файл должен находиться в одной папке с запускаемым файлом программы. В рамках библиотеки разработана иерархия классов с наследованием. Базовым классом определен абстрактный класс Integral, в котором объявлены и реализованы все поля, свойства и методы общие для всех классов-наследников.
Рисунок 10 – Схема класса Integral Accuracy – Свойство для получения погрешности интегрирования; Square – Свойство для получения вычисленного значения интеграла; Exact_value( ) – статический метод вычисления точного значения интеграла на основе аналитической формулы; F( ) – статический метод для вычисления значения функции; Integral(double a, double b, int n) – конструктор класса, в котором инициализируются поля и вызывается метод Solve( ); Solve( ) – абстрактный метод определяющий общий интерфейс для всех потомков класса, определяется в наследниках содержит алгоритм вычисления уникальный для каждого метода вычисляющего интеграл; ToString( ) – возвращает текстовую строку, с результатами. Базовый класс Integral порождает наследников, в которых реализуется абстрактный метод Solve( ), и передаются параметры вычислений конструктору базового класса. ![]() Рисунок 11 – Схема реализации наследования от класса Integral Каждый класс-наследник содержит конструктор, совпадающий с именем своего класса, а также реализует уже описанный метод Solve( ). Таким образом, весь код логически общий для всех классов-наследников помещен в базовый класс Integral при помощи механизма наследования. Реализация вычислений скрыта от пользователей классов Trapezoids, Rectangles, Simpsons, благодаря механизму инкапсуляции. Полиморфизм проявляется при вызове метода Solve( ) имеющего разные реализации в каждом классе-наследнике. Данный метод не вызывается напрямую пользователем класса, вызов происходит в конструкторе каждого класса. Все три класса имеют одинаковый интерфейс для получения результатов вычисления. 4.3Проект «Курсовая работа по ООП»Второй проект состоит из файлов: «MainForm.cs», в котором определен класс главного окна приложения, а также методы и события, отвечающие за взаимодействие разных частей программы; «SettingsForm.cs» – в файле определен класс окна настроек отображения графики; «AboutBox.cs» – файл содержит класс окна «О программе». Обязательным условием успешного построения проекта является соблюдение зависимостей, а именно наличие ссылок на библиотеки DLL: IntegralClassLibrary.dll и ZedGraph.dll. Первая, из которых разрабатывается в рамках первого рассмотренного проекта библиотеки «IntegralClassLibrary». Вторая представляет собой сторонний элемент управления не входящий в комплект поставки MS VS 2008, содержит классы позволяющие выводить графику в пространство указанного компонента, который в свою очередь располагается на главной форме приложения. Файл ZedGraph.dll должен находиться в папке с программой.
5Листинги программы5.1Листинг файла «Integrals.cs»using System; namespace Patsev.Integrals { public abstract class Integral //базовый класс { public Integral(double a, double b, int n) { this.a = a; this.b = b; this.n = n; //вычисление интеграла Solve();
accuracy = Math.Abs(Exact_value(a, b) - square); } public static double F(double x) //возвращает значение подинтегральной функции { return 1 / Math.Sqrt(1 + x * x); }
{ return Math.Log(Math.Abs(b + Math.Sqrt(1 + b * b))) - Math.Log(Math.Abs(a + Math.Sqrt(1 + a * a))); }
public double Square //значение интеграла { get { return square; } }
{ get
{ return accuracy; } }
public static bool operator <(Integral x1, Integral x2) { if (x1.accuracy < x2.accuracy) return true; return false; }
{ if (x1.accuracy > x2.accuracy) return true; return false; }
{ //return base.ToString(); string s; if (Killed) return ""; s = Square.ToString() + " / " + Accuracy.ToString(); return s; }
}
{ public Rectangles(double a, double b, int n) : base(a, b, n){ } override protected void Solve() { double yn = 0, y0, x0 = a, Delta = (b - a) / n; for (int i = 0; i < n; i++, yn += y0, x0 += Delta) { if (Killed) { square = -1; return; } y0 = F((2 * x0 + Delta) / 2); } square = yn * Delta; } } public sealed class Trapezoids : Integral //метод трапеций { public Trapezoids(double a, double b, int n) : base(a, b, n){ } override protected void Solve() { double yn = 0, y0, Delta = (b - a) / n, x0 = a + Delta; for (int i = 1; i < n; i++, yn += y0, x0 += Delta) { if (Killed) { square = -1; return; } y0 = F(x0); } square = Delta * ((F(a) + F(b)) / 2 + yn); } }
{
override protected void Solve() { double yn1 = 0, yn2 = 0, y0, Delta = (b - a) / n, x0 = a + Delta; for (int i = 1; i < n; i += 2, yn1 += y0, x0 += 2 * Delta) { if (Killed == true) { square = -1; return; } y0 = F(x0); } x0 = a + 2 * Delta; for (int i = 2; i < n - 1; i += 2, yn2 += y0, x0 += 2 * Delta) { if (Killed == true) { square = -1; return; } y0 = F(x0); } square = (b - a) / 3 / n * (F(a) + F(b) + 4 * yn1 + 2 * yn2); } } } 5.2Листинг файла «MainForm.cs»using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using Курсовая_работа_по_ООП; using ZedGraph; using Patsev.Integrals; namespace Курсовая_работа_по_ООП { public partial class MainForm : Form { public int PointsQuantity { get; set; } public int PointsSize { get; set; } public Single LineWidth { get; set; } double x1 { get; set; } double x2 { get; set; } int n { get; set; } string strMethodRectangles, strTrapezoids, strSimpsons; //Строки для хранения результатов string strCalcStatus; //информационная строка public MainForm() { InitializeComponent(); } private void DisambleButtons() { StartBtn.Enabled = false; SettingsBtn.Enabled = false; txtBoxX1.Enabled = false; txtBoxX2.Enabled = false; txtBoxN.Enabled = false; strMethodRectangles = ""; strTrapezoids = ""; strSimpsons = ""; strCalcStatus = "Вычисление...\nНажмите 'x'\n для отмены."; DrawGraph(); }
{ StartBtn.Enabled = true; SettingsBtn.Enabled = true; txtBoxX1.Enabled = true; txtBoxX2.Enabled = true; txtBoxN.Enabled = true; strCalcStatus = ""; DrawGraph(); }
{ Integral myIntegral; Patsev.Integrals.Integral.Killed = false; myIntegral = new Patsev.Integrals.Rectangles(x1, x2, n); strMethodRectangles = myIntegral.ToString(); myIntegral = new Patsev.Integrals.Trapezoids(x1, x2, n); strTrapezoids = myIntegral.ToString(); myIntegral = new Patsev.Integrals.Simpsons(x1, x2, n); strSimpsons = myIntegral.ToString(); }//интегрирование private void DrawGraph() //вывод графика функции { // Получим панель для рисования GraphPane pane = zedGraph.GraphPane; // Очистим список текстов и кривых на тот случай, если до этого сигналы уже были нарисованы pane.CurveList.Clear(); pane.GraphObjList.Clear();
TextObj headline = new TextObj("Значение интеграла / Погрешность", 0.27F, 0.04F); headline.FontSpec.FontColor = Color.DarkBlue; headline.FontSpec.IsBold = true; headline.FontSpec.Size = 8; headline.FontSpec.IsAntiAlias = true; // Disable the border and background fill options for the text headline.FontSpec.Border.IsVisible = false; headline.FontSpec.Fill.IsVisible = false; headline.FontSpec.IsUnderline = true; // Align the text such the the Left-Bottom corner is at the specified coordinates // use AxisFraction coordinates so the text is placed relative to the ChartRect headline.Location.CoordinateFrame = CoordType.ChartFraction; headline.Location.AlignH = AlignH.Left; headline.Location.AlignV = AlignV.Bottom; pane.GraphObjList.Add(headline); //Печать подписей к результатам string textline = "Метод прямоугольников: \nМетод трапеций: \nМетод парабол:"; TextObj textresults = new TextObj(textline, 0.04F, 0.15F); textresults.Location.CoordinateFrame = CoordType.ChartFraction; textresults.FontSpec.Border.IsVisible = false; textresults.FontSpec.Fill.IsVisible = false; textresults.FontSpec.IsAntiAlias = true; textresults.FontSpec.Size = 8; textresults.Location.AlignH = AlignH.Left; textresults.Location.AlignV = AlignV.Bottom; textresults.FontSpec.StringAlignment = StringAlignment.Near; pane.GraphObjList.Add(textresults); //Печать результатов string strresults = strMethodRectangles + "\n" + strTrapezoids + "\n" + strSimpsons; TextObj results = new TextObj(strresults, 0.27F, 0.15F); results.Location.CoordinateFrame = CoordType.ChartFraction; results.FontSpec.FontColor = Color.DarkGreen; results.FontSpec.Border.IsVisible = false; results.FontSpec.Fill.IsVisible = false; results.FontSpec.IsAntiAlias = true; results.FontSpec.Size = 8; results.Location.AlignH = AlignH.Left; results.Location.AlignV = AlignV.Bottom; results.FontSpec.StringAlignment = StringAlignment.Near; pane.GraphObjList.Add(results);
TextObj txtCalc = new TextObj(strCalcStatus, 0.8F, 0.05F); // use AxisFraction coordinates so the text is placed relative to the ChartRect txtCalc.Location.CoordinateFrame = CoordType.ChartFraction; // rotate the text 15 degrees txtCalc.FontSpec.Angle = -45.0F; // Text will be red, bold, and 16 point txtCalc.FontSpec.FontColor = Color.Red; txtCalc.FontSpec.IsBold = true; txtCalc.FontSpec.Size = 16; // Disable the border and background fill options for the text txtCalc.FontSpec.Border.IsVisible = false; txtCalc.FontSpec.Fill.IsVisible = false; // Align the text such the the Left-Bottom corner is at the specified coordinates txtCalc.Location.AlignH = AlignH.Left; txtCalc.Location.AlignV = AlignV.Bottom; pane.GraphObjList.Add(txtCalc);
PointPairList list = new PointPairList(); PointPairList plist = new PointPairList();
double xmax = x2; // Заполняем список точек plist.Add(xmin, Integral.F(xmin)); double xp = Math.Max(Math.Abs(xmin) , Math.Abs(xmax)); double dx = 2 * xp * 1.2 / this.PointsQuantity; for (double x = -xp * 1.2; x <= xp * 1.2; x += dx) { // добавим в список точку list.Add(x, Integral.F(x)); if (x >= xmin && x <= xmax) plist.Add(x, Integral.F(x)); } plist.Add(xmax, Integral.F(xmax)); // Set the titles and axis labels pane.Title.Text = "Интегрируемая функция f(x) = Sqrt(1 + x^2)"; pane.XAxis.Title.Text = "X"; pane.YAxis.Title.Text = "Y"; // Hide the legend pane.Legend.IsVisible = false; // Add a curve LineItem curve = pane.AddCurve("label", list, Color.Red, SymbolType.Circle); curve.Line.IsSmooth = true; curve.Line.Width = this.LineWidth; curve.Symbol.Fill = new Fill(Color.White); curve.Symbol.Size = this.PointsSize; // Fill the area under the curves LineItem pcurve = pane.AddCurve("", plist, Color.Blue, SymbolType.None); pcurve.Line.IsSmooth = true; pcurve.Line.Fill = new Fill(Color.White, Color.Blue, 95.0F); // Fill the axis background with a gradient pane.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 90.0F); // Включим отображение сетки pane.XAxis.MajorGrid.IsVisible = true; pane.YAxis.MajorGrid.IsVisible = true;
В противном случае на рисунке будет показана только часть графика, которая умещается в интервалы по осям, установленные по умолчанию*/ zedGraph.AxisChange();
zedGraph.Invalidate(); }//прорисовка графика private void ExitBtn_Click(object sender, EventArgs e) { Close(); } private void AboutBtn_Click(object sender, EventArgs e) { AboutBox frmAbout = new AboutBox(); frmAbout.ShowDialog(); }
{ //проверка корректности вводимых значений try { try { x1 = Convert.ToDouble(txtBoxX1.Text); } catch
{ txtBoxX1.Focus(); txtBoxX1.SelectAll(); throw new Exception("Ошибка при вводе x1"); }
{ x2 = Convert.ToDouble(txtBoxX2.Text); } catch
{ txtBoxX2.Focus(); txtBoxX2.SelectAll(); throw new Exception("Ошибка при вводе x2"); }
{ n = Convert.ToInt32(txtBoxN.Text); } catch
{ txtBoxN.Focus(); txtBoxN.SelectAll(); throw new Exception("Ошибка при вводе n"); } DisambleButtons(); BackgroundWorker bw = new BackgroundWorker(); bw.WorkerSupportsCancellation = true; bw.DoWork += Integration; bw.RunWorkerCompleted += EnableButtons; bw.RunWorkerAsync(null); } catch (Exception myexcepton) { MessageBox.Show(myexcepton.Message, "Ошибка ввода данных."); } }
{ zedGraph.GraphPane.CurveList.Clear(); zedGraph.GraphPane.GraphObjList.Clear(); zedGraph.Invalidate(); }
{ x1 = Convert.ToDouble(txtBoxX1.Text); x2 = Convert.ToDouble(txtBoxX2.Text); n = Convert.ToInt32(txtBoxN.Text); DrawGraph(); }
{ SettingsForm SettingsFrm = new SettingsForm(); SettingsFrm.txtPointsQuantity = this.PointsQuantity.ToString(); SettingsFrm.txtPointsSize = this.PointsSize.ToString(); SettingsFrm.txtLineWidth = this.LineWidth.ToString(); if (SettingsFrm.ShowDialog() == DialogResult.OK) { try
{ try
{ this.PointsQuantity = Convert.ToInt32(SettingsFrm.txtPointsQuantity); } catch
{ throw new Exception("Ошибка при вводе количества точек на графике"); }
{ this.PointsSize = Convert.ToInt32(SettingsFrm.txtPointsSize); } catch
{ throw new Exception("Ошибка при вводе размера точек"); }
{ this.LineWidth = Convert.ToSingle(SettingsFrm.txtLineWidth); } catch
{ throw new Exception("Ошибка при вводе толщины линии"); }
} catch (Exception myexcepton) { MessageBox.Show(myexcepton.Message + "\nОшибочные изменения не будут произведены." , "Ошибка ввода данных."); } } } private void MainForm_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 120 || e.KeyChar == 1095) //отмена вычислений при нажатии 'x' { Patsev.Integrals.Integral.Killed = true; strMethodRectangles = ""; strTrapezoids = ""; strSimpsons = ""; } } } }
6Описание программыПри запуске программы на экран выводится главное окно программы с отображенными и доступными элементами управления (см. рисунок 12). Текстовые поля исходных данных заполнены значениями по умолчанию, которые можно изменить. ![]() Рисунок 12 – Главное окно программы после запуска После нажатия кнопки «Расчет» организуется поток выполнения вычислений, при длительных расчетах вычисления можно остановить, нажав клавишу, ‘x’ на клавиатуре (рисунок 13). Во время расчетов программа продолжает реагировать на действия пользователя, возможно минимизировать главное окно, изменить его размер, открыть окно «О программе» (рисунок 14), изменить ориентацию и масштаб графика, а также закрыть программу нажав кнопку «Выход». После проведения расчетов результаты отображаются в левом верхнем углу графика (рисунок 15). Программа допускает изменение отображения графика функции, соответствующие настройки можно изменить при нажатии кнопки «Настройки» (рисунок 16). ![]() Рисунок 13 – Главное окно программы в процессе вычисления интегралов ![]() Рисунок 14 – Окно «О программе» ![]() Рисунок 15 – Главное окно программы после проведения расчетов ![]() Рисунок 16 – Окно «настройки» 7Результаты тестирования программыСогласно вычисленным результатам приведенным на рисунке 15, разработанная программа выполняет заданный расчет с достаточной точностью. Результат согласуется с расчетами, проведенными вручную или при применении математических пакетов. Согласно приведенным результатам наибольшая точность вычислений достигается при интегрировании методом парабол, наибольшая погрешность наблюдается при интегрировании методом прямоугольников. В результате тестирования установлено, что разработанная программа отвечает всем основным требованиям, заложенным в поставленную задачу, а именно:
8ЗаключениеИтогом данной курсовой работы является программа, реализованная на языке C#, с помощью которой вычисляются определенный интеграл на заданном пользователем отрезке [a, b], разбитом на n равных частей с наглядным графиком функции от которой считается определенный интеграл, построенной на этом отрезке [a, b]. В качестве перспектив развития данной программы можно отметить такие нереализованные возможности как самостоятельный ввод пользователем нужной ему функции, расширение списка методов вычисления определенных интегралов, а так же визуальное улучшение интерфейса программы. Нормативные ссылки ГОСТ 2.105-95 ЕСКД. Общие требования к текстовым документам ГОСТ 2.301-68 ЕСКД. Форматы ГОСТ 7.1-2003. Р 50-77-88 Рекомендации. ЕСКД. Правила выполнения диаграмм Список используемой литературы
|