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

📄 计算机小数计算模拟器dlg.cpp

📁 该软件以图形化界面显示在计算机内部定点小数补码加法、定点小数补码减法
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void right_move(int acc[],int mult[],int &extra)
{
	extra=mult[8];
	for(int i=8;i>0;i--)
	{
		mult[i]=mult[i-1];
	}
	mult[0]=acc[9];
	for(i=9;i>1;i--)
	{
		acc[i]=acc[i-1];
	}
}
CString BMultiply(CString s1,CString s2)
{
	CString output;
	int a[10],b[10];
	int original[10],oppsite[10];
	int buf[10];
	int mult[9];
	int extra=0;
	int acc[10];//////////////部分积
	for(int i=0;i<10;i++)
	{
		a[i]=s1[i]-'0';
		b[i]=s2[i]-'0';
		acc[i]=0;
		buf[i]=0;
	}
	for(i=0;i<2;i++)
	{
		original[i]=a[0];
		mult[i]=b[0];
	}
	for(i=2;i<10;i++)
	{
		original[i]=a[i];
	}
	for(i=1;i<9;i++)
	{
		mult[i]=b[i+1];
	}
	opposition(original,oppsite);
	output+="  部 分 积       乘  数   附加位 \r\n";
	for(int j=0;j<9;j++)
	{
//		right_move(acc,mult,extra);
		output+=" ";
		output+=acc[0]+'0';
		output+=acc[1]+'0';
		output+=".";
		for(i=2;i<10;i++)
		{
			output+=acc[i]+'0';
		}
		output+="	";
		for(i=0;i<9;i++)
		{
			output+=mult[i]+'0';
		}
		output+="	";
		output+=extra+'0';
		output+="\r\n";
		if(mult[8]==0&&extra==0)
		{
			if(j!=8)
				right_move(acc,mult,extra);
			continue;
		}
		else if(mult[8]==1&&extra==1)
		{
			if(j!=8)
				right_move(acc,mult,extra);
			continue;
		}
		else if(mult[8]==0&&extra==1)
		{
			output+="+";
			for(i=0;i<2;i++)
				output+=original[i]+'0';
			output+=".";
			for(i=2;i<10;i++)
				output+=original[i]+'0';
			output+="\r\n───────────────────";
			huadd(acc,original,buf);
			for(int i=0;i<10;i++)
				acc[i]=buf[i];
			output+="\r\n ";
			for(i=0;i<2;i++)
				output+=buf[i]+'0';
			output+=".";
			for(i=2;i<10;i++)
				output+=buf[i]+'0';
			output+="\r\n";
			if(j!=8)
				right_move(acc,mult,extra);
			continue;
		}
			else if(mult[8]==1&&extra==0)
		{
			output+="+";
			for(i=0;i<2;i++)
				output+=oppsite[i]+'0';
			output+=".";
			for(i=2;i<10;i++)
				output+=oppsite[i]+'0';
			output+="\r\n───────────────────";
			huadd(acc,oppsite,buf);
			for(int i=0;i<10;i++)
				acc[i]=buf[i];
			output+="\r\n ";
			for(i=0;i<2;i++)
				output+=buf[i]+'0';
			output+=".";
			for(i=2;i<10;i++)
				output+=buf[i]+'0';
			output+="\r\n";
			if(j!=8)
				right_move(acc,mult,extra);
			continue;
		}
	}
	output+="\r\n值为:";
	output+=acc[1]+'0';
	output+='.';
	for(i=2;i<10;i++)
		output+=acc[i]+'0';
	CString tmp;
	for(i=output.GetLength()-10;i<output.GetLength();i++)
	{
		tmp+=output[i];
	}
	output+="\r\n转为原码结果为:";
	output+=BtoY(tmp);


	return output;
}

int devidexor(int a,int b)
{
	return a*(1-b)+b*(1-a);
}

void devideadd(int a[],int b[],int c[])
{
	int flag=0;//////////进位
	for(int i=8;i>=0;i--)
	{
		if(flag==0)
		{
			c[i]=devidexor(a[i],b[i]);
			if(a[i]+b[i]>1)
				flag=1;
			else
				flag=0;
		}
		else if(flag==1)
		{
			c[i]=devidexor(1,devidexor(a[i],b[i]));
			if(a[i]+b[i]+1>1)
				flag=1;
			else
				flag=0;
		}
	}
}

void devideopposition(int from[],int to[])/////////取相反数
{
	int buf[9]={0,0,0,0,0,0,0,0,1};
	int acc[9];
	if(from[0]==1)
	{
		to[0]=0;
		for(int i=1;i<9;i++)
		{
			to[i]=devidexor(from[i],1);
		}
		devideadd(to,buf,acc);
		for(i=0;i<9;i++)
		{
			to[i]=acc[i];
		}
	}
	else
	{
		to[0]=1;
		for(int i=1;i<9;i++)
		{
			to[i]=devidexor(from[i],1);
		}
		devideadd(to,buf,acc);
		for(i=0;i<9;i++)
		{
			to[i]=acc[i];
		}
	}
}

void devideleft_move(int acc[],int answer[])
{
	for(int i=0;i<8;i++)
		acc[i]=acc[i+1];
	acc[8]=0;
	for(i=0;i<8;i++)
		answer[i]=answer[i+1];
	answer[8]=' '-'0';
}

int devidesame_sign(int acc[],int div[])
{
	if(acc[0]==div[0])
		return 1;
	else return 0;
}
CString BDevide(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';
	}
	devideopposition(div,div_opposite);
	if(acc[0]==1)
		devideopposition(acc,c);
	if(div[0]==1)
		devideopposition(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(!devidesame_sign(acc,div))
		{
			if(j!=0)
			{
				answer[8]=0;
				output+=" ";
				for(i=0;i<9;i++)
					output+=answer[i]+'0';
				output+="\r\n";
				devideleft_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+="	";
				devideadd(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";
				devideleft_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+="	";
				devideadd(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 Odevide(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::OnAdd() 
{
	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=ADD(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
}

void CMyDlg::OnSub() 
{
	// 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=SUB(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
	
}

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

void CMyDlg::OnBmultiply() 
{
	// 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=BMultiply(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
	
}

void CMyDlg::OnOdevide() 
{
	// TODO: Add your control notification handler code here

	UpdateData();
	
	if(IsValidString(m_nInput1)&&IsValidString(m_nInput2))
	{
		standard(m_nInput1);
		standard(m_nInput2);
		m_nResult=Odevide(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
}

void CMyDlg::OnBdevide() 
{
	// 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=BDevide(m_nInput1,m_nInput2);
		GetDlgItem(IDC_RESULT)->SetWindowText(m_nResult);
	}
	
}

void CMyDlg::OnInstruction() 
{
	// TODO: Add your control notification handler code here
	Instruction Dlg;
	Dlg.DoModal();
}

void CMyDlg::OnAbout() 
{
	// TODO: Add your control notification handler code here
	AboutDlg Dlg;
	Dlg.DoModal();
}

⌨️ 快捷键说明

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