Введение
Все программирование на данном языке тесно связано с понятием обьекто-ориентированного программирования. По сути, сама методика ООП является неотъемлемой частью си шарп, по этой причине все программы на си шарп хотя бы в малой степени являются обьектно-ориентированными.
По сути ООП считается самым эффективным подходом к программированию. Со времен появления первых языков программирования, методики их работы существенно изменились. Компьютеры начали постепенно приспосабливать к более сложному коду. Так самые первые программы состояли всего из нескольких сотен команд, их задача заключалась в ручном переключении на разные двоичные команды с пульта управления ЭВМ.
Со временем программы все усложнялись, что в свою очередь привело к возникновению более современного языка программирования – Ассемблера. Но на этом, как известно, разработчики не остановились. Так на свет появились первые языки программирования высокого уровня, такие как COBOL и FORTRAN. Данные языки в отличие от Ассемблера позволяли реализовать более сложные программы.
|
|
На каждом из этапов формирования современных языков программирования выходили в свет все новые средства, основанная задача которых была “обуздать” программы с постоянно растущей сложностью. Но в определенный момент разработчики столкнулись с еще одной проблемой – структурный подход к программированию становился все менее работоспособным, так и появилось в своем первичном обличии ООП.
ООП стало новым витком в развитии отрасли программирования. Для того чтобы программный код унаследовал все принципы ООП он должен придерживаться трех основных свойств ООП, таких как наследование, полиморфизм и инкапсуляция.
1 Описание работы
Задание
Разработать программу обработки результатов измерений, полученных в результате проведения N экспериментов (10<N<1000).
Все результаты экспериментов хранятся в файле DatesInl11.txt в виде последовательности структур, полученных в результате проведения N экспериментов.
Единичный эксперимент формирует массив измерений Хnkразмерностью Кn (Кn — количество измерений в п-м эксперименте, причем К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/
Пояснительную записку выполнил
Студентка Пивнева Александра Андрейвна
Приложение «Пивнева»