您的位置:首页 > 移动开发 > 微信开发

小程序:一个计算器(5月16日)

2009-06-29 16:07 225 查看
应网上一个人的要求,做了一个简单的计算器程序,只实现加减乘除运算(当然也包括很简单的界面了)。其实,现在想想要实现其它的比如开根号等运算也不难,在我这个基础上只要加上不多的代码就可以实现了,呵呵。
刚开始,我不想做这个事情,因为一方面有其他的事情需要我去做,另外一方面觉得这个有点简单了,涉及不到C++的精髓:类、继承、封装、重载等东西,或者说只需要一个比较简单的算法而已。但是后来又想,我学了C++后还没正儿八经的做过一个完整的小软件呢,正好可以练练手。
谁知道,不动手不知道,原来自己还有很多基础的东西不是很清楚,或者说头脑里面没有完整清晰的概念。折腾了差不多两天时间,总算搞定了。出现的问题主要有这么几个:
1.指针、数组出现访问冲突,越界等等错误
比如说要先定义一组数组,但是它的个数是不确定的,只能用变量来表示,但是我们知道,定义的时候,数目只能用常量来表示,或者用这样的方式:
TCHAR seps[]=_T("+-X÷");让它自动表示数目的多少。我不想浪费内存,类似这样去定义:TCHAR seps[80]。于是我中间试图用
TCHAR* seps=NULL;
*seps++=show[j];
来代替。但总是出现内存指针访问冲突。
PS(2009.12.01):
这里当然可以用vector来定义动态数目的数组了,但是当时还不懂这玩意,嘿,,磨好意思。

2.格式的转换,如经常出现无法从CString 转化到 wchar_t *等错误。现在对这类错误做个总结(在unicode环境下):
首先说明:wchar_t就是WCAHR,也就是TCHAR,相应的,LPCTSTR(LPCWSTR)就是TCHAR*,我记得以前好像是CString可以自动转到LPCTSTR的,这里不知道为什么又要提示这样的错误,不管它,它提示错误,我改正就是了。
无法从CString 转化到 wchar_t *:用
TCHAR p[50];//浪费内存就浪费一点吧,不知道是否有更好的办法,要是哪位网友看到我这个文章,请告诉我这个更好的方法,或者我以后发现了再回来改
wcscpy_s(p,strShow.GetLength()+1,strShow);
还有些格式转换时候的问题就不一一列举了,总之就是ANSI和UNICODE之间那些事。
下面把我这个小程序的关键代码贴在下面(关键的地方都做了注释了):
void CCalcuDlg::OnBnClickedButtonAns()
{
// TODO: 在此添加控件通知处理程序代码
int j=0,k=0,i=0,m=0;
CString strShow=m_EditShow;
TCHAR sig[50]={'/0'};
double ans=0;
TCHAR p[50];
wcscpy_s(p,strShow.GetLength()+1,strShow);
double num[30]={0};
TCHAR* token=NULL;//数字放到num中
TCHAR* next_token=NULL;
TCHAR seps[]=_T("+-X÷");
token= wcstok_s(p, seps, &next_token);
while(token!=NULL)
{
num[m++]=_wtof(token);
//CString str;
//str.Format(_T("%f"),num[m-1]);
//MessageBox(str);
token= wcstok_s(NULL, seps, &next_token);
}
while(strShow[j]!='/0')//符号放到sig中. 值得一提的是这里的strShow[j]有着数组的形式,但却不是变量,而仅仅是一个确定的数值,
// 所以不能前面加&来表示地址,也不能以它作为左操作符来给它赋值
{
if(strShow[j]=='+'||strShow[j]=='-'||strShow[j]=='X'||strShow[j]=='÷')
{
sig[k++]=strShow[j];
//MessageBox(&sig[k-1]);
}
j++;
}
while(sig[i]!='/0')//把符号全换成+-号
{
switch(sig[i])
{
case '÷':
{
num[i+1]=num[i]/num[i+1];
num[i]=0;
if(i==0)
sig[i]='+';
else
sig[i]=sig[i-1];
break;
}
case 'X':
{
num[i+1]=num[i]*num[i+1];
num[i]=0;
if(i==0)
sig[i]='+';
else
sig[i]=sig[i-1];
break;
}
}
i++;
}
ans=num[0];
i=0;
while(sig[i]!='/0')//进行加减运算
{
if(sig[i]=='+')
ans=ans+num[i+1];
else
ans=ans-num[i+1];
i++;
}
CString strAns;//输出结果
strAns.Format(m_EditShow+_T("=/n%f"),ans);
GetDlgItem(IDC_EDIT_DATASHOW)->SetWindowTextW(strAns);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: