算式计算器C语言版

合集下载

C语言计算器源代码

C语言计算器源代码

C语言计算器源代码以下是一个简单的C语言计算器源代码,可以实现基本的四则运算。

```c#include <stdio.h>int maichar operator;double num1, num2;double result;printf("欢迎使用简单计算器!\n");printf("请输入运算符(+, -, *, /): ");scanf("%c", &operator);printf("请输入第一个数字: ");scanf("%lf", &num1);printf("请输入第二个数字: ");scanf("%lf", &num2);switch (operator)case '+':result = num1 + num2;printf("结果: %.2lf\n", result);break;case '-':result = num1 - num2;printf("结果: %.2lf\n", result); break;case '*':result = num1 * num2;printf("结果: %.2lf\n", result); break;case '/':if (num2 != 0)result = num1 / num2;printf("结果: %.2lf\n", result); } elseprintf("除数不能为0\n");}break;default:printf("无效的运算符\n");}return 0;```运行代码后,程序会首先打印欢迎信息,并要求用户输入运算符、第一个数字和第二个数字。

简易计算器C语言代码

简易计算器C语言代码

简易四则运算计算器计算机工具地历史而言,中国古代最早采用地一种计算工具叫筹策,又叫做算筹,这种算筹多用竹子制成,也有用木头,兽骨充当材料的,大约270枚一束,放在布袋里可随身携带。

直到今天仍在使用的住算盘,是中国古代计算工具领域中的另一项发明明代时的住算盘已经与现代的住算盘几乎相同。

17世纪初,西方国家的计算工具有了较大的发展。

英国数学家纳尔发现了“纳皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘涂,乘方和开方运算,甚至可以计算三角函数,指数函数和对数函数。

这些计算工具不仅带动了计算的发展,也为现代计算器发展尊定了良好的基础,成为现代社会应用广泛的计算工具,如手机,操作系统上附带的多功能计算器。

项目设计目的掌握模块的划分;掌握结构体定义;掌握栈的操作;掌握函数的定义;掌握栈的基本操作;掌握VC的基本绘图库;掌握鼠标的响应操作;目设计内容设计一个含有界面的计算器,输入一个包含括号的表达式,使用栈数据类型实现整数的四则运算操作,开方运算。

项目设计要求根据分析,系统要求实现以下几点基本功能:可通过按钮输入数字、运算符;能通过按钮实现退格、清除功能;实现加、减、乘、除、开方运算功能;实现括号运算;显示运算结果;良好的交互界面。

项目详细设计功能模块图根据系统功能要求,主要含有四大模块,分别是计算器界面设计模块、计算器按键控制模块、四则混合运算模块、计算器记忆处理模块。

计算器界面设计模块:调用VC图形系统函数和字符函数画出计算器的界面,包括24个按钮和一个文本输入框。

计算机按键控制模块:计算器通过键盘按键值的判断,执行相应的操作,如接收数字输入等。

计算器计算处理模块。

计算处理模块主要完成可以包括括号的表达式运算,运算包括加,减,乘,除、开方。

计算处理模块在按键控制模块中被调用执行。

处理模块是通过栈来实现的,分别定义了两个顺序栈,一个用来存放操作符栈,一个用来存放操作数栈。

计算器记忆处理模块。

用C语言实现计算器功能

用C语言实现计算器功能

⽤C语⾔实现计算器功能本⽂实例为⼤家分享了⽤C语⾔实现计算器功能的具体代码,供⼤家参考,具体内容如下代码如下:#include<stdio.h> //C语⾔编写计算器程序 ^_^void Counter1(int a,int b,char op); //函数声明!void Counter2(double c,double d,char op);void Show_Sum1(int a,char op,int b,int sum);void Show_Sum2(double c,double d,char op,double sum);int Add(int a,int b);int Sub(int a,int b);int Mul(int a,int b);double Div(double a,double b);int main(){int a=0,b=0;//初始化double c=0.0,d=0.0;char op='#';char ch='#';int choi=0;do{printf("请输⼊数据:(想使⽤加法减法乘法功能输⼊1,使⽤除法功能输⼊2)\n");scanf("%d",&choi);if(choi==1){printf("输⼊数据的格式:数值运算符数值\n");scanf("%d %c %d",&a,&op,&b);//别忘记取地址运算符!!fflush(stdin);//⽤来清理缓存区!(执⾏输⼊以'\n'代表输⼊结束,'\n'会留在缓存区,故应先清空缓存区以防ch接收到该字符⽽结束循环!) Counter1(a,b,op);}else if(choi==2){printf("输⼊数据的格式:数值运算符数值\n");scanf("%lf %c %lf",&c,&op,&d);//别忘记取地址运算符!!fflush(stdin);//⽤来清理缓存区!(执⾏输⼊以'\n'代表输⼊结束,'\n'会留在缓存区,故应先清空缓存区以防ch接收到该字符⽽结束循环!) Counter2(c,d,op);}printf("是否继续?(Y/N):\n");ch=getchar();//输⼊字符Y(y)或N(n)}while(ch=='Y'||ch=='y');return 0;}void Counter1(int a,int b,char op){int sum=0;int optag=true;//以防分母为零(出现错误)或输⼊错误字符仍调⽤Show_Sum()函数进⾏输出。

c语言编写计算机加减乘除程序

c语言编写计算机加减乘除程序

c语言编写计算机加减乘除程序对于初学者来说,编写一个计算机加减乘除程序是一个不错的练习。

本文将介绍如何使用C语言编写一个简单的计算器程序,让您在学习C语言的同时掌握基本的计算机编程技能。

