简易计算器C语言代码_第1页
简易计算器C语言代码_第2页
简易计算器C语言代码_第3页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简易四则运算计算器计算机工具地历史而言, 中国古代最早采用地一种计算工具叫筹策, 又叫做 算筹,这种算筹多用竹子制成, 也有用木头,兽骨充当材料的, 大约 270 枚一束, 放在布袋里可随身携带。 直到今天仍在使用的住算盘, 是中国古代计算工具领域 中的另一项发明明代时的住算盘已经与现代的住算盘几乎相同。17 世纪初,西方国家的计算工具有了较大的发展。 英国数学家纳尔发现了 “纳 皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加 减乘涂,乘方和开方运算,甚至可以计算三角函数,指数函数和对数函数。这些 计算工具不仅带动了计算的发展, 也为现代计算器发展尊定了良好的基础, 成

2、为 现代社会应用广泛的计算工具,如手机,操作系统上附带的多功能计算器。项目设计目的掌握模块的划分;掌握结构体定义;掌握栈的操作;掌握函数的定义;掌握栈的基本操作;掌握VC的基本绘图库;掌握鼠标的响应操作;目设计内容设计一个含有界面的计算器, 输入一个包含括号的表达式, 使用栈数据类型 实现整数的四则运算操作,开方运算。项目设计要求根据分析,系统要求实现以下几点基本功能:可通过按钮输入数字、运算符;能通过按钮实现退格、清除功能;实现加、减、乘、除、开方运算功能;实现括号运算;显示运算结果;良好的交互界面。项目详细设计功能模块图根据系统功能要求,主要含有四大模块,分别是计算器界面设计模块、计算 器

3、按键控制模块、四则混合运算模块、计算器记忆处理模块。计算器界面设计模块:调用VC图形系统函数和字符函数画出计算器的界面, 包括24个按钮和一个文本输入框。计算机按键控制模块:计算器通过键盘按键值的判断,执行相应的操作,如 接收数字输入等。计算器计算处理模块。计算处理模块主要完成可以包括括号的表达式运算, 运算包括加,减,乘,除、开方。计算处理模块在按键控制模块中被调用执行。 处理模块是通过栈来实现的,分别定义了两个顺序栈,一个用来存放操作符栈, 一个用来存放操作数栈。计算器记忆处理模块。记忆处理模块使计算其具有记忆功能。记忆当前输入的表达式,给出一个最后的运算结果。可以清楚部分或全部记忆的值。

4、图简易计算器模块图数据结构简易计算器C语言代码.doc该系统主要的数据有操作符集,用一维数组存放;存放操作符的优先级关系集,操作符的优先级关系用一个二维数组来体现;另外定义两个栈,一个用来存放操作符,一个用来存放操作数。char ops7='+','-','*',7','(',')',#;int cmp77=2,2,1,1,1,2,2,2,2,1,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,1,1,1,1,130,2,2,2,2,0,2,2, 1,1,1,1,1,0,3;type

5、def structchar elemStack_Size;int top;SeqStack;typedef structint elemStack_Size;int top;SeqStackOpera nd;系统流程图图系统流程图主要算法比较运算符优先级:程序里的涉及到的运算符有7个,分别是 +',-' * ' /')' #'它们之间的优先级关系用一个二维数组来存放,int cmp77=2,2,1,1,1,2,2,2,2,1,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,2,2,1,1,1,1,130,2,2,2,2,0,2,

6、2,1,1,1,1,1,0,3;其中3代表='2代表>'1代表<',0代表不可比。char Compare(char ch1, char ch2)int i,m, n;char pri;int priority;for(i=0;i<7;i+) /找到相比较的两个运算符在比较矩阵里的相对位置if(ch1=opsi)m=i;if (ch2=opsi)n=i;priority = cmpm n;switch(priority)case 1:pri='<'break;case 2:pri='>'break;case

7、3:pri='='break;case 0:pri='$'printf("表达式错误!n"); break;return pri;主要代码1. 计算器界面设计利用VC绘图库函数设计一个相对友好的操作界面。关于VC绘图库的介绍在本书第二章。界面图像如下:图:计算器界面画计算机界面。initgraph(500,300);/ 这里和 TC 略有区别bar(15, 15, 480, 70);setcolor(WHITE);recta ngle(10,10,490,290);setcolor(WHITE);for(j=0;j<2;j+)for(i

8、=0;i<7;i+)if(i<3)circle(55+65*i,110+65*j,20);else recta ngle(55+65*i-20,110+65*j-20,55+65*i+20,110+65*j+20); for(i=0;i<7;i+)if(i<4) circle(55+65*i,110+65*j,20);else recta ngle(55+65*i-20,110+65*j-20,55+65*i+20,110+65*j+20); outtextxy(50,105,"7");outtextxy(115,105,"8")

9、;outtextxy(180,105,"9");outtextxy(240,105,"C");outtextxy(310,105,"+");outtextxy(375,105,"(");outtextxy(440,105,")");outtextxy(50,170,"4");outtextxy(115,170,"5");outtextxy(180,170,"6");outtextxy(240,170,".");out

10、textxy(310,170,"-"); outtextxy(370,170,"sqrt");outtextxy(440,170,"<-");outtextxy(50,235,"3");outtextxy(115,235,"2");outtextxy(180,235,"1"); outtextxy(245,235,"0"); outtextxy(310,235,"*"); outtextxy(375,235,"/&quo

11、t;);outtextxy(440,235,"=");2. 按键响应操作当用户通过鼠标左键按下 0' 1' 2' 3' 4' 5', 6' 7' 8' 9' .' + ', 一, * ' /', (,)' =',这些键时,字符按点击顺序在输出文本框输出;当用户点击<',表示退一格操作;当用户点击='在文本块输出表达式结果;当用户按下 C'时,文本框清空。MOUSEMSG m;m = GetMouseMsg();记录鼠标

12、操作i=0;while(true)m = GetMouseMsg();记录鼠标操作if(m.uMsg=WM_LBUTTONDOWN)setcolor(BLACK);if(m.x>35&&m.x<=75&&m.y>9 0&&m.y<130)strcat(stri ng,"7");outtextxy(25,40,stri ng);if(m.x>100&&m.x<=140&&m.y>9 0&&m.y<130)strcat(stri ng,

13、"8");outtextxy(25,40,stri ng);if(m.x>165&&m.x<=205&&m.y>9 0&&m.y<130)strcat(stri ng,"9");outtextxy(25,40,stri ng);if(m.x>225&&m.x<=265&&m.y>9 0&&m.y<130)setcolor(WHITE); bar(15, 15, 480, 70);strcpy(string,&qu

14、ot;");/Cif(m.x>290&&m.x<=330&&m.y>9 0&&m.y<130)strcat(stri ng,"+");outtextxy(25,40,stri ng);if(m.x>355&&m.x<=395&&m.y>9 0&&m.y<130)strcat(stri ng,"(");outtextxy(25,40,stri ng);if(m.x>420&&m.x&

15、lt;=460&&m.y>9 0&&m.y<130)strcat(stri ng,")");outtextxy(25,40,stri ng);if(m.x>35&&m.x<=75&&m .y>155&&m.y<195)strcat(stri ng,"4");outtextxy(25,40,stri ng);if(m.x>100&&m.x<=140&&m.y>155&&m.y&

16、lt;195)strcat(stri ng,"5");outtextxy(25,40,stri ng);if(m.x>165&&m.x<=205&&m.y>155&&m.y<195)strcat(stri ng,"6");outtextxy(25,40,stri ng);if(m.x>225&&m.x<=265&&m.y>155&&m.y<195)strcat(stri ng,".");out

17、textxy(25,40,stri ng);if(m.x>290&&m .x<=330&&m. y>155&&m. y<195)strcat(stri ng,"-");setcolor(BLACK);outtextxy(25,40,stri ng);if(m.x>355&&m.x<=395&&m.y>155&&m.y<195) lgn=strle n( stri ng);switch(n)不超过5位case 5:i=stri ng0

18、*10000+stri ng1*1000+stri ng2*100+stri ng3*10+stri ng4;break;case 4:i=stri ng0*1000+stri ng1*100+stri ng2*10+stri ng3;break;case 3:i=stri ng0*100+stri ng1*10+stri ng2;break;case 2:i=stri ng0*10+stri ng1;break;case 1:i=stri ng1;break;itoa(sqrt(i),stri ng,10);setcolor(WHITE); bar(15, 15, 480, 70); set

19、color(BLACK); outtextxy(25,40,stri ng);if(m.x>420&&m.x<=460&&m.y>155&&m.y<195)n=strlen(string);printf("n=%d.",n);stringn-1='0' bar(15, 15, 480, 70);setcolor(BLACK);outtextxy(25,40,stri ng);/<-if(m.x>35&&m.x<=75&&m .y>2

20、15&&m.y<255)strcat(stri ng,"3");outtextxy(25,40,stri ng);if(m.x>100&&m.x<=140&&m.y>215&&m.y<255)strcat(stri ng,"2");outtextxy(25,40,stri ng);if(m.x>165&&m.x<=205&&m.y>215&&m.y<255)strcat(stri ng,&q

21、uot;1");outtextxy(25,40,stri ng);if(m.x>225&&m.x<=265&&m.y>215&&m.y<255)strcat(stri ng,"0");outtextxy(25,40,stri ng);if(m.x>290&&m.x<=330&&m.y>215&&m.y<255)strcat(stri ng,"*");outtextxy(25,40,stri ng);if

22、(m.x>355&&m.x<=395&&m.y>215&&m.y<255)strcat(stri ng,"/");outtextxy(25,40,stri ng);if(m.x>420&&m.x<=460&&m.y>215&&m.y<255)strcpy(str1,stri ng);strcat(stri ng,"=");outtextxy(25,40,stri ng);strcat(str1,"#&q

23、uot;);itoa(ExpEvaluation(str1), str2, 10);strcat(stri ng,str2); outtextxy(25,40,stri ng);_E3. 利用栈的基本操作,实现表达式的求值。定义两个顺序栈及顺序栈的基本操作:初始化栈,判断栈空,取栈顶元素,入栈,出战,实现操作数的四则运typedef structchar elemStack_Size;int top;SeqStack;运算数栈的定义typedef structint elemStack_Size;int top;SeqStackOpera nd;初始化运算符栈void In itStack(S

24、eqStack *S)S->top =-1;初始化运算数栈void In itStack nOpera nd(SeqStackOpera nd *S) S->top =-1;判断栈S为空栈时返回值为真,反之为假int lsEmpty(SeqStack *S) return(S->top=-1?TRUE:FALSE);判断栈S为空栈时返回值为真,反之为假int IsEmpty nOpera nd(SeqStackOpera nd *S) return(S->top=-1?TRUE:FALSE);判断栈S为满栈时返回值为真,反之为假int IsFull(SeqStack *

25、S) return(S->top=Stack_Size-1?TRUE:FALSE);判断栈S为满栈时返回值为真,反之为假int IsFullOpera nd(SeqStackOpera nd *S) return(S->top=Stack_Size-1?TRUE:FALSE); 运算符栈入栈函数int Push(SeqStack *S, char x)if (S->top=Stack_Size-1) _prin tf("Stack is full!n"); return FALSE;elseS->top+;S->elemS->top=x;

26、 return TRUE;运算数栈入栈函数int PushOpera nd(SeqStackOpera nd *S, i nt x) if (S->top=Stack_Size-1) _prin tf("Stack is full!n"); return FALSE;elseS->top+;S->elemS->top=x; return TRUE;运算符栈出栈函数int Pop(SeqStack *S, char *x)if (S->top=-1)printf("运算符栈空!n"); return FALSE;else*x=

27、S->elemS->top;S->top-; return TRUE;运算数栈出栈函数int PopOpera nd(SeqStackOpera nd *S, i nt *x)if (S->top=-1)printf("运算符栈空!n"); return FALSE;else*x=S->elemS->top;S->top-;return TRUE;运算符栈取栈顶元素函数char GetTop(SeqStack *S)if (S->top =-1)printf("运算符栈为空!n"); return FALS

28、E;elsereturn (S->elemS->top);运算数栈取栈顶元素函数int GetTopOpera nd(SeqStackOpera nd *S)if (S->top =-1)printf("运算符栈为空!n"); return FALSE;elsereturn (S->elemS->top);判断输入字符是否为运算符函数,是返回TRUE,不是返回FALSEint lsoperator(char ch)int i;for (i=0;i<7;i+) if(ch=opsi) return TRUE;return FALSE;比较运

29、算符优先级函数char Compare(char ch1, char ch2)int i,m, n;char pri;int priority;for(i=0;i<7;i+) /找到相比较的两个运算符在比较矩阵里的相对位置if(ch1=opsi)m=i;if (ch2=opsi) n=i;priority = cmpm n;switch(priority)case 1:pri='<' break;case 2:pri='>'break;case 3:pri='='break;case 0:pri='$'printf("表达式错误!n"); break;return pri;运算函数int Execute(i nt a, char op, int b)int result;switch(op)case '+':result=a+b;break;case '-':result=a-b;break;case '*':result=a*b;break;case '/':result=a/b;break;return result;/*读入一个简单算术表达式并计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论