📄 comparesortdlg.cpp
字号:
m_Slider.SetRange(1,20); //设置滑尺在单缝轨道上的移动范围
m_Slider.SetPos(1);
m_Slider.SetTicFreq(1); //设置单缝轨道的刻度
m_Slider.SetLineSize(1); //设置按左右箭头或鼠标单击单缝轨道时滑尺的移动量
m_Result="";
m_Sorce="";
UpdateData(FALSE);
GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
}
//********************响应滑尺的变化*****************************
void CCompareSortDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //响应滑尺的变化
{
// TODO: Add your message handler code here and/or call default
m_Sorce="";
m_Result="";
m_Num=m_Slider.GetPos();
UpdateData(FALSE);
//设置各个按钮的有效性
GetDlgItem(IDC_SHOWSORCE)->EnableWindow(FALSE);
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
GetDlgItem(IDC_CLEANSORCE)->EnableWindow(FALSE);
GetDlgItem(IDC_CLEANRESULT)->EnableWindow(FALSE);
GetDlgItem(IDC_QUICKSORT)->EnableWindow(FALSE);
GetDlgItem(IDC_MERGESORT)->EnableWindow(FALSE);
GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
//********************响应输入数据键*****************************
void CCompareSortDlg::OnInput() //输入数据函数
{
// TODO: Add your control notification handler code here
m_Sorce="";
m_Result="";
UpdateData(FALSE);
//申请空间
Sort.Size=m_Num;
Sort.A=new int[m_Num+1];
assert(Sort.A);
Sort.B=new int[m_Num+1];
assert(Sort.B);
Sort.C=new int [m_Num+1];
assert(Sort.C);
D=new int[m_Num+1];
assert(D);
if(m_AutoRun==1) //用户输入
{
CInputDialog dlg;
dlg.Num=m_Num;
dlg.m_Number=m_Num;
if(dlg.DoModal()==IDOK) //弹出输入对话框
{
dlg.m_Input+=',';
int i,j=0;
for(i=1;i<=m_Num;i++)
{
int th=0;
while(dlg.m_Input[j]!=',') //把字符串转换成数据
{
th=th*10+dlg.m_Input[j]-48;
j++;
}//while
Sort.A[i]=th;
Sort.B[i]=Sort.A[i];
D[i]=Sort.B[i];
j++;
}
}
}
else //随机产生
{
srand(time(NULL));
for(int i=1;i<=m_Num;i++)
{
Sort.A[i]=rand(); //产生随机整数
Sort.B[i]=Sort.A[i];
D[i]=Sort.B[i];
}
}//else
Qflag=0; //置0表示未排序
Mflag=0;
//设置各个按钮的有效性
// if(m_Auto==1)
// {
GetDlgItem(IDC_SHOWSORCE)->EnableWindow(TRUE);
GetDlgItem(IDC_CLEANSORCE)->EnableWindow(TRUE);
// }
GetDlgItem(IDC_QUICKSORT)->EnableWindow(TRUE);
GetDlgItem(IDC_MERGESORT)->EnableWindow(TRUE);
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
GetDlgItem(IDC_CLEANRESULT)->EnableWindow(FALSE);
}
//********************响应显示初始化数据键****************************
void CCompareSortDlg::OnShowsorce() //显示初始数据
{
// TODO: Add your control notification handler code here
if(m_AutoRun==0)
{
if(AfxMessageBox("由于数据太多,显示较长一定的时间!真要显示数据吗?",MB_YESNO)==IDNO)
return;
}
char a[10];
for(int i=1;i<=m_Num;i++) //转化为CString类
{
sprintf(a,"%d",D[i]);
m_Sorce+=a;
if(i<m_Num)
m_Sorce+=" ";
}
UpdateData(FALSE);
GetDlgItem(IDC_SHOWSORCE)->EnableWindow(FALSE);
}
//********************响应快速排序键****************************
void CCompareSortDlg::OnQuicksort()
{
// TODO: Add your control notification handler code here
if(Mflag==0) //还未执行归并排序
counter++; //排序组数加1
Qflag=1; //表示已执行快速排序
if(m_AutoRun==0)
GetDlgItem(IDC_INPUT)->EnableWindow(FALSE);
m_Result="";
UpdateData(FALSE);
//设置计时函数
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
int dfMinus, dfFreq;
QueryPerformanceFrequency(&litmp);
dfFreq = (int)litmp.QuadPart; // 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 获得初始值
Sort.QuickSort(); //快速排序
QueryPerformanceCounter(&litmp);
QPart2=litmp.QuadPart; //获得中止值
dfMinus=(int)(QPart2-QPart1);
Sort.QTime=(1000*dfMinus)/dfFreq; //获得对应的时间值,计时完成
Time[counter].Num=m_Num;
Time[counter].QTime=Sort.QTime;
//设置各个按钮的有效性
if((m_AutoRun==0)&&(counter<=20)) //当随机产生并且counter小于21时
DrawTime(1,m_Num,Sort.QTime);
if((Qflag==1)&&(Mflag==1)) //排序后输入按钮有效
GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_QUICKSORT)->EnableWindow(FALSE);
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
GetDlgItem(IDC_CLEANRESULT)->EnableWindow(TRUE);
}
//********************响应归并排序键****************************
void CCompareSortDlg::OnMergesort()
{
// TODO: Add your control notification handler code here
if(Qflag==0) //还未执行快速排序
counter++; //排序组数加1
Mflag=1; //表示已执行归并排序
if(m_AutoRun==0)
GetDlgItem(IDC_INPUT)->EnableWindow(FALSE);
m_Result="";
UpdateData(FALSE);
//设置计时函数
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
int dfMinus, dfFreq;
QueryPerformanceFrequency(&litmp);
dfFreq = (int)litmp.QuadPart; // 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 获得初始值
Sort.MergeSort(); //排序
QueryPerformanceCounter(&litmp);
QPart2=litmp.QuadPart; //获得中止值
dfMinus=(int)(QPart2-QPart1);
Sort.MTime=(1000*dfMinus)/dfFreq;//获得对应的时间值,计时完成
Time[counter].Num=m_Num;
Time[counter].MTime=Sort.MTime;
if((m_AutoRun==0)&&(counter<=20))
DrawTime(2,m_Num,Sort.MTime);//输出所用时间
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
GetDlgItem(IDC_CLEANRESULT)->EnableWindow(TRUE);
if((Qflag==1)&&(Mflag==1))
GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_MERGESORT)->EnableWindow(FALSE);
}
//********************响应输出排序后数据键**********************
void CCompareSortDlg::OnShowresult() //显示结果函数
{
// TODO: Add your control notification handler code here
if(m_AutoRun==0)
{
if(AfxMessageBox("由于数据太多,显示需要较长的时间!真要显示数据吗?",MB_YESNO)==IDNO)
return;
}
if(Qflag==1)
OutPut(Sort.A,Sort.Size);
else
OutPut(Sort.B,Sort.Size);
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
}
void CCompareSortDlg::OutPut(int* A,int Num) //输出结果
{
char a[10];
for(int i=1;i<=Num;i++) //转化为CString类
{
sprintf(a,"%d",A[i]);
m_Result+=a;
if(i<Num)
m_Result+=" ";
}
UpdateData(FALSE);
}
//********************响应显示初始化数据键下的Clean键****************************
void CCompareSortDlg::OnCleansorce() //清空显示的初始数据
{
// TODO: Add your control notification handler code here
m_Sorce="";
UpdateData(FALSE);
GetDlgItem(IDC_SHOWSORCE)->EnableWindow(TRUE);
}
//********************响应输出排序后数据键下的Clean键****************************
void CCompareSortDlg::OnCleanresult() //清空显示的结果
{
// TODO: Add your control notification handler code here
m_Result="";
UpdateData(FALSE);
GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
}
//********************输出排序时间的函数**************************
void CCompareSortDlg::DrawTime(int flag, int Num, int Time) //输出排序时间
{
CString str1,str2;
CRect rect;
GetClientRect(&rect); //获得客户窗口的大小
CClientDC dc(this);
Num=Num/5000;
str1.Format("%d",Num); //转换成字符串
dc.SetTextColor(RGB(0,255,255));
dc.TextOut(143+30*Num,rect.Height()-165,str1);
str2.Format("%d",Time);
if(flag==1) //输出快速排序的时间
{
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(142+30*Num,rect.Height()-135,str2);
}
else //输出归并排序的时间
{
dc.SetTextColor(RGB(255,0,0));
dc.TextOut(142+30*Num,rect.Height()-105,str2);
}
}
//********************响应退出键**********************************
void CCompareSortDlg::OnCancel() //退出该程序
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -