11.表达式计算对一串加减乘除带括号进行计算

算法流程图:

执行截图:

完整代码:

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <math.h>
  5 #include <string.h>
  6 //删除空格
  7 void deleteSpace(char *str);
  8 //判断是不是数字
  9 bool isnum(char ch);
 10 //获取括号间的内容
 11 char *kuohao(char *str, int *pindex);
 12 //获取数据
 13 double getnum(char *str, int *pindex);
 14 //分析乘除
 15 double comfenxi(char *str, int *pindex);
 16 //分析加减
 17 double fenxi(char *str);
 18
 19 //字符串删除空格
 20 void deleteSpace(char *str)
 21 {
 22     //获取首地址
 23     char *tmp = str;
 24     //如果没到结尾
 25     while (*str != ‘\0‘)
 26     {
 27         //如果不等于空格则进行赋值
 28         if (*str != ‘ ‘)
 29         {
 30             *tmp = *str;
 31             tmp++;
 32         }
 33         //不断遍历
 34         str++;
 35     }
 36     //字符串结尾
 37     *tmp = 0;
 38 }
 39
 40 //判断当前字符是不是数字
 41 bool isnum(char ch)
 42 {
 43     return ch >= ‘0‘ && ch <= ‘9‘;
 44 }
 45
 46 //截取括号里面的内容
 47 char *kuohao(char *str, int *pindex)
 48 {
 49     char *pstr = NULL;//指向截取的字符串
 50     int num = 0;//记录多少括号的对数
 51     int leftindex = *pindex;//记录左边括号的位置
 52
 53     //直到循环到匹配到的‘)‘
 54     do
 55     {
 56         switch (str[*pindex])
 57         {
 58             //如果是左括号num就加1,一直循环到匹配第一个‘(‘的‘)‘
 59         case ‘(‘:
 60             num++;
 61             break;
 62         case ‘)‘:
 63             //若果等于0,则是与第一个‘(‘匹配的‘)‘
 64             if (num == 0)
 65             {
 66                 (*pindex)++;//移动到括号的后面
 67                 //分配内存,长度为*pindex-leftindex
 68                 pstr = (char *)calloc(*pindex - leftindex, sizeof(char));
 69                 //字符串拷贝,拷贝到‘)‘之前
 70                 strncpy(pstr, str + leftindex, *pindex - leftindex-1);
 71                 return pstr;
 72             }
 73             else
 74             {
 75                 num--;
 76             }
 77             break;
 78         }
 79         //往后移一位,如果没到结尾则继续
 80         (*pindex)++;
 81     } while (str[*pindex] != ‘\0‘);//(str[(*pindex)++] != ‘\0‘);//判断字符串有没有到结尾
 82 }
 83
 84 //获取数据
 85 double getnum(char *str, int *pindex)
 86 {
 87     //获取当前位置
 88     int id = *pindex;
 89     //存放结果
 90     double res = 0.0;
 91     //小数
 92     double xiaoshu = 0;
 93
 94     while (str[id] == ‘(‘)
 95     {
 96         char *psubstr = NULL;//取出字符串
 97         *pindex = ++id;//跳到括号后面
 98
 99         //获取从当前括号开始到下一个匹配的括号之间的数据
100         psubstr = kuohao(str, pindex);
101         //从截取的字符串中计算出数据
102         res = fenxi(psubstr);
103
104         //释放内存
105         free(psubstr);
106         psubstr == NULL;
107         //返回计算出的结果
108         return res;
109     }
110
111     //如果不是左括号,是数字则获取数据
112     while (isnum(str[id]))
113     {
114         res = res * 10 + str[id] - ‘0‘;
115         id++;
116     }
117
118     //小数处理
119     if (str[id] == ‘.‘)
120     {
121         id++;
122         int count = 0;
123
124         while (isnum(str[id]))
125         {
126             count++;
127             xiaoshu = xiaoshu * 10 + str[id] - ‘0‘;
128             id++;
129         }
130         xiaoshu = xiaoshu / pow(10, count);
131     }
132     //获得结果
133     res += xiaoshu;
134     //把数字后一位的位置赋给*pindex
135     *pindex = id;
136     return res;
137
138 }
139
140 //乘除法
141 double comfenxi(char *str, int *pindex)
142 {
143     double value = 0.0;
144     value = getnum(str, pindex);//获取第一个数据
145     while (1)
146     {
147         if (str[*pindex] == ‘*‘)
148         {
149             (*pindex)++;//下标移动
150             value *= getnum(str, pindex);
151         }
152         else if (str[*pindex] == ‘/‘)
153         {
154             (*pindex)++;//下标移动
155             value /= getnum(str, pindex);
156         }
157         else
158         {
159             break;
160         }
161     }
162
163     return value;
164 }
165
166 //运算处理
167 double fenxi(char *str)
168 {
169     double value = 0.0;
170     int index = 0;
171     value = comfenxi(str, &index);//获取第一个数据
172     while (1)
173     {
174         char ch = *(str + index);//取出字符
175         index++;
176         switch (ch)
177         {
178         case ‘\0‘:
179             return value;
180         case ‘+‘:
181             value += comfenxi(str, &index);
182             break;
183         case ‘-‘:
184             value -= comfenxi(str, &index);
185             break;
186         default:
187             break;
188         }
189     }
190 }
191
192 void main()
193 {
194     char str[1024] = { 0 };
195     scanf("%[^\n]", str);
196     //printf("要计算的是:%s\n", str);
197     deleteSpace(str);
198     /*printf("删除空格后:%s\n", str);
199
200     int index = 0;
201     double value = getnum(str, &index);
202     printf("第一个获取的数据%f", value);*/
203     printf("计算结果:%f\n", fenxi(str));
204
205     system("pause");
206 }

原文地址:https://www.cnblogs.com/xiaochi/p/8359469.html

时间: 2024-10-15 22:09:06

11.表达式计算对一串加减乘除带括号进行计算的相关文章

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

VLC接收网络串流缓冲时间的计算 (转)

原帖地址:http://blog.csdn.net/coroutines/article/details/7472743 VLC版本2.0.1 最近研究IP-STB音视频同步问题,发现方案自带的自动STC在网络延时过大时,不能成功同步音视频.在参考了VLC的串流播放机制后,以为适当缓冲可以解决此问题,可惜最终结果是稍有缓解,并不能从根本上解决.但这种缓冲时间的计算,对于基于网络这种音视频数据的注入有一定的参考意义. 1.最初的线索: 使用 -vvv 参数 启动VLC时,提示: 命令行启动vlc:

北美KubeCon新风,正把K8S魔力带向边缘计算

作者:DJ 审校:Kevin·Wang 1. 容器生态圈新的创新方向 2018年容器技术圈的年终盛典北美KubeCon终于在西雅图落下了帷幕.这次北美KubeCon总共吸引了8000多观众参会,创下历史新高.先放一张图来感受下现场的火爆程度. 关注Kubernetes的小伙伴应该已经感觉到了,与观众参会热情形成鲜明对比的是,这届KubeCon传递出了一个信号:针对Kubernetes本身的变化越来越少,我们也越来越难看到那些激动人心的大特性.Kubernetes正变得"无聊"已经成了一

科学计算器(可实现带括号的浮点数四则运算)

/* Name: 科学计算器(可实现带括号的浮点数四则运算) Copyright: Author: Date: 15-09-14 21:49 Description: 从文件读入计算表达式,将计算表达式转换为逆波兰表达式,然后计算出逆波兰表达式的值,最后输出答案. */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<math.h> #define MAXSIZE 200 vo

表达式求值(只包括小括号)

表达式求值 前缀式:就是将操作符放到数值的前面:如:a+b :  +ab: 中缀式:就是将操作符放在数值中间,其实就是我们平时生活中所写的正常的表达式.如:a+b: 后缀式:就是将操作符放在数值的后面,比如:a+b:——ab+. 对于表达式求值,最简单的当然是对后缀表达式(也称为逆波兰式)进行求值了. 而我们生活中所写的运算表达式,一般都是中缀表达式.但是我们计算的时候用到的却是后缀表达式.这就需要我们首先将中缀表达式转换为后缀表达式,然后再进行运算了. 1.中缀式转换为后缀式 下面是将中缀式(

集算器如何优化复杂报表计算(2)格式布局及过程计算

布局格式 横向分栏 大多数报表工具都支持纵向分栏,但几乎没有报表工具支持横向分栏,我们可以用集算器把数据集事先摆好. A B C 1 =db.query("select a,b,c from T ") 2 =A1.step(3,1) =A1.step(3,2)|[null] =A1.step(3,3)|[null] 3 =A2.derive(B2(#).a:a2,B2(#).b:b2,B2(#).c:c2,C2(#).a:a3,C2(#).b:b3,C2(#).c:c3) 这段代码将3

python装饰器带括号和不带括号的语法和用法

装饰器的写法补充: 通常装饰器的写法是@func(),而有的时候为了减少出错率,可能会写成@func,没有()括号,这时我们可以这样定义,来减少括号.下面通过两个例子还看. 一般装饰器的写法: 1 def log(func=None): 2 3 def inner(*args, **kwargs): 4 print('do something before') 5 res = func(*args, **kwargs) 6 print('do something after') 7 return

输入一个正数x和一个正整数n,求下列算式的值。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double

题目描述 输入一个正数x和一个正整数n,求下列算式的值.要求定义两个调用函数:fact(n)计算n的阶乘:mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double. x - x2/2! + x3/3! + ... + (-1)n-1xn/n! ×输出保留4位小数. 输入 x n 输出 数列和 样例输入 2.0 3 样例输出 1.3333 提示 无 来源 无 1 #include<stdio.h> 2 double fact(int); 3 double mypow(in

五一放假作业4.30 用正则表达式写一个计算器!去掉括号,计算式子结果!

作业要求:去掉括号,计算式子结果. 1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/4/30 7:44# @Author : Olivia Su# @File : 作业.py# @Softw