Файл: Проектирование классов для обработки файлов данных.pdf

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

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

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

Добавлен: 03.04.2023

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

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

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

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

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

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

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

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

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

        1. Ключарев А.А., Матьяш В.А., Щекин С.В. Структуры и алгоритмы обработки данных: Учебное пособие / СПбГУАП. СПб., 2004.
        2. Колдаев В.Д. Основы алгоритмизации и программирования: Учебное пособие / Колдаев В.Д; Под ред. проф.Л.Г. Гагариной - М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2016. - 416 с.
        3. Павловская Т. А. C/C++. Программирование на языке высокого уровня: учебник. СПб. : ПИТЕР, 2007. - 461 с.
        4. Страуструп, Б. Язык программирования C++ [Текст] = The C++ Programming Language : специальное издание / Б. Страуструп ; пер.: С. Анисимов, М. Кононов ; ред.: Ф. Андреев, А. Ушаков. - [Б. м.] : Бином-Пресс, 2008. - 1098 с.
        5. Кнут, Д. Искусство программирования [Текст] = The art of computer programming: [в 3 т.]. Т. 1. Основные алгоритмы / Д. Кнут ; ред. Ю. В. Козаченко. - 3-е изд. - М. : Вильямс, 2014. - 720 с.
        6. Демидович, Е.М. Основы алгоритмизации и программирования. Язык СИ [Текст] : учебное пособие / Е. М. Демидович. - 2-е изд., испр. и доп. - СПб. : БХВ - Петербург, 2008. - 440 с.
        7. Вирт, Н Алгоритмы и структуры данных. Новая версия для Оберона + CD [Текст] / Н. Вирт ; пер. Д. Б. Подшивалов. - 2-е изд., испр. - М. : ДМК Пресс, 2012. - 272 с.

Приложение 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;

}

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

set<string> zodiaks = { "овен", "телец", "близнецы", "рак", "лев", "дева", "весы",

"скорпион", "стрелец", "козерог", "водолей", "рыбы" };

class ZNAK

{

public:

string name; // фамилия, имя

string zodiak; // знак зодиака

int birthday[3]; // дата рождения

ZNAK() {}

// Ввод данных - фамилия, имя, знак зодиака и дата рождения

void inputData()

{

// проверки добавляются в соответствии с заданной предметной областью

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

string name, surname;

cout << "Введите фамилию: ";

getline(cin, surname);

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

{

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

}

}

// вспомог. функция для вывода одной записи в поток os

void printData(ostream &os)

{

os << this->name << " " << this->zodiak << " " << this->birthday[0]

<< "." << this->birthday[1] << "." << this->birthday[2] << endl;

}

};

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;

}

};

// Редактирование списка

void UpdateElem(List** ptr, ZNAK r2)

{

List* p = *ptr;

p->data.birthday[0] = r2.birthday[0];

p->data.birthday[1] = r2.birthday[1];

p->data.birthday[2] = r2.birthday[2];

p->data.name = r2.name;

p->data.zodiak = r2.zodiak;

}

// Добавление элемента в конец списка

void AddElem(List** begin, List** cur, ZNAK elem)

{

List* p = new List;

p->data = elem; //проверка, является ли список пустым

if (*begin == NULL)

{

p->next = NULL;

*begin = p;

}

else

{

p->next = (*cur)->next;// или p->next = NULL;

(*cur)->next = p;

}

*cur = p;

}

// Добавление элемента в начало списка

void AddFirstElem(List** begin, ZNAK elem)

{

List* p = new List;

p->data = elem; //проверка, является ли список пустым

if (*begin == NULL)

{

p->next = NULL;

}

else

{

p->next = *begin;

}

*begin = p;

}

// Удаление элемента из списка

void DelElem(List** begin, List* ptrCur)

{

List* p;

if (ptrCur == *begin)

{

// удаляем первый элемент

*begin = (*begin)->next;

}

else

{

// устанавливаем вспомогательный указатель на элемент, предшествующий удаляемому

p = *begin;

while (p->next != ptrCur)

p = p->next; // удаление элемента

p->next = ptrCur->next;

}

delete ptrCur;

}

// Очистка памяти

void Free(List** begin)

{

if (*begin == 0)

return;

List* p = *begin;

List* t;

while (p)

{

t = p;

p = p->next;

delete t;

}

*begin = NULL;

}

int main()

{

List* head = NULL;

List* cur = NULL;


setlocale(LC_CTYPE, "Russian");

int n = -1;

ZNAK r;

// Меню пользователя

while (n != 0)

{

cout << endl << "1 - Добавить в конец" << endl <<

"2 - Вывод списка" << endl <<

"3 - Добавить в начало" << endl <<

"4 - Поиск" << endl <<

"5 - Поиск по фамилии" << endl <<

"6 - Удаление" << endl <<

"7 - Редактировать" << endl <<

"8 - Сохранить в файл" << endl <<

"9 - Считать из файла" << endl <<

"0 - Выход\nВыберите действие: ";

cin.clear();

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

cin >> n;

while (cin.fail() || (n < 0) || (n > 9))

{

cin.clear();

cin.sync();

cout << "Ошибка ввода, выберите действие: ";

cin >> n;

}

switch (n)

{

case 1:

{

r.inputData();

AddElem(&head, &cur, r);

break;

}

case 2:

{

if (head)

head->PrintList(cout);

else

cout << "Нет данных!" << endl;

break;

}

case 3:

{

r.inputData();

AddFirstElem(&head, r);

break;

}

case 4:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

ptr->data.printData(cout);

break;

}

case 5:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

string surname;

cin.clear();

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

cout << "Введите фамилию: ";

getline(cin, surname);

surname = std::string(RUS(surname.c_str()));

head->FindElem(surname);

break;

}

case 6:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

{

DelElem(&head, ptr);

cout << "Запись удалена!" << endl;

};

break;

}

case 7:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

{

ZNAK r2;

r2.inputData();

UpdateElem(&ptr, r2);

cout << "Запись отредактирована!" << endl;

};

break;

}

case 8:

{

string fname;

cin.clear();

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

cout << "Введите имя файла для сохранения списка: ";

getline(cin, fname);

ofstream file;

file.open(fname);

while (!file.is_open())

{

cin.clear();

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

cout << "Невозможно открыть файл для сохранения списка! Введите имя файла для сохранения списка: ";

getline(cin, fname);

}

if (head)

{

head->PrintList(file);

cout << "Список сохранен в файл!" << endl;

}

else

file << "Нет данных!" << endl;

file.close();

break;

}

case 9:

{

string fname;

cin.clear();

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

cout << "Введите имя файла для открытия списка: ";

getline(cin, fname);

ifstream file;

file.open(fname);

while (!file.is_open())

{

cin.clear();