Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРСАЧ_2.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
954.37 Кб
Скачать

4.2 Аналіз результатів роботи

Після завершення розробки програми і її збору на каналі Release розроблено декілька тестів. Всі тести пройшли перевірку і програма обрахувала вірний результат. Можна стверджувати, що написаний алгоритм працює безпомилково і забезпечує надійність і правильність роботи програми під час усього циклу її використання.

Розробка програми збільшила навички роботи в середовищі Visual Studio 2010 мовою програмування C# версії 4.0.

Висновки

Підводячи підсумки можна зазначити, що була написана програма для моделювання роботи алгоритму Дейкстри на тему «Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму Дейкстри або Флойда та мови програмування С#». Програма написана мовою C# з використанням об’єктно-орієнтованих принципів програмування. Програма має зручний інтерфейс і приємну кольорову гамму, що на практиці гарно виглядає і не викликає в користувача небажаних емоцій. Створивши тести перевірено, що алгоритм в програмі працює чітко і вірно. Програма обробляє усі можливі виключення і забезпечує надійну роботу під час використання на практиці.

Перелік посилань

  1. uk.wikipedia.org/wiki/Алгоритм_Дейкстри

  2. uk.wikipedia.org/wiki/Алгоритм_Флойда_—_Воршелла

  3. ru.wikipedia.org/wiki/Меню_(информатика)

  4. ru.wikipedia.org/wiki/C_Sharp

  5. ru.wikipedia.org/wiki/Графічний_інтерфейс_користувача

  6. ru.wikipedia.org/wiki/ Тестування_програмного_забезпечення

Література

  1. Круподьорова Л.М., Пєтух А.М. Технологія програмування мовою Сі, ВНТУ, 1-2частини, 2006 рік .

  2. Круподьорова Л.М. Методичні вказівки для курсового проектування, ВНТУ, 2004.

  3. Власюк В. Х., Круподьорова Л. М. “Програмування мовою Сі, Вінниця, ВДТУ, 2001.

  4. М. Эллис, Б.Страструп. Справочное руководство по языку С++ с комментариями: Пер. с англ. – Москва: Мир, 1992.

  5. В.В. Подбельский, С.С. Фомин. Программирование на ЯЗЫКЕ Си. - Москва: «Финансы и статистика», 2002.

Додаток а – Лістінг

/*————————————————Program.cs—————————————*/

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace cups_ver_0

{

static class Program

{

/// <summary>

/// Головна точка входу в програму.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new FormHello());

}

}

}

/*————————————————Program.cs—————————————*/

/*————————————————Form1.cs——————————————*/

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace cups_ver_0

{

public partial class FormHello : Form

{

/// <summary>

/// Кількість секунд до старту

/// </summary>

int КількістьСекунд = 10;

public FormHello(){

InitializeComponent();

}

#region Запуск головної форми

private void Зміна_форм()

{

this.Hide();

MainForm ГоловнаФорма = new MainForm();

ГоловнаФорма.Show();

}

#endregion

private void button1_Click(object sender, EventArgs e)

{

this.Зміна_форм();

this.timer1.Stop();

}

private void Form1_Load(object sender, EventArgs e)

{

this.timer1.Start();

}

private void timer1_Tick(object sender, EventArgs e)

{

this.КількістьСекунд--;

if (this.КількістьСекунд == -1){

this.Зміна_форм();

this.timer1.Stop();

}

else

this.button1.Text = Convert.ToString(this.КількістьСекунд);

}

}

}

/*————————————————Form1.cs——————————————*/

/*————————————————Form2.cs——————————————*/

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Threading;

namespace cups_ver_0

