Разработка классов C++, программно реализующих функциональность терминала оплаты услуг связи / телевидения / интернет/ЖКХ

 













Разработка классов 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


.1 Формальное описание класса


Ниже представлен код класса System_Term из заголовочного файла System.h., которые является абстрактным базовым классом данной программы.

#include <string>

#pragma once

namespace std;

System_Term {:_Term(void); // конструктор класса

virtual ~System_Term(); // виртуальный деструкторgetname(); // вернуть значение поля имяsetname (string newname); // получить значение поля имяgetamount(); // вернуть значение поля балансsetamount (int value); // получить значение поля балансgetid(); // вернуть значение поля номерsetid (int value); // получить значение поля номер

unsigned int setdata (char *filename, int newid); // зарегистрировать новую учетную записьcheck_balance (char *filename, int id_check); // проверка балансаint change_balance (char *filename, int id_check, int new_balance); // изменение балансаunsigned int pay (char *filename, int id_pay, int balance_pay, string name_pay) = 0; // функция оплаты:balance;id; name;

};

Ниже представлена реализация методов класса System_Term из файла System_T.cpp

#include «stdafx.h»

#include «System.h»

#include «Form1.h»

#include <iostream>

#include <fstream>

#include <string>


namespace std;namespace Kurs;


// конструктор класса_Term: System_Term(void)

{= 0;= 0;


};


// деструктор класса_Term:~System_Term(void)

{


};

// функция возврата значения поля имяSystem_Term:getname()

{name;

};


// функция возврата получения поля имя

void System_Term:setname (string newname) {

name = newname;

};


// функция возврата значения поля баланс

int System_Term:getamount()

{balance;

};


// функция получения значения поля балансSystem_Term:setamount (int value) {

balance = value;

};


// функция возврата значения поля номер

int System_Term:getid() {id;

};


// функция получения значения поля номерSystem_Term:setid (int id_value) {

id = id_value;

};


// функция изменения баланса

unsigned int System_Term: change_balance (char *filename, int id_check, int new_balance) {int flag = 0;temp = 0;str=»»;id1 = 0;balance1 = 0;id2 =-1;:ifstream file (filename, std:ios:in);((! file.eof()) && (temp!= 1)) {>> id;>> balance;(id == id_check)

{= 1;(id);(balance);= balance + new_balance;.close();:ifstream file2 (filename, std:ios:in);(! file2.eof())

{>> id1;(id1 == id_check)

{>> balance1;= balance;

}>> balance1;(id1!= id2)=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;= id1;

}.close();:ofstream in (filename, ios:out | ios:trunc);.close();:ofstream fileout2 (filename, std:ios:out);.write (str.c_str(), str.size());.close();= 1;

}

}.close();(temp!= 1)

{= 300;(id_check);(new_balance);:ofstream fileout (filename, std:ios:app);<< std:endl;<< id <<»»;<< balance<< std:endl;.close();

}flag;

};

.2 Описание структур данных и функций


Ниже представлены описания функций-членов класса System_Term.

1)Метод System_Term: System_Term(void) является конструктором класса System_Term. В таблице 1 представлены структуры данных, используемые в данном методе.


Таблица 1 - Структуры данных, используемые в методе System_Term

ИмяТипПредназначениеФормальные переменныеidintНомер счетаbalanceintБалансnamestringИмя

) Метод unsigned int setdata (char *filename, int newid) предназначен для регистрации новых пользователей в системе. В таблице 2 представлены структуры данных, используемые в методе.


Таблица 2 - Структуры данных, используемые в методе setdata

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяnewidintНовый номерЛокальные переменныеflagunsigned intПеременная возникновения ошибкиtempintПеременная проверки

2)Метод void check_balance (char *filename, int id_check) предназначен для проверки баланса по номеру счета. В таблице 3 представлены структуры данных, используемые в методе.


Таблица3 - Структуры данных, используемые в методе check_balance

ИмяТипПредназначениеЛокальные переменныеfilename*charФайловая переменнаяid_checkintНовый номерЛокальные переменныеflagunsigned intПеременная возникновения ошибкиtempintПеременная проверки

