
- •Анотація
- •1 Техніко-економічне обґрунтування технічного завдання на курсову роботу
- •1.1 Вимоги користувача
- •1.2 Аналіз предметної області
- •1.3 Вибір методу вирішення основної задачі
- •2 Розробка алгоритмів розв’язку задачі
- •2.1 Алгоритм побудови робочого поля
- •2.2 Покроковий алгоритм
- •2.3 Розробка меню
- •3 Програмна реалізація
- •3.1 Вибір мови програмування
- •3.2 Програмування інтерфейсу
- •3.3 Розробка програми
- •4 Тестування, перевірка правильності роботи
- •4.1 Готування тестування
- •4.2 Аналіз результатів роботи
- •Висновки
- •Перелік посилань
- •Література
- •Додаток а – Лістінг
4.2 Аналіз результатів роботи
Після завершення розробки програми і її збору на каналі Release розроблено декілька тестів. Всі тести пройшли перевірку і програма обрахувала вірний результат. Можна стверджувати, що написаний алгоритм працює безпомилково і забезпечує надійність і правильність роботи програми під час усього циклу її використання.
Розробка програми збільшила навички роботи в середовищі Visual Studio 2010 мовою програмування C# версії 4.0.
Висновки
Підводячи підсумки можна зазначити, що була написана програма для моделювання роботи алгоритму Дейкстри на тему «Розробка програмної системи для обчислення найкоротших маршрутів з використанням алгоритму Дейкстри або Флойда та мови програмування С#». Програма написана мовою C# з використанням об’єктно-орієнтованих принципів програмування. Програма має зручний інтерфейс і приємну кольорову гамму, що на практиці гарно виглядає і не викликає в користувача небажаних емоцій. Створивши тести перевірено, що алгоритм в програмі працює чітко і вірно. Програма обробляє усі можливі виключення і забезпечує надійну роботу під час використання на практиці.
Перелік посилань
uk.wikipedia.org/wiki/Алгоритм_Дейкстри
uk.wikipedia.org/wiki/Алгоритм_Флойда_—_Воршелла
ru.wikipedia.org/wiki/Меню_(информатика)
ru.wikipedia.org/wiki/C_Sharp
ru.wikipedia.org/wiki/Графічний_інтерфейс_користувача
ru.wikipedia.org/wiki/ Тестування_програмного_забезпечення
Література
Круподьорова Л.М., Пєтух А.М. Технологія програмування мовою Сі, ВНТУ, 1-2частини, 2006 рік .
Круподьорова Л.М. Методичні вказівки для курсового проектування, ВНТУ, 2004.
Власюк В. Х., Круподьорова Л. М. “Програмування мовою Сі, Вінниця, ВДТУ, 2001.
М. Эллис, Б.Страструп. Справочное руководство по языку С++ с комментариями: Пер. с англ. – Москва: Мир, 1992.
В.В. Подбельский, С.С. Фомин. Программирование на ЯЗЫКЕ Си. - Москва: «Финансы и статистика», 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——————————————*/