《C语言程序设计:问题与求解方法》——3.3节逐步求精的伪代码

关注
《C语言程序设计:问题与求解方法》——3.3节逐步求精的伪代码www.shan-machinery.com《C语言程序设计:问题与求解方法》——3.3节逐步求精的伪代码

华章计算机2017-08-011694浏览量

简介:

本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第3章,第3.3节逐步求精的伪代码,作者:何勤,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.3逐步求精的伪代码表示问题求解的算法有多种方法,其中最常用的是伪代码和流程图。流程图只适合解决规模较小的、比较简单的问题,虽然初学者易于理解和掌握,表达算法也比较清晰,但程序员和真正会编程者并不常使用这种方法—因为它不利于对算法的构思、修改和调整(仅适用于表达比较简单的算法),所以本书不作介绍。本书将使用逐步求精的伪代码来表示算法。所谓伪代码没有严格的规范(所以也比较灵活),但其中有一些结构要素,可以用一些比较规范的方式来表述对问题的计算和处理流程。一级算法只是解决问题的一个轮廓。对于某些复杂问题,只根据一级算法难以直接写出(C语言的)源程序。这时可对一级算法进一步细化(称为二级求精),将其中的某些步骤进一步扩展、细化,直到可以很容易写出(C语言)程序的语句时为止。对于某些人是很显然的算法描述,对于其他人可能并不显而易见。因此,算法求精的过程和步骤是因人而异的。编程经验越丰富,算法求精的步骤就可能越少。不过,算法求精的步骤太少也不一定是好事。因为程序员的一个良好习惯,就是把伪代码表示的一级算法(算法复杂,还可以到二级求精),转变为源程序中的注释。注释太过简洁,会加大自己和别人阅读程序的难度。逐步求精的伪代码的实质就是模仿人们在做一个大的任务时,首先将其粗分为几个一级任务,然后再分别考虑每个一级任务如何完成。不太明确的一级任务还要再细分为若干个二级任务,依此类推。学习用伪代码来表达自己的编程思路和算法时,要通过大量阅读代码和练习来模仿、领悟,看的和模仿的算法多了,慢慢就掌握了。【例题3.1】求三个数的和及平均值。(类型:必修题;趣味性:; 难度:)变量安排: 3个要输入的数用3个变量a1、a2、a3表示;三个数的和用1个变量sum表示;平均值用1个变量average表示;所有变量都用浮点类型定义。伪代码的一级算法:1 输入这三个数a1,a2,a3;2 求这三个数的和sum及平均值average;3 输出sum,average;其中第二步由于不能直接转化成语句而需要进一步求精。根据求和及求平均值的以下两个代数式:sum=a1+a2+a3average=sum÷3只需将其转化为赋值语句即可。第2步的二级求精:

2.1 sum=a1+a2+a3;/*求这三个数的和2.2 average=sum/3.0; /*求这三个数的平均值转化成C语言程序如下:/*求三个数的和及平均值*/1#include 2intmain(void)3{4floata1,a2,a3 ; /* 三个已知量,定义为浮点型变量*/5floatsum,average; / *两个未知量,定义为浮点型变量*/6/*输入这三个数a1,a2,a3*/7printf("请输入3个数,3个数之间用空格隔开\n");8scanf("%f%f%f",&a1,&a2,&a3); 9 10 /*求这三个数的和sum及平均值average*/11 sum = a1 + a2 + a3 ; 12 average = sum / 3.0 ; 13 14 /*输出sum,average*/15 printf("三数之和=%f ,平均值=%f \n",sum,average);16 return0;17}

注意:运行此程序时,用键盘输入三个数据给变量a1,a2,a3时,三个数据之间要用空格隔开。输完后,按下回车键,程序才会继续运行。【练习】输入两个数,求两数的平方和。提示:将伪代码形式的一级算法(有时还包括二级求精)转变为程序中的注释,可增加程序的可读性。这是一种良好的编程习惯。【例题3.2】鸡兔同笼问题。已知鸡和兔的总头数和总脚数,求鸡有多少只,兔有多少只。(类型:必修题;趣味性:*;难度:)伪代码的一级算法:1 输入总头数heads,总脚数feet2 求鸡的只数chicken和兔的只数rabbit3 输出变量chicken和rabbit的值其中只有第2步需要求精。根据二元一次方程组,可知四个变量heads、feet、chicken、rabbit之间的关系为

heads=chicken+rabbitfeet=2×chicken+4×rabbit解此方程组,可得到以下两个公式:chicken=(4×heads-feet)/2rabbit=(feet-2×heads)/2

将此公式转化为赋值语句,考虑到输入的总头数和总脚数不一定能得到整数解,因此将变量chicken(表示鸡的只数)、rabbit(表示兔的只数)定义为float 型变量。二级求精如下:

2.1chicken=(4*heads-feet)/2.02.2rabbit=(feet-2*heads)/2.0 转化为C语言程序如下:1#include2int main(void)3 {4intheads,feet; 5floatchicken,rabbit;6/*输入总头数heads,总脚数feet*/ 78printf("请输入总头数和总脚数,两数间用空格隔开\n"); 9scanf("%d%d",&heads,&feet);1011 /* 求鸡的只数chicken和兔的只数rabbit */1213 chicken=(4.0*heads-feet)/2.0;14 rabbit=(feet-2.0*heads)/2.0;15 /*输出变量chicken和rabbit的值1617printf("鸡的只数为:%f只,兔的只数为:%f只 \n ",chicken,rabbit);18return0;19}【问题】如果不解方程组,而直接将其转变为赋值语句,也就是用heads=chicken+rabbit;feet=2*chicken+4*rabbit;

取代第13行和第14行,结果会如何?答:赋值语句右边的表达式中出现的变量,必须是已经初始化了的变量。赋值语句是用赋值号右边的表达式求出的值,存放到赋值号左边的变量表示的存储单元中。所以,这两句是不正确的,但大多数编译程序不会报告出这类错误。程序运行时,会取用内存单元中变量chicken和rabbit中的不确定的值(垃圾数据)参与运算。经过运算得到两个错误数值,去改变变量heads和feet的原来正确值。换言之,数学中的方程式不能直接转变为赋值语句,只有公式才可以直接转变为赋值语句(所谓公式,是等号左边为一个要求值的变量,等号右边是一个数学代数式,数学代数式中出现的变量的值都是已知的)。

算法C语言

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:https://www.shan-machinery.com