C语言 | 计算器实现 version 2.

在之前版本中使用栈结构来实现,但由于51单片机不支持malloc函数,所以使用C语言又写了一个计算器版本。

通过数组存放值和操作符模拟栈操作。

实现代码:

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define OK 1
#define ERROR 0
int InputJudge(char c); //判断函数是否为数字
float Calc(char optr, float num1, float num2);
char PriorityJudge(char optr1, char optr2);
int main()
{
char arrayChar[];
float arrayFloat[] = {};
char tempChar, optr, c;
float tempFloat, num1, num2;
int topChar = ;
int topFloat = ;
int i;
for (i = ; i < ; ++i)
{
arrayChar[i] = '';
}
arrayChar[topChar] = '#';
topChar++;
c = getchar();
while(c != '#' || arrayChar[topChar - ] != '#')
{
if (InputJudge(c))
{
arrayFloat[topFloat] = (float)(c - '');
topFloat++;
c = getchar();
/* 当连续输入数字时,计算十位数和百位数 */
while(InputJudge(c))
{
topFloat--;
tempFloat = arrayFloat[topFloat];
arrayFloat[topFloat] = (float)(tempFloat * + (c - ''));
topFloat++;
c = getchar();
}
if (c == '.')
{
i = ;
c = getchar();
do
{
topFloat--;
tempFloat = arrayFloat[topFloat];
tempFloat = tempFloat + ((c - '') / pow(, i));
i++;
arrayFloat[topFloat] = tempFloat;
topFloat++;
c = getchar();
}
while(InputJudge(c));
}
}
else
{
tempChar = arrayChar[topChar - ];
switch(PriorityJudge(tempChar, c))
{
case '<':
arrayChar[topChar] = c;
topChar++;
c = getchar();
break;
case '=':
topChar--;
c = arrayChar[topChar];
c = getchar();
break;
case '>':
topChar--;
optr = arrayChar[topChar];
topFloat--;
num2 = arrayFloat[topFloat];
topFloat--;
num1 = arrayFloat[topFloat];
arrayFloat[topFloat] = Calc(optr, num1, num2);
topFloat++;
break;
}
}
}
while(topFloat != )
{
topFloat--;
tempFloat = arrayFloat[topFloat];
printf("%f\n", tempFloat);
}
return OK;
}
float Calc(char optr, float num1, float num2)
{
switch(optr)
{
case '+':
return (num1 + num2);
break;
case '-':
return (num1 - num2);
break;
case '*':
return (num1 * num2);
break;
case '/':
return (num1 / num2);
break;
}
}
int InputJudge(char c)
{
switch(c)
{
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
return OK;
break;
case '.':
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':
return ERROR;
break;
default:
break;
}
}
char PriorityJudge(char optr1, char optr2)
{
int i, j;
char priorityTable[][] =
{
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ''},
{'>', '>', '>', '>', '', '>', '>'},
{'<', '<', '<', '<', '<', '', '='}
};
switch(optr1)
{
case '+':
i = ;
break;
case '-':
i = ;
break;
case '*':
i = ;
break;
case '/':
i = ;
break;
case '(':
i = ;
break;
case ')':
i = ;
break;
case '#':
i = ;
break;
}
switch(optr2)
{
case '+':
j = ;
break;
case '-':
j = ;
break;
case '*':
j = ;
break;
case '/':
j = ;
break;
case '(':
j = ;
break;
case ')':
j = ;
break;
case '#':
j = ;
break;
}
return priorityTable[i][j];
}

C语言 | 计算器实现 version 2.

上一篇:odoo 订餐系统之消息提醒


下一篇:给你的站点加入 console.js