第2章 程序的灵魂-算法
前面的话:
这是给几个高中的兴趣班讲解谭浩强的《C程序设计》第三版的讲义之节选,实际讲解时使用了10个道具盒子演示计算过程。另外,例子的解释选取了2.1、2.3、2.4这3个比较典型的,最后用谭浩强先生书上的几个简单的例子给出了关于什么是结构化的程序设计方法的解释
例2.1
例2.3
去掉了s2后,算法的功能保持不变哦!!!!!!!
例2.4
面向过程的结构化程序设计的一般性解题方法:
假想现在你是一个老师,希望让你的小学学生为你完成一个题目的计算,但是, 并不想告诉他解决的是什么问题,你,可以把题目分解成简单到只有+ - x / 步骤的命令表,让他照表上的命令从头到尾执行完,把结果给你。这时,他并不知道这个命令表的目的,但你的结果拿到了。。。。。,这就是程序设计。
给编程序打个比方:
一个只会加减乘除的小学生,现在你要让他帮助你求某些数字的最大公约数.
有几种办法可选
1.教会他求最大公约数的方法
2.把求解方法分解成他现在就能马上能计算的若干步,让他按照步骤作,不用告他在求解什么,只要正确的按步骤求解出结果就可以了.
显然,方法2这个小学生更容易上手.
对于机器而言,你只能选择方法2,因此,在让机器运算以前,你必须对计算的每一步十分了解,并确保正确,因此,你必须首先具体到机器能理解的每一步,这也是学习程序设计方法的精髓所在.........
电脑就是机器,它的智力并不能理解上面求某些数字的最大公约数的例子,同时也不会理解诸如: 给出一个百分制成绩,要求输出成绩等级,A,B,C,D,E. 90以上为A,80-89为B,70-79为C,60-69为D,60以下为E的问题。。。。。。,但是我们可以将求解的过程分解成它能理解并执行的+、-、X、/、比大小等命令的列表,如何分解成这样的列表呢?
看一下下面给成绩分级的例子,求解它的机器命令列表生成的全过程。
例子: 给出一个百分制成绩score,要求输出成绩等级,A,B,C,D,E. 90以上为A,80-89为B,70-79为C,60-69为D,60以下为E.
1、 好,现在,我给你一个分数95 ,你能判断的出他的成绩等级吗? 当然 ,是A。
2、 好,现在,我给你一个分数85 ,你能判断的出他的成绩等级吗? 当然 ,是B。
3、 好,现在,我给你任一个分数 ,你能判断的出他的成绩等级,并写在黑板上吗? 当然,那么,告诉我你是如何做的?
你会,这样描述给我:
设,有一个分数变量
当给定此变量一个百分制分数时
如果 分数<=100 同时 分数>=90 写下 A
否则 如果 分数>=80 写下 B
否则 如果 分数>=70 写下 C
否则 如果 分数>=60 写下 D
否则 如果 分数>=0 写下 E
否则 写下 给错分数了
4、 好,现在把上面的这段话翻译成英文:
float score
input a float data -----> score
if score<=100 and score>=90 then write A
else if score>=80 then write B
else if score>=70 then write C
else if score>=60 then write D
else if score>=0 then write E
else write down "input data Error!!!!!!!!!!!"
这个时候的表达,已经很接近计算机可以理解的C程序了(毕竟计算机是起源于美国,他能理解的东西更接近英语)。
5、由于计算机C语言的write是printf,因此继续进行语法规范如下:
float score; /*设有一个变量score*/
scanf("%f",&score); /*给出一个百分制成绩score的值*/
if (score<=100&&score>=90) printf("A");
else if (score>=80) printf("B");
else if (score>=70) printf("C");
else if (score>=60) printf("D");
else if (score>=60) printf("D");
else if (score>=0) printf("E");
else printf("input data Error!!!!!!!!!!!");/* 输入数据错误>100或<0 */
这个时候的表达,已经是计算机可以理解的C程序了。
6、在加上计算机可理解的简单程序所须的格式:
开头是: #include<stdio.h>
void main(){
结尾是: }
最终程序如下:
#include<stdio.h>
void main(){
float score; /*设有一个变量score*/
scanf("%f",&score); /*给出一个百分制成绩score的值*/
if (score<=100&&score>=90) printf("A");
else if (score>=80) printf("B");
else if (score>=70) printf("C");
else if (score>=60) printf("D");
else if (score>=60) printf("D");
else if (score>=0) printf("E");
else printf("input data Error!!!!!!!!!!!");/* 输入数据错误>100或<0 */
}
最终的程序完成了,这就是计算机可以理解的命令列表-------程序,其中只含有计算机可以理解执行的简单的命令。
从上面可以得出计算机程序设计的一般性的编程解题方法:
1、你自己先解题目,就象上面的1、2步。
这个步骤达到的目的是:让你充分的了解题目,也就是对它的求解过程的全面接触
2、 记录下你解决问题的过程的每一步并整理,就象上例中的第3步(最重要的步骤)
尽量只使用 + - x / 和比较大小以及所需数据的输入和输出命令。
这个步骤达到了一个重要的目的:
你写下的解题步骤,交给任何一个识字并且会比大小的人,比如一个小学生,他不理解这些步骤的最终目的,但是只要严格按照步骤进行,就能得出正确的最后结果。
3、接下来的第4、5、6步,就是翻译成英语和规范成C语言了。
注意:绿色的大大的过程两个字,传达了一个信息,编制程序的出发点和目标就是发现并记录下你自己在解决问题时采用的步骤的全部,即解决问题的全过程,对编程序再次做一个简单的比喻:你见过摆骨牌的吗?设定好全部前后顺序,然后推倒第一个骨牌, 你就不用管了,剩下的事情它自己完成,编程序就象是从头到尾摆骨牌。执行程序就象是推倒第一个骨牌,而程序就象是骨牌倒下的全过程,结果就是最后呈现在你面前的骨牌图案。计算机的智能是极其有限的,各种程序就是我们人的思想在计算机中的再现,这种再现能指挥计算机工作。你的任务就是再现要完成的任务的全部过程。
因此我们编制小型程序就是在寻找这个过程,找到了它,你的任务也就差不多完成了,这就叫面向过程。
作者:
RDIF
出处:
http://www.cnblogs.com/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手机号)
框架官网:
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.cnblogs.com/huyong
国思RDIF开发框架
,
给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。
关于作者:系统架构师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于
RDIF
框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。
如有问题或建议,请多多赐教!
本文版权归作者和CNBLOGS博客共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过微信、邮箱、QQ等联系我,非常感谢。