Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_po_programmirovaniyu.doc
Скачиваний:
161
Добавлен:
17.02.2016
Размер:
1.31 Mб
Скачать

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;

}

}

//---------------------------------------------------------------------------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]