Разработка программного комплекса для ведения учёта памятников города

Проектирование программного комплекса на языке С++ с использованием принципов объектно-ориентированного программирования. Разработка разных меню, помогающих пользователю работать с программой. Описание процесса формирования статистики по памятникам.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 01.12.2016
Размер файла 799,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

СОДЕРЖАНИЕ

Введение

1. ОПИСАНИЕ ПРОГРАММНОГО КОМПЛЕКСА

1.1 Структура программного комплекса

1.2 Модуль ClassFile.cpp

1.2.1 Класс Pamiatnik

1.2.2 Класс Zdanie

1.2.3 Класс Kvartal

1.2.4 Класс Square

1.2.5 Класс Skulptura

1.2.6 Класс Massiv_Pamiatnikov

1.3 Модуль FunctionFile.cpp

1.4 Модуль main.cpp

2. Описание работы программы по контрольному примеру

2.1 Описание процесса сортировки памятников

2.2 Описание процесса поиска в массиве памятников

2.3 Описание формирования статистики по памятникам

Заключение

Список использованных источников

Приложения

Введение

Целью курсовой работы является: изучение принципов объектно-ориентированного программирования на базе языка программирования С++; приобретение навыков высокоуровневого проектирования многомодульных программ.

Заданием для курсовой работы является разработка программного комплекса на языке программирования С++ с использованием принципов объектно-ориентированного программирования.

Согласно индивидуальному заданию необходимо разработать программный комплекс для ведения учёта памятников города. Множество памятников представляют собой массив, элементами которого являются любые из следующих четырех типов памятников: здание, квартал, площадь, скульптура.

Для всех памятников имеются как общие данные, так возможно и специфические.

Общие данные содержат следующие поля:

1) год создания (integer);

2) название (string);

3) годовая стоимость расходов на содержание (longint);

По заданию программный комплекс должен быть способен выполнять следующие действия:

· Загрузка массива памятников из текстового файла в формате csv (файл в котором данные разделённые символом «;», причём одна строка задаёт один элемент массива;

· Сохранения массива памятников в файл формата csv;

· Просмотр всех элементов массива (один элемент на одной строке);

· Добавление новых элементов в массив как вручную, так и из заданного файла;

· Удаление элементов из массива;

· Получение трёх отчётов;

При выполнении работы необходимо придерживаться следующих ограничений:

· Обязательно использовать объектно-ориентированный подход при проектировании приложений;

· Все поля классов, описывающих элемент множества данных должны быть private;

· Год создания, название памятника и стоимость расходов на содержание включить в базовый класс. Разработать наследуемые классы для здания, квартала, площади и скульптуры.

· Классы для элементов множества данных должны содержать конструкторы следующих видов: а) конструктор без параметров, очищающий переменные объекта класса; б) конструктор, инициализирующий все переменные класса, значениями, заданными в качестве параметра; в) конструктор приведения из строки символов (поля класса, разделенные символом ";");

· В наследуемых классах переопределить хотя бы один метод базового класса;

· Интерфейс разработанных классов продемонстрировать в форме консольного приложения;

· Выводить отчеты в виде таблицы (одна запись - одна строка таблицы).

1. ОПИСАНИЕ ПРОГРАММНОГО КОМПЛЕКСА

1.1 Структура программного комплекса

Программный комплекс состоит из следующих модулей:

? ClassFile.cpp;

? FunctionFile.cpp;

? main.cpp.

? global.h.

На рисунке 1 показана схема подключения модулей.

Размещено на http://www.allbest.ru/

Рисунок 1 - Схема подключения модулей

Модуль ClassFile.cpp содержит описание всех используемых в программе классов. А точнее базовый класс памятника и четыре его наследника (здание, квартал, площадь и скульптура), а также класс оболочка, который содержит динамический массив и все функции для работы с массивом памятника (добавление, удаление, сортировка и т.д.) Модуль FunctionFile.cpp содержит различные вспомогательные функции. Это и вывод на экран различных частей таблицы и вывод различных меню, а также выбор имени файла. Модуль main.cpp содержит точку входа в программу, в которой находится оператор switch для выбора необходимых действий.

Файл global.h является связующим звеном, где описаны все стандартные библиотеки и функции из файла FunctionFile.cpp

1.2 Модуль ClassFile.cpp

В модуле описаны следующие классы:

? Pamiatnik;

? Zdanie;

