求救!!!编写程序对表达式求值(从左向右运算,不计符号优先级)

qq_33176571 2015-11-28 07:47:45
编写程序对表达式求值:
例如
终端上显示的内容:
Enter an expression:1+2.5*3
valus of expression:10.5

表达式中的操作数是浮点数,运算符是+,—,*,\,表达式从左向右求值(所有运算符的优先级都一样)


求代码。或者告我哪错了也行。。。虽然我觉得循环那部分没救了。。。

#include<stdio.h>

float arithmetic(float x,char ch,float y)
{
switch (ch) {
case '+' : return (x+y); break;
case '-' : return (x-y); break;
case '*' : return (x*y); break;
case '/' : return (x/y); break;
}

}

int main()
{
float a[20];
float n=1;
char ch='*';
int i=0;

printf("Enter an expression:");

while (ch!='\n') {
if (i==0)
scanf("%f",&a[i]);
else
scanf("%c%f",&ch,&a[i]);

n=arithmetic(n,ch,a[i]);

i++;
}

printf("Value of expression:%.1f",n);

return 0;

}
...全文
1025 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwangsr 2019-12-21
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你处理过程写的是对的,关键是跳不出循环,帮你改成这样:


#include<stdio.h>

float arithmetic(float x,char ch,float y)
{
switch (ch) {
case '+' : return (x+y); break;
case '-' : return (x-y); break;
case '*' : return (x*y); break;
case '/' : return (x/y); break;
}

}

int main()
{
float a[20];
float n=1;
char ch='*';
int i=0;

printf("Enter an expression:");

while (ch!='\n') {
if (i==0)
scanf("%f",&a[i]);
else
{
scanf("%c",&ch);
if(ch=='\n')
break;
scanf("%f",&a[i]);
}

n=arithmetic(n,ch,a[i]);

i++;
}

printf("Value of expression:%.1f",n);

return 0;

}
建议把printf("Value of expression:%.1f",n);中的%.1f改成%g,这样不止一位小数的也能准确输出而且没有多余的0
Wwoshixiaobai 2017-12-09
  • 打赏
  • 举报
回复
楼上的n=1有点问题,只能算1开头的算式。。 改成这样就对了 #include<stdio.h> float cal(float x,char ch,float y){ switch (ch) { case '+':return(x+y);break; case'-':return(x-y);break; case'*':return(x*y);break; case'/':return(x/y);break; } } int main() { float a[50]; float n; char ch; int i=0; printf("Enter an expression:"); while (ch!='\n'){ if(i==0){ scanf("%f",&n); scanf("%c",&ch); scanf("%f",&a[i]); n=cal(n,ch,a[i]); i++; } else scanf("%c",&ch); if(ch=='\n') break; scanf("%f",&a[i]); n=cal(n,ch,a[i]); i++; } printf("Value of expression:%.1f",n); return 0; }
qq_33176571 2015-11-29
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你处理过程写的是对的,关键是跳不出循环,帮你改成这样:

#include<stdio.h>

float arithmetic(float x,char ch,float y)
{
switch (ch) {
    case '+' : return (x+y); break;
  case '-' : return (x-y); break;
    case '*' : return (x*y); break;
   case '/' : return (x/y); break;
   }

}

int main()
{
	float a[20];
	float n=1;
	char ch='*';
	int i=0; 

	printf("Enter an expression:");

	while (ch!='\n') {
		if (i==0)
			scanf("%f",&a[i]);
		else 
		{
			scanf("%c",&ch);
			if(ch=='\n')
				break;
			scanf("%f",&a[i]);
		}

		n=arithmetic(n,ch,a[i]);

		i++; 
	}

	printf("Value of expression:%.1f",n);

	return 0;

}
太感谢了!!!完美的解决了我的问题!!!
qq_33176571 2015-11-29
  • 打赏
  • 举报
回复
引用 1 楼 Gdreamlend 的回复:
给下建议或者思路吧: if (i==0) 这个判断可以换掉 1.先把整个表达式输入进来, 2.然后判断字符串中的每个字符是不是数字, 3.如果是数字赋值给a, 4.否则赋值给c, 5.然后如果是数字赋值给b 6.这时应该去调用你的计算函数,得到中间结果d 7.然后这时的a=d, 8如果输入的字符串并没有读完 循环上面的 5及后面步骤
虽然和我想的不一样,但提供了不一样的思路还是谢谢你!
paschen 2015-11-28
  • 打赏
  • 举报
回复
你处理过程写的是对的,关键是跳不出循环,帮你改成这样:

#include<stdio.h>

float arithmetic(float x,char ch,float y)
{
switch (ch) {
    case '+' : return (x+y); break;
  case '-' : return (x-y); break;
    case '*' : return (x*y); break;
   case '/' : return (x/y); break;
   }

}

int main()
{
	float a[20];
	float n=1;
	char ch='*';
	int i=0; 

	printf("Enter an expression:");

	while (ch!='\n') {
		if (i==0)
			scanf("%f",&a[i]);
		else 
		{
			scanf("%c",&ch);
			if(ch=='\n')
				break;
			scanf("%f",&a[i]);
		}

		n=arithmetic(n,ch,a[i]);

		i++; 
	}

	printf("Value of expression:%.1f",n);

	return 0;

}
gdreamlend 2015-11-28
  • 打赏
  • 举报
回复
给下建议或者思路吧: if (i==0) 这个判断可以换掉 1.先把整个表达式输入进来, 2.然后判断字符串中的每个字符是不是数字, 3.如果是数字赋值给a, 4.否则赋值给c, 5.然后如果是数字赋值给b 6.这时应该去调用你的计算函数,得到中间结果d 7.然后这时的a=d, 8如果输入的字符串并没有读完 循环上面的 5及后面步骤

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