首先,您需要了解C语言中基本的数学运算符,包括加 (+)、减(-)、乘 (*)、除 (/) 等等。

这些运算符可以用来执行基本的算术运算,例如:int a = 5;int b = 2;int c = a + b; // c 的值为 7int d = a - b; // d 的值为 3int e = a * b; // e 的值为 10int f = a / b; // f 的值为 2上面的代码演示了如何在C语言中使用基本的运算符进行加减乘除运算。

接下来,我们将介绍如何将这些运算符组合成一个计算机加减乘除程序。

程序的基本结构是从用户输入两个操作数和运算符,然后根据运算符执行相应的计算。

以下是一个简单的例子:#include <stdio.h>int main() {char operator;int num1, num2;printf('Enter operator (+, -, *, /): ');scanf('%c', &operator);printf('Enter two operands: ');scanf('%d %d', &num1, &num2);switch (operator) {case '+':printf('%d + %d = %d', num1, num2, num1 + num2); break;case '-':printf('%d - %d = %d', num1, num2, num1 - num2); break;case '*':printf('%d * %d = %d', num1, num2, num1 * num2); break;case '/':printf('%d / %d = %d', num1, num2, num1 / num2); break;default:printf('Error! Invalid operator.');}return 0;}上面的代码使用了一个switch语句来根据输入的运算符执行相应的计算。

c语言计算器程序编写代码

c语言计算器程序编写代码

c语言计算器程序编写代码C语言是一门广泛应用于计算机程序设计中的高级编程语言,计算器是我们日常生活中必不可少的工具之一。

今天,我们将探讨如何使用C语言编写计算器程序。

步骤一:确定计算器的基本功能在开始编写任何计算器程序之前,我们需要先决定它的基本功能。

例如,我们需要让计算器能够执行四种基本算术运算 -- 加、减、乘、除。

我们可能还需要添加其他一些功能,例如计算百分数、开根号、求幂等。

步骤二:编写C语言代码接下来,我们可以开始编写计算器程序的C代码。

此时,我们需要确定程序的最外层框架。

这包括用于接收用户输入、调用所需的函数以及输出结果的代码。

例如,我们可以使用如下的代码框架:```#include <stdio.h>int main() {// 接收输入// 调用对应的函数进行计算// 输出结果return 0;}```步骤三:编写函数我们需要编写函数来执行各种计算。

例如,我们可以编写一个add函数来执行加法,一个Subtract函数来执行减法,以此类推。

对于每个函数,我们需要指定它所需的输入,以及它返回的输出。

例如,对于add函数,我们期望它将两个数字相加,并返回结果:```int add(int x, int y) {return x + y;}```步骤四:解析用户输入为了使计算器程序更加友好,我们希望程序能够解析用户输入并检查其是否有效。

例如,如果用户输入了两个不能相互转换为数字的字符串,则程序应该输出错误消息。

步骤五:测试代码最后,我们需要测试我们的代码以确保它能够正常工作。

这意味着我们应该使用各种输入和边缘情况进行测试,例如“0除以任何数字”和“无效输入”的情况。

总结编写C语言计算器程序可能看起来很困难,但实际上它是一项非常有趣的任务,因为它要求我们配备基本的编程知识并创造性地思考解决方案。

通过这篇文章,我们了解了如何确定计算器的基本功能,如何编写C语言代码并编写函数,如何解析用户输入以及如何测试我们的代码。

用c语言设计一个多功能计算器

用c语言设计一个多功能计算器

用C语言设计一个多功能计算器实现功能:1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。

依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。

结果可以作为下一个运算的第一运算数。

按‘C’清屏,按‘X’退出。

例如:输入:2+5输出:72)实现单运算符表达式计算的功能。

输入的操作数可以包含整数或浮点数。

如果遇到错误的表达式,应输出错误提示信息。

输入表达式如下:例如:输入:2+5输出:7目录摘要 (1)第一章引言 (3)1.1 计算器概述 (3)第二章设计任务及要求 (5)2.1 设计任务 (5)2.2 设计要求 (6)第三章计算器硬件设计 (7)3.1 方案说明 (7)3.2 设计单片机主体电路图 (8)第四章软件设计 (9)4.1 模块介绍 (9)4.2 程序流程图 (10)4.3 程序部分 (11)第五章总结 (16)参考文献 (17)摘要:[目录]一、课程设计题目及任务要求二、设计思路三、部分程序介绍四、程序框图五、汇编程序六、参考资料[原文]一、课程设计题目及任务要求请设计十进制加减法计算器。

要求能(不同时)显示3位输入和4位输出。

二、设计思路1、操作显示设备显示设备采用八片七段共阴极LED显示器,共设置16 个键,其中数字键0~9 共十个,接下来依次是加号键、减号键、等于号、清除键。

操作设备是两行八列共16键的简单键盘。

第一行从左至右分别为0、1、2、3、4、5、6、7,第二行分别为8、9、A(+)、B(-)、C(=)、D(清除键)、E (清除键)、F(清除键),“清除键”表示程序初始化,为下次输入准备。

2、程序实现功能(1)十进制加减法计算:输入范围为(1~999),该程序输入两个定点数,每个3位,输出4位;A为加,B为减,C为等于,输出为四位计算结果。

