📄 除法模拟器dlg.cpp
字号:
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&"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::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 + -