模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入一个正整数 repeat (0<repeat<10),做repeat 次下列运算:输入一个算式(没有空格),遇等号"="说明输入结束,输出结果。
注意:
- 算上‘=’,数字的个数=符号个数
- strlen计算字符串中字符的个数,数到‘\0’终止,以单个字符读入时,编译器不会自动在字符数组后面加‘\0’,除非人为添加,否则不能使用strlen
int len = i + 1; //%c读入字符不会加\\0,不能用strlen
- 要注意特别的输入:2=;所以要把ret初始化为第一个数字
int ret = arr[0];
1. 一般方法:
#include <stdio.h>
/*
输入一个算式(没有空格),遇等号"="说明输入结束,输出结果。
假设计算器只能进行 加减乘除 运算,运算数和结果都是整数,4 种运算符的优先级相同,按
从左到右的顺序计算。
*/
#include<string.h>
int main()
{
int repeat;
scanf("%d", &repeat);
int arr[1000];
char ch[100];
while (repeat--)
{
int i;
for (i=0; ch[i] != '\n'; i++)
{
scanf("%d", &arr[i]);
scanf("%c", &ch[i]);
if (ch[i] == '=')
{
break;
}
}
int len = i + 1; //%c读入字符不会加\0,不能用strlen
int ret = arr[0];
int j = 0;
int temp = 0;
for (int i = 0; i < len-1; i++)
{
if (ch[i] == '+')
{
ret = arr[j] + arr[j + 1];
arr[j + 1] = ret;
j++;
}
if (ch[i] == '-')
{
ret = arr[j] - arr[j + 1];
arr[j + 1] = ret;
j++;
}
if (ch[i] == '*')
{
ret = arr[j] * arr[j + 1];
arr[j + 1] = ret;
j++;
}
if (ch[i] == '/')
{
ret = arr[j] / arr[j + 1];
arr[j + 1] = ret;
j++;
}
}
printf("%d\n", ret);
}
return 0;
}
2. 优化:只使用了三个变量。ret保留符号前面的数,每次算完ret都更新变量,并使用switch_case语句
#include<stdio.h>
int main()
{
int repeat;
scanf("%d", &repeat);
while (repeat--)
{
int a, ret;
char c;
scanf("%d", &a);
ret = a; //ret保留符号前面的数
scanf("%c", &c);
while (c!='=')
{
switch (c)
{
case '+':
scanf("%d", &a);
ret += a;
scanf("%c", &c);
break;
case '-':
scanf("%d", &a);
ret -= a;
scanf("%c", &c);
break;
case '*':
scanf("%d", &a);
ret *= a;
scanf("%c", &c);
break;
case '/':
scanf("%d", &a);
ret /= a;
scanf("%c", &c);
break;
default:
break;
}
}
printf("%d\n", ret);
}
return 0;
}