您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > VC计算器实现实验报告
VC课程设计实验报告课题名称:计算器实现姓名:陈锋学号:2008221105110010提交报告时间:2010年11月22日课程设计目标实验设计一个计算器,要求可通过按钮输入数字、运算符,能通过按钮实现退格、清除功能,实现整数的加、减、乘、除、取余、开方、平方等运算功能,必要的错误处理,如除零;可以通过键盘输入数字、退格、运算符(+、-、*、/、%、=),实现括号运算;实现不同进制(二进制、十进制、八进制、十六进制)下的加、减、乘、除、取余、开方、平方等运算功能。1.分析与设计(1)实现方法:编程语言为C++语言。编程方法:通过一个文本框接收所输入的运算表达式,然后将其转换成后缀表达式并将各个数字先转换成十进制数值进行计算,最后再转换成相应进制的字符串。(2)代码设计说明:文件和类的设计说明:创建一个头文件:Calculate.h内容如下:#includestdio.hconstintMaxSize=30;constintMaxPri=8;BOOLdecimal_2;//为真代表选择相应的进制BOOLdecimal_8;BOOLdecimal_10;BOOLdecimal_16;struct{charch;intpri;}lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'%',5},{'+',3},{'-',3},{')',8},{'^',7}},rpri[]={{'=',0},{'(',8},{'*',4},{'/',4},{'%',4},{'+',2},{'-',2},{')',1},{'^',6}};intleftpri(charop)//求左运算符的优先级{for(inti=0;iMaxPri;i++)if(lpri[i].ch==op)returnlpri[i].pri;}intrightpri(charop)//求右运算符op的优先级{for(inti=0;iMaxPri;i++)if(rpri[i].ch==op)returnrpri[i].pri;}intInOp(charch)//判断ch是否为运算符{if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='^'||ch=='('||ch==')')return1;elsereturn0;}intPrecede(charop1,charop2){if(leftpri(op1)==rightpri(op2))return0;elseif(leftpri(op1)rightpri(op2))return-1;elsereturn1;}voidtrans(char*exp,charpostexp[])//将算术表达式转换成后缀表达式{struct{chardata[MaxSize];inttop;}op;inti=0;op.top=0;op.data[op.top]='=';while(*exp!='\0'){if(!InOp(*exp)){while(*exp='0'&&*exp='9'||*exp=='.'||*exp='a'&&*exp='f'){postexp[i++]=*exp;exp++;}postexp[i++]='#';}else{switch(Precede(op.data[op.top],*exp)){case-1:op.top++;op.data[op.top]=*exp;exp++;break;case0:op.top--;exp++;break;case1:postexp[i++]=op.data[op.top];op.top--;break;}}}while(op.data[op.top]!='='){postexp[i++]=op.data[op.top];op.top--;}postexp[i]='\0';}floatcompvalue(char*postexp)//计算后缀表达式的值{struct{floatdata[MaxSize];inttop;}st;floatd,a,b,c;st.top=-1;while(*postexp!='\0'){switch(*postexp){case'+':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;c=a+b;st.top++;st.data[st.top]=c;break;case'-':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;c=b-a;st.top++;st.data[st.top]=c;break;case'*':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;c=a*b;st.top++;st.data[st.top]=c;break;case'/':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;if(a!=0){c=b/a;st.top++;st.data[st.top]=c;}else{MessageBox(NULL,\t除零错误!,Error,MB_OK);st.data[st.top]=0;break;}break;case'%':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;if(a!=0){c=(int)b%(int)a;st.top++;st.data[st.top]=c;}else{MessageBox(NULL,\t余零错误!,Error,MB_OK);st.data[st.top]=0;break;}break;case'^':{a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;floatd=1;for(inti=0;ia;i++)d*=b;st.top++;st.data[st.top]=d;break;}default://将数值字符转换成十进制字符串保存d=0;/************整数部分************/while(*postexp='0'&&*postexp='9'||*postexp='a'&&*postexp='f'){if(decimal_2)d=d*2+*postexp-'0';elseif(decimal_8)d=d*8+*postexp-'0';elseif(decimal_10)d=d*10+*postexp-'0';elseif(decimal_16){if(*postexp='0'&&*postexp='9')d=d*16+*postexp-'0';elsed=d*16+*postexp-'a'+10;}postexp++;}/************可能的小数部分************/if(*postexp=='.'){postexp++;intn=0;if(decimal_2){while(*postexp='0'&&*postexp='1'){n++;d=d*2+*postexp-'0';postexp++;}while(n){d=d/2;n--;}}elseif(decimal_8){while(*postexp='0'&&*postexp='9'){n++;d=d*8+*postexp-'0';postexp++;}while(n){d=d/8;n--;}}elseif(decimal_10){while(*postexp='0'&&*postexp='9'){n++;d=d*10+*postexp-'0';postexp++;}while(n){d=d/10;n--;}}elseif(decimal_16){while(*postexp='0'&&*postexp='9'||*postexp='a'&&*postexp='f'){n++;if(*postexp='a'&&*postexp='f')d=d*16+*postexp-'a'+10;elsed=d*16+*postexp-'0';postexp++;}while(n){d=d/16;n--;}}}st.top++;st.data[st.top]=d;break;}postexp++;}return(st.data[st.top]);}(3)各控件变量:(如图)(4)界面图示:2.程序代码实现BOOLCMyDlg::OnInitDialog(){CDialog::OnInitDialog();//AddAbout...menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//Settheiconforthisdialog.Theframeworkdoesthisautomatically//whentheapplication'smainwindowisnotadialogSetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//Setsmallicon//TODO:Addextrainitializationhere/******************初始化******************/CheckRadioButton(IDC_RADIO_TEN,IDC_RADIO_SIXTEEN,IDC_RADIO_TEN);//设置单选按钮m_show='0';//文本框内容初始化为'0'UpdateData(FALSE);//显示文本框内容GetDlgItem(IDC_BTN_10)-EnableWindow(false);GetDlgItem(IDC_BTN_11)-EnableWindow(false);//控件灰显,默认十进制标准GetDlgItem(IDC_BTN_12)-EnableWindow(false);GetDlgItem(IDC_BTN_13)-EnableWindow(false);GetDlgItem(IDC_BTN_14)-EnableWindow(false);GetDlgItem(IDC_BTN_15)-EnableWindow(false);decimal_2=false;decimal_8=false;//进制初始化,选择十进制decimal_10=true;decimal_16=false;returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}/******************************************************************************//*******************************系列控件点击输入*******************************//*******
本文标题:VC计算器实现实验报告
链接地址:https://www.777doc.com/doc-7029270 .html