1. 目标:输入像(1+2*(3-4))/5+6=这样的计算式,程序可以识别并且得出最终结果。
  2. 思路:将计算式子存在一个数组里,然后进行有限次化简直至得出最简形式(一个值)。要化简的形式分为两种:
    1. 长式子的化简:即连续运算,比如:1+2+3
    2. 多余括号的化简:即这种形式:(数值),比如(1)+2,就变成1+2。
  3. 进程:已完成,未成功。由于发现了一个底层的问题,改动量太大,并且空闲时间不够了,所以放弃。
  4. 程序的问题:使用了char数组来存放计算式,而计算出非整数的时候,是无法储存的。用string数组也许可以解决这个问题。
  5. 收获:
    1. 技术上:

      1. 提醒了自己把int赋给char之后,再直接转型,即(int)char,得到的是原int的ASCII码。
      2. 对于数值的判断和在类型上的转换,活用ASCII码有时候比寻找各种冷门函数好。
    2. 思路上:没有完全落实结构化编程的思想(自顶向下;逐步细化;模块化设计;结构化编码),还是“脚踩西瓜皮,滑倒哪算哪”。用于在草稿纸上画思维导图、整理思路的时间太少了(比如:对于变量:哪些放在全局、哪些放在部分,如何命名以获得形式上的统一;对于功能:划分成哪几块、划分要细致到什么程度;对于进度的安排:编写程序的顺序是什么(如果有一个好的顺序,就可以边写边测,不会导致全部写完才能第一次测试,结果发现一开头就写错了)),导致后期要频繁更改前期的代码。事实上,最后放弃这个程序的原因,就是最前期的东西出错了。

以下是源代码:(编译器:VS 2017)

// 计算器支持括号.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"char    allChar[100];
char    ch;
int     lenth = 0;int main()
{void    newCalculate();newCalculate();return 0;
}double  operateBasic(double x,double y,char ch) {//基本的四则运算double result;switch (ch){case '+':   result = x + y; break;case '-':   result = x - y; break;case '*':   result = x * y; break;case '/':   result = x / y; break;default:printf("Error!\n");}return char(int(result+48));
}void    newCalculate() {//一次新的计算int     getLenth();double  operatePro();char    ch;int     i=0;printf("Please put in your algebraic expression (End with '='):\n");//system("pause");while ((ch=getchar())!='\n'){allChar[i] = ch;i++;}lenth = getLenth();//system("pause");//调试:/*for (int i = 0; i < 5; i++){printf("%c", allChar[i]);}*/operatePro();
}double  operatePro() {//核心计算void    Simple_Sign();void    Simple_LongExpression();char    result;while (allChar[1]!='=')//即,代数式没有化到最简的形式(“数字”+“=”){   Simple_LongExpression();}result = allChar[0];printf("\nThe result of your algebraic expression is:%c\n", result);system("pause");return result;
}void    Simple_Sign() {//去掉 多余的括号【当出现这样的形式时,视为多余:(1)】,以及运算过程里出现的“#”void    operateDelete(int point);int     getLenth();for (int i = 0; i < lenth ; i++) {if (allChar[i] == '#')operateDelete(i);}for (int i = 0; i < lenth ; i++){if (allChar[i] == '(' && (int)allChar[i + 1] >= 48 && (int)allChar[i + 1] <= 57 && allChar[i + 2] == ')') {operateDelete(i);operateDelete(i + 1);//不是(i+2)  因为operateDelete(i)之后,已经往前一位了}}}void    Simple_LongExpression() {//去掉多余的括号,以及运算过程里出现的#;化简长计算式double  operateBasic(double x, double y, char ch);void    Simple_Sign();int     getLenth();for (int i = 0; i < lenth ; i++){//先乘除if (//(int)allChar[i] >= 48 && (int)allChar[i] <= 57 && (int)allChar[i+2] >= 48 && (int)allChar[i+2] <= 57 && ((int)allChar[i + 1]==42 || (int)allChar[i + 1]==47 && allChar[i] != 42 && allChar[i] != 47 && allChar[i + 2] != 42 && allChar[i + 2] != 47)) {allChar[i] = operateBasic((double)allChar[i] - 48, (double)allChar[i + 2] - 48, allChar[i + 1]);allChar[i + 1] = allChar[i + 2] = '#';Simple_Sign();}//后加减if (//(int)allChar[i] >= 48 && (int)allChar[i] <= 57 && (int)allChar[i + 2] >= 48 && (int)allChar[i + 2] <= 57 && ((int)allChar[i + 1] == 43 || (int)allChar[i + 1] == 45) && allChar[i]!=43 && allChar[i] != 45 && allChar[i+2]!=43 && allChar[i + 2] != 45) {allChar[i] = operateBasic((double)allChar[i] - 48, (double)allChar[i + 2] - 48, allChar[i + 1]);allChar[i + 1] = allChar[i + 2] = '#';Simple_Sign();}}
}int     getLenth() {//获得数组有效长度for (int i = 0; i < 100; i++) {if (allChar[i] == '=') {lenth = i;break;}}return lenth;
}void    operateDelete(int point){//去杂int getLenth();for (int i = point; i < lenth ; i++) {allChar[i] = allChar[i + 1];}
}

