Нужно исправить код. Он готов, но нужна проверка и доработка.

  • Автор темы Forbesii
  • Дата начала
F

Forbesii

Гость
#1
в общем, нужно, чтобы просчитывало не по одному заказу а все сразу
это первое
второе-учитывались издержки,перегонки автомобиля в другой город в случае недостатка машин для развоза заказа
и чтобы присылали машину с того города, где издержки минимальны

Вот и сам код
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Показать код</div></div><div class="sp-body"><div class="sp-content">Код программы.


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


#include <vcl.h>

#pragma hdrstop


#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TMainForm *MainForm;

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

__fastcall TMainForm::TMainForm(TComponent* Owner)

: TForm(Owner)

{

}

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

//окно с сообщением

void Message(AnsiString msg){

Application->MessageBoxA(msg.c_str(), "Message", 0);

}


//создание формы

void __fastcall TMainForm::FormCreate(TObject *Sender)

{

//находим расположение базы данных

AnsiString DBName = ExtractFilePath(Application->ExeName) + "DB";


//применяем к каждой таблице это расположение

TTowns->DatabaseName = DBName;

TClients->DatabaseName = DBName;

TDistances->DatabaseName = DBName;

TTransport->DatabaseName = DBName;

TTransportPosition->DatabaseName = DBName;

TOrders->DatabaseName = DBName;


//открываем каждую таблицу

TTowns->Open();

TClients->Open();

TDistances->Open();

TTransport->Open();

TTransportPosition->Open();

TOrders->Open();

}

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

//закрытие окна

void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)

{

//закрываем каждую таблицу

TTowns->Close();

TClients->Close();

TDistances->Close();

TTransport->Close();

TTransportPosition->Close();

TOrders->Close();

}

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

//функция возвращает город заданного клиента

AnsiString __fastcall TMainForm::GetTownByClient(AnsiString Client){

AnsiString Town;


//цикл по всем записям в таблице клиенты

TClients->First();

while(!TClients->Eof){

//если имя клиента совпадает с заданным

if(TClientsName->Value == Client) {

//это то, что нужно возвращаем его город

return TClientsTown->Value;

}

TClients->Next();

}

//если такого клиента нет, возвращаем пустую строку

return "";

}

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

//возвращает расстояние между двумя заданными городами

int __fastcall TMainForm::GetDistance(AnsiString Town1, AnsiString Town2){

//если один и тот же город возвращаем 0

if(Town1==Town2) return 0;


//цикл по таблице расстояний

TDistances->First();

while(!TDistances->Eof){

//если эти города совпадают с заданными

if((TDistancesTown1->Value == Town1 && TDistancesTown2->Value == Town2)||

(TDistancesTown2->Value == Town1 && TDistancesTown1->Value == Town2))

//возвращаем расстояние между ними

return TDistancesDistance->Value;

TDistances->Next();

}

//а так минус один

return -1;

}


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

//меню добавить заказ

void __fastcall TMainForm::N6Click(TObject *Sender)

{

//показать форму добавления заказа

AddOrderForm->ShowModal();

}


//оптимизация по загрузке

int __fastcall TMainForm::OptByLoad()

{

int MinFreeSpace = 1000; //мин. свободное место

int Type = -1; //тип транспорта


AnsiString SendTown = //город отправитель

GetTownByClient(TOrdersSender->Value);

AnsiString ConsTown = //город получатель

GetTownByClient(TOrdersConsumer->Value);

int Amount = TOrdersAmount->Value;


//цикл по транспорту

TTransport->First();

while(!TTransport->Eof){

//расчет свободного места

int CurFreeSpace = TTransportCapacity->Value - Amount ;


if(Amount > TTransportCapacity->Value) goto next;


if(CurFreeSpace < MinFreeSpace) {

MinFreeSpace = CurFreeSpace; //накапливается транс. с опт

//загрузкой

Type = TTransportType->Value;

}

next: TTransport->Next();

}


if(Type == -1) {Message("Подходящий транспорт не найден!"); return 0;}


Message("Поиск оптимального по ЗАГРУЗКЕ ТРАНСПОРТНОЙ ЕДИНИЦЫ маршрута...");

return MakeOrder(Type);


}

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

//по издержкам

int __fastcall TMainForm::OptByCost()

{

int MinCost = 10000000;

int Type = -1;


AnsiString SendTown =

GetTownByClient(TOrdersSender->Value);

AnsiString ConsTown =

GetTownByClient(TOrdersConsumer->Value);

int Amount = TOrdersAmount->Value;


//цикл по транспорту

TTransport->First();

while(!TTransport->Eof){

//получаем себестоимость перевозки

int CurCost = GetDeliveryCost(SendTown, ConsTown, TTransportType->Value);


if(Amount > TTransportCapacity->Value) goto next;


if(CurCost < MinCost){

MinCost = CurCost; //мин. стоимость.

Type = TTransportType->Value;

}

next: TTransport->Next();

}


if(Type == -1) {Message("Подходящий транспорт не найден!"); return 0;}


Message("Поиск оптимального по МИНИМИЗАЦИИ ИЗДЕРЖЕК маршрута...");

return MakeOrder(Type);


}

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

