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

📄 mergesortshowdlg.cpp

📁 数据结构的代码演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	int temp;
	for(int i=1; i<n; i++)
		for(int j=i; ((j>0)&&(A[j]<A[j-1])); j--)
		{
			temp = A[j];
			A[j] = A[j-1];
			A[j-1] = temp;
		}
}
int CMergeSortShowDlg::fact(int n) //要演示的程序
{
	// TODO: Add extra validation here
	int i;
	if(SetValue(n, 0)) return 0;
	m_Stack_Str.Empty();
	m_Stack_Str.Format("Call fact(n=%d)", n);
	PushStack(m_Stack_Str);

	CString str;
	///////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(n, 0)) return 0;
	SetCode(7);
	if (n == 0)  ////////////////////////////////////////////////////////////////////THRESHOLD=2

	///////////////////////////////////////////////////////////////////////////////////////////
    {//////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(n, 0)) return 0;
		SetCode(9);
//		PopStack();
	    return  1;/////////////////////////////////////////////////////////////////////////////////
	}///////////////////////////////////////////////////////////////////////////////////////////

	else ////////////////////////////////////////////////////////////////////THRESHOLD=2
	{//////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(n, 0)) return 0;
		SetCode(11);
		if(SetValue(n, 0)) return 0;
		SetCode(13);
		i = fact (n-1);
		if(SetValue(n, i)) return 0;
		SetCode(13);
		PopStack();
	    return  n * i;             /////////////////////////////////////////////////////////////
	}///////////////////////////////////////////////////////////////////////////////////////////
}

void CMergeSortShowDlg::mergesort(int A[], int temp[], int left, int right) //要演示的程序
{
	// TODO: Add extra validation here
	int i, j, k, mid;
/*
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	m_Stack_Str.Empty();
	m_Stack_Str.Format("Call mergesort(A=%d, temp=%d, left=%d, right=%d)", A, temp, left, right);
	PushStack(m_Stack_Str);

	CString str;
	///////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(2);
	if ((right-left) <= 2)  ////////////////////////////////////////////////////////////////////THRESHOLD=2

	///////////////////////////////////////////////////////////////////////////////////////////
    {//////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(4);
		inssort(&A[left],right-left+1);/////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(5);
		PopStack();
	    return;/////////////////////////////////////////////////////////////////////////////////
	}///////////////////////////////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(7);
    mid = (left+right)/2;//////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(8);
	if (left == right)//////////////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	{
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(9);
		PopStack();
		return;/////////////////////////////////////////////////////////////////////////////////
	}///////////////////////////////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(10);
	mergesort(A, temp, left, mid);//////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(11);
	mergesort(A, temp, mid+1, right);///////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(12);
	for (i=mid; i>=left; i--)///////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	{///////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(TRUE, TRUE, FALSE, i, i, A, temp);
		SetCode(13);
		temp[i] = A[i];/////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(12);
	}///////////////////////////////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(14);
    for (j=1; j<=right-mid; j++)////////////////////////////////////////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	{///////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(TRUE, TRUE, FALSE, j+mid, right-j+1, A, temp);
		SetCode(15);
		temp[right-j+1] = A[j+mid];//////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(14);
	}///////////////////////////////////////////////////////////////////////////////////////////

	/////////////////////////////////////////////////////////////////////////////////////////////
	if(SetValue(i, j, k, mid, A, temp, left, right)) return;
	SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
	SetCode(16);
	for (i=left,j=right,k=left; k<=right; k++)//////////////////////////////

	////////////////////////////////////////////////////////////////////////////////////////////
	{///////////////////////////////////////////////////////////////////////////////////////////
		if(SetValue(i, j, k, mid, A, temp, left, right)) return;
		SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
		SetCode(17);
		if (temp[i] < temp[j])///////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////////
		{/////////////////////////////////////////////////////////////////////////
			if(SetValue(i, j, k, mid, A, temp, left, right)) return;
			SetMoveValue(TRUE, FALSE, TRUE, i, k, A, temp);
			SetCode(18);
			A[k] = temp[i++];/////////////////////////////////////////////////////
		}/////////////////////////////////////////////////////////////////////////

	///////////////////////////////////////////////////////////////////////////////
       else////////////////////////////////////////////////////////////////////////
	   {///////////////////////////////////////////////////////////////////////////
   			if(SetValue(i, j, k, mid, A, temp, left, right)) return;
			SetMoveValue(TRUE, FALSE, TRUE, j, k, A, temp);
			SetCode(20);
			A[k] = temp[j--];////////////////////////////////////////////////////////
			if(SetValue(i, j, k, mid, A, temp, left, right)) return;
			SetMoveValue(FALSE, FALSE, FALSE, 0, 0, A, temp);
			SetCode(16);
	   }/////////////////////////////////////////////////////////////////////////////
	}////////////////////////////////////////////////////////////////////////////////
*/	PopStack();
}

UINT DebugShow(LPVOID pParam)
{
	CMergeSortShowDlg *pDialog = (CMergeSortShowDlg *)pParam;

	pDialog->m_step = 0; 
	pDialog->ResetCodeSentence();
	pDialog->ResetStackSentence();
	pDialog->fact(5);
	if(pDialog->m_step >= 0)
		AfxMessageBox("演示成功结束!!!");
	else
		AfxMessageBox("演示被终止!!!");
	pDialog->mExist = FALSE;
	return 0;
}	




void CMergeSortShowDlg::OnSingleStep() 
{
	// TODO: Add your control notification handler code here
	UpdateData(FALSE);
	if(m_step==0)
	{
		m_step++; 
		mStepEvent.SetEvent();
	}
}

void CMergeSortShowDlg::OnMultiStep() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	UpdateData(FALSE);
	if(m_step==0)
	{
		m_step +=m_MultiNum; 
		mStepEvent.SetEvent();
	}
	
}

void CMergeSortShowDlg::OnStartShow() 
{
	// TODO: Add your control notification handler code here

	if(	mExist)
		return;
	CMergeSortShowDlg *pDialog = (CMergeSortShowDlg *)GetDlg();
	mStepEvent.ResetEvent();

	if(m_pShowThread)
	{
		delete m_pShowThread;
		m_pShowThread = NULL;
	}
	m_pShowThread = AfxBeginThread
					(DebugShow, 
					 pDialog, 
					 THREAD_PRIORITY_NORMAL,
 					 0,
					 CREATE_SUSPENDED);
	m_pShowThread->m_bAutoDelete = FALSE;
	m_pShowThread->ResumeThread();
	mExist = TRUE;
}

void CMergeSortShowDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}

void CMergeSortShowDlg::OnEndShow() 
{
	// TODO: Add your control notification handler code here
	UpdateData(FALSE);
	if(m_step==0)
	{
		m_step = -1; 
		mStepEvent.SetEvent();
	}
	
}

⌨️ 快捷键说明

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