数据输入采用规范化输入,即必须输入3个数才算完成一个运算数的输入,两个运算数之间输入运算符A或者B,输入完成按C显示计算结果;(2)计算机复位功能:DEF均为清零重启,任何时候按下DEF中一个将重新开始;三、部分程序介绍(1)主程序(START)程序开始运行初始化程序,设置输入输出口PA、PB、PC,扫描键盘,输入两个待求数据和运算符,存入寄存器,等待输入等号同时显示第二个数,运行计算程序,并将计算结果分离,输出到显示器;(2)读键子程序(RD_KB)程序分别扫描两行键盘,若有键按下则通过移位的方式计算键码;若无键按下,则将键码缓存设置为10H,判断后进行相应的跳转。

计算器编程c语言

计算器编程c语言

计算器编程 c语言用C语言设计计算器程序源代码#include <dos.h> /*DOS接口函数*/#include <math.h> /*数学函数的定义*/#include <conio.h> /*屏幕操作函数*/函数*/#include <stdio.h> /*I/O#include <stdlib.h> /*库函数*/变量长度参数表*/#include <stdarg.h> /*图形函数*/#include <graphics.h> /*字符串函数*/#include <string.h> /*字符操作函数*/#include <ctype.h> /*#define UP 0x48 /*光标上移键*/#define DOWN 0x50 /*光标下移键*/#define LEFT 0x4b /*光标左移键*/#define RIGHT 0x4d /*光标右移键*/#define ENTER 0x0d /*回车键*/void *rar; /*全局变量,保存光标图象*/使用调色板信息*/struct palettetype palette; /*int GraphDriver; /* 图形设备驱动*/int GraphMode; /* 图形模式值*/int ErrorCode; /* 错误代码*/int MaxColors; /* 可用颜色的最大数值*/int MaxX, MaxY; /* 屏幕的最大分辨率*/double AspectRatio; /* 屏幕的像素比*/void drawboder(void); /*画边框函数*/初始化函数*/void initialize(void); /*计算器计算函数*/void computer(void); /*改变文本样式函数*/ void changetextstyle(int font, int direction, int charsize); /*窗口函数*/void mwindow(char *header); /*/*获取特殊键函数*/int specialkey(void) ;设置箭头光标函数*//*int arrow();/*主函数*/int main(){设置系统进入图形模式 */initialize();/*运行计算器 */computer(); /*系统关闭图形模式返回文本模式*/closegraph();/*/*结束程序*/return(0);}/* 设置系统进入图形模式 */void initialize(void){int xasp, yasp; /* 用于读x和y方向纵横比*/GraphDriver = DETECT; /* 自动检测显示器*/initgraph( &GraphDriver, &GraphMode, "" );/*初始化图形系统*/ErrorCode = graphresult(); /*读初始化结果*/如果初始化时出现错误*/if( ErrorCode != grOk ) /*{printf("Graphics System Error: %s\n",显示错误代码*/grapherrormsg( ErrorCode ) ); /*退出*/exit( 1 ); /*}getpalette( &palette ); /* 读面板信息*/MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/MaxX = getmaxx(); /* 读屏幕尺寸 */MaxY = getmaxy(); /* 读屏幕尺寸 */getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/计算纵横比值*/ AspectRatio = (double)xasp/(double)yasp;/*}/*计算器函数*/void computer(void){定义视口类型变量*/struct viewporttype vp; /*int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;操作数和计算结果变量*/float num1=0,num2=0,result; /*char cnum[5],str2[20]={""},c,temp[20]={""};定义字符串在按钮图形上显示的符号 char str1[]="1230.456+-789*/Qc=^%";/**/mwindow( "Calculator" ); /*显示主窗口 */设置灰颜色值*//*color = 7;getviewsettings( &vp ); /* 读取当前窗口的大小*/width=(vp.right+1)/10; /* 设置按钮宽度 */设置按钮高度 */height=(vp.bottom-10)/10 ; /*/*设置x的坐标值*/x = width /2;设置y的坐标值*/y = height/2; /*setfillstyle(SOLID_FILL, color+3);bar( x+width*2, y, x+7*width, y+height );/*画一个二维矩形条显示运算数和结果*/setcolor( color+3 ); /*设置淡绿颜色边框线*/rectangle( x+width*2, y, x+7*width, y+height );/*画一个矩形边框线*/设置颜色为红色*/setcolor(RED); /*输出字符串"0."*/outtextxy(x+3*width,y+height/2,"0."); /*/*设置x的坐标值*/x =2*width-width/2;设置y的坐标值*/y =2*height+height/2; /*画按钮*/for( j=0 ; j<4 ; ++j ) /*{for( i=0 ; i<5 ; ++i ){setfillstyle(SOLID_FILL, color);setcolor(RED);bar( x, y, x+width, y+height ); /*画一个矩形条*/rectangle( x, y, x+width, y+height );sprintf(str2,"%c",str1[j*5+i]);/*将字符保存到str2中*/outtextxy( x+(width/2), y+height/2, str2);移动列坐标*/x =x+width+ (width / 2) ;/*}y +=(height/2)*3; /* 移动行坐标*/x =2*width-width/2; /*复位列坐标*/}x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y); /*移动光标到x,y位置*/显示光标*/arrow(); /*putimage(x,y,rar,XOR_PUT);m=0;n=0;设置str2为空串*/strcpy(str2,""); /*当压下Alt+x键结束程序,否则执行下面的循环while((v=specialkey())!=45) /**/{当压下键不是回车时*/while((v=specialkey())!=ENTER) /*{putimage(x,y,rar,XOR_PUT); /*显示光标图象*/if(v==RIGHT) /*右移箭头时新位置计算*/if(x>=x0+6*width)如果右移,移到尾,则移动到最左边字符位置*//*{x=x0;m=0;}else{x=x+width+width/2;m++;否则,右移到下一个字符位置*/} /*if(v==LEFT) /*左移箭头时新位置计算*/if(x<=x0){x=x0+6*width;m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/else{x=x-width-width/2;m--;} /*否则,左移到前一个字符位置*/if(v==UP) /*上移箭头时新位置计算*/if(y<=y0){y=y0+4*height+height/2;n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/else{y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/if(v==DOWN) /*下移箭头时新位置计算*/if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;} /*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/ }将字符保存到变量c中*/c=str1[n*5+m]; /*判断是否是数字或小数点*/if(isdigit(c)||c=='.') /*{如果标志为-1,表明为负数*/if(flag==-1) /*{将负号连接到字符串中*/strcpy(str2,"-"); /*flag=1;} /*将标志值恢复为1*/将字符保存到字符串变量temp中*/ sprintf(temp,"%c",c); /*将temp中的字符串连接到str2中*/strcat(str2,temp); /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,str2); /*}if(c=='+'){将第一个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算加法标志值*/act=1; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='-'){如果str2为空,说明是负号,而不是减号*/ if(strcmp(str2,"")==0) /*设置负数标志*/flag=-1; /*else{将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*act=2; /*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}}if(c=='*'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算乘法标志值*/act=3; /*setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width /2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='/'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算除法标志值*/act=4; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,"0."); /*显示字符串*/}if(c=='^'){将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算乘方标志值*/act=5; /*设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='%'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算模运算乘方标志值*/act=6; /*setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='='){将第二个操作数转换为浮点数*/num2=atof(str2); /*根据运算符号计算*/switch(act) /*{case 1:result=num1+num2;break; /*做加法*/case 2:result=num1-num2;break; /*做减法*/case 3:result=num1*num2;break; /*做乘法*/case 4:result=num1/num2;break; /*做除法*/case 5:result=pow(num1,num2);break; /*做x的y次方*/case 6:result=fmod(num1,num2);break; /*做模运算*/ }设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*将结果保存到temp中*/sprintf(temp,"%f",result); /*outtextxy(5*width,height,temp); /*显示结果*/}if(c=='c'){num1=0; /*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,""); /*将str2清空*/设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}如果选择了q回车,结束计算程序*/if(c=='Q')exit(0); /*}putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/返回*/return; /*}/*窗口函数*/void mwindow( char *header ){int height;cleardevice(); /* 清除图形屏幕 */setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*//* 设置视口大小 */ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );height = textheight( "H" ); /* 读取基本文本大小 */settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/输出标题*/outtextxy( MaxX/4, 2, header ); /*setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ 画边框*/drawboder(); /*}画边框*/void drawboder(void) /*{定义视口类型变量*/struct viewporttype vp; /*setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/将当前视口信息装入vp所指的结构中*/getviewsettings( &vp );/*画矩形边框*/rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*}/*设计鼠标图形函数*/int arrow(){int size;定义多边形坐标*/int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*设置填充模式*/setfillstyle(SOLID_FILL,2); /*/*画出一光标箭头*/fillpoly(8,raw);测试图象大小*/size=imagesize(4,4,16,16); /*分配内存区域*/rar=malloc(size); /*存放光标箭头图象*/getimage(4,4,16,16,rar); /*putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/return 0;}/*按键函数*/int specialkey(void){int key;等待键盘输入*/while(bioskey(1)==0); /*key=bioskey(0); /*键盘输入*/只取特殊键的扫描值,其余为0*/ key=key&0xff? key&0xff:key>>8; /*return(key); /*返回键值*/}。

C语言实现简易计算器(可作加减乘除)

C语言实现简易计算器(可作加减乘除)

C语⾔实现简易计算器(可作加减乘除)C语⾔实现简易计算器(加减乘除)计算器作为课设项⽬,已完成答辩,先将代码和思路(注释中)上传⼀篇博客已增添、修改、整理⾄⽆错且可正常运⾏虽使⽤了栈,但初学者可在初步了解栈和结构语法后理解代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define IsDouble 0#define IsChar 1//_______________________________________________________________________________________________________________________________________________________ //1.⽀持浮点数和字符的栈typedef struct {char * buffer;int typesize;int top;int max;} stack;stack * CreateStack(int max, int typesize);//创建⼀个栈void DestroyStack(stack *);//释放栈的空间void ClearStack(stack *);//清空栈int Push(stack *, void *);//⼊栈int Pop(stack *, void *);//出栈int GetSize(stack *s);//得到栈的⼤⼩int GetTop(stack *, void *);//找到栈顶int IsEmpty(stack *);//判断是否为空栈,空则下溢int IsFull(stack *);//判断栈是否已满,满则溢出stack * CreateStack(int max, int typesize){stack * s = (stack*)malloc(sizeof(stack));//为栈s malloc内存if (!s) return 0;//为结构中buffer元素malloc内存s->buffer = (char *)malloc(sizeof(char) * max * typesize);if (!s->buffer) return 0;//初始化结构中的栈顶,最⼤值,类型⼤⼩s->top = -1;s->max = max;s->typesize = typesize;return s;}void DestroyStack(stack* s){free(s->buffer);//先释放buffer的空间free(s);//在释放s的空间}void ClearStack(stack * s){s->top = -1;//清空栈(栈头位置归零)}int Push(stack * s, void * data){if (IsFull(s)) return 0;//如果栈已满则return 0,防⽌溢出//栈未满则将栈头移动打动下⼀位置,并将data中的元素拷⼊栈中buffer的第top位置s->top++;memcpy(s->buffer + s->top*s->typesize, data, s->typesize);//⼊栈成功return 1return 1;}int Pop(stack * s, void * data){if (IsEmpty(s)) return 0;//出栈判断栈是否为空,若为空则return 0//栈未空则将buffer中top位置的字符拷⼊data记录,并让栈头向前移动⼀个位置memcpy(data, s->buffer + s->top*s->typesize, s->typesize);s->top--;//成功则return 1return 1;}int GetSize(stack *s){return s -> top+1;//栈头位置+1得到⼤⼩}int GetTop(stack *s, void * data){if (IsEmpty(s)) return 0;//如果栈空return 0//栈不为空则将top位置的字符拷回data记录,得到栈头memcpy(data, s->buffer + s->top*s->typesize, s->typesize);//成功则return 1;return 1;}int IsEmpty(stack * s){return s->top == -1;//如果top为-1则栈空}int IsFull(stack * s){return s->top == s->max-1;//如果top为max-1则栈满}//___________________________________________________________________________________________________________________________________________________ //2.定义⼀个cal类型,其中data存数时sign为IsDouble,存字符时,sign为Ischartypedef struct {double data;char sign;} cal;//3.查找对应符号(找到则返回该符号下标)(找不到则说明该部分为数字返回-1)int SearchCode(char ch){char * code = "+-*/()@";//@为终⽌符,算式输⼊结束int index = 0;//while (code[index]){if (code[index] == ch) return index;index++;}return -1;}//4.得到两个符号间的优先级//与SearchCode相对应,char GetPriority(char ch, char next){//创建⼀个perferen表,第i⾏(列)对应SearchCode函数中code中的第i个字符char perferen[7][7] = {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=E",">>>>E>>","<<<<<E="};//找到两个形参对应的字符int c = SearchCode(ch);int n = SearchCode(next);//如果找不到对应运算符(字符不是运算符⽽是为数字)return Eif (c==-1 || n==-1) return 'E';//如果找到两个对应运算符则按照优先级表返回两个运算符的优先级return perferen[c][n];}//5.四则运算double add(double a, double b) { return a+b; }double sub(double a, double b) { return a-b; }double mul(double a, double b) { return a*b; }double ddiv(double a, double b) { return a/b; }//整合四种运算double calcu(double a, char ch, double b){double (*calculation[4])(double,double) = {add,sub,mul,ddiv};return calculation[SearchCode(ch)](a,b);}//6.检测字符串int CheckStr(char * buffer){int n;//遍历字符串确保算式中⽆⾮法字符若检测到⾮法字符return 0,若都合法则return 1for (n = 0;buffer[n];n++){if ((SearchCode(buffer[n]) != -1 || buffer[n] == '.' || (buffer[n] >= '0' && buffer[n] <= '9')) && buffer[n] != '@') continue;else return 0;}buffer[n] = '@';//加上终⽌符,表⽰算式结束buffer[n+1] = '\0';return 1;}//7.得到数据转化为double类型存⼊rsint GetDigit(char * buffer, int * n, double * rs){char str[30];int i,j = 0;for (i = 0;SearchCode(buffer[*n]) == -1;i++){str[i] = buffer[*n];//从*n位置开始,将这⼀串数字字符存⼊str(*n)++;}str[i] = '\0';for (i = 0;str[i];i++){if (str[i] == '.') j++;}//如果⼀段⼩数有多个⼩数点或⼩数点在数字⾸尾,return 0if (j>1 || str[i-1] == '.' || str[0] == '.') return 0;//rs接收转化为double的数据*rs = atof(str);//操作成功return 1return 1;}//8.将⽤户输⼊的buffer字符串转化为可供程序运算的calstr数组int resolu(char * buffer, cal * calstr){int i = 0, j = 0;cal c;while (buffer[i]){if (SearchCode(buffer[i]) == -1){//如果得到数据不成功则return 0if (GetDigit(buffer,&i, &c.data) == 0) return 0;//如果成功得到数据则在c.sign标记为浮点数c.sign = IsDouble;//将c存⼊数组calstr中calstr[j++] = c;}else{//若符号为运算符//判断正负号if (buffer[i] == '-' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '-')){ i++;if (GetDigit(buffer,&i, &c.data) == 0) return 0;//在符号的下⼀位开始查找,若找不到数字return 0//否则,给数字取相反数,c.sign标记为浮点数,存⼊calstr中c.data = 0 - c.data;c.sign = IsDouble;calstr[j++] = c;} else//如果是正号,与符号处理⽅式同理if (buffer[i] == '+' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '+')){ i++;if (GetDigit(buffer, &i, &c.data) == 0) return 0;c.sign = IsDouble;calstr[j++] = c;}else{//如果不是正负号,则为运算符,先强制转换为double类型存在c.data⾥,然后c.sign标记为char类型,存⼊calstrc.data = (double)buffer[i++];c.sign = IsChar;calstr[j++] = c;}}}//操作蔡成功则return 1return 1;}//9.计算出结果int result(cal * calstr, double * rs){stack * pst = CreateStack(100,sizeof(char));//运算符栈stack * pnd = CreateStack(100,sizeof(double));//数据栈double num1,num2;int n = 0;char ch = '@';Push(pst, &ch);//在转换得到的calstr中遍历直到终⽌符'@"while(ch != '@' || !(calstr[n].sign == IsChar && (char)calstr[n].data == '@')){//如果calstr的n位上是浮点数,则将这个data压栈进⼊数据栈pnd中if (calstr[n].sign == IsDouble){Push(pnd, &(calstr[n].data));n++;}//反之,如果是运算符,则要检测优先级else{switch( GetPriority(ch, (char)calstr[n].data)){//如果运算符优先级较⼩,则让ch等于优先级⼤的符号并压⼊符号栈pst中case '<':ch = (char)calstr[n].data;Push(pst, &ch);n++;break;//如果结果为等号,让符号出栈暂存到ch中case '=':if (!Pop(pst, &ch)) return 0;n++;break;//如果ch优先级较⾼,则将前两个数字及运算符出栈,分别储存⾄num2,ch,num1中,进⾏运算,得到的结果再次压栈进⼊pnd中 case '>':if (!(Pop(pnd,&num2) && Pop(pst,&ch) && Pop(pnd,&num1))) return 0;num1 = calcu(num1,ch,num2);Push(pnd, &num1);break;//如果符号顺序出错,return 0case 'E':return 0;}}//检测是否可以得到栈顶符号,栈空则return 0if (!GetTop(pst, &ch)) return 0;}//如果栈中得到了最终结果,并且取出pnd中的最终结果到rs,return 1if (GetSize(pnd) == 1 && GetTop(pnd,rs)){DestroyStack(pst);DestroyStack(pnd);return 1;}//否则 return 0else{return 0;}}//10.⽤户交互函数void treatment(){char buffer[100];//⽤户输⼊的字符串(算式)cal calstr[50];//计算⽤的数组double rs = 0;//计算结果printf("Enter your equation:");gets(buffer);//让⽤户输⼊算式buffer//⽤户不输⼊"exit"就不退出while (!(buffer[0]=='e' && buffer[1]=='x' && buffer[2]=='i' && buffer[3]=='t')){//检查buffer中字符君合法,成功将buffer转化为⽤于计算的calstr数组,成功计算出结果存⼊rsif (CheckStr(buffer) && resolu(buffer,calstr) && result(calstr,&rs)){printf("\n%lf\n",rs);}else{printf("\nError!\n");}printf("Enter \"exit\"to quit");printf("\nEnter your equation:");gets(buffer);//再次让⽤户输⼊算式}printf("\nbye\n");}//11.主函数int main(){treatment();}参考⽂献链接如下[参考⽂献]()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书课程名称:数据结构设计题目:表达式计算程序设计学院:计算机科学与信息工程学院学生姓名:学生学号:专业班级:计算机科学与技术嵌入式(12-1) 指导教师:冯贺2014年6月16 日课程设计任务书表达式计算程序设计摘要:按照要求构造运算符优先级表,编写优先级比较算法。