4) Метод unsigned int change_balance (char *filename, int id_check, int new_balance) предназначен для изменения баланса. В таблице 4 представлены структуры данных, используемые в методе.


Таблица 4 - Структуры данных, используемые в методе change_balance

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяid_checkintНовый номерnew_balanceintНовый балансЛокальные переменныеflagunsigned intПеременная возникновения ошибкиtempintПеременная проверкиid1intВспомогательные переменные для записи номераbalance1intВспомогательные переменные для записи балансаstrstringВспомогательные переменные для перезаписи файла

) Метод void setname (string newname) присваивает значение полю имя.

) Метод void setamount (int value) присваивает значение полю баланса.

) Метод void setid (int value) присваивает значение полю номер.

) Метод string getname() возвращает значение поля имя.

) Метод void setamount (int value) возвращает значение поля имя.

) Метод void setid (int value) возвращает значение поля номер.

) Метод 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


.1 Формальное описание класса


Ниже представлен код класса Internet из заголовочного файла Internet.h., которые классом - наследником базового класса данной программы.

#define _CRT_SECURE_NO_WARNINGS

#include «System.h»

#pragma once

Internet: public System_Term

{:(void); // конструктор класса

~Internet(); // деструктор класса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;namespace Kurs;



// конструктор: Internet() {=0;=0;

};


// деструктор:~Internet() {

};


// функция оплатыint Internet:pay (char *filename, int id_pay, int balance_pay, string name_pay)

{int flag;str=»»;temp = 0;id2 =-1;{:ifstream file (filename, std:ios:app);(temp!= 1) {>> id;>> balance;(id == id_pay)

{= 1;(id);(balance);(balance >= balance_pay)

{= balance - balance_pay;{:ifstream file2 (filename, std:ios:app);id1 = 0;balance1 = 0;(! file2.eof())

{>> id1;(id1 == id_pay)

{>> balance1;= balance;

}>> balance1;

if (id1!= id2)=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;= id1;

}.close();

}(…) {= 200;;

}:ofstream in (filename, ios_base:trunc);.close();{:ofstream fileout2 (filename, std:ios:app);.write (str.c_str(), str.size());.close();.close();

}(…) {= 200;;

}= 1;

}

{= 300;

}

}

{= 1;= 900;

}

}

}(…) {= 200;;

}

return flag;

};


.2 Описание структур данных и функций


Ниже представлены описания функций-членов класса Internet.

1)Метод Internet: Internet() является конструктором класса Internet. В таблице 5 представлены структуры данных, используемые в данном методе.


Таблица 5 - Структуры данных, используемые в методе Internet

ИмяТипПредназначениеЛокальные переменныеid intНомер счетаbalanceintБаланс

2)Метод unsigned int Internet:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг интернета. В таблице 6 представлены структуры данных, используемые в методе.


Таблица 6 - Структуры данных, используемые в методе pay

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяid_payintНомер оплатыbalance_payintСумма оплатыЛокальные переменныеflagunsigned intПеременная возникновения ошибкиstrstringВспомогательная строка для перезаписи файлаid1intВспомогательная переменнаяbalance1intВспомогательная переменнаяtempintПеременная проверки


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


.1 Формальное описание класса


Ниже представлен код класса TV из заголовочного файла tv.h., которые классом - наследником базового класса данной программы.

#define _CRT_SECURE_NO_WARNINGS

#include «System.h»

#pragma once

TV: public System_Term

{:(void);

~TV();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>

namespace std;namespace Kurs;


// конструткор: TV() {= 0;= 0;

};


// деструктор:~TV() {

};


// функция оплатыint TV:pay (char *filename, int id_pay, int balance_pay, string name_pay)

