标题:有一道题,请高手解决!
只看楼主
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
结帖率:100%
已结贴  问题点数:20 回复次数:11 
有一道题,请高手解决!
表达式求值

假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
输入格式
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
样例输出
3
999
200
搜索更多相关主题的帖子: 正确答案 编写程序 表达式 十进制 
2013-11-06 22:57
雨夜梧桐
Rank: 2
等 级:论坛游民
帖 子:63
专家分:89
注 册:2010-6-4
得分:0 
作业题么?
2013-11-06 23:07
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
作业要独立完成
2013-11-06 23:13
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
得分:0 
我们就没有作业,这是我们学校acm测评系统上的,

我的世界每天开出一朵花
2013-11-06 23:15
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
得分:0 
好像很简单...直接写3个函数add, max, min...然后直接输出结果!

仰望星空...........不忘初心!
2013-11-06 23:33
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
得分:0 
好,我试试

我的世界每天开出一朵花
2013-11-06 23:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
形如 f(a,b) 可以看作一个前缀表达式
因此:
从右向左扫描,遇到数值(比如1、23)就压入“数字栈”,遇到符号(min、max、add)就从“数值栈”中取出最近压入的两个数值进行相应计算,并把计算结果压入“数字栈”
2013-11-07 08:47
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
看看楼主发的主题帖吧,就是个不思考不努力的人。

总有那身价贱的人给作业贴回复完整的代码
2013-11-07 08:59
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
发了三四个求作业的帖子,楼主的作业可真多啊...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-07 09:17
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
得分:15 
你标题错了,高手不会帮你的, 只有我这种菜鸟才需要你的题目来练习练习,
搞了一天,差不多了.
既然是你的题目,就把代码发上来
我对数据结构不懂, 高手指点指点, 别骂我.
程序代码:
/* 解題思路:  設add(x,y)x為a位置, y 為b位置

 * 1. 建立一個棧, 用來存放b位置的數

 * 2. 讀取一個數, 判斷其位置.是b位置,壓入棧.

 * 2. 搜索下一個數據, 如果是a位置,就从栈中讀取一個數計算

 * 3. 如果是b位置, 就繼續壓入.

 * 4. 對計算結果. 如果是a位置, 繼續計算.如果是b位置,壓入.

 */

#include <stdio.h>
#include <math.h>
#include <string.h>

#define ADD(a, b) a+b
#define MIN(a, b) a<b ? a : b
#define MAX(a, b) a>b ? a : b

#define MAXCH 300     // 最大字符300
#define MAXNUM 60     // 栈最多只要存60个数.

void push(int num);          // 壓入函数
int top(void);               // 弹出函数
int comput(int a);           // 計算結果

static int num [MAXNUM+2];   // 保存數據的棧
static int *val = num;       // 指向棧的指針
static char str[MAXCH+1];    // 保存串
static char *p = str;             

int main()
{
    int num;
    int n;
    int i;

    printf("輸入計算數.\n");
    while ((scanf("%d", &n)) ==1 && (n < 0 || n > 10))
        printf("請重新輸入\n");

    for (; n > 0; n--) {
        scanf("%s", str);
        while (*p++)                        // 指針指向棧尾
            ;
        while (p != str) {
            while (!(*p <= '9' && *p >= '0'))   // 數的最後一位
                p--;
            num = 0;
            for (i = 0; *p <= '9' && *p >= '0'; ++i, p--)    //  把字符轉換為數值
                num += (*p - '0') * (int)pow(10, i);   
            if (*p == ',')                      // 如果是 b位置 就壓入棧, 讀下一個數
                push(num);
            else {
                while (*p == '('){              // 如果是 a位置 就從棧中彈出一個數計算
                    num = comput(num);          // 如果計算結果是 a位置 就循環
                }
                if (*p == ',')                 // 如果計算結果是 b位置, 就壓入棧
                push(num);
            }
        }
        printf("%d\n", num);
    }
    return 0;
}

void push(int num)
{
    *(++val) = num;
}

int top(void)
{
    int b = *val;
    val--;
    return b;
}

int comput(int a)
{
    int res, b;
    b = top();
    p = &p[-3];
    if (memcmp(p, "add", 3) == 0)
        res = ADD(a,b);
    else if (memcmp(p, "min",3) == 0)
        res = MIN(a, b);
    else
        res = MAX(a, b);
    if (p != str)
        p--;
    return res;
}


 
2013-11-07 15:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-423171-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022769 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved