1、简易计算器C语言代码简易计算器C语言代码简易四则运算计算器计算机工具地历史而言,中国古代最早采用地一种计算工具叫筹策,又叫做算筹,这种算筹多用竹子制成,也有用木头,兽骨充当材料的,大约270枚一束,放在布袋里可随身携带。直到今天仍在使用的住算盘,是中国古代计算工具领域中的另一项发明明代时的住算盘已经与现代的住算盘几乎相同。17世纪初,西方国家的计算工具有了较大的发展。英国数学家纳尔发现了“纳皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘涂,乘方和开方运算,甚至可以计算三角函数,指数函数和对数函数。这些计算工具不仅带动了计算的发展,也为现代计算器发展尊定了良好的基础,
2、成为现代社会应用广泛的计算工具,如手机,操作系统上附带的多功能计算器。项目设计目的掌握模块的划分;掌握结构体定义;掌握栈的操作;掌握函数的定义;掌握栈的基本操作;掌握VC的基本绘图库;掌握鼠标的响应操作;目设计内容设计一个含有界面的计算器,输入一个包含括号的表达式,使用栈数据类型实现整数的四则运算操作,开方运算。项目设计要求根据分析,系统要求实现以下几点基本功能:可通过按钮输入数字、运算符;能通过按钮实现退格、清除功能;实现加、减、乘、除、开方运算功能;实现括号运算;显示运算结果;良好的交互界面。项目详细设计功能模块图 根据系统功能要求,主要含有四大模块,分别是计算器界面设计模块、计算器按键控
3、制模块、四则混合运算模块、计算器记忆处理模块。计算器界面设计模块:调用VC图形系统函数和字符函数画出计算器的界面,包括24个按钮和一个文本输入框。计算机按键控制模块:计算器通过键盘按键值的判断,执行相应的操作,如接收数字输入等。计算器计算处理模块。计算处理模块主要完成可以包括括号的表达式运算,运算包括加,减,乘,除、开方。计算处理模块在按键控制模块中被调用执行。处理模块是通过栈来实现的,分别定义了两个顺序栈,一个用来存放操作符栈,一个用来存放操作数栈。计算器记忆处理模块。记忆处理模块使计算其具有记忆功能。记忆当前输入的表达式,给出一个最后的运算结果。可以清楚部分或全部记忆的值。系统流程图 图
4、系统流程图主要算法 比较运算符优先级:程序里的涉及到的运算符有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,1,3,0, 2,2,2,2,0,2,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;i7;i+) /找到相比较的两
5、个运算符在比较矩阵里的相对位置 if(ch1=opsi) m=i; if (ch2=opsi) n=i; priority = cmpmn; switch(priority) case 1: pri=; break; case 3: pri=; break; case 0: pri=$; printf(表达式错误!n); break; return pri;主要代码1.计算器界面设计利用VC绘图库函数设计一个相对友好的操作界面。关于VC绘图库的介绍在本书第二章。界面图像如下:图:计算器界面画计算机界面。 initgraph(500,300); / 这里和 TC 略有区别 bar(15, 15,
6、 480, 70); setcolor(WHITE); rectangle(10,10,490,290); setcolor(WHITE); for(j=0;j2;j+) for(i=0;i7;i+) if(i3) circle(55+65*i,110+65*j,20); else rectangle(55+65*i-20,110+65*j-20,55+65*i+20,110+65*j+20); for(i=0;i7;i+) if(i4) circle(55+65*i,110+65*j,20); else rectangle(55+65*i-20,110+65*j-20,55+65*i+20,
7、110+65*j+20); outtextxy(50,105,7); outtextxy(115,105,8); 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,.); outtextxy(310,170,-); outtextxy(370,170,sqrt);
8、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,/); outtextxy(440,235,=);2.按键响应操作当用户通过鼠标左键按下0,1,2,3,4,5,6,7,8,9,.,+,*,/,(,),=,这些键时,字符按点击顺序在输出文本框输出;当用户点击35&m.x90&m.y100&m.x90&m.y165&m.x90&m.y225&m.x90
9、&m.y290&m.x90&m.y355&m.x90&m.y420&m.x90&m.y35&m.x155&m.y100&m.x155&m.y165&m.x155&m.y225&m.x155&m.y290&m.x155&m.y355&m.x155&m.y420&m.x155&m.y195) n=strlen(string);printf(n=%d.,n);stringn-1=0; bar(15, 15, 480, 70);setcolor(BLACK);outtextxy(25,40,string);/35&m.x215&m.y100&m.x215&m.y165&m.x215&m.y225&m.
10、x215&m.y290&m.x215&m.y355&m.x215&m.y420&m.x215&m.ytop =-1;/初始化运算数栈void InitStacknOperand(SeqStackOperand *S) S-top =-1;/判断栈S为空栈时返回值为真, 反之为假int IsEmpty(SeqStack *S) return(S-top=-1?TRUE:FALSE);/判断栈S为空栈时返回值为真, 反之为假int IsEmptynOperand(SeqStackOperand *S) return(S-top=-1?TRUE:FALSE);/判断栈S为满栈时返回值为真, 反之为假
11、int IsFull(SeqStack *S) return(S-top=Stack_Size-1?TRUE:FALSE);/判断栈S为满栈时返回值为真, 反之为假int IsFullOperand(SeqStackOperand *S) return(S-top=Stack_Size-1?TRUE:FALSE);/运算符栈入栈函数int Push(SeqStack *S, char x) if (S-top=Stack_Size-1) printf(Stack is full!n); return FALSE; else S-top+; S-elemS-top=x; return TRUE;
12、 /运算数栈 入栈函数int PushOperand(SeqStackOperand *S, int x) if (S-top=Stack_Size-1) printf(Stack is full!n); return FALSE; else S-top+; S-elemS-top=x; return TRUE; /运算符栈 出栈函数int Pop(SeqStack *S, char *x) if (S-top=-1) printf(运算符栈空!n); return FALSE; else *x=S-elemS-top; S-top-; return TRUE; /运算数栈 出栈函数int P
13、opOperand(SeqStackOperand *S, int *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 FALSE; else return (S-elemS-top); /运算数栈取栈顶元素函数int GetTopOperand(SeqStackOperand *S) if (S-top =-1)
14、 printf(运算符栈为空!n); return FALSE; else return (S-elemS-top); /判断输入字符是否为运算符函数, 是返回TRUE, 不是返回FALSEint Isoperator(char ch) int i; for (i=0;i7;i+) if(ch=opsi) return TRUE; return FALSE;/比较运算符优先级函数char Compare(char ch1, char ch2) int i,m,n; char pri; int priority; for(i=0;i7;i+) /找到相比较的两个运算符在比较矩阵里的相对位置 if
15、(ch1=opsi) m=i; if (ch2=opsi) n=i; priority = cmpmn; switch(priority) case 1: pri=; break; case 3: pri=; break; case 0: pri=$; printf(表达式错误!n); break; return pri;/运算函数int Execute(int a, char op, int b) int result; switch(op) case +: result=a+b; break; case -: result=a-b; break; case *: result=a*b; b
16、reak; case /: result=a/b; break; return result;/*读入一个简单算术表达式并计算其值. operator和operand分别为运算符栈和运算数栈, OPS为运算符集合*/int ExpEvaluation(char *str) int a,b,v,temp; char ch,op; int i=0; SeqStack operatordata; SeqStackOperand operand; InitStack(&operatordata); InitStacknOperand(&operand); Push(&operatordata,#);
17、ch=*str+; while(ch!=# | GetTop(&operatordata)!=#) if(!Isoperator(ch) temp=ch-0; /将字符转换为十进制数 ch=*str+; i+; while(!Isoperator(ch) temp=temp*10 + ch-0; /将逐个读入运算数的各位转化为十进制数 ch=*str+; i+; PushOperand(&operand,temp); else switch(Compare(GetTop(&operatordata),ch) case : Pop(&operatordata,&op); PopOperand(&operand,&b); PopOperand(&operand,&a); v=Execute(a,op,b); /对a和b进行op运算 PushOperand(&operand,v); break; /end while v=GetTopOperand(&operand); return v;小结知识点:VC绘图库鼠标按键响应操作结构体定义顺序栈顺序栈的基本操作:初始化栈、判断栈是否为空、取栈顶元素、入栈、出栈功能扩充实现取对数、正弦、余弦等一些函数功能。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1