Управление парковкой

Автор работы: Пользователь скрыл имя, 18 Декабря 2013 в 17:10, контрольная работа

Описание работы

Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько "близок к решаемой задаче", чтобы концепции ее решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания C++.

Содержание работы

ВВЕДЕНИЕ . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . … . 3
1. Постановка задачи и обзор методов. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Структура входных и выходных данных . . . . . . . . . . . . . . . . . . . . . . . 7
3. Диаграмма классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . .8
4. Описание классов и структур. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
5. Блок-схемы и алгоритмы по шагам…….... …. . . . . . . . . . . . . . . . ….14
6.Текст программы. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .…18
7.Результаты работы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .31
ЗАКЛЮЧЕНИЕ.. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. .33
ЛИТЕРАТУРА……………. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . ..34

Файлы: 1 файл

Копия (2) Parcing1.doc

— 343.50 Кб (Скачать файл)

this->numbermesta=numbermesta;

}

 

CarParking()

{}

 

CarParking(CarParking& info)

{}

 

void Read() // добвление нового втомобиля

{

Car::Read();

Time = time(NULL); 

}

 

void SetNumberMest(int mesto) //устанавливаем номер парковочного место

{ numbermesta = mesto; }

 

double Calc(double priceH) //расчет оплаты за пользование стоянкой

{ int timeC = time(NULL);  //текущее время (выезд автомобиля)

double result = ((double)(timeC - Time))/(double)3600; //текущее - время заезда/3600 = получаем часы , проведенные на стоянке

int round = ceil(result);  // округляем до целого в большую сторону.

round *= priceH;   // стоимость часа стоянки * часы

return round;

}

 

int gettime()  //получаем время заезда автомобиля в секундах

{return Time;}

 

void get_time()  //получаем время заезда автомобиля в формате HH:MM:SS

{

char buffer[80];

time_t second=Time;

tm* timeinfo=localtime(&second); //функция localtime() преобразует число секунд типа t_timt в структуру типа tm,

                                 //в которой в качестве полей содержатся целочисленные (int) значения секунд, минут

                                 //часа, дня, месяца и года (начиная от 1900, т.е для 2009 это будет число 109)

char* format="%H:%M:%S";         //формат вывода строки -часы (24), минуты, секунды

strftime(buffer,80,format,timeinfo);  // форматированя даты/времени в строку

cout<<buffer<<endl;

}

 

int getnumbermesta() //получаем номер парковочного места

{  return numbermesta; }

};

 

 

“PARCING.CPP”

#include "stdafx.h"

#include"Car.h"

#include"Oshibka.h"

 

#define CountM 10

#define fileCars "cars.dat"

 

template <class T>

class List    //класс контейнер

{

private:

int countElements;

class Uzel //элемент списка

{

public:

Uzel *next; //указатель на следующий узел

Uzel *prev; //указатель на предыдущий узел

T info;    //данные

 

Uzel(){next=prev=NULL;}      //конструктор по умолчанию

Uzel(T temp): info(temp){next=prev=NULL;} //констрктор с параметром

~Uzel(){}         //деструктор

void print_info() {cout<<info<<" ";}

};

public:

 

class iterator    //класс итератор

{

private:

Uzel *next1;   //указатель на элемент списка

public:

friend class List<T>;

iterator(): next1(0){}

iterator(Uzel *m): next1(m){} //конструктор копирования

iterator(const iterator &it): next1(it.next1){}

 

iterator& operator=(const iterator& it)

{next1=it.next1;

return *this;

}

 

bool getNext()

{

if (next1->next==0)

{return false; }

 

return true;

}

 

iterator &operator++() //перемещает итератор на следующий узел

{

if (next1==0)

{ cout<<"incremented an empty iterator"; }

if (next1->next==0)

{ cout<<"treid to increment too far past the end"; }

next1=next1->next;

return *this;

}

 

 

iterator &operator--() //перемещает итератор на предыдущий узел

{

if (next1==0)

cout<<"incremented an empty iterator"<<;

if (next1->next==0)

cout<<"treid to increment too far past the end"<<;

next1=next1->prev;

return *this;

}

 

T& operator*() const  //возвращает значение узла

{

if (next1==0)

cout<<"treid to dereference an empty iterator";

return next1->info;

}

};

 

private:

Uzel *head;  //указатель на начало списка

Uzel *tail;  //указатель на конец списка

List& operator=(const List&);

List (const List &);

 

iterator head_iterator;

iterator tail_iterator;

public:

 

//  перегрузки операторов ввода вывода

friend ostream & operator << (ostream &output, const struct Car &car);

friend ostream & operator << (ostream &output, const struct Parking &parking);

 

friend class iterator;

List( )

countElements = 0;

head = tail = new Uzel;

tail->next = 0;

tail->prev = 0;

head_iterator = iterator(head);

tail_iterator = iterator(tail);

}

 

List(T info) // конструктор (создание списка, содержащего один элемент)

{

countElements = 1;

head = tail = new Uzel;

tail->next = 0;        

tail->prev = 0;

head_iterator = iterator(head);

tail_iterator = iterator(tail);

add_front(info);

}

 