{int flag = 0;str=»»;temp = 0;id2 =-1;{:ifstream file (filename, std:ios:app);(temp!= 1) {>> id;>> balance;(id == id_pay)

{= 1;(id);(balance);(balance >= balance_pay)

{= balance - balance_pay;{:ifstream file2 (filename, std:ios:app);id1 = 0;balance1 = 0;(! file2.eof())

{>> id1;(id1 == id_pay)

{>> balance1;= balance;

}>> balance1;(id1!= id2)=str + std:to_string(id1)+» «+std:to_string(balance1)+»»;= id1;

}.close();

}(…) {= 200;;

}:ofstream in (filename, ios_base:trunc);.close();{:ofstream fileout2 (filename, std:ios:app);.write (str.c_str(), str.size());.close();.close();

}(…) {= 200;;

}= 1;

}

{= 300;

}

}

{= 1;= 900;

}

}

}(…) {= 200;;

}flag;

};


5.2 Описание структур данных и функций


Ниже представлены описания функций-членов класса TV.

1)Метод TV: TV() является конструктором класса TV. В таблице 7 представлены структуры данных, используемые в данном методе.


Таблица 7 - Структуры данных, используемые в методе TV

ИмяТипПредназначениеЛокальные переменныеid intНомер счетаbalanceintБаланс

2) Метод unsigned int TV:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг телевидения. В таблице 8 представлены структуры данных, используемые в методе.


Таблица 8 - Структуры данных, используемые в методе pay

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяid_payintНомер оплатыbalance_payintСумма оплатыЛокальные переменныеflagunsigned intПеременная возникновения ошибкиstrstringВспомогательная строка для перезаписи файлаid1intВспомогательная переменнаяbalance1intВспомогательная переменнаяtempintПеременная проверки

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


.1 Формальное описание класса


Данный класс является наследником абстрактного базового класса System_Term.

Ниже представлен код класса mobile из заголовочного файла mobile.h., который является классом - наследником базового класса данной программы.

#define _CRT_SECURE_NO_WARNINGS

#include «System.h»

#pragma once

mobile: public System_Term

{:(void);

~mobile();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>

namespace std;namespace Kurs;


// конструктор класса:mobile(void) {= 0;= 0;= «»;

};


// деструктор класса:~mobile() {

};


// функция оплатыint mobile:pay (char *filename, int id_pay, int balance_pay, string name_pay) {int flag;(id);(name_pay);= 1;= id_pay;= balance_pay;{:ofstream fileout (filename, std:ios:app);<< std:endl;<< name_pay <<»»;<< id <<»»;<< balance << std:endl;.close();

}(…) {= 200;;

}flag;

};


.2 Описание структур данных и функций


Ниже представлены описания функций-членов класса mobile.

1)Метод mobile: mobile() является конструктором класса mobile. В таблице 9 представлены структуры данных, используемые в данном методе.


Таблица 9 - Структуры данных, используемые в методе mobile

ИмяТипПредназначениеЛокальные переменныеid intНомер счетаbalanceintБаланс

2) Метод unsigned int mobile:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг мобильной связи. В таблице 10 представлены структуры данных, используемые в методе.


Таблица 10 - Структуры данных, используемые в методе pay

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяid_payintНомер оплатыbalance_payintСумма оплатыname_paystringОператорЛокальные переменныеflagunsigned intПеременная возникновения ошибкиstrstringВспомогательная строка для перезаписи файлаbalance1intВспомогательная переменнаяtempintПеременная проверки

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


.1 Формальное описание класса


Данный класс является наследником абстрактного базового класса System_Term.

Ниже представлен код класса mobile из заголовочного файла Home.h., которые классом - наследником базового класса данной программы.

#define _CRT_SECURE_NO_WARNINGS

#include «System.h»

#pragma once

mobile: public System_Term

{:(void);

~mobile();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>

namespace std;namespace Kurs;


// констурктор: Home(void) {= 0;= 0;= «»;

};


// дестуктор:~Home() {

};


// функция оплатыint Home:pay (char *filename, int id_pay, int balance_pay, string name_pay)

