Файл: Применение объектно-ориентированного подхода при проектировании информационной системы.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 91

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите фамилию: ";

getline(cin, surname);

}

cout << "Введите имя: ";

getline(cin, name);

while (cin.fail() || isEmpty(name))

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите имя: ";

getline(cin, name);

}

this->name = surname + " " + name;

this->name = std::string(RUS(this->name.c_str()));

cout << "Введите знак зодиака (строчными буквами): ";

getline(cin, this->zodiak);

this->zodiak = std::string(RUS(this->

zodiak.c_str()));

while (cin.fail() || isEmpty(this->zodiak) || zodiaks.find(this->

zodiak) == zodiaks.end())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите знак зодиака (строчными буквами): ";

getline(cin, this->zodiak);

this->zodiak = std::string(RUS(this->

zodiak.c_str()));

}

cout << "День рождения: ";

cin >> this->birthday[0];

while (cin.fail() || this->birthday[0] < 1 || this->birthday[0] > 31)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. День рождения: ";

cin >> this->birthday[0];

}

cout << "Месяц рождения: ";

cin >> this->birthday[1];

while (cin.fail() || this->birthday[1] < 1 || this->birthday[1] > 12)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Месяц рождения: ";

cin >> this->birthday[1];

}

cout << "Год рождения: ";

cin >> this->birthday[2];

while (cin.fail() || this->birthday[2] < 1900 || this->birthday[2] > 2019)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Год рождения: ";

cin >> this->birthday[2];

}

}

void printData(ostream &os)

{

os << this->name << " " << this->zodiak << " " << this->birthday[0] << "." << this->birthday[1] << "." << this->birthday[2] << endl;

}

};

Здесь функция-член класса inputData осуществляет ввод информации о сотруднике с клавиатуры, а функция-член printData позволяет вывести данные на экран (при использовании оператора cout в качестве параметра функции) или в файл (если используется объект класса ofstream). Кроме того, обрабатываются накладываемые на используемые типы данных ограничения:

  • имя и фамилия сотрудника не могут быть пустыми или состоять только из пробельных символов;
  • название знака зодиака должно быть существующим (то есть являться элементом множества допустимых значений, которое представлено контейнером стандартной библиотеки языка set);
  • день рождения должен быть целым числом от 1 до 31, месяц – от 1 до 12, год – от 1900 до 2019.

При недопустимом формате введенных данных предусмотрена выдача сообщений об ошибках и повторный ввод. Все необходимые проверки корректности ввода осуществляются в заголовках цикла while.


Файл может быть сохранен на диске в текстовом формате в кодировке cp1251 (ANSI). Для корректного отображения кириллических символов считанных данных на экране или в сохраняемом текстовом файле (при открытии его в текстовом редакторе) используется функция RUS (листинг 10), осуществляющая перекодировку в ANSI из кодировки cp866.

Листинг 10. Функция для конвертирования символов

char *RUS(const char *str)

{

static char buf[512];

OemToCharA(str, buf);

return buf;

}

Для работы с большим объемом данных (информации о нескольких сотрудниках) используется однонаправленный линейный список, каждый узел которого состоит из поля данных (представленного объектом класса ZNAK из листинга 1) и указателя на следующий элемент списка (рисунок 3). Исходный код класса, на базе которого реализован список, представлен в листинге 2. Внутри класса также находятся функции для поиска сотрудника и вывода данных на экран или в файл.

Рисунок 3 – Схема линейного односвязного списка

Листинг 2. Класс List для работы с информацией о сотрудниках

class List

{

public:

ZNAK data;

List* next;

List(){}

void PrintList(ostream &os)

{

List* p = this;

while (p != NULL)

{

p->data.printData(os);

p = p->next;

}

}

List* FindElem(ZNAK elem)

{

List* p = this;

while (p != NULL)

{

if ((p->data.name.compare(elem.name) == 0) && (p->data.zodiak.compare(elem.zodiak) == 0)

&& (p->data.birthday[0] == elem.birthday[0]) && (p->data.birthday[1] == elem.birthday[1])

&& (p->data.birthday[2] == elem.birthday[2]))

break;

p = p->next;

}

return p;

}

void FindElem(string sur)

{

List* p = this;

bool f = false;

while (p != NULL)

{

string surname = p->data.name.substr(0, p->

data.name.find(" "));

if (surname.compare(sur) == 0)

{

f = true;

p->data.printData(cout);

}

p = p->next;

}

if (!f)

cout << "Данные не найдены" << endl;

}

};

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

