Информационная система по учету автомобилей

Министерство  образования Республики Беларусь

Учреждение  образования

 «Белорусский  государственный 

университет информатики и радиоэлектроники» 
 

Кафедра экономической информатики

Инженерно-экономический  факультет 
 
 
 
 
 

Пояснительная записка 

к расчётной  работе по курсу

«Объектно-ориентированное  проектирование и программирование»

На тему:

«Информационная система по учету автомобилей» 
 
 
 
 
 
 

Выполнил:                                                                                   А.А. Бадеев

Руководитель:                                                                              А.М. Ковальчук 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Минск 2011 

СОДЕРЖАНИЕ

ВВЕДЕНИЕ……………………………………………………………3

  1. Постановка задачи……………………………………………5
  2. Спецификация системы……………………………………..5

   3. Структура  входных и выходных данных………………………………….7

   4. Диаграмма  классов…………………………..……………………………..8

   5. Описание  классов………………………………...…………………..…....10

   6. Алгоритмы  по шагам и блок- схемы функций  .…………………………13

   7. Текст  программы…………………………………………………………..15

   8. Результаты  работы………………………………………………………...34

ЗАКЛЮЧЕНИЕ………………………………………………………………….35

Список использованной литературы…………………………………………...36 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ВВЕДЕНИЕ

      Язык С++ , появившийся  в начале 80-х годов,  не только универсален,  как язык Си, но и является  средством объектного программирования, новейшей методикой проектирования и реализации программ. Главной целью создателя языка, доктора Бьерна Страустрапа, было оснащение языка С++ конструкциями, позволяющими увеличить производительность труда программистов и облегчить процесс овладения большими программными продуктами.

    Среди достоинств языка C++ можно выделить:

    • C++ — чрезвычайно мощный язык, содержащий средства создания эффективных        программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения.
    • Поддерживаются различные стили и технологии программирования.
    • Высокая совместимость с языком Си, позволяющая использовать весь существующий Си-код (код на Си может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на Си, обычно могут быть вызваны из C++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова).
    • С++ – удобный язык. Он достаточно структурирован, чтобы поддерживать хороший стиль программирования, и вместе с тем не связан жесткими ограничениями.
    • В некотором смысле язык Си – самый универсальный, т.к. кроме набора средств, присущих современным языкам программирования высокого уровня (структурность, модульность, определенные типы данных), в него включены средства для программирования практически на уровне ассемблера. Большой набор операторов и средств требуют от программиста осторожности, аккуратности и хорошего знания языка со всеми иго преимуществами и недостатками.
    • Предсказуемое выполнение программ является важным достоинством для построения систем реального времени.
    • Пользовательские функции-операторы позволяют кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
    • Используя шаблоны, возможно создавать обобщённые контейнеры и алгоритмы для разных типов данных, а также специализировать и вычислять на этапе компиляции.
    • Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов. Это упрощает  и делает более надёжным освобождение ресурсов.
    • Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.
 

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

  1. ПОСТАНОВКА  ЗАДАЧИ И ОБЗОР  МЕТОДОВ
 

     1.1 Задание 

      Необходимо  организовать Информационную систему по учету автомобилей. Организовать автостоянки по районам. Осуществлять поиск автомобилей на конкретной автостоянке и по всем автостоянкам по владельцу, по номеру автомобиля, по маркам автомобиля. Добавление, удаление автомобилей со стоянок. Данные хранить в различных файлах. Разработать и использовать в программе классы контейнеров и итераторов. Производить обработку исключительных ситуаций. 

1.2 Постановка задачи 

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

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

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

В связи с  этим выделим возможности, реализованные  в конечном программном продукте:

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

   1.3 Обзор методов

   Для успешной реализации поставленных задач существует множество методов решения. Среди  основных можно выделить:

  • Создание программного продукта средствами Microsoft Visual C++ 8.0, используя объектно-ориентированную технологию и язык программирования С++;
  • создание полноценной реляционной базы данных средствами Microsoft SQL Server 2005 и др.
 

   Для данного  проекта выбираем созданию продукта с использованием MS Visual C++ 8.0, т.к. эта система наиболее полно подходит для реализации поставленных задач. Конечный продукт с некоторыми доработками может быть использован сотрудниками автостоянок без какого-либо обучения и специальной подготовки, в то время как использование конечной  реализации в MS SQL Server  требует дополнительных знаний и навыков. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2 СТРУКТУРА ВХОДНЫХ И ВЫХОДНЫХ ДАННЫХ

     2.1 Структура входных данных

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

     Структура входных данных о районах включает:

    class District // Класс района

    {

    private:

          int id; // идентификатор

          char name[30]; // название района

      }

    Структура входных данных об автостоянках включает:

    class Parking // Класс автостоянки

    {

    private:

          int id; // Идентификатор

          int district_id; // Идентификатор района

    }

    Структура входных данных об автомобилях включает:

    class Auto // Класс автомобиля

    {

    private:

          int id; // идентификатор

          int parking_id; // идентификатор автостоянки

          int number; // номер машины

          char owner[30]; // имя владельца

          char brand[10]; // компания-производитель

          char model[10]; //  название модели

    }

        Выходная  информация  представляет  собой  информацию о хранящихся автомобилях, формируется   с использованием   входной информации 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

    1.   Диаграмма классов

     
     
     
     
     
     
     

4 ОПИСАНИЕ КЛАССОВ И СТРУКТУР 

В файле «classes.h» находится описание классов данных о районах, автостоянках и автомобилях (District, Parking, Auto). Содержимое классов: 