{int flag = 0;temp = 0;filetemp = 0;{:ifstream file (filename, std:ios:app);((! file.eof())&&(filetemp!= 1)) {>> id;>> balance;>> name;(id!= id_pay)

{= 1;

}

{= 0;= 1;= 300;

}

}.close();

}(…) {= 200;;

}(temp == 1) {= 1;= id_pay;= balance_pay;= name_pay;{:ofstream fileout (filename, std:ios:app);<< id << «»;<< balance << «»;<< name << std:endl;.close();

}(…) {= 200;;

}

}flag;

};


7.2 Описание структур данных и функций


Ниже представлены описания функций-членов класса Home.

1)Метод Home: Home () является конструктором класса Home. В таблице 11 представлены структуры данных, используемые в данном методе.


Таблица 11 - Структуры данных, используемые в методе Home

ИмяТипПредназначениеЛокальные переменныеid intНомер счетаbalanceintБалансnamestringФамилия клиента

2)Метод unsigned int Home:pay (char *filename, int id_pay, int balance_pay, string name_pay) предназначен для оплаты услуг ЖКХ. В таблице 12 представлены структуры данных, используемые в методе.


Таблица 12 - Структуры данных, используемые в методе pay

ИмяТипПредназначениеФормальные переменныеfilename*charФайловая переменнаяid_payintНомер оплатыbalance_payintСумма оплатыname_paystringФамилияЛокальные переменныеflagunsigned intПеременная возникновения ошибкиstrstringВспомогательная строка для перезаписи файлаid1intВспомогательная переменнаяbalance1intВспомогательная переменнаяtempintПеременная проверки

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. Демонстрационная программа


.1 Текст программы


Данная программа является приложением Windows Form в Visual Studio 2012. Программа реализована с помощью 5 форм:

-Form1 - для работы с услугами интернета

-MForm - для работы с услугами мобильной связи

-TvForm - для работы с услугами телевидения

-HomeForm - для работы с услугами ЖКХ

-MainForm - для основного окна программы

Далее представлен текст программы для работы с окном оплаты интернета.

Кнопка «Баланс»:

