一个c语言思考题。想了好久了

条件。只用if,switch和输入输出。做一个3个数的混合运算(带括号)。提示。用到scanf的返回值。
如我输入(1+2)*3 输出9
我输入1+2*3输出7

你这相当于编一个计算器。网上很多例子。
http://jingyan.baidu.com/article/22fe7ced67cd443002617f98.html

不知道,哈哈真的不知道

括号的话要借助栈啊,代数计算器,要做完善还是挺麻烦的

这个一般要分两步做:
1. 将我们熟悉的中缀表达式转换成后缀表达式(逆波兰表达式),消除运算符优先级;
2. 使用栈求解后缀表达式,得到结果。

我把以前写过的一个C++练习程序发给你参考。

 //本程序使用C++的标准模板库stack实现中缀表达式直接求值  
//假设所输入表达式由正小数、加、减、乘、除和圆括号组成  

//方法:将一个中缀表达式转换为后缀表达式(逆波兰表达式),去除表达式中操作符的优先级和圆括号,再求值 


#include<stdio.h>  
#include<stdlib.h>  
#include<stack>     //C++的标准模板库  
#define MaxOp 7  

using namespace std;  

struct Op_Prior     //定义操作符及优先级  
{  
    char op;    //操作符  
    int prior;  //优先级  
}       //注:等号只是为了便于编程而辅助使用的操作符,表达式中不应该出现等号操作符  
lpri[]={{'=',0},{'(',1},{'+',3},{'-',3},{'*',5},{'/',5},{')',6}},   //定义存入栈中的操作符及优先级。注:栈中不可能存入右圆括号  
rpri[]={{'=',0},{'(',6},{'+',2},{'-',2},{'*',4},{'/',4},{')',1}};   //定义中缀表达式中扫描到的操作符及优先级。  

bool isOp(char ch)  //判断是否是操作符  
{  
    char op[]="+-*/()";  
    int i=0;  
    while(op[i])  
    {  
        if(op[i] == ch)  
            return true;  
        i++;  
    }  
    return false;  
}  

bool isNum(char ch) //判断是否为数字的组成部分  
{  
    char num[]="0123456789.";  
    int i=0;  
    while(num[i])  
    {  
        if(num[i] == ch)  
            return true;  
        i++;  
    }  
    return false;  
}  

int sgn(int x)  //符号函数  
{  
    if(x>0)  
        return 1;  
    else if(x<0)  
        return -1;  
    else  
        return 0;  
}  

int getLpri(char ch)    //获取ch操作符在栈中的优先级  
{  
    for(int i=0; i<MaxOp; i++)  
        if(ch == lpri[i].op)  
            return lpri[i].prior;  
    return -1;  
}  

int getRpri(char ch)    //获取ch操作符在表达式中的优先级  
{  
    for(int i=0; i<MaxOp; i++)  
        if(ch == rpri[i].op)  
            return rpri[i].prior;  
    return -1;  
}  

void inTransPost(char *inExp, char postExp[])   //中缀表达式inExp转换为后缀表达式postExp  
{  
    stack<char> s;  //保存操作符的栈  
    int i=0;   
    char ch;  

    s.push('=');  

    while(*inExp)  
    {  
        if(isOp(*inExp))    //判断是否是操作符  
        {  
            if(i && postExp[i-1] != ' ')    //操作数后面追加一个空格  
                postExp[i++] = ' ';  

            ch = s.top();   //获取栈顶操作符  
            switch(sgn(getLpri(ch) - getRpri(*inExp)))  
            {  
            case 1:  
                s.pop();    //将操作符出栈,并追加到后缀表达式中  
                postExp[i++] = ch;  
                postExp[i++] = ' ';  
                continue;   //inExp指针不向后移动,准备与下一个栈顶操作符比较  
            case 0:  
                s.pop();    //将栈中的左圆括号出栈  
                break;  
            case -1:  
                s.push(*inExp);  
                break;  
            }  
        }  
        else  
        {  
            postExp[i++] = *inExp;  
        }  
        inExp++;  
    }  

    ch = s.top();  
    while(ch != '=')    //当栈顶元素不是等号时,继续将栈中的所有操作符出栈  
    {  
        postExp[i++] = ch;  
        postExp[i++] = ' ';  
        s.pop();  
        ch = s.top();  
    }  
    postExp[i] = '\0';  //后缀表达式转换完毕,添加结束符  
}  

double computeExp(char *exp)    //计算后缀表达式exp的算术结果  
{  
    stack<double> s;    //临时保存数字的栈,最后栈中剩下的一个数字就是函数的返回结果  
    char num[32];   //临时保存一个表达式中的数  
    double a, b, c;  

    while(*exp)  
    {  
        if(isOp(*exp))  //判断是否为操作符  
        {  
            b=s.top(); s.pop(); //将两个操作数出栈  
            a=s.top(); s.pop();  
            switch(*exp)  
            {  
            case '+':  
                c=a+b;  
                break;  
            case '-':  
                c=a-b;  
                break;  
            case '*':  
                c=a*b;  
                break;  
            case '/':  
                c=a/b;  
                break;  
            }  
            s.push(c);  //将计算的中间结果保存回栈中  
        }  
        else  
        {  
            if(isNum(*exp)) //如果是数字则获取该数并存入到栈中  
            {  
                int i=0;  
                while(isNum(*exp))  
                {  
                    num[i++] = *exp;  
                    exp++;  
                }  
                num[i] = '\0';  
                s.push(atof(num));  
                continue;   //因为exp指针已经向后移动了一次  
            }  
        }  
        exp++;  
    }  
    return s.top();  
}  

void main()  
{  
    char *exp = "(4.75-(3.28+3.33)*2.22)/(1.29+9.25)";  //中缀表达式  
    char postExp[256];  

    inTransPost(exp, postExp);  //转换为后缀表达式并保存到postExp中  
    printf("%s\n", postExp);    //输出后缀表达式  
    printf("后缀表达式求值结果:%lf\n", computeExp(postExp)); //通过后缀表达式计算结果  
    printf("C程序求值结果:%lf\n", (4.75-(3.28+3.33)*2.22)/(1.29+9.25));   //C程序表达式输出结果验证  
}  

数据结构教材里有相关的说明,是要用到栈结构。