【C语言】计算器(支持括号和长式子)相关推荐

  1. c语言遇到非法字符,98行的四则计算器.(支持括号)加入了非法字符的检测

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include double s2n(char **tem)//字符串转为数字 { double tem_s=ato ...

  2. c语言非法字符有哪些,98行的四则计算器.(支持括号)加入了非法字符的检测

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include double s2n(char **tem)//字符串转为数字 { double tem_s=ato ...

  3. c语言非法字符判别,98行的四则计算器.(支持括号)加入了非法字符的检测

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include double s2n(char **tem)//字符串转为数字 { double tem_s=ato ...

  4. c语言非法字符空格,98行的四则计算器.(支持括号)加入了非法字符的检测

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include double s2n(char **tem)//字符串转为数字 { double tem_s=ato ...

  5. c 语言计算器带括号优先级,C++结合QT实现带有优先级的计算器功能

    代码 MyCalculator.h #pragma once #include #include #include #include "ui_MyCalculator.h" cla ...

  6. Java实现图形化计算器(支持括号、开平方)

    Java实现图形化计算器(支持括号.开平方) Java实习作业,实现一个图形化计算器,正好赶上周末作业不多就写了一个计算器.功能不是特别全,但是能满足一些最基本的需求(比如小学三年级及以下的数学题,, ...

  7. java语言计算器怎么写_求助,一个计算器的括号功能怎么写啊。

    求助,一个计算器的括号功能怎么写啊. import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java. ...

  8. web加减乘除法c#_c#实战  计算器(支持加减乘除括号的混合计算)

    c#计算器 支持 -*/()的混合运算 对负号不支持. 原理:将点击的按钮赋给inputStr 然后对inputStr分析.计算.看懂代码的重要前提是你有一定的算法基础 前缀.中缀.后缀表达式 和数据 ...

  9. python语言不支持面向对象_Python 面向对象(初级篇)

    概述面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向 ...

最新文章

  1. 跨进程通信,到底用长连接还是短连接
  2. 人脸检测对齐--Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
  3. 物联网成果初显但瓶颈犹存
  4. android文件存储token,ANDROID 学习笔记(二) 用户登陆问题 TOKEN SESSION 缓存
  5. Python入门记录
  6. MATLAB调试caffe,在MATLAB下调试Caffe
  7. SpringBoot @Async加在实现接口类的非接口方法上获取Bean异常
  8. JavaScript中带示例的String repeat()方法
  9. c语言 指针_初识C语言指针
  10. jdbc postgresql mysql_mysql改为postgresql 语法常见问题
  11. js实现可拖拽的div
  12. Linux99问,适合新手!
  13. 泛微为芯片行业搭建数字化平台:研发、生产、销售、文档一体管理
  14. 电赛专题 |国一作品_线路负载及故障检测装置
  15. PID控制及温度调节程序举例
  16. html5人脸拼图,layout拼图
  17. Java继承同时实现接口 以及继承方法的使用
  18. 【汇正财经】什么是金融股?
  19. mysql 数据库中将中文转化为拼音
  20. javascript实现下拉框表单美化的详细实例教程

热门文章

  1. 配置最新版LAMP环境
  2. php中的 session_start()是做什么的?
  3. PADS VX2.8 测量工具的使用方法
  4. c语言检测HDMI热插拔,玩转HDMI2.1 源端测试之【入门基础篇】
  5. 企业在开发源码商城系统的时候,需要注意些什么呢?
  6. xshell如何连接阿里云
  7. 如何用计算机的功能键,电脑F键怎么用 如何进行f1到f12的功能键切换 - 驱动管家...
  8. FastApi-19-Token校验
  9. CMSIS-RTOS RTX实时操作系统介绍
  10. ACM在线模板(收藏贴)