利用栈结构和优先级编写表达式计算方法。

首先构建了一个数据栈,此栈用来储存浮点型数字;一个符号栈用来存储运算符号。

然后借助于两个栈和一个结构体运算。

关键词:栈优先级比较算法优先级表目录1.设计背景 (1)………1 1.1数据结构算法设计…………………………………………1.2知识运用 (1)2.设计方案 (1)2.2程序设计方案 (1)2.2模块设计方案 (1)3.方案实施………………………………………………………………2.........2 3.1模块代码.....................................................................6 3.1流程图...............................................................4.测试 (8)5.总结……………………………………………………………………10.........10 3.1总结........................................................................10 3.1谢词...............................................................6.参考文献 (10)7.附件……………………………………………………………………111. 设计背景1.1数据结构算法设计1、王亚洲完成了对符号栈的编写2、王秀文完成了对数字栈的编写3、李渊完成了对符号结构题的编写和对符号结构体数组的初始化4、童世超完成了对字符数字转化为浮点型数字5、曾冰寒完成对主函数的编写1.2知识运用学完数据结构,充分利用所学栈的知识,完成表达式程序设计2.设计方案2.1程序设计方案先定义一个结构体,用来存放符号和优先级和定义两个栈,一个数字栈、一个符号栈。

然后借助于符号结构体和两个栈通过逻辑算法设计一个表达式计算程序2.2模块设计方案该模块是表达式计算的核心模块即计算模块。