{

public partial class MainForm : Form

{

#region Змінні та константи

/// <summary>

/// КАРТИНКИ на форму.

/// </summary>

PictureBox[] КучаКартинок = new PictureBox[ГраничнаКількістьКартинок];

/// <summary>

/// Підписи картинок

/// </summary>

Label[] підписиПідКартинками = new Label[ГраничнаКількістьКартинок];

/// <summary>

/// Поточна кількість картинок на формі.

/// </summary>

int КількістьКаністр = 0;

/// <summary>

/// Для запам'ятовування розміщення картинки на формі.

/// </summary>

int[,] МасивКоординатКучіКартинок = new int[ГраничнаКількістьКартинок, 2];

/// <summary>

/// Максимальна к-сть картинок на формі.

/// </summary>

const int ГраничнаКількістьКартинок = 99;

#endregion

#region Конструктор класу

public MainForm()

{

InitializeComponent();

}

#endregion

#region Натиснення на картинку

/// <summary>

/// Натиснення на картинку

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void кляцалкаКартинок_Click(object sender, System.EventArgs e)

{

this.Refresh();

for (int i = Convert.ToInt32(((PictureBox)sender).Name); i < this.КількістьКаністр ; i++)

{

this.КучаКартинок[i].Location = new Point(this.КучаКартинок[i + 1].Location.X, this.КучаКартинок[i + 1].Location.Y);

this.підписиПідКартинками[i].Location = new Point(this.підписиПідКартинками[i + 1].Location.X, this.підписиПідКартинками[i + 1].Location.Y);

}

--this.КількістьКаністр;

this.позначенняПершогоТаОстаннього();

}

#endregion

#region MainForm_MouseMove Рух вказівника по формі

/// <summary>

/// Рух вказівника по формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void MainForm_MouseMove(object sender, MouseEventArgs e){

if (this.pictureBox1.Visible)

{

/*this.Refresh();*/ /*З фіналки вирізано*/

this.pictureBox1.Location = new System.Drawing.Point(e.X - this.pictureBox1.Size.Height / 2, e.Y - this.pictureBox1.Size.Width / 2);

//this.розміткаВсіхЗвязків(); /*З фіналки вирізано*/

this.позначенняПершогоТаОстаннього();

/*this.розміткаВсіхЗвязків();*/

}

}

#endregion

#region MainForm_MouseDown - натиснення кнопки миші

/// <summary>

/// Клік по формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void MainForm_MouseDown(object sender, MouseEventArgs e)

{

#region Натиснення правої кнопки миші

if (e.Button == MouseButtons.Right)

{

this.Refresh();

this.позначенняПершогоТаОстаннього();

this.pictureBox1.Hide();

}

#endregion

if (this.pictureBox1.Visible)

{

this.Refresh();

this.КучаКартинок[КількістьКаністр].Show();

this.КучаКартинок[КількістьКаністр].Location = new System.Drawing.Point(e.X - this.pictureBox1.Size.Height / 2, e.Y - this.pictureBox1.Size.Width / 2);

#region Запис координат створеної картинки на формі

this.МасивКоординатКучіКартинок[КількістьКаністр, 0] = e.X - this.pictureBox1.Size.Height / 2;

this.МасивКоординатКучіКартинок[КількістьКаністр, 1] = e.Y - this.pictureBox1.Size.Width / 2;

#endregion

this.підписиПідКартинками[КількістьКаністр].Location = new System.Drawing.Point(e.X + this.pictureBox1.Size.Height - 58, e.Y - this.pictureBox1.Size.Width / 2);

this.КількістьКаністр++;

this.button3.Enabled = false;

/*this.розміткаВсіхЗвязків();*/

}

}

#endregion

#region Кнопка "Про програму"

/// <summary>

/// Інформація про програму

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

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

{

System.Windows.Forms.MessageBox.Show("\n\nКУРСОВА РОБОТА\n\n© Степанюк Дмитро\n2011р.\n\nskipper.nightingale@gmail.com", "Інформація", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);

}

#endregion

#region Кнопка "Показати всі можливі зв'язки"

/// <summary>

/// Кнопка "Показати всі можливі зв'язки"

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button2_Click(object sender, EventArgs e) {

this.розміткаВсіхЗвязків();

}

#endregion

#region Створення картинки

/// <summary>

/// Створення картинки

/// </summary>

private void СтворенняКартинки()

{

this.pictureBox1.Show();

if (this.КучаКартинок[0] == null)

for (int i = 0; i < ГраничнаКількістьКартинок; i++){

this.КучаКартинок[i] = new PictureBox();

this.КучаКартинок[i].Image = this.pictureBox1.Image;

this.КучаКартинок[i].Location = new System.Drawing.Point(-100, -100);

this.КучаКартинок[i].Size = this.pictureBox1.Size;

this.КучаКартинок[i].SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

this.КучаКартинок[i].TabIndex = 0;

this.КучаКартинок[i].TabStop = false;

//КучаКартинок[i].Parent = this;

this.КучаКартинок[i].Name = i.ToString();

this.КучаКартинок[i].Hide();

this.КучаКартинок[i].Tag = i;

this.КучаКартинок[i].Click += new EventHandler(this.кляцалкаКартинок_Click);

this.Controls.Add(this.КучаКартинок[i]);

this.підписиПідКартинками[i] = new System.Windows.Forms.Label();

this.підписиПідКартинками[i].Name = (i + 1).ToString();

this.підписиПідКартинками[i].Text = (i + 1).ToString();

this.підписиПідКартинками[i].Location = new Point(-100, -100);

if (i < 9)

this.підписиПідКартинками[i].Size = new System.Drawing.Size(22, 24);

else

this.підписиПідКартинками[i].Size = new System.Drawing.Size(45, 24);

//підписиПідКартинками[i].Parent = this;

this.підписиПідКартинками[i].TabIndex = 0;

this.підписиПідКартинками[i].Font = new Font(System.Drawing.FontFamily.GenericMonospace, 20, System.Drawing.FontStyle.Regular);

this.Controls.Add(this.підписиПідКартинками[i]);

}

}

#endregion

#region Помічення всіх зв'язків між елементами на формі

/// <summary>

/// Помічення всіх зв'язків між елементами на формі

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void розміткаВсіхЗвязків()

{

System.Drawing.Graphics formGraphics = this.CreateGraphics();

System.Drawing.Pen greenPen = new System.Drawing.Pen(System.Drawing.Color.Green, 3);

//greenPen.Width = 2;

for (int i = 0; i < this.КількістьКаністр; i++)

for (int j = i + 1; j < this.КількістьКаністр; j++)

{

System.Drawing.Point ПочатковаТочка = new System.Drawing.Point(this.МасивКоординатКучіКартинок[i, 0] + 40, this.МасивКоординатКучіКартинок[i, 1] + 40);

System.Drawing.Point КінцеваТочка = new System.Drawing.Point(this.МасивКоординатКучіКартинок[j, 0] + 40, this.МасивКоординатКучіКартинок[j, 1] + 40);

formGraphics.DrawLine(greenPen, ПочатковаТочка, КінцеваТочка);

}

}

#endregion

#region Малювання кола навколо картинки

private void малюванняКіл(System.Windows.Forms.PictureBox sender, Color колірЗаповнювача)

{

System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(колірЗаповнювача);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.FillEllipse(

brush1,

new System.Drawing.Rectangle(

((System.Windows.Forms.PictureBox)sender).Location.X - 20,

((System.Windows.Forms.PictureBox)sender).Location.Y - 20,

#region Розміри еліпса - ширина і довжина

System.Convert.ToInt32(System.Math.Sqrt

(

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Height), 2)

+

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Width), 2)

)),

