Автор работы: Пользователь скрыл имя, 18 Декабря 2013 в 17:10, контрольная работа
Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько "близок к решаемой задаче", чтобы концепции ее решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания C++.
ВВЕДЕНИЕ . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . … . 3
1. Постановка задачи и обзор методов. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Структура входных и выходных данных . . . . . . . . . . . . . . . . . . . . . . . 7
3. Диаграмма классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . .8
4. Описание классов и структур. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
5. Блок-схемы и алгоритмы по шагам…….... …. . . . . . . . . . . . . . . . ….14
6.Текст программы. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .…18
7.Результаты работы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .31
ЗАКЛЮЧЕНИЕ.. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. .33
ЛИТЕРАТУРА……………. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . ..34
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,
char* format="%H:%M:%S"; //формат вывода строки -часы (24), минуты, секунды
strftime(buffer,80,format,
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->
cout<<setw(9)<<car->getType()<
cout<<setw(12);car->get_time()
cout<<"|___________|_________|
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,sizeo
for(int i=0;i<count;i++)
{
int n;
ifile.read((char*)&n,sizeof(in
char* str=new char[n+1];
ifile.read(str,n*sizeof(char))
str[n]='\0';
ifile.read((char*)&n,sizeof(in
char* mark = new char[n+1];
ifile.read(mark,n*sizeof(char)
mark[n]='\0';
int Time;
ifile.read((char*)&Time,sizeof
int numbermesta;
ifile.read((char*)&
parkingID[numbermesta] = true;
char nomercar[9];
ifile.read(&nomercar[0],8);
nomercar[8] = '\0';
CarParking* temp = new CarParking(Time,numbermesta,
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(i
do
{
CarParking* i = *(t);
int temp = strlen(i->getType());
ifile.write((char*)&temp,sizeo
char* str = i->getType();
ifile.write(str,temp);
temp = strlen(i->getMark());
ifile.write((char*)&temp,sizeo
str = i->getMark();
ifile.write(str,temp);
temp=i->gettime();
ifile.write((char*)&temp,sizeo
temp=i->getnumbermesta();
ifile.write((char*)&temp,sizeo
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(
{
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,
cout<<"Время выезда автомобиля"<<buffer<<endl;
double r = el->Calc(price); //получаем расчет оплаты за парковку
cout << "Внеситу сумму " << r; // отображаем на консоли расчитанную сумму
getch();
parkingID[el->getnumbermesta()
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(
{
cout<<"_______________________
cout<<"|Номер места| Марка | Тип |Номер авт.|Время заезда| "<<endl;
cout<<"|___________|_________|
cout<<el;
k=1;
getch();
break;
}
t++;
}while(t.getNext());
if(k==0)
{cout<<endl<<"Авто с таким номером на стоянке нет.";}
}
void Add() //заезд автомобиля на парковку
{
CarParking* c = new CarParking();
c->Read(); // ввод данных об автомобиле
// отображаем на консоли свободные парковочные места
cout<<"_______________________
cout<<"|Номер места| Статус |"<<endl;
cout<<"|___________|_________|
for(int i=0;i<CountM;i++)
{
if (!parkingID[i])
{
cout<<"| "<<i+1<<setw(9)<<"|"<<"
cout<<"|___________|_________|
}
}
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 с.