Математическое решение задачи

Введение

Все программирование на данном языке тесно связано с понятием обьекто-ориентированного программирования. По сути, сама методика ООП является неотъемлемой частью си шарп, по этой причине все программы на си шарп хотя бы в малой степени являются обьектно-ориентированными.

По сути ООП считается самым эффективным подходом к программированию. Со времен появления первых языков программирования, методики их работы существенно изменились. Компьютеры начали постепенно приспосабливать к более сложному коду. Так самые первые программы состояли всего из нескольких сотен команд, их задача заключалась в ручном переключении на разные двоичные команды с пульта управления ЭВМ.

Со временем программы все усложнялись, что в свою очередь привело к возникновению более современного языка программирования – Ассемблера. Но на этом, как известно, разработчики не остановились. Так на свет появились первые языки программирования высокого уровня, такие как COBOL и FORTRAN. Данные языки в отличие от Ассемблера позволяли реализовать более сложные программы.

На каждом из этапов формирования современных языков программирования выходили в свет все новые средства, основанная задача которых была “обуздать” программы с постоянно растущей сложностью. Но в определенный момент разработчики столкнулись с еще одной проблемой – структурный подход к программированию становился все менее работоспособным, так и появилось в своем первичном обличии ООП.

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


 

1 Описание работы

Задание

Разработать программу обработки результатов измерений, полученных в результате проведения N экспериментов (10<N<1000).

Все результаты экспериментов хранятся в файле DatesInl11.txt в виде последовательности структур, полученных в результате проведения N экспериментов.

Единичный эксперимент формирует массив измерений Хnkразмерностью Кnn — количество измерений в п-м эксперименте, причем Кn> 30) в виде структуры:

- символ * (звездочка) - признак начала данных об эксперименте;

- строка (15 символов), содержащая название эксперимента;

- массив значений Кn измерений (значения - вещественные числа двойной точности).

Количество измерений в каждом эксперименте различное.

При первоначальном запуске должна отображаться информация о составе входного файла - количество экспериментов и количество измерений в каждом эксперименте.

Для каждого эксперимента необходимо:

1)Вычислить и записатьномер минимального по модулю элемента массива в выходной файл;

2)Вычислить и записать сумму модулей элементов массива, расположенных после первого отрицательного элемента, в выходной файл;

3)Сжать массив, удалив из него все элементы, величина которых находитсяв интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями. Записать упорядоченный массив в выходной файл. 4)Построить графики зависимостей у=f(х|) для исходных и преобразованных данных.

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

Пользователь должен иметь возможность добавлять, редактировать, удалять эксперименты, а также работать с данными (измерениями) любого н-го эксперимента (добавлять, редактировать, удалять данные).

Начальный массив размещается в файле DatesIn16.txt. Результат (выходной массив, сумма и произведение) разместить в файл DatesOut11.txt.

Вотсутствие файла с начальными данными в программе предусмотреть возможность формирования начальных данных «вручную» (ввод данных с клавиатуры). Информация в файлах храниться в текстовом формате, при этом элементы структур эксперимента разделяются друг от друга символом «пробел».

Математическое решение задачи

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

1) Построение графика происходит на элементе pictureBox.

2) Особо следует сказать о размере графика: он определяется масштабом. Масштаб выбирают прежде всего с учетом интервалов измерения (по каждой оси он выбирается отдельно).

3) По горизонтальной оси откладывают значения аргумента, по вертикальной - значения функции. Чтобы различать линии, допустимо выделять линии различным цветом. Вовсе не обязательно, чтобы в точке пересечения осей было начало координат 0:0). По каждой из осей можно отображать только интервалы измерения исследуемых величин.

4) В ряде случаев удобно пользоваться масштабам.

5) Графики обязательно нужно подписывать. Подпись должна отражать содержание графика. Следует объяснить в подписи либо основном тексте изображенные на графике линии.

6) Экспериментальные точки соединены между собой отрезками.

7) на график выводится информация об экспериментах с несортированными и сортированными значениями.

Алгоритмы событий

Схема работы приложения представлена на рисунке 1, обработчики событий и методы представлены на рисунках (2-25).

 

 


 

Рисунок 1. Схема работы приложения

 
 

 

Рисунок 2. Схема обработчика события Form1_Load

 

Рисунок 3. Схема обработчика событияоткрытьФайлToolStripMenuItem_Click  

 

 
Нет
Да

 

 

Рисунок 4. Схема обработчика событиясоздатьФайлToolStripMenuItem_Click

 

Рисунок 5. Схема метода Masiv

Да
Нет

Рисунок 5. Схема методMasiv(продолдение)  

 

 

 
Рисунок 6. Схема метода Tabl

 

 

Рисунок 6. Схема методаTabl(продолжение)

 

Рисунок 7. Схема обработчика событиясуммаToolStripMenuItem_Click  

 

Рисунок 7. Схема обработчика событиясуммаToolStripMenuItem_Click(продолжение)

 

Рисунок 8. Схема обработчика событиясохранитьФайлКакToolStripMenuItem_Click  

 

 

Рисунок 8. Схема обработчика событиясохранитьФайлКакToolStripMenuItem_Click(продолжение)  

Рисунок 9. Схема обработчика события сохранитьФайлToolStripMenuItem_Click

Рисунок 9. Схема обработчика события сохранитьФайлToolStripMenuItem_Click(продолжение)

