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

📄 除法模拟器dlg.cpp

📁 基于MFC框架编写的模拟CPU对二进制整数除法的运算过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	answer[8]=' '-'0';
}

int dividesame_sign(int acc[],int div[])
{
	if(acc[0]==div[0])
		return 1;
	else return 0;
}
CString BDivide(CString s1,CString s2)
{
	CString output;
	output+="   被 除 数         上  商\r\n";
	int a[10],b[10],c[9],d[9];
	int original[9];
	int buf[9];
	int answer[9];
	int div[9],div_opposite[9];
	int extra=0;
	int acc[9];//////////////R
	for(int i=0;i<10;i++)
	{
		a[i]=s1[i]-'0';
		b[i]=s2[i]-'0';
	}
	original[0]=a[0];
	c[0]=acc[0]=a[0];
	d[0]=div[0]=b[0];
	answer[0]=' '-'0';
	for(i=1;i<9;i++)
	{
		original[i]=a[i+1];
		acc[i]=a[i+1];
		div[i]=b[i+1];
		c[i]=acc[i];
		d[i]=div[i];
		answer[i]=' '-'0';
	}
	divideopposition(div,div_opposite);
	if(acc[0]==1)
		divideopposition(acc,c);
	if(div[0]==1)
		divideopposition(div,d);
	for(i=0;i<9;i++)
		if(div[i]!=0)
			break;
	if(i==9)
	{
		output="除数不能为0";
		return output;
	}
	for(i=1;i<9;i++)
	{
		if(c[i]>d[i])
		{
			output="被除数的绝对值大于除数的绝对值,溢出了";
			return output;
		}
		if(c[i]<d[i])
			break;
	}
	if(i==9)
	{
		output="除数和被除数绝对值相同,溢出了";
		return output;
	}
	for(int j=0;j<9;j++)
	{
		
		output+=" ";
		output+=acc[0]+'0';
		output+=".";
		for(i=1;i<9;i++)
		{
			output+=acc[i]+'0';
		}
		output+="	";
		if(j==0)
		{
			output+="0.00000000";
			output+="\r\n";
		}
		if(!dividesame_sign(acc,div))
		{
			if(j!=0)
			{
				answer[8]=0;
				output+=" ";
				for(i=0;i<9;i++)
					output+=answer[i]+'0';
				output+="\r\n";
				divideleft_move(acc,answer);
				if(j==8)
					answer[8]=1;	
				output+=" ";
				output+=acc[0]+'0';
				output+=".";
				for(i=1;i<9;i++)
				{
					output+=acc[i]+'0';
				}
				output+="	";
				output+=" ";
				for(i=0;i<9;i++)
					output+=answer[i]+'0';
				output+="\r\n";
			}
			if(j!=8)
			{
				output+="+";
				output+=div[0]+'0';
				output+=".";
				for(i=1;i<9;i++)
				{
					output+=div[i]+'0';
				}
				output+="	";
				divideadd(acc,div,buf);
				output+="\r\n───────────────────\r\n";
				for(int i=0;i<9;i++)
					acc[i]=buf[i];
			}
		}
		else
		{
			if(j!=0)
			{
				answer[8]=1;
				output+=" ";
				for(i=0;i<9;i++)
					output+=answer[i]+'0';
				output+="\r\n";
				divideleft_move(acc,answer);
				if(j==8)
					answer[8]=1;
				output+=" ";
				output+=acc[0]+'0';
				output+=".";
				for(i=1;i<9;i++)
				{
					output+=acc[i]+'0';
				}
				output+="	";
				output+=" ";
				for(i=0;i<9;i++)
					output+=answer[i]+'0';
				output+="\r\n";
			}
			if(j!=8)
			{
				output+="+";
				output+=div_opposite[0]+'0';
				output+=".";
				for(i=1;i<9;i++)
				{
					output+=div_opposite[i]+'0';
				}
				output+="	";
				divideadd(acc,div_opposite,buf);
					output+="\r\n───────────────────\r\n";
				for(int i=0;i<9;i++)
					acc[i]=buf[i];
			}
		}
	}
	output+="商为:";
	output+=answer[0]+'0';
	output+=".";
	for(i=1;i<9;i++)
		output+=answer[i]+'0';

	CString tmp;
	for(i=output.GetLength()-10;i<output.GetLength();i++)
	{
		tmp+=output[i];
	}
	output+="\r\n转为原码结果为:";
	output+=BtoY(tmp);



	return output;
}