Тестирование программы

Результатом тестирования приложения является набор тестов, на которых была проверена работа спроектированной программы, в виде входных текстов, предъявленных программе, и текстов ее ответных реакций. Для демонстрации программы необходимо подготовить тестовый набор данных. Объем этих данных должен быть достаточным для демонстрации всех функций разработанной программы с учетом проверок и обработки исключительных ситуаций [4.]. В общем виде необходим набор тестов (ручное тестирование), на которых была проверена работа спроектированной программы. В данной работе тестирование приводится в виде набора снимков экрана с комментариями.


Для тестирования программы необходимо запустить файл ProjectZNAK.exe. На экране появится окно консольного приложения, в котором отображаются пункты меню (рисунок 4). При нажатии на клавиатуре на определенную цифру выполняется соответствующая функция.

При попытке вывести содержимое списка программа сообщит об ошибке, поскольку список пуст, после чего предложит выбрать команду меню еще раз (рисунок 5).

На рисунке 6 продемонстрирован вид окна программы в процессе добавления записи в конец списка. Как видно из рисунка, программа обрабатывает любые некорректные значения, предлагая пользователю выполнить повторный ввод.

Рисунок 4 – Вид окна программы при запуске

Рисунок 5 – Вид окна программы при попытке печати пустого списка

Для того, чтобы иметь возможность манипулировать данными входного файла, необходимо считать информацию из файла в список. Рисунок 8 иллюстрирует процесс чтения файла «people.txt» с некоторыми данными о сотрудниках и добавления этих данных в список.

Добавление новых данных при чтении из входного файла выполняется в конец списка. При этом строки, не являющиеся набором атрибутов, корректно описывающих сотрудника, просто игнорируются. Для того, чтобы в этом убедиться, достаточно посмотреть на содержимое входного файла «peoples.txt» (рисунок 7) и на вид списка после выполнения команды вывода на экран, который приведен на рисунке 9.

Рисунок 6 – Вид окна программы после добавления элемента в список

Рисунок 7 – Содержимое входного файла "peoples.txt"

Рисунок 8 – Вид окна программы после чтения данных из входного файла

Рисунок 9 – Вид окна программы после вывода списка сотрудников на экран

На рисунке 10 продемонстрирован вид окна программы после добавления одной записи в начало списка и печати списка перед удалением одной из записей (на экране шесть записей) и после него (пять записей на экране).

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

Вид окна программы в процессе редактирования последней добавленной записи и после вывода отредактированного списка на экран представлен на рисунке 12. Как следует из рисунка, запись «Петров Иннокентий весы 8.10.1999» была заменена на «Абрамов Станислав стрелец 5.12.1998».


На рисунке 13 приведен вид окна программы и содержимого файла «db.txt» после ввода команды сохранения списка в этот файл.

Рисунок 10 – Вид окна программы после удаления элемента из списка и печати списка

Рисунок 11 – Вид окна программы после поиска сотрудника по фамилии

Рисунок 12 – Вид окна программы после редактирования информации о сотруднике и вывода списка на экран

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

Рисунок 13 – Вид окна программы и содержимого выходного файла после сохранения списка

ЗАКЛЮЧЕНИЕ

В ходе выполнения курсового проекта была изучена и проанализирована учебно-методическая документация, учебная литература и интернет по выбранной теме.

В работе были изучены базовые концепции структурного и объектно-ориентированного программирования, выявлены сходства и различия между ними. Было отмечено, что объектно-ориентированное программирование – это подход, который способствует быстрой разработке сложных приложений и повторному использованию программного обеспечения. Объектно-ориентированное программирование – это метод написания программ с использованием объектов. Объектно-ориентированные языки развились из необходимости моделировать процессы реального мира и смогли предоставить общие механизмы для создания программных модулей, поведение которых может быть индивидуальным или специализированным.