先判断接收的是不是左括号,左括号的优先级最低,如果是左括号无条件入栈;如果不是左括号则判断是不是右括号,右括号的优先级最高,遇到右括号无条件出栈运算,然后循环知道遇见左括号把括号的全部运算完毕然后继续接收字符;如果既不是左括号也不是右括号则判断是不是运算符,如果是运算符则判断和运算符栈的栈顶元素的优先级,如果栈顶元素的优先级等于或高于接收元素则出栈运算否则入栈;最后判断是不是等号,如果是等好则出栈运算,一直到数字栈中就剩下最后一个元素结果这输出结果,运算结束。

13. 方案实施3.1模块代码if('('==c) //左括号时入栈{Push(S,c); //左括号入符号栈c=getchar(); //接着读下一个字符}else if(')'==c) //当是右括号时计算括号内的内容{Pop(S,a); //符号栈出栈if('('==a) //判断刚出栈的符号是不是左括号{c=getchar(); //如果是左括号说明括号内运算完了,接收下个字符}else //不是左括号说明没运算玩,接着运算{SPop(Z,q); //数字栈出栈,用于运算SPop(Z,p); //数字栈出栈,用于运算SPush(Z,Operate(p,a,q)); //调用Operate计算,然后把计算结果入数字栈2}}else if('+'==c||'-'==c||'*'==c||'/'==c)//当是运算符的时候判断前一个运算符,前一个运算符高的时候运算{ //否则入栈if(0==StackLength(S)) //判断符号栈是否为空{Push(S,c); //符号入符号栈c=getchar(); //接着接收下个字符}else if(fuhao(GetTop(S),c)>=0) //调用fuhao函数判断栈顶元素和刚接收的符号的优先级{ //如果栈顶元素优先级高活相等就运算Pop(S,a); //符号出栈SPop(Z,q); //数字出栈SPop(Z,p); //数字出栈SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈}else //如果刚接收的符号的优先级高则入栈{3Push(S,c); //符号入符号栈c=getchar(); //接着接收下个字符}}else if('='==c) //当是等号的时候{//当输入等号时符号栈中应该至少有一个符号,数字栈中应该有两个数字Pop(S,a); //符号栈出栈SPop(Z,q); //数字栈出栈SPop(Z,p); //数字栈出栈SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈if(1==SStackLength(Z)) //判断数字栈是否就剩一个数字{ //如果就剩一个数字则说明运算结束if(0!=StackLength(S))//判断符号栈是否为空{ //运算结束符号栈应该为空,不为空则说明输入错误牰湩晴尨输入有错!\n);//错误提示return ; //结束该函数}SPop(Z,n); //最后一个数字即运算结果出栈4printf(%7.3f\n,n); //输出运算结果return; //结束该函数}}else //如果接受的既不是数字又不是运算符还不是等号则说明输入非法字符{printf(\ \t出错!\n\n\t输入非法字符!或未输入等号!\n\n);//错误提示return; //结束该函数}53.2流程图程序流程图如图1-1否否流程图1-1 图6模块流程图如图1-2 图1-2 模块流程图74. 测试主界面如图2-1图2-1 主页面传统计算结果如图2-2图2-2传统计算结果自定义优先运算输入如图 2-3图 2-3 自定义优先级8自定义优先级运算如图2-4图2-4自定义优先级运算错误提示(一)如图2-5图 2-5 错误提示(一)错误提示(二)如图 2-6图 2-6 错误提示(二)9结论5 5.1总结最重通过数据结构课程设计真正把知识点运用到实际问题中去更熟悉了栈的使用,在调试过程中遇到错误时,要的是学会了很多知识,考虑问题方面也变得更加周到一些,特别感谢老师一步一步帮助我们查找错误并讲解,让很多模糊的地方瞬间清楚了很多。