? Kvartal;

? Square;

? Skulptura;

? Massiv_Pamiatnikov.

Иерархия классов представлена на рисунке 2.

Размещено на http://www.allbest.ru/

Рисунок 2 - Иерархия классов

1.2.1 Класс Pamiatnik

Класс Pamiatnik является базовым классом для всех памятников. Именно поэтому он содержит все общие поля и все общие методы. Ко всему прочему данный класс считается абстрактным, т.е. нельзя непосредственно создавать экземпляры этого класса. Данный класс предназначен только как шаблон для создания других классов памятника. Однако, несмотря на это, он содержит в себе множество методов, которые могут вызывать наследники.

Класс Pamiatnik содержит следующие поля:

- Set_God - Год основания памятника;

- Set_Stoimost - Стоимость расходов на содержание памятника;

- Set_Name - Название памятника;

- Type - Тип памятника. Используется для того, чтобы каждому памятнику присвоить соответствующее значение в данном поле. Значение именно из этого поля будет использоваться каждым классом, когда он будет создавать строковое представление всех своих ключевых полей для сохранения в файл.

- prev - указатель на предыдущий памятник в массиве.

- next - указатель на следующий памятник в массиве.

Поля prev и next предназначены для построения динамического массива. Принцип динамического массива заключается в том, что все его элементы не обязаны находиться в памяти последовательно друг за другом. Однако все элементы массива должны быть выстроены в определённую последовательность. При такой концепции сам массив должен знать элемент, который является первым, чтобы именно с него начать работу с массивом, а также должен знать последний элемент, для того, чтобы знать, куда добавлять следующий элемент. Таким образом, с помощью полей prev и next каждый памятник точно знает своё место в массиве.

При работе с динамическими массивами, элементами которых являются большие структуры данных, можно очень быстро управлять элементами. Например, если необходимо удалить элемент массива, то достаточно только будет изменить указатель у предыдущего элемента и у следующего элемента, и при этом не образуется пустой ячейки, как это было бы при работе со статическим массивом.

Так как все ключевые поля являются закрытыми, то необходимо в поле public создать методы для записи и чтения данных в/из этих ключевых полей. Методы для записи имеют в своём названии слово Set, а методы для получения значения - Get.

В связи с тем, что в программе необходимо предусмотреть возможность пользователю добавить новый памятник, в том числе и вручную. Поэтому класс Pamiatnik содержит метод Vvod. С помощью данного метода все наследники будут делегировать полномочия родителю по вводу общих ключевых полей, которые также описаны в родителе.

Метод Draw в классе Pamiatnik является абстрактным. Дело в том, что класс Pamiatnik не будет непосредственно создаваться, поэтому и выводить свои данные ему незачем. А вот наследники обязаны будут выводить свои данные на экран. Поэтому в базовом классе данный метод является абстрактным.

Метод ToString также является абстрактным. Все наследники обязаны будут его реализовать. Сам же метод будет создавать строку, для записи в файл csv на основании ключевых полей.

1.2.2 Класс Zdanie

Класс описывает тип здание. Фактически здание наследует все поля от Pamiatnik и добавляет два поля visota и adress. В эти поля заносятся высота памятника и адрес памятника. По правилам, данный класс должен определить все виртуальные классы. Класс Zdanie знает, как себя отобразить, поэтому реализует метод Draw и ToString.

Так как конструкторы не наследуются, то в соответствии с заданием нужно реализовать три конструктора. Один конструктор без параметров, второй с пятью параметрами (значениями для заполнения ключевых полей). Данный конструктор просто делегирует обязанности по заполнению ключевых полей базовому классу Pamiatnik.

Третий конструктор - это конструктор, в которую передаётся лишь одна строка в формате csv. Данный конструктор будет вызываться во время загрузки данных из файла csv. Все данные для одного элемента массива разделяются точкой с запятой. В данном конструкторе входная строка анализируется и раскладывается на ключевые поля.

программный меню пользователь памятник

1.2.3 Класс Kvartal

Класс Kvartal расширяет базовый класс ещё одним ключевым полем - Ploschad. В данное поле заносится строка, в которой указывается размер площади памятника, который есть в квартале. Поле Ploschad является private, именно поэтому для доступа к нему необходимо создать метод set и get.

Также реализуются методы Vvod, Draw и ToString, а также три конструктора.

1.2.4 Класс Square