class District // Класс района

{

private:

      int id; // идентификатор

      char name[30]; // название района

public:

      int getId() { return id; } // функции доступа

      void setId(int Id) { id = Id; }

      char* getName() { return name; }

      void setName(char *Name) { strcpy(name, Name); }

      _declspec(property(get=getId, put=setId)) int Id;

      _declspec(property(get=getName, put=setName)) char* Name; 

      friend ostream& operator<<(ostream& s, District& d); // Перегрузка операторов ввода/вывода

      friend istream& operator>>(istream& s, District& d);

};

class Parking // Класс автостоянки

{

private:

      int id; // Идентификатор

      int district_id; // Идентификатор района

public:

      int getId() { return id; } // функции доступа

      void setId(int Id) { id = Id; }

      _declspec(property(get=getId, put=setId)) int Id; 

      int getDistrictId() { return district_id; }

      void setDistrictId(int Id) { district_id = Id; }

      _declspec(property(get=getDistrictId, put=setDistrictId)) int DistrictId; 

      friend ostream& operator<<(ostream& s, Parking& p); // Перегрузка операторов ввода/вывода

      friend istream& operator>>(istream& s, Parking& p);

};

class Auto // Класс автомобиля

{

private:

      int id; // идентификатор

      int parking_id; // идентификатор автостоянки

      int number; // номер машины

      char owner[30]; // имя владельца

      char brand[10]; // компания-производитель

      char model[10]; //  название модели

public:

      int getId() { return id; } // Функции доступа

      void setId(int Id) { id = Id; }

      _declspec(property(get=getId, put=setId)) int Id; 

      int getNumber() { return number; }

      void setNumber(int Number) { number = Number; }

      _declspec(property(get=getNumber, put=setNumber)) int Number; 

      int getParkingId() { return parking_id; }

      void setParkingId(int Id) { parking_id = Id; }

      _declspec(property(get=getParkingId, put=setParkingId)) int ParkingId; 

      char* getOwner() { return owner; }

      void setOwner(char *Owner) { strcpy(owner, Owner); }

      _declspec(property(get=getOwner, put=setOwner)) char* Owner; 

      char* getBrand() { return brand; }

      void setBrand(char *Brand) { strcpy(brand, Brand); }

      _declspec(property(get=getBrand, put=setBrand)) char* Brand; 

      char* getModel() { return model; }

      void setModel(char *Model) { strcpy(model, Model); }

      _declspec(property(get=getModel, put=setModel)) char* Model; 

      friend ostream& operator<<(ostream& s, Auto& a); // Перегрузка операторов ввода/вывода

      friend istream& operator>>(istream& s, Auto& a);

}; 

Класс Stack – разработанный класс контейнер, реализованный в виде шаблонов классов, для доступа к элементам списка. Итератор реализован как отдельный класс. В классе iterator выполнена перегрузка некоторых операций, позволяющих манипулировать узлом. Использование итераторов позволяет пользователю манипулировать стэком, при этом детали его реализации остаются надежно скрытыми . 

template<class TYPE>

struct qItem // Структура элементов стэка

{

      TYPE data;

      qItem *next;

};

template<class TYPE>

class Stack // Класс стэка

{

private:

      friend class qIterator<TYPE>; // Дружественный класс итератор

      qItem<TYPE> *first; // Указатель на первый элемент

public:

      Stack() { first = NULL; }

      void push(TYPE); // Вставить элемент

      void pop(); // Изъять элемент

      TYPE front(); // Получить первый элемент

      bool empty(); // Пустой ли стэк

      void clean(); // Очистить стэк

}; 

template<class TYPE>

class qIterator

{

private:

      qItem<TYPE> *current;

      Stack<TYPE> *qStack;

public:

      void toBegin(); // Поставить итератор в начало стэка

      qIterator(Stack<TYPE> *value); // Конструктор итератора с аргументов, в качестве стэка

      qItem<TYPE>* next(); // Переход на следующий элемент

      bool end(); // Последний ли элемент

      bool empty(); // Пустой ли стэк

      qItem<TYPE>* curr(); // Получить текущий элемент

      qItem<TYPE>* operator++(); // Переход на следующий элемент

      TYPE operator*(); // Получить текущий элемент

      void setNext(qIterator<TYPE> pos); // Функция удаления элемента

   };  

   В файле  “FWriter.h” описан класс для работы с файлами, который записывает и читает стэки как бинарно, так и потоково из файлов. Далее содержимое: 

template <class T>

class FWriter // Класс для работы с файлами

{

private:

      bool binary; // Открыт бинарный файл

      fstream *File; // Потоко файла

public:

      FWriter() { binary = false; } // Стандартный конструктор

      FWriter(const char *filename, ios_base::openmode mode = ios_base::in | ios_base::out) { Open(filename, mode); } // Конструктор с типом открытия файла

      FWriter(fstream *file) { binary = false; File = file; } // Передача конструктору потока открытого файла 

      bool Open(const char *filename, ios_base::openmode mode = ios_base::in | ios_base::out); // Открытие файла

      bool Close(); // Закрытие фалйа 

      fstream* getStream() { return File; } // Функция акксессор потока файла

      void setStream(fstream *file) { File = file; } // Функция установщик потока файла

      void setBinary(bool Binary) { binary = Binary; } // установка бинарного режима

      bool CanReadBinary(); // Возможно ли читать файл бинарно

      void writeDenlimiter() { // Запись пробела в текстовый файл

Информационная система по учету автомобилей