На объектно-ориентированном языке программирования высокого уровня C++ было разработано приложение для предметной области «Информация о сотрудниках», выполняющее ряд функций: программа позволяет вводить информацию, осуществлять поиск, модификацию и удаление данных. Предусмотрена возможность сохранения данных в файл и их чтение из файла. Программа имеет понятный консольный интерфейс, выводит все необходимые пояснения и подсказки, является законченной и удобной для использования.

В ходе работы были выполнены все поставленные задачи:

  • получено представление об основных принципах объектно-ориентированного программирования;
  • выявлены ключевые особенности проектирования программы, позволяющие вводить информацию, хранить её в файле, а также осуществлять модификацию данных;
  • выполнена реализация и отладка разработанной информационно-справочной системы, а также проведено ее тестирование. По результатам тестов получен вывод о том, что все необходимые функции работают корректно.

Таким образом, все поставленные в курсовой работе цели и задачи были выполнены в полном объеме.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

        1. Кнут Д. Искусство программирования // The art of computer programming: [в 3 т.]. Т.1. Основные алгоритмы / Д. Кнут; ред. Ю. В. Козаченко. - 3-е изд. - М.: Вильямс, 2014. - 720 с.
        2. Оберг Р.Д., Торстейнсон П. Архитектура .NET и программирование с помощью Visual C++ / Р.Д. Оберг, П. Торстейнсон пер.с англ. М.:Издательский дом "Вильям", 2002. - 656 с.
        3. Страуструп Б. Язык программирования C++: специальное издание / Б. Страуструп; пер.: С. Анисимов, М. Кононов; ред.: Ф. Андреев, А. Ушаков. - [Б. м.]: Бином-Пресс, 2008. - 1098 с.
        4. Шилдт Г. Полный справочник по С, 4-ое издание / Г. Шилдт пер. с англ. – М.: Издательский дом «Вильямс», 2015. – 704 с.
        5. Abott, R. Program Design by Informal English Descriptions, CACM, 1993, Vol. 26 No. 11, pp. 892 - 894.
        6. Biddle, R. L., Tempero, E. D., Teaching C++ Experience at Victoria University of Wellington, 1994, In Proceedings of Software Education Conference, Dunedin, New Zealand, pp. 274 - 281.
        7. Champeaux, D. D., Panel: Structured Analysis and Object-Oriented Analysis, ECOOP/OOPSLA ’90 Proceedings, pp. 135 - 139.
        8. Deitel, P. J., Deitel, H. M., Java – How to Program, USA, Pearson Inc., 7th Ed., 2007, pp. 421 - 423.
        9. Hubbard, J. R., Programming with C++ Schaum’s Outlines, New York, 2005, McGraw-Hill Companies, Inc., pp. 273 – 299
        10. Istatkova, G. Algebra of Algorithms in Procedural and Object-Oriented, structured Programming, Automatica & Informatics, 2001, Vol.3, No. 4, pp. 56 - 62.
        11. Louden, K. C., Programming Languages: Principles and Practice, Boston, 1993, PWS Publishing Company, pp. 300 - 345.
        12. Owolabi, O., Ndeekor, C. B. Structured Programming with Pascal, Aba, 2005, Granite Ventures Nig. Ltd, pp. 19 - 21.
        13. Pressman, R. S., Software Engineering: A Practitioner’s Approach, New York, 2005, McGrawHill International 6th Ed., pp. 217 - 218.

ПРИЛОЖЕНИЕ 1. ИСХОДНЫЙ КОД ПРОГРАММЫ

//Работа с линейным однонаправленным списком

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

#ifdef _DEBUG

#ifndef DBG_NEW

#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

#define newDBG_NEW

#endif

#endif

#include <iostream>

#include <string>

#include <set>

#include <iomanip>

#include <sstream>

#include <fstream>

#include <windows.h>

using namespace std;

// вспомог. функция для проверки строки на пустоту

bool isEmpty(const string& str) { return str.find_first_not_of(' ') == str.npos || str.empty(); }

// вспомог. функция для перекодировки из cp866 в ANSI (при сохранении в файл и выводе на экран)

char *RUS(const char *str)

{

static char buf[512];

OemToCharA(str, buf);

return buf;

}

// множество, содержащее названия знаков зодиака