手把手教你实现iphone计算器,原来这就是编程思维,懂了! 您所在的位置:网站首页 算式计算器 手把手教你实现iphone计算器,原来这就是编程思维,懂了!

手把手教你实现iphone计算器,原来这就是编程思维,懂了!

2023-03-30 22:17| 来源: 网络整理| 查看: 265

0 分享至

用微信扫码二维码

分享至好友和朋友圈

何为编程思想?编程其实就是计算机在用它自己的方式模拟人类解决问题的行为。编程思想,说起来可能很玄乎,但是其思维方式可以与人类思维方式映照,只是计算机和人类的的处理和实现方式不同。下面就以一个很经典的例子,为大家映照人类思维和编程思维,以此来深刻的理解何为编程思维,何为基础的程序设计?

简单计算器需求:类似手机上的计算器,输入一串数字和加减乘除(不能有括号),得出结果;如: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;这个问题,交给各位同学去思考。其实处理方法很简单;提示两点,如果按照上面的方法至少会出现以下问题:第一:首个乘除法块的结果正负刚好反了第二:数组会出现越界关于程序异常处理,在程序设计中是除业务逻辑外最重要的一块,后续会专门有一节内容完整源代码:最后附上完整源代码://需要计算的算式stringcal_str=1.589*5/2-5.4 2.77/8*5 56/8 41;//利用string的迭代器,可以从左自右遍历字符串autoiteral=cal_str.begin();//存储被加减符号分隔出来的乘除部分vectorstringmulAndDiv_combine;//存储加减符号vectorcharplusAndMinus_mark;//提取带乘除法stringtemp();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(inti=0;imulAndDiv_combine.size();i ){vectordoublenumber;vectorcharmulAndDiv_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()));doublesum=number[0];for(inti=0;imulAndDiv_marke.size();i ){switch(mulAndDiv_marke[i]){case42:sum*=number[i 1];break;case47:sum/=number[i 1];break;default:break;}}mulAndDiv_combine[i]=to_string(sum);}//处理加减doublesum=atof(mulAndDiv_combine[0].c_str());for(inti=0;iplusAndMinus_mark.size();i ){switch(plusAndMinus_mark[i]){case43:sum =atof(mulAndDiv_combine[i 1].c_str());break;case45:sum-=atof(mulAndDiv_combine[i 1].c_str());break;default:break;}}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

/阅读下一篇/ 返回网易首页 下载网易新闻客户端


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有