CString Odivide(CString s1, CString s2)
{
	CString output;
	CString one="   ";
	CString two="   ";
	CString three="──────────────────────────\r\n";
	CString quotient="          ";
	CString instructone="+[-y*]补 (减去除数)\r\n";
	CString instructtwo="余数为负,上商0\r\n";
	CString instructthree="←1位\r\n";
	CString instructfour="+[y*]补 (加上除数)\r\n";
	CString instructfive="恢复余数+[y*]补\r\n";
	CString instructsix="余数为正,上商1\r\n";
	CString instructseven="被恢复的被除数\r\n";
	
	if(IsZero(s2)) 
	{
		output+="除数为零,请重新输入!";
		return output;
	}
	else
	{
		CString xstar;
		CString ystar;
		CString xsign;
		CString ysign;
		CString mystar;
		CString Bmystar;
		CString beichushu;
		CString sign;

		xsign=s1[0];
		ysign=s2[0];

		if((xsign=='0'&&ysign=='0')||(xsign=='1'&&ysign=='1'))
			sign="0";
		else sign="1";

		int i=0;

		xstar.Insert(0,'0');
		xstar.Insert(1,'.');
		ystar.Insert(0,'0');
		ystar.Insert(1,'.');
		for(i=2;i<10;i++)
		{
			xstar.Insert(i,s1[i]);
			ystar.Insert(i,s2[i]);
		}
		mystar=ystar;
		if(ystar[0]=='0') mystar.SetAt(0,'1');
		else mystar.SetAt(0,'0');
		Bmystar=YtoB(mystar);
		beichushu=xstar;

		output+=(one+"被除数(余数)"+"     商    "+two+"      说  明   \r\n");
		output+=(one+beichushu+two+"0.00000000\r\n");
		one.SetAt(1,'+');
		output+=(one+Bmystar+two+"          "+two+instructone);
		output+=three;
		
		i=0;
		int flag=1;

		one.SetAt(1,' ');
		beichushu=Headd(beichushu,Bmystar);

		while(i<10)
		{
			
			if(beichushu[0]=='1')
			{
				quotient.SetAt(9,'0');
				if(i==0&&quotient[9]=='1')
				{
					output="溢出,请确认除数大于被除数!";
					return output;
				}
				i++;
				one.SetAt(1,' ');
				output+=one+beichushu+two+quotient+two+instructtwo;
				
				if(i==9)
				{
					CString temp="\r\n符号位为:"+xsign+" xor "+ysign+" = "+sign+"\r\n";
					CString result;
					result.Insert(0,sign[0]);
					result.Insert(1,'.');
					for(int k=2;k<10;k++)
						result.Insert(k,quotient[k]);
					temp+="结果为:"+result+"\r\n";
					output+=temp;
					return output;
				}

				one.SetAt(1,'+');
				output+=one+ystar+two+"          "+two+instructfive;
				output+=three;
				beichushu=Headd(beichushu,ystar);
				
				flag=2;
			}
			if(beichushu[0]=='0'&&flag==2)
			{
				one.SetAt(1,' ');
				output+=one+beichushu+two+"          "+two+instructseven;
				beichushu.SetAt(0,beichushu[2]);
				for(int j=2;j<9;j++)
				{
					beichushu.SetAt(j,beichushu[j+1]);
				}
				beichushu.SetAt(9,'0');
				for(j=0;j<9;j++)
				{
					quotient.SetAt(j,quotient[j+1]);
				}
				quotient.SetAt(9,' ');

				output+=(one+beichushu+two+quotient+two+instructthree);
				
				one.SetAt(1,'+');
				output+=(one+Bmystar+two+"          "+two+instructone);
				beichushu=Headd(beichushu,Bmystar);
				output+=three;
				
				flag=1;
			} 
			if(beichushu[0]=='0'&&flag!=2)
			{
				one.SetAt(1,' ');
				quotient.SetAt(9,'1');
				if(i==0&&quotient[9]=='1')
				{
					output="溢出,请确认除数大于被除数!";
					return output;
				}
				i++;
				
				output+=(one+beichushu+two+quotient+two+instructsix);

				if(i==9)
				{
					CString temp="\r\n符号位为:"+xsign+" xor "+ysign+" = "+sign+"\r\n";
					CString result;
					result.Insert(0,sign[0]);
					result.Insert(1,'.');
					for(int k=2;k<10;k++)
						result.Insert(k,quotient[k]);
					temp+="结果为:"+result+"\r\n";
					output+=temp;
					return output;
				}

				beichushu.SetAt(0,beichushu[2]);
				for(int j=2;j<9;j++)
				{
					beichushu.SetAt(j,beichushu[j+1]);
				}
				beichushu.SetAt(9,'0');
				for(j=0;j<9;j++)
				{
					quotient.SetAt(j,quotient[j+1]);
				}
				quotient.SetAt(9,' ');
				output+=(one+beichushu+two+quotient+two+instructthree);
				one.SetAt(1,'+');
				output+=(one+Bmystar+two+"          "+two+instructone);

			//	AfxMessageBox("beichushu"+beichushu);
			//	AfxMessageBox("Bmystar"+Bmystar);

				beichushu=Headd(beichushu,Bmystar);
			
			//	AfxMessageBox("加过之后"+beichushu);
				
				output+=three;
				
				flag=1;
			}
		}
		return output;
	}
}

void CMyDlg::OnBUTTONBDivide() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	
	if(IsValidString(m_nInput1)&&IsValidString(m_nInput2))
	{
		standard(m_nInput1);
		standard(m_nInput2);
		m_nInput1=YtoB(m_nInput1);
		m_nInput2=YtoB(m_nInput2);
		m_nResult=BDivide(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
}

void CMyDlg::OnBUTTONInstruction() 
{
	// TODO: Add your control notification handler code here
	CInstruction DLY;
	DLY.DoModal();
}

void CMyDlg::OnBUTTONYDivide() 
{
	// TODO: Add your control notification handler code here
		UpdateData();
	
	if(IsValidString(m_nInput1)&&IsValidString(m_nInput2))
	{
		standard(m_nInput1);
		standard(m_nInput2);
		m_nResult=Odivide(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
}

⌨️ 快捷键说明

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