本实例与上例的区别在于表达式中有括号。其实每个括号中的内容都可以看作是一个单独的表达式(也可能又带括号),考虑到这一点,我们可以把程序写为递归调用的方式,遇到括号则调用自己计算括号中表达式的值。相应的程序代码如下:
#include "stdio.h"
#include "stdlib.h"
float get_num(char **);
float calculate(char **);
int main()
{char a[80];
float result;
char *p;
clrscr();
gets(a);
p = a;
result = calculate(&p);
printf("%f\n", result);
getch();
return 0;
}
float calculate(char **p)
{float result = 0;
int sign = 1;
if(**p == '-') {
sign = -1;
(*p)++;
}
while(**p != 0 && **p != ')' ) {
float m;
if(**p == '(' ) {
(*p)++;
m = sign*calculate(p); //遇到括号调用自己计算括号中的值
}
else
m = sign*get_num(p);
while(**p == '*' || **p == '/') {
if(**p == '*') {
(*p)++;
if(**p == '(') {
(*p)++;
m *= calculate(p); //遇到括号调用自己计算括号中的值
}
else
m *= get_num(p);
}
else {
int div;
(*p)++;
if(**p == '(') {
(*p)++;
div = calculate(p); //遇到括号调用自己计算括号中的值
}
else
div = get_num(p);
if(div == 0) {
printf("diveide by 0!\n");
exit(1);
}
else
m /= div;
}
}
if(**p != '+' && **p != '-' && **p != 0 && **p != ')'){
printf("illege character: %c\n",**p);
exit(0);
}
result += m;
if(**p == '+') {
sign = 1;
(*p)++;
}
else
if(**p == '-' ) {
sign = -1;
(*p)++;
}
else
if(**p == ')' ) { //遇到右括号,跳过并退出循环返回结果
(*p)++;
break;
}
else
break;
}
return result;
}
float get_num(char **p)
{float n = 0, m = 10;
if(**p != '.' && (**p <'0' || **p >'9')) {
printf("get num error!\n");
exit(1);
}
while(**p >= '0' && **p <= '9') {
n = n*10 + **p - 48;
(*p)++;
}
if(**p == '.') {
(*p)++;
while(**p >= '0' && **p <= '9') {
n += (**p - 48)/m;
(*p)++;
m *= 10;
}
}
return n;
}
#include "stdio.h"
#include "stdlib.h"
float get_num(char **);
float calculate(char **);
int main()
{char a[80];
float result;
char *p;
clrscr();
gets(a);
p = a;
result = calculate(&p);
printf("%f\n", result);
getch();
return 0;
}
float calculate(char **p)
{float result = 0;
int sign = 1;
if(**p == '-') {
sign = -1;
(*p)++;
}
while(**p != 0 && **p != ')' ) {
float m;
if(**p == '(' ) {
(*p)++;
m = sign*calculate(p); //遇到括号调用自己计算括号中的值
}
else
m = sign*get_num(p);
while(**p == '*' || **p == '/') {
if(**p == '*') {
(*p)++;
if(**p == '(') {
(*p)++;
m *= calculate(p); //遇到括号调用自己计算括号中的值
}
else
m *= get_num(p);
}
else {
int div;
(*p)++;
if(**p == '(') {
(*p)++;
div = calculate(p); //遇到括号调用自己计算括号中的值
}
else
div = get_num(p);
if(div == 0) {
printf("diveide by 0!\n");
exit(1);
}
else
m /= div;
}
}
if(**p != '+' && **p != '-' && **p != 0 && **p != ')'){
printf("illege character: %c\n",**p);
exit(0);
}
result += m;
if(**p == '+') {
sign = 1;
(*p)++;
}
else
if(**p == '-' ) {
sign = -1;
(*p)++;
}
else
if(**p == ')' ) { //遇到右括号,跳过并退出循环返回结果
(*p)++;
break;
}
else
break;
}
return result;
}
float get_num(char **p)
{float n = 0, m = 10;
if(**p != '.' && (**p <'0' || **p >'9')) {
printf("get num error!\n");
exit(1);
}
while(**p >= '0' && **p <= '9') {
n = n*10 + **p - 48;
(*p)++;
}
if(**p == '.') {
(*p)++;
while(**p >= '0' && **p <= '9') {
n += (**p - 48)/m;
(*p)++;
m *= 10;
}
}
return n;
}