C语言编写程序,实现多个非负整数四则运算的功能

/******************************************************
* 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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值