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

来源:互联网 发布:arcgis软件介绍 编辑:程序博客网 时间:2024/06/08 22:56
  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];    }}
阅读全文
0 0