//функция производит обработку заказа заданным типом транспорта

int __fastcall TMainForm::MakeOrder(int Type){


AnsiString SendTown = GetTownByClient(TOrdersSender->Value);

AnsiString ConsTown = GetTownByClient(TOrdersConsumer->Value);


GetTransType(Type);


//подсчет себестоимости

int Cost = GetDeliveryCost(SendTown, ConsTown, Type);



Message((AnsiString)"Оптимальным маршрутом будет таковой из г."

+ SendTown + " в г. " + ConsTown +

" контейнером типа " + Type +

". Себестоимость перевозки " + Cost + "р. Доход " +

(TOrdersCost->Value - Cost) + "р.");


return (TOrdersCost->Value - Cost);


}

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

//оптимизация по прибыли

int __fastcall TMainForm::OptByProfit(){


//это доходы по разным типам оптимизации

int OptCost = OptByCost();

int OptLoad = OptByLoad();


//ищем какой самый выгодный

if(OptCost >= OptLoad){

Message("Оптимальным оказался маршрут, минимизирующий ИЗДЕРЖКИ.");

return OptLoad;

}

else if(OptLoad > OptCost){

Message("Оптимальным оказался маршрут, оптимизированный по ЗАГРУЗКЕ");

return OptLoad;

}

return 0;

}

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

//функция выбирает в таблице транспорт заданного типа

void TMainForm::GetTransType(int Type){


TTransport->First();

while(!TTransport->Eof){

if(Type == TTransportType->Value) return;

TTransport->Next();

}

}


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

//функция подсчета себестоимости доставки

int TMainForm::GetDeliveryCost(AnsiString TownFrom, AnsiString TownTo, int Type){

GetTransType(Type);


return (double)GetDistance(TownFrom, TownTo) * TTransportCostPer100->Value /

100 + TTransportCostPerDay->Value;

}


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


void __fastcall TMainForm::N11Click(TObject *Sender)

{

OptByCost();

}

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


void __fastcall TMainForm::N8Click(TObject *Sender)

{

OptByLoad();

}

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


void __fastcall TMainForm::N10Click(TObject *Sender)

{

OptByProfit();

}

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



void __fastcall TMainForm::N7Click(TObject *Sender)

{

AddOrderForm->ShowModal();

}

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






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


#include <vcl.h>

#pragma hdrstop


#include "AddOrderFormUnit.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TAddOrderForm *AddOrderForm;

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

__fastcall TAddOrderForm::TAddOrderForm(TComponent* Owner)

: TForm(Owner)

{

}

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

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

bool __fastcall TAddOrderForm::CheckOrder(){


if(CBSender->Text.IsEmpty()){

Message("Отправитель не заполнен!");

return false;

}


if(CBConsumer->Text.IsEmpty()){

Message("Получатель не заполнен!");

return false;

}


if(CBSender->Text == CBConsumer->Text){

Message("Заказ нельзя отправить самому себе!");

return false;

}


return true;

}

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

void __fastcall TAddOrderForm::FormShow(TObject *Sender)

{

CBSender->Clear(); CBConsumer->Clear();


MainForm->TClients->First();

while(!MainForm->TClients->Eof){


CBSender->Items->Add(MainForm->TClientsName->Value);

CBConsumer->Items->Add(MainForm->TClientsName->Value);


MainForm->TClients->Next();

}


LSenderTown->Caption = ""; LConsumerTown->Caption = "";

}

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

void __fastcall TAddOrderForm::CalcCost(){


EPrice->Text =

(Price1tPer100 * CBAmount->Text.ToIntDef(0) *

MainForm->GetDistance(MainForm->GetTownByClient(CBSender->Text),

MainForm->GetTownByClient(CBConsumer->Text))

/

100) * (100 - UDDiscount->Position) / 100;

}

void __fastcall TAddOrderForm::CBSenderChange(TObject *Sender)

{

LSenderTown->Caption = MainForm->GetTownByClient(CBSender->Text);

LConsumerTown->Caption = MainForm->GetTownByClient(CBConsumer->Text);


CalcCost();

}

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


void __fastcall TAddOrderForm::UDDiscountChanging(TObject *Sender,

bool &AllowChange)

{

CalcCost();

}

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

void __fastcall TAddOrderForm::AddOrderClick(TObject *Sender)

{

if(!CheckOrder()) return;


MainForm->TOrders->Insert();


MainForm->TOrdersSender->Value = CBSender->Text;

MainForm->TOrdersLoad->Value = ELoad->Text;

MainForm->TOrdersAmount->Value = CBAmount->Text.ToIntDef(0);

MainForm->TOrdersConsumer->Value = CBConsumer->Text;

MainForm->TOrdersCost->Value = EPrice->Text.ToIntDef(0);

MainForm->TOrdersDiscount->Value = UDDiscount->Position;

MainForm->TOrdersEntryDate->Value = DTEntry->Date;

MainForm->TOrdersMaxDeliveryDate->Value = DTMaxTime->Date;


Close();

}

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