#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>/*字符 *** 作函数*/
#defineUP0x48/*光标上移键*/
#defineDOWN0x50/*光标下移键*/
#defineLEFT0x4b/*光标左移键*/
#defineRIGHT0x4d/*光标右移键*/
#defineENTER0x0d/*回车键*/
void*rar/*全局变量,保存光标图象*/
structpalettetypepalette/*使用调色板信息*/
intGraphDriver/*图形设备驱动*/
intGraphMode/*图形模式值*/
intErrorCode/*错误代码*/
intMaxColors/*可用颜色的最大数值*/
intMaxX,MaxY/*屏幕的最大分辨率*/
doubleAspectRatio/*屏幕的像素比*/
voiddrawboder(void)/*画边框函数*/
voidinitialize(void)/*初始化函数*/
voidcomputer(void)/*计算器计算函数*/
voidchangetextstyle(intfont,intdirection,intcharsize)/*改变文本样式函数*/
voidmwindow(char*header)/*窗口函数*/
intspecialkey(void)/*获取特殊键函数*/
intarrow()/*设置箭头光标函数*/
/*主函数*/
intmain()
{
initialize()/*设置系统进入图形模式*/
computer()/*运行计算器*/
closegraph()/*系统关闭图形模式返回文本模式*/
return(0)/*结束程序*/
}
/*设置系统进入图形模式*/
voidinitialize(void)
{
intxasp,yasp/*用于读x和y方向纵横比*/
GraphDriver=DETECT/*自动检测显示器*/
initgraph(&GraphDriver,&GraphMode,"")
/*初始化图形系统*/
ErrorCode=graphresult()/*读初始化结果*/
if(ErrorCode!=grOk)/*如果初始化时出现错误*/
{
printf("GraphicsSystemError:%s\n",
grapherrormsg(ErrorCode))/*显示错误代码*/
exit(1)/*退出*/
}
getpalette(&palette)/*读面板信息*/
MaxColors=getmaxcolor()+1/*读取颜色的最大值*/
MaxX=getmaxx()/*读屏幕尺寸*/
MaxY=getmaxy()/*读屏幕尺寸*/
getaspectratio(&xasp,&yasp)/*拷贝纵横比到变量中*/
AspectRatio=(double)xasp/(double)yasp/*计算纵横比值*/
}
/*计算器函数*/
voidcomputer(void)
{
structviewporttypevp/*定义视口类型变量*/
intcolor,height,width
intx,y,x0,y0,i,j,v,m,n,act,flag=1
floatnum1=0,num2=0,result/* *** 作数和计算结果变量*/
charcnum[5],str2[20]={""},c,temp[20]={""}
charstr1[]="1230.456+-789*/Qc=^%"/*定义字符串在按钮图形上显示的符号*/
mwindow("Calculator")/*显示主窗口*/
color=7/*设置灰颜色值*/
getviewsettings(&vp)/*读取当前窗口的大小*/
width=(vp.right+1)/10/*设置按钮宽度*/
height=(vp.bottom-10)/10/*设置按钮高度*/
x=width/2/*设置x的坐标值*/
y=height/2/*设置y的坐标值*/
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)/*设置颜色为红色*/
outtextxy(x+3*width,y+height/2,"0.")/*输出字符串"0."*/
x=2*width-width/2/*设置x的坐标值*/
y=2*height+height/2/*设置y的坐标值*/
for(j=0j<4++j)/*画按钮*/
{
for(i=0i<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
strcpy(str2,"")/*设置str2为空串*/
while((v=specialkey())!=45)/*当压下Alt+x键结束程序,否则执行下面的循环*/
{
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=str1[n*5+m]/*将字符保存到变量c中*/
if(isdigit(c)||c=='.')/*判断是否是数字或小数点*/
{
if(flag==-1)/*如果标志为-1,表明为负数*/
{
strcpy(str2,"-")/*将负号连接到字符串中*/
flag=1
}/*将标志值恢复为1*/
sprintf(temp,"%c",c)/*将字符保存到字符串变量temp中*/
strcat(str2,temp)/*将temp中的字符串连接到str2中*/
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)/*将第一个 *** 作数转换为浮点数*/
strcpy(str2,"")/*将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=='-')
{
if(strcmp(str2,"")==0)/*如果str2为空,说明是负号,而不是减号*/
flag=-1/*设置负数标志*/
else
{
num1=atof(str2)/*将第二个 *** 作数转换为浮点数*/
strcpy(str2,"")/*将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)/*将第二个 *** 作数转换为浮点数*/
strcpy(str2,"")/*将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)/*根据运算符号计算*/
{
case1:result=num1+num2break/*做加法*/
case2:result=num1-num2break/*做减法*/
case3:result=num1*num2break/*做乘法*/
case4:result=num1/num2break/*做除法*/
case5:result=pow(num1,num2)break/*做x的y次方*/
case6:result=fmod(num1,num2)break/*做模运算*/
}
setfillstyle(SOLID_FILL,color+3)/*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,15*width/2,3*height/2)/*覆盖结果区*/
sprintf(temp,"%f",result)/*将结果保存到temp中*/
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.")/*显示字符串*/
}
if(c=='Q')exit(0)/*如果选择了q回车,结束计算程序*/
}
putimage(x,y,rar,XOR_PUT)/*在退出之前消去光标箭头*/
return/*返回*/
}
/*窗口函数*/
voidmwindow(char*header)
{
intheight
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()/*画边框*/
}
voiddrawboder(void)/*画边框*/
{
structviewporttypevp/*定义视口类型变量*/
setcolor(MaxColors-1)/*设置当前颜色为白色*/
setlinestyle(SOLID_LINE,0,NORM_WIDTH)/*设置画线方式*/
getviewsettings(&vp)/*将当前视口信息装入vp所指的结构中*/
rectangle(0,0,vp.right-vp.left,vp.bottom-vp.top)/*画矩形边框*/
}
/*设计鼠标图形函数*/
intarrow()
{
intsize
intraw[]={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)/*消去光标箭头图象*/
return0
}
/*按键函数*/
intspecialkey(void)
{
intkey
while(bioskey(1)==0)/*等待键盘输入*/
key=bioskey(0)/*键盘输入*/
key=key&0xff?key&0xff:key>>8/*只取特殊键的扫描值,其余为0*/
return(key)/*返回键值*/
}
#include <stdio.h>struct s_node
{
int data
struct s_node *next
}
typedef struct s_node s_list
typedef s_list *link
link operator=NULL
link operand=NULL
link push(link stack,int value)
{
link newnode
newnode=(link) malloc(sizeof(s_list))
if(!newnode)
{
printf("\nMemory allocation failure!!!")
return NULL
}
newnode->data=value
newnode->next=stack
stack=newnode
return stack
}
link pop(link stack,int *value)
{
link top
if(stack !=NULL)
{
top=stack
stack=stack->next
*value=top->data
free(top)
return stack
}
else
*value=-1
}
int empty(link stack)
{
if(stack==NULL)
return 1
else
return 0
}
int is_operator(char operator)
{
switch (operator)
{
case '+': case '-': case '*': case '/': return 1
default:return 0
}
}
int priority(char operator)
{
switch(operator)
{
case '+': case '-' : return 1
case '*': case '/' : return 2
default: return 0
}
}
int two_result(int operator,int operand1,int operand2)
{
switch(operator)
{
case '+':return(operand2+operand1)
case '-':return(operand2-operand1)
case '*':return(operand2*operand1)
case '/':return(operand2/operand1)
}
}
void main()
{
char expression[50]
int position=0
int op=0
int operand1=0
int operand2=0
int evaluate=0
printf("\nPlease input the inorder expression:")
gets(expression)
while(expression[position]!='\0'&&expression[position]!='\n')
{
if(is_operator(expression[position]))
{
if(!empty(operator))
while(priority(expression[position])<= priority(operator->data)&&
!empty(operator))
{
operand=pop(operand,&operand1)
operand=pop(operand,&operand2)
operator=pop(operator,&op)
operand=push(operand,two_result(op,operand1,operand2))
}
operator=push(operator,expression[position])
}
else
operand=push(operand,expression[position]-48)
position++
}
while(!empty(operator))
{
operator=pop(operator,&op)
operand=pop(operand,&operand1)
operand=pop(operand,&operand2)
operand=push(operand,two_result(op,operand1,operand2))
}
operand=pop(operand,&evaluate)
printf("The expression [%s] result is '%d' ",expression,evaluate)
getch()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)