MFC编写计算器实现进制转换?

MFC编写计算器实现进制转换?,第1张

void CCalculation::Oct2Dec(CString *strExp) //八进制数转十进制数

{

int len,i,index,pos=strExp->Find(_T("_o"))

CString strTmp,strDF

char ch

double dx

while(pos!=-1)

{

dx=0strTmp=""strDF=""

strExp->Delete(pos,2)

for(i=pos-1i>=0i--)

{

ch=(char)strExp->GetAt(i)

if(ch==56 || ch==57 || ch>=97 &&ch<=102)

{

*strExp="ERROR_八进制数越界_"

return

}

if(ch>=48 &&ch<=55 ||ch==46)

{

strTmp.Insert(0,strExp->Mid(i,1))

strExp->Delete(i)

}

else break

}

if(i==pos-1) {*strExp="ERROR_缺少二元运算符_"return}

index=i

pos=strTmp.Find(_T("."))

if(pos!=-1)

{

strDF=strTmp.Right(strTmp.GetLength()-pos-1)

strTmp.Delete(pos,strTmp.GetLength()-pos)

}

strTmp.MakeReverse()

len=strTmp.GetLength()

for(i=0i<leni++)

{

ch=(char)strTmp.GetAt(i)

dx+=(ch-48)*pow(8.0,i)

}

len=strDF.GetLength()

for(i=0i<leni++)

{

ch=(char)strDF.GetAt(i)

dx+=(ch-48)*pow(8.0,-i-1)

}

strTmp=NtoS(dx)

strExp->Insert(index+1,strTmp)

pos=strExp->Find(_T("xo"))

}

}

void CCalculation::Hex2Dec(CString *strExp) //十六进制数转十进制数

{

int len,i,index,pos=strExp->Find(_T("_h"))

CString strTmp,strDF

char ch

double dx

while(pos!=-1)

{

dx=0strTmp=""strDF=""

strExp->Delete(pos,2)

for(i=pos-1i>=0i--)

{

ch=(char)strExp->GetAt(i)

if(ch>=48 &&ch<=57 || ch>=97 &&ch<=102 ||ch==46)

{

strTmp.Insert(0,strExp->Mid(i,1))

strExp->Delete(i)

}

else break

}

if(i==pos-1) {*strExp="ERROR_缺少二元运算符_"return}

index=i

pos=0

for(i=0i<strTmp.GetLength()i++)

{

if(strTmp.GetAt(i)=='.') pos++

if(pos>1) {*strExp="ERROR_缺少二元运算符_"return}

}

pos=strTmp.Find(_T("."))

if(pos!=-1)

{

strDF=strTmp.Right(strTmp.GetLength()-pos-1)

strTmp.Delete(pos,strTmp.GetLength()-pos)

}

strTmp.MakeReverse()

len=strTmp.GetLength()

for(i=0i<leni++)

{

ch=(char)strTmp.GetAt(i)

if(ch>=48 &&ch<=57)//该数在0~9之间

{

dx+=(ch-48)*pow(16.0,i)

}

else if(ch>=97 &&ch<=102)//该数在a~f之间

{

dx+=(ch-87)*pow(16.0,i)

}

}

len=strDF.GetLength()

for(i=0i<leni++)

{

ch=(char)strDF.GetAt(i)

if(ch>=48 &&ch<=57)//该数在0~9之间

{

dx+=(ch-48)*pow(16.0,-i-1)

}

else if(ch>=97 &&ch<=102)//该数在a~f之间

{

dx+=(ch-87)*pow(16.0,-i-1)

}

}

strTmp=NtoS(dx)

strExp->Insert(index+1,strTmp)

pos=strExp->Find(_T("xh"))

}

}

void CCalculation::Bin2Dec(CString *strExp) //二进制数转十进制数

{

int len,i,index,pos=strExp->Find(_T("_b"))

CString strTmp,strDF

char ch

double dx

while(pos!=-1)

{

dx=0strTmp=""strDF=""

strExp->Delete(pos,2)

for(i=pos-1i>=0i--)

{

ch=(char)strExp->GetAt(i)

if(ch>=50 &&ch<=57 || ch>=97 &&ch<=102)

{

*strExp="ERROR_二进制数越界_"

return

}

if(ch=='0' || ch=='1' ||ch==46)

{

strTmp.Insert(0,strExp->Mid(i,1))

strExp->Delete(i)

}

else break

}

if(i==pos-1) {*strExp="ERROR_缺少二元运算符_"return}

index=i

pos=strTmp.Find(_T("."))

if(pos!=-1)

{

strDF=strTmp.Right(strTmp.GetLength()-pos-1)

strTmp.Delete(pos,strTmp.GetLength()-pos)

}

strTmp.MakeReverse()

len=strTmp.GetLength()

for(i=0i<leni++)

{

ch=(char)strTmp.GetAt(i)

dx+=(ch-48)*pow(2.0,i)

}

len=strDF.GetLength()

for(i=0i<leni++)

{

ch=(char)strDF.GetAt(i)

dx+=(ch-48)*pow(2.0,-i-1)

}

strTmp=NtoS(dx)

strExp->Insert(index+1,strTmp)

pos=strExp->Find(_T("xb"))

}

}

void CCalculation::Dec2Hex(CString *strExp/*strExp须为数字*/) //十进制数转十六进制数

