В данной работе представлена технология разработки класса, которая дает полную информацию об определенных владельцах, поиск которых можно осуществить с помощью задания таких параметров как: номер автомобиля, марка. Также с помощью запросов, можно получить конкретную информацию об автомобиле данного владельца. Графическое изображение, а также производителя автомобиля.
Постановка задачиТребуется разработать класс «Владельцы автомобилей». О владельцах должна быть известна информация: ФИО (три колонки), номер, марка машины, адрес, дата выпуска, стоимость. Разработать приложение, которое бы позволяло вводить и выводить информацию по запросу (например: предоставить информацию о машинах указанной марки (графическое изображение, производитель), о владельце определенной машины, например, дате регистрации и номера).
Анализ и исследование задачи, модели
Анализ задачи складывается из следующих шагов:
Построение концептуальной модели пользовательского интерфейса
Разработка сценария взаимодействия пользователя с приложением
Разработка информационной модели объектов
Разработка программной модели (интерфейсов классов)
Концептуальная модель пользовательского интерфейса
Для кого создается программный продукт? Данный программный продукт будет полезен для таких структур, как ГАИ, МВД. Например: для поиска авто владельца, нарушившего правила дорожного движения.
Какими знаниями обладает пользователь? Пользователь может обладать минимальными знаниями в области ПК.
Цели. Для чего проектируется программный продукт? Целью работы является программа, которая будет отображать данные об определенных владельцах автомобилей. Также она позволит добавлять информацию, новых владельцев машин, и удалять устарелые данные.
Какие проблемы есть сейчас у пользователей? Скорее всего, проблема всех пользователей - личное время. С этой программой не надо куда-то бежать и узнавать информацию где-то. Нет необходимости в долгом поиске нужных данных в интернете. Нужно всего лишь иметь данную программу.
Как пользователи представляют себе данные, которыми будет управлять программа? Таблица с данными о машинах и владельцах, графические изображения автомобилей. Справочная информация о фирмах-изготовителях.
Возможные ситуации, возникающие при использования конкретного сценария? Устаревшие данные могу дать ложную информацию. Ошибка при вводе информации. Отсутствие сведений о владельцах, либо об автомобилях.
Какая информация может понадобиться участникам сценария для достижения их целей? ФИО водителя, номер, марка машины, адрес, дата выпуска, стоимость.
Что пользователь хочет получить на выходе (решение задачи). В каком виде?
Информацию о владельце автомобиля. Некоторые параметры автомобиля. Все это можно получить в виде таблицы.
Объекты: множество владельцев автомобилей.
Действия: просмотр данных о владельцах, просмотр данных о машинах, сохранение данных, поиск по фамилии, поиск по номеру автомобиля, поиск по модели автомобиля.
Рис.1. Концептуальная модель пользовательского интерфейса
Из Рис.1: пользователь может просмотреть данные о владельцах, осуществить поиск по автомобилю, по фамилии, по номеру, с отображением информации.
Разработка сценария взаимодействия пользователя с приложением
«В соответствии с концептуальной схемой, представленной на рис.1, пользователю предоставляется возможность выбрать действие из альтернатив, предложенных программой:
Просмотреть базу данных.
Поиск владельцев и автомобилей.
Просмотреть информацию об автомобиле.
Просмотреть информацию о приложении и его авторе.
Закрыть задачу.
Если пользователь выбирает направление «Просмотреть базу данных», ему предоставляется таблица с данными об авто владельцах, имеющихся в базе, которые он может:
Отсортировать используя определенный критерий;
Если пользователь выбирает направление «Добавить к базе данных нового владельца», ему предоставляется диалоговое окно с пустыми полями, предназначенными для внесения данных о новом владельце. После заполнения полей данных он может сохранить эти изменения и распечатать содержимое базы данных.
Если пользователь выбирает направление «Поиск владельца (-ев)», ему предоставляется выбрать критерий поиска. В качестве такого критерия:
Поиск по ФИО.
Поиск по марке автомобиля.
Поиск по номеру авто.
Выбор критерия предоставляет пользователю тексты – результаты запросов.
Выбор «Закрыть задачу» приводит к завершению работы программы.
Разработка информационной модели объектов
На этапе разработки концептуальной модели был выделен объект – множество владельцев. Информацию об отдельном автовладельце можно представить в виде:
Таблица 1 «Информация об автовладельцах».
Фамилия |
Имя |
Отчество |
Город |
Адрес |
Марка |
Модель |
Номер автомобиля |
Дата регистрации |
Опираясь на таблицу 1, можно описать структуру.
Листинг 1. Структура, описывающая элемент объекта «Информация о владельцах автомобилей»:
struct Info
{
char Surname [20]; // Фамилия владельца
char Name [20]; // Имя
char MiddleName [20]; // Отчество
char City [15]; // Город
char Address [30]; // Адрес
char Brand [20]; // Марка
char Model [15]; //Модель
char NumberOfCar [10];// Номер автомобиля
TDate DateOfRegistration; // Дата регистрации
};
Из Листинга 1 можно заметить, что данные: Surname, Name, MiddleName, City, Adress, Brand, Model, NumberOfCar принадлежат типу «char» и у всех данных есть определенный диапазон, а DateOfRegistration имеет тип «TDate».
Множество автовладельцев можно представить массивом структур типа Info. И тогда это множество можно охарактеризовать двумя параметрами – Vladelec и Count (количество владельцев).
Форма 2. Информация о машинах
Данная форма отображает полную информацию о конкретном автомобиле. Также отображена информация о самой марке данного автомобиля, а также количество людей, владеющих этой машиной.
Разработка интерфейсов классов
Класс определяет новый тип данных, который задает формат объекта. Класс включает как данные, так и код, предназначенный для выполнения над этими данными. Следовательно, класс связывает данные с кодом. В С++ спецификация класса используется для построения объектов. Объекты – это экземпляр класса. По сути, класс представляет собой набор планов, которые определяют, как строить объект. Важно помнить, что класс – это логическая абстракция, которая реально не существует до тех пор, пока не будет создан объект этого класса, то есть то, что станет физическим представлением этого класса в памяти компьютера.
Определяя класс, объявляются данные которые он содержит, и код, который выполняется над этими данными.
В классе данные объявляются в виде переменных, а код оформляется в виде функций. Функции и переменные, составляющие класс, называются его членами. Таким образом, переменная, объявленная в классе, называется членом данных, а функция, объявленная в классе, называется функцией-членом.
Описание базового классаИсходя из вышеизложенного, в базовый класс целесообразно включить следующие методы: два конструктора, деструктор, функция возвращения информации, функция отображения информации в таблице, две функции поиска по определенным критериям. Интерфейс базового класса представлен на листинге 2.
Листинг 2. Класс «Владельцы автомобилей»:
class Vladelec
{
Info*Vladelec; // Информация о владельцах
int Count; // Количество владельцев
public:
Vladelec (); // Конструктор
Vladelec (char*nameFile);
~Vladelec (); // Деструктор
void GetInfoAboutVladelec (); // Вернуть информацию о владельце
void PutToGrid (TStringGrid* aGrid);// Отображает информацию о владельцах
void FindByNumber (TStringGrid* aGrid);//Поиск по номеру авто
void FindBySurname(TStringGrid* aGrid);// Выполняет поиск по фамилии владельца
}
Описание методов базового класса
Конструктор без параметров:
Vladelec ();
Он не имеет параметров. В нем поля класса инициализируются нулевыми значениями.
Конструктор с параметром:
Vladelec(char*nameFile);
Считывает название файла.
Функция для отображения информации о владельцах - void PutToGrid (TStringGrid* aGrid). Имеет один входной параметр – указатель на StringGrid. Описание функции можно посмотреть на листинге 3.
Листинг 3. Функция, отображающая информацию о владельцах в таблице:
void Vladelec ::PutToGrid (TStringGrid* aGrid)
{
aGrid->Cells[0][0]= "Фамилия";
aGrid->Cells[1][0]= "Имя";
aGrid->Cells[2][0]= "Отчество";
aGrid->Cells[3][0]= "Город";
aGrid->Cells[4][0]= "Адрес";
aGrid->Cells[5][0]= "Марка машины";
aGrid->Cells[6][0]= "Модель";
aGrid->Cells[7][0]= "Номер";
aGrid->Cells[8][0]= "Дата регистрации";
fstream iFin;
iFin.open("vladelci.txt", ios::in);
if (!iFin)
return;
if (iFin.eof())
return;
char Str[150];
char*word;
int i=1;
while (!iFin.eof())
{
iFin.getline (Str,150);
int size = strlen(Str);
Str[size]=' ';
Str[size+1]=''; //конец строки
int j=1;
word=strtok(Str, " "); //читает первое слово
aGrid->Cells[j-1][i]=word;
while (word!=NULL)
{
word=strtok (NULL, " ");
aGrid->Cells[j++][i]=word;
}
i++;
}
}
Идея алгоритма, показанного на Листинге 1, заключается в следующем:
- открывается файл для чтения
- если файл существует и не является пустым, то цикл повторяется пока есть данные в файле
- в цикле читается очередная строка, с помощью GetLine, в строке последовательно выделяются слова один за другим и помещаются в сетку StringGrid
- Strtok последнее слово в строке
Обозначение данных:
iFin – файловая переменная
char Str[100] – вспомогательная строка
Char*Word – указатель на слово
i – текущий номер строки
j – текущий номер столбца
Функция поиска владельцев по определенным критериям, а именно по фамилии - void FindBySurname(TStringGrid* aGrid). Имеет один входной параметр – указатель на StringGrid. Описание функции можно посмотреть на листинге 4.
Листинг 4. Функция поиска владельцев по определенным критериям, а именно по фамилии - void FindBySurname(TStringGrid* aGrid):
void Vladelec ::FindBySurname (TStringGrid* aGrid)
{
StringGrid2->Cells[0][0]= "Фамилия";
StringGrid2->Cells[1][0]= "Имя";
StringGrid2->Cells[2][0]= "Отчество";
StringGrid2->Cells[3][0]= "Город";
StringGrid2->Cells[4][0]= "Адрес";
StringGrid2->Cells[5][0]= "Марка машины";
StringGrid2->Cells[6][0]= "Модель";
StringGrid2->Cells[7][0]= "Номер";
StringGrid2->Cells[8][0]= "Дата регистрации";
AnsiString Btr = InputBox("Ввод данных", "Введите фамилию", "...");
int i, j, N, a;
int Temp = StringGrid1->RowCount;
int *Num = new int[Temp];// массив где будут хранится номера
N=0; //счетчик количества совпадений или индекс
for (i = 1; i < Temp; i++)
{
AnsiString P = StringGrid1->Cells[0][i];
if (P.AnsiCompare(Btr)==0)
Num[N++] = i;
}
int k=1;
for (i = 0; i < N; i++)
{
StringGrid2->Cells[0][k] = StringGrid1->Cells[0][Num[i]];
StringGrid2->Cells[1][k] = StringGrid1->Cells[1][Num[i]];
StringGrid2->Cells[2][k] = StringGrid1->Cells[2][Num[i]];
StringGrid2->Cells[3][k] = StringGrid1->Cells[3][Num[i]];
StringGrid2->Cells[4][k] = StringGrid1->Cells[4][Num[i]];
StringGrid2->Cells[5][k] = StringGrid1->Cells[5][Num[i]];
StringGrid2->Cells[6][k] = StringGrid1->Cells[6][Num[i]];
StringGrid2->Cells[7][k] = StringGrid1->Cells[7][Num[i]];
StringGrid2->Cells[8][k] = StringGrid1->Cells[8][Num[i]];
k++;
}
}
Функция в блоксхеме, изображена на рис. 2.
Рис. 2.
Функция поиска владельцев по определенным критериям, а именно по номеру машины - void FindByNumber(TStringGrid* aGrid). Имеет один входной параметр – указатель на StringGrid. Описание функции можно посмотреть на листинге 5.
Листинг 5. Функция поиска владельцев по определенным критериям, а именно по номеру машины - void FindByNumber(TStringGrid* aGrid):
void Vladelec ::FindByNumber (TStringGrid* aGrid)
{
StringGrid2->Cells[0][0]= "Фамилия";
StringGrid2->Cells[1][0]= "Имя";
StringGrid2->Cells[2][0]= "Отчество";
StringGrid2->Cells[3][0]= "Город";
StringGrid2->Cells[4][0]= "Адрес";
StringGrid2->Cells[5][0]= "Марка машины";
StringGrid2->Cells[6][0]= "Модель";
StringGrid2->Cells[7][0]= "Номер";
StringGrid2->Cells[8][0]= "Дата регистрации";
AnsiString Ttr = InputBox("Ввод данных", "Введите номер авто", "...");
int i, j, N, a;
int Temp = StringGrid1->RowCount;
int *Num = new int[Temp];// массив где будут хранится номера
N=0; //счетчик количества совпадений или индекс
for (i = 1; i < Temp; i++)
{
AnsiString P = StringGrid1->Cells[7][i];
if (P.AnsiCompare(Ttr)==0)
Num[N++] = i;
}
int k=1;
for (i = 0; i < N; i++)
{
StringGrid2->Cells[0][k] = StringGrid1->Cells[0][Num[i]];
StringGrid2->Cells[1][k] = StringGrid1->Cells[1][Num[i]];
StringGrid2->Cells[2][k] = StringGrid1->Cells[2][Num[i]];
StringGrid2->Cells[3][k] = StringGrid1->Cells[3][Num[i]];
StringGrid2->Cells[4][k] = StringGrid1->Cells[4][Num[i]];
StringGrid2->Cells[5][k] = StringGrid1->Cells[5][Num[i]];
StringGrid2->Cells[6][k] = StringGrid1->Cells[6][Num[i]];
StringGrid2->Cells[7][k] = StringGrid1->Cells[7][Num[i]];
StringGrid2->Cells[8][k] = StringGrid1->Cells[8][Num[i]];
k++;
}
}
Разработка схемы движения информации
Пользователь должен знать:
что он хочет получить на выходе (решение задачи);
как минимум одну последовательность действий, приводящую к успешному результату;
где ему найти все объекты, участвующие в процедуре решения;
как определять пригодность объектов для их использования;
как управляться с объектами.
Список, как видим, довольно внушительный. И, если с первым пунктом проблем обычно не возникает, то остальные требуют определенных усилий. А помочь разобраться в том должен интерфейс, с встроенной системой подсказок действий. Следовательно, должен быть продуман механизм управления программой через элементы интерфейса.
Структурную схему можно представить следующим образом:
«Просмотреть базу данных»:
Просмотр информации в базе данных
Выполнить поиск по Фамилии
Выполнить поиск по Номеру
Возврат на главную
«Информация об автомобиле»:
Выбрать марку автомобиля из списка
Вывод информации о марке
Выбрать модель автомобиля из списка
Просмотреть графическое изображение выбранного автомобиля
Вернуться на главную
«Полезная информация»:
Пользователь может просмотреть информацию о приложении и его разработчике
Вернуться на главную
«Выход».
Схема движения информации
Структурная схема интерфейса показана на рис. 3.
Рис 3.
Описание интерфейса приложения
Для решения поставленной задачи в соответствии с разработанной схемой было создано приложение, интерфейс которого включает в себя 4 формы. Рассмотрим их подробнее:
Form1. Является главной формой. Содержит следующие элементы: TLabel, TImage, TBitBtn. Интерфейс формы представлен на рисунке 4.
Рис. 4.
Нажав на кнопку «Посмотреть базу данных» откроется вторая форма, на которой отображаются данные о владельцах. Кнопка «Информация об авто», открывает форму 3 где можно выбрать определенную марку и модель автомобиля. Кнопка «Полезная информация» отображает информацию о программе и авторе.
Form2. При нажатие на Form1 на кнопку «Посмотреть базу данных», открывается Form2. Она содержит следующие элементы: TLabel, TStringGrid, TImage, TBitBtn. Интерфейс формы представлен на рисунке 5.
Рис. 5.
Первый элемент StringGrid1, загружает информацию о владельцах из файла. Если нажать на кнопку «Поиск по Фамилии», то откроется окно, где потребуется ввести фамилию для поиска. Результаты поиска отображаться во второй таблице StringGrid2. Аналогично с кнопкой «Поиск по Номеру автомобиля». Кнопка «Выполнить поиск по автомобилю» откроет форму 3.
Form1. При нажатие на Form1 на кнопку «Информация об авто», открывается Form3. Она содержит следующие элементы: TLabel, TBitBtn, TEdit, TComboBox, TImage, TImageList, TMainMenu, TMemo. Интерфейс формы представлен на рисунке 6.
Рис. 6.
Нажав на элемент ComboBox1 можно выбрать марку автомобиля из 40 пунктов. Нажав на кнопку «Выбрать модель», а также на элемент ComboBox2, можно выбрать модель данной марки. В Memo1 появится информация о выбранной марке.
Form1. При нажатие на Form1 на кнопку «Полезная информация», открывается Form4. Она содержит следующие элементы: MainMenu, PageControl. Интерфейс формы представлен на рисунке 7, 8.
Рис. 7.
Выбрав первую вкладку «О программе» в элементе PageControl1 можно просмотреть информацию о представленном приложении.
Рис. 8.
Выбрав вторую вкладку «Об авторе» в элементе PageControl1 можно просмотреть информацию об авторе.
Разработка схемы связности модулейФункционирование программ приложения формируется на базе следующих модулей:
Project4.dpr – главный модуль, процедурами которого являются следующие модули: Unit1.pas, Unit2.pas, Unit3.pas, Unit4.pas, MyUnit.pas.
Unit1.dfm, Unit1.cpp – модули, соответствующий главной форме Form1, с помощью которой осуществляется начало работы с программой. Форма названа «Главная».
Unit2.dfm, Unit2.cpp – модули, соответствующие основной форме Form2, с помощью которой можно просмотреть базу данных и выполнить поиск по определенным критериям.
Unit3.dfm, Unit3.cpp – модули, соответствующие форме Form3, с помощью которой можно просмотреть информацию об определенной марке и модели автомобиля.
Unit4.dfm, Unit4.cpp – модули, соответствующие форме Form4, с помощью которой осуществляется презентация информации о программном продукте и его авторе.
MyUnit.cpp – модуль, содержащий классы для решения задачи. Реализующий класс Vladelec.
Между модульной структурой и структурами данных существует связь, которая может быть представлена в виде следующей схемы (рис.9).
Рис. 9.
Тестирование программы
Процесс тестирования можно разделить на три этапа:
Проверка в нормальных условиях. Для данной задачи – наличие исходного, совпадающего по названию с загруженным пользователем изображением, но измененным расширением, текстового файла с данными.
Здесь не возникает никаких ошибок, программа работает должным образом.
Проверка в экстремальных условиях. Тестовые данные включают граничные значения области изменения входных переменных, которые должны восприниматься программой как правильные данные.
Проверка в исключительных ситуациях. Проводится с использованием данных, значения которых лежат за пределами допустимой области изменений.
Для тестирования приложения были получены данные о 20 владельцах автомобилей. Эти данные занесены в файл – «vladelec.txt». Отображенные данные соответствуют действительным данным.
Поиск по критериям: Фамилия и Номер:
Поиск работает правильно, выводя информацию об определенных владельцах.
Поиск по автомобилю:
Приложение работает исправно: получены данные о 40 марок автомобилей, а также 175 моделей автомобилей. Все данные соответствуют действительности.
ЗаключениеВ процессе разработки программного приложения для решения конкретной задачи было проделано следующее:
изучена литература по теме;
разработана математическая модель решения задачи;
разработаны классы;
разработаны алгоритмы методов класса и обработчиков событий;
разработан интерфейс приложения;
разработана схема движения информационных потоков;
произведено тестирование приложения;
Можно выделить следующие перспективы в усовершенствовании разрабатываемого приложения:
- Можно расширить базу данных об автомобилях, т.к. в приложении заданно малое количество критерий, по которым можно отсортировать их. Например можно добавить пункт, при выборе автомобиля по дате изготовления, т.к. в разные промежутки времени выпуска авто, внешний вид его меняется – совершенствуется.
- Добавить больше данных о владельце. Хранить информацию о прежних автомобилях данного владельца.
- Также можно добавить информацию о нарушениях правил дорожных движений данного владельца, но это исключительно для государственных структур.
ЛитератураКонспект лекций.
С.А.Рыбалка, Г.И.Шкатова. Методические указания «Языки программирования и методы трансляции» — Томск: изд. ТПУ, 2000 г. — 88 с.
Страуструп Б. «Язык программирования С++». — М.: Радио и связь, 1991 г. А.Я. Архангельский «C++ Builder 6 Справочное пособие Книга 1 Язык C++»
А.Я. Архангельский «C++ Builder 6 Справочное пособие Книга 2: Классы и компоненты»