Skip to content

Instantly share code, notes, and snippets.

@JRY-Zheng
Created July 31, 2015 01:05
Show Gist options
  • Save JRY-Zheng/866800c1810ffc3f52d9 to your computer and use it in GitHub Desktop.
Save JRY-Zheng/866800c1810ffc3f52d9 to your computer and use it in GitHub Desktop.
Inputing a Math Expression and How to Calculate its Answer //输入表达式如何计算答案
#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