private: System: Void button11_Click (System: Object^ sender, System: EventArgs^ e) {(textBox1->Text!=»») {int flag;(textBox1->Text!=»») {>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename))

{>check_balance («1.txt», Convert: ToInt32 (textBox1->Text));->Enabled=0;(flag!= 300) {->Text=»»;4->Text= «Баланс вашего лицевого счета \n»;

label4->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;->Text=»»;->Text= «Баланс вашего лицевого счета \n»;->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;

}

{->Text=»»;->Text= «Ваш счет не найден в базе! Пожалуйста зарегистрируйтесь!\n»;

}(flag == 200)

{: Show («Ошибка открытия файла!», «Ошибка»);;

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

button10->Enabled=1;->Text=»»;->Text= «0»;

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

}

Кнопка «Пополнить счет»:

private: System: Void button9_Click (System: Object^ sender, System: EventArgs^ e) {((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {(textBox1->Text == «») {

MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);

exit;

}

{= internet->change_balance («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text));->Enabled=0;->Visible=1;(flag!= 300)

{->Text=»»;->Text= «Операция прошла успешно! Ваш лицевой счет пополнен! \n»;

label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;;

}

{->Text=»»;->Text= «Вы завели новый лицевой счет! \n»;->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;;

}(flag == 200)

{

MessageBox: Show («Ошибка открытия файла!», «Ошибка»);

exit;

}

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

button10->Enabled=1;

}


Кнопка «Регистрация»:


private: System: Void button8_Click (System: Object^ sender, System: EventArgs^ e) {(textBox1->Text!=»») {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {= internet->setdata («1.txt», Convert: ToInt32 (textBox1->Text));->Enabled=0;(flag == 300)

{->Text=»»;

label4->Text= «Данный лицевой счет уже был зарегистрирован! \n»;->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;

}

{->Text=»»;->Text= «Поздравляем! Вы завели новый лицевой счет! \n»;->Text=label4->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+internet->getamount()+» \n»;

exit;

}

}

{: Show («Вы заполнили не все поля! Пожалуста проверьте ввод!», «Ошибка»);;

}

}->Enabled=1;->Text=»»;->Text= «0»;

}


Кнопка «Оплатить»:

private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {

if ((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {(textBox1->Text == «») {

MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);

exit;

}

{= internet->pay («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), "»);->Visible=1;((flag!= 300)&&(flag!= 900))

{->Text=»»;->Text= «Операция прошла успешно!\n»;

label9->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;

exit;

}

{(flag == 900)

{: Show («Данная учетная запись не была зарегистрирована ранее! Пожалуйста пройдите регистрацию!», «Ошибка»);;

}

{->Text=»»;: Show («На вашем лицевом счете недостаточно средств! Пополните счет!», «Ошибка»);->Text=label9->Text+«Ваш лицевой счет: «+internet->getid()+» \n»;

label9->Text=label9->Text+«Ваш баланс: «+internet->getamount()+» \n»;;

}(flag == 200)

{: Show («Ошибка открытия файла!», «Ошибка»);

exit;

}

}

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

}

Далее представлен текст программы для работы с окном оплаты телевидения.

Кнопка «Баланс»:

private: System: Void button11_Click (System: Object^ sender, System: EventArgs^ e) {(textBox1->Text!=»») {int flag;(textBox1->Text!=»») {>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;

this->openFileDialog1->FilterIndex = 1;

filename = this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename))

{>check_balance («1.txt», Convert: ToInt32 (textBox1->Text));->Enabled=0;(flag!= 300) {->Text=»»;4->Text= «Баланс вашего лицевого счета \n»;

label4->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;->Text=»»;->Text= «Баланс вашего лицевого счета \n»;->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;

}

{->Text=»»;->Text= «Ваш счет не найден в базе! Пожалуйста зарегистрируйтесь!\n»;

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

button10->Enabled=1;->Text=»»;->Text= «0»;

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

}

Кнопка «Пополнить счет»:

private: System: Void button9_Click (System: Object^ sender, System: EventArgs^ e) {((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {(textBox1->Text == «») {

MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);

exit;

}

{((Convert: ToInt32 (textBox2->Text)%10!= 0)||(Convert: ToInt32 (textBox2->Text)%10 > 10000)||(Convert: ToInt32 (textBox2->Text)%10 < 0))

{: Show («Пожалуйста проверьте ввод суммы! Сумма должна быть неотрицательной и кратной 10!», «Ошибка»);

exit;

}

{= tv->change_balance («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text));->Enabled=0;->Visible=1;((flag!= 300)&&(flag!= 900))

{->Text=»»;->Text= «Операция прошла успешно! Ваш лицевой счет пополнен! \n»;

label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;;

}

{->Text=»»;->Text= «Вы завели новый лицевой счет! \n»;->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;

exit;

}

}

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);

textBox2->Text= «0»;->Text=»»;->Enabled=1;

}


Кнопка «Регистрация»:


private: System: Void button8_Click (System: Object^ sender, System: EventArgs^ e) {(textBox1->Text!=»») {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {= tv->setdata («1.txt», Convert: ToInt32 (textBox1->Text));->Enabled=0;(flag == 300)

{->Text=»»;

label4->Text= «Данный лицевой счет уже был зарегистрирован! \n»;->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;

}

{->Text=»»;->Text= «Поздравляем! Вы завели новый лицевой счет! \n»;

label4->Text=label4->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label4->Text+«Ваш баланс: «+tv->getamount()+» \n»;

exit;

}

}

{: Show («Вы заполнили не все поля! Пожалуста проверьте ввод!», «Ошибка»);;

}

}->Enabled=1;->Text=»»;->Text= «0»;

}


Кнопка «Оплатить»:


private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {((textBox1->Text!=»»)&&(textBox2->Text!=»»)) {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {(textBox1->Text == «») {

MessageBox: Show («Пожалуйста введите номер лицевого счета!», «Ошибка»);

exit;

}

{((Convert: ToInt32 (textBox2->Text)%10!= 0)||(Convert: ToInt32 (textBox2->Text)%10 > 10000)||(Convert: ToInt32 (textBox2->Text)%10 < 0))

{: Show («Пожалуйста проверьте ввод суммы! Сумма должна быть неотрицательной и кратной 10!», «Ошибка»);

exit;

}

{= tv->pay («1.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), "»);->Visible=1;((flag!= 300)&&(flag!= 900))

{->Text=»»;->Text= «Операция прошла успешно!\n»;

label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;

exit;

}

{(flag == 900)

{: Show («Данная учетная запись не была зарегистрирована ранее! Пожалуйста пройдите регистрацию!», «Ошибка»);;

}

{->Text=»»;: Show («На вашем лицевом счете недостаточно средств! Пополните счет!», «Ошибка»);

label9->Text=label9->Text+«Ваш лицевой счет: «+tv->getid()+» \n»;

label9->Text=label9->Text+«Ваш баланс: «+tv->getamount()+» \n»;;

}

}

}

}

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);->Text=»»;->Text= «0»;

}


Далее представлен текст программы для работы с окном оплаты услуг мобильной связи.

Кнопка «Оплатить»:

private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e) {str1;(textBox1->Text!=»») {int flag;>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {(textBox1->Text ==»») {

MessageBox: Show («Пожалуйста введите свой номер!», «Ошибка»);

exit;

}

{(Convert: ToInt32 (textBox2->Text)%10!= 0)

{: Show («Сумма должна быть кратна 10!», «Ошибка»);

exit;

}

{((label2->Text), str1);= mobile_l->pay («3.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), str1);->Visible=1;->Text=»»;->Text= «Баланс вашего счета успешно пополнен \n»;->Text=label1->Text+«Ваш номер: «+label2->Text+mobile_l->getid()+» \n»;->Text=label1->Text+«Ваш баланс: «+mobile_l->getamount()+» \n»;

}

}

}

}: Show («Пожалуйста введите свой номер и сумму оплаты!», «Ошибка»);

button2->Enabled = 1;->Enabled = 1;->Enabled = 1;

}


Далее представлен текст программы для работы с окном оплаты услуг ЖКХ.

Кнопка «Оплатить»:

private: System: Void button1_Click (System: Object^ sender, System: EventArgs^ e) {str1;int flag;((textBox1->Text!=»»)&&(textBox2->Text!=»»)&&(textBox3->Text!=»»)) {((textBox3->Text), str1);>openFileDialog1->Filter = «txt files (*.txt)|*.txt|Все файлы (*.*)|*.*»;>openFileDialog1->FilterIndex = 1;= this->openFileDialog1->FileName;(! filename->IsNullOrEmpty(filename)) {= home->pay («4.txt», Convert: ToInt32 (textBox1->Text), Convert: ToInt32 (textBox2->Text), str1);(flag == 1)

{->Text=»»;->Text= «Операция прошла успешно!\n»;->Text=label1->Text+«Ваш счет: «+home->getid()+» \n»;->Text=label1->Text+«Ваше имя: «+textBox3->Text+» \n»;->Text=label1->Text+«Ваш баланс: «+home->getamount()+» \n»;;

}

{->Visible = 0;->Text=»»;

label1->Text= «Операция не прошла! Обратитесь в службу жилищно-комунального хозяйства и уточните информацию!\n»;: Show («Данная учетная запись была зарегистрирована ранее!», «Ошибка»);;

}

}: Show («Вы не ввели все данные! Пожалуйста заполните все поля!», «Ошибка»);->Text= «0»;

}

}


.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 с.

.Подбельский В.В. Язык Си++: Уч. пос. - 5-е изд. - М.: Финансы и статистика, 2002. - 560 с.

.Страуструп Б. Язык программирования Си++. Специальное издание. - М.: BHV, 2008. - 1104 с.

.Хомоненко А.Д. Программирование на С++: М.: ЗАО «Издательство БИНОМ», 1998. - 520 с.


Разработка классов C++, программно реализующих функциональность терминала оплаты услуг связи / телевидения / инт

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