含有加减乘除的表达式计算

一、问题

【问题描述】

从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的’=’字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中不含圆括号,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

【输入形式】

在控制台中输入一个以’=’结尾的整数算术运算表达式。

【输出形式】

向控制台输出计算结果(为整数)。

【样例1输入】

5 - 1 * 2 * 3 + 12 / 2 / 2  =

【样例1输出】

2

【样例2输入】

500 =

【样例2输出】

500

【样例1说明】

输入的表达式为5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整数运算规则,计算结果为2,故输出2。

【样例2说明】

输入的表达式为500 = ,没有运算符参与运算,故直接输出500。

二、解决方式

  1. 用gets函数进行读取,用一整个数组存取整个表达式
  2. 吃去空格
  3. 开一个int数组num[]存储数字
  4. 开一个char数组fuhao[]存储运算符
  5. 从头开始读取运算符,对乘除进行优先计算,将计算结果存储在乘法或除法开始的第一个数字中,并将后面的参与过的数字和运算符删掉
  6. 此时运算符数组中只有‘+’和‘-’,从头开始计算将结果储存在num[1]中
  7. 打印num[1]

三、易错点

用gets函数读取表达式需要将char型的数字转化成整数型,此时要注意该数字可能不止一位,比如3与300

如果char数组中的元素是len个,那最后一位是str[len-1],第一项是str[0]

四、代码实现

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
char str1[10000];
char str2[10000];
int num1[10000];
char fuhao[10000];
char fuhao2[10000];
void deletestr1(int *str,int i,int n)//删去int型数组的某一位置,n表示数组尾端的下标,i表示要删去的位置下标
{
	int j;
	for(j=i;j<n;j++)
	{
		str[j]=str[j+1];
	}
}
void deletestr2(char *str,int i,int n)//删去char型数组的某一位置,n表示数组尾端的下标,i表示要删去的位置下标
{
	int j;
	for(j=i;j<n;j++)
	{
		str[j]=str[j+1];
	}
}
int main()
{
	gets(str1);//gets函数读取
	int len=strlen(str1);//长度
	int j=0;
	int i;
	for(i=0;i<=len-1;i++)//str1[len-1]是数组的尾端,再开一个数组用于存贮没有空格的表达式
	{
		if(str1[i]!=' ')
		{
			str2[j]=str1[i];
			j++;
		}
	}
	int len2=strlen(str2);
	j=1;
	int j1=1;
	for(i=0;i<=len2-1;i++)
	{
		if(str2[i]>='0'&&str2[i]<='9')//如果这个数是数字 
		{
			int l=i,k=i;//定点 
			while(str2[l]>='0'&&str2[l]<='9')
			{
				l++;
			}
			int num=l-i;
			for(k;k<=l-1;k++) 
			{
				num1[j]+=(str2[k]-'0')*pow(10,num-1);//将符号转化为数字
				num--;
			}
			j++; 
			i=l;
		}
	}
	for(i=0;i<=len2-1;i++)
	{
		if(str2[i]<'0'||str2[i]>'9')
		{
			fuhao[j1]=str2[i];
			j1++;
		}
	}
	j--,j1--;	//数字的数量,符号的数量
	for(i=1;i<=j;i++)
	{
		int k=i;
		while(fuhao[k]=='*'||fuhao[k]=='/')
		{
			if(fuhao[k]=='*')
			{
				num1[i]*=num1[k+1];
			}
			else if(fuhao[k]=='/')
			{
				num1[i]/=num1[k+1];
			}
			deletestr1(num1,k+1,j);//删去已经参与过运算的运算符和数字
			j--;
			deletestr2(fuhao,k,j1);
			j1--;
		} 
	}
	for(i=1;i<=j;i++)//将答案存贮在num1[1]
	{
		if(fuhao[i]=='+')
		{
			 num1[1]+=num1[i+1];
		}
		else if(fuhao[i]=='-')
		{
			num1[1]-=num1[i+1];
		}
	}
	printf("%d",num1[1]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值