📄 计算机小数计算模拟器dlg.cpp
字号:
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&"ient[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&"ient[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 + -