📄 calcul.txt
字号:
#include "conio.h"
#include "bios.h"
#include "process.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>
#include <graphics.h>
#include <math.h>
#include <ctype.h>
#include <dos.h>
#include <malloc.h>
/******************以下定义顺序存储结构的堆栈*/
#define MAXNUM 1000
typedef struct{
char stack[MAXNUM];
long top;}stackchar; /*定义操作符堆栈*/
typedef struct{
float stack[MAXNUM];
long top;}stackfloat; /*定义操作数堆栈*/
stackchar *OPTR; /*存放运算符,注:一定要设置成指针类型*/
stackfloat *OPND; /*存放操作数*/
/***************全局变量 定义保存屏幕区域的数组变量*/
char buf00[3*3*2],buf10[3*3*2],buf20[3*3*2],buf30[3*3*2],buf40[3*3*2],
buf50[3*3*2],buf60[3*3*2],buf70[3*3*2],buf80[3*3*2],buf90[3*3*2],
bufadd0[3*3*2],bufsub0[3*3*2],bufmul0[3*3*2],bufdiv0[3*3*2],
bufequ0[3*3*2],bufleft0[3*3*2],bufright0[3*3*2],
bufshow0[55*13*2]; /*存放 按键后闪烁的变色按钮*/
char buf0[3*3*2],buf1[3*3*2],buf2[3*3*2],buf3[3*3*2],buf4[3*3*2],
buf5[3*3*2],buf6[3*3*2],buf7[3*3*2],buf8[3*3*2],buf9[3*3*2],
bufadd[3*3*2],bufsub[3*3*2],bufmul[3*3*2],bufdiv[3*3*2],
bufequ[3*3*2],bufleft[3*3*2],bufright[3*3*2],
bufshow[55*13*2]; /*存放正常时的按钮*/
/*----------函数原型----------------------*/
void initsystem(); /*初始化计算器系统*/
void reset(); /*复位*/
void display(); /*显示按键*/
char keytochar();
float chartofloat();
/*---------函数原型定义结束-----------------------------*/
char precede(char a,char b);
float operate(float a,char theta,float b);
/*******以下为存储操作数和运算符号的堆栈**********************/
void initstackchar(stackchar *s);
void initstackfloat(stackfloat *s);
void pushchar(stackchar *s,char x);
char popchar(stackchar *s);
char gettopchar(stackchar *s);
void pushfloat(stackfloat *s,float x);
float popfloat( stackfloat *s);
float gettopfloat(stackfloat *s);
/*---------函数原型定义结束-----------------------------*/
/**************************************/
main()
{
int i;
long m;
long key;
char chartemp;
char theta;
float a,b;
char charkey;
char ch2;
float tempfloat;
/*初始化堆栈*/
initstackchar(OPTR);initstackfloat(OPND);
pushchar(OPTR,'='); /* 把= 号压入栈底*/
initsystem(); /*初始化计算器*/
/****************************************************************/
key=0;
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();
m=0;
if(key!=4846) /*ALT + R */
{ m++;
gotoxy(m,2);
cprintf("%c",charkey);
}
while(1)
{
/**********检测是否对计算器复位************/
if(key==4864) /*ALT+R 复位计算器*/
{
/*初始化堆栈*/
initstackchar(OPTR);
pushchar(OPTR,'='); /* 把= 号压入栈底*/
initstackfloat(OPND);
initsystem(); /*初始化计算器*/
key=0;
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();m=0;
m++;
gotoxy(m,2);
cprintf("%c",charkey);
}
/**********检测是否对计算器复位************/
while(!((charkey=='=')&&(gettopchar(OPTR)=='='))) /*输入不是等号(注:以等号作为计算表达式的结束)*/
{
/**********检测是否对计算器复位************/
if(key==4864) /*ALT+R 复位计算器*/
{
/*初始化堆栈*/
initstackchar(OPTR);
pushchar(OPTR,'='); /* 把= 号压入栈底*/
initstackfloat(OPND);
initsystem(); /*初始化计算器*/
key=0;
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();m=0;
m++;
gotoxy(m,2);
cprintf("%c",charkey);
}
/**********检测是否对计算器复位************/
if(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))
{
tempfloat=chartofloat(charkey);
}
/*如果输入的不是运算符,即输入数*/
while(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))
{
/*@@@@@@@@@@@@@@@@@用于输入多位数字的处理 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
while(bioskey(1)==0); /*继续等待键盘输入*/
key=bioskey(0); charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();
m++;
gotoxy(m,2);
cprintf("%c",charkey);
if(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))
{
tempfloat=tempfloat*10+chartofloat(charkey);
}
else
{ pushfloat(OPND,tempfloat); }
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
}
while((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')'))
/*输入操作符*/
{
switch(precede(gettopchar(OPTR),charkey)) /*比较优先级*/
{
case '<': /*栈顶元素优先权低*/
pushchar(OPTR,charkey);
while(bioskey(1)==0); /*继续等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();
m++;
gotoxy(m,2);
cprintf("%c",charkey);
break;
case '=': /*脱括弧,并接收下一个字符*/
popchar(OPTR);
while(bioskey(1)==0); /*继续等待键盘输入*/
key=bioskey(0); charkey=keytochar(key);
display(key); /*调用显示按钮函数*/
reset();
m++;
gotoxy(m,2);
cprintf("%c",charkey);
break;
case '>': /*退栈并将运算结果入栈*/
theta=popchar(OPTR); b=popfloat(OPND); a=popfloat(OPND);
pushfloat(OPND,operate(a,theta,b));break;
case 'F':
m++;
gotoxy(m,2);
cprintf("You input wrongly!");
while(bioskey(1)==0); /*继续等待键盘输入*/
key=bioskey(0); charkey=keytochar(key);
}/* End of switch()*/
}/*else*/
}/*while()输入不是等号=*/
a=gettopfloat(OPND);
m++;
gotoxy(m,2);
cprintf("%f",a);
/**********************以下用于复位 ALT+R ******************************************/
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
while(key!=4864)
{
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0);charkey=keytochar(key);
}
/****************************************************************/
} /*while(1) */
} /*主函数main()结束*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/**以下为各个子函数*/
char precede(char a,char b)
{
switch(a)
{
case '+':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('<');
case '/':return('<');
case '(':return('<');
case ')':return('>');
case '=':return('>');
}
case '-':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('<');
case '/':return('<');
case '(':return('<');
case ')':return('>');
case '=':return('>');
}
case '*':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('>');
case '/':return('>');
case '(':return('<');
case ')':return('>');
case '=':return('>');
}
case '/':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('>');
case '/':return('>');
case '(':return('<');
case ')':return('>');
case '=':return('>');
}
case '(':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('<');
case ')':return('=');
case '=':return('F');/*返回错误*/}
case ')':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('>');
case '/':return('>');
case '(':return('F');/*返回错误*/
case ')':return('>');
case '=':return('>');}
case '=':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('<');
case ')':return('F');/*返回错误*/
case '=':return('=');}
} /*switch(a)*/
}
float operate(float a,char theta,float b)
{
switch(theta)
{
case '+':return(a+b);
case '-':return(a-b);
case '*':return(a*b);
case '/':return(a*1.0/b);
}
}
/*******以下为存储操作数和运算符号的堆栈**********************/
void initstackchar(stackchar *s)
{
s=(stackchar*)malloc(sizeof(stackchar));
s->top=-1;
}
void initstackfloat(stackfloat *s)
{
s=(stackfloat*)malloc(sizeof(stackfloat));
s->top=-1;
}
void pushchar(stackchar *s,char x)
{
s->top++;
s->stack[s->top]=x;
}
char popchar(stackchar *s)
{
char x;
x=s->stack[s->top];
s->top--;
return(x);
}
char gettopchar(stackchar *s)
{
return(s->stack[s->top]);
}
void pushfloat(stackfloat *s,float x)
{
s->top++;
s->stack[s->top]=x;
}
float popfloat( stackfloat *s)
{
float x;
x=s->stack[s->top];
s->top--;
return(x);
}
float gettopfloat(stackfloat *s)
{
return(s->stack[s->top]);
}
/**************************************/
void initsystem()
{
textbackground(WHITE); /*设置总窗口背景色*/
clrscr(); /*总窗口背景着色*/
window(1,1,80,1); /*定义一个文本窗口*/
textbackground(RED); /*设置窗口背景色*/
textcolor(BLACK);
clrscr();
gotoxy(1,1);
printf("Instruction: Reset---ALT+R; Result--- =");
/*****以下设置提示: 如何输入公式 窗口*********************************************/
window(22,17,67,22); /*定义一个文本窗口*/
textbackground(GREEN); /*设置窗口背景色*/
textcolor(WHITE);
clrscr();
gotoxy(1,1);
printf("You should input as following:");
gotoxy(1,2);
printf(" ( )= ");
gotoxy(1,3);
printf("For example: (2-3/(3+7*2)-9)= ");
/***********************************************************************************/
/**闪烁按钮*********************************************************************************/
/*********以下为 + - * / 的按钮******************************/
/*Button "+"*/
window(2,3,4,5);
textbackground(BLUE); /*设置窗口背景色*/
textcolor(RED);
clrscr();
gotoxy(2,2);
printf("+");
gettext(2,3,4,5,bufadd0);
/*Button "-"*/
window(6,3,8,5);
textbackground(BLUE); /*设置窗口背景色*/
textcolor(RED);
clrscr();
gotoxy(2,2);
printf("-");
gettext(6,3,8,5,bufsub0);
/*Button "*"*/
window(10,3,12,5);
textbackground(BLUE);
textcolor(RED);
clrscr();
gotoxy(2,2);
printf("*");gettext(10,3,12,5,bufmul0);
/*Button "/"*/
window(14,3,16,5);
textbackground(BLUE);
textcolor(RED);
clrscr();
gotoxy(2,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -