Разработка специализированного программного модуля для решения указанной задачи

Министерство образования Республики Беларусь

Министерство образования и науки Российской Федерации



Государственное учреждение высшего профессионального образования

«БЕЛОРУССКО–РОССИЙСКИЙ УНИВЕРСИТЕТ»





Кафедра «Автоматизированные системы управления»









Курсовая работа

по дисциплине «Технологии программирования»

Разработка специализированного программного модуля для решения указанной задачи

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 Разработка структурной схемы программного продукта





Главное меню

Добавление элемента

Вывести всю картотеку

Выход

Извещение на оплату

Рисунок 1 - Структурная схема программного модуля





Главное меню - функция меню, выбор пункта меню в зависимости от того, какое действие необходимо произвести;

Добавление элемента – добавление номера и время разговора в «бинарное дерево»

Вывести всю картотеку – производит вывод картотеки по номерам телефонов в порядке возрастания.

Извещение на оплату – по указанному номеру телефона создаёт файл под именем данного телефона и записывает информацию по оплате телефонного звонка.




4 Проектирование интерфейса пользователя



4.1 Построение графа диалога



Для работы с программой было реализовано меню, состоящее из 4 методов класса MenuDialog:





MainDialog

NewPhoneDialog

SearchDialog

Exit

PricePhoneDialog

Рисунок 2 – Граф диалога





MenuDialog





MainDialog – главное меню, через которое осуществляется выбор необходимого действия. Имеет 3 варианта действий:

Переход в меню добавления нового номера.

Переход в меню для вывода всей картотеки.

Выход из программы.

NewPhoneDialog – меню добавления нового абонента. При успешном добавлении программа возвращает пользователя в главное меню. В случае ошибки ввода данных предоставляется возможность вернуться в главное меню, либо повторить ввод данных.

SearchDialog – меню вывода картотеки. Производит вывод картотеки и предоставляет пользователю 2 варианта последующих действий:

Переход в меню для создания извещения по оплате телефонного разговора.

Выход в главное меню. 

PricePhoneDialog – меню создания извещения по оплате телефонного разговора. Создаёт файл <номер телефона>.txt , в котором содержится:

Имя абонента;

Номер телефона;

Время разговора;

Цена за минуту разговора;

Итого к оплате.

После создания файла с извещением, пользователь остаётся в меню SearchDialog.



4.2 Разработка форм ввода-вывода информации



В программе осуществляется 2 способа ввода данных:

Ввод при добавлении нового абонента. Из главного меню вызывается метод NewPhoneDialog класса MenuDialog. Для добавления абонента необходимо заполнить следующие поля:

Имя абонента (до 22 знаков);

Номер телефона (формат ввода – цифры, 7 знаков);

Время разговора (формат ввода – мин:сек).





Рисунок 3 – Добавление нового абонента


Контроль ошибок:

В случае неверного ввода номера телефона, либо времени разговора, на экран выдаётся сообщение об ошибке ввода.





Рисунок 4 – Сообщение об ошибке ввода



Ввод данных при создании извещении на оплату телефонного разговора. Из меню 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



В результате произведённых действий было проверена работоспособность добавления новой записи, вывод картотеки и создание извещения на оплату. Так как при корректном вводе данных на экран не было выведено сообщений об ошибках, испытание можно считать успешным.


Заключение



Курсовая работа выполнена с целью разработки программы для создания картотеки абонентов, содержащей сведенья о телефонах и их владельцах. 

При реализации этой задачи были получены навыки применения технологии объектно-ориентированного программирования. Разработанный программный продукт может быть применен в учебных целях.







Список использованных источников



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("| " + sPhone + "      | " + sTime);

         InorderHelper(node.RightNode);

      }

      

      //поиск номера телефона для создания извещения на оплату

      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);

        }

    }

}









16



2010