Created
July 31, 2015 01:05
-
-
Save JRY-Zheng/866800c1810ffc3f52d9 to your computer and use it in GitHub Desktop.
Inputing a Math Expression and How to Calculate its Answer //输入表达式如何计算答案
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <reg51.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include"Lcd1602.h" | |
#include"KeyDown.h" | |
#include"delay.h" | |
unsigned char code KEY_CODE[16]= "123+456-789*.0=/"; | |
void main() | |
{ | |
unsigned char m,i,j,k,l; /*m用以记录每次单击的键值,需-1处理后才得到键值; | |
i用以标识按顺序出现的数字序号; | |
j用以标识按顺序出现的符号序号; | |
k用以判别是否按下'.'; | |
l用以辅助一般for循环;*/ | |
double NumList[21]; //用来存放按顺序出现的数字; | |
unsigned char OpeList[20]; //用来存放按顺序出现的符号; | |
unsigned char TooLong[9]="Too long!"; //当数字或符号超出20个时用来提示数据过多; | |
unsigned char ans[20]; //存放答案用以输出; | |
for(i=0;i<20;i++) //为数字赋初值为0,则未重新赋值的元素均为0; | |
{ | |
NumList[i]=0; | |
} | |
for(j=0;j<20;j++) //为符号赋初值为'+',则未重新赋值的元素均为'+'; | |
{ | |
OpeList[j]='+'; | |
} | |
i=0;j=0;k=0;l=0; //为元素赋初值,其中k=0表示未按下'.'; | |
LcdInit(); //初始化显示屏; | |
while(1) | |
{ | |
m=KeyDown(); //获取矩阵按键按下的键值; | |
if(i<20&&j<20) //当数据不超过设定值时程序运行; | |
{ | |
if(m!=0) //当有按键按下时,进行记录; | |
{ | |
m-=1; //将键值还原为正常值; | |
LcdWDat(KEY_CODE[m]); //输出键值所对应的符号或数字; | |
switch(m) | |
{ | |
case 3: //当按下的为'+'键,则执行; | |
OpeList[j]='+'; //将符号存放至符号数组; | |
i+=1; //标志上一个数字记录完毕; | |
j+=1; //标志当前符号记录完毕; | |
k=0; //重新判别是否按下'.'; | |
break; | |
case 7: //当按下的为'-'键,则执行; | |
OpeList[j]='-'; //将符号存放至符号数组; | |
i+=1; //标志上一个数字记录完毕; | |
j+=1; //标志当前符号记录完毕; | |
k=0; //重新判别是否按下'.'; | |
break; | |
case 11: //当按下的为'×'键,则执行; | |
OpeList[j]='*'; //将符号存放至符号数组; | |
i+=1; //标志上一个数字记录完毕; | |
j+=1; //标志当前符号记录完毕; | |
k=0; //重新判别是否按下'.'; | |
break; | |
case 15: //当按下的为'/'键,则执行; | |
OpeList[j]='/'; //将符号存放至符号数组; | |
i+=1; //标志上一个数字记录完毕; | |
j+=1; //标志当前符号记录完毕; | |
k=0; //重新判别是否按下'.'; | |
break; | |
case 14: //当按下的为'='键,则执行; | |
for(l=0;l<i;l++) //遍历符号数组执行'*','/'运算; | |
{ | |
switch(OpeList[l]) | |
{ | |
case '*': //如果按下'*'键,则将a*b改动为0+(a×b)或0-(a×b),其中'+'或'-'由前一个符号决定; | |
NumList[l+1]*=NumList[l]; | |
NumList[l]=0; | |
OpeList[l]=OpeList[l-1]; | |
break; | |
case '/': //如果按下'/'键,则将a*b改动为0+(a/b)或0-(a/b),其中'+'或'-'由前一个符号决定; | |
NumList[l+1]=NumList[l]/NumList[l+1]; | |
NumList[l]=0; | |
OpeList[l]=OpeList[l-1]; | |
break; | |
default:break; | |
} | |
} | |
for(l=0;l<i+1;l++) //遍历符号数组执行'+','-'运算; | |
{ | |
switch(OpeList[l]) | |
{ | |
case '+': //如果按下'+'键,则将b改动为a+b; | |
NumList[l+1]+=NumList[l]; | |
break; | |
case '-': //如果按下'-'键,则将b改动为a-b; | |
NumList[l+1]=NumList[l]-NumList[l+1]; | |
break; | |
default:break; | |
} | |
} | |
sprintf(ans,"%g",NumList[i]); //最右数字即答案,将其输出至字符数组; | |
for(l=0;l<strlen(ans);l++) //输出答案; | |
{ | |
LcdWDat(ans[l]); | |
} | |
i=0;j=0;k=0; //初始化归0; | |
break; | |
case 12: //当按下的为'.'键,则执行; | |
k=1; //标记按下'.'; | |
break; | |
default: //如果按下数字键则执行; | |
if(k==0) //按下'.'之前执行; | |
{ | |
NumList[i]*=10; | |
NumList[i]+=KEY_CODE[m]-48; //在NumList[i]=a,输入b时,得到NumList[i]=a×10+b; | |
} | |
else //按下'.'之后执行; | |
{ | |
for(l=0;l<k;l++) //在NumList[i]=a,输入b时,得到NumList[i]=a×10^k; | |
{ | |
NumList[i]*=10; | |
} | |
NumList[i]+=KEY_CODE[m]-48; //在NumList[i]=a,输入b时,得到NumList[i]=a×10^k+b; | |
for(l=0;l<k;l++) | |
{ | |
NumList[i]/=10; //在NumList[i]=a,输入b时,得到NumList[i]=a=b/10^k; | |
} | |
k+=1; //标记下次输入数字时小数位+1; | |
} | |
break; | |
} | |
m=0; //重新判别矩阵按键是否按下及按下的键值; | |
} | |
} | |
else //当数据超过设定值时程序运行; | |
{ | |
if(l==0) //首次运行时执行; | |
{ | |
LcdInit(); //初始化显示屏; | |
for(i=0;i<9;i++) | |
{ | |
LcdWDat(TooLong[i]); //输出"Too long!"; | |
} | |
l=1; //退出首次执行; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment