📄 binarysearch.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 + -