Наименование
|
Обозначение
|
Примечание
|
bus. bpr
|
Файл проекта
|
Связывает все файлы, из которых состоит
приложение
|
bus. cpp
|
Файл программного модуля проекта
|
|
bus,jpg
|
Рисунок
|
Предназначается для вывода изображения в
главной форме
|
bus. obj
|
Объектный файл для bus. cpp
|
Откомпилированная версия bus. cpp
|
bus. res
|
Файл ресурсов
|
Содержит пиктограммы, графические изображения
|
bus. tds
|
Таблица символов Turbo Debugger
|
|
bus. txt
|
Файл базы данных
|
Содержит сведения об автобусах
|
BusFrm. cpp
|
Файл программного модуля для формы
"Автобусы"
|
Определяет функциональность формы "Автобусы"
|
BusFrm. ddp
|
Вспомогательный файл модуля
|
Определяет вспомогательные файлы модуля BusFrm. cpp
|
BusFrm. dfm
|
Файл формы "Автобусы"
|
Содержит список свойств всех компонентов,
включенных в форму "Автобусы"
|
BusFrm. h
|
Файл заголовка для BusFrm. cpp
|
Содержит объявления классов и функций
|
BusFrm. obj
|
Объектный файл для BusFrm. cpp
|
Откомпилированная версия BusFrm. cpp
|
MainFrm. cpp
|
Файл программного модуля для главной формы
|
Определяет функциональность главной формы
|
MainFrm. ddp
|
Вспомогательный файл модуля
|
Определяет вспомогательные файлы модуля MainFrm. cpp
|
MainFrm. dfm
|
Файл главной формы
|
Содержит список свойств всех компонентов,
включенных в главную форму
|
MainFrm. h
|
Файл заголовка для MainFrm. cpp
|
Содержит объявления классов и функций
|
MainFrm. obj
|
Объектный файл для MainFrm. cpp
|
Откомпилированная версия MainFrm.
cpp
|
2.1
Текст программы
Текст файла bus. cpp
#include <vcl. h>
#pragma hdrstop
//
---------------------------------------------------------------------------("MainFrm.
cpp", frmMain);("BusFrm. cpp", frmBus);
//
---------------------------------------------------------------------------WinMain
(HINSTANCE, HINSTANCE, LPSTR, int)
{
{>Initialize ();>CreateForm (__classid
(TfrmMain), &frmMain);>CreateForm (__classid (TfrmBus),
&frmBus);>Run ();
}(Exception &exception)
{>ShowException (&exception);
}(.)
{
{Exception ("");
}(Exception &exception)
{>ShowException (&exception);
}
}0;
}
Текст файла MainFrm. h
#ifndef MainFrmH
#define MainFrmH
//
---------------------------------------------------------------------------
#include <Classes. hpp>
#include <Controls. hpp>
#include <StdCtrls. hpp>
#include <Forms. hpp>
#include <ExtCtrls. hpp>
#include <jpeg. hpp>
#include <Menus. hpp>
#include <Grids. hpp>
//
---------------------------------------------------------------------------TfrmMain:
public TForm
{
__published: // IDE-managed
Components*Image1;*Label1;*Label2;*MainMenu1;*N1;*N3;*N4;*N5;*N6;*NRoute;*NPark;*N9;*N10;*N11;*N12;*Panel1;*Bevel1;*sgBus;*btnExit;*btnAddBus;*btnDelBus;*btnSave;*busPark;*busRoute;*lblBus;*btnEdit;*btnOut;*btnIn;*N2;*N13;*N14;*N15;*Bevel2;__fastcall
N12Click (TObject *Sender);__fastcall btnAddBusClick (TObject
*Sender);__fastcall btnDelBusClick (TObject *Sender);__fastcall btnSaveClick
(TObject *Sender);__fastcall busParkClick (TObject *Sender);__fastcall
busRouteClick (TObject *Sender);__fastcall btnEditClick (TObject
*Sender);__fastcall btnOutClick (TObject *Sender);__fastcall btnInClick
(TObject *Sender);: // User declarations: // User declarations
__fastcall TfrmMain (TComponent* Owner);mode; //
режим вывода: 1 - в парке, 2 - на маршруте
}; int l_FIO = 30;
// структура автобус
struct Bus{numBus; // номер автобуса FIO [l_FIO]; // ФИО водителя
int route; // номер маршрута
Bus* next; // следующий элемент
};* __fastcall add (Bus* beg, const Bus&
bus);* __fastcall find (Bus* pv, int num, Bus** prev);__fastcall print_dbase
(Bus* beg);__fastcall editBus (Bus* beg, int numbus);* __fastcall read_dbase
(char* filename);__fastcall new_bus ();__fastcall write_dbase (char *filename,
Bus *park, Bus *route);* __fastcall remove (int num, Bus* beg);
//
---------------------------------------------------------------------------PACKAGE
TfrmMain *frmMain;
// ---------------------------------------------------------------------------
#endif
Текст файла MainFrm. cpp
//
---------------------------------------------------------------------------
#include <vcl. h>
#include "stdio. h"
#pragma hdrstop
#include "MainFrm. h"
#include "BusFrm. h"
// ---------------------------------------------------------------------------
#pragma package (smart_init)
#pragma resource "*. dfm"*frmMain; *beg; // начало списка машин
в парке
Bus *beg_r; // начало списка машин на маршруте
// Функция - присоединение автобуса к нужному списку
// возвращает указатель на начало списка
// принимает указатель на начало и присоединяемый автобус
Bus* __fastcall add (Bus* beg, const Bus&
bus)
{*pv = new Bus;
*pv = bus;->next = 0;
if (beg) // список не пуст
{* temp = beg;(temp->next)=
temp->next;>next = pv;
}
else // список был пуст, поэтому началом сейчас
является
// присоединяемый автобус
beg = pv;
return beg;
}
// поиск автобуса в списке по номеру перебором всех элементов
списка
// возвращает указатель на найденный автобус или 0, если не
найден
// принимает указатель на начало списка, номер автобуса и
указатель на элемент,
// предшествующий найденному* __fastcall find
(Bus* pv, int num, Bus** prev)
{
*prev = 0;(pv)
{(pv->numBus == num)
{pv;
}
*prev = pv;= pv->next;
}0;
}__fastcall find_bus (Bus* beg, int numbus)
{
}
// вывод списка автобусов на экран
// принимает указатель на начало списка
void __fastcall print_dbase (Bus* beg)
{* pv = beg;i = 0;>sgBus->RowCount = 2; //
очищаем сетку>sgBus->Cells [0] [1] = "";>sgBus->Cells [1]
[1] = "";>sgBus->Cells [2] [1] = "";(! beg) return;
// список пуст(pv)
{++;>sgBus->Cells [0] [i] = IntToStr
(pv->numBus);>sgBus->Cells [1] [i] = pv->FIO;>sgBus->Cells
[2] [i] = IntToStr (pv->route);>sgBus->RowCount =
frmMain->sgBus->RowCount + 1;= pv->next;
}>sgBus->RowCount =
frmMain->sgBus->RowCount - 1;
}
// редактирование автобуса
// принимает указатель на начало списка и номер автобуса
int __fastcall editBus (Bus* beg, int numbus) //
корректировка
{* prev;* pv = find (beg, numbus, &prev);i;(!
pv) return 1; // не найден
// заполняем поля формы старыми значениями из структуры
frmBus->medNumBus->Text = IntToStr
(pv->numBus);>edFIO->Text = pv->FIO;>medRoute->Text =
IntToStr (pv->route);>ShowModal ();(frmBus->ModalResult == mrOk)
{
// заполняем структуру новыми
значениями>numBus = StrToInt (Trim
(frmBus->medNumBus->Text));(pv->FIO,frmBus->edFIO->Text. c_str
());(i = strlen (pv->FIO); i<l_FIO; i++)>FIO [i] = ' ';>FIO [l_FIO
- 1] = '\0';>route = StrToInt (Trim (frmBus->medRoute->Text));
}
return 0;
}
// загрузка бд из файла
// принимает название файла
// возвращает указатель на начало списка
Bus* __fastcall read_dbase (char* filename)
{* fin;bus, *beg = 0;symbol;( (fin = fopen
(filename, "r")) == 0)
{
ShowMessage ("Не найден файл базы данных");
return 0;
}
symbol=fgetc (fin);
if (symbol! =EOF) // если файл не пустой - вернемся к началу,
если пустой - будет feof ()
fseek (fin, 0L, SEEK_SET); // и вернется указатель - 0
while (! feof (fin))
{
fscanf (fin, "%3d",&bus. numBus); // заполняем структуру
fgets (bus. FIO, l_FIO, fin);
fscanf (fin, "%3d\n",&bus. route); = add (beg, bus); // присоединяем к
списку
}
if (feof (fin)) // конец файла(fin); // закроем файлbeg;
}
// создание нового автобуса
// функция возвращает структуру автобус
Bus __fastcall new_bus ()
{bus; i;
// Очищаем поля ввода в форме создания автобуса
frmBus->medNumBus->Text =
"";>edFIO->Text = "";>medRoute->Text =
"";>ShowModal (); (frmBus->ModalResult == mrOk)
{
// заполняем структуру введенными значениями
bus. numBus = StrToInt (Trim (frmBus->medNumBus->Text));(bus.
FIO, frmBus->edFIO->Text. c_str ());(i = strlen (bus. FIO); i<l_FIO;
i++). FIO [i] = ' ';. FIO [l_FIO - 1] = '\0';. route = StrToInt
(frmBus->medRoute->Text);
}
return bus;
}
// запись обоих списков в один файл автобусов
// при открытии программы в след. раз они все будут в парке
// функция принимает название файла, указатели на начало
обоих списков
int __fastcall write_dbase (char *filename, Bus
*park, Bus *route)
{
FILE *fout; // открываем файл для записи
if ( (fout = fopen (filename, "w")) ==
NULL) // файла нет
{
// ShowMessage ("Ошибка открытия файла для записи"));
return 1;
}
// fseek (fout, 0L, SEEK_SET); (park) // выбираем машины из
парка
{(fout, "%03d%s%03d\n",
park->numBus, park->FIO, park->route); = park->next;
}
while (route) // выбираем машины на линии
{(fout, "%03d%s%03d\n",
route->numBus, route->FIO, route->route);= route->next;
}(fout); // закрываем файл 0;
}
// удаление автобуса из списка
// функция принимает значения - номер автобуса, указатель на
начало списка
// возвращаеет указатель на начало списка
Bus* __fastcall remove (int num, Bus* beg)
{* prev;* pv = find (beg, num, &prev); //
ищем по номеру
(pv) // найден
{
if (pv == beg) // начало списка
beg = beg->next;
else // удаление из середины или конца списка
prev->next = pv->next;pv;
}beg;
}
//
---------------------------------------------------------------------------
// создание главной формы
__fastcall TfrmMain:: TfrmMain (TComponent*
Owner)
: TForm (Owner)
{= 1;>Cells [0] [0] = "Номер автобуса";>Cells
[1] [0] = "Водитель";>Cells [2] [0] = "Номер маршрута";=
read_dbase ("bus. txt"); // считываем базу из файла(! beg)
{= NULL;
}_dbase (beg); // выводим на экран_r = NULL;
}
//
---------------------------------------------------------------------------__fastcall
TfrmMain:: N12Click (TObject *Sender)
{>Terminate ();
}
//
---------------------------------------------------------------------------
// кнопка Добавить автобус__fastcall TfrmMain::
btnAddBusClick (TObject *Sender)
{
if (mode==1) // если это список в парке
{
beg = add (beg, new_bus ()); // то присоединяем структуру к списку парка
print_dbase (beg); // выводим на экран обновленную базу
}
else
{
beg_r = add (beg_r, new_bus ()); // иначе к списку машин на маршрутах
print_dbase (beg_r); // выводим на экран обновленную базу
}
//
---------------------------------------------------------------------------
// кнопка Удалить автобус__fastcall TfrmMain::
btnDelBusClick (TObject *Sender)
{num;( (sgBus->Row > 0) &&
(sgBus->Row < sgBus->RowCount)) // если строка сетки выбрана
{= StrToInt (sgBus->Cells [0]
[sgBus->Row]); // номер автобуса в первой ячейке (mode==1) // если это список в
парке
{
beg = remove (num, beg); // то удаляем структуру из списка парка
print_dbase (beg); // выводим на экран обновленную базу
}
else
{
beg_r = remove (num, beg_r); // иначе из списка машин на маршрутах
print_dbase (beg_r);
}
}
}
//
---------------------------------------------------------------------------
// Кнопка Записать в файл
void __fastcall TfrmMain:: btnSaveClick (TObject
*Sender)
{(! write_dbase ("bus. txt",beg,beg_r))
ShowMessage ("База записана");
}
//
---------------------------------------------------------------------------
// Кнопка Автобусы в парке__fastcall TfrmMain::
busParkClick (TObject *Sender)
{= 1;>lblBus->Caption = "Автобусы в
парке: ";_dbase (beg); // печатаем список
парка
btnIn->Enabled = false; // кнопка Направить в парк недоступна
btnOut->Enabled = true; // кнопка Направить на маршрут доступна
NPark->Enabled = false; // пункт меню Направить в парк
NRoute->Enabled = true; // пункт меню Направить на маршрут
}
//
---------------------------------------------------------------------------
// Кнопка автобусы на маршруте__fastcall
TfrmMain:: busRouteClick (TObject *Sender)
{= 2;>lblBus->Caption = "Автобусы на
маршруте: ";_dbase (beg_r);
// показ списка машин на линии
btnIn->Enabled = true; // кнопка Направить в парк доступна
btnOut->Enabled = false; // кнопка Направить на маршрут недоступна
NPark->Enabled = true; // меню>Enabled =
false;
}
// ---------------------------------------------------------------------------
// Кнопка Редактировать данные__fastcall
TfrmMain:: btnEditClick (TObject *Sender)
{num;( (sgBus->Row > 0) &&
(sgBus->Row < sgBus->RowCount)) // если выбрана строка в сетке
{= StrToInt (Trim (sgBus->Cells [0]
[sgBus->Row])); // номер автобуса из первой ячейки(mode==1) // выбранной
строки
{(beg, num); // список парка_dbase (beg);
}
{(beg_r, num); // список маршрутов_dbase (beg_r);
}
}
}
// ---------------------------------------------------------------------------
// кнопка Направить на маршрут
void __fastcall TfrmMain:: btnOutClick (TObject
*Sender)
{* prev;num;( (sgBus->Row > 0) &&
(sgBus->Row < sgBus->RowCount))
{= StrToInt (Trim (sgBus->Cells [0]
[sgBus->Row]));* pv = find (beg, num, &prev); // ищем по номеру в списке парка
if (pv) // найден
{
if (pv == beg) // начало списка
beg = beg->next; // устанавливаем указатель на начало на след.
элемент
else // удаление из середины или конца списка
prev->next = pv->next; // связываем предыдущий и следующий элементы
beg_r = add (beg_r, *pv); // привязываем элемент к другому списку -
машин на маршрутах
}
print_dbase (beg);
}
}
//
---------------------------------------------------------------------------
// Кнопка Направить в парк
// делает то же самое, что и предыдущая функция, но наоборот
-
// переносит из списка на маршрутах в список парка
void __fastcall TfrmMain:: btnInClick (TObject
*Sender)
{num;( (sgBus->Row > 0) &&
(sgBus->Row < sgBus->RowCount))
{= StrToInt (sgBus->Cells [0]
[sgBus->Row]);* prev;* pv = find (beg_r, num, &prev); // ищем по номеру (pv) // найден
{
if (pv == beg_r) // начало списка
beg_r = beg_r->next; // удаление из середины
или конца списка
prev->next = pv->next;= add (beg, *pv);
}_dbase (beg_r);
}
}
// ---------------------------------------------------------------------------
Текст файла BusFrm. h
//
---------------------------------------------------------------------------
#ifndef BusFrmH
#define BusFrmH
//
---------------------------------------------------------------------------
#include <Classes. hpp>
#include <Controls. hpp>
#include <StdCtrls. hpp>
#include <Forms. hpp>
#include <ExtCtrls. hpp>
#include <Mask. hpp>
//
---------------------------------------------------------------------------TfrmBus:
public TForm
{
__published: // IDE-managed
Components*Label1;*medNumBus;*Bevel1;*Label2;*medRoute;*Label3;*edFIO;*btnSave;*btnCancel;__fastcall
btnSaveClick (TObject *Sender);: // User declarations: // User declarations
__fastcall TfrmBus (TComponent* Owner);
};
// ---------------------------------------------------------------------------PACKAGE
TfrmBus *frmBus;
//
---------------------------------------------------------------------------
#endif
Текст файла BusFrm. cpp
//
---------------------------------------------------------------------------
#include <vcl. h>
#pragma hdrstop
#include "BusFrm. h"
//
---------------------------------------------------------------------------
#pragma package (smart_init)
#pragma resource "*. dfm"*frmBus;
// ---------------------------------------------------------------------------
__fastcall TfrmBus:: TfrmBus (TComponent* Owner)
: TForm (Owner)
{
}
//
---------------------------------------------------------------------------__fastcall
TfrmBus:: btnSaveClick (TObject *Sender)
{(medNumBus->Text=="")
{("Не введен номер автобуса");;
}(edFIO->Text=="")
{("Не введены данные водителя");;
}(medRoute->Text=="")
{("Не введен номер маршрута");;
}
}
//
---------------------------------------------------------------------------
2.3 Описание
программы
Для функционирования приложения "Автобусный парк"
необходимо наличие на компьютере установленной операционной системы Windows 2000/XP/Vista.
Программа запускается с помощью запуска файла bus. exe, находящегося в каталоге
X: /bus (X - имя диска, на который
записывается приложение).
После запуска загружаются сведения из файла базы данных. Если
файл не пуст, то загруженные данные будут помещены в таблицу и выведены на
экран. Далее пользователь может добавлять, редактировать, удалять и
просматривать сведения об автобусах на линии и в парке. Можно направить автобус
на маршрут или вернуть в парк. При этом меняется содержание таблицы на экране.
Можно базу данных с учетом всех изменений сохранить в файл. Все действия можно
осуществлять с помощью кнопок и пунктов меню. Для завершения работы нужно
выбрать соответствующий пункт меню или нажать кнопку "Выйти из
программы".
Сведения об автобусах имеют ограничения: номер маршрута и
номер автобуса представляют собой целое число размеров не более трех цифр.
Фамилия и инициалы водителя должны быть не длиннее 29 символов. Это нужно для
исключения ошибок при форматированном вводе-выводе данных в файл и из файла.
Количество автобусов строгими рамками не ограничено, так как в программе
используются динамические структуры данных - списки.
Описание логической структуры.
Для хранения базы данных воспользуемся односвязными списками.
Каждый элемент включает информационную часть (номер автобуса, ФИО водиетля и
номер маршрута) и указатель на следующий элемент. Признак конца списка - ноль в
поле указателя. Список доступен через указатель на его первый элемент.
Создадим два списка для хранения элементов. Один содержит
информацию об автобусах в парке, другой на маршруте. Список автобусов на
маршруте изначально пуст, поэтому указатель на его начало обнуляется. Указатель
на начало списка парка устанавливается после загрузки первого элемента из
файла. Если файл пуст, то указатель тоже обнуляется.
Чтение информации из базы производится с помощью функции Bus*
__fastcall read_dbase (char* filename). Функция построчно считывает информацию
из файла и заполняет поля структуры. Затем созданная структура включается в
список автобусов в парке. Пока не достигнут конец файла, процесс продолжается.
Ввод нового элемента осуществляется двумя функциями: Bus
__fastcall new_bus () и Bus* __fastcall add (Bus* beg, const Bus& bus). В функции new_bus () создается элемент
структуры, с помощью формы "Автобусы" заполняются все поля, затем в
функции add (Bus* beg, const Bus& bus) эта структура присоединяется к нужному списку.
Параметры, которая принимает функция - указатель на начало списка и заполненная
структура.
Для редактирования сведений об автобусе используются функции
int __fastcall editBus (Bus* beg, int numbus) и Bus* __fastcall find (Bus* pv,
int num, Bus** prev). Функция find осуществляет поиск элемента в списке по номеру
автобуса и возвращает указатель на найденный элемент или нуль, если элемент не
найден. Функция принимает в качестве параметров номер автобуса и указатель на
начало списка, в котором нужно искать. Указатель на найденный элемент
возвращается в функцию editBus, где редактируются поля структуры.
Для удаления элемента используется функция Bus* __fastcall
remove (int num, Bus* beg). Функция вызывает функцию find для поиска удаляемого
элемента в списке. В функцию поиска передается указатель на начало списка,
номер автобуса и адрес предыдущего элемента. Это необходимо, чтобы связать
предыдущий и последующий элементы. Функция возвращает указатель найденного
элемента или нуль. После исключения из списка нужного элемента он удаляется
(delete pv).
Вывод на экран нужного списка реализуется в функции void
__fastcall print_dbase (Bus* beg). Принимая указатель на начало списка, функция
перебирает все элементы списка и выводит в таблицу на форме.
Вывод в файл осуществляет функция int
__fastcall write_dbase (char *filename, Bus *park, Bus *route). В нее передается название
файла и указатели на начало обоих списков. Для выгрузки информации используется
форматированный вывод.
Все остальные функции - это методы компонентов C++Builder. Из этих методов
вызываются нужные функции, которые описаны выше. Кнопка "Добавить
автобус" вызывает функцию add (), кнопка "Редактировать" -
определяет номер автобуса по таблице и вызывает editBus (), кнопка "Удалить
автобус" - после определения номера вызывает remove (), кнопка
"Сохранить в файл" - функцию write_dbase (), кнопки
"Автобусы на маршруте" и "Автобусы в парке" вызывают
функцию вывода на экран списков.
Кнопки "Направить на маршрут" и "Направить с
парк" с помощью find () находит в списке нужный элемент, а затем
переносит его в другой список, подключая к последнему элементу или устанавливая
как начало списка, если тот был пуст. В прежнем списке к предыдущему элементу
подключается следующий после перенесенного.
Используемые технические средства.
Для нормального функционирования программы необходим любой
современный компьютер, цветной монитор, клавиатура, манипулятор типа
"мышь".
Минимальные требования для работы программы:
Любой современный процессор Intel / AMD;
ОЗУ от 512 Мбайт.
Вызов и загрузка.
Приложение "Автобусный парк" может находиться в
любом доступном каталоге любого диска (A,C,D,E и т.д.). Файл базы
данных "bus. txt" должен находиться в одном каталоге с исполняемым файлом.
Программа запускается файлом "bus. exe”.
Входные данные.
Исходные данные могут загружаться из файла или вводиться
вручную. В файле данные хранятся построчно, поля каждой структуры находятся в
одной строке, одно за другим. Поля номер автобуса и номер маршрута занимают по
три символа, поле ФИО водителя - 29 символов. После загрузки программой будет
добавлен еще символ конца строки.
Данные можно вносить с клавиатуры. При этом, номер автобуса и
номер автобуса - это целые числа из трех цифр, а ФИО водителя - это символьный
массив, который вводится в поле строка и преобразуется в массив программно при
создании структуры.
Выходные данные имеют такой же формат и формируются и
выгружаются в файл программно, если пользователь нажал соответствующую кнопку
или выбрал пункт меню.
2.4
Тестирование программы
C++ Builder является средой быстрой разработки приложений. В
основе систем быстрой разработки (RAD-систем, Rapid Application Development -
среда быстрой paзpa6oтки приложений) лежит технология визуального
проектирования и событийного программирования, суть которой заключается в том,
что среда разработки берет на себя большую часть работы по генерации кода
программы, оставляя программисту работу по конструированию диалоговых окон и
написанию функций обработки событий. Производительность программиста при
использовании RAD систем существенно увеличивается.
Система объектно-ориентированного программирования Borland
C++ Builder, предназначена для операционных систем Windows. Интегрированная
среда C++ Builder обеспечивает скорость визуальной разработки, продуктивность
повторно используемых компонентов в сочетании с мощью языковых средств C++,
усовершенствованными инструментами и разномасштабными средствами доступа к
базам данных.
Профессиональные средства языка C++ интегрированы в
визуальную среду разработки. C++Builder предоставляет быстродействующий
компилятор с языка Borland C++, эффективный инкрементальный загрузчик и гибкие
средства отладки как на уровне исходных инструкций, так и на уровне
ассемблерных команд - в расчете удовлетворить высокие требования программистов-профессионалов.
С++ Builder может быть использован везде, где требуется
дополнить существующие приложения расширенным стандартом языка C++, повысить
быстродействие и придать пользовательскому интерфейсу качества
профессионального уровня.
Средства отладки:
Local Variables - просмотр значений локальных переменных.
Во время отладки очень часто приходиться просматривать значения переменных.
Поскольку в объектно-ориентированном программировании очень мало глобальных
переменных (большинство значений инкапсулировано в объектах), то очень удобно
использовать для просмотра переменных Local Variables. Окно Local Variables
открывается из меню "View" - "Debug Windows", через
контекстное меню в редакторе кода или горячей клавишей Ctrl - Alt - L.
Debug Inspector - инспектор отладки. Через Debug
Inspector можно не только просмотреть значения отдельных переменных, но и
раскрывать в отдельном окне классы и структуры.
Call Stack - просмотр стека вызовов. Если в программе
применялся полиморфизм или не известно, какой метод передает испорченные
параметры, то Call Stack сможет помочь найти источник проблем. Call Stack
покажет в каком порядке происходили вызовы методов и с какими параметрами они
начинали работать. Окно Call Stack открывается из меню "View" -
"Debug Windows", через контекстное меню в редакторе кода или горячей
клавишей Ctrl - Alt - W.
При испытании программы нужно проверить правильность загрузки
и выгрузки информации, установки правильных значений параметров элемента
структуры при вводе нового автобуса, перемещение элемента из одного списка в
другой.
Добавим новый автобус в список автобусов в парке, затем
переведем его на маршрут. Значения:
номер автобуса 140;
ФИО водителя Окунев И. И,
номер маршрута 15.
Добавим новый автобус в список автобусов на маршруте, затем
переведем его в парк. Значения:
номер автобуса 150;
ФИО водителя Щукин Э. П.;
номер маршрута 16.
Выгрузим в файл. В файле должны быть добавлены две новые
строки.
Содержание файла bus. txt до загрузки программы:
Запускаем программу:
Добавим первый автобус:
Результат
Направим на маршрут:
Создадим автобус на маршруте:
И направим в парк. Результат действий:
Автобусы в парке.
Автобусы на маршруте.
Запишем:
Посмотрим содержание файла после записи базы данных:
Запустим программу еще раз:
Оба элемента находятся в списке автобусов в парке, то есть
программа работает согласно заданию.
Литература
1. Архангельский,
А.Я. Программирование в С++ Builder
6.2-е изд. / А.Я. Архангельский. - М.: ООО "Бином-Пресс", 2005.
2. Павловская
Т.А. С/С++. Программирование на языке высокого уровня. Учебник. - СПб: Питер,
2006.
. Павловская
Т.А., Щупак Ю.А. С/С++. Программирование на языке высокого уровня. Структурное
программирование. Практикум. - СПб: Питер, 2007.