条件。只用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程序表达式输出结果验证
}
数据结构教材里有相关的说明,是要用到栈结构。