计算器c语言代码

计算器c语言代码,第1张

#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>/*字符 *** 作函数*/

#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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7698995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存