何为编程思想?

编程其实就是计算机在用它自己的方式模拟人类解决问题的行为。

编程思想,说起来可能很玄乎,但是其思维方式可以与人类思维方式映照,只是计算机和人类的的处理和实现方式不同。

下面就以一个很经典的例子,为大家映照人类思维和编程思维,以此来深刻的理解何为编程思维,何为基础的程序设计?

简单计算器

需求:类似手机上的计算器,输入一串数字和加减乘除(不能有括号),得出结果;

如:

1.589*5/2-5.4+2.77/8*5+56/8+41;

首先,人类思维会怎么去计算

先算乘除,将乘除后的结果再去进行加减。

这句话看起来貌似很简单,但是你知道我们的大脑和器官做了哪些复杂的工作吗?我想很多人从来没有思考过,因为我们通过长期的训练已经习以为然了。

我们来将这个过程放慢分解:

印证编程思维

编程思维就是依照人类解决问题的过程,用代码的方式将之固化为程序,使之适合该场景所有问题。

接下来,我们看两者如何印证:

第一部分--提取乘除法

首先,我们在拿到一个这样的题目的时候,我们需要用眼睛从左至右去扫一遍。扫描的目的是什么?

自然是为了遵循先乘除后加减的原则,那么我们就需要将有乘除的子算式提出取来。

人类自然很好提取,因为我们认识+和-号,通过+和-号很轻易就能提取出来。

对于计算机,同样,它也是通过识别+和-号,然后将带乘除的子算式提取出来。

那么这里就需要用到编程的两个思想:

1、循环:因为我们需要从左至右一个一个的遍历,让计算机找到+号和-号2、分支:也即是判断,利用表达式返回的true或false结果来判断哪里是+号和-号

那么,此时问题来了,提取出来的块怎么处理呢?加减符号怎么处理呢?

如果,是心算的话,那么你是不是记在心里啊,纸算的话,是不是需要用纸写下来?我么用()好区分

(1.589*5/2)-(5.4)+(2.77/8*5)+(56/8)+(41)

那么,计算机怎么办呢?它当然也是“记下来”,但是,它记的方式是存储起来。我们可以用变量来存,但是还记得我之前的课讲过的么?

这种情况,肯定是数组更合适,因为第一,变量个数不确定,第二,单个变量计算起来很麻烦。这里用到C++的STL容器Vector,如果大家用其他编程语言,可以用Array、List等动态数组

第一部分提取部分,代码实现就是(C++版本):

这里用到了C++字符串的迭代器,其实就是循环,大家将它当成普通for循环就行,为的是一个一个字符的遍历。其他高级语言也有遍历,一般是foreach,初学可以用for循环;

第二部分--计算乘除法

接下来就是第二部分了,计算乘除法。怎么计算呢?

人类在处理的时候,是一个一个块计算。那么一个块中有多个乘除法,如:1.589*5/2怎么办呢?

人类是这样处理:

1.589*5/2= (1.589*5)/2= 7.945/2=3.9725

按顺序从左往右一个一个乘除法处理。在这个过程中,人类的大脑做了什么?

首先,人类大脑需要辨认数字和乘除符号,然后将两个数字进行符号的运算;

那么,程序如何处理呢?有了上面的经验,我们是不是又需要遍历每个乘除法子算式呢?然后类似人类,需要将每个子算式的结果记录下来,到最后进行加减?

同样,程序处理的时候。

处理每个子算式的时候:首先需要将子算式中的数字提取出来;其次让程序辨别两个数字之间是何种运算符,针对不同的运算符采取不同的算法;最后利用循环,将每个子算式都按照上述过程处理,然后分别将每个子算式的计算结果“记下来”--存下来

代码实现:

第二部分--计算加减法

最后,将每个乘除法子算式的结果计算加减。

人类计算的时候,拿纸算为例。在算乘除的时候,加减符号是一直照写下来的。而我们程序呢?是不是参照这种方式,也先”记下来“。这里我用一个数组存储起来了,此时拿出来用就可以了;

最后的加减处理很简单了,只需要对+和-符号进行判断,然后分别采取不同的算法就行:

总结:

其实程序设计就是人脑思考的过程。

只不过,人脑执行的识别和判断,在程序中是if-else或者switch结合一个返回0和1的表达式来判断。

而程序中设计的数据,人类可以靠脑子或者纸笔记的方式记录,而在程序中需要通过变量或者数组等方式存储;

在程序设计过程中,对于重复性的过程,通过循环来解决,而这人脑做不到的;

【这也印证了小编之前一篇文章讲到的,编程其实就是在玩数据,数据存储、数据运算、数据判断;】

题外重点:

完成上面的部分,我们知识完成了程序设计时的一部分工作。我前面说过,程序设计是为了将人类在解决某问题时的过程程序化出来。但是,如果单纯只是计算文章开头提到的算式,这个程序肯定没问题。但是我们的程序设计出来是为了处理所有类似的问题,需要考虑各种情况以及可能出现的异常。

例如,假设算式首位出现“-”,这个代码会不会出错?该怎么处理呢?

-1.589*5/2-5.4+2.77/8*5+56/8+41;

这个问题,交给各位同学去思考。其实处理方法很简单;

提示两点,如果按照上面的方法至少会出现以下问题:

第一:首个乘除法块的结果正负刚好反了第二:数组会出现越界

关于程序异常处理,在程序设计中是除业务逻辑外最重要的一块,后续会专门有一节内容

完整源代码:

最后附上完整源代码:

//需要计算的算式string cal_str = "1.589*5/2-5.4+2.77/8*5+56/8+41" ;//利用string的迭代器,可以从左自右遍历字符串auto iteral = cal_str.begin();//存储被加减符号分隔出来的乘除部分vector mulAndDiv_combine;//存储加减符号vector plusAndMinus_mark ;//提取带乘除法string temp("") ;for (iteral; iteral != cal_str.end(); iteral++ ){if(*iteral != '+' && *iteral != '-' )temp += *iteral ;else{mulAndDiv_combine.push_back(temp);temp.clear();plusAndMinus_mark.push_back(*iteral) ;}if(iteral == --cal_str.end())mulAndDiv_combine.push_back(temp);}if(!cal_str.empty() && mulAndDiv_combine.empty())mulAndDiv_combine.push_back(temp);//处理乘法for (int i = 0; i < mulAndDiv_combine.size(); i++){vector number;vector mulAndDiv_marke ;temp.clear();for (iteral = mulAndDiv_combine[i].begin() ; iteral != mulAndDiv_combine[i].end(); iteral++ ){if(*iteral != '*' && *iteral != '/')temp += *iteral ;else{number.push_back(atof(temp.c_str()));temp.clear();mulAndDiv_marke.push_back(*iteral) ;}if(iteral == --mulAndDiv_combine[i].end())number.push_back(atof(temp.c_str()));}if(!mulAndDiv_combine[i].empty()&&number.empty())number.push_back(atof(temp.c_str()));double sum = number[0] ;for (int i = 0; i < mulAndDiv_marke.size(); i++){switch (mulAndDiv_marke[i]){case 42 : sum *= number[i+1];break ;case 47 : sum /= number[i+1];break ;default:break;}}mulAndDiv_combine[i] = to_string(sum) ;}//处理加减double sum = atof(mulAndDiv_combine[0].c_str()) ;for (int i = 0; i < plusAndMinus_mark.size(); i++){switch (plusAndMinus_mark[i]){case 43 : sum +=atof(mulAndDiv_combine[i+1].c_str());break ;case 45 : sum -= atof(mulAndDiv_combine[i+1].c_str());break ;default:break;}}

举报/反馈

手把手教计算机编程,手把手教你实现iphone计算器,原来这就是编程思维,懂了!...相关推荐

  1. iphone计算机e9,你可能不知道,iPhone 计算器原来这么好用|有轻功

    手机中的计算器是我们经常用到的工具,虽然它看上去很简单,毫不起眼,实则暗藏玄机.掌握 iPhone 计算器的这些技巧,可以让你在做加减乘除时更得心应手. 删除单个数字 很多人会抱怨 iPhone 的计 ...

  2. 手把手教你如何使用Multisim对Digilent FPGA开发板进行编程

    1.jpg (43.84 KB, 下载次数: 0) 下载附件 2017-6-1 20:03 上传 FPGA正在逐渐成为EECS专业的同学们在校期间学习掌握的一项必备技能.无论是在课程实验.竞赛作品.科 ...

  3. 【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC

    STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC 一 .I2C物理层 二.协议层 1.I2C基本读写过程 (1)主机写数据到从机 (2)主机由从机中读数据 (3)I2C 通讯复合 ...

  4. 西蒙说游戏 计算机,编程课不用电脑?因为芬兰教师将编程当做一种思想来教...

    教室里,老师正领着学生们做"西蒙说"游戏-- 老师与学生们面对面站立,每个学生都全神贯注地等待着老师的指令."西蒙说,7 !"听到指令后,学生们迅速地坐到了地上 ...

  5. 手把手,嘴对嘴教你Spring Cloud 微服务实战 -- 前言

    Spring Cloud 总结 博主接触到Spring Cloud 大概已经一年多了,当时Spring Cloud微服务框架已经是潮流了,不会一点都不好意思出去面试.并且主流技术基本上都在谈论微服务, ...

  6. 计算机图形及分类的相关知识,“计算机图形学”课程教与学

    摘 要:本文针对作者几年来在"计算机图形学"课程教学过程中实际遇到的问题,从教师如何教授知识和学生如何学习知识两个方面进行深入分析和研究,提出了改进课堂教学.实验教学以及学生学习的 ...

  7. 对于计算机专业英语的问题,计算机专业英语教与学的探讨

    第25卷第5期 V ol 125 N o 15长春师范学院学报(自然科学版)Journal of Changchun N ormal Un iv ersity (N atural Science )2 ...

  8. 利用BP神经网络教计算机进行非线函数拟合

    利用BP神经网络教计算机进行非线函数拟合 本图文已经更新,详细地址如下: http://blog.csdn.net/lsgo_myp/article/details/54425751

  9. 利用BP神经网络教计算机进行非线函数拟合(代码部分多层)

    利用BP神经网络教计算机进行非线函数拟合(代码部分多层) 本图文已经更新,详细地址如下: http://blog.csdn.net/lsgo_myp/article/details/54425751

  10. 计算机考试用远程桌面,职称计算机考试:教你体验XP远程桌面多用户登录

    Windows XP的"远程桌面"功能有一个缺憾,如果已经有用户在本地登录,那么则无法使用远程桌面继续登录.那么有什么好办法可以让本地和远程用户同时登录并使用计算机呢?只要你将其升 ...

最新文章

  1. python中是干嘛的-python是做什么的,新手必看哦!
  2. leetcode 58. Length of Last Word 题解【C++/Java/Python/JS】
  3. 自定义SpringBoot项目的Maven原型
  4. 线性代数(矩阵、高斯、线性基……)
  5. php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序
  6. php mysql 线程安全_PHP 线程安全与非线程安全版本的区别深入解析
  7. 简单稳压电源的瞬态分析
  8. 实战build-react(二)-------引入Ant Design(增加)
  9. React Native 运行环境安装:0.6以下/以上版本的 新老项目 都适用
  10. 1688API接口,item_get_app - 获取1688app上原数据
  11. 现代办公自动化教程 计算机基础教育系列,新编办公自动化综合应用教程 高职计算机大类专业基础课 林婧 朱强第1章 现代办公自动化基础.ppt...
  12. ERStudio 安装
  13. 用 Node JS 看糗百段子
  14. 工作流系列(4.1)-Activity表结构介绍
  15. 共射级三极管放大电路与其饱和失真与截止失真的分析
  16. 程序设计方法学作业—三天打渔两天晒网程序设计
  17. 【2023】浙江大学计算机考研信息汇总
  18. 解决(Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:ins)
  19. 障碍期权定价 python_Python王牌加速库2:深度学习下的障碍期权定价
  20. 多视图立体视觉:从几何到学习 (PAMI2022, IJCV2022)

热门文章

  1. redis批量删除key值
  2. 物理环境与网络通信安全
  3. 全球及中国维生素糖果行业销售现状及需求规模调查报告2021年版
  4. [源码和文档分享]基于HTML5实现的消灭星星小游戏
  5. Vuex中的Module
  6. 外贸好用的CRM软件推荐
  7. Go语言中的打包和工具链
  8. 快商通设置发送预约卡
  9. ntp symmetric_Python使用示例设置symmetric_difference_update()方法
  10. 知晓云 php,用云函数快速实现图片爬虫