int getSize() //получаем размер контейнера

{ return countElements; }

 

~List( ) //  деструктор

Uzel *del = head;

for (Uzel *sn = head; sn != tail; )

{

sn = sn->next;

delete del;

del = sn;

        }

delete del;

head = NULL;

tail = NULL;

}

 

void clear()

{

while(tail!=head)

{

Uzel* a = tail;

tail = tail->prev;

delete a;

}

countElements = 0;

head = tail = new Uzel;

tail->next = 0;

tail->prev = 0;

head_iterator = iterator(head);

tail_iterator = iterator(tail);

}

 

bool is_empty( )  //проверка пустой список или нет

{return head == tail;}

 

iterator front( )  //получаем итератор начала контейнера

{ return head_iterator; }

 

iterator rear( )  //получаем итератор конца контейнера

{ return tail_iterator; }

 

void add_begin(T info) // добавление нового элемента в начало списка

{

countElements++;

Uzel *add = new Uzel(info);

add->next = head;

add->prev = 0;

head->prev = add;

head = add;

head_iterator = iterator(head);

}

 

bool remove_it(int key)  //удаление требуемого узла

for ( Uzel *dn = head; dn != tail; dn = dn->next )

if ( dn->info->numberID == key )    // найден узел для удалени

{

countElements--;

if (dn == head)

{

head = dn->next;

head->prev = NULL;

delete dn;

return true;

}

if (dn->prev!=NULL)

{

dn->prev->next = dn->next;

}

if(dn->next!=NULL)

{

dn->next->prev = dn->prev;

}

delete dn;        // удаление узла

                return true;

}

return false;

}

};

 

ostream &operator << (ostream &output, CarParking *car)  //перегрузка вывода структуры Car

 

cout<<"|"<<setw(11)<<car->getnumbermesta()<<"|"<<setw(9)<<car->getMark()<<"|";

cout<<setw(9)<<car->getType()<<"|"<<setw(10)<<car->getnomercar()<<"|";

cout<<setw(12);car->get_time();cout<<"|"<<endl;

cout<<"|___________|_________|_________|__________|____________|"<<endl;

 

return output;

}

 

 

 

class Parking    //класс парковки автомобилей

bool parkingID[CountM];   //парковочное место(занято/свободно)

int count;     

public:

List<CarParking*> list_t; // список припаркованных машин

Parking()        //конструктор

{

count = 0;

for(int i=0;i<CountM;i++)

{

parkingID[i]=false;

}

}

 

Parking(Parking& info)

{}

 

void readCars()  // функция чтения из файла cars.dat

{

ifstream ifile(fileCars,ios::binary); 

ifile.read((char*)&count,sizeof(int));

for(int i=0;i<count;i++)

{

int n;

ifile.read((char*)&n,sizeof(int));

char* str=new char[n+1];

ifile.read(str,n*sizeof(char));

str[n]='\0';

ifile.read((char*)&n,sizeof(int));

char* mark = new char[n+1];

ifile.read(mark,n*sizeof(char));

mark[n]='\0';

int Time;

ifile.read((char*)&Time,sizeof(int));

int numbermesta;

ifile.read((char*)&numbermesta,sizeof(int));

parkingID[numbermesta] = true;

char nomercar[9];

ifile.read(&nomercar[0],8);

nomercar[8] = '\0';

CarParking* temp = new CarParking(Time,numbermesta,str,mark,&nomercar[0]);

list_t.add_begin(temp); 

}

ifile.close();

 

}

 

void writeCars()  // функция записи структуры класса Parking в файл cars.dat

{

if(list_t.is_empty())

{

return;

}

ofstream ifile(fileCars,ios::binary);

List<CarParking*>::iterator t = list_t.front(); //устанавливаем итератор в начало списка

int n = list_t.getSize(); //получаем размер списка

ifile.write((char*)&n,sizeof(int));

do

{

CarParking* i = *(t);

int temp = strlen(i->getType());

ifile.write((char*)&temp,sizeof(int));

char* str = i->getType();

ifile.write(str,temp);

temp = strlen(i->getMark());

ifile.write((char*)&temp,sizeof(int));

str = i->getMark();

ifile.write(str,temp);

temp=i->gettime();

ifile.write((char*)&temp,sizeof(int));

temp=i->getnumbermesta();

ifile.write((char*)&temp,sizeof(int));

str =i->getnomercar();

ifile.write(str,8);

t++;

}while(t.getNext());

ifile.close();

 

}

 

 

void remove(char* nomer,double price) //выезд автомобиля с парковки

{

List<CarParking*>::iterator t = list_t.front();  //устанавливаем итератор в начало списка

 

do

{

CarParking* el = *(t);

if (strcmp(nomer,el->getnomercar())==0)  //поиск автомобиля по номеру, если найден

{

char buffer[80];

int timeC = time(NULL);  //текущее время (выезд автомобиля)

time_t second1=time(NULL);

tm* timeinfo=localtime(&second1);

char* format="%H:%M:%S";

strftime(buffer,80,format,timeinfo); 

cout<<"Время выезда автомобиля"<<buffer<<endl;

 

double r = el->Calc(price);  //получаем расчет оплаты за парковку

cout << "Внеситу сумму " << r;  // отображаем на консоли расчитанную сумму

getch();

parkingID[el->getnumbermesta()]=false;

list_t.remove_it(el->numberID); //удаляем автомобиль из списка

break;

}

t++;

 

}while(t.getNext());

 

}

 