Данный класс ничем не отличается от класса Ploschad. В данном классе реализованы все те же поля, что и в предыдущем классе Ploschad.

1.2.5 Класс Skulptura

Класс Skulptura расширяет базовый класс ещё одним ключевым полем - Avtor. В данное поле заносится строка, в которой указывается имя автора создавшего скульптуру. Поле Avtor является private, именно поэтому для доступа к нему необходимо создать метод set и get.

Также реализуются методы Vvod, Draw и ToString, а также три конструктора. Все классы наследники от класса Pamiatnik выводят себя на экран в общую таблицу, т.е. все общие ключевые поля выводятся каждый в свою колонку, а все отличающиеся в поле примечание.

1.2.6 Класс Massiv_Pamiatnikov

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

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

Метод Add_Pamiatnik(Pamiatnik* p) предназначен для добавления памятника в массив. Для добавления в массив необходимо, чтобы памятник уже был создан, т.е. для него была выделена память. Как уже ранее упоминалось, сам массив не имеет своей памяти для расположения в ней памятников, т.к. класс массива является оболочкой, которая содержит методы для управления массивом. В данный метод достаточно передать адрес любого памятника, и он войдёт в состав динамического массива на последнее место.

Метод Del_ Pamiatnik(char* name) предназначен для удаления памятника, точнее данный метод только ищет в массиве адрес памятника, номер которого передан в качестве параметра. И если памятник с указанным номером будет найден, то его адрес передаётся в другую функцию - Del. В функции Del сначала задаётся уточняющий вопрос о том, нужно ли на самом деле удалять памятник из массива. И если пользователь подтвердит удаление, то запускается механизм удаления. Дело в том, что при удалении всего одного памятника может быть затронуты сразу все памятники. Так как все памятники расположены последовательно, то при удалении второго памятника, необходимо изменить указатели, чтобы первый памятник указывал сразу на третий, а третий на первый. Только после этого можно будет физически удалить памятник. Метод ShowAll предназначен для того, чтобы вызовом одной функции вывести сразу все памятники, зарегистрированные в массиве. В данной функции не только выводятся все памятники, но и все элементы таблицы (шапка таблицы, подчёркивание таблицы).

Метод SaveFile предназначен для сохранения в файл всех памятников, зарегистрированных в массиве. Здесь происходит открытие потока для записи в файл и каждый памятник представив все свои ключевые поля в виде одной строки, записывает в файл.

Метод LoadFile читает памятники из файла. Когда будет прочитана одна очередная строка, содержащая все поля памятников определённого типа, то сначала нужно выделить память для этого памятника, а затем на основании прочитанной строки заполнить все ключевые поля. А лишь затем вызывается метод добавления памятника в массив.

Для создания памятника предназначен специальный метод:

Pamiatnik * Create Pamiatnik (int type, char* stroka)

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

Метод Sort(int pole) предназначен для сортировки всех памятников в массиве. Причём можно сортировать по разным полям. Для указания поля для сортировки предназначен параметр pole. Сортировка динамического массива производится крайне быстро, так как нет необходимости менять местами большие объёмы памяти, достаточно лишь изменить два поля prev и next для каждого из памятников.

Сортировка производится по методу «пузырька», т.е. обмениваются местами рядом стоящие элементы. Однако как ранее упоминалось, нет необходимости физически изменять расположение памятников в памяти. Поэтому при обмене, возможно, потребуется изменить поля сразу 4-х памятников.

Метод Find(char* FindStroka) предназначен для поиска памятника по каким-нибудь данным. При этом не важно, по каким полям нужно искать, так как функция ищет сразу по всем. Дело в том, что мы можем получить все поля в виде одной строки. Именно в этой строке мы и будем искать искомую строку FindStroka. Можно искать как цифры, так и текст. Все памятники удовлетворяющие критерии поиска выводятся на экран.

Метод Statistika предназначен для вывода статистики по каждому типу памятника в отдельности и для всех сразу. Т.е. памятники группируются по типу и выводятся на экран. После каждой группы выводится статистика по году создания памятника (старый памятник или новый и т.д.). А после того как данные по группам будут выданы - появится общая статистика по всем памятникам.

1.3 Модуль FunctionFile.cpp

Модуль FunctionFile.cpp содержит вспомогательные функции для работы программы.

Функция MainMenu предназначена для вывода на экран главного меню, а также для ввода пункта главного меню.

Главное меню состоит из следующих пунктов:

1 - Загрузить памятники из файла csv

2 - Сохранить памятники в файл csv

3 - Просмотреть все памятники

4 - Добавить новый памятник

5 - Удалить памятник

6 - Сортировать памятники

7 - Найти памятник

8 - Групповой отчет

0 - Выход из программы

Если пользователь введёт неверный пункт, то программа сообщит об ошибке и попросит ввести пункт меню заново.

Функция MenuTypePamiatnik предназначена для вывода меню и выбора типа памятника. Например, когда пользователь создаёт памятник, то у него спрашивается, какого типа он желает создать памятник. Данная функция содержит следующие пункты меню:

1 - Здание

2 - Квартал

3 - Площадь

4 - Скульптура

9 - Вернуться в главное меню

Функция type_sort выводит меню для выбора поля, по которому нужно будет сортировать массив памятников. Данная функция содержит следующие пункты меню:

1 - Имя

2 - Год основания

3 - Стоимость

9 - Вернуться в главное меню

Функции ShowShapkaTabl и ShowPodcherkTabl выводят на экран шапку таблицы и подчёркивают таблицу соответственно. Данные функции вызываются из разных мест, поэтому было решено вынести их в отдельные функции. Функция char* GetFileName получает имя файла, например, при сохранении или загрузки файла. Функция ShowNameGroup выводит на экран название типов памятников над шапкой таблицы.

1.4 Модуль main.cpp

Данный модуль содержит точку входа в программу (метод main). Основная задача метода main - это управлять всей программой. Принцип управления программой заключается в теории конечных автоматов. Главная идея данного принципа заключается в том, что программа может находиться только в одном состоянии. Например, вывод главного меню, добавление нового элемента - это разные состояния. Каждому состоянию будет соответствовать уникальное число. Также необходима одна переменная (menu) для того, чтобы пользователь мог выбрать пункт меню и его выбор отразился на данной переменной. Далее показан упрощённый принцип, реализующий принцип конечных автоматов:

Switch(menu)

{

Case 1: // Делаем всё, что касается загрузки данных из файла

Case 2: // делаем действия, чтобы просмотреть все данные

// и так далее

}

Если необходимо какое-то действие детализировать, то мы можем легко добавлять дополнительные пункты меню. Например, если мы выберем пункт меню 6, то у нас программа уточняет, какой конкретно памятник необходимо отсортировать. Теперь все вложенные элементы будут двузначными, например, 61,62 и т.п. И так можно делать вложения достаточно глубоко. Также в данном модуле есть функция CreatePamiatnik, которая вызывается при выборе пункта меню добавления нового памятника. Для создания памятника необходимо указать только тип создаваемого памятника, а данные для памятника должен будет пользователь ввести вручную.

2. Описание работы программы по контрольному примеру

2.1 Описание процесса сортировки памятников

Запускаем программу Kursovoy.exe. Результат отображён на рисунке 3.

Рисунок 3 - Запуск программы

В программе предусмотрено при запуске программы загрузка файла с данными по умолчанию. Данное действие аналогично выбору пункта меню 1 и ввода имени файла с данными.

Выполним пункт 3 для просмотра загруженных данных. Результат представлен на рисунке 4.

Рисунок 4 - Результат просмотра данных

Как видно из рисунка 4 данные не отсортированы не по одному из полей. Поэтому сортировать можно по любому полю. Для продолжения нажимаем клавишу Ввод, затем выбираем пункт меню 6. Результат показан на рисунке 5.

Рисунок 5 - Меню для выбора поля сортировки

Например, сортировать будем по полю «Год основания», поэтому выбираем пункт меню 2. Результат сортировки показан на рисунке 6.

Рисунок 6 - Результат сортировки по полю Год основания

Как видно на рисунке 6 все записи были сортированы по полю «Год основания». Далее достаточно нажать на клавишу Ввод и снова отобразится главное меню.

2.2 Описание процесса поиска в массиве памятников

Довольно часто приходится в массиве данных производить поиск. Разработанный программный комплекс позволяет производить поиск в массиве. Для этого необходимо в главном меню (рисунок 3) выбрать пункт меню 7. При этом отобразится строка, в которой нужно будет ввести искомый текст (рисунок 7).

Рисунок 7 - Требование ввести искомую строку

