Министерство образования Республики Беларусь
Министерство образования и науки Российской Федерации
Государственное учреждение высшего профессионального образования
"Белорусско–Российский университет"
Кафедра "Автоматизированные системы управления"
Курсовая работа
по дисциплине "Технологии программирования"
Разработка специализированного программного модуля для решения указанной задачи
Могилев, 2010
Содержание
Введение
1. Выбор технологии, языка и среды программирования
2. Анализ и уточнение требований к программному продукту
2.1 Анализ процесса обработки информации и выбор структур данных для ее хранения
2.2 Выбор методов и разработка основных алгоритмов решения задачи
3. Разработка структурной схемы программного продукта
4. Проектирование интерфейса пользователя
4.1 Построение графа диалога
4.2 Разработка форм ввода-вывода информации
5. Выбор стратегии тестирования и разработка тестов
Заключение
Список литературы
Приложения
Введение
Целью данной курсовой работы является разработка программного модуля, позволяющего моделировать процесс прибытия машин в гаражную стоянку и их отъезда.
Программа должна выводить сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
В первом разделе представлен выбор технологии, языка и среды программирования.
Во втором представлен анализ и уточнение требований к программному продукту.
В третьем продемонстрирована структурная схема программного продукта.
В четвертом разделе описан интерфейс пользователя (граф диалога и формы ввода-вывода информации.)
В последнем разделе "Выбор стратегии тестирования и разработка тестов" проводится тестирование программы при различных исходных данных.
1. Выбор технологии, языка и среды программирования
В соответствие с заданием языком программирования был выбран С++. Для реализации программы использовалось объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП) — это технология, возникшая как реакция на очередную фазу кризиса программного обеспечения, когда методы структурного программирования уже не позволяли справляться с растущей сложностью промышленного программного продукта. Следствия - срыв сроков проектов, перерасход бюджета, урезанная функциональность и множество ошибок.
Первым бросающимся в глаза отличием ООП от структурного программирования является использование классов. Класс - это тип, определяемый программистом, в котором объединяются данные и функции их обработки.
Прообразом класса в C++ является структура в С. В то же время в C++ структура обрела новые свойства и теперь является частным видом класса, все элементы которого по умолчанию являются открытыми. Со структурой struct в C++ можно делать все, что можно делать с классом. Тем не менее в C++ структуры обычно используют лишь для удобства работы с небольшими наборами данных без какого-либо собственного поведения.
Конкретные переменные типа данных "класс" называются экземплярами класса, или объектами. Программы, разрабатываемые на основе концепций ООП, реализуют алгоритмы, описывающие взаимодействие между объектами.
Класс содержит константы и переменные, называемые полями, а также выполняемые над ними операции и функции. Функции класса называются методами. Предполагается, что доступ к полям класса возможен только через вызов соответствующих методов. Поля и методы являются элементами, или членами класса. Эффективным механизмом ослабления связанности между компонентами в случае объектно-ориентированной декомпозиции является так называемая инкапсуляция. Инкапсуляция - это ограничение доступа к данным и их объединение с методами, обрабатывающими эти данные. Доступ к отдельным частям класса регулируется с помощью специальных ключевых слов: public (открытая часть), private (закрытая часть) и protected (защищенная часть). Методы, расположенные в открытой части, формируют интерфейс класса и могут свободно вызываться клиентом через соответствующий объект класса. Доступ к закрытой секции класса возможен только из его собственных методов, а к защищенной - из его собственных методов, а также из методов классов-потомков. С ООП связаны еще два инструмента, грамотное использование которых повышает качество проектов: наследование классов и полиморфизм. Наследование — механизм получения нового класса из существующего. Производный класс создается путем дополнения или изменения существующего класса. Благодаря этому реализуется концепция повторного использования кода. С помощью наследования может быть создана иерархия родственных типов, которые совместно используют код и интерфейсы. Полиморфизм дает возможность создавать множественные определения для операций и функций. Какое именно определение будет использоваться, зависит от контекста программы. Вы уже знакомы с одной из разновидностей полиморфизма в языке C++ — перегрузкой функций. Программирование с классами предоставляет еще две возможности: перегрузку операций и использование так называемых виртуальных методов. Перегрузка операций позволяет применять для собственных классов те же операции, которые используются для встроенных типов C++. Виртуальные методы обеспечивают возможность выбрать на этапе выполнения нужный метод среди одноименных методов базового и производного классов.
2. Анализ и уточнение требований к программному продукту
2.1 Анализ процесса обработки информации и выбор структур данных для ее хранения
Для хранения информации была выбрана структура данных типа стек.
Стек - это частный случай однонаправленного списка, добавление элементов в который и выборка из которого выполняются с одного конца, называемого вершиной стека. Другие операции со стеком не определены. При выборке элемент исключается из стека. Говорят, что стек реализует принцип обслуживания LIFO (last in - first out, последним пришел - первым ушел).
2.2 Выбор методов и разработка основных алгоритмов решения задачи
В данной курсовой работе необходимо создать шаблон класса "стек" и написать программу, использующую этот шаблон класса для моделирования процесса прибытия и отъезда машины со стоянки. Программа формирует начальный стек. Далее с помощью меню пользователю предоставляется возможность сделать выбор – выгрузить стек на дисплей, добавить машину, удалить машину, выйти из программы. Для того чтобы выгрузить стек была создана функция pop(), а для добавления машины функция push(). Удаление машины из стека (гаражная стоянка) осуществляется путем выборки элементов стека (машин и информации о кол-ве выездов) и занесением их в вспомогательный стек temp, до тех пор, пока не будет найден удаляемый элемент (автомобиль). После чего элементы с вспомогательного стека заносятся обратно в том же порядке в начальный стек, при этом количество выездов увеличивается на 1. Таким образом, мы удаляем нужный нам автомобиль и ведем подсчет количеству раз, которое машина удалялась со стоянки. Если машина, которую мы хотим удалить, не найдена, программа выдаст соответствующее сообщение.
Так же созданная программа предусматривает обработку ошибок. При не корректном выборе в меню программа выдаст сообщение "Ошибка меню! Сделайте правильный выбор".
3. Разработка структурной схемы программного продукта
Рисунок 1 - Структурная схема программного модуля
Menu – функция меню, выбор пункта меню. Выгрузить стек – выгружает стек на дисплей. Добавить машину - добавляет машину в стек. Удалить машину - удаляет машину из стека. Выход - выход из программы.
4. Проектирование интерфейса пользователя
4.1 Построение графа диалога
Для работы с программой было реализовано меню, состоящее из 4 пунктов. При выборе пункта 1 (в программе - нажатие клавиши 0) данные выводятся на экран. При выборе пункта 2 и 3 (нажатие 1 и 2 соответственно) данные вводятся с клавиатуры. При выборе пункта 4 (нажатие 3) мы выходим из программы.
Рисунок 2 – Граф диалога
Ф – menu
Ф1 – выгрузить стек на дисплей
Ф2 – добавить машину
Ф3 – удалить машину
Ф4 – выход из программы
4.2 Разработка форм ввода-вывода информации
Входной информацией является номер автомобиля, а выходной номер автомобиля и количество раз, которое машина удалялась со стоянки.
Название | Обозначение в программе | Диапазон возможных значений |
Номер машины | mashin.num | Строка |
Количество раз, которое машина удалялась со стоянки | mashin.kol | Целое положительное число |
Вводится информация с помощью оператора cin ( cin>>mashin.num; )
Рисунок 3 – Форма ввода входных данных
Выводится на экран с помощью оператора cout
( cout<<temp.num<<"\t"<<temp.kol<<endl; )
Рисунок 4 – Форма вывода данных
5. Выбор стратегии тестирования и разработка тестов
Для того чтобы подтвердить работоспособность системы необходимо провести тестирование.
Рисунок 6 – Результат программы (Первый тест)
Рисунок 7 – Результат программы (Второй тест)
Результаты двух тестов соответствуют действительности, что подтверждает работоспособность системы.
Заключение
В результате проведенной работы была разработана программа, учитывающая все требования, приведенные к выполнению данной работы.
Создан шаблон класса "стек". Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа выводит сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение содержит число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
Список литературы
1 Саттер Герб. Стандарты программирования на C++. 101 правило и рекомендация / Андрей Александреску. – М. : Вильямс, 2005.
2 Дейтел Харви. Как программировать на С++ / Пол Дейтел – М. : Бином, 2003.
3 Шилдт Герберт. Самоучитель С++. – СПб. : БХВ-Петербург, 2003.
Приложение A
Создать шаблон класса "стек". Написать программу, моделирующую процесс прибытия и отъезда машин с использованием этого шаблона класса.
Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке.
Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа должна выводить сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
Приложение Б
Данный программный модуль предназначен для моделирования процесса прибытия машин в гаражную стоянку и их отъезда.
Работа программы начинается с ее запуска. Для этого необходимо запустить файл my_kurs(stack).exe
После выполнения всех вышеперечисленных действий появится окно выполнения программы. Далее работа продолжится с главным меню, в котором будут предложены варианты выполнения программы.
Приложение В
Первый вариант программы
Программный код файла my_kurs(stack).cpp
// my_kurs(stack).cpp: определяет точку входа для консольного приложения.
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class stack
{
public:
stack(string="",int=0); //Конструктор
string num;//Номер машины
int kol;//Кол-во раз которое машина удалялась со стоянки
stack *p;
};
stack *first(string, int);
void push(stack **top, string, int);
stack pop(stack **top);
void menu();
/////////////////////////////////////////////////////
int main()
{ setlocale(LC_ALL,"Russian");
stack mashin;
int i=0,n=0,k;
// Проверка на кол-во авто (n>1)
while (n<=0)
{
cout<<"Введите кол-во автомобилей на стоянке: ";
cin>>n;
}
cout<<"Номер 1-го автомобиля:";
cin>>mashin.num;
mashin.kol=0;
stack *top = first(mashin.num, mashin.kol); //Начальное формирование стека
for(i=1;i<n;i++)
{
cout<<"Номер "<<i+1<<"-го автомобиля:";
cin>>mashin.num;
mashin.kol=0;
push(&top,mashin.num,mashin.kol);
}
step_menu:
cout<<"-------------------------------------"<<endl;
menu();
cin>>k;
cout<<"-------------------------------------"<<endl;
switch (k)
{case 0: {while (top)
{stack temp=pop(&top);
cout<<temp.num<<"\t"<<temp.kol<<endl;
}
goto step_menu;
}
case 1:{
cout<<"Введите номер добавляемого автомобиля:";
cin>>mashin.num;
mashin.kol=0;
push(&top, mashin.num,mashin.kol); goto step_menu;
}
case 2:{
cout<<"Введите номер удаляемого автомобиля:";
string numdel;
cin>>numdel;
bool q=true;
step2:
stack temp=pop(&top);
if ((numdel.compare(temp.num)!=0)&&(top==NULL))
{cout<<"Такого автомобиля нет в гараже. Удаление невозможно."<<endl; goto step_menu;}
if(numdel.compare(temp.num)==0)
{
cout<<"Автомобиль удален со стоянки."<<endl;
cout<<"Автомобиль удалялся "<<temp.kol<<"-раз для обеспечения выезда других автомобилей."<<endl;
goto go_while;
}
else
{
/* Формирование 1-ого элемента вспомога-
тельного стека(Выполняется один раз!) */
if (q==false) {goto ex;}
else q=false;
stack *top2 = first(temp.num, (temp.kol)+1 );
goto step2;
ex:
/* Заносим элементы из гаража
в вспомогательный стек */
push(&top2,temp.num,temp.kol+1);
goto step2;
go_while:
/* Выгружаем элементы из вспо-
могательного стека в гараж */
while(top2)
{
stack temp=pop(&top2);
push(&top,temp.num,temp.kol);
}
goto step_menu;
}
}
case 3: exit(0);
default:
cout<<"<<<Ошибка меню! Сделайте правильный выбор>>>"<<endl;
goto step_menu;
}
return 0;
}
Программный код файла my_fun.cpp
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class stack
{
public:
stack(string="",int=0); //Конструктор
string num;//Номер машины
int kol;//Кол-во раз которое машина удалялась со стоянки
stack *p;
};
stack::stack(string N, int K)
{ num=N; kol=K; }
//----------------------------------------
// Начальное формирование стека
stack *first(string num, int kol)
{
stack *pv = new stack;
pv->num = num;
pv->kol = kol;
pv->p = 0;
return pv;
}
//----------------------------------------
// Занесение в стек
void push(stack **top, string num, int kol)
{
stack *pv = new stack;
pv->num = num;
pv->kol = kol;
pv->p = *top;
*top = pv;
}
//----------------------------------------
// Выборка из стека
stack pop(stack **top)
{
stack *temp = new stack;
stack *pv = *top;
temp->num = pv->num;
temp->kol = pv->kol;
*top = (*top)->p;
delete pv;
return *temp;
}
//----------------------------------------
// Меню
void menu()
{
setlocale(LC_ALL,"Russian");
cout<<"0: Выгрузить стек на дисплей"<<endl;
cout<<"1: Добавить машину в стек"<<endl;
cout<<"2: Удалить машину из стека"<<endl;
cout<<"3: Выход (Exit)"<<endl;
cout<<"Сделайте выбор: ";
}
Второй вариант программы
Программный код файла kurs_with_include_stack.cpp
// kurs_with_include_stack.cpp: определяет точку входа для консольного приложения.
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <stack>
using namespace std;
// Меню
void menu()
{setlocale(LC_ALL,"Russian");
cout<<"0: Выгрузить стек на дисплей"<<endl;
cout<<"1: Добавить машину в стек"<<endl;
cout<<"2: Удалить машину из стека"<<endl;
cout<<"3: Выход (Exit)"<<endl;
cout<<"Сделайте выбор: ";}
int main()
{setlocale(LC_ALL,"Russian");
int n=0,i,k,kol;
string num, numdel;
stack<string> mystack;// Номер машины
stack<string> temp;// Дополнительный стек (выгружаем номера)
stack<int> mystack2;// Кол-во раз, которое машины удалялась со стоянки
stack<int> temp2;// Дополнительный стек (выгружаем кол-во раз)
while (n<=0)
{cout<<"Введите кол-во автомобилей на стоянке: "; cin>>n;}
for(i=0;i<n;i++)
{
cout<<"Номер "<<i+1<<"-го автомобиля:";
cin>>num; mystack.push(num);
kol=0; mystack2.push(kol);
}
step_menu:
cout<<"-------------------------------------"<<endl;
menu();
cin>>k;
cout<<"-------------------------------------"<<endl;
switch (k)
{case 0: {while (!mystack.empty())
{
num = mystack.top();
mystack.pop();
kol = mystack2.top();
mystack2.pop();
cout<<num<<"\t"<<kol<<endl;
}
goto step_menu;
}
case 1:{
cout<<"Введите номер добавляемого автомобиля:";
cin>>num;
mystack.push(num);
kol=0;
mystack2.push(kol);
goto step_menu;
}
case 2:{
cout<<"Введите номер удаляемого автомобиля:";
cin>>numdel;
step2:
num = mystack.top();
kol = mystack2.top();
if ( (numdel.compare(num)!=0)&&(mystack.empty()) )
{ cout<<"Такого автомобиля нет в гараже. Удаление невозможно."<<endl; goto step_menu; }
if(numdel.compare(num)==0)
{ mystack.pop();
mystack2.pop();
cout<<"Автомобиль удален со стоянки."<<endl;
cout<<"Автомобиль удалялся "<<kol<<"-раз для обеспечения выезда других автомобилей."<<endl;
goto go_while; }
/* Заносим элементы из гаража
в вспомогательный стек */
temp.push(num);
temp2.push(kol+1);
mystack.pop();
mystack2.pop();
goto step2;
go_while:
/* Выгружаем элементы из вспо-
могательного стека в гараж */
while (!temp.empty())
{num = temp.top();
kol = temp2.top();
mystack.push(num);
mystack2.push(kol);
temp.pop();
temp2.pop();
}
goto step_menu;
}
case 3: exit(0);
default:
cout<<"<<<Ошибка меню! Сделайте правильный выбор>>>"<<endl;
goto step_menu;
}
return 0;
}