Convert.ToInt32(System.Math.Sqrt(

System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Height), 2)

+ System.Math.Pow(System.Convert.ToInt32(((System.Windows.Forms.PictureBox)sender).Size.Width), 2)

)

)

#endregion

));

brush1.Dispose(); formGraphics.Dispose();

}

#endregion

#region Позначення першого і останнього малюнка як кінцеві

/// <summary>

/// Позначення початку і кінця

/// </summary>

private void позначенняПершогоТаОстаннього()

{

if (КучаКартинок[0] != null)

{

this.малюванняКіл(КучаКартинок[0], Color.Red);

if (КількістьКаністр - 1 >= 0)

this.малюванняКіл(КучаКартинок[КількістьКаністр - 1], Color.Green);

}

}

#endregion

#region Виконано! Допоміжні ф-ції

#region Запуск головної форми

private void MainForm_Load(object sender, EventArgs e)

{

this.pictureBox1.Hide();

}

#endregion

#region Загальний вихід вихідToolStripMenuItem1

private void вихідToolStripMenuItem1_Click(object sender, EventArgs e)

{

System.Windows.Forms.Application.Exit();

}

#endregion

#region Перезапуск

private void перезапускToolStripMenuItem_Click(object sender, EventArgs e)

{

System.Windows.Forms.Application.Restart();

}

