Разработка специализированного программного модуля для решения указанной задачи
Разработка специализированного программного модуля для решения указанной задачи
Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации Государственное учреждение высшего профессионального образования «БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ» Кафедра «Автоматизированные системы управления» Курсовая работа по дисциплине «Технологии программирования» Разработка специализированного программного модуля для решения указанной задачи 051.23 01 02.081425.03.81-01 2010 Содержание - Введение
- 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 Выбор стратегии тестирования и разработка тестов Контрольный пример - это специальные данные, являющиеся исходными для программного алгоритма и отвечающие требованиям по объему и составу вводимой информации, которая должна соответствовать поставленной задаче. Для того чтобы подтвердить работоспособность системы необходимо провести тестирование, и показать реализацию основных функций. В качестве результатов тестирования, чтобы показать работоспособность системы запустим программу. Добавим нового абонента: · Имя абонента: Льдов Анатолий · Номер телефона: 2425017 · Время разговора: 21:07 · Рисунок 7 - Успешное создание новой записи Как видно из рисунка 7 создание новой записи прошло успешно. Добавим ещё несколько записей и выведем картотеку путём нажатия «2» в главном меню. Картотека выведена в алфавитном порядке. Все данные соответствуют исходным данным, введённым при добавлении записей. Попытаемся создать извещение на оплату. Выберем «1» и введём номер 242-50-17. Цена минуты разговора равняется 2 рублям. Вводим «2». После окончания ввода данных, на экране отобразиться сообщение (рисунок 9) об успешном создании извещения под именем 2425017.txt (рисунок 10). Рисунок 9 - Вывод картотеки и успешное создание извещения на оплату Рисунок 10 - Извещение на оплату. Файл 2425017.txt В результате произведённых действий было проверена работоспособность добавления новой записи, вывод картотеки и создание извещения на оплату. Так как при корректном вводе данных на экран не было выведено сообщений об ошибках, испытание можно считать успешным. Заключение Курсовая работа выполнена с целью разработки программы для создания картотеки абонентов, содержащей сведенья о телефонах и их владельцах. При реализации этой задачи были получены навыки применения технологии объектно-ориентированного программирования. Разработанный программный продукт может быть применен в учебных целях. 16 2010 Список использованных источников 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); } } }
|