算法设计与分析实验-实验三.问题 C: 前缀表达式计算

题目描述

表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间,这称为中缀表达式(Infix expression),如A+B。
波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式:把运算符写在操作数之前,称为波兰表达式(Polish expression)或前缀表达式(Prefix expression),如+AB;把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish expression)或后缀表达式(Suffix expression),如AB+;前后缀表达式的出现是为了方便计算机处理。
本题求解波兰表达式的值,其中运算符包括+ - * /四个。

输入

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。

样例输入 Copy
* + 11.0 12.0 + 24.0 35.0
样例输出 Copy
1357.000000
正确代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

double bo()
{
    char s[100];
    scanf("%s",&s); 
    switch(s[0])
    {
        case '+': return bo() + bo();
        case '-': return bo() - bo();
        case '*': return bo() * bo();
        case '/': return bo() / bo();
        default : return atof(s);
    }
}



int main()
{
    printf("%f",bo());
    return 0;
}
错误和知识点:

1.atof()

功能:将字符串转化为浮点数 ,而不是将字符转化为浮点数

它定义在<stdlib.h>中 

atof() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,将后续的有效字符转换成浮点数,最后一个有效字符之后的字符串将被忽略。

2.之前抄别人的代码发现在OJ上总是出现编译错误的原因是:

C 库函数 double exp(double x) 是返回 e 的 x 次幂的值,存储在math.h中。所以用了<math.h>就不能用exp(),之所以我之前用<math.h>,是因为一开始我认为atof()定义在 <math.h>中

3.

例1.
请输入字符串:天天开心
输出的结果是:天天开心

例2.
请输入字符串:i am working
输出的结果是:i

出现例2的原因:
原因是用 scanf 输入带空格的字符串时系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串,所以只会将空格之前的字符串存储到定义好的字符数组中。
那么这种情况该怎么办?
解决方法:
以空格为分隔符,数有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i am working”有两个空格,表示有三个字符串,那么就定义三个字符数组:

但是

#include <stdio.h>
int main()
{
	char a,b,c;
	scanf("%c%c%c",&a,&b,&c);
	printf("%c,%c,%c",a,b,c);
	return 0;
} 

运行结果:
在这里插入图片描述

在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。

更多字符和字符串的输入输出见https://blog.csdn.net/qq_45158642/article/details/123760899?spm=1001.2014.3001.5506

char s[100];
scanf("%s",&s);是规定用法 

我奇怪的是为什么在switch用s[0],大概是因为不能直接用s.没错就是这样

4.刚才我所写的只是最基本只是最基本的知识点错误但实际上一开始我根本没有一点递归思路,我的递归很差,不过我感觉用栈也能写,这个之后有时间在写,希望我不会鸽

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值