Рисунок 9. Схема обработчика события сохранитьФайлToolStripMenuItem_Click(продолжение)

Рисунок 10. Схема обработчика события закрытьФайлToolStripMenuItem_Click

 

Рисунок 11. Схема обработчика события номерминToolStripMenuItem_Click

Рисунок 11. Схема обработчика события номерминToolStripMenuItem_Click(продолжение)

 

Рисунок 11. Схема обработчика события интервалToolStripMenuItem_Click

 

 

Рисунок 12. Схема обработчика событияbutton1_Click

Рисунок 12. Схема обработчика событияbutton1_Click(продолжение)

Рисунок 12. Схема обработчика событиядобавитьСтолбецToolStripMenuItem_Click

 

Рисунок 13. Схема обработчика событияудалитьСтолбецToolStripMenuItem_Click

Рисунок 13. Схема обработчика событияудалитьСтолбецToolStripMenuItem_Click(продолжение)

 

Рисунок 14. Схема обработчика событияоПрограммеToolStripMenuItem_Click

 

Рисунок 14. Схема метода IshodGraf

Рисунок 14. Схема метода PreobGraf

 

Рисунок 14. Схема метода PreobGraf(продолжение)

 

Рисунок 15. Схема метода Grafcor

Рисунок 16. Схема обработчика события pictureBox1_Paint

 

Рисунок 17. Схема обработчика события сПреобразованымиToolStripMenuItem_Click

 

 

Рисунок 18. Схема обработчика события сИсходнымиToolStripMenuItem_Click

Рисунок 19. Схема обработчика события обаГрафикаToolStripMenuItem_Click

 

 

 
 
 

 

 
 

Рисунок 19. СхемаобработчикасобытияtrackBar1_Scroll

 

Рисунок 19. Схемаметода MinSymma Рисунок 20. Схемаметода VFile  

Рисунок 22. Схемаметода ConFile

Рисунок 23. Схемаметода Summa

 

Рисунок 24. Схемаметода YporMasiv

Рисунок 25. СхемаметодаNomerMinim

 

 

 
 

 

1.4Описание приложения

1.4.1 Спецификация приложения

В состав приложения «Пивнева» входят следующие файлы и папки:

- Курсовой проект.sln –содержит информацию о составе приложение;

- Курсовой проект.csproj –файл, содержащий все необходимые характеристики проекта;

- Program.cs –главный модуль приложения, содержит исходный код, в котором находится точка входа для приложения;- Form1.cs –модуль формы, содержит исходный кодприложения;

- Form1.Designer.cs –записывает код, реализующий все действия, связанные сэлементами управления;

- Form1.resx –файл, содержащий ресурсы формы Form1;

- папка bin –содержит папку debug, в которой находятся откомпилированныефайлы:

- Курсовой проект.exe –содержит исполняемый файл приложения;

- Курсовой проект.pdb

–содержит формат для хранения отладочной информации оскомпилированном исполняемом файле *.exe;

- Курсовой проект.vshost.exe –файл главного процесса предназначен для ускорениязапуска приложения;

- Курсовой проект.vshost.exe.manifest –конфигурационный файл главного процесса,предназначенный для ускорения запуска приложения;

- папка Properties –содержит совокупность файлов, в которых хранятсясведения о конфигурации проекта.

В состав приложения входят стандартные объекты классов языка С# и класс Experementsиэлементы класса Form1, разработанного на базе класса Form. Спецификация классаForm1 представлена в таблице 1.

 

 

Таблица 1- Спецификация класса Form1

Тип элемента Имя в программе Структура данных Тип данных Назначение
поле size простая Size Значение размера pictureBox1
поле Graf простая Font Шрифт pictureBox1
поле opfile простая string Имя файла
поле nachcolizmen простая int Начальное количество измерений
поле izmcolizmen простая int Измененное количество измерений
поле mashtab простая int Коэффициент масштаба
поле sum простая bool Показатель нахождения суммы
поле nom простая bool Показатель нахождения номера
поле sort простая bool Показатель сортировки массива
поле grafnach   bool Показатель графика с исходных данных
поле grafizm   bool Показатель графика с измененными данными
поле obagraf   bool Показатель обоих графиков
метод Form1     Конструктор по умолчанию
метод Form1_Load     Обработчик события <<Нагрузка>>
метод создатьФайлToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту «Создать файл»>>Спецификация представлена на таблице 2.
метод открытьФайлToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту «Открыть файл»>>
метод сохранитьФайлКакToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту «Сохранить файл как»>>
метод сохранитьФайлToolStripMenuItem_Click     <<Щелчок по пункту «Сохранить файл»>>
метод ЗакрытьФайлToolStripMenuItem_Click     <<Щелчок по пункту «Закрыть файл»>>
метод pictureBox1_Paint     Обработчик события<<Нарисовать >>
метод суммаToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту«Сумма»>>
метод номерминToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту«Номер мин.»>>
метод интервалToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту«Интервал»>>
метод ОПрограммеToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту «О программе»>> Спецификация представлена на таблице 6.
метод добавить СтолбецToolStripMenuItem_Click     Обработчик события <<Щелчок по пункту «Добавить столбец»>> Спецификация представлена на таблице 7.
метод удалить СтолбецToolStripMenuItem_Click       Обработчик события <<Щелчок по пункту «Удалить столбец»>>
метод сИсходнимиToolStripMenuItem_Click       Обработчик события <<Щелчок по пункту «С исходными»>>
метод сПреобразованымиToolStripMenuItem_Click         Обработчик события <<Щелчок по пункту «С преобразованными»>>
метод обаГрафикаToolStripMenuItem_Click       Обработчик события <<Щелчок по пункту «Оба графика»>>
метод button1_Click     Обработчик события <<Щелчок по кнопке «Ок»>>
метод Masiv     Создает массив
метод Tabl       Делает таблицу
метод IshodGraf     Создает график с исходными данными
метод PreobGraf     Создает график с преобразованными данными
метод trackBar1_Scroll     Обработчик события <<Масштаб>>
метод MinSymma     Ищет эксперимент с минимальной суммой значений

 

 

Таблица 2-Спецификация события создатьФайлToolStripMenuItem_Click

Переменная Имя в программе Структура данных Тип данных Назначение
b b простая int Индекс столбца

 

 

Таблица 3-Спецификация события суммаToolStripMenuItem_Click

Переменная Имя в программе Структура данных Тип данных Назначение
indexcol indexcol простая int Индекс столбца

 

 

Таблица 4-Спецификация события button1_Click

Переменная Имя в программе Структура данных Тип данных Назначение
nach nach простая int Индекс столбца
a a простая int Начало интервала
b b простая int Конец интервала

 

Таблица 5-Спецификация события удалить СтолбецToolStripMenuItem_Click

Переменная Имя в программе Структура данных Тип данных Назначение
x x простая int Номер измерения
stolindex stolindex простая int Индекс столбца

 

Таблица 6-Спецификация события IshodGraf

Переменная Имя в программе Структура данных Тип данных Назначение
x x простая float Координаты по x
y y простая float Координаты по y
w w простая float Высотаграфика
h h простая float Ширина графика
obj1 obj1 массив object Показывает номер и значение измерения

 

Таблица 7-Спецификация события PreobGraf

Переменная Имя в программе Структура данных Тип данных Назначение
x x простая float Координаты по x
y y простая float Координаты по y
w w простая float Высотаграфика
h h простая float Ширина графика
obj2 obj2 массив object Показывает номер и значение измерения

 

Таблица 8-Спецификация события добавить СтолбецToolStripMenuItem_Click

Переменная Имя в программе Структура данных Тип данных Назначение
c c простая int Количество столбцов в dataGridView1


Таблица9-Спецификация класса Calculation

Тип элемента Имя в программе Структура данных Тип данных Назначение
список Experement список List Список
поле nameExperiment   простая string Имя эксперимента.
  Izmer   массив double Значения измерений.
  nastizmer   массив double Исходные значения измерений.
поле summ   простая double Суммы значений измерений.
поле nomer   простая int Номер минимального элемента массива.
поле minsumma   простая double Минимальная сумма значений измерений из всех экспериментов.
  StrokyF   массив string Строки файла
  InFile     StreamWriter  
метод NomerMinim     Вычисляет номер минимального значения эксперимента. Спецификация представлена на таблице 9.
метод Symma     Вычисляет сумму элементов после первого отрицательного элемента. Спецификация представлена на таблице 10.
метод YporMasiv     Удаляет значение, которые находятся в интервале, и заполняет нулями освободившиеся.
метод VFile     Считывает значения измерений.
метод ConFile     Записывает значение в файл.

 

Таблица 9-Спецификация метода YporMasiv

Переменная Имя в программе Структура данных Тип данных Назначение
num num простая int Количество удаленных элементов

 

Таблица 9-Спецификация метода NomerMinim

Переменная Имя в программе Структура данных Тип данных Назначение
min min простая double Минимальный элемент массива.

 

Таблица 10-Спецификация метода Symma

Переменная Имя в программе Структура данных Тип данных Назначение
c c простая bool Вспомогательная переменная. Показывает какой из двух измерений меньше.

 

 

1.4.2. Исходный код приложения

Главный модуль приложения, содержащий исходный код, в котором находится точка входа для приложения, находится в файле Program.cs и имеет вид:

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

 

namespaceКурсовой_проект

{

staticclassProgram

{

/// <summary>

/// Главная точка входа для приложения.

/// </summary>

[STAThread]

static void Main ()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}

}

}

 

МетодApplication.Run() запускаетскрытыйциклобработкисообщенийОСиделаетвидимойформуприложения «Пивнева», инициализируяобъектклассаForm1.

Модуль формы, содержащий исходный код приложения, находится в файле Form1.cs и имеет вид:

using System;

usingSystem.Drawing;

usingSystem.Windows.Forms;

using System.IO;

 

namespaceКурсовой_проект

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

sum = false;

nom = false;

sort = false;

Graf = new Font("Time New Roman", 6.5f, FontStyle.Regular);

grafnach = false;

grafizm = false;

obagraf = false;

}

public bool sum, nom, sort, grafnach, grafizm, obagraf;

public string opfile;

Font Graf;

Size size;

intnachcolizmen, izmcolizmer, mashtab;

 

private void Form1_Load(object sender, EventArgs e)

{

size = pictureBox1.Size;

}

 

private void открытьФайлToolStripMenuItem_Click(object sender, EventArgs e)

{

if (Open.ShowDialog() == DialogResult.OK)

{

try

{

Experiments.StrokyF = File.ReadAllLines(Open.FileName);

opfile = Open.FileName;

Experiments.Experiment = new List<Experiments>();

dataGridView1.Visible = true;

for (inti = 0; i<Experiments.StrokyF.Length; i++)

{

Experiments.Experiment.Add(new Experiments());

}

dataGridView1.Enabled = true;

panel1.Enabled = true;

создатьФайлToolStripMenuItem.Enabled = false;

открытьФайлToolStripMenuItem.Enabled = false;

сохранитьФайлКакToolStripMenuItem.Enabled = true;

сохранитьФайлToolStripMenuItem.Enabled = true;

графикToolStripMenuItem.Enabled = true;

расчетыToolStripMenuItem.Enabled = true;

построениеToolStripMenuItem.Enabled = true;

закрытьФайлToolStripMenuItem.Enabled = true;

Experiments.VFile();

Tabl();

MinSymma();

 

}

catch (Exception exc)

{

MessageBox.Show(exc.Message);

}

}

else

{

MessageBox.Show("Файлневыбран!", " Ошибка", MessageBoxButtons.OK);

открытьФайлToolStripMenuItem.Enabled = true;

создатьФайлToolStripMenuItem.Enabled = true;

 

}

}

 

public void создатьФайлToolStripMenuItem_Click(object sender, EventArgs e)

