本实例与上例的区别在于表达式中有括号。其实每个括号中的内容都可以看作是一个单独的表达式(也可能又带括号),考虑到这一点,我们可以把程序写为递归调用的方式,遇到括号则调用自己计算括号中表达式的值。相应的程序代码如下:
#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;
}
分享到:
相关推荐
新能源车行业报告:特斯拉Q1财报抢眼,吹响行业进击号角-0507-国海证券-21页.pdf
策略问道产业系列之云计算产业:5G科技周期下半场,进击云计算-1122-华泰证券-41页.pdf
策略问道产业系列之云计算产业:5G科技周期下半场,进击云计算-20191122-华泰证券-41页.pdf
从西式咖啡到中式茶饮全图谱分析,文化的进击-20210607-国信证券-50页.pdf.pdf
电气设备行业:从消费电池看国内电池龙头竞争力,新市场,老对手;中国芯,再进击-0602-长江证券-30页.pdf
c语言带括号的计算器,栈的初始化自实现,计算器实现逻辑
FullSpeed-Python-进击的Python-中文版.pdf
影视动漫行业:漫谈·国产电影的进击之路-20180427-华创证券-18页.pdf
传媒行业动态报告:5G应用之三,探析云游戏创业公司进击之路-1018-中信建投-36页.pdf
20210603-国泰君安-通信设备及服务行业全球进击系列之二:光模块全球进击.pdf
20210220-中泰证券-药明生物-2269.HK-进击的全球生物药CRO、CDMO龙头,技术领先,未来可期.pdf
C 语言控制台计算器是一个简单但很实用的程序,它允许用户在命令行界面中输入算术表达式,并计算出结果。该程序通常包括以下几个主要部分: 1. **输入处理**:程序需要从控制台读取用户输入的表达式字符串。可以使用 C ...
20210607-国信证券-社会服务行业咖啡与茶饮专题:从西式咖啡到中式茶饮全图谱分析,文化的进击.pdf
由C语言实现的基础库,提供的功能有: 基础库 co_vec 向量数组 co_dict 字典(哈希表),内部有一个链表用于遍历,使用它可以实现lrucache co_set 集合,内部由红黑树实现。 co_list 双向链表 co_queue 循环队列 co_...
20210405-国泰君安-酒鬼酒-000799-进击的酒鬼酒.pdf
20210609-光大证券-百润股份-002568-投资价值分析报告:多元化的饮酒市场,进击的预调酒巨头.pdf
20210302-中泰证券-中国飞鹤-6186.HK-进击的国产奶粉龙头,护城河持续加深中.pdf
20210614-招商证券-火星人-300894-进击的集成灶龙头.pdf
20210307-方正证券-贝泰妮-A20333-高壁垒高增长,进击的敏感肌龙头.pdf