{

bool bMinus=0

if(strExp->GetAt(0)=='-')

{

bMinus=1

strExp->Delete(0)

}

int pos=strExp->Find('.')

CString str,strDec

int nDecInt

double dDec

if(pos!=-1)

{

strDec=strExp->Left(pos)

nDecInt=_wtoi(strDec.GetBuffer(0))

strDec=strExp->Right(strExp->GetLength()-pos)

}

else

{

nDecInt=_wtoi(strExp->GetBuffer(0))

}

strExp->Empty()

while(nDecInt!=0)

{

int nTmp=nDecInt%16

if(nTmp==10) str="a"

else if(nTmp==11) str="b"

else if(nTmp==12) str="c"

else if(nTmp==13) str="d"

else if(nTmp==14) str="e"

else if(nTmp==15) str="f"

else str.Format(_T("%d"),nTmp)

nDecInt/=16

strExp->Insert(0,str)

}

*strExp+="."

if(pos!=-1)

{

dDec=StoN(strDec)

int nCount=0

while(dDec!=0)

{

dDec*=16

int nTmp=(int)dDec

if(nTmp==10) str="a"

else if(nTmp==11) str="b"

else if(nTmp==12) str="c"

else if(nTmp==13) str="d"

else if(nTmp==14) str="e"

else if(nTmp==15) str="f"

else str.Format(_T("%d"),nTmp)

*strExp+=str.Left(pos)

dDec-=nTmp

if(++nCount==17) break

}

}

if(bMinus) strExp->Insert(0,_T("-"))

if(strExp->Find(_T("-1"))!=-1 &&bMinus!=1) *strExp="太大无法表示"

}

void CCalculation::Dec2Oct(CString *strExp) //十进制数转八进制数

{

bool bMinus=0

if(strExp->GetAt(0)=='-')

{

bMinus=1

strExp->Delete(0)

}

int pos=strExp->Find('.')

CString str,strDec

int nDecInt

double dDec

if(pos!=-1)

{

strDec=strExp->Left(pos)

nDecInt=_wtoi(strDec.GetBuffer(0))

strDec=strExp->Right(strExp->GetLength()-pos)

}

else

{

nDecInt=_wtoi(strExp->GetBuffer(0))

}

strExp->Empty()

while(nDecInt!=0)

{

int nTmp=nDecInt%8

str.Format(_T("%d"),nTmp)

nDecInt/=8

strExp->Insert(0,str)

}

*strExp+="."

if(pos!=-1)

{

dDec=StoN(strDec)

int nCount=0

while(dDec!=0)

{

dDec*=8

int nTmp=(int)dDec

str.Format(_T("%d"),nTmp)

*strExp+=str.Left(pos)

dDec-=nTmp

if(++nCount==17) break

}

}

if(bMinus) strExp->Insert(0,_T("-"))

}

void CCalculation::Dec2Bin(CString *strExp) //十进制数转二进制数

{

bool bMinus=0

if(strExp->GetAt(0)=='-')

{

bMinus=1

strExp->Delete(0)

}

int pos=strExp->Find('.')

CString str,strDec

_int64 nDecInt

double dDec

if(pos!=-1)

{

strDec=strExp->Left(pos)

if(strDec.Compare(_T("4294967295"))>0 &&strDec.GetLength()>10 || strDec.GetLength()>10)

{

*strExp="太大无法转换"

return

}

nDecInt=_wtoi(strDec.GetBuffer(0))

strDec=strExp->Right(strExp->GetLength()-pos)

}

else

{

if(strExp->Compare(_T("4294967295"))>0 &&strExp->GetLength()>10 || strExp->GetLength()>10)

{

*strExp="太大无法转换"

return

}

nDecInt=_wtoi(strExp->GetBuffer(0))

}

strExp->Empty()

while(nDecInt!=0)

{

_int64 nTmp=nDecInt%2

str.Format(_T("%d"),nTmp)

nDecInt/=2

strExp->Insert(0,str)

}

*strExp+="."

if(pos!=-1)

{

dDec=StoN(strDec)

int nCount=0

while(dDec!=0)

{

dDec*=2

int nTmp=(int)dDec

str.Format(_T("%d"),nTmp)

*strExp+=str.Left(pos)

dDec-=nTmp

if(++nCount==17) break

}

}

if(bMinus) strExp->Insert(0,_T("-"))

}

进制转换谁都会,难得是错误检查

代码都比较简单,我就不多说了

using Systemusing System.Collections.Genericusing System.Linqusing System.Text

namespace 十进制转二进制2 { class Program { static void Main(string[] args) { while (true) { Console.Clear()Console.WriteLine("只能输入整数!")int count = 0int[] nums = new int[20]Console.WriteLine("输入一个数:")来源:( http://blog.sina.com.cn/s/blog_63fb42cd0100i5ol.html) - 十进制转二进制代码_xs5816_新浪博客 int num = Convert.ToInt32(Console.ReadLine())while (num != 0) //判断输入的数不为0 { nums[count] = num % 2//接收余数 num = num / 2//除2取整 count++} for (int i = count - 1i >= 0i--) //输出余数 Console.Write("{0}", nums[i])Console.WriteLine()Console.WriteLine("按Enter键继续,按End键结束。。。")ConsoleKeyInfo info = Console.ReadKey()if (info.Key == ConsoleKey.End) break} } } }

void CMyDlg::tTo2() // 10进制 转换 为2进制

{

int c=atoi(m_editIn)

int o=0

CString r = ""

CString ch = ""

do

{ o = c%2

c = c/2

ch.Format(_T("%d"),o)

r = r+ch

} while (c>0)

int k = r.GetLength()

CString r1 = ""

int i

CString str = r

for(i=0i<ki++)

{

r1+=str.Right(1)

str = str.Left(k-i-1)

}

m_editIn = r1

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12194384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存