C语言:(新)四则计算器(支持括号和次方运算)
来源:互联网 发布:上海雨人软件 编辑:程序博客网 时间:2024/05/29 02:52
之前已经写过一个计算器,每次回顾都觉得很复杂,一直在考虑重新写一个
支持小数运算
存储数据改为了double类型
支持整数次方
运算中乘法可以用x或者*表示,两个都支持
平台visual studio 2015
另外:输入的时候输入法最好是英文状态
这次的存储模式如下:
大概说一下计算流程:
1:将输入的文本提取出运算符,数字,次方和等级四类
2:每次运算找到当前的最高等级,先计算次方,再计算四则运算
3:计算结果覆盖至第二个aNum结构体的data,并废弃第一个结构体
4:2、3循环输入的公式拆分成data,oper(operator)和class三类 data:即为公式中的每个数字 oper:+-*/运算符
class:符号的运算等级(类似于优先级)讲一下我构造class的这个思路:
在括号外的公式中,+-的运算等级(class)为1,*/的运算等级为2
在括号内的公式中,+-对应等级为3(大于括号外的/等级),而/的等级为4在这次的计算中,我把计算单独拿了出来
函数:float compute(float num1, float num2, char opt)
一次只运算一对数字,而每对计算的先后顺序就根据class等级值每一个struct aNum用了链表来连接,利于计算后的数据处理
例:
3+5x(2+1)-7
第一次运算时,找到最高的class,即存储“data=2,oper=’+’,class=3”的struct,2+1=3,而当前struct就不能再留下了,此时就把结果3覆盖到下一个struct的data上,然后抛弃当前存储“data=2”的struct,即p_front->next=p->next;每次计算如此循环
#include <stdio.h>#include <stdlib.h>#include <math.h>#define INIT_STRING_SIZE 100#define True 1#define False 0int saved_class[4] = { 0, 0, 0, 0 };typedef struct aNum { double data; char oper; int dataClass; int power; struct aNum *next;}num;typedef struct { char *formula; int length;}string;void setNULL(char *num)//清空一个字符串{ int i = 0; while (i<5) { num[i] = NULL; ++i; }}int countOperators(string *input, int &counter)//processing step 1{//计算运算符个数 int i = 0; while (input->formula[i] != '\0') { switch (input->formula[i++]) { case '+': case '-': case '*': case '/':++counter; break; default:break; } ++input->length; } return 1;}int getData(string *input, num *nums)//processing step 2{//把数字,符号和class存入nums的结构体 int i = 0; //counter of input->formula int k = 0; //counter of temp; int power = 0; char temp[5]; int inBracket = False; num *p = nums; num *body; while (i <= input->length) { if ((input->formula[i]<'0' || input->formula[i]>'9')&&input->formula[i]!='.'&&input->formula[i]!='^') {//进入此处时数据已经收集完毕 if (input->formula[i] == '(') { inBracket = True; ++i; continue; } if (input->formula[i] == ')') { inBracket = False; ++i; continue; } body = (num *)calloc(1, sizeof(num)); body->data = atof(temp); //得到数字 setNULL(temp); //归零temp k = 0; switch (input->formula[i]) { case '+':body->dataClass = inBracket == False ? 1 : 3; //计算当前运算符的等级 ++saved_class[body->dataClass - 1]; //在等级数组里记录一次 body->oper = input->formula[i]; //得到运算符 break; case '-':body->dataClass = inBracket == False ? 1 : 3; ++saved_class[body->dataClass - 1]; body->oper = input->formula[i]; break; case 'x': case '*':body->dataClass = inBracket == False ? 2 : 4; ++saved_class[body->dataClass - 1]; body->oper = input->formula[i]; break; case '/':body->dataClass = inBracket == False ? 2 : 4; ++saved_class[body->dataClass - 1]; body->oper = input->formula[i]; break; default:break; } if (power != 0) { body->power = power; power = 0; } p->next = body; p = p->next; } else if (input->formula[i] == '^') { power = input->formula[++i] - 48; } else { temp[k++] = input->formula[i]; } ++i; } return 1;}double compute(double num1, double num2, char opt){//每次运算单独提取 double result; switch (opt) { case '-':result = num1 - num2; break; case '+':result = num1 + num2; break; case 'x': case '*':result = num1 * num2; break; case '/':result = num1 / num2; break; } return result;}int processingData(num *nums)//processing step 3{//nums作为头结点是没有数据的 int s = 3;//saved_class int i = 0; num *p = nums; num *p_front; while (saved_class[s] == 0&&s>0) --s; while (p->next->next != NULL)//class oper next 都可以 { if (p->next->dataClass != s + 1) { p = p->next; continue; } p_front = p; p = p->next;//p此时指向待计算的第一个struct aNUm if(p->power != 0) { p->data = pow(p->data, p->power); p->power = 0; } if (p->next->power != 0) { p->next->data = pow(p->next->data, p->next->power); p->next->power = 0; } p->next->data = compute(p->data, p->next->data, p->oper); p_front->next = p->next; free(p); --saved_class[s]; while (saved_class[s] == 0&&s!=0) --s; p = nums; } if (nums->next->power != 0)//处理单个数字输入的情况,比如2^2 { nums->next->data = pow(nums->next->data, nums->next->power); } printf("result=%lf", nums->next->data); return 1;}int main(){ int counter = 0; num *nums = NULL; string *input; input = (string *)calloc(1, sizeof(string)); input->formula = (char *)calloc(INIT_STRING_SIZE, sizeof(string)); puts("Input formula:"); scanf("%s", input->formula); //得到运算符和运算符个数 countOperators(input, counter); //根据运算符个数申请存储数字的空间 nums = (num *)calloc(1, sizeof(num)); //存储数字和运算符 getData(input, nums); processingData(nums); free(input->formula); free(input); free(nums->next); free(nums); system("pause"); return 0;}
测试数据不多,有错误欢迎指出^^
- C语言:(新)四则计算器(支持括号和次方运算)
- 【C语言】计算器(支持括号和长式子)
- 【汇编】计算器,支持带括号的四则混合运算
- 一个非常酷的Js计算器(加减乘除,浮点,以及括号运算,四则混合运算)
- C++实现计算器(四则混合运算)
- C语言实现计算器(包含加减乘除和括号)
- C语言编辑计算器(含括号)
- N 位四则算式计算器(小数和多层括号嵌套)
- 用C实现一个计算器(带小数点和括号以及运算优先级)
- 简易计算器(3)- 扩展(支持括号和负数)
- C/C++ 算法 中缀转后缀表达式实现3---实现加减乘除四则算数(包括浮点数运算,包括括号)
- C#实现计算器,支持括号运算
- C语言实现四则混合运算
- 我的计算器(c语言版)支持多种运算
- C语言中的次方运算
- 计算器,现在仅支持正负号、加减乘除、次方和模运算。
- 使用C语言与栈实现简单多则运算计算器(包括括号优先级运算)
- C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)
- Eclipse的使用
- CharSequence接口的实现类
- LinuxC编程
- 网站爬取
- yii2.0报的js冲突的错
- C语言:(新)四则计算器(支持括号和次方运算)
- ACM训练半周总结—10月26
- 内存泄漏
- [刷题]HDU3157
- TensorFlow 全连接网络实现
- CentOS 7搭建VPN虚拟局域网服务器
- Priority Queues
- 中介者模式学习和思考
- HTML插入图片存储路径问题