
- •Курсовая работа по дисциплине «Программирование» на тему « Разработка приложения для Windows, представляющего собой динамическую информацию о наличии автобусов в автобусном парке»
- •Оглавление
- •1. Разработка эскизного и технического проектов программы
- •1.1. Введение
- •1.2 Назначение и область применения
- •1.3 Технические характеристики
- •1.4 Разработка программы
- •2. Разработка рабочего проекта
- •2.1. Спецификация программы
- •2.1. Текст программы
- •2.3 Описание программы
- •2.4 Тестирование программы
- •Запустим программу еще раз:
- •Оба элемента находятся в списке автобусов в парке, то есть программа работает согласно заданию. Литература
2. Разработка рабочего проекта
2.1. Спецификация программы
Исполняемый файл приложения “Автобусный парк” имеет название Bus.exe и расположен на жестком диске (компакт-диске, дискете) в каталоге \Bus. Состав проекта:
Наименование |
Обозначение |
Примечание |
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
//---------------------------------------------------------------------------
USEFORM("MainFrm.cpp", frmMain);
USEFORM("BusFrm.cpp", frmBus);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TfrmMain), &frmMain);
Application->CreateForm(__classid(TfrmBus), &frmBus);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 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>
//---------------------------------------------------------------------------
class TfrmMain : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TLabel *Label1;
TLabel *Label2;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TMenuItem *NRoute;
TMenuItem *NPark;
TMenuItem *N9;
TMenuItem *N10;
TMenuItem *N11;
TMenuItem *N12;
TPanel *Panel1;
TBevel *Bevel1;
TStringGrid *sgBus;
TButton *btnExit;
TButton *btnAddBus;
TButton *btnDelBus;
TButton *btnSave;
TButton *busPark;
TButton *busRoute;
TLabel *lblBus;
TButton *btnEdit;
TButton *btnOut;
TButton *btnIn;
TMenuItem *N2;
TMenuItem *N13;
TMenuItem *N14;
TMenuItem *N15;
TBevel *Bevel2;
void __fastcall N12Click(TObject *Sender);
void __fastcall btnAddBusClick(TObject *Sender);
void __fastcall btnDelBusClick(TObject *Sender);
void __fastcall btnSaveClick(TObject *Sender);
void __fastcall busParkClick(TObject *Sender);
void __fastcall busRouteClick(TObject *Sender);
void __fastcall btnEditClick(TObject *Sender);
void __fastcall btnOutClick(TObject *Sender);
void __fastcall btnInClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TfrmMain(TComponent* Owner);
int mode; //режим вывода: 1 - в парке, 2 - на маршруте
};
const int l_FIO = 30;
//структура автобус
struct Bus{
int numBus; //номер автобуса
char FIO[l_FIO]; //ФИО водителя
int route; //номер маршрута
Bus* next; //следующий элемент
};
Bus* __fastcall add(Bus* beg, const Bus& bus);
Bus* __fastcall find(Bus* pv, int num, Bus** prev);
void __fastcall print_dbase(Bus* beg);
int __fastcall editBus(Bus* beg, int numbus);
Bus* __fastcall read_dbase(char* filename);
Bus __fastcall new_bus();
int __fastcall write_dbase(char *filename, Bus *park, Bus *route);
Bus* __fastcall remove(int num, Bus* beg);
//---------------------------------------------------------------------------
extern 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"
TfrmMain *frmMain;
Bus *beg; //начало списка машин в парке
Bus *beg_r; //начало списка машин на маршруте
//Функция - присоединение автобуса к нужному списку
//возвращает указатель на начало списка
//принимает указатель на начало и присоединяемый автобус
Bus* __fastcall add(Bus* beg, const Bus& bus)
{
Bus *pv = new Bus;
*pv = bus;
pv->next = 0;
if(beg) //список не пуст
{
Bus* temp = beg;
while(temp->next)
temp = temp->next;
temp->next = pv;
}
else //список был пуст, поэтому началом сейчас является
//присоединяемый автобус
beg = pv;
return beg;
}
//поиск автобуса в списке по номеру перебором всех элементов списка
//возвращает указатель на найденный автобус или 0, если не найден
//принимает указатель на начало списка, номер автобуса и указатель на элемент,
//предшествующий найденному
Bus* __fastcall find(Bus* pv, int num, Bus** prev)
{
*prev = 0;
while(pv)
{
if(pv->numBus == num)
{
return pv;
}
*prev = pv;
pv = pv->next;
}
return 0;
}
void __fastcall find_bus(Bus* beg, int numbus)
{
}
// вывод списка автобусов на экран
//принимает указатель на начало списка
void __fastcall print_dbase(Bus* beg)
{
Bus* pv = beg;
int i = 0;
frmMain->sgBus->RowCount = 2; //очищаем сетку
frmMain->sgBus->Cells[0][1] = "";
frmMain->sgBus->Cells[1][1] = "";
frmMain->sgBus->Cells[2][1] = "";
if(!beg) return; //список пуст
while (pv)
{
i++;
frmMain->sgBus->Cells[0][i] = IntToStr(pv->numBus);
frmMain->sgBus->Cells[1][i] = pv->FIO;
frmMain->sgBus->Cells[2][i] = IntToStr(pv->route);
frmMain->sgBus->RowCount = frmMain->sgBus->RowCount + 1;
pv = pv->next;
}
frmMain->sgBus->RowCount = frmMain->sgBus->RowCount -1;
}
//редактирование автобуса
//принимает указатель на начало списка и номер автобуса
int __fastcall editBus(Bus* beg, int numbus) //корректировка
{
Bus* prev;
Bus* pv = find(beg, numbus, &prev);
int i;
if(!pv) return 1; //не найден
//заполняем поля формы старыми значениями из структуры
frmBus->medNumBus->Text = IntToStr(pv->numBus);
frmBus->edFIO->Text = pv->FIO;
frmBus->medRoute->Text = IntToStr(pv->route);
frmBus->ShowModal();
if(frmBus->ModalResult == mrOk)
{
//заполняем структуру новыми значениями
pv->numBus = StrToInt(Trim(frmBus->medNumBus->Text));
strcpy(pv->FIO,frmBus->edFIO->Text.c_str());
for(i = strlen(pv->FIO); i<l_FIO; i++)
pv->FIO[i] = ' ';
pv->FIO[l_FIO - 1] = '\0';
pv->route = StrToInt(Trim(frmBus->medRoute->Text));
}
return 0;
}
//загрузка бд из файла
//принимает название файла
//возвращает указатель на начало списка
Bus* __fastcall read_dbase(char* filename)
{
FILE* fin;
Bus bus, *beg = 0;
int symbol;
if((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);
beg = add(beg, bus); //присоединяем к списку
}
if(feof(fin)) //конец файла
fclose(fin); //закроем файл
return beg;
}
//создание нового автобуса
//функция возвращает структуру автобус
Bus __fastcall new_bus()
{
Bus bus;
int i;
//Очищаем поля ввода в форме создания автобуса
frmBus->medNumBus->Text = "";
frmBus->edFIO->Text = "";
frmBus->medRoute->Text = "";
frmBus->ShowModal();
if(frmBus->ModalResult == mrOk)
{
//заполняем структуру введенными значениями
bus.numBus = StrToInt(Trim(frmBus->medNumBus->Text));
strcpy(bus.FIO, frmBus->edFIO->Text.c_str());
for(i = strlen(bus.FIO); i<l_FIO; i++)
bus.FIO[i] = ' ';
bus.FIO[l_FIO - 1] = '\0';
bus.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);
while (park) //выбираем машины из парка
{
fprintf(fout, "%03d%s%03d\n", park->numBus, park->FIO, park->route);
park = park->next;
}
while (route) //выбираем машины на линии
{
fprintf(fout, "%03d%s%03d\n", route->numBus, route->FIO, route->route);
route = route->next;
}
fclose(fout); //закрываем файл
return 0;
}
//удаление автобуса из списка
//функция принимает значения - номер автобуса, указатель на начало списка
//возвращаеет указатель на начало списка
Bus* __fastcall remove(int num, Bus* beg)
{
Bus* prev;
Bus* pv = find(beg, num, &prev); //ищем по номеру
if(pv) //найден
{
if(pv == beg) //начало списка
beg = beg->next;
else //удаление из середины или конца списка
prev->next = pv->next;
delete pv;
}
return beg;
}
//---------------------------------------------------------------------------
//создание главной формы
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
mode = 1;
sgBus->Cells[0][0] = "Номер автобуса";
sgBus->Cells[1][0] = "Водитель";
sgBus->Cells[2][0] = "Номер маршрута";
beg = read_dbase("bus.txt"); //считываем базу из файла
if(!beg)
{
beg = NULL;
}
print_dbase(beg); //выводим на экран
beg_r = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::N12Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
//кнопка Добавить автобус
void __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); //выводим на экран обновленную базу
}
}
//---------------------------------------------------------------------------
//кнопка Удалить автобус
void __fastcall TfrmMain::btnDelBusClick(TObject *Sender)
{
int num;
if((sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount)) //если строка сетки выбрана
{
num = StrToInt(sgBus->Cells[0][sgBus->Row]); //номер автобуса в первой ячейке
if(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)
{
if(!write_dbase("bus.txt",beg,beg_r)) ShowMessage("База записана");
}
//---------------------------------------------------------------------------
//Кнопка Автобусы в парке
void __fastcall TfrmMain::busParkClick(TObject *Sender)
{
mode = 1;
frmMain->lblBus->Caption = "Автобусы в парке:";
print_dbase(beg); //печатаем список парка
btnIn->Enabled = false; //кнопка Направить в парк недоступна
btnOut->Enabled = true; //кнопка Направить на маршрут доступна
NPark->Enabled = false; //пункт меню Направить в парк
NRoute->Enabled = true; //пункт меню Направить на маршрут
}
//---------------------------------------------------------------------------
//Кнопка автобусы на маршруте
void __fastcall TfrmMain::busRouteClick(TObject *Sender)
{
mode = 2;
frmMain->lblBus->Caption = "Автобусы на маршруте:";
print_dbase(beg_r); //показ списка машин на линии
btnIn->Enabled = true; //кнопка Направить в парк доступна
btnOut->Enabled = false; //кнопка Направить на маршрут недоступна
NPark->Enabled = true; //меню
NRoute->Enabled = false;
}
//---------------------------------------------------------------------------
//Кнопка Редактировать данные
void __fastcall TfrmMain::btnEditClick(TObject *Sender)
{
int num;
if((sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount)) //если выбрана строка в сетке
{
num = StrToInt(Trim(sgBus->Cells[0][sgBus->Row])); //номер автобуса из первой ячейки
if(mode==1) //выбранной строки
{
editBus(beg, num); //список парка
print_dbase(beg);
}
else
{
editBus(beg_r, num); //список маршрутов
print_dbase(beg_r);
}
}
}
//---------------------------------------------------------------------------
//кнопка Направить на маршрут
void __fastcall TfrmMain::btnOutClick(TObject *Sender)
{
Bus* prev;
int num;
if((sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount))
{
num = StrToInt(Trim(sgBus->Cells[0][sgBus->Row]));
Bus* 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)
{
int num;
if((sgBus->Row > 0) && (sgBus->Row < sgBus->RowCount))
{
num = StrToInt(sgBus->Cells[0][sgBus->Row]);
Bus* prev;
Bus* pv = find(beg_r, num, &prev); //ищем по номеру
if(pv) //найден
{
if(pv == beg_r) //начало списка
beg_r = beg_r->next;
else //удаление из середины или конца списка
prev->next = pv->next;
beg = add(beg, *pv);
}
print_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>
//---------------------------------------------------------------------------
class TfrmBus : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TMaskEdit *medNumBus;
TBevel *Bevel1;
TLabel *Label2;
TMaskEdit *medRoute;
TLabel *Label3;
TEdit *edFIO;
TButton *btnSave;
TButton *btnCancel;
void __fastcall btnSaveClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TfrmBus(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmBus *frmBus;
//---------------------------------------------------------------------------
#endif
Текст файла BusFrm.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "BusFrm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmBus *frmBus;
//---------------------------------------------------------------------------
__fastcall TfrmBus::TfrmBus(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmBus::btnSaveClick(TObject *Sender)
{
if(medNumBus->Text=="")
{
ShowMessage("Не введен номер автобуса");
return;
}
if(edFIO->Text=="")
{
ShowMessage("Не введены данные водителя");
return;
}
if(medRoute->Text=="")
{
ShowMessage("Не введен номер маршрута");
return;
}
}
//---------------------------------------------------------------------------