⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binarysearch.cpp

📁 关于书籍《Borland c++Builder工程实践》的源代码
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "BinarySearch.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TBinForm *BinForm;
//---------------------------------------------------------------------------
__fastcall TBinForm::TBinForm(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TBinForm::FormCreate(TObject *Sender)
{
    Randomize();
    Destination = rand()%50+1;        //目标值最大为50
    value->Text = IntToStr(Destination);
    DisplayInterval = 400;
    DataGrid->Cells[0][0] = "元素编号";
    DataGrid->Cells[1][0] = " 元素值";
    for(int i = 1;i < 16;i ++)
        DataGrid->Cells[0][i] = IntToStr(i);
    DataGeneration();
}
//---------------------------------------------------------------------------

void __fastcall TBinForm::DataGeneration()
{
    randomize();
    Clean(120,25,280,380);
    int small,m,temp;
    for(int j = 0;j < 15;j ++)
    {
        Array[j] = rand()%50+1;            //最大值为50
    }
    for(int k = 0;k < 14;k++)                 //将Array[i]排序
	{
		small = k;
		for(m = k+1;m < 15;m ++)         //查找当前最小值
            if(Array[m] < Array[small])
			{
                small = m;
            }
        if(small != k)
        {
            temp = Array[k];
            Array[k] = Array[small];
            Array[small] = temp;
        }
    }
    for(int i = 0;i < 15;i ++)
    {
        DataGrid->Cells[1][i+1] = IntToStr(Array[i]);
    }
    DataGrid->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TBinForm::Clean(int x1,int y1,int x2,int y2)
{
    Canvas->Pen->Mode = pmCopy;
    Canvas->Brush->Color = clBtnFace;
    Canvas->Pen->Color = clBtnFace;
    Canvas->Rectangle(x1,y1,x2,y2);    //覆盖画图区域
}
//---------------------------------------------------------------------------

void __fastcall TBinForm::DataGenerateClick(TObject *Sender)
{
    DataGeneration();
    Randomize();
    Destination = rand()%50+1;        //目标值最大为50
    value->Text = IntToStr(Destination);
}
//---------------------------------------------------------------------------

void __fastcall TBinForm::ExitClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------

void __fastcall TBinForm::TrackBar1Change(TObject *Sender)
{
    DisplayInterval = 1100-TrackBar1->Position;
}
//---------------------------------------------------------------------------

void __fastcall TBinForm::DisplayClick(TObject *Sender)
{
    int j,temp;
    int low,high,mid;
    bool flag;
    Clean(120,25,280,380);
    flag = false;
    low = 0;
    high = 14;
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    pBitmap->Transparent = true;
    pBitmap->TransparentMode = tmAuto;
    pBitmap->LoadFromFile("hand1.bmp");
    while(low <= high)
    {
        mid = (low + high)/2;
        if((low != high) && (!flag))
        {
            if(Array[mid] < Destination)
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"比目标值小");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                low = mid + 1;
            }
            else if(Array[mid] > Destination)
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"比目标值大");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                high = mid - 1;
            }
            else
            {
                flag = true;
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,mid*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+mid*21,280,24+(mid+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,mid*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
            }
        }
        else if((low != high) && flag)
        {
            temp = mid - 1;
            while(Array[temp] == Destination)
            {
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,temp*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+temp*21,280,24+(temp+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,temp*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,temp*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+temp*21,280,24+(temp+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,temp*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
                temp --;
            }
            temp = mid + 1;
            while(Array[temp] == Destination)
            {
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,temp*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+temp*21,280,24+(temp+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,temp*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,temp*21+32,"找到目标值!");
                Sleep(2*DisplayInterval);
                Clean(120,24+temp*21,280,24+(temp+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,temp*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
                temp ++;
            }
            Canvas->Draw(130,temp*21+28,pBitmap);
            Sleep(2*DisplayInterval);
            Canvas->TextOutA(170,temp*21+32,"查找完毕!");
            Sleep(5*DisplayInterval);
            Clean(120,24+temp*21,280,24+(temp+1)*21);
            break;
        }
        else
        {
            if(Array[mid] == Destination)
            {
                for(j = 0;j < 4;j++)           //闪烁效果
                {
                    Canvas->Draw(130,mid*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+mid*21,280,24+(mid+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,mid*21+28,pBitmap);
                Canvas->TextOutA(170,mid*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                Canvas->Draw(130,mid*21+28,pBitmap);
                Canvas->TextOutA(170,mid*21+32,"查找完毕!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
            }
            else
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"没有找到目标值!");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
            }
            break;
        }
    }
    delete pBitmap;
}
//---------------------------------------------------------------------------

void TBinForm::Run()
{
    int j,temp;
    int low,high,mid;
    bool flag;
    flag = false;
    low = 0;
    high = 14;
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    pBitmap->Transparent = true;
    pBitmap->TransparentMode = tmAuto;
    pBitmap->LoadFromFile("hand1.bmp");
    while(low <= high)
    {
        mid = (low + high)/2;
        if((low != high) && (!flag))
        {
            if(Array[mid] < Destination)
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"比目标值小");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                low = mid + 1;
            }
            else if(Array[mid] > Destination)
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"比目标值大");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                high = mid - 1;
            }
            else
            {
                flag = true;
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,mid*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+mid*21,280,24+(mid+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,mid*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
            }
        }
        else if((low != high) && flag)
        {
            temp = mid - 1;
            while(Array[temp] == Destination)
            {
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,temp*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+temp*21,280,24+(temp+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,temp*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,temp*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+temp*21,280,24+(temp+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,temp*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
                temp --;
            }
            temp = mid + 1;
            while(Array[temp] == Destination)
            {
                for(j = 0;j < 4;j ++)           //闪烁效果
                {
                    Canvas->Draw(130,temp*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+temp*21,280,24+(temp+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,temp*21+28,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,temp*21+32,"找到目标值!");
                Sleep(2*DisplayInterval);
                Clean(120,24+temp*21,280,24+(temp+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,temp*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
                temp ++;
            }
            Canvas->Draw(130,temp*21+28,pBitmap);
            Sleep(2*DisplayInterval);
            Canvas->TextOutA(170,temp*21+32,"查找完毕!");
            Sleep(5*DisplayInterval);
            Clean(120,24+temp*21,280,24+(temp+1)*21);
            break;
        }
        else
        {
            if(Array[mid] == Destination)
            {
                for(j = 0;j < 4;j++)           //闪烁效果
                {
                    Canvas->Draw(130,mid*21+30,pBitmap);
                    Sleep(DisplayInterval);
                    Clean(120,24+mid*21,280,24+(mid+1)*21);
                    Sleep(DisplayInterval);
                }
                Canvas->Draw(130,mid*21+28,pBitmap);
                Canvas->TextOutA(170,mid*21+32,"找到目标值!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                Canvas->Draw(130,mid*21+28,pBitmap);
                Canvas->TextOutA(170,mid*21+32,"查找完毕!");
                Sleep(5*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
                pBitmap->LoadFromFile("ok1.bmp");
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                pBitmap->LoadFromFile("hand1.bmp");
            }
            else
            {
                Canvas->Draw(130,mid*21+30,pBitmap);
                Sleep(2*DisplayInterval);
                Canvas->TextOutA(170,mid*21+32,"没有找到目标值!");
                Sleep(2*DisplayInterval);
                Clean(120,24+mid*21,280,24+(mid+1)*21);
            }
            break;
        }
    }
    delete pBitmap;
}

void TBinForm::Transport(int ii)
{
    Destination = ii;                      //目标值最大为50
    value->Text = IntToStr(Destination);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -