《C语言程序设计》(谭浩强第五版) 第2章 算法——程序的灵魂 习题解析与答案
你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题。
题目1:什么是算法?试从日常生活中找3个例子,描述它们的算法。
答:
算法:算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。
算法是独立存在的一种解决问题的方法和思想。
对于算法而言,实现的语言并不重要,重要的是思想。
例如:
1、自驾去新疆旅游
准备好车,然后准备旅游路线等,开车出发,一路游山玩水。
2、网上买一部手机
首先选好网购平台(某宝,某东,某猫等),然后选择想要的品牌和型号,下单,等待到货。
3、相亲
首先有七大姑八大姨等(如果没有可以选择一些交友网站或其他媒婆),然后获取对方的联系方式和基本信息,出发到达目的地,相见,满意或不满意,决定了是否可以再约。
4、把大象放进冰箱
先打开冰箱门,然后将大象放进冰箱,关冰箱。
题目2:什么叫结构化的算法?为什么要提倡结构化的算法?
答:
结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。
结构化算法便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量,因此提倡结构化的算法。
题目3:试述3种基本结构的特点,请另外设计两种基本结构(要符合基本结构的特点)。
解:
结构化程序设计方法主要由以下三种基本结构组成:
顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块
选择结构:选择结构是根据条件成立与否选择程序执行的通路。
循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件位置
重新设计基本结构要满足以下几点:
只有一个入口
只有一个出口
结构内的每一部分都有机会执行到
结构内不存在死循环
见图2.1和图2.2。
题目4:用传统流程图表示求解以下问题的算法。
(1)有两个瓶子A 和 B,分别盛放醋和酱油,要求将它们互换(即 A 瓶原来盛醋,现改盛酱油,B 瓶则相反)。
解:显然,如果只有两个瓶子,肯定不能完成此任务,必须有一个空瓶C作为过渡,其步骤见图 2.3。
(2)依次将10个数输人,要求输出其中最大的数。
解:流程图见图 2.4。
(3)有3个数a,b,c,要求按大小顺序把它们输出。
解:流程图见图2.5。
(4)求1+2+3+……+ 100。
解:流程图见图 2.6。
(5)判断一个数n能否同时被3和5整除。
解:流程图见图 2.7(a)或图 2.7(b)。
(6)将100~200之间的素数输出。
解:流程图见图 2.8。
(7)求两个数m和n的最大公约数。
解:流程图见图 2.9。
(8)求方程式ax2+ bx+c=0的根。分别考虑:
①有两个不等的实根;
②有两个相等的实根。
解:流程图见图 2.10。
题目5:用N-S图表示第4题中各题的算法。
(1)有两个瓶子A 和 B,分别盛放醋和酱油,要求将它们互换(即 A 瓶原来盛醋,现改盛酱油,B 瓶则相反)。
解:N-S流程图见图 2.11。
(2)依次将10个数输人,要求输出其中最大的数。
解:N-S流程图见图 2.12。
(3)有3个数a,b,c,要求按大小顺序把它们输出。
解:N-S流程图见图 2.13。
(4)求1+2+3+……+ 100。
解:N-S流程图见图 2.14。
(5)判断一个数n能否同时被3和5整除。
解:N-S流程图见图 2.15。
(6)将100~200之间的素数输出。
解:N-S流程图见图 2.16。
(7)求两个数m和n的最大公约数。
解:N-S流程图见图 2.17。
(8)求方程式ax2+ bx+c=0的根。分别考虑:
①有两个不等的实根;
②有两个相等的实根。
解:N-S流程图见图 2.18。
题目6:用伪代码表示第4题中各题的算法。
(1)有两个瓶子A 和 B,分别盛放醋和酱油,要求将它们互换(即 A 瓶原来盛醋,现改盛酱油,B 瓶则相反)。
解:
c = a
a = b
b = c
(2)依次将10个数输人,要求输出其中最大的数。
解:
n= 1
input max
while n<10 do
input a
if a>max then max= a
n=n+1
end do
print max
(3)有3个数a,b,c,要求按大小顺序把它们输出。
解:
input a,b,c
if a<b then swap a,b (swap a,b表示a和b互換)
if a<c then
print c,a,b
else
if c>b then
print a,c,b
else
print a,b,c
end if
end if
(4)求1+2+3+……+ 100。
解:
sum = 0
n= 1
while n≤100 do
sum = sumt+n
n=n+1
end do
print sum
(5)判断一个数n能否同时被3和5整除。
解:
input n
flag=0
if mod(n,3)≠ 0 then flag=- 1
if mod(n,5)≠ 0 then flag= 1
if flag=0 then
print n "能被 3 和 5 整除"
else
print n "不能同时被 3 和 5 整除
end if
(6)将100~200之间的素数输出。
解:
n= 100
while n≤200 do
i=2
while i≤ √n
if mod(n,i)=0 then
i=n
else
i=i+1
end if
end do
if i<√n then print n
n=m+1
end do
(7)求两个数m和n的最大公约数。
解:
input m,n
if m<n then swap m,n
t= mod(m,n)
while r≠=0 do
m= n
n=r
r= mod(m,n)
end do
print n
(8)求方程式ax2+ bx+c=0的根。分别考虑:
①有两个不等的实根;
②有两个相等的实根。
解:
int a,b,c
disc= b2-4ac
if disc≥0 then
if disc=0 then
xl,x2=-b/(2a)
else
xl=(-b+√disc)/(2a)
x2=(-b-√disc)/(2a)
end if
print x1,x2
else
p=-b/(2a)
q= √(dis/(2a)
print p+q,"+",p-q,"i"
end if
题目7:什么叫结构化程序设计?它的主要内容是什么?
答:
结构化程序设计(structured programming,简称SP)是进行以模块功能和处理过程设计为主的详细设计的基本原则。其概念最早由E.W.Dijikstra在1965年提出的。结构化程序设计思想确实使程序执行效率提高 ,是软件发展的一个重要的里程碑,它的主要观点是采用自顶向下、逐步求精的程序设计方法;各个模块通过“顺序、选择、循环”的控制结构进行连接,并且只有一个入口、一个出口 。
题目8:用自顶向下、逐步细化的方法进行以下算法的设计:
(1)输出1900- 2000 年中是闰年的年份,符合下面两个条件之一的年 份是闰年:
①能被4整除但不能被100整除;
②能被100整除且能被400整除。
解:先画出图 2.19(a),对它细化得图 2.19(b);对图 2.19(b)中的 S1.1细化得图2.19(c)。
(2)求ax2+bx+c=0的根。分别考虑d=b°-4ac大于0、等于0和小于0这3种情况。
解:先画出图2.20(a),对其中的 S3细化为图2.20(b),对图2.20(b)中的 S3.1细化为图2.20(c),对图2.20(c)中的S3.1.1细化为图2.20(d),对图2.20(c)中的 S3.1.2细化为图 2.20(e),再对图 2.20(b)中的 S3.2细化为图 2.20(f)。请读者将它们合成一个总的N-S图。
(3)输人10个数,输出其中最大的一个数。
解:先初步画出图 2.21(a)。考虑到还没有学习数组的知识,因而不能做到将 10个数全部输入给数组中各个元素,然后再从中找最大者。由于不采用数组这种数据结构,算法也应与采用数组时有所不同。现在只用普通变量,逐个读入数据,将当时各数中的最大者保留下来存放在 max中,以便再与后面读入的数比较。将图 2.21(a)细化为图 2.21(b),再细化为图2.21(c)。