#endregion

#region Закриття програми (не меню)

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

{

System.Windows.Forms.Application.Exit();

}

#endregion

private void розміститиЄмкостіToolStripMenuItem_Click(object sender, EventArgs e)

{

this.СтворенняКартинки();

}

#region Згортання програми з меню

private void згорнутиToolStripMenuItem_Click(object sender, EventArgs e)

{

WindowState = FormWindowState.Minimized;

}

#endregion

#endregion

#region Перевірка корректності вводу інформації в таблицю

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

{

System.Windows.Forms.TextBox коректністьВвооду = (System.Windows.Forms.TextBox)e.Control;

коректністьВвооду.KeyPress += new KeyPressEventHandler(коректністьВвооду_KeyPress);

}

void коректністьВвооду_KeyPress(object sender, KeyPressEventArgs e)

{

if (!(System.Char.IsDigit(e.KeyChar)) && (e.KeyChar != '.'))

{

if (e.KeyChar != (char)Keys.Back)

e.Handled = true;

}

}

#endregion

#region Відкриття\закриття таблиці

/// <summary>

/// Відкриття\закриття таблиці

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void КнопкаПереходу_Click_1(object sender, EventArgs e)

{

this.button3.Enabled = true;

if (this.КнопкаПереходу.Text == "Перейти в режим введення інформації")

{

this.КнопкаПереходу.Text = "Сховати таблицю";

this.dataGridView1.Show();

this.dataGridView1.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 15, System.Drawing.FontStyle.Regular);

this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;

this.dataGridView1.RowCount = 1 + this.КількістьКаністр;

this.dataGridView1.ColumnCount = 1 + this.КількістьКаністр;

this.dataGridView1.Columns[0].ReadOnly = true;

this.dataGridView1.Rows[0].ReadOnly = true;

this.dataGridView1.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.BottomCenter;

this.dataGridView1.Rows[0].Cells[0].Value = "*";

for (int k = 1; k < this.КількістьКаністр + 1; k++)

for (int j = 1; j < this.КількістьКаністр + 1; j++)

this.dataGridView1.Rows[k].Cells[j].ReadOnly = false;

for (int i = 1; i < this.КількістьКаністр + 1; i++)

{

this.dataGridView1.Rows[i].Cells[0].Value = "в \"" + i.ToString() + "\"";

this.dataGridView1.Rows[0].Cells[i].Value = "з \"" + i.ToString() + "\"";

this.dataGridView1.Rows[i].Cells[i].Value = "0";

this.dataGridView1.Rows[i].Cells[i].ReadOnly = true;

this.dataGridView1.Rows[i].Cells[this.КількістьКаністр].Value = "0";

this.dataGridView1.Rows[i].Cells[this.КількістьКаністр].ReadOnly = true;

this.dataGridView1.Rows[1].Cells[i].Value = "0";

this.dataGridView1.Rows[1].Cells[i].ReadOnly = true;

}

}

else

{

this.КнопкаПереходу.Text = "Перейти в режим введення інформації";

this.dataGridView1.Hide();

this.позначенняПершогоТаОстаннього();

}

}

#endregion

#region Власне сам алгоритм міститься тут. Працює на основі зібраної інформації з таблиці

private void button3_Click_1(object sender, EventArgs e)

