/******************************************************
* Auther : Hongpo Zhang
* Email :
* Last modified : 2013-08-29 16:10
* Filename : cal.c
* Description : 简单四则运算, 最多两位整形数的加减乘除,不包括括号
******************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 4
#define MAX_LEN 1024
typedef struct {
char c;
int (*cal)(int, int);
}sel_t;
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int divi(int a, int b)
{
if (b == 0) {
printf("error: a/b, b!=0\n");
exit(0);
}
return a / b;
}
sel_t arr[N] = {{'+', add},
{'-', sub},
{'*', mul},
{'/', divi}};
int is_num(char c)
{
if (c >= '0' && c <= '9')
return 1;
return 0;
}
int myatoi(char c)
{
return c - '0';
}
int fun(char *str, int len)
{
int i, j = 0, k = 0, n;
int num[MAX_LEN] = {0};
char op[MAX_LEN] = {0};
int sum = 0, tmp = 0;
for (i = 0; i < len; ++i) {
//保存数字
if (is_num(str[i]) == 1) {
//判断几位数
if (is_num(str[i + 1]) == 1) {
if (is_num(str[i + 2]) == 1) {
printf("error: num must be in 0~99\n");
exit(0);
}
num[j++] = myatoi(str[i]) * 10 + myatoi(str[++i]);
}
else
num[j++] = myatoi(str[i]);
}
//保存符号
else {
if (arr[2].c == str[i]) {
//乘法
if (is_num(str[i + 1]) == 1) {
if (is_num(str[i + 2]) == 1)
tmp = myatoi(str[i + 1]) * 10 + myatoi(str[i + 2]);
else
tmp = myatoi(str[i + 1]);
}
num[j] = arr[2].cal(num[--j], tmp);
++i;
++j;
} else if(arr[3].c == str[i]) {
//除法
if (is_num(str[i + 1]) == 1) {
if (is_num(str[i + 2]) == 1)
tmp = myatoi(str[i + 1]) * 10 + myatoi(str[i + 2]);
else
tmp = myatoi(str[i + 1]);
}
num[j] = arr[3].cal(num[--j], tmp);
++i;
++j;
} else {
op[k++] = str[i];
}
}
}
sum = num[0];
for (j = 1, k = 0; k < strlen(op); ++k) {
for (n = 0; n < N; ++n)
if (arr[n].c == op[k]) {
sum = arr[n].cal(sum, num[j++]);
break;
}
}
return sum;
}
int main(int argc, char *argv[])
{
char buf[MAX_LEN];
int len, sum;
printf("please input you need calculate:\n");
while (1) {
memset(buf, 0, MAX_LEN);
fgets(buf, MAX_LEN, stdin);
if (buf[strlen(buf)- 1] == '\n')
buf[strlen(buf) - 1] = '\0';
//puts(buf);
len = strlen(buf);
if (strcasecmp(buf, "exit") == 0)
break;
sum = fun(buf, len);
printf("sum = %d\n", sum);
}
return 0;
}
C语言编写程序,实现多个非负整数四则运算的功能
最新推荐文章于 2022-11-24 14:52:50 发布