【C语言】计算器(支持括号和长式子)
来源:互联网 发布:arcgis软件介绍 编辑:程序博客网 时间:2024/06/08 22:56
- 目标:输入像(1+2*(3-4))/5+6=这样的计算式,程序可以识别并且得出最终结果。
- 思路:将计算式子存在一个数组里,然后进行有限次化简直至得出最简形式(一个值)。要化简的形式分为两种:
- 长式子的化简:即连续运算,比如:1+2+3
- 多余括号的化简:即这种形式:(数值),比如(1)+2,就变成1+2。
- 进程:已完成,未成功。由于发现了一个底层的问题,改动量太大,并且空闲时间不够了,所以放弃。
- 程序的问题:使用了char数组来存放计算式,而计算出非整数的时候,是无法储存的。用string数组也许可以解决这个问题。
- 收获:
- 技术上:
- 提醒了自己把int赋给char之后,再直接转型,即(int)char,得到的是原int的ASCII码。
- 对于数值的判断和在类型上的转换,活用ASCII码有时候比寻找各种冷门函数好。
- 思路上:没有完全落实结构化编程的思想(自顶向下;逐步细化;模块化设计;结构化编码),还是“脚踩西瓜皮,滑倒哪算哪”。用于在草稿纸上画思维导图、整理思路的时间太少了(比如:对于变量:哪些放在全局、哪些放在部分,如何命名以获得形式上的统一;对于功能:划分成哪几块、划分要细致到什么程度;对于进度的安排:编写程序的顺序是什么(如果有一个好的顺序,就可以边写边测,不会导致全部写完才能第一次测试,结果发现一开头就写错了)),导致后期要频繁更改前期的代码。事实上,最后放弃这个程序的原因,就是最前期的东西出错了。
- 技术上:
以下是源代码:(编译器: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
- 【C语言】计算器(支持括号和长式子)
- C语言:(新)四则计算器(支持括号和次方运算)
- C语言实现计算器(包含加减乘除和括号)
- C语言编辑计算器(含括号)
- 简易计算器(3)- 扩展(支持括号和负数)
- c/c++表达式求值,即包含加减乘除以及括号的式子(栈)
- 用C实现一个计算器(带小数点和括号以及运算优先级)
- 无括号的计算器(int)和有括号的计算器(int)
- 计算器程序代码(C语言)
- c语言计算器(源代码)
- C#实现计算器,支持括号运算
- 关于括号式子的计数
- C语言的整型和长整型的字节长
- C语言的整型和长整型的字节长
- C语言的整型和长整型的字节长
- 使用C语言与栈实现简单多则运算计算器(包括括号优先级运算)
- C语言实现表达式求值,支持+、-、*、/四则运算,并且支持多级括号,自定义了栈的操作。
- (C语言)括号匹配问题
- Android系统源码下载地址
- springmvc异常统一处理
- 图论软件第一堂课
- 几个特殊字符在String中的转义表达式
- leetcode 2|455. Add Two Numbers 1|2
- 【C语言】计算器(支持括号和长式子)
- Git学习笔记—基本命令及用法
- [Machine Learning & Algorithm] 随机森林(Random Forest)
- 1001. A+B Format (20)
- 丑数(数组)
- 蓝桥杯 基础练习 杨辉三角形
- Android初始篇五 Android四大组件之Intent和Content Provider
- 基于IP进行短信防护
- ubuntu 启动linux arm