{

System.Drawing.Graphics formGraphics = this.CreateGraphics();

System.Drawing.Pen greenPen = new System.Drawing.Pen(System.Drawing.Color.Green, 10);

/* greenPen.Width = 15; */

/*int[] кількістьВершин = new int[this.КількістьКаністр];*/

int[,] a = new int[this.КількістьКаністр, this.КількістьКаністр];

for (int yi = 0; yi < this.КількістьКаністр; yi++)

for (int xi = 0; xi < this.КількістьКаністр; xi++)

{

if (this.dataGridView1.Rows[xi + 1].Cells[yi + 1].Value == DBNull.Value){

System.Windows.Forms.MessageBox.Show("Деякі значення не введені!", "Achtung! Caution!");

goto end;

}

else

a[xi, yi] = Convert.ToInt32(this.dataGridView1.Rows[xi + 1].Cells[yi + 1].Value); }

////////////////////////////////////////////////////////////////

int

R = Convert.ToInt32(a[this.КількістьКаністр - 1, 0]),/*Орієнтоване значення, час переливання з вихідної у кінцеву посудину*/

min = a[1, 0],/*Мінімальний час переливання з кожної посудини, використовується окремо, на початку має значення першого ненульового елемента*/

temp_i = 0,/*Змінна, що містить у собі номер вигідної для переливання посудини, залежить від min*/

y = 0,/*Змінна, що "переміщається" по посудинам в результаті виконання алгоритму, містить у собі порядковий номер посудини*/

S = 0;/*Сума з часу переливання кожного елемента у "вигідній" послідовності, для знаходження коротшого шляху повинне бути менше R*/

;

////////////////////////////////////////////////////////////////

for (; ; )

{

if (S + a[this.КількістьКаністр - 1, y] < R)

{

System.Windows.Forms.MessageBox.Show(КучаКартинок[y].Name);

System.Drawing.Point Point_pre_last = new System.Drawing.Point(this.КучаКартинок[y].Location.X + 40, this.КучаКартинок[y].Location.Y + 40);

System.Drawing.Point Point_last = new System.Drawing.Point(this.КучаКартинок[this.КількістьКаністр - 1].Location.X + 40, this.КучаКартинок[this.КількістьКаністр - 1].Location.Y + 40);

formGraphics.DrawLine(greenPen, Point_pre_last, Point_last);

S += a[this.КількістьКаністр - 1, y];

break;

}

else

{

for (int i = 0; i < this.КількістьКаністр; i++)

{

if (min > a[i, y] && a[i, y] != 0)

{

min = a[i, y];

a[i, y] = 0;

temp_i = i;

}

}

if (S + min < R)

{

System.Drawing.Point point1 = new System.Drawing.Point(this.КучаКартинок[temp_i].Location.X + 40, this.КучаКартинок[temp_i].Location.Y + 40);

System.Drawing.Point point2 = new System.Drawing.Point(this.КучаКартинок[y].Location.X + 40, this.КучаКартинок[y].Location.Y + 40);

formGraphics.DrawLine(greenPen, point1, point2);

if (temp_i!=0)

this.малюванняКіл(this.КучаКартинок[temp_i], System.Drawing.Color.Blue);

S += min;

y = temp_i;

min = a[this.КількістьКаністр - 1, 0];

}

else

{

this.Refresh();

this.позначенняПершогоТаОстаннього();

System.Drawing.Point point1 = new System.Drawing.Point(this.КучаКартинок[0].Location.X + 40, this.КучаКартинок[0].Location.Y + 40);

System.Drawing.Point point2 = new System.Drawing.Point(this.КучаКартинок[this.КількістьКаністр - 1].Location.X + 40, this.КучаКартинок[this.КількістьКаністр - 1].Location.Y + 40);

formGraphics.DrawLine(greenPen, point1, point2);

S = 0;

break;

}

}

}

/*System.Windows.Forms.MessageBox.Show(S.ToString(), "Інформація", MessageBoxButtons.OK,MessageBoxIcon.Information);*/

end: /* <= точка для обходу коду*/ ;

}

#endregion

}

}

/*————————————————Form2.cs——————————————*/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]