【发布时间】:2015-08-12 04:15:03
【问题描述】:
我正在用 C 语言制作一个字符串计算器,但我遇到了一些问题。
例如:2 * (123-321) * (2+(3-4)-(3*2*2)) / ((12-2)/(1+1+1+1+0+ 1))
应该打印2178,而是打印3058704。
所以我尝试计算 (2+(3-4)-(3*2*2)) 并发现它返回 77578153 而不是 -11。
而且2*(123-321)*(1-12)/2 返回1980 而不是2178。
#include <stdio.h>
#include <stdlib.h>
char *vnos;
int charToDigit(int i1, int i2) {
int stevilo = 0;
int i;
//printf("%d %d\n",i1,i2);
// printf("%c %d\n",vnos[i1], vnos[i1]);
for(i=i1; i<=i2; i++)
//printf("%d ", (vnos[i1]-48));
stevilo = (stevilo + (vnos[i] - '0'))*10;
stevilo = stevilo/10;
return stevilo;
}
int rekurzija(int zacetek, int konec) {
//printf("bumbum: %d %d \n", zacetek, konec);
int i,oklepaj1,zaklepaj1,oklepaj,zaklepaj;
int zacasniI=0;
i=zacetek;
if(vnos[zacetek] == '(' && vnos[konec] == ')'){
oklepaj = 1;
zaklepaj = 0;
i++;
while(!oklepaj == zaklepaj) {
if (vnos[i] == '(')
oklepaj++;
if (vnos[i] == ')')
zaklepaj++;
i++;
}
i--;
if(i==konec){
return rekurzija(zacetek+1,konec-1);
}
}
for(i=zacetek; i<=konec; i++){
// printf("tralala: %d %d \n", zacetek, konec);
switch(vnos[i]){
case '+':
return rekurzija(zacetek,(i-1))+rekurzija((i+1),konec);
case '-':
if(i>zacasniI)
zacasniI = i;
break;
case '*':
if(zacasniI==0)
zacasniI = i;
break;
case '/':
if(zacasniI==0 || vnos[zacasniI]=='/')
zacasniI = i;
break;
case '(':
oklepaj1 = 1;
zaklepaj1 = 0;
i++;
while(!oklepaj1 == zaklepaj1) {
if (vnos[i] == '(')
oklepaj1++;
if (vnos[i] == ')')
zaklepaj1++;
i++;
}
i--;
break;
}
}
if(zacasniI>0){
switch(vnos[zacasniI]) {
case '-': return rekurzija(zacetek, zacasniI-1)-rekurzija(zacasniI+1, konec);
case '*': return rekurzija(zacetek, zacasniI-1)*rekurzija(zacasniI+1, konec);
case '/': return rekurzija(zacetek, zacasniI-1)/rekurzija(zacasniI+1, konec);
}
}
return charToDigit(zacetek,konec);
}
int main(){
vnos = malloc(sizeof(char) * 9000);
char r;
int z = 0;
int l;
scanf("%c", &r);
while(r != '\n'){
if(r != ' '){
vnos[z] = r;
z++;
}
scanf("%c", &r);
}
int result = rekurzija(0,z-1);
printf("%d\n", result);
return 0;
}
vnos = 输入
zacetek = 开始
konec = 结束
stevilo = 数字
oklepaj = 右括号
zaklepaj = 左 括号
zacasni = 临时
任何帮助将不胜感激。
【问题讨论】:
-
(3 2 2) 是什么意思?是否缺少一些运算符?
-
是的,应该是 3*2*2
-
你试过在函数中检查你的解决方案吗?
-
这是一个学校项目,它说最大输入是 9000,所以我没有费心重新分配它,因为它会使用更多内存
-
@sadsad 那么你也应该在 9000 处强制停止阅读。永远不要相信用户
标签: c string recursion calculator