谭浩强《C程序设计》(第4版)笔记和课后习题详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 课后习题详解

1什么是算法?试从日常生活中找3个例子,描述它们的算法。

答:为解决一个问题而采取的方法和步骤,就称为“算法”。

例1,从上海去北京:先要预定车票、然后去车站乘车、抵达目的地后下车;

例2,喝茶:先准备好茶叶、再烧一壶开水、然后将茶叶放入杯中、倒入开水、等待茶叶泡好;

例3,开车:先要打开车门、驾驶员坐好、插上车钥匙、发动汽车。

2什么叫结构化的算法?为什么要提倡结构化的算法?

答:结构化算法是由一些基本结构顺序组成的。在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本的结构范围内。一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。跟结构化算法比较起来,非结构化算法有以下缺点:流程不受限制的随意转来转去,使流程图毫无规律,使人在阅读的时候难以理解算法的逻辑,难以阅读,也难以修改,从而使算法的可靠性和可维护性难以保证。

3试述3种基本结构的特点,请另外设计两种基本结构(要符合基本结构的特点)。

答:3种基本结构的特点:

只有一个入口。

只有一个出口。

结构内的每一部分都有机会被执行到。即对每一个框来说,都应当有一条从入口到出口的路径通过它。

结构内不存在“死循环”。

另外两种基本结构如图2-13所示。

图2-13 另外两种基本结构图

4用传统流程图表示求解以下问题的算法。

(1)有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换(即A瓶原来盛醋,现改盛酱油,B瓶则相反)。

答:显然,如果只有两个瓶子,肯定不能完成此任务,必须有一个空瓶C作为过渡,A瓶与B瓶互换的流程图如图2-14。

图2-14 A瓶与B瓶互换流程图

(2)依次将10个数输入,要求输出其中最大的数。

答:求解10个数中最大数的流程图如图2-15所示。

图2-15 求解10个数中最大数的流程图

(3)有3个数a,b,c,要求按大小顺序把它们输出。

答:将3个数大小输出的流程图如图2-16所示。

图2-16 3个数大小输出的流程图

(4)求1+2+3+…+100。

答:求1+2+3+…+100的流程图如图2-17所示。

图2-17 1到100累加的流程图

(5)判断一个数n能否同时被3和5整除。

答:判断一个数n能否同时被3和5整除的流程图如图2-18所示。

图2-18 判断一个数能否被3和5整除的两种流程图

(6)将100~200之间的素数输出。

答:输出100~200之间素数的流程图如图2-19所示。

图2-19 找出100~200之间素数的流程图

(7)求两个数m和n的最大公约数。

答:求两个数m和n最大公约数的流程图如图2-20所示。

图2-20 求两个数最大公约数的流程图

(8)求方程式ax2+bx+c=0的根。分别考虑:

有两个不等的实根;

有两个相等的实根。

答:求方程式ax2+bx+c=0根的流程图如图2-21所示。

图2-21 求一元二次方程根的流程图

5用N-S图表示第4题中各题的算法。

答:(1)A瓶与B瓶互换的N-S流程图如图2-22所示。

图2-22 A瓶与B瓶互换的N-S流程图

(2)求解10个数中最大数的N-S流程图如图2-23所示。

图2-23 求解10个数中最大数的N-S流程图

(3)将3个数大小输出的N-S流程图如图2-24。

图2-24 将3个数大小输出的N-S流程图

(4)求1+2+3+…+100的N-S流程图如图2-25所示。

图2-25 求1+2+3+…+100的N-S流程图

(5)判断一个数n能否同时被3和5整除的N-S流程图如图2-26所示。

图2-26 判断一个数n能否同时被3和5整除的N-S流程图

(6)输出100~200之间素数的流程图如图2-27所示。

图2-27 输出100~200之间素数的N-S流程图

(7)求两个数m和n最大公约数的流程图如图2-28所示。

图2-28 求两个数m和n最大公约数的N-S流程图

(8)求方程式ax2+bx+c=0根的流程图如图2-29所示。

图2-29 求一元二次方程根的N-S流程图

6用伪代码表示第4题中各题的算法。

答:(1)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个数大小输出的伪代码为:

input a,b,c
if a<b then swap 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=sum+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<=sqrt(n)
    if mod(n,i)=0 then
      i=n
    else
      i=i+1
    end if
  end do
  if i<sqrt(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=b^2-4ac
if disc>=0 then
  if disc=0 then
    x1,x2=-b/(2a)
  else
    x1=(-b+sqrt(disc))/(2a)
    x2=(-b-sqrt(disc))/(2a)
  end if
  print x1,x2
else
  p=-b/(2a)
  q= sqrt(disc)/(2a)
  print p+q,"+","i"
end if

7什么叫结构化程序设计?它的主要内容是什么?

答:结构化程序设计的概念最早由E.W.Dijikstra在1965年提出的,是软件发展的一个重要的里程碑。它的主要观点是采用自顶向下、逐步求精及模块化的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。结构化程序设计主要强调的是程序的易读性。

8用自顶向下、逐步细化的方法进行以下算法的设计:

(1)输出1900~2000年中是闰年的年份,符合下面两个条件之一的年份是闰年:

能被4整除但不能被100整除;

能被100整除且能被400整除。

答:先画出图2-30(a),对它细化得图2-30(b);对图2-30(b)中的S1.1细化得图2-30(c)。

图2-30 输出1900~2000中闰年的流程图

(2)求ax2+bx+c=0的根。分别考虑d=b2-4ac大于0、等于0和小于0这3种情况。

答:先画出图2-31(a),对其中的S3细化为图2-31(b);对图2-31(b)中的S3.1细化为图2-31(c);对图2-31(c)中的S3.1.1细化为图2-31(d);对图2-31(c)中的S3.1.2细化为2-31(e),对图2-31(b)中S3.2细化为图2-31(f)。

图2-31 求ax2+bx+c=0根的流程图

(3)输入10个数,输出其中最大的一个数。

答:先初步画出图2-32(a),考虑到还没有学习数组的知识,因而不能做到将10个数全部输入给数组中各个元素,然后再从中找到最大者。由于不采用数组这种数据结构,算法也应与采用数组时有所不同,现在只用普通变量,逐个读入数据,将当时各数中的最大者保留下来存放在max中,以便再与后面读入的数比较。将图2-32(a)细化为图2-32(b),再细化为图2-32(c)。

图2-32 求解输入10个数中最大数的流程图