Автостоянки

Введение

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

Связь между языком, на котором мы думаем/программируем, и задачами и решениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Как и в случае с естественными языками, есть огромная польза быть по крайней мере двуязычным. Язык предоставляет программисту набор концептуальных инструментов; если они не отвечают задаче, то их просто игнорируют. Например, серьезные ограничения концепции указателя заставляют программиста применять вектора и целую арифметику, чтобы реализовать структуры, указатели и т.п. Хорошее проектирование и отсутствие ошибок не может гарантироваться чисто за счет языковых средств.

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

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

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

Добавление, удаление автомобилей со стоянок.

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

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

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

Смещение в файле

Описание

0х00

Индефикатор файла ( “AM” )

0х02

Количество столбцов

0х03

Номер автоувеличивающегося столбца

0х04

Номер последнего автоувеличения

0x06

Описание полей базы (размер, название)

Область с данными (информация о длине берётся из описания полей).

Для хранения информации о марках машин используется файл models.bas. Структура файла представлена ниже:

id

model

id”- индефикатор марки машины

model ”- название марки машины

Для хранения информации о районах используется файл districts.bas. Структура файла представлена ниже:

id

district

id”- индефикатор района

district”- название района

Для хранения информации о стоянках используется файл stations.bas. Структура файла представлена ниже:

id

station

sid

id”- индефикатор стоянки

station”- название стоянки

sid”- индефикатор района, к которому принадлежит стоянка

. Для хранения информации о автомобилях используется файл cars.bas. Структура файла представлена ниже:

id

model

number

owner

cid

did

id”- индефикатор автомобиля

model ”- модель автомобиля

number ”- номер автомобиля

owner ”- имя владельца автомобиля

cid ”- индефикатор стоянки, в котором стоит автомобиль

did ”- индефикатор района, в котором стоит автомобиль

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

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

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

5.1 CColumn

Класс предназначен для задания типов столбцов таблицы.

class CColum

{

string name; // Название поля

unsigned int length; // Длина поля (совпадает с индефикатором типа)

bool autoit; // Ключ. Показывает, нужно ли автоувеличение

public:

// Конструктор принимает название поля и его тип

CColumn(string&ss,unsigned int len);

// Конструктор принимает название поля,его тип и ключ автоувеличения.

CColumn(string&ss,unsigned int len,int aa);

bool isauto(); // Являтся ли поле автоувеличивающися

string&getname(); // Возвращает имя поля

unsigned int gettype(); // Возвращает тип поля

};

Следует отметить, что автоувеличение применяется только к целым типам.

5.2 СRecord

Класс предназначен для хранения одной ячкейки базы данных. Агрегируется только классом Row.

class СRecord

{

string name; // Название поля

string data; // Данные

unsigned int type; // Тип поля

public:

void setname(string&nam); // Установить имя поля

void setdata(string&dat); // Установить данне

void settype(unsigned int&typ); // Установить тип

string&getname(); // Получить имя поля

string&getdata(); // Получить данные

unsigned int gettype(); // Получить тип

};

5.3 CRow

Класс предназначен для хранения и строк данных, полученных в результате поиска

данных или внесения изменений в таблицу.

class CRow

{

vectorrec; // Вектор ячеек строке

int flag; // Флаг для оператора присваивания ( временное хранение )

string name; // Имя для оператора присваивания ( временное хранение )

unsigned int type; // Тип для оператора присваивания ( временное хранение )

public:

CRow(); // Конструктор

void reset(); // Обнуляет строку

void setrow(vector&v); // Вводит строку в виде ячеек

vector&getrow(); // Вводит строку в виде ячеек

string operator[](string ss); // Возвращает значение по ключу

int operator()(string ss); // Возвращает тип по ключу

// Первая часть составного оператора присваивания

Row&operator()(string ss,unsigned int typ);

// Вторая часть составного оператора присваивания

void operator=(string dat);

};

5.4 CTable

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

class CTable

{

vector types; // Информацию о типах

string filename; // Название файла, с которым идёт работа

fpos_t startdata; // Начало области данных в файле

int getfullsize(); // Возвращает длину строки

public:

CTable(string&filename); // Конструктор принимает название файла

Is(); // Проверяет существование базы

vector GetCap(); // Возвращает информацию о типах

int getrows(); // Возвращает число строк

// Создание базы. Принимает вектор столбцов. Если будет более одного автоувеличивающе-

// гося столбца, то она применится только к первому

bool CreateTable(vector&type);

bool AddRow(CRow&rr); //Добавляет строку

// Осуществляет поиск данных по точному совпадению строки

// Запись, найденных значений идёт в массив finded

void GetStr(vector&finded,string nam,string dat);

// Осуществляет поис данных по вхождению строки

// Запись, найденных значений идёт в массив finded

void GetCmp(vector&finded,string nam,string dat)

bool DeleteData(string nam,string dat); // Удаляет строку при точном совпадением

// Изменяет строку c ключом nam и значением dat на rr.

bool ChangeData(CRow&rr,string nam,string dat);

};

6 Алгоритм по шагам

6.1 CTable(string&filename)

1. Сохранения значения переменной filename во внутренней переменной класса filename.

2. Проверка существования файла filename.

3. Если файл существует, то считать информацию о полях таблицы, начале данных, текущее автоувеличение.

6.2 CTable::AddRow(CRow&rr)

1. Открытие файла, заданного в переменной filename и занесение индефикатора файла в FILE*file.

2. Запись текущего автоувеличения, увеличенного на 1.

3. Смещения в конец файла file.

4. Запись введённой строки rr.

6.3 CTable::GetCmp(vector&finded,string nam,string dat)

1. Открытие файла, заданного в переменной filename и занесение индефикатора файла в FILE*file.

2. Смещение на начало данных.

3. Считывание строки из файла и занесение в CRow ww.

4. Сравнение ww[“nam”] и dat.

5. Если совпадает, то добавить строку в vector finded.

6. Если не совпадают, то перейти на пункт 2 (повторить, пока не будет достигнут конец файла).

6.4 CTable::ChangeData(CRow&rr,string nam,string dat)

1. Открытие файла, заданного в переменной filename и занесение индефикатора файла в FILE*file.

2. Смещение на начало данных.

3. Считывание строки из файла и занесение в CRow ww.

4. Сравнение ww[“nam”] и dat.

5. Если совпадают, то сместиться на начало считанной строки и записать строку rr.

6. Если не совпадает, то перейти на пункт 2(повторить, пока не будет достигнут конец файла).

6.5 CTable::DeleteData(string nam,string dat)


Случайные файлы

Файл
185798.doc
55224.rtf
metod Follya.doc
35703.rtf
66648.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.