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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值