Разработка классов C++, программно реализующих функциональность терминала оплаты услуг связи / телевидения / интернет/ЖКХ
Построение абстрактной модели. Структура базового класса System_Term: формальное описание класса, структура данных и функций, инструкция программиста и пользователя. Структура базовых классов mobile, Home, TV, Internet, их составные части и функционал.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.06.2014 |
Размер файла | 1,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Разработка классов C++, программно реализующих функциональность терминала оплаты услуг связи / телевидения / интернет/ЖКХ
Введение
программист пользователь модель абстрактный
Основополагающей идеей одного из современных подходов к программированию - объектно-ориентированному - является объединение данных и обрабатывающих их процедур в единое целое - объекты.
Объектно-ориентированное программирование - это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию, основанную на принципах наследуемости. При этом объект характеризуется как совокупностью всех своих свойств и их текущих значений, так и совокупностью допустимых для данного объекта действий.
Несмотря на то что в различных источниках делается акцент на те или иные особенности внедрения и применения ООП, три основных (базовых) понятия ООП остаются неизменными. К ним относятся:
· наследование (Inheritance);
· инкапсуляция (Encapsulation);
· полиморфизм (Polymorphism).
Инкапсуляция - это объеденение данных и обрабатывающих их функций в одном объекте. Наследование позволяет использовать разработанные ранее классы, что обеспечивает существенное сокращение процесса разработки программных модулей. Полиморфизм можно определить как свойство, позволяющее использовать одно имя для обозначения действий, общих для родственных классов.
Эти понятия как три кита лежат в основе ООП. При процедурном подходе требуется описать каждый шаг, каждое действие алгоритма. В отличие от него объектно-ориентированный подход оставляет за объектом право решать, как отреагировать и что сделать в ответ на поступивший вызов. Основные идеи объектно-ориентированного подхода опираются на следующие положения:
- Программа представляет собой модель некоторого реального процесса, части реального мира.
- Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов.
- Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект.
- Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.
- Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий представляют собой класс однотипных объектов.
С точки зрения языка программирования класс объектов можно рассматривать как тип данного, а отдельный объект - как данное этого типа. Определение программистом собственных классов объектов для конкретного набора задач должно позволить описывать отдельные задачи в терминах самого класса задач (при соответствующем выборе имен типов и имен объектов, их параметров и выполняемых действий).
Таким образом, объектно-ориентированный подход предполагает, что при разработке программы должны быть определены классы используемых в программе объектов и построены их описания, затем созданы экземпляры необходимых объектов и определено взаимодействие между ними.
Очевидно, для того, чтобы продуктивно применять объектный подход для разработки программ, необходимы языки программирования, поддерживающие этот подход, т.е. позволяющие строить описание классов объектов, образовывать данные объектных типов, выполнять операции над объектами. Опыт программирования показывает, что любой методический подход в технологии программирования не должен применяться слепо с игнорированием других подходов. Это относится и к объектно-ориентированному подходу. Существует ряд типовых проблем, для которых его полезность наиболее очевидна, к таким проблемам относятся, в частности, задачи имитационного моделирования, программирование диалогов с пользователем. Существуют и задачи, в которых применение объектного подхода ни к чему, кроме излишних затрат труда, не приведет. В связи с этим наибольшее распространение получили объектно-ориентированные языки программирования, позволяющие сочетать объектный подход с другими методологиями
Практически все объектно-ориентированные языки программирования являются развивающимися языками, их стандарты регулярно уточняются и расширяются. Следствием этого развития являются неизбежные различия во входных языках компиляторов различных систем программирования.
Данная работа написана на языке программирование C++. С++ - расширение С - был разработан Бьерном Страуструпом в начале 80-х годов в Bell Laboratories. C++ обеспечивает ряд свойств, которые «приводят в порядок» язык С, но, что более важно, он обеспечивает возможность объектно-ориентированного программирования.
Этот подход можно также применить и системе терминалов олпаты различных услуг, таких как оплата услуг мобильной связи, оплата услуг жилищно-коммунального комплекса и т.д. В данном курсовом проекте мною был реализован терминал оплаты услуг связи, интернета, телевидения и ЖКХ. Данная система является достаточно сложно и требует максимально использовать возможности объектно-ориентированого программирования.
Так задача заключается в создание лишь виртуального терминала оплаты, то мне необходимо решить лишь некоторые из задач его реализации, такие как: возможность системе иметь собственную базу данных о клиенте и его средствах, обеспечить возможность программно менять информацию о поступлении средств на счет или снятии средств со счета, разработать максимально удобный и понятный пользователю интерфейс. Интерфейс, требующий меньше нажатий клавиш (или других действий пользователя типа щелчков мышью), лучше того, который требует много нажатий для выполнения одной и той же операции, даже если такие виды интерфейсов обычно сложнее в освоении. Таким образом, данная задача состоит в написание простого и понятного приложения с функционалом базы данных.
В данном курсовом проекте представлены следующие разделы:
- постановка задачи (в этом разделе детально описывается прикладная задача и порядок ее решения);
- построение абстрактной модели (описание объектно-ориентированной модели решаемой задачи, UML-описание структуры иерархии классов);
- структура класса (состоит из трёх подразделов: формальное описание класса, описание структур данных, функций и инструкция программиста);
- демонстрационная программа (содержит текст программы и инструкцию пользователя);
- тестовый пример (демонстрация работы программы для различных наборов входных данных).
1. Постановка задачи
В качестве прикладной задачи в данном курсовом проекте рассмотрена задача реализации программы, которая эмулирует работу терминала оплаты услуг связи, телевидения, интрнета и ЖКХ. Так как это всего лишь эмулятор терминала, а не реальное программное обеспечение, я лишь предполагаю начиличие функций настоящего терминала, таких как купюроприемник или средство для выдачи чеков. Несмотря на это, я постаралась максимально описать работу программы.
Далее перечислены основные функции, которые будет реализовывать построенная модель:
- приём купюр;
- проверка соответствия номеров лицевого счета, номеров телефона или квитанции;
- регистрация новых лицевых счетов;
- пополнение и изменение баланса;
- вывод баланса на экран;
- эмулятор чека;
- сохранение и обновление информации в базе после каждой операции;
- функции безопасности:
Функцию сохраняемости я обеспечила, путем создания простейшей базы данных. Данные хранятся в текстовом файле. Запись в файл реализована с помощью потокового вывода.
Программа преследует следующие ограничения: баланс не может быть отрицательным, идентификационный номер должен быть длиной 7 цифр.
Результатом выполнения данного курсового проекта станет полноценное приложение, эмулирующее терминал оплаты услуг.
2. Построение абстрактной модели
Объектно-ориентированная модель данной задачи сводится к описанию нескольких структур данных, взаимодействующих между собой.
В программе реализованы следующие классы:
- класс формы;
- класс «Система» (содержит основные функции терминала, является абстрактным, имеет одну чистую виртуальную функцию, свойственную всем дочерним классам);
- класс «Интернет» (отнаследован от класса «Система», содержит в себе определённую виртуальную функцию);
- класс «Связь» (отнаследован от класса «Система», содержит в себе определённую виртуальную функцию);
- класс «Телевидение» (отнаследован от класса «Система», содержит в себе определённую виртуальную функцию).
- класс «ЖКХ» (отнаследован от класса «Система», содержит в себе определённую виртуальную функцию).
Структура и взаимодействие классов продемонстрированы диаграммах UML.
На рисунке 1 представлена диаграмма классов для реализации сущности «Система терминала».
Рисунок 1 - Диаграмма классов терминала
Данная диаграмма отражает основную суть курсового проекта - иерархию классов, реализующих в совокупности функционал терминала. Классом-предком в данном случае является класс System_Term. Этот класс является абстрактным и поэтому не может иметь экземпляров. От него отнаследован классы Internet, mobile, TV, Home.
Данная система будет реализована на языке программирования C++ с использованием объектно-ориентированного подхода, каждый класс реализован в двух модулях: заголовочном и модуле реализации
3. Структура базового класса System_Term
3.1 Формальное описание класса
Ниже представлен код класса System_Term из заголовочного файла System.h., которые является абстрактным базовым классом данной программы.
#include <string>
#pragma once
using namespace std;
class System_Term {
public:
System_Term(void); // конструктор класса
virtual ~System_Term(); // виртуальный деструктор
string getname(); // вернуть значение поля имя
void setname (string newname); // получить значение поля имя
int getamount(); // вернуть значение поля баланс
void setamount (int value); // получить значение поля баланс
int getid(); // вернуть значение поля номер
void setid (int value); // получить значение поля номер
unsigned int setdata (char *filename, int newid); // зарегистрировать новую учетную запись
void check_balance (char *filename, int id_check); // проверка баланса
unsigned int change_balance (char *filename, int id_check, int new_balance); // изменение баланса
virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay) = 0; // функция оплаты
protected:
int balance;
int id;
string name;
};
Ниже представлена реализация методов класса System_Term из файла System_T.cpp
#include «stdafx.h»
#include «System.h»
#include «Form1.h»
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
using namespace Kurs;
// конструктор класса
System_Term: System_Term(void)
{
balance = 0;
id = 0;
};
// деструктор класса
System_Term:~System_Term(void)
{
};
// функция возврата значения поля имя
string System_Term:getname()
{
return name;
};
// функция возврата получения поля имя
void System_Term:setname (string newname) {
name = newname;
};
// функция возврата значения поля баланс
int System_Term:getamount()
{
return balance;
};
// функция получения значения поля баланс
void System_Term:setamount (int value) {
balance = value;
};
// функция возврата значения поля номер
int System_Term:getid() {
return id;
};
// функция получения значения поля номер
void System_Term:setid (int id_value) {
id = id_value;
};
// функция изменения баланса
unsigned int System_Term: change_balance (char *filename, int id_check, int new_balance) {
unsigned int flag = 0;
int temp = 0;
string str=»»;
int id1 = 0;
int balance1 = 0;
int id2 =-1;
std:ifstream file (filename, std:ios:in);
while((! file.eof()) && (temp!= 1)) {
file >> id;
file >> balance;
if (id == id_check)
{
temp = 1;
setid(id);
setamount(balance);
balance = balance + new_balance;
file.close();
std:ifstream file2 (filename, std:ios:in);
while (! file2.eof())
{
file2 >> id1;
if (id1 == id_check)
{
file2 >> balance1;
balance1 = balance;
}
else
file2 >> balance1;
if (id1!= id2)
str=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;
id2 = id1;
}
file2.close();
std:ofstream in (filename, ios:out | ios:trunc);
in.close();
std:ofstream fileout2 (filename, std:ios:out);
fileout2.write (str.c_str(), str.size());
fileout2.close();
flag = 1;
}
}
file.close();
if (temp!= 1)
{
flag = 300;
setid (id_check);
setamount (new_balance);
std:ofstream fileout (filename, std:ios:app);
fileout << std:endl;
fileout << id <<»»;
fileout << balance<< std:endl;
fileout.close();
}
return flag;
};
3.2 Описание структур данных и функций
Ниже представлены описания функций-членов класса System_Term.
1) Метод System_Term: System_Term(void) является конструктором класса System_Term. В таблице 1 представлены структуры данных, используемые в данном методе.
Таблица 1 - Структуры данных, используемые в методе System_Term
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
id |
int |
Номер счета |
|
balance |
int |
Баланс |
|
name |
string |
Имя |
2) Метод unsigned int setdata (char *filename, int newid) предназначен для регистрации новых пользователей в системе. В таблице 2 представлены структуры данных, используемые в методе.
Таблица 2 - Структуры данных, используемые в методе setdata
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
newid |
int |
Новый номер |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
temp |
int |
Переменная проверки |
2) Метод void check_balance (char *filename, int id_check) предназначен для проверки баланса по номеру счета. В таблице 3 представлены структуры данных, используемые в методе.
Таблица3 - Структуры данных, используемые в методе check_balance
Имя |
Тип |
Предназначение |
|
Локальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_check |
int |
Новый номер |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
temp |
int |
Переменная проверки |
4) Метод unsigned int change_balance (char *filename, int id_check, int new_balance) предназначен для изменения баланса. В таблице 4 представлены структуры данных, используемые в методе.
Таблица 4 - Структуры данных, используемые в методе change_balance
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_check |
int |
Новый номер |
|
new_balance |
int |
Новый баланс |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
temp |
int |
Переменная проверки |
|
id1 |
int |
Вспомогательные переменные для записи номера |
|
balance1 |
int |
Вспомогательные переменные для записи баланса |
|
str |
string |
Вспомогательные переменные для перезаписи файла |
5) Метод void setname (string newname) присваивает значение полю имя.
6) Метод void setamount (int value) присваивает значение полю баланса.
7) Метод void setid (int value) присваивает значение полю номер.
8) Метод string getname() возвращает значение поля имя.
9) Метод void setamount (int value) возвращает значение поля имя.
10) Метод void setid (int value) возвращает значение поля номер.
11) Метод virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay) = 0 является чистой виртуальной функцией, что делает заданный класс абстрактным.
3.3 Инструкция программисту
Данный класс System_Term является базовым абстрактным и содержит чистую виртуальную функцию. В этом классе уже заранее продуманы и описаны методы, которые в дальнейшем будут использованы при реализации классов - потомков. В силу того, что данный класс является абстрактным, он не предполагает создание экземпляров. Чистой виртуальной функцией в данном классе является функция virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay) = 0, которая не имеет реализации. Эта функция будет перегружена во всем классах потомках и реализует оплату пользователем в системе. Так как она необходима для всех дочерних классов, имеется смысл делать ее чистой виртуальной, а класс System_Term абстрактным, что реализует на практике один из принципов объектно-ориентированого подхода - полиморфизм. Если чисто виртуальная функция не определяется в производном классе, то она и остается таковой, а значит производный класс тоже является абстрактным.
4. Структура класса Internet
4.1 Формальное описание класса
Ниже представлен код класса Internet из заголовочного файла Internet.h., которые классом - наследником базового класса данной программы.
#define _CRT_SECURE_NO_WARNINGS
#include «System.h»
#pragma once
class Internet: public System_Term
{
public:
Internet(void); // конструктор класса
~Internet(); // деструктор класса
virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay); // перегруженная функция оплаты
};
Ниже представлена реализация методов класса Internet из файла Internet.cpp. Данный метод является перегруженной виртуальной функцией базового класса.
#include «stdafx.h»
#include «Internet.h»
#include «Form1.h»
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace Kurs;
// конструктор
Internet: Internet() {
id=0;
balance=0;
};
// деструктор
Internet:~Internet() {
};
// функция оплаты
unsigned int Internet:pay (char *filename, int id_pay, int balance_pay, string name_pay)
{
unsigned int flag;
string str=»»;
int temp = 0;
int id2 =-1;
try {
std:ifstream file (filename, std:ios:app);
while (temp!= 1) {
file >> id;
file >> balance;
if (id == id_pay)
{
temp = 1;
setid(id);
setamount(balance);
if (balance >= balance_pay)
{
balance = balance - balance_pay;
try {
std:ifstream file2 (filename, std:ios:app);
int id1 = 0;
int balance1 = 0;
while (! file2.eof())
{
file2 >> id1;
if (id1 == id_pay)
{
file2 >> balance1;
balance1 = balance;
}
else
file2 >> balance1;
if (id1!= id2)
str=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;
id2 = id1;
}
file2.close();
}
catch (…) {
flag = 200;
exit;
}
std:ofstream in (filename, ios_base:trunc);
in.close();
try {
std:ofstream fileout2 (filename, std:ios:app);
fileout2.write (str.c_str(), str.size());
fileout2.close();
file.close();
}
catch (…) {
flag = 200;
exit;
}
flag = 1;
}
else
{
flag = 300;
}
}
else
{
temp = 1;
flag = 900;
}
}
}
catch (…) {
flag = 200;
exit;
}
return flag;
};
4.2 Описание структур данных и функций
Ниже представлены описания функций-членов класса Internet.
1) Метод Internet: Internet() является конструктором класса Internet. В таблице 5 представлены структуры данных, используемые в данном методе.
Таблица 5 - Структуры данных, используемые в методе Internet
Имя |
Тип |
Предназначение |
|
Локальные переменные |
|||
id |
int |
Номер счета |
|
balance |
int |
Баланс |
2) Метод unsigned int Internet:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг интернета. В таблице 6 представлены структуры данных, используемые в методе.
Таблица 6 - Структуры данных, используемые в методе pay
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_pay |
int |
Номер оплаты |
|
balance_pay |
int |
Сумма оплаты |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
str |
string |
Вспомогательная строка для перезаписи файла |
|
id1 |
int |
Вспомогательная переменная |
|
balance1 |
int |
Вспомогательная переменная |
|
temp |
int |
Переменная проверки |
4.3 Инструкция программисту
Данный класс является наследником абстрактного базового класса System_Term. Это позволило построить описание этого класса на основе существующего абстрактного базового класса. Чтобы класс - наследник не стал абстрактным, необходимо было перегрузить чистую виртуальную функцию базового класса unsigned int Internet:pay (char *filename, int id_pay, int balance_pay, string name_pay), которая в данном случае предназначена для оплаты услуг интернета. Тип наследования в данном случае public, это позволяет классу-потомку Internet иметь доступ к полям базового класса System_Term. Так как производные классы имеют общие поля и функции (например, поле «id», «balance»), то эти члены класса описаны в базовом классе.
5. Структура класса TV
5.1 Формальное описание класса
Ниже представлен код класса TV из заголовочного файла tv.h., которые классом - наследником базового класса данной программы.
#define _CRT_SECURE_NO_WARNINGS
#include «System.h»
#pragma once
class TV: public System_Term
{
public:
TV(void);
~TV();
virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay);
};
Ниже представлена реализация методов класса TV из файла tv.cpp. Данный метод является перегруженной виртуальной функцией базового класса.
#include «stdafx.h»
#include «tv.h»
#include «Form1.h»
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace Kurs;
// конструткор
TV: TV() {
id = 0;
balance = 0;
};
// деструктор
TV:~TV() {
};
// функция оплаты
unsigned int TV:pay (char *filename, int id_pay, int balance_pay, string name_pay)
{
unsigned int flag = 0;
string str=»»;
int temp = 0;
int id2 =-1;
try {
std:ifstream file (filename, std:ios:app);
while (temp!= 1) {
file >> id;
file >> balance;
if (id == id_pay)
{
temp = 1;
setid(id);
setamount(balance);
if (balance >= balance_pay)
{
balance = balance - balance_pay;
try {
std:ifstream file2 (filename, std:ios:app);
int id1 = 0;
int balance1 = 0;
while (! file2.eof())
{
file2 >> id1;
if (id1 == id_pay)
{
file2 >> balance1;
balance1 = balance;
}
else
file2 >> balance1;
if (id1!= id2)
str=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;
id2 = id1;
}
file2.close();
}
catch (…) {
flag = 200;
exit;
}
std:ofstream in (filename, ios_base:trunc);
in.close();
try {
std:ofstream fileout2 (filename, std:ios:app);
fileout2.write (str.c_str(), str.size());
fileout2.close();
file.close();
}
catch (…) {
flag = 200;
exit;
}
flag = 1;
}
else
{
flag = 300;
}
}
else
{
temp = 1;
flag = 900;
}
}
}
catch (…) {
flag = 200;
exit;
}
return flag;
};
5.2 Описание структур данных и функций
Ниже представлены описания функций-членов класса TV.
1) Метод TV: TV() является конструктором класса TV. В таблице 7 представлены структуры данных, используемые в данном методе.
Таблица 7 - Структуры данных, используемые в методе TV
Имя |
Тип |
Предназначение |
|
Локальные переменные |
|||
id |
int |
Номер счета |
|
balance |
int |
Баланс |
2) Метод unsigned int TV:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг телевидения. В таблице 8 представлены структуры данных, используемые в методе.
Таблица 8 - Структуры данных, используемые в методе pay
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_pay |
int |
Номер оплаты |
|
balance_pay |
int |
Сумма оплаты |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
str |
string |
Вспомогательная строка для перезаписи файла |
|
id1 |
int |
Вспомогательная переменная |
|
balance1 |
int |
Вспомогательная переменная |
|
temp |
int |
Переменная проверки |
5.3 Инструкция программисту
Данный класс является наследником абстрактного базового класса System_Term. Это позволило построить описание этого класса на основе существующего абстрактного базового класса. Чтобы класс - наследник не стал абстрактным, необходимо было перегрузить чистую виртуальную функцию базового класса unsigned int TV:pay (char *filename, int id_pay, int balance_pay, string name_pay), которая в данном случае предназначена для оплаты услуг телевидения. Тип наследования в данном случае public, это позволяет классу-потомку TV иметь доступ к полям базового класса System_Term. Так как производные классы имеют общие поля и функции (например, поле «id», «balance»), то эти члены класса описаны в базовом классе.
6. Структура класса mobile
6.1 Формальное описание класса
Данный класс является наследником абстрактного базового класса System_Term.
Ниже представлен код класса mobile из заголовочного файла mobile.h., который является классом - наследником базового класса данной программы.
#define _CRT_SECURE_NO_WARNINGS
#include «System.h»
#pragma once
class mobile: public System_Term
{
public:
mobile(void);
~mobile();
virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay);
};
Ниже представлена реализация методов класса mobile из файла mobilem.cpp. Данный метод является перегруженной виртуальной функцией базового класса.
#include «stdafx.h»
#include «mobile.h»
#include «Form1.h»
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace Kurs;
// конструктор класса
mobile:mobile(void) {
id = 0;
balance = 0;
name = «»;
};
// деструктор класса
mobile:~mobile() {
};
// функция оплаты
unsigned int mobile:pay (char *filename, int id_pay, int balance_pay, string name_pay) {
unsigned int flag;
setid(id);
setname (name_pay);
flag = 1;
id = id_pay;
balance = balance_pay;
try {
std:ofstream fileout (filename, std:ios:app);
fileout << std:endl;
fileout << name_pay <<»»;
fileout << id <<»»;
fileout << balance << std:endl;
fileout.close();
}
catch (…) {
flag = 200;
exit;
}
return flag;
};
6.2 Описание структур данных и функций
Ниже представлены описания функций-членов класса mobile.
1) Метод mobile: mobile() является конструктором класса mobile. В таблице 9 представлены структуры данных, используемые в данном методе.
Таблица 9 - Структуры данных, используемые в методе mobile
Имя |
Тип |
Предназначение |
|
Локальные переменные |
|||
id |
int |
Номер счета |
|
balance |
int |
Баланс |
2) Метод unsigned int mobile:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг мобильной связи. В таблице 10 представлены структуры данных, используемые в методе.
Таблица 10 - Структуры данных, используемые в методе pay
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_pay |
int |
Номер оплаты |
|
balance_pay |
int |
Сумма оплаты |
|
name_pay |
string |
Оператор |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
str |
string |
Вспомогательная строка для перезаписи файла |
|
balance1 |
int |
Вспомогательная переменная |
|
temp |
int |
Переменная проверки |
6.3 Инструкция программисту
Данный класс является наследником абстрактного базового класса System_Term. Это позволило построить описание этого класса на основе существующего абстрактного базового класса. Чтобы класс - наследник не стал абстрактным, необходимо было перегрузить чистую виртуальную функцию базового класса unsigned int mobile:pay (char *filename, int id_pay, int balance_pay, string name_pay), которая в данном случае предназначена для оплаты услуг телевидения. Тип наследования в данном случае public, это позволяет классу-потомку mobile иметь доступ к полям базового класса System_Term. Так как производные классы имеют общие поля и функции (например, поле «id», «balance»), то эти члены класса описаны в базовом классе.
7. Структура класса Home
7.1 Формальное описание класса
Данный класс является наследником абстрактного базового класса System_Term.
Ниже представлен код класса mobile из заголовочного файла Home.h., которые классом - наследником базового класса данной программы.
#define _CRT_SECURE_NO_WARNINGS
#include «System.h»
#pragma once
class mobile: public System_Term
{
public:
mobile(void);
~mobile();
virtual unsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay);
};
Ниже представлена реализация методов класса Home из файла Home.cpp. Данный метод является перегруженной виртуальной функцией базового класса.
#include «stdafx.h»
#include «home.h»
#include «Form1.h»
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace Kurs;
// констурктор
Home: Home(void) {
id = 0;
balance = 0;
name = «»;
};
// дестуктор
Home:~Home() {
};
// функция оплаты
unsigned int Home:pay (char *filename, int id_pay, int balance_pay, string name_pay)
{
unsigned int flag = 0;
int temp = 0;
int filetemp = 0;
try {
std:ifstream file (filename, std:ios:app);
while((! file.eof())&&(filetemp!= 1)) {
file >> id;
file >> balance;
file >> name;
if (id!= id_pay)
{
temp = 1;
}
else
{
temp = 0;
filetemp = 1;
flag = 300;
}
}
file.close();
}
catch (…) {
flag = 200;
exit;
}
if (temp == 1) {
flag = 1;
id = id_pay;
balance = balance_pay;
name = name_pay;
try{
std:ofstream fileout (filename, std:ios:app);
fileout << id << «»;
fileout << balance << «»;
fileout << name << std:endl;
fileout.close();
}
catch (…) {
flag = 200;
exit;
}
}
return flag;
};
7.2 Описание структур данных и функций
Ниже представлены описания функций-членов класса Home.
1) Метод Home: Home () является конструктором класса Home. В таблице 11 представлены структуры данных, используемые в данном методе.
Таблица 11 - Структуры данных, используемые в методе Home
Имя |
Тип |
Предназначение |
|
Локальные переменные |
|||
id |
int |
Номер счета |
|
balance |
int |
Баланс |
|
name |
string |
Фамилия клиента |
2) Метод unsigned int Home:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг ЖКХ. В таблице 12 представлены структуры данных, используемые в методе.
Таблица 12 - Структуры данных, используемые в методе pay
Имя |
Тип |
Предназначение |
|
Формальные переменные |
|||
filename |
*char |
Файловая переменная |
|
id_pay |
int |
Номер оплаты |
|
balance_pay |
int |
Сумма оплаты |
|
name_pay |
string |
Фамилия |
|
Локальные переменные |
|||
flag |
unsigned int |
Переменная возникновения ошибки |
|
str |
string |
Вспомогательная строка для перезаписи файла |
|
id1 |
int |
Вспомогательная переменная |
|
balance1 |
int |
Вспомогательная переменная |
|
temp |
int |
Переменная проверки |
7.3 Инструкция программисту
Данный класс является наследником абстрактного базового класса System_Term. Это позволило построить описание этого класса на основе существующего абстрактного базового класса. Чтобы класс - наследник не стал абстрактным, необходимо было перегрузить чистую виртуальную функцию базового класса unsigned int Home:pay (char *filename, int id_pay, int balance_pay, string name_pay), которая в данном случае предназначена для оплаты услуг телевидения. Тип наследования в данном случае public, это позволяет классу-потомку Home иметь доступ к полям базового класса System_Term. Так как производные классы имеют общие поля и функции (например, поле «id», «balance»), то эти члены класса описаны в базовом классе.
8. Демонстрационная программа
8.1 Текст программы
Данная программа является приложением Windows Form в Visual Studio 2012. Программа реализована с помощью 5 форм:
- Form1 - для работы с услугами интернета
- MForm - для работы с услугами мобильной связи
- TvForm - для работы с услугами телевидения
- HomeForm - для работы с услугами ЖКХ
- MainForm - для основного окна программы
Далее представлен текст программы для работы с окном оплаты интернета.
Кнопка «Баланс»:
private: System: Void button11_Click (System: Object^ sender, System: EventArgs^ e) {
if (textBox1->Text!=»») {
unsigned int flag;
if (textBox1->Text!=»») {
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename))
{
internet->check_balance («1.txt», Convert: ToInt32 (textBox1->Text));
button10->Enabled=0;
if (flag!= 300) {
label4->Text=»»;
label4->Text= «Баланс вашего лицевого счета \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;
label9->Text=»»;
label9->Text= «Баланс вашего лицевого счета \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;
}
else
{
label4->Text=»»;
label4->Text= «Ваш счет не найден в базе! Пожалуйста зарегистрируйтесь!\n»;
}
if (flag == 200)
{
MessageBox: Show («Ошибка открытия файла!», «Ошибка»);
exit;
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
button10->Enabled=1;
textBox1->Text=»»;
textBox2->Text= «0»;
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
}
Кнопка «Пополнить счет»:
private: System: Void button9_Click (System: Object^ sender, System: EventArgs^ e) {
if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
if (textBox1->Text == «») {
MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);
exit;
}
else
{
flag = internet->change_balance («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text));
button10->Enabled=0;
button5->Visible=1;
if (flag!= 300)
{
label9->Text=»»;
label9->Text= «Операция прошла успешно! Ваш лицевой счет пополнен! \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;
exit;
}
else
{
label9->Text=»»;
label9->Text= «Вы завели новый лицевой счет! \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;
exit;
}
if (flag == 200)
{
MessageBox: Show («Ошибка открытия файла!», «Ошибка»);
exit;
}
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
button10->Enabled=1;
}
Кнопка «Регистрация»:
private: System: Void button8_Click (System: Object^ sender, System: EventArgs^ e) {
if (textBox1->Text!=»») {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
flag = internet->setdata («1.txt», Convert: ToInt32 (textBox1->Text));
button10->Enabled=0;
if (flag == 300)
{
label4->Text=»»;
label4->Text= «Данный лицевой счет уже был зарегистрирован! \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;
}
else
{
label4->Text=»»;
label4->Text= «Поздравляем! Вы завели новый лицевой счет! \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;
exit;
}
}
else
{
MessageBox: Show («Вы заполнили не все поля! Пожалуста проверьте ввод!», «Ошибка»);
exit;
}
}
button10->Enabled=1;
textBox1->Text=»»;
textBox2->Text= «0»;
}
Кнопка «Оплатить»:
private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {
if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
if (textBox1->Text == «») {
MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);
exit;
}
else
{
flag = internet->pay («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), "»);
button5->Visible=1;
if ((flag!= 300)&&(flag!= 900))
{
label9->Text=»»;
label9->Text= «Операция прошла успешно!\n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;
exit;
}
else
{
if (flag == 900)
{
MessageBox: Show («Данная учетная запись не была зарегистрирована ранее! Пожалуйста пройдите регистрацию!», «Ошибка»);
exit;
}
else
{
label9->Text=»»;
MessageBox: Show («На вашем лицевом счете недостаточно средств! Пополните счет!», «Ошибка»);
label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;
exit;
}
if (flag == 200)
{
MessageBox: Show («Ошибка открытия файла!», «Ошибка»);
exit;
}
}
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
}
Далее представлен текст программы для работы с окном оплаты телевидения.
Кнопка «Баланс»:
private: System: Void button11_Click (System: Object^ sender, System: EventArgs^ e) {
if (textBox1->Text!=»») {
unsigned int flag;
if (textBox1->Text!=»») {
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename))
{
tv->check_balance («1.txt», Convert: ToInt32 (textBox1->Text));
button10->Enabled=0;
if (flag!= 300) {
label4->Text=»»;
label4->Text= «Баланс вашего лицевого счета \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;
label9->Text=»»;
label9->Text= «Баланс вашего лицевого счета \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;
}
else
{
label4->Text=»»;
label4->Text= «Ваш счет не найден в базе! Пожалуйста зарегистрируйтесь!\n»;
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
button10->Enabled=1;
textBox1->Text=»»;
textBox2->Text= «0»;
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
}
Кнопка «Пополнить счет»:
private: System: Void button9_Click (System: Object^ sender, System: EventArgs^ e) {
if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
if (textBox1->Text == «») {
MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);
exit;
}
else
{
if ((Convert: ToInt32 (textBox2->Text)%10!= 0)||(Convert: ToInt32 (textBox2->Text)%10 > 10000)||(Convert: ToInt32 (textBox2->Text)%10 < 0))
{
MessageBox: Show («Пожалуйста проверьте ввод суммы! Сумма должна быть неотрицательной и кратной 10!», «Ошибка»);
exit;
}
else
{
flag = tv->change_balance («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text));
button10->Enabled=0;
button5->Visible=1;
if ((flag!= 300)&&(flag!= 900))
{
label9->Text=»»;
label9->Text= «Операция прошла успешно! Ваш лицевой счет пополнен! \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;
exit;
}
else
{
label9->Text=»»;
label9->Text= «Вы завели новый лицевой счет! \n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;
exit;
}
}
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
textBox2->Text= «0»;
textBox1->Text=»»;
button10->Enabled=1;
}
Кнопка «Регистрация»:
private: System: Void button8_Click (System: Object^ sender, System: EventArgs^ e) {
if (textBox1->Text!=»») {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
flag = tv->setdata («1.txt», Convert: ToInt32 (textBox1->Text));
button10->Enabled=0;
if (flag == 300)
{
label4->Text=»»;
label4->Text= «Данный лицевой счет уже был зарегистрирован! \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;
}
else
{
label4->Text=»»;
label4->Text= «Поздравляем! Вы завели новый лицевой счет! \n»;
label4->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label4->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;
exit;
}
}
else
{
MessageBox: Show («Вы заполнили не все поля! Пожалуста проверьте ввод!», «Ошибка»);
exit;
}
}
button10->Enabled=1;
textBox1->Text=»»;
textBox2->Text= «0»;
}
Кнопка «Оплатить»:
private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {
if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
if (textBox1->Text == «») {
MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);
exit;
}
else
{
if ((Convert: ToInt32 (textBox2->Text)%10!= 0)||(Convert: ToInt32 (textBox2->Text)%10 > 10000)||(Convert: ToInt32 (textBox2->Text)%10 < 0))
{
MessageBox: Show («Пожалуйста проверьте ввод суммы! Сумма должна быть неотрицательной и кратной 10!», «Ошибка»);
exit;
}
else
{
flag = tv->pay («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), "»);
button5->Visible=1;
if ((flag!= 300)&&(flag!= 900))
{
label9->Text=»»;
label9->Text= «Операция прошла успешно!\n»;
label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;
exit;
}
else
{
if (flag == 900)
{
MessageBox: Show («Данная учетная запись не была зарегистрирована ранее! Пожалуйста пройдите регистрацию!», «Ошибка»);
exit;
}
else
{
label9->Text=»»;
MessageBox: Show («На вашем лицевом счете недостаточно средств! Пополните счет!», «Ошибка»);
label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;
label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;
exit;
}
}
}
}
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
textBox1->Text=»»;
textBox2->Text= «0»;
}
Далее представлен текст программы для работы с окном оплаты услуг мобильной связи.
Кнопка «Оплатить»:
private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {
string str1;
if (textBox1->Text!=»») {
unsigned int flag;
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
if (textBox1->Text ==»») {
MessageBox: Show («Пожалуйста введите свой номер!», «Ошибка»);
exit;
}
else
{
if (Convert: ToInt32 (textBox2->Text)%10!= 0)
{
MessageBox: Show («Сумма должна быть кратна 10!», «Ошибка»);
exit;
}
else
{
MarshalString((label2->Text), str1);
flag = mobile_l->pay («3.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), str1);
button5->Visible=1;
label1->Text=»»;
label1->Text= «Баланс вашего счета успешно пополнен \n»;
label1->Text=label1->Text+«Ваш номер: «+label2->Text+mobile_l->getid()+» \n»;
label1->Text=label1->Text+«Ваш баланс: «+mobile_l->getamount()+» \n»;
}
}
}
}
else
MessageBox: Show («Пожалуйста введите свой номер и сумму оплаты!», «Ошибка»);
button2->Enabled = 1;
button3->Enabled = 1;
button1->Enabled = 1;
}
Далее представлен текст программы для работы с окном оплаты услуг ЖКХ.
Кнопка «Оплатить»:
private: System: Void button1_Click (System: Object^ sender, System: EventArgs^ e) {
string str1;
unsigned int flag;
if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)&&(textBox3->Text!=»»)) {
MarshalString((textBox3->Text), str1);
this->openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;
this->openFileDialog1->FilterIndex = 1;
filename = this->openFileDialog1->FileName;
if (! filename->IsNullOrEmpty(filename)) {
flag = home->pay («4.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), str1);
if (flag == 1)
{
label1->Text=»»;
label1->Text= «Операция прошла успешно!\n»;
label1->Text=label1->Text+«Ваш счет: «+home->getid()+» \n»;
label1->Text=label1->Text+«Ваше имя: «+textBox3->Text+» \n»;
label1->Text=label1->Text+«Ваш баланс: «+home->getamount()+» \n»;
exit;
}
else
{
button5->Visible = 0;
label1->Text=»»;
label1->Text= «Операция не прошла! Обратитесь в службу жилищно-комунального хозяйства и уточните информацию!\n»;
MessageBox: Show («Данная учетная запись была зарегистрирована ранее!», «Ошибка»);
exit;
}
}
else
MessageBox: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);
textBox2->Text= «0»;
}
}
8.2 Инструкция пользователю
Данная программа является эмулятором терминала оплаты услуг интернета, телевидения, мобильной связи и ЖКХ. После запуска программы пользователю будет выведено окно, которое содержит четыре кнопки «Интернет», «Телевидение», «Связь», «ЖКХ». Поскольку терминал виртуальный, его база данных хранится в текстовых файлах (для каждого типа услуг - свой текстовый файл с соответствующим номером). После нажатия кнопки для определенной услуги пользователь может совершать дальнейшие действия.
После нажатия на кнопку «Интернет», пользователь может совершить следующие действия:
- Пополнить счет; для этого пользователю будет предложено ввести номер своего лицевого счета, и выбрать сумму, если данный счет будет найден в базе, то пользователь получит чек, если счет не найден, будет заведен новый счет;
- Оплатить интернет; для этого пользователь вводит номер лицевого счета и выбирает сумму оплаты, если такой счет найден и баланс счета позволяет произвести операцию, то пользователь получит чек, если счет не найден или сумма слишком велика, то будет выведено сообщение об ошибке;
- Проверить баланс; для этого пользователь вводит номер своего лицевого счета и получает сообщение о доступных ему средствах;
- Зарегистрировать новый лицевой счет; пользователь вводит номер лицевого счета и после прохождения проверки на повтор счета в базе, получает новый лицевой счет и чек, информирующий о его получении.
После нажатия на кнопку «Телевидения», пользователю доступны те же действия, что и для работы с услугами интернета.
После нажатия на кнопку «Связь», пользователю доступны следующие действия:
- Выбор оператора связи («МТС», «Билайн», «Мегафон»); пользователь выбирает кнопку своего оператора и первые четыре цифры его номера автоматически становятся соотвественными данному оператору;
- Оплатить; после нажатия на кнопку оплаты, пользователь получает чек с уведомлением об оплате своего номера.
После нажатия на кнопку «ЖКХ», пользователю будет предложено ввести номер своей квитанции, свою фамилию и выбрать сумму оплаты; после прохождения проверки на повтор номеров, пользователь получит чек об успешной оплате.
При обновлении информация сохраняется в файл.
9. Тестовый пример
При запуске программы пользователю будет выведено информационное окно
Рисунок 2 - Снимок экрана, отображающий запуск программы
После этого выберем пункт «Интернет» и выберем функцию «Оплатить». Введём номер счета, который уже имелся в базе. На рисунке 3 представлен снимок экрана, отображающий оплату.
Рисунок 3 - Снимок экрана, отображающий оплату
Мы видим, что терминал среагировал корректно. Теперь мы введем сумму больше, чем есть на данном счету. На рисунке 4 представлен снимок экрана, отображающий попытку оплаты большей суммой.
Рисунок 4 - Снимок экрана, отображающий оплату
Мы убедились в том, что программа не позволяет произыести оплату.
Теперь проверим баланс лицевого счета. На рисунке 5 представлен снимок экрана, отображающий вывод баланса на экран.
Рисунок 5 - Снимок экрана, отображающий вывод баланса на экран
Теперь рассмотрим тестовый пример для оплаты сотовой связи. Данный тестовый пример приведен на рисунке 6.
Рисунок 6 - Снимок экрана, отображающий оплату сотовой связи
Далее рассмотрим тестовый пример для оплаты услуг ЖКХ. Данный тестовый пример приведен на рисунке 7.
Рисунок 7 - Снимок экрана, отображающий оплату услуг ЖКХ
Если мы попытаемся ввести номер квитанции уже имеющийся в базе, программа не позволит нам произвести оплату. Данная ситуация показана на рисунке 8.
Рисунок 8 - Снимок экрана, отображающий попытку оплаты
Заключение
В ходе данного курсового проекта я разработала иерархию классов, реализующий функциональность терминала оплаты услуг. При разработке данного приложения, мною были поняты основные аспекты объектно - ориентированного подхода, его основные плюсы и минусы. Развитие объектно - ориентированого метода обусловлено ограниченностью других методов программирования, разработанных ранее. Так же я увидела возможность с использованием принципов ООП облегчить задачу программиста и тех, кто в последствии будет проводит работы с написанным им кодом. При реализации поставленной задачи была создана иерархия классов, использующая все парадигмы объектно-ориентированного программирования. Использование объектно-ориентированного подхода при разработке крупных приложений необходимо и полезно. Объектно-ориентированное программирование - это результат естественной эволюции более ранних методологий программирования. Потребность в ООП связана со стремительным усложнением приложений и отсюда как следствие недостаточной надежностью программ и выразительными способностями языков программирования.
Список использованных источников
1. Ален И. Голуб. С и С++. Правила программирования. - М.: БИНОМ. - 272 с.
2. Дейтел Х., Дейтел П. Как программировать на C++: Пер. с англ. - М.: ЗАО «Издательство БИНОМ», 1998 г. - 1024 с.
3. Лафоре Р. Объектно-ориентированное программирование на C++/ Пер. с англ. - СПБ.: Питер, 2003. - 325 с.
4. Подбельский В.В. Язык Си++: Уч. пос. - 5-е изд. - М.: Финансы и статистика, 2002. - 560 с.
5. Страуструп Б. Язык программирования Си++. Специальное издание. - М.: BHV, 2008. - 1104 с.
6. Хомоненко А.Д. Программирование на С++: М.: ЗАО «Издательство БИНОМ», 1998. - 520 с.
Размещено на Allbest.ru
Подобные документы
Построение абстрактной модели класса "грузовой лифт". Построение диаграммы класса. Построение диаграммы модулей. Структура класса "грузовой лифт". Формальное описание класса. Описание структур данных. Инструкция программисту. Демонстрационная программа.
курсовая работа [288,4 K], добавлен 03.07.2008Листинг класса для работы с регулярными выражениями. Особенности классов для проверки данных при регистрации и отправки сообщений. Отправка ссылки для активации на почту пользователя, описание основных классов, анализ их назначения и листинг функций.
курсовая работа [1,7 M], добавлен 17.09.2013Разработка иерархии классов, содержащей не менее трех уровней. Определение базовых и производных классов. Анализ технического задания. Проектирование структуры программы и базовых алгоритмов. Программная реализация разработанной структуры и алгоритмов.
курсовая работа [34,9 K], добавлен 11.01.2011Цели объектно-ориентированного программирования, абстрактные классы и адреса базовых классов, множественное и виртуальное наследование. Инициализация элементов производного класса, программный вызов конструкторов базового и производного классов.
реферат [21,8 K], добавлен 31.10.2011Понятия шаблонов функции и класса, правила описания на языке С++. Разработка и отлаживание в среде программирования программ, содержащих шаблоны функций и классов. Шаблон функции square, возвращающей квадрат переменной. Создание шаблона класса массива.
лабораторная работа [162,6 K], добавлен 25.05.2013Разработка программы, выполняющей обработку базы данных, элементами которой являются объекты класса Student. Организация пользовательского диалога для ввода информации и просмотра объектов. Определение классов и глобальных имен. Инструкция программиста.
контрольная работа [18,4 K], добавлен 13.10.2013Оценка функциональных возможностей стандартных классов представления данных на примерах использования избранных методов ("detect: ifNone:" класса Set, "to:by:do:" класса Number и "copy: ReplaceFrom: to: with:" класса OrderedCollection), их тестирование.
лабораторная работа [1,1 M], добавлен 14.10.2012Создание класса прямоугольников со сторонами, параллельными осям координат. Основные требования к программе. Описание классов и диаграмма их взаимодействия. Интерфейс пользователя и руководство по эксплуатации программы. Блок-схемы разработанных методов.
курсовая работа [622,8 K], добавлен 18.03.2011Исторические предтечи Интернет - ARPAnet, LAN, Ethernet, NSFNET. Взаимоотношение структуры Internet и пользователя. Потенциальные пользователи. Доступ в Internet. Работа Internet: организация, структура, методы.
реферат [69,3 K], добавлен 12.06.2007Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.
курсовая работа [3,3 M], добавлен 18.03.2011