一、问题
【问题描述】
从标准输入中读入一个整数算术运算表达式,如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。
二、解决方式
- 用gets函数进行读取,用一整个数组存取整个表达式
- 吃去空格
- 开一个int数组num[]存储数字
- 开一个char数组fuhao[]存储运算符
- 从头开始读取运算符,对乘除进行优先计算,将计算结果存储在乘法或除法开始的第一个数字中,并将后面的参与过的数字和运算符删掉
- 此时运算符数组中只有‘+’和‘-’,从头开始计算将结果储存在num[1]中
- 打印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;
}