Лабораторная работа №12

Проект «Соблюдай ПДД!»

Необходимо разработать систему «Справочник штрафов за нарушения правил дорожного движения».

Описание

Справочник содержит набор пронумерованных статей с информацией о правонарушениях. У справочника есть название (например, «Справочная информация об ответственности за нарушение правил дорожного движения»), которое может меняться, а также информация о дате и времени последнего обновления.

Каждая статья справочника помечена уникальным идентификационным номером формата <num>{.<num>}, где <num> — целое положительное число (примеры: 15, 207.2.3, 26.5.12).

Статья содержит следующую информацию:

  • название статьи КоАП РФ, устанавливающей ответственность (тип string);
  • описание правонарушения (тип string);
  • размер штрафа в рублях (в отличие от реальной жизни, здесь штраф фиксирован) целого типа.

Пример

Статья 12.6

* (Название) Нарушение правил применения ремней безопасности или мотошлемов
* (Описание) Управление транспортным средством водителем, не пристегнутым ремнем безопасности, перевозка пассажиров, не пристегнутых ремнями безопасности, если конструкцией транспортного средства предусмотрены ремни безопасности, а равно управление мотоциклом либо перевозка на мотоцикле пассажиров без мотошлемов или в незастегнутых мотошлемах
* (Штраф) 500

Справочник должен предоставлять следующие операции:

  • Добавление информации о новых правонарушениях.

  • Удаление информации о правонарушениях.

  • Обновление размера штрафа для статьи справочника с заданным идентификатором.

  • Индексное свойство, которое по идентификатору статьи возвращает размер штрафа за соответствующее правонарушение.

  • Печать содержимого справочника (при печати размера штрафа нужно указывать валюту — «р.»).

  • Загрузка всего содержимого справочника из текстового файла.
    Информация о нарушении храниться в следующем виде:

    12.6 
    Нарушение правил применения ремней безопасности или мотошлемов
    Управление транспортным средством водителем, не пристегнутым ремнем безопасности, перевозка пассажиров, не пристегнутых ремнями безопасности, если конструкцией транспортного средства предусмотрены ремни безопасности, а равно управление мотоциклом либо перевозка на мотоцикле пассажиров без мотошлемов или в незастегнутых мотошлемах
    500

    По такой строке в справочник должна быть занесена информация о статье с идентификатором «12.6»: название статьи КоАП — «Нарушение правил применения ремней безопасности или мотошлемов», штраф — 500 рублей, и описание правонарушения — «Управление транспортным… мотошлемах».

  • Сохранение информации из справочника в текстовый файл.

  • Метод получения данных о правонарушении по его идентификатору.

  • подсчёт суммы к оплате за данный список правонарушений.

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

    Сама сумма к оплате высчитывается только по присутствующим в справочнике нарушениям.

Подсказки к реализации

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

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

  • правонарушение — offense;
  • база данных — data base;
  • справочник — directory;
  • штраф — fine;
  • статья — article.

Основная идея. Поскольку каждая статья справочника о правонарушениях имеет уникальный идентификатор, для хранения базы правонарушений удобно использовать ассоциативный массив (map<string, offense>). Ключом является строковый идентификатор. Информацию о правонарушении удобно представить вспомогательным классом.

Таким образом, нам, вероятно, понадобится два класса: класс справочника и класс с информацией о правонарушении. Заметьте, что в информацию о правонарушении не нужно включать идентификатор, его «знает» сам справочник.

  1. {1.25 балла} Заготовка класса справочника.

    • Начните с самого простого — пустого класса справочника.

    • В описании сказано, что у справочника есть название и дата последнего обновления. Добавьте соответствующие поля (приватные).

      	string title;
      	time_t lastUpdate;

      Указание. Для работы с временем воспользуйтесь #include<ctime> ;

    • добавьте метод

      void setTitle(string Title);
    • Добавьте в класс справочника конструктор с одним параметром — именем справочника. Не забудьте установить время обновления (создание справочника можно считать обновлением).
      Указание. Проверкой и установкой названия справочника уже занимается сеттер. Вызовите его в конструкторе, не нужно дублировать код обработки наименования.

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

      	void setLastUpdate() {
      		time_t currentTime;// создаём переменную
      		time(&currentTime);//записываем текущее время
      		lastUpdate = currentTime;//устанавливаем поле класса
      	}

    • Для того, чтобы метод работал без ошибок, зайдите в пункт меню Проект->Свойства->C/C++->препроцессор. В определения препроцессора добавьте _CRT_SECURE_NO_WARNINGS;

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

      	string getLastUpdate() const { 
      		auto lu = lastUpdate;
      		auto timeinfo = localtime(&lu);
      		return asctime(timeinfo); 
      	}
      

    • Перегрузите операцию вывода в поток. Пусть выводится название справочника и дата последнего обновления.

    • Проверьте работоспособность справочника в основной программе: создайте справочник, распечатайте; измените название справочника, снова распечатайте. Убедитесь, что время последнего обновления установлено правильно.

  2. {2.25 балла} Класс правонарушения.

    • Класс правонарушения должен содержать информацию о названии статьи КоАП, описание правонарушения, а также размер штрафа (unsigned int). Реализуйте класс с необходимыми полями и свойствами на чтение (пока) для этих полей.

    • Добавьте в класс конструктор с соответствующими параметрами.

    • Перегрузите операцию вывода в поток.

    • Проверьте работоспособность класса в основной программе: создайте правонарушение, распечатайте, обратитесь к свойствам на чтение.

  3. {3.25 балла} Простейшие функции справочника.

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

    • Реализуйте метод добавления и метод удаления статьи с правонарушением.

      	void Add(string id, offense o);
      	void Remove(string id);
      
       
      Не забудьте изменить дату последнего обновления справочника.

      Указание. Помните про корректность входных данных! Например, отсутствующую статью нельзя удалить из справочника.

    • Исправьте вывод справочника в поток: он должен распечатывать и информацию обо всех известных правонарушениях. Удобно использовать перегруженную операцию для класса правонарушения. Замечание. Чтобы распечатать содержимое базы правонарушений, можно организовать цикл по парам for (auto o : d.database) {...}

    • Проверьте методы в основной программе.

  4. {4 балла} Обращение к элементам справочника.

    • Добавьте метод для обновления размера штрафа заданной статьи.
      Указание. Придётся добавить в класс правонарушения свойство на запись для штрафа. Не забывайте о проверках (идентификатор статьи, размер штрафа).

    • Перегрузите operator[] так, чтобы по идентификатору статьи возвращался размер штрафа за соответствующее правонарушение.

    • Проверьте метод и свойство в основной программе.

  5. Реализуйте сохранение информации из справочника в текстовый файл. Используйте методы <fstream>.

    ofstream fout(fname); // создаём объект класса ofstream для записи и связываем его с файлом
    	for (auto o : database) {
    		fout << o.first << endl;
    		fout << o.second;
    	}
    
  6. Загрузка содержимого справочника.

    Реализуйте метод загрузки содержимого справочника из текстового файла.

  7. 	ifstream fin(fname); // создаём объект класса ofstream для чтения и связываем его с файлом с названием fname
    	while (fin) {
    		string s1;
    		getline(fin, s1);
                    //обработка строки
    	}
    

    Проверьте метод загрузки в основной программе.

  8. Реализуйте всю остальную функциональность справочника, которая указана в описании задания.

    • «Безопасный подсчёт суммы к оплате за данный список правонарушений». Правонарушения удобно задавать их строковыми идентификаторами. Для задания набора правонарушений можно использовать массив, вектор или переменное число параметров.