5.2谢词在此次课题设计中感谢老师在百忙之中抽出时间对我们的亲切指导,感谢组员们的热心配合,感谢所参考的书本的作者。

参考文献6.2012 ).语言版北京,清华大学出版社,编著.数据结构(c[1] 严蔚敏,吴伟民[2] 严蔚敏,吴伟民编著.数据结构题集(C语言版).北京,清华大学出版社,2007[3] Sartaj Sahni编著. Data Structures,Algorithms,and Applications in C++.McGraw-Hill107.附件源代码://******表达式计算程序设计#include<stdio.h>#include<stdlib.h>#include<string.h>#define OK 1#define TRUE1#define FALSE 0#define BAI 100#define SHI 10typedef charSElemType;typedef float ElemType;//存放符号的栈typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;//存放数字的栈typedefstruct11{ElemType *base;*top; ElemTypestacksize;int}Stack;//运算符结构体struct{char m;int n;}Fu[5];//构造一个符号栈void InitStack(SqStack &S){S.base=(SElemType*)malloc(BAI*sizeof(SElemType)); if(!S.base)exit(FALSE);// 栈初始化的时候头和尾指向相同 S.top=S.base;S.stacksize=BAI;}符号入栈//*****int Push(SqStack &S,SElemType e)//if(S.top-S.base>=S.stacksize) 检查是否满,如果满了再添加内存{ S.base=(SElemType*)realloc(S.base,(S.stacksize+SHI)*sizeof(SElemType));12if(!S.base)exit(FALSE);//内存可能从新分配,所以top要从新弄 S.top=S.base+S.stacksize; S.stacksize=+SHI;}*S.top++=e;return OK;}//*****符号出栈int Pop(SqStack &S,SElemType &e){if(S.top==S.base) //头尾相同则说明是个空栈{printf(\ 出现错误!\n\n);printf(\ 缺少符号 !\n\n);exit(0);}e=*--S.top;return OK;}//*****返回符号栈的长度int StackLength(SqStack S){return S.top-S.base;}//返回符号栈顶元素13char GetTop(SqStack S){if(S.top==S.base)return FALSE;return *(S.top-1);}//构造一个数字栈void SInitStack(Stack &S){S.base=(ElemType*)malloc(BAI*sizeof(ElemType));if(!S.base)exit(FALSE);S.top=S.base; //栈初始化的时候头和尾指向相同S.stacksize=BAI;}//*****数字入栈int SPush(Stack &S,ElemType e){if(S.top-S.base>=S.stacksize) //检查是否满,如果满了再添加内存{ S.base=(ElemType*)realloc(S.base,(S.stacksize+SHI)*sizeof(ElemType));if(!S.base)exit(FALSE);//内存可能从新分配,所以top要从新弄 S.top=S.base+S.stacksize; S.stacksize=+SHI;}14*S.top++=e;return OK;}//*****数字出栈int SPop(Stack &S,ElemType &e){if(S.top==S.base) //头尾相同则说明是个空栈{printf(\ 出现错误!\n\n);printf(\ 缺少数字 !\n\n);exit(0);}e=*--S.top;return OK;}//*****返回数字栈的长度int SStackLength(Stack S) {return S.top-S.base;}返回数字栈顶元素//float SGetTop(Stack S){if(S.top==S.base)return FALSE;return *(S.top-1);15}//****主界面int jiemian(){int n;printf(\\t\t欢迎使用计算器 \t\n\n);printf(\ 1:传统计算机* /优先于+ -\n);printf(\ 2:自定义优先序列\n\t输入其它命令退出 \n);printf(\ 请选择:);scanf(%d,&n);getchar();return n;}传统优先级////传统优先级*、/为第一优先级,+、-为第二优先级void chuantong(){Fu[0].m='+';Fu[1].m='-';Fu[2].m='*';Fu[3].m='/';Fu[4].m='(';Fu[0].n=1;Fu[1].n=1;Fu[2].n=2;Fu[3].n=2;Fu[4].n=0;}16//重新定优先级void xin(){int i;Fu[0].m='+';Fu[1].m='-';Fu[2].m='*';Fu[3].m='/';Fu[4].m='(';Fu[4].n=0;for(i=0;i<4;i++){牰湩晴尨请输入%c的优先级:,Fu[i].m);scanf(%d,&Fu[i].n);getchar();}//清除显示器上前面的东西system(cls);}//计算float Operate(float a,char c,float b){switch(c){case'+':return a+b;break;case'-':return a-b;17break;case'*':return a*b;break;case'/':return a/b;break;}}//判断符号的等级int fuhao(char a,char b){int i,j;for(i=0;i<5;i++)for(j=0;j<5;j++)if(Fu[i].m==a&&Fu[j].m==b){return Fu[i].n-Fu[j].n; 优先级越高数值越大//}}表达式计算//void jisuan(SqStack &S,Stack &Z){char c,shu[10],a;int i=0,j,b=1;float m=0,n=0.1,p,q;c=getchar();18while(1){if(('0'<=c&&c<='9')||'.'==c)//输入数字的时候先以字符串的方式储存下来{shu[i++]=c;c=getchar();}else{当输入的不是数字时把原来存储字符串的数字转//if(0!=i) 换成浮点型然后压入栈{for(j=0;j<i;){if('.'==shu[j]){j++;b=0;}if(b){m=m*10+(shu[j]-'0');}else{m=m+(shu[j]-'0')*n;n=n*0.1;19}j++;}n=0.1;i=0;b=1;SPush(Z,m);m=0;}if('('==c) //左括号时入栈{Push(S,c); //左括号入符号栈c=getchar(); //接着读下一个字符}else if(')'==c) //当是右括号时计算括号内的内容{Pop(S,a); //符号栈出栈if('('==a) //判断刚出栈的符号是不是左括号{c=getchar(); //如果是左括号说明括号内运算完了,接收下个字符 }else //不是左括号说明没运算玩,接着运算{SPop(Z,q); //数字栈出栈,用于运算SPop(Z,p); //数字栈出栈,用于运算SPush(Z,Operate(p,a,q)); //调用Operate 计算,然后把计算结果入数字栈20}}else if('+'==c||'-'==c||'*'==c||'/'==c)// 当是运算符的时候判断前一个运算符,前一个运算符高的时候运算{ //否则入栈if(0==StackLength(S)) // 判断符号栈是否为空{//符号入符号栈 Push(S,c);//接着接收下个字符 c=getchar();}else if(fuhao(GetTop(S),c)>=0) // 调用fuhao 函数判断栈顶元素和刚接收的符号的优先级{ //如果栈顶元素优先级高活相等就运算 Pop(S,a); //符号出栈 //SPop(Z,q); 数字出栈// 数字出栈SPop(Z,p);SPush(Z,Operate(p,a,q));// 调用 Operate计算,然后把计算结果入数字栈}else //如果刚接收的符号的优先级高则入栈{Push(S,c); // 符号入符号栈c=getchar(); //接着接收下个字符}}else if('='==c) //当是等号的时候{// 当输入等号时符号栈中应该至少有一个符号,数字栈中应该21有两个数字Pop(S,a); //符号栈出栈数字栈出栈 SPop(Z,q); // SPop(Z,p); 数字栈出栈 // SPush(Z,Operate(p,a,q));//调用 Operate 计算,然后把计算结果入数字栈if(1==SStackLength(Z)) //判断数字栈是否就剩一个数字{ // 如果就剩一个数字则说明运算结束if(0!=StackLength(S))// 判断符号栈是否为空{ //运算结束符号栈应该为空,不为空则说明输入错误牰湩晴尨输入有错!\n);//错误提示return ; // 结束该函数}// SPop(Z,n); 最后一个数字即运算结果出栈printf(%7.3f\n,n); // 输出运算结果return;结束该函数 //}}如果接受的既不是数字又不是运算符还不是等号// else则说明输入非法字符{printf(\ \t出错 !\n\n\t 输入非法字符!或未输入等号!\n\n);//错误提示return; //结束该函数}}}22}//****主函数void main(){SqStack S; //定义一个符号栈// 定义一个整数栈 Stack Z;int n;对符号栈进行初始化 // InitStack(S);//对数字栈进行初始化 SInitStack(Z);n=jiemian();while(n==1||n==2){//清除显示器上前面的东西 system(cls);// 先输入优先级 if(1==n)chuantong();if(2==n)xin();jisuan(S,Z);printf(\ 1:继续计算 \n\t 其他键退出计算\n\t:); scanf(%d,&n);system(cls); //清除显示器上前面的东西if(1!=n)break;n=jiemian();}}23指导教师评语:24。

相关文档
最新文档