Далее достаточно ввести какой-то ключ для поиска, например, мы введём такую строку: «43». Тогда, учитывая, что первоначально в массиве находятся данные, представленные на рисунке 6, мы получим результат, представленный на рисунке 8.

Рисунок 8 - Результат выполнения поиска строки в массиве

Как видно на рисунке 8, у первого памятника расходы как раз составляют 433000, а у второго памятника год составляет 2043, что также имеет в своей основе 43. Остальные записи не удовлетворяют критериям поиска, поэтому и не были отображены.

2.3 Описание формирования статистики по памятникам

Для отображения статистики по памятникам, необходимо чтобы данные уже были загружены в память, т.е. массив существовал. Предполагаем, что у нас загружены исходные данные, отображённые на рисунке 6.

Тогда для вывода статистики по памятникам необходимо в главном меню выбрать пункт 8.

В результате чего на экране появится статистика по памятникам. Результат вызова статистики по памятникам представлен на рисунке 9.

Рисунок 9 - Вывод статистики по памятникам

Заключение

В процессе курсовой работы разработана программа «Kursovoy.exe».

В программе:

? использованы принципы объектно-ориентированного программирования;

? разработаны различные меню, помогающие пользователю работать с программой;

? описаны классы согласно варианту;

? можно все памятники в массиве отсортировать;

? реализован поиск памятников, в которых встречается упоминание подстроки которую введёт пользователь;

? можно вывести развёрнутую статистику для конкретного типа памятников и статистику для всех памятников одновременно;

? все методы классов наглядно протестированы;

В результате работы: были закреплены знания объектно-ориентированного программирования; приобретены навыки разработки многомодульного приложения.

Курсовая работа в полной мере отражает поставленную задачу.

Список использованных источников

Павловская, Т. А. С/С++. Программирование на языке высокого уровня [Текст] : учеб. пособие / Т. А. Павловская. - СПб.: Питер, 2010. - 450 с.

Страуструп, Б. Язык программирования С++ [Текст] : учеб. пособие / Б. Страуструп. - М. : Бином-Пресс, 1991. - 313 с.

Подбельский, В.В. Объектно-ориентированное программирование [Текст] : учеб. пособие / В. В. Подбельский. - М. : Программирование, 2002. - 279 с.

Тагин, М.А. Стандартная библиотека функций [Текст] : учеб. пособие / М. А. Тагин. - М. : Программирование, 2002. - 265 с.

ПРИЛОЖЕНИЯ

Приложение А

#include <stdio.h>

#include <conio.h>

#include <iostream>

#include "locale.h"// для использования русской кодировки

#include <string>

#include <fstream>

void ShowShapkaTabl(void);

void ShowPodcherkTabl(void);

int MainMenu (void);

int MenuTypePamiatnik(void);

char* GetFileName(void);

int type_sort(int k);

void ShowNameGroup(int i);// вызов функции отображения названия группы памятника

#include "global.h"

class Pamiatnik// описываем класс Памятник

{

protected:

int God_osn;

char Name[20];

long int Stoimost;

int Type;

public:

Pamiatnik* prev;

Pamiatnik* next;

Pamiatnik()

{

God_osn = 0;

strcpy(Name,"no name");

Stoimost = 0;

prev=NULL;

next=NULL;

}

Pamiatnik(int god_osn, char* name, long int stoimost)

{

this->God_osn = god_osn;

strcpy(Name,name);

this->Stoimost = stoimost;

prev=NULL;

next=NULL;

}

int Set_God(int god)

{

int error=3;// общая ошибка при вводе года

if (god>2050)

{

printf("Вы ввели год основания памятника который ещё не наступил\n");

error=1;

}

else

if (god<1000)

{

printf("Вы ввели слишком маленький год основания памятника\n");

error=2;

}

else

{

this->God_osn = god;

error=0;

}

return error;

}

int Set_Stoimost(long int stoim)

{

int error=3;// общая ошибка при вводе года

if (stoim>5000000)

{

printf("Введена большая стоимость расходов на содержание памятника\n");

error=1;

}

else

if (stoim<200000)

{

printf("Введена слишком маленькая стоимость расходов на содержание памятника\n");

error=2;

}

else

{

this->Stoimost = stoim;

error=0;

}

return error;

}

int Set_Name(char* name)

{

int error=3;

int len;

len = strlen(name);

if (strcmp(name,"")==0) //Функция сравнения

{

printf("Ошибка! Вы не ввели название памятника\n");

error = 1;

}

else

if (len>20)

{

printf("Ошибка! Вы ввели слишком длиное название памятника (<20) \n ");

error = 2;

}

else

{

strcpy(this->Name,name);

error = 0;

}

return error;

}

int Get_God(void)

{

return God_osn;

}

long int Get_Stoimost(void)

{

return Stoimost;

}

int Get_Type()

{

return Type;

}

char* Get_Name(void)

{

return Name;

}

virtual void Vvod()

{

int god_osnov;

char name[40];

long int stoimost;

do

{

printf("Введите год основания памятника: ");

fflush(stdin);

scanf("%d", &god_osnov);

} while(Set_God(god_osnov)>0);

do

{

printf("Введите название памятника:");

fflush(stdin);

gets(name);

}while(Set_Name(name)>0);

do

{

printf("Введите стоимость расходов на содержание памятника: ");

fflush(stdin);

scanf("%d", &stoimost);

}while(Set_Stoimost(stoimost)>0);

}

virtual void Draw(void)=0;

virtual char* ToString(void)=0;

};

class Zdanie{...}

class Kvartal{...}

class Square{...}

class Skulptura{...}

// класс массива памятнмков. Содержит оболочку для управления массивом

class Massiv_Pamiatnikov

{

Pamiatnik* first;// указывает на первый памятник в массиве

Pamiatnik* last;// указывает на последний памятник в массиве

int Koll;// количество памятнмков в массиве

// функция для удаления конкретного памятника, которая приходит как параметр

void Del(Pamiatnik* p)

{

int i;

std::cout<<"Вы действительно хотите удалить памятник "<<p->Get_Name()<<"?"<<std::endl;

std::cout<<"1 - ДА"<<std::endl; // Выводим меню для подтверждения удаления

std::cout<<"2 - НЕТ"<<std::endl;

std::fflush(stdin);

std::cin>>i;// принимаем выбор пользователя

if (i==1)//если пользователь подтвердил удаление, то

{

if (p == this->first)// если мы удаляем первый элемент, то

{

this->first = p->next;// первым становится следующий

}

else

{

p->prev->next = p->next;// поля next для предыдущего элемента необходимо привязать к следующему элементу

}

if (p == this->last)// если мы удаляем последний элемент, то

{

this->last = p->prev;// последним становится предыщущий

}

else

{

p->next->prev = p->prev;// поле prev для следующго элемента необходимо привязать к предыдущему элементу

}

delete p;// удаляем элемент

Koll--;// уменьшаем количество элементов

std::cout<<"Памятник удален"<<std::endl;

}

}

public:

// конструктор без параметров

Massiv_Pamiatnikov()

{

first = NULL;// во все поля записываются значения по умолчанию

last = NULL;

Koll=0;

}

//Функция для добавления памятника в массив

void Add_Pamiatnik(Pamiatnik* p){...}

// Функция для удаления памятника из массива

void Del_Pamiatnik(char* name){...}

// Функция отображает все памятники, находящиеся в массиве

void ShowAll()

{

Pamiatnik* temp;// объявляем временый указатель на памятник для вывода

temp=first;// первым выводим тот памятник, на который указывает first

if (temp == NULL)// если окажется, что в массиве нет памятников, то

{

printf("В массиве нет памятников\n");

return;// выходим из функции

}

ShowShapkaTabl();// отображаем шапку

do

{

temp->Draw();// выводим первый памятник

temp = temp->next;// говорим, что потом нам нужно будет выводить тот памятник, на который ссылается поле next текущего памятника

} while (temp!=NULL);

ShowPodcherkTabl();// подчркиваем таблицу

}

// функция для сохранения массива в файл

void SaveFile(void)

{

Pamiatnik* temp;// объявляем временый указатель на памятник для вывода

temp=first;// первым используем тот памятник, на который указывает first

if (temp == NULL)// если окажется, что в массиве нет памятников, то

{

return;// выходим из функции

}

// если есть данные для сохранения, то

std::ofstream fout;// создаём поток для вывода данных в файл

fout.open(GetFileName());// отрываем файл, который первоначально получаем специальной функцией

do

{

fout<<temp->ToString();// записываем памятники

if (temp->next != NULL)

fout<<"\n";

temp = temp->next;// говорим, что потом нам нужно будет выводить тот памятник, на который ссылается поле next текущего памятника

} while(temp != NULL);

fout.close();// закрываем файл

std::cout<<"Все памятники успешно сохранены"<<std::endl;

}

// функция для загрузки массива из файла

void LoadFile(char* FileName)

{

char temp[100];// временная строка, куда мы будем получать строку из файла

char* a;// указатель для работы со строкой

int type;// тип памятника

FILE* f=fopen(FileName,"r");// открываем файл для чтения

if (f==NULL)// если файл не открылся, то

{

std::cout << "Ошибка чтения файла" << std::endl;

return;// выводим сообщение об ошибки и выходим из функции

};

while (!feof(f))// находимся в цикле пока не достигнем конца файла.

{

fgets(temp,100,f);// читаем очередную строку

a=strstr(temp,";");// получаем адрес первого вхождения символа ';' в исходную строку

*a=0;// там где символ ';' необходимо установить признак конца строки

type=atol(temp);// теперь в первоначальной строке осталось только число - его и записываем в соответствующее поле

a=a+1;// изменяем указатель исходной строки, чтобы можно было дальше продолжить работу

this->Add_Pamiatnik(this->CreatePamiatnik(type,a));

}

fclose(f);// закрываем файл.

std::cout<<"Все памятники были прочитаны из файла "<<FileName<<std::endl;

}

// функция создаёт памятник из файла

Pamiatnik* CreatePamiatnik(int type, char* stroka)

{

if (type==1)// Это здание

{

Zdanie* z = new Zdanie(stroka);

return z;

}

if (type==2)// Это квартал

{

Kvartal* k = new Kvartal(stroka);

return k;

}

if (type==3)// Это площадь

{

Square* s = new Square(stroka);

return s;

}

if (type==4)// Это скульптура

{

Skulptura* sk = new Skulptura(stroka);

return sk;

}

}

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

void Sort(int pole){...}

// Поиск элементов по заданной строке

void Find(char* FindStroka){...}

// Функция выводит статистику по всем памятникам

void Statistika(void){...}

Приложение Б

#include "global.h"

#include "ClassFile.cpp"

Massiv_Pamiatnikov MP;

Pamiatnik* CreatePamiatnik(int type)

{

if (type==1)

{

Zdanie* z = new Zdanie();

z->Vvod();

return z;

}

if (type==2)

{

Kvartal* k = new Kvartal();

k->Vvod();

return k;

}

if (type==3)

{

Square* s = new Square();

s->Vvod();

return s;

}

if (type==4)

{

Skulptura* sk = new Skulptura();

sk->Vvod();

return sk;

}

}

int main(void)

{

setlocale(LC_CTYPE,".1251"); // включаем русскую кодировку в консоли

/*Zdanie* z1=new Zdanie(1901,"Muzei",32000000,200,"Suhogo 40");

Kvartal* k1=new Kvartal(1954,"Kitaiskiy",30000000,1230000,"Polesskaiy 43");

Square* s1=new Square(1887,"Lenina",5000000,200000,"Pr_Lenina 12");

Skulptura* sk1=new Skulptura(1443,"Ahiles",500000,20,"Da Vinchi");

MP.Add_Pamiatnik(z1);

MP.Add_Pamiatnik(k1);

MP.Add_Pamiatnik(s1);

MP.Add_Pamiatnik(sk1);*/

MP.LoadFile("D:\\nick.csv");

int menu;

menu=9;

do

{

switch(menu)

{

case 1:MP.LoadFile(GetFileName());

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 2: MP.SaveFile();

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 3: MP.ShowAll();

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 4: int type;

printf("Выбирите тип добавляемого памятника\n");

type = MenuTypePamiatnik();

MP.Add_Pamiatnik(CreatePamiatnik(type));

printf("ПАМЯТНИК БЫЛ ДОБАВЛЕН\n");

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 5: char name[20];

printf("Введите имя удаляемого памятника: ");

fflush(stdin);

gets(name);

MP.Del_Pamiatnik(name);

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 6: menu = type_sort(menu);

break;

case 61:

case 62:

case 63: MP.Sort(menu % 10);

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 69:

menu=9;

break;

case 7: printf("Введите строку поиска: ");

fflush(stdin);

gets(name);

MP.Find(name);

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 8: MP.Statistika();

printf("Для продолжения нажмите любую клавишу\n");

getch();

menu=9;

break;

case 9: menu = MainMenu();

break;

}

} while (menu!=0);

Printf

getch();

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.