Разработка специализированного программного модуля для решения указанной задачи
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ Кафедра «Автоматизированные системы управления». Выбор технологии, языка и среды программирования В соответствие с заданием, языком программирования был выбран C#, а средой программирования — Microsoft… Читать ещё >
Разработка специализированного программного модуля для решения указанной задачи (реферат, курсовая, диплом, контрольная)
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования
«БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ»
Кафедра «Автоматизированные системы управления»
Курсовая работа по дисциплине «Технологии программирования»
Разработка специализированного программного модуля для решения указанной задачи
051.23 01 02.81 425.03.81−01
- Введение
- 1 Выбор технологии, языка и среды программирования
- 2 Анализ и уточнение требований к программному продукту
- 2.1 Анализ процесса обработки информации и выбор структур данных для ее хранения
- 2.2 Выбор методов и разработка основных алгоритмов решения задачи
- 3 Разработка структурной схемы программного продукта
- 4 Проектирование интерфейса пользователя
- 4.1 Построение графа диалога
- 4.2 Разработка форм ввода-вывода информации
- 5 Выбор стратегии тестирования и разработка тестов.
- Заключение
- Список использованных источников
- Приложение А. Техническое задание
- Приложение Б. Руководство пользователя
- Приложение В. Код программы
Целью данной курсовой работы является разработка программного модуля, позволяющего создать с помощью шаблона класса «бинарное дерево» картотеку абонентов, содержащую сведенья о телефонах и их владельцах.
В разделе «Выбор технологии, языка и среды программирования» выбор средств реализации.
В разделе «Анализ и уточнение требований к программному продукту» проводится выбор структуры данных для хранения информации, метода и разработки основных алгоритмов решения задачи.
В разделе «Разработка структурной схемы программного продукта» приведена структурная схема программы.
В разделе «Проектирование интерфейса пользователя» производится построение графа диалога, а также разработка форм ввода-вывода информации.
В разделе «Выбор стратегии тестирования и разработка тестов» проводится тестирование нашей программы при различных исходных значениях.
Приложения содержат код программы и основные программные документы — руководство программиста и техническое задание, разработанные в соответствии с требованиями стандартов.
1 Выбор технологии, языка и среды программирования В соответствие с заданием, языком программирования был выбран C#, а средой программирования — Microsoft Visual Studio 2010. Для реализации программы использовалось объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП) — парадигма программирования, основанная на представлении предметной области (и/или проблемной области) в виде системы взаимосвязанных абстрактных объектов и их реализаций.
Основной проблемой процедурного программирования является то, что данные и функции их обработки не были связаны. Это вносило некоторую сложность в разработку программы. С появлением концепции ООП появилась новая структура данных — Класс. Это по сути дела тип данных, внешне похожий на структуру (в языке Си) или запись (в Pascal-е), в котором кроме данных (свойства) также содержались функции их обработки (методы). При этом появляются такие свойства как наследование, полиморфизм и инкапсуляция.
2 Анализ и уточнение требований к программному продукту
2.1 Анализ процесса обработки информации и выбор структур данных для ее хранения
К системе необходимо предъявить ряд требований, выполнение которых обеспечит достижение оптимальных значений всех параметров целевой функции.
Для хранения информации была выбрана структура данных типа бинарное дерево. Бинарное (двоичное) дерево — это упорядоченное дерево, каждая вершина которого имеет не более двух поддеревьев, причем для каждого узла выполняется правило: в левом поддереве содержатся, только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся, только ключи, имеющие значения, большие, чем значение данного узла. Бинарное дерево является рекурсивной структурой, поскольку каждое его поддерево само является бинарным деревом и, следовательно, каждый его узел в свою очередь является корнем дерева.
2.2 Выбор методов и разработка основных алгоритмов решения задачи
В данной курсовой работе необходимо создать шаблона класса «бинарное дерево» и написать программу, использующую этот шаблон класса для создания картотеки абонентов, содержащую сведенья о телефонах и их владельцах. Программа должна:
· обеспечивать начальное формирование картотеки в виде двоичного дерева
· производить вывод всей картотеки
· вводить номер телефона и время разговора
· выводить извещение на оплату телефонного разговора Также, программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
3 Разработка структурной схемы программного продукта
· Главное меню — функция меню, выбор пункта меню в зависимости от того, какое действие необходимо произвести;
· Добавление элемента — добавление номера и время разговора в «бинарное дерево»
· Вывести всю картотеку — производит вывод картотеки по номерам телефонов в порядке возрастания.
· Извещение на оплату — по указанному номеру телефона создаёт файл под именем данного телефона и записывает информацию по оплате телефонного звонка.
4 Проектирование интерфейса пользователя
4.1 Построение графа диалога
Для работы с программой было реализовано меню, состоящее из 4 методов класса MenuDialog:
MainDialog — главное меню, через которое осуществляется выбор необходимого действия. Имеет 3 варианта действий:
1) Переход в меню добавления нового номера.
2) Переход в меню для вывода всей картотеки.
3) Выход из программы.
NewPhoneDialog — меню добавления нового абонента. При успешном добавлении программа возвращает пользователя в главное меню. В случае ошибки ввода данных предоставляется возможность вернуться в главное меню, либо повторить ввод данных.
SearchDialog — меню вывода картотеки. Производит вывод картотеки и предоставляет пользователю 2 варианта последующих действий:
1) Переход в меню для создания извещения по оплате телефонного разговора.
2) Выход в главное меню.
PricePhoneDialog — меню создания извещения по оплате телефонного разговора. Создаёт файл <�номер телефона>.txt, в котором содержится:
· Имя абонента;
· Номер телефона;
· Время разговора;
· Цена за минуту разговора;
· Итого к оплате.
После создания файла с извещением, пользователь остаётся в меню SearchDialog.
4.2 Разработка форм ввода-вывода информации
В программе осуществляется 2 способа ввода данных:
1) Ввод при добавлении нового абонента. Из главного меню вызывается метод NewPhoneDialog класса MenuDialog. Для добавления абонента необходимо заполнить следующие поля:
· Имя абонента (до 22 знаков);
· Номер телефона (формат ввода — цифры, 7 знаков);
· Время разговора (формат ввода — мин: сек).
·
Рисунок 3 — Добавление нового абонента
Контроль ошибок:
В случае неверного ввода номера телефона, либо времени разговора, на экран выдаётся сообщение об ошибке ввода.
Рисунок 4 — Сообщение об ошибке ввода
2) Ввод данных при создании извещении на оплату телефонного разговора. Из меню SearchDialog вызывается метод PricePhoneDialog. Для создания извещения, необходимо:
· Указать номер телефона (формат ввода — цифры, 7 знаков);
· Ввести цену за минуту разговора (формат ввода — цифры).
Рисунок 5 — Создание извещения на оплату
Контроль ошибок:
В случае неверного ввода номера телефона, либо цены за минуту разговора, на экран выдаётся сообщение об ошибке ввода.
Рисунок 6 — Сообщение об ошибке ввода при создании извещения на оплату
5 Выбор стратегии тестирования и разработка тестов Контрольный пример — это специальные данные, являющиеся исходными для программного алгоритма и отвечающие требованиям по объему и составу вводимой информации, которая должна соответствовать поставленной задаче. Для того чтобы подтвердить работоспособность системы необходимо провести тестирование, и показать реализацию основных функций.
В качестве результатов тестирования, чтобы показать работоспособность системы запустим программу.
Добавим нового абонента:
· Имя абонента: Льдов Анатолий
· Номер телефона: 2 425 017
· Время разговора: 21:07
·
Рисунок 7 — Успешное создание новой записи Как видно из рисунка 7 создание новой записи прошло успешно.
Добавим ещё несколько записей и выведем картотеку путём нажатия «2» в главном меню. Картотека выведена в алфавитном порядке. Все данные соответствуют исходным данным, введённым при добавлении записей. Попытаемся создать извещение на оплату. Выберем «1» и введём номер 242−50−17. Цена минуты разговора равняется 2 рублям. Вводим «2». После окончания ввода данных, на экране отобразиться сообщение (рисунок 9) об успешном создании извещения под именем 2 425 017. txt (рисунок 10).
Рисунок 9 — Вывод картотеки и успешное создание извещения на оплату Рисунок 10 — Извещение на оплату. Файл 2 425 017. txt
В результате произведённых действий было проверена работоспособность добавления новой записи, вывод картотеки и создание извещения на оплату. Так как при корректном вводе данных на экран не было выведено сообщений об ошибках, испытание можно считать успешным.
Заключение
Курсовая работа выполнена с целью разработки программы для создания картотеки абонентов, содержащей сведенья о телефонах и их владельцах.
При реализации этой задачи были получены навыки применения технологии объектно-ориентированного программирования. Разработанный программный продукт может быть применен в учебных целях.
Список использованных источников
1. C#: Пер. с англ. / Дейтел Х., Дейтел П., Листфилд Дж., Нието Т., Йегер Ш., Златкина М. — СПб.: БХВ-Петербург, 2006. — 1056 с.
2. Visual C# 2008: базовый курс.: Пер. с англ. — М.: ООО «И.Д. Вильямс», 2009. — 1216 с.
3. Библиотека MSDN — msdn.microsoft.com
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ Кафедра «Автоматизированные системы управления»
Техническое задание
Тема проекта: Разработать специализированный программный модуль для решения указанной задачи.
Исходные данные к проекту:
Создать шаблон класса «бинарное дерево». Использовать данный шаблон для создания картотеки абонентов, содержащей сведенья о телефонах и их владельцах.
Составить программу, которая:
Ш обеспечит начальное формирование картотеки в виде двоичного дерева;
Ш производит вывод всей картотеки;
Ш вводит номер телефона и время разговора;
Ш выводит извещение на оплату телефонного разговора.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ Кафедра «Автоматизированные системы управления»
Руководство пользователя
Данный программный модуль предназначен для работы с картотекой абонентов.
Работа программы начинается с её запуска: запускается файл tp_kurs.exe или же через среду программирования Microsoft Visual Studio 2010 открывается файл tp_kurs.sln и после компилирования проекта запускается программа.
Выход из программы осуществляется из главного меню нажатием клавиши «0» либо «Esc».
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ Кафедра «Автоматизированные системы управления»
Код программы
Программный код файла PhoneBook. cs
using System;
using BinaryTreeLibrary;
using MenuDialog;
namespace PhoneBook
{
public class TreeTest
{
static void Main ()
{
Tree tree = new Tree ();
Menu.MainDialog (tree);
}
}
}
Программный код файла BinaryTreeLibrary. cs
using System;
namespace BinaryTreeLibrary
{
class TreeNode
{
private TreeNode leftNode; //левый узел
private uint phone; //номер телефона
private uint time; //время разговора
private string name; //имя абонента
private TreeNode rightNode; //правый узел
//создание нового узла
public TreeNode (uint nodePhone, uint nodeTime, string nodeName)
{
phone = nodePhone;
time = nodeTime;
name = nodeName;
leftNode = rightNode = null;
}
public TreeNode LeftNode
{
get
{
return leftNode;
}
set
{
leftNode = value;
}
}
public uint Phone
{
get
{
return phone;
}
set
{
phone = value;
}
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public uint Time
{
get
{
return time;
}
set
{
time = value;
}
}
public TreeNode RightNode
{
get
{
return rightNode;
}
set
{
rightNode = value;
}
}
//добавление новой записи
public void Insert (uint insertPhone, uint insertTime, string insertName)
{
if (string.Compare (insertName, name) < 0)
{
if (leftNode == null)
leftNode = new TreeNode (insertPhone, insertTime, insertName);
else
leftNode.Insert (insertPhone, insertTime, insertName);
}
else if (string.Compare (insertName, name) > 0)
{
if (rightNode == null)
rightNode = new TreeNode (insertPhone, insertTime, insertName);
else
rightNode.Insert (insertPhone, insertTime, insertName);
}
}
}
public class Tree
{
private TreeNode root;
public static bool iSearch = false;
public static uint itemsNode = 0;
public static string SearchSTime = «» ;
public static string SearchName = «» ;
public static uint SearchTime = 0;
public Tree ()
{
root = null;
}
//добавление нового узла
public void InsertNode (uint insertPhone, uint insertTime, string insertName)
{
lock (this)
{
if (root == null)
root = new TreeNode (insertPhone, insertTime, insertName);
else
root.Insert (insertPhone, insertTime, insertName);
}
}
//обход дерева и вывод картотеки
public void InorderTraversal ()
{
lock (this)
{
InorderHelper (root);
}
}
private void InorderHelper (TreeNode node)
if (node == null) return;
InorderHelper (node.LeftNode);
string sPhone = «» ;
string sTime = «» ;
string sName = «» ;
sName = node.Name;
sPhone = Convert. ToString (node.Phone);
if (Convert.ToUInt32(node.Time / 60) < 10)
sTime = «0» + Convert. ToString (Convert.ToUInt32(node.Time / 60));
else
sTime = Convert. ToString (Convert.ToUInt32(node.Time / 60));
if (node.Time % 60 < 10)
sTime = sTime + «:0» + Convert. ToString (node.Time % 60);
else
sTime = sTime + «:» + Convert. ToString (node.Time % 60);
sPhone = sPhone. Insert (3, «-»);
sPhone = sPhone. Insert (6, «-»);
Console.Write («» + sName);
for (int i = 0; i < 22 — sName. Length; i++) Console. Write (««);
Console.WriteLine («
//поиск номера телефона для создания извещения на оплату
public void TreeSearch (uint key)
{
lock (this)
{
TreeHelperSearch (root, key);
}
}
private void TreeHelperSearch (TreeNode node, uint key)
{
if (node == null) return;
TreeHelperSearch (node.LeftNode, key);
if (node.Phone == key)
{
iSearch = true;
SearchSTime = «» ;
SearchName = node.Name;
SearchTime = node. Time;
if (Convert.ToUInt32(node.Time / 60) < 10)
SearchSTime = «0» + Convert. ToString (Convert.ToUInt32(node.Time / 60));
else
SearchSTime = Convert. ToString (Convert.ToUInt32(node.Time / 60));
if (node.Time % 60 < 10)
SearchSTime = SearchSTime + «:0» + Convert. ToString (node.Time % 60);
else
SearchSTime = SearchSTime + «:» + Convert. ToString (node.Time % 60);
}
TreeHelperSearch (node.RightNode, key);
}
}
}
Программный код файла MenuDialog. cs
using System;
using BinaryTreeLibrary;
using PhoneBook;
using System. IO;
namespace MenuDialog
{
public class Menu
{
//Главное меню
public static void MainDialog (Tree tree)
{
ConsoleKeyInfo key;
do
{
Console.Clear ();
Console.WriteLine («n == ГЛАВНОЕ МЕНЮ == n»);
Console.WriteLine («1. Добавление нового номера»);
Console.WriteLine («2. Вывести всю картотеку»);
Console.WriteLine («0. Выход из программы (клавиша ESC)»);
key = Console. ReadKey ();
string sKey = Convert. ToString (key.KeyChar);
switch (sKey)
{
case «1»: //переход в меню добавления новой записи
NewPhoneDialog (tree);
break;
case «2»: //переход в меню вывода картотеки
SearchDialog (tree);
break;
case «0»: //выход из программы
Environment.Exit (0);
break;
}
} while (key.Key ≠ ConsoleKey. Escape);
}
//Меню добавления элемента
public static void NewPhoneDialog (Tree tree)
{
do
{
back:
string sPhone = «» ;
string sSTime = «» ;
string sMTime = «» ;
string Name = «» ;
ConsoleKeyInfo temp;
uint Phone = 0;
uint Time = 0;
Console.Clear ();
Console.WriteLine («n == ДОБАВЛЕНИЕ НОМЕРА ==n»);
Console.Write («Имя абонента: «);
Name = Console. ReadLine ();
if (Name.Length > 22) //контроль ввода имени абонента
{
Console.WriteLine («Ошибка: „Имя абонента“ не соответствует формату! Не более 22 символов.»);
ConsoleKeyInfo key;
Console.WriteLine («n Нажмите любую клавишу для повторного вводаn либо ESC для выхода в главное меню»);
key = Console. ReadKey ();
if (key.Key == ConsoleKey. Escape) break;
else goto back;
}
Console.Write («Номер телефона (ххх:хх:хх): «);
for (int i = 0; i < 7; i++)
{
temp = Console. ReadKey ();
sPhone = sPhone + temp. KeyChar;
if (i == 2) Console. Write («-»);
if (i == 4) Console. Write («-»);
}
Console.Write («n Время разговора (мин:сек): «);
for (int i = 0; i < 4; i++)
{
temp = Console. ReadKey ();
if (i < 2) sMTime = sMTime + temp. KeyChar;
if (i == 1) Console. Write («:»);
if (i > 1) sSTime = sSTime + temp. KeyChar;
}
Console.WriteLine («n»);
bool index = true; //показатель успешного ввода данных
//контроль ввода номера телефона
try
{
Phone = uint. Parse (sPhone);
}
catch (Exception)
{
Console.WriteLine («Ошибка: „Номер телефона“ не соответствует формату!»);
index = false;
}
//контроль ввода времени разговора
try
{
Time = (uint.Parse (sMTime) + Convert. ToUInt32(uint.Parse (sSTime)/60)) * 60 + (uint.Parse (sSTime)%60);
}
catch (Exception)
{
Console.WriteLine («Ошибка: „Время разговора“ не соответствует формату!»);
index = false;
}
if (index == true)
{
tree.InsertNode (Phone, Time, Name);
Tree.itemsNode++;
Console.WriteLine («Запись успешно создана. n Нажмите любую клавишу для продолжения.»);
Console.ReadKey ();
break;
}
else
{
ConsoleKeyInfo key;
Console.WriteLine («n Запись не создана из-за ошибокn Нажмите любую клавишу для повторного вводаn либо ESC для выхода в главное меню»);
key = Console. ReadKey ();
if (key.Key == ConsoleKey. Escape) break;
}
} while (true);
}
//Меню поиска элемента
public static void SearchDialog (Tree tree)
{
Console.Clear ();
Console.WriteLine («n == КАРТОТЕКА == n»);
ConsoleKeyInfo key;
Console.WriteLine («Имя абонента | Номер телефона | Время разговора»);
Console.WriteLine («———————————|————————|————————»);
tree.InorderTraversal ();
Console.WriteLine («n 1. Извещение на оплату телефонного разговора»);
Console.WriteLine («0. Выход в главное меню (клавиша ESC)»);
do
{
Console.Write («n Ваш выбор: «);
key = Console. ReadKey ();
string sKey = Convert. ToString (key.KeyChar);
switch (sKey)
{
case «1»: //переход в меню создания извещения на оплату
if (Tree.itemsNode ≠ 0)
{
Console.WriteLine ();
PricePhoneDialog (tree);
Console.WriteLine («n 1. Извещение на оплату телефонного разговора»);
Console.WriteLine («0. Выход в главное меню (клавиша ESC)»);
}
else
Console.WriteLine («n Картотека пуста!»);
break;
case «0»: //выход в главное меню
return;
break;
}
} while (key.Key ≠ ConsoleKey. Escape);
}
//Меню для определения стоимости разговора
public static void PricePhoneDialog (Tree tree)
{
do
{
string sPhone = «» ;
ConsoleKeyInfo temp;
uint Phone = 0;
Console.Write («n Номер телефона (ххх:хх:хх): «);
for (int i = 0; i < 7; i++)
{
temp = Console. ReadKey ();
sPhone = sPhone + temp. KeyChar;
if (i == 2) Console. Write («-»);
if (i == 4) Console. Write («-»);
}
//контроль ввода номера телефона
try
{
Phone = uint. Parse (sPhone);
string FILE_NAME = sPhone + «.txt» ;
Tree.iSearch = false;
tree.TreeSearch (Phone);
if (Tree.iSearch == false) Console. WriteLine («n Такой номер не найден»);
else
{
bool index = false;
string sPrace = «» ;
uint Prace = 0;
do
{
Console.Write («n Введите цену за минуту разговора: «);
sPrace = Console. ReadLine ();
//контроль ввода цены разговора
try
{
Prace = uint. Parse (sPrace);
index = true;
}
catch (Exception)
{
Console.WriteLine («n Ошибка: „Цена“ не соответствует формату!»);
continue;
}
} while (index ≠ true);
//создание файла с извещением
if (File.Exists (FILE_NAME)) File. Delete (FILE_NAME);
using (StreamWriter output = File. CreateText (FILE_NAME))
{
sPhone = sPhone. Insert (3, «-»);
sPhone = sPhone. Insert (6, «-»);
output.WriteLine («Абонент: {0}», Tree. SearchName);
output.WriteLine («Номер телефона: {0}», sPhone);
output.WriteLine («Время разговора: {0}», Tree. SearchSTime);
output.WriteLine («Цена за минуту разговора: {0}», Prace);
output.WriteLine («===============»);
output.WriteLine («Итого к оплате: {0}», Prace * (Convert.ToUInt32(Tree.SearchTime / 60) + 1));
Console.WriteLine («n Файл {0}, с извещением на оплату, был успешно создан», FILE_NAME);
}
}
break;
}
catch (Exception)
{
Console.WriteLine («n Ошибка: „Номер телефона“ не соответствует формату!»);
}
} while (true);
}
}
}