作为标题。 我遇到一个问题,有3个操作数,每个是随机的,有2个运算符也是随机的。
例如,它可以执行为:num1 [ops] num2 [ops] num3。用户可以输入“ 3 + 2/8”,“ 45 * 76 + 8”或“ 14-8-9”,...(“ *”和“ /”仍然具有运算符优先级)。
如果我使用“ if”来处理它,这并不明智。 但是如果我使用switch,它也需要4 * 4的情况,也不是很聪明。 那么,我该怎么办?
感谢您的光临,我为我的英语不好而感到抱歉。
这是我的代码:
void judge(char *);
int main()
{
char string[]={};
while(gets(string)!=EOF)
{
judge(string);
}
return 0;
}
void judge(char *string)
{
int i=0;
int sum=0;
char string2[10];
strcpy(string2, string);
char ops[2]={};
int nums[3]={};
char *delim =" +-*/";
char *delim2=" 0123456789";
char * pch;
char * pch2;
pch = strtok(string,delim);
while (pch != NULL)
{
nums[i]=atoi(pch);
i++;
pch = strtok (NULL, delim);
}
i=0;
pch2 = strtok(string2,delim2);
while (pch2 != NULL)
{
ops[i]=pch2[0];
i++;
pch2 = strtok (NULL, delim2);
}
for(i=0;i<3;i++)
{
if(i>0)
{
printf(" ");
}
printf("%d",nums[i]);
}
printf(" ");
for(i=0;i<2;i++)
{
if(i>0)
{
printf(" ");
}
printf("%c",ops[i]);
}
/* here is what I confused. */
switch(ops[0])
{
case '+':
if(ops[1]=='+')
sum=nums[0]+nums[1]+num[2];
if(ops[1]=='-')
sum=nums[0]+nums[1]-num[2];
if(ops[1]=='*')
sum=nums[0]+nums[1]*num[2];
if(ops[1]=='/')
sum=nums[0]+nums[1]/num[2];
}
}
和编译器窗口: enter image description here
答案 0 :(得分:1)
您的代码中有一些错别字,并且由于未包含所有必需的头文件,因此您会收到警告。
您不能定义没有大小的数组,例如char string[]
。
根据您的编译器和C库,您可能会收到有关不推荐使用的功能gets
的警告。您应该使用fgets
来避免缓冲区溢出。这两个函数都返回一个可能是NULL
而不是EOF
的指针。
您应该首先修复所有编译器警告。
我暂时不会编写完整的程序,但会提出一些可能的解决方案。
对于智能解决方案,您可以实现一个函数,该函数使用A op B
进行4种情况的计算switch
,并调用两次。该功能可以定义为
int calculate(int a, char op, int b)
通过计算A op1 B op2 C
,您首先必须检查运算符op1
和op2
的优先级,以确定是计算( A op1 B ) op2 C
还是A op1 ( B op2 C)
。为此,您可以实现一个返回运算符优先级的函数。我认为较低的值是较高的优先级。该功能可以定义为
int precedence(char op)
然后您可以执行以下操作:
if(precedence(ops[0]) < precedence(ops[1])) {
return calculate( calculate(nums[0], ops[0], nums[1]),
ops[1], nums[2] );
} else {
return calculate( nums[0], ops[0],
calculate(nums[1], ops[1], nums[2]) );
}
在问题程序中,您可能希望使用sum = calculate( ... )
而不是return calculate( ... )
。