Разработка программы на языке C/С++, страница 3

Поэтому и в этой программе, несмотря на то, что внутренние структуры используют Unicode, та часть программы, которая определяет станцию и железную дорогу по коду (и наоборот) использует обычные однобайтные символы в кодировке koi8-r, т.к. Написаны они были до разработки основной программы. Для переноса в другую систему требуется их перекодировка, что достаточно несложно реализуется программами recode или iconv.

Также из-за особенностей библиотеки Qt, в программе не создаются конструкторы и деструкторы классов (в смысле – вручную). В качестве конструкторов используются функции init(), а в качестве деструкторов – destroy().

Остальные особенности языка C только способствовали разработке программы: указали позволяют абстрагироваться от типов данных т.к. в одном массиве храняться данные 4-х типов, но одного размера.

Приложение А Листинг программы

Так как значительная часть кода сгенерирована Qt Designer'ом, то здесь приводятся только та часть кода, в которой описываются конкретные действия по работе с данными.

Файл mainform.h – основная программа.

#define PROGNAM "Train Timetable Editor"

bool isChanged = FALSE;

bool fopened = FALSE;

int nelem=0;

QString filename = "";

struct datastr01 *header[4];

struct datastr00 *base[100];

struct datastr10 *chnum;

struct datastr11 *chrail;

QFile datafile;

void MainForm::init()

{

    openresolvefile("codes_rus.txt");

    openrresolvefile("railways.txt");

    recalcsize();

}   

void MainForm::recalcsize()

{

    int width=trainTimeTable->width();

    trainTimeTable->setColumnWidth(0,(int)width*0.440);

    trainTimeTable->setColumnWidth(1,(int)width*0.075);

    trainTimeTable->setColumnWidth(2,(int)width*0.122);

    trainTimeTable->setColumnWidth(3,(int)width*0.119);

    trainTimeTable->setColumnWidth(4,(int)width*0.047);

    trainTimeTable->setColumnWidth(5,(int)width*0.119);

}

void MainForm::fileNew()

{

    NewTrainForm  *newtrainForm = new NewTrainForm( this, "new train", TRUE );

    if (newtrainForm->exec())

    {

                                                                                                                                                                                                                                         if (fopened) deleteall();

filename="";

int i;

for (i=0; i<4; i++){

    header[i]=new datastr01;

    header[i]->id=1;

}

header[0]->trnum=newtrainForm->TrainnumspinBox->value();

header[1]->trnum=newtrainForm->TrainnumspinBox->value();

QString trnlett = newtrainForm->TrainCodeLineEdit->text();

QChar lett;

lett=trnlett.at(0);

header[0]->lett=lett.unicode();

lett=trnlett.at(1);

header[1]->lett=lett.unicode();

QString trnfrom = newtrainForm->StartStatEdit->text();

header[0]->stcode=trnfrom.toInt();

QString trnto = newtrainForm->EndStatEdit->text();

header[1]->stcode=trnto.toInt();

QString trnum;

trnum.setNum(header[0]->trnum);

TrainNametextLabel->setText(trnum+trnlett+" "+trnfrom.fromLocal8Bit(resolvestat(header[0]->stcode))+" - "+trnto.fromLocal8Bit(resolvestat(header[1]->stcode)));

isChanged=TRUE;

fopened=TRUE;

for (i=0; i<3; i++)

    base[i]=new datastr00;

for (i=1; i<3; i++)

{

base[i]->id=0;

base[i]->arr_h=25;

base[i]->dec_h=25;

}

base[0]->id=1;

base[1]->stcode=header[0]->stcode;

base[1]->dist=0;

base[2]->stcode=header[1]->stcode;

base[2]->dist=-1;

nelem=3;

redrawtable();

enableActions();

}

delete newtrainForm;

}

void MainForm::fileOpen()

{

    filename = QFileDialog::getOpenFileName(

    QString::null, tr("Train timetable information (*.trn)"), this,

    "file open", QString(tr(PROGNAM))+tr(" -- File Open") );

    if (filename.isEmpty()) return;

    if (fopened) deleteall();

    datafile.setName(filename);

    datafile.open(IO_ReadOnly);

    int i;

    for (i=0; i<4; i++)

header[i]=new datastr01;

    for (i=0; i<4; i++)

datafile.readBlock((char *)header[i],(Q_LONG)9);

    i=0;

    while (!datafile.atEnd()){

  base[i]=new datastr00;