void poisk(char* nomer) //поиск автомобиля по номеру авто

{

List<CarParking*>::iterator t = list_t.front();

int k=0;

do

{

CarParking* el = *(t);

if (strcmp(nomer,el->getnomercar())==0)

{

cout<<"_________________________________________________________"<<endl;

cout<<"|Номер места| Марка   | Тип     |Номер авт.|Время заезда| "<<endl;

cout<<"|___________|_________|_________|__________|____________| "<<endl;

cout<<el;

k=1;

getch();

break;

}

t++;

 

}while(t.getNext());

 

if(k==0)

{cout<<endl<<"Авто с таким номером на стоянке нет.";}

}

 

 

void Add()  //заезд автомобиля на парковку 

{

CarParking* c = new CarParking();

c->Read();    // ввод данных об автомобиле

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

cout<<"________________________"<<endl;

cout<<"|Номер места| Статус  |"<<endl;

cout<<"|___________|_________|"<<endl;

for(int i=0;i<CountM;i++)

{

if (!parkingID[i])

{

cout<<"|  "<<i+1<<setw(9)<<"|"<<"свободно"<<setw(2)<<"|"<<endl;

cout<<"|___________|_________|"<<endl;

}

 

}

cout << endl;

char ss[10];

int er=0,n;

//проверка на  ввод числа int (номер места)

while (true)

{

do

{

try

{

fflush(stdin);

cout<<"Введите номер места:";

cin>>ss;

n=atoi(ss);

         for(int i=0;ss[i];i++)

     {

    er=isdigit(ss[i]);//Функция isdigit() возвращает ненулевое значение, если ее аргумент 

//является цифрой. В противном случае возвращается  нуль.

if(er==0 ) 

cout<<"Oshibka vvoda!!!!Povtorite vvod: "<<endl;

cin.clear(0);

er=0;

 

               break;

}

 

}

 

if(n>=INT_MAX || n<=(-INT_MIN) ) 

cout<<"Oshibka vvoda!!!!"<<endl<<"Povtorite vvod: "<<endl;

cin.clear(0);

//n=0;

er=0;

throw error_oshibka("Perepolnenie sverhy/cnizy chisla tipa INT");

         

}

}

 

catch(int)

{

cin.clear(0);

cout<<"Chislo vixodit za predeli INT!"<<endl;

}

 

catch(error_oshibka obj)

{

obj.print();

}

 

 catch(...)

{

cout<<"Neizvestnaya oshibka"<<endl;

}

 

}while(er==0);    

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

if (n-1<CountM && !parkingID[n-1])

{

parkingID[n-1] = true;

break;

}

}

 

c->SetNumberMest(n); //занимаем место

list_t.add_begin(c);  //припарковываем автомобиль

}

};

 

ostream &operator << (ostream &output,  Parking &parking) //перегрузка вывода структуры Parking

{

List<CarParking*>::iterator t = parking.list_t.front();

int n = parking.list_t.getSize();

do

{

CarParking* i = *(t);

cout << i;

t++;

}while(t.getNext());

 

return output;} 
7  Результаты работы программы


 

 

 

 

 

 

      «Рисунок 7.1 – Главное меню»

 


 

 

 

 

 

 

 

 

 

 

 

 

 

«Рисунок 7.2 – Заезд автомобиля на парковку»

 


 

 

 

 

 

 

«Рисунок 7.3 – Просмотреть список припаркованных автомобилей»

 


 

 

 

 

 

«Рисунок 7.4 – Поиск автомобиля»

 


 

 

 

 

 

 

 

«Рисунок 7.5– Выезд автомобиля с парковки»

 

 

ЗАКЛЮЧЕНИЕ

В результате  разработан проект и выполнены все  поставленные задачи. В работе продемонстрированы основные принципы ООПиП, а именно: полиморфизм, наследование и инкапсуляция.  Разработаны механизмы обработки исключительных ситуаций (иерархия классов), механизмы работы с динамическими данными и файлами, контроля состояния потока  и др.

 

 

ЛИТЕРАТУРА

1. Луцик Ю.А., Комличенко В. Н. Объектно-ориентированное программирование на языке С++; Минск БГУИР 2008.

2. Дейтел, Х.М. Как программировать на С++ / Х.М. Дейтел, П.Д. Дейтел; пер. с англ. – М. : Бином, 2007. – 1152 с.

3. Страуструп, Б. Язык программирования С++ / Б. Страуструп; специальное издание. Пер. с англ. – СПб. : BHV, 2008. – 1098 с.

4. Шилд, Г. Программирование на Borland C++ для профессионалов / Г. Шилд. – Мн. : ООО «Попури», 1998. – 800 с.

 

 


Информация о работе Управление парковкой