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

Тема в разделе "C/C++/C#", создана пользователем Forbesii, 24 дек 2010.

  1. Forbesii

    Forbesii Гость

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

    Вот и сам код
    <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();

    }

    //---------------------------------------------------------------------------
     
Загрузка...

Поделиться этой страницей