{

dataGridView1.Visible = true;

dataGridView1.Enabled = true;

panel1.Enabled = true;

открытьФайлToolStripMenuItem.Enabled = false;

создатьФайлToolStripMenuItem.Enabled = false;

закрытьФайлToolStripMenuItem.Enabled = true;

построениеToolStripMenuItem.Enabled = true;

сохранитьФайлКакToolStripMenuItem.Enabled = true;

try

{

dataGridView1.Columns.Add("Experiment", "Эксперимент");

dataGridView1.Rows.Add();

Experiments.Experiment = new List<Experiments>();

Experiments.Experiment.Add(new Experiments());

for (inti = 0; i< 5; i++)

{

int b = i + 1;

dataGridView1.Columns.Add(b.ToString(), "Измерение " + (i + 1));

}

 

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

public void Masiv()

{

try

{

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

int b;

List<double> list = new List<double>();

if (i>= Experiments.Experiment.Count)

{

Experiments.Experiment.Add(new Experiments());

}

Experiments.Experiment[i].nameExperiment = (string)dataGridView1.Rows[i].Cells[0].Value;

if (nom | sum) b = 2;

else if (nom & sum) b = 3;

else b = 1;

while (b < dataGridView1.Rows[i].Cells.Count)

{

if (!(Convert.ToDouble(dataGridView1.Rows[i].Cells[b].Value) == 0))

{

list.Add(Convert.ToDouble(dataGridView1.Rows[i].Cells[b].Value));

}

b++;

}

Experiments.Experiment[i].Izmer = list.ToArray();

}

 

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

public void Tabl()

{

 

try

{

int length = Experiments.Experiment[0].Izmer.Length;

dataGridView1.Columns.Add("Experiment", "Эксперемент");

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

if (length <Experiments.Experiment[i].Izmer.Length)

{

length = Experiments.Experiment[i].Izmer.Length;

}

}

for (int j = 0; j < length; j++)

{

dataGridView1.Columns.Add("Izmer" + j, "Измерение " + (j + 1));

}

for (int k = 0; k <Experiments.Experiment.Count; k++)

{

object[] values = new object[] { Experiments.Experiment[k].nameExperiment };

dataGridView1.Rows.Add(values);

for (int n = 0; n <Experiments.Experiment[k].Izmer.Length; n++)

{

dataGridView1.Rows[k].Cells[n + 1].Value = Experiments.Experiment[k].Izmer[n];

}

}

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

Experiments.Experiment[i].nastizmer = new double[Experiments.Experiment[i].Izmer.Length];

for (int j = 0; j <Experiments.Experiment[i].nastizmer.Length; j++)

{

Experiments.Experiment[i].nastizmer[j] = Experiments.Experiment[i].Izmer[j];

}

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

 

public void суммаToolStripMenuItem_Click(object sender, EventArgs e)

{

try

{

DataGridViewTextBoxColumnSymma = new DataGridViewTextBoxColumn{ HeaderText = "Сумма", Name = "Сумма" };

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

Experiments.Symma(i);

}

intindexcol = 1;

if (dataGridView1.Columns[1].Name == "Номер") indexcol = 2;

elseindexcol = 1;

if (!sum)

{

dataGridView1.Columns.Insert(indexcol, Symma);

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

dataGridView1.Rows[i].Cells[indexcol].Value = Experiments.Experiment[i].summ;

}

sum = true;

}

else

{

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

dataGridView1.Rows[i].Cells[indexcol].Value = Experiments.Experiment[i].summ;

}

}

 

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

 

}

 

public void сохранитьФайлКакToolStripMenuItem_Click(object sender, EventArgs e)

{

try

{

Save.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

Save.FilterIndex = 2;

Save.RestoreDirectory = true;

if (Save.ShowDialog() == DialogResult.OK)

{

Masiv();

Experiments.InFile = new StreamWriter(new FileStream(Save.FileName, FileMode.Create));

for (inti = 0; i< (dataGridView1.RowCount - 1); i++)

{

Experiments.ConFile(i, sum, nom, sort);

}

Experiments.InFile.Close();

opfile = Save.FileName;

суммаToolStripMenuItem.Enabled = true;

номерминToolStripMenuItem.Enabled = true;

расчетыToolStripMenuItem.Enabled = true;

графикToolStripMenuItem.Enabled = true;

сохранитьФайлToolStripMenuItem.Enabled = true;

MinSymma();

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

Experiments.Experiment[i].nastizmer = new double[Experiments.Experiment[i].Izmer.Length];

for (int j = 0; j <Experiments.Experiment[i].nastizmer.Length; j++)

{

Experiments.Experiment[i].nastizmer[j] = Experiments.Experiment[i].Izmer[j];

}

}

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

private void сохранитьФайлToolStripMenuItem_Click(object sender, EventArgs e)

{

try

{

Masiv();

if ((sum & nom) & sort)

{

Save.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

Save.FilterIndex = 2;

Save.RestoreDirectory = true;

if (Save.ShowDialog() == DialogResult.OK)

{

Masiv();

Experiments.InFile = new StreamWriter(new FileStream(Save.FileName, FileMode.Create));

for (inti = 0; i< (dataGridView1.RowCount - 1); i++)

{

Experiments.ConFile(i, sum, nom, sort);

}

Experiments.InFile.Close();

opfile = Save.FileName;

}

}

else

{

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

Experiments.Experiment[i].nastizmer = new double[Experiments.Experiment[i].Izmer.Length];

for (int j = 0; j <Experiments.Experiment[i].nastizmer.Length; j++)

{

Experiments.Experiment[i].nastizmer[j] = Experiments.Experiment[i].Izmer[j];

}

}

 

Experiments.InFile = new StreamWriter(new FileStream(opfile, FileMode.Create));

for (inti = 0; i< (dataGridView1.RowCount - 1); i++)

{

Experiments.ConFile(i, sum, nom, sort);

}

Experiments.InFile.Close();

}

MinSymma();

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

private void закрытьФайлToolStripMenuItem_Click(object sender, EventArgs e)

{

try

{

dataGridView1.Rows.Clear();

dataGridView1.Columns.Clear();

dataGridView1.Enabled = false;

panel1.Enabled = false;

panel1.Visible = false;

opfile = null;

grafnach = false;

grafizm = false;

obagraf = false;

построениеToolStripMenuItem.Enabled = false;

dataGridView1.Enabled = false;

dataGridView1.Visible = false;

расчетыToolStripMenuItem.Enabled = false;

графикToolStripMenuItem.Enabled = false;

сохранитьФайлToolStripMenuItem.Enabled = false;

сохранитьФайлКакToolStripMenuItem.Enabled = false;

sum = false;

nom = false;

sort = false;

закрытьФайлToolStripMenuItem.Enabled = false;

открытьФайлToolStripMenuItem.Enabled = true;

создатьФайлToolStripMenuItem.Enabled = true;

trackBar1.Enabled = false;

pictureBox1.Visible = false;

pictureBox1.Enabled = false;

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

Experiments.Experiment[i].Izmer = null;

Experiments.Experiment[i].nastizmer = null;

Experiments.Experiment[i].summ = 0;

Experiments.Experiment[i].nomer = 0;

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

private void номерминToolStripMenuItem_Click(object sender, EventArgs e)

{

try

{

DataGridViewTextBoxColumnNomer = new DataGridViewTextBoxColumn{ HeaderText = "Номер", Name = "Номер" };

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

Experiments.NomerMinim(i);

}

if (!nom)

{

dataGridView1.Columns.Insert(1, Nomer);

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

dataGridView1.Rows[i].Cells[1].Value = Experiments.Experiment[i].nomer;

}

nom = true;

}

else

{

for (inti = 0; i< (dataGridView1.Rows.Count - 1); i++)

{

dataGridView1.Rows[i].Cells[1].Value = Experiments.Experiment[i].nomer;

}

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

private void интервалToolStripMenuItem_Click(object sender, EventArgs e)

{

panel1.Visible = true;

}

 

private void button1_Click(object sender, EventArgs e)

{

try

{

intnach = 0;

double a = Convert.ToDouble(textBox1.Text);

double b = Convert.ToDouble(textBox2.Text);

for (inti = 0; i< (dataGridView1.RowCount - 1); i++)

{

Experiments.YporMasiv(i, a, b);

}

if (!sum &!nom) nach = 1;

if (sum | nom) nach = 2;

if (sum & nom) nach = 3;

for (int j = 0; j <Experiments.Experiment.Count; j++)

{

for (int k = 0; k <Experiments.Experiment[j].Izmer.Length; k++)

{

dataGridView1.Rows[j].Cells[k + nach].Value = Experiments.Experiment[j].Izmer[k];

}

}

sort = true;

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

 

}

 

private void добавитьСтолбецToolStripMenuItem_Click(object sender, EventArgs e)

{

DataGridViewTextBoxColumnStol = new DataGridViewTextBoxColumn();

int c = dataGridView1.Columns.Count;

if (sum | nom)

{

c--;

}

Stol.HeaderText = "Измерение " + c;

dataGridView1.Columns.Add(Stol);

}

 

private void удалитьСтолбецToolStripMenuItem_Click(object sender, EventArgs e)

{

if (dataGridView1.CurrentCell.ColumnIndex > 0)

{

intstolindex = dataGridView1.CurrentCell.ColumnIndex;

int x = stolindex;

if (sum & nom)

{

stolindex = 2;

x = stolindex - 1;

}

if (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].Name == "Сумма")

{

sum = false;

}

else if (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].Name == "Номер")

{

nom = false;

}

dataGridView1.Columns.RemoveAt(dataGridView1.CurrentCell.ColumnIndex);

while (stolindex< dataGridView1.ColumnCount)

{

dataGridView1.Columns[stolindex].HeaderText = "Измерение " + x;

stolindex++;

x++;

}

}

else

{

MessageBox.Show("Нельзяудалятьстолбецсназванием!", "Внимание!", MessageBoxButtons.OK);

}

}

 

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Программуразроботаластуденткапервогокурса\nгруппыМИ-11\nПивневаОлександра", " Опрограмме", MessageBoxButtons.OK);

}

 

private void IshodGraf(PaintEventArgs e)

{

try

{

 

e.Graphics.DrawString("Краснаялиния - исходныеданные", Control.DefaultFont, Brushes.Red, 10f, 15f);

float x = 30f;

float y = (pictureBox1.Size.Height / 2) - ((int)Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer[0]);

float w = 0f;

float h = 0f;

object[] obj1 = new object[] { "(", 1, ";", Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer[0], ")" };

e.Graphics.DrawString(string.Concat(obj1), Graf, Brushes.Red, (x - 15f), (y - 15f));

for (inti = 1; i< Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer.Length; i++)

{

w += pictureBox1.Width / nachcolizmen;

e.Graphics.DrawLine(Pens.DarkBlue, w, ((pictureBox1.Height / 2) - 5), w, ((pictureBox1.Height / 2) + 5));

h = (pictureBox1.Size.Height / 2) - ((int)Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer[i]);

if (w > pictureBox1.Width)

{

w = pictureBox1.Width - (w - pictureBox1.Width);

}

e.Graphics.DrawLine(Pens.Red, x, y, w, h);

e.Graphics.FillEllipse(Brushes.DarkBlue, (x - 2.5f), (y - 2.5f), 5f, 5f);

x = w;

y = h;

e.Graphics.FillEllipse(Brushes.DarkBlue, (x - 2.5f), (y - 2.5f), 5f, 5f);

object[] obj2 = new object[] { "(", i + 1, ";", Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer[i], ")" };

e.Graphics.DrawString(string.Concat(obj2), Graf, Brushes.Red, (x - 15f), (y - 15f));

}

}

 

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

private void PreobGraf(PaintEventArgs e)

{

try

{

 

if (sort)

{

e.Graphics.DrawString("Чернаялиния - выходныеданные", Control.DefaultFont, Brushes.Black, 10f, 30f);

float x = 30f;

float y = (pictureBox1.Size.Height / 2) - ((int)Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer[0]);

float w = 0f;

float h = 0f;

object[] obj1 = new object[] { "(", 1, ";", Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer[0], ")" };

e.Graphics.DrawString(string.Concat(obj1), Graf, Brushes.Black, (x - 15f), (y - 15f));

for (inti = 1; i< Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer.Length; i++)

{

w += pictureBox1.Width / izmcolizmer;

e.Graphics.DrawLine(Pens.Red, w, ((pictureBox1.Height / 2) - 5), w, ((pictureBox1.Height / 2) + 5));

h = (pictureBox1.Size.Height / 2) - ((int)Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer[i]);

if (w > pictureBox1.Width)

{

w = pictureBox1.Width - (w - pictureBox1.Width);

}

e.Graphics.DrawLine(Pens.Black, x, y, w, h);

e.Graphics.FillEllipse(Brushes.Red, (x - 2.5f), (y - 2.5f), 5f, 5f);

x = w;

y = h;

e.Graphics.FillEllipse(Brushes.Red, (x - 2.5f), (y - 2.5f), 5f, 5f);

object[] obj2 = new object[] { "(", i + 1, ";", Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer[i], ")" };

e.Graphics.DrawString(string.Concat(obj2), Graf, Brushes.Black, (x - 15f), (y - 15f));

}

}

else

{

MessageBox.Show("Выполнитесортировку!", "Необходимасортировка!", MessageBoxButtons.OK);

obagraf = false;

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message);

}

}

private void Grafcor(PaintEventArgs e)

{

try

{

e.Graphics.Clear(Color.White);

e.Graphics.DrawString(dataGridView1.CurrentRow.Cells[0].Value.ToString(), Control.DefaultFont, Brushes.Black, 10f, 0f);

if (Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer!= null)

{

nachcolizmen = (short)Experiments.Experiment[dataGridView1.CurrentRow.Index].nastizmer.Length;

}

izmcolizmer = (short)Experiments.Experiment[dataGridView1.CurrentRow.Index].Izmer.Length;

e.Graphics.DrawLine(Pens.Blue, 0, pictureBox1.Height / 2, pictureBox1.Width, pictureBox1.Height / 2);

e.Graphics.DrawLine(Pens.Blue, 10, 0, 10, pictureBox1.Height);

e.Graphics.DrawString("0", Graf, Brushes.Blue, 12f, ((pictureBox1.Height / 2) + 3));

e.Graphics.DrawString("Y", Graf, Brushes.Blue, 3f, 0f);

e.Graphics.DrawString("X", Graf, Brushes.Blue, (pictureBox1.Width - 12), ((pictureBox1.Height / 2) + 3));

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

 

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

if ((grafnach | grafizm) | obagraf)

{

Grafcor(e);

}

if (grafnach)

{

IshodGraf(e);

}

else if (grafizm)

{

PreobGraf(e);

}

else if (obagraf)

{

IshodGraf(e);

PreobGraf(e);

}

}

 

private void сИсходнимиToolStripMenuItem_Click(object sender, EventArgs e)

{

if ((dataGridView1.CurrentRow.Index + 1)!= dataGridView1.RowCount)

{

trackBar1.Enabled = true;

panel2.Enabled = true;

pictureBox1.Enabled = true;

pictureBox1.Visible = true;

grafnach = true;

grafizm = false;

obagraf = false;

pictureBox1.Refresh();

}

else

{

MessageBox.Show("Некорректныйвыбор", "Ошибка", MessageBoxButtons.OK);

}

}

 

private void сПреобразованымиToolStripMenuItem_Click(object sender, EventArgs e)

{

if ((dataGridView1.CurrentRow.Index + 1)!= dataGridView1.RowCount)

{

trackBar1.Enabled = true;

pictureBox1.Enabled = true;

obagraf = false;

grafnach = false;

grafizm = true;

pictureBox1.Refresh();

}

else

{

MessageBox.Show("Некорректныйвыбор", "Ошибка", MessageBoxButtons.OK);

}

}

 

private void обаГрафикаToolStripMenuItem_Click(object sender, EventArgs e)

{

if ((dataGridView1.CurrentRow.Index + 1)!= dataGridView1.RowCount)

{

trackBar1.Enabled = true;

pictureBox1.Enabled = true;

obagraf = true;

grafnach = false;

grafizm = false;

pictureBox1.Refresh();

}

else

{

MessageBox.Show("Некорректныйвыбор", "Ошибка", MessageBoxButtons.OK);

}

}

 

private void trackBar1_Scroll(object sender, EventArgs e)

{

if ((dataGridView1.CurrentRow.Index + 1)!= dataGridView1.RowCount)

{

mashtab = trackBar1.Value;

pictureBox1.Width = size.Width + ((size.Width / izmcolizmer) * mashtab);

pictureBox1.Height = size.Height + ((size.Height / izmcolizmer) * mashtab);

toolTip1.SetToolTip(trackBar1, "Масштабграфика = " + trackBar1.Value);

pictureBox1.Refresh();

}

else

{

MessageBox.Show("Некорректныйвыбор", "Ошибка", MessageBoxButtons.OK);

 

}

}

 

private void MinSymma()

{

double min;

stringnomer = ("0");

for (inti = 0; i<Experiments.Experiment.Count; i++)

{

for (int j = 0; j <Experiments.Experiment[i].Izmer.Length; j++)

{

Experiments.Experiment[i].minsumma += Experiments.Experiment[i].Izmer[j];

}

min = Experiments.Experiment[0].minsumma;

 

for (int k = 0; k <Experiments.Experiment.Count; k++)

{

if (Experiments.Experiment[k].minsumma< min)

{

min = Experiments.Experiment[k].minsumma;

nomer = Experiments.Experiment[k].nameExperiment;

}

statusStrip1.Items[0].Text = "Номерэксперемента: " + nomer;

statusStrip1.Items[1].Text = "Сумма: " + min.ToString();

}

}

}

 

 

}

 

 

public class Experiments

{

public static List<Experiments> Experiment;

public string nameExperiment;

public double[] Izmer;

public double[] nastizmer;

public static StreamWriterInFile;

public static string[] StrokyF;

public double summ;

publicintnomer;

public double minsumma;

 

public static void VFile()

{

try

{

string[] Strnach = new string[0];

char[] numb = new char[] { ' ' };

for (inti = 0; i<StrokyF.Length; i++)

{

stringstr = StrokyF[i];

Strnach = str.Replace('.', ',').Split(numb, StringSplitOptions.RemoveEmptyEntries);

Experiment[i].nameExperiment = Strnach[1].ToString();

Experiment[i].Izmer = new double[Strnach.Length - 2];

for (int j = 0; j < Experiment[i].Izmer.Length; j++)

{

Experiment[i].Izmer[j] = Convert.ToDouble(Strnach[2 + j]);

}

}

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибкасчитыванияфайла!", MessageBoxButtons.OK);

}

}

public static void ConFile(int a, bool sum, bool proiz, bool sor)

{

if ((sum &proiz) &sor)

{

try

{

InFile.Write("* " + Experiment[a].nameExperiment + " " + Experiment[a].summ + " " + Experiment[a].nomer + " ");

foreach (double b in Experiment[a].Izmer)

{

InFile.Write(b + " ");

}

InFile.WriteLine();

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

else

{

try

{

InFile.Write("* " + Experiment[a].nameExperiment + " ");

foreach (double b in Experiment[a].Izmer)

{

InFile.Write(b + " ");

}

InFile.WriteLine();

}

catch (Exception exc)

{

MessageBox.Show(exc.Message, "Ошибка!", MessageBoxButtons.OK);

}

}

}

public static void Symma(int a)

{

Experiment[a].summ = 0;

bool c = false;

for (inti = 0; i< Experiment[a].Izmer.Length; i++)

{

if (c == true) Experiment[a].summ += Math.Abs(Experiment[a].Izmer[i]);

if (Experiment[a].Izmer[i] < 0) c = true;

}

}

public static void YporMasiv(int a, double nach, double con)

{

intnum = 0;

for (inti = 0; i< Experiment[a].Izmer.Length; i++)

{

if (Experiment[a].Izmer[i] <nach || Experiment[a].Izmer[i] > con)

Experiment[a].Izmer[i - num] = Experiment[a].Izmer[i];

else

num++;

}

for (inti = Experiment[a].Izmer.Length - num; i< Experiment[a].Izmer.Length; i++)

Experiment[a].Izmer[i] = 0;

}

public static void NomerMinim(int a)

{

double min = Math.Abs(Experiment[a].Izmer[0]);

for (inti = 0; i< Experiment[a].Izmer.Length; i++)

{

if (Math.Abs(Experiment[a].Izmer[i]) <Math.Abs(min))

{

min = Experiment[a].Izmer[i];

Experiment[a].nomer = i;

}

}

}

}

}

1.4.3 Описаниеинтерфейсаприложения

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

- Form1 – главное окно;

-файлToolStripMenuItem(Пункт «Файл») – содержит пункты для работы с файлом;

- сохранитьФайлКакToolStripMenuItem(Пункт «Сохранить файл как») – сохранить исходный файл;

- сохранитьФайлToolStripMenuItem(Пункт «Сохранить файл») – сохранить выходной или изменить исходный файл;

- создатьФайлToolStripMenuItem(Пункт «Создать файл») – создать новый файл;

- открытьФайлToolStripMenuItem(Пункт «Открыть файл») – открыть файл и заполнить таблицу;

- закрытьФайлToolStripMenuItem(«Закрыть файл»)– закрыть файл;

-расчетыToolStripMenuItem(Пункт «Расчёты»)– содержит пункты для вычислений;

-суммаToolStripMenuItem(Пункт «Сумма»)– считает сумму после первого отрицательного числа;

-номерминToolStripMenuItem(Пункт «Номер мин. элемента»)– находит минимальный по модулю элемент массива;

-интервалToolStripMenuItem(Пункт «Сортировка»)–сжимает массив, удаляет из массива числа, находящиеся в интервале, и заменяет свободные ячееки нулями;

-графикToolStripMenuItem(Пункт «График»)–пункты для графиков;

-сИсходнимиToolStripMenuItem(Пункт «С исходными»)– строить график с исходными данными;

-сПреобразованымиToolStripMenuItem(Пункт «С преобразованными»)–строит ьграфик с преобразованными данными;

-обаГрафикаToolStripMenuItem(Пункт «Оба графика»)–строить оба графика;

-построениеToolStripMenuItem(Пункт «Построение»)–пункты для построения таблицы;

-добавитьСтолбецToolStripMenuItem(Пункт «Добавить столбец») –добавлять столбец в конец;

-удалитьСтолбецToolStripMenuItem(Пункт «Удалить столбец»)– удалять столбец;

-оПрограммеToolStripMenuItemПункт «О программе»)– показывать сообщение о программе;

- dataGridView1 – таблица для ввода и редактирования;

- button1-выбор интервала;

- label(1-2) – сопроводительная информация;

- panel(1-2) – предоставляет поле для размещения компонентов;

- pictureBox1 – поле для графика;

- trackBar1– маштабpictureBox1;

-Open– диалоговое окно для открытия файла;

-Save–диалоговое окно для сохранения файла;

-menuStrip1 – меню, где содержаться все пункты;

-statusStrip1 выводит сумму элементов и номер эксперемента;

-toolTip1 показывает маштаб;

 

Форма приложения и используемые компоненты представлены на рисунках 26, 27.

 

 

Рисунок 25. Внешний вид формы приложения «Пивнева» - Заполнение и редактирование входного файла.

 

Рисунок 26. Внешний вид формы приложения «Пивнева» - Демонстрация вычислений.

 

 

1.5 Результаты выполнения приложения

На рисунке27 представлена структура исходного файла, который необходим для правильного функционирования приложения«Пивнева»:

Рисунок 27. Пример исходного файла.

 

А также может быть создан средствами самого приложения.

С помощью кнопки «Открыть файл» открывается входной файл и возможно:

· вычислить номер минимального элемента массива, сумму элементов после первого отрицательного значения, сортировка массива происходит после нажатия кнопки «Расчёты».

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

Результат выполнения приложения помещается в выходной файл который представленна рисунке 28.

Рисунок 28. Пример выходного файла

Заключение

В ходе данной работы было выполнено задание разработать программу обработки результатов измерений, полученных в результате проведения N экспериментов. Начальные значения хранятся в файле, но при его отсутствии можно создать собственный с помощью разработанной программы. Для наглядности данные выводятся на график, а выходные данные записываются в выходной файл.

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

 

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ

1.Голощапов АЛ. Microsoft Visual Studio 2010. - СПб.іБХВ-Петербург, 2011. – 544с.:ил.

2. Петцольд Ч. Программирование для Microsoft Windows на С#. В 2-х томах. Том 1. Пер. с англ. - М.: «Русская Редакция», 2002.- 576 с.: ил.

3. Петцольд Ч. Программирование для Microsoft Windows на С#. В 2-х томах. Том 2. Пер. с англ. - М.: «Русская Редакция», 2002.- 624 с.: ил.

4. Троелсен Э. Язык программирования C# 2010 и платформа.NET 4.0. Пер. с англ. - М.: Издательский дом "Вильямс", 2011. — 1392 с.: ил.

5. https://msdn.microsoft.com/ru-ru/library/

Пояснительную записку выполнил

Студентка Пивнева Александра Андрейвна

 


 

Приложение «Пивнева»


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: