谭浩强 《C程序设计》(第五版)第二章
这一部分学习的是算法,在我看来算法是一个非常重要的东西,他可以帮助我们在写程序的时候理清思路,如果我们熟悉算法,那么我们在那道题目的时候就会迅速的把握住题目的核心,找到求解问题的方法和步骤。在算法中,有四种方式可以使用,我最常用的是伪代码。
简单的算法举例
1.求1*2*3*4*5
算法步骤:
S1:先求1*2,得到结果2
S2:将步骤1得到的乘积2再乘以3,得到结果6
S3:将6再乘以4,得24
S4:将24再乘以5,得120
———————————————————————————————————————————
算法步骤:
S1:令p=1,或写成1=>p(表示将1存放在变量p中)
S2:令i=2,或写成2=>i(表示将2存放在变量i中)
S3:使p和i相乘,乘积仍存放在变量p中,可表示为p*i=>p
S4:使i的值增加1,即i+1=>i
S5:如果i不大于5,返回重新执行S3及其后的步骤S4和S5;否则算法结束。最后得到p的值就是5!的值
———————————————————————————————————————————
以上方式属于伪代码的表示方式一种,用这种方式表示的算法具有一般性,通用性和灵活性
2.有50个学生,要求输出成绩在80以上的学生的学号和成绩
变量说明:
n:表示学生学号
下标i:表示第几个学生
n1:表示第一个学生的学号
ni:表示第i个学生的学号
g:表示学生的成绩
g1:表示第一个学生的成绩
gi:表示第i个学生的成绩
———————————————————————————————————————————
算法步骤:
S1:1=>i
S2:如果gi≥80,则输出ni和gi,否则不输出
S3:i+1=>i
S4:如果i≤50,返回到S2继续执行,否则,算法结束
3.判定2000-2500年中的每一年是否为闰年,并将结果输出
判定条件:
如果year不能被4整除,则为非闰年
如果year能被4整除但是不能被100整除,则为闰年
如果year能被100整除,同时可以被4整除,则为闰年
如果year为其他条件,则为非闰年
以上是自然语言叙述,通过自然语言的叙述可以帮助我们理解题目并写出伪代码或者画出流程图进一步向程序转化,优点是容易理解,缺点是容易出现二义性,并且通常很冗长
———————————————————————————————————————————
算法步骤:
S1:2000=>year
S2:如果year不能被4整除,则输出year的值和“不是闰年”。然后转到S6,检查下一年份
S3:如果year能被4整除但是不能被100整除,则输出year的值和“是闰年”。然后转到S6
S4:如果year能被:400整除则输出year的值和“是闰年”,然后转到S6
S5:输出year的值和不是闰年
S6:year+1=>year
S7:当year≤2500时,转S2继续执行,否则算法停止
4.求1-1/2+1/3-1/4+……+1/99-1/100
变量说明:
sign:表示当前项的数值符号
term:表示当前项的值
sum:表示当前项的累加和
deno:表示当前项的分母
———————————————————————————————————————————
算法步骤:
S1:sign=1
S2:sum=1
S3:deno=2
S4:sign=(-1)*sign
S5:term=sign*(1/deno)
S6:sum=sum+term
S7:deno=deno+1
S8:若deno≤100,返回S4,否则算法结束
5.给出一个大于或等于3的正整数,判断它是不是一个素数
解题思路:
所谓素数(prime),是指除了1和该数本身之外,不能被任何整数整除的数
算法步骤:
S1:输入n的值
S2:i=2(i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则输出n“不是素数”,算法结束,否则执行S5
S5:i+1=>i
S6:如果i≤n-1,返回S3;否则输出n的值以及“是素数”,然后结束
算法的特性
有穷性
一个算法应包含有限的操作步骤,而不能是无限的
确定性
算法中的每一个步骤都应该是确定的,而不应当是含糊的、模棱两可的
有零个或多个输入
所谓输入是指在执行算法时需要从外界取得必要的信息
有一个或多个输出
算法的目的是为了求解,“解”就是输出
有效性
算法中的每一个步骤都应当能有效地执行,并得到确定的结果
算法的表示
自然语言,传统流程图,结构化流程图,伪代码
算法的流程图表示举例
6.将1的算法求1*2*3*4*5用流程图表示
7.将2的算法有50个学生,要求输出成绩在80以上的学生的学号和成绩用流程图表示
8.将3判定闰年的算法用流程图表示
9.将4的算法求1-1/2+1/3-1/4+……+1/99-1/100用流程图表示
10.将5判断素数的算法用流程图表示
通过上面的举例我们可以发现如果使用流程图,那么程序每一步的运行都会显得非常直观
传统流程图的弊端
传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此使用者可以不受限制地使流程图随意地转来转去,使流程图变得毫无规律,阅读时要花很大力气去追踪流程,使人难以理解算法的逻辑。
三种基本结构及其特点
三种基本结构:
从左到右分别是顺序结构,选择结构和循环结构
特点:
只有一个入口,只有一个出口,结构内每一部分都有机会被执行到,结构内不存在死循环
用N-S流程图表示算法
用伪代码表示算法
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。每一行或每几行表示一个基本操作。因为伪代码不用图形符号,因此书写方便,格式紧凑,修改方便,容易看懂,也便于向计算机语言算法(即程序)过渡。
算法的伪代码举例
16.求5!
begin(算法开始)i=>p2=>iwhile i≤5{p*i=>pi+1=>i}print p end(算法结束)7.将9的算法求1-1/2+1/3-1/4+……+1/99-1/100用伪代码表示
begin(算法开始)1=>sign1=>sum2=>denowhile deno≤100{ (-1)*sign=>signtsign*(1/deno)=>termsum+term=>sumdeno+1=>deno}print sum end(算法结束)用计算机语言表示算法
18.将16的算法求5!用C语言表示
#include <stdio.h> int main(){int i,p;p=1;i=2;while(i<=5){p=p*i;i=i+1;}printf("%d\n",p);return 0; }19.将17的算法求1-1/2+1/3-1/4+……+1/99-1/100用C表示
#include <stido.h> int main(){int sign=1;double deno=2.0,sum=1.0,term;while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}printf("%f\n",sum);return 0; }结构化程序设计方法
自顶而下,逐步细化,模块化设计,结构化编码
为了有效的利用计算机解决实际问题,在保证算法的前提下,还要考虑时间和空间的效率,一个好的算法应该具有较短的执行时间并占用较少的辅助存储空间。算法的复杂性是对算法所需时空资源的一种度量,当给定问题有多种算法的时候,设计和选择出复杂性尽可能低的算法是一个重要准则。
总结
以上是生活随笔为你收集整理的谭浩强 《C程序设计》(第五版)第二章的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 2021-10-18血压计方案|血压计模
- 下一篇: LC并联谐振电路设计