题目:切分表达式
问题描述 四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包 括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个 token(标记)。 现在,对于给定的一个四则运算表达式,请把式子中的每个 token 切分出来。题目保证给定 的表达式是正确的,不需要做有效性检查。
输入格式 在一行中给出长度不超过 40 个字符的表达式,其中没有空格,仅由上文中 token 的字 符组成。
输出格式 依次输出表达式中的 tokens,每个 token 占一行。
样例输入 32*((2-2)+5)/(-15)
样例输出
32
*
(
(
2
-
2
)
+
5
)
/
(
-15
)
代码实现:
对于数字的处理有两种方法:方法二正确,请手动下滑哈
第一就是转换为浮点型(因为有小数点)但是这样相对繁琐且我们很难判断数字前面的‘+’和‘-’究竟表示的是正负还是加减...
在我发现这确实太过麻烦之后我就果断放弃了这种方法,因为得分很低且确实不想再改。。。
代码(40分)(没有处理小数点和加号还因为改了几次有点乱。。。)
加号的处理相对简单,和题目中处理减法的部分合并就可以啦
小数点的处理就是找到它的位置,其之后的部分分别除以10的负位数次方即可,我估计硬要打的话在我现在的基础上会冲向百行大关...
#include <stdio.h>
#include <string.h>
int main() {
char s[1001];
gets(s);
int pos = 0, k = 0, num;
for (register int i = 0; i <= strlen(s); i++) {
if (s[i] >= '0' && s[i] <= '9' && pos == 0) {
if (k == 1) {
printf("-");
k = 0;
}
pos = 1;
num = s[i] - '0';
continue;
}
if (s[i] >= '0' && s[i] <= '9' && pos == 1) {
pos = 1;
num *= 10;
num += s[i] - '0';
}
if (s[i] < '0' && pos == 1 && s[i] != '-' || s[i] > '9' && pos == 1 && s[i] != '-') {
if (k == 1) {
printf("-");
k = 0;
printf("\n");
}
printf("%d\n", num);
printf("%c\n", s[i]);
pos = 0;
continue;
}
if (s[i] < '0' && pos == 0 && s[i] != '-' || s[i] > '9' && pos == 0 && s[i] != '-') {
if (k == 1) {
printf("-");
printf("\n");
}
printf("%c\n", s[i]);
}
if (s[i] == '-') {
k = 1;
if (i >= 2 && s[i - 1] == ')' || i >= 2 && s[i - 1] == ']' && i >= 2 && s[i - 1] == '}') {
printf("-\n");
k = 0;
continue;
}
if (pos == 1) {
printf("%d\n-\n", num);
num = 0;
k = 0;
}
}
}
return 0;
}
所以我果断的换了方法
法二:直接输出字符串
#include <stdio.h>
#include <string.h>
int main() {
char s[10001];
gets(s);
int num = 0, word = 0, pos = 0;//num代表上一位是数字,word代表上一位是非数字字符,pos用于位置移动
while (pos < strlen(s)) {
if (s[pos] > '9' && s[pos] != '-' && s[pos] != '+' || s[pos] < '0' && s[pos] != '-' && s[pos] != '+') {
//非数字,非可能会产生特殊情况的加减
printf("%c\n", s[pos]);//直接输出
num = 0;//对于下一位该位不是数字
word = 1;//是字符
}
if (s[pos] <= '9' && s[pos] >= '0') {
word = 0;
num = 1;//是数字
while (s[pos] <= '9' && s[pos] >= '0' || s[pos] == '.') {
printf("%c", s[pos]);//向后遍历如果是一个数字直接输出
pos++;
}
printf("\n");
continue;//不用再后移循环结束时已经移动
}
if (s[pos] == '+' || s[pos] == '-') {
if (num == 1 || s[pos - 1] == ')' && pos >= 1) {
//就是两种情况 1.例如:9-8 2.例如(98-89)-89或(98-89)-(98-89)
printf("%c\n", s[pos]);
} else {
printf("%c", s[pos]);//表示正负
}
}
pos++;//直接移动
}
return 0;
}