【3.8】答案:① m=n ② m>0 ③ m=m/10 【3.9】答案:① i==j ② k!=i&&k!=j 【3.10】答案:① i<=9 ② j%3!=0
【3.11】答案:① m=n ② r!=0 ③ return(n) 【3.12】答案:① float a[10],x ② i<=9 ③ i<=8 ④ j<=9-i
⑤ a[j]>a[j+1] ⑥ a[j]=a[j+1] ⑦ i<=9 ⑧i%5==0 【3.13】答案:① &a[i] ② continue
注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。 【3.14】答案:① s[j++]=s[i] ② s[j]=s[i]
【3.15】答案:① s[j++]=s[i] 【3.16】答案:① x[i++]
【3.17】答案:① i=strlen(a);i>=j;i-- ② a[i+1]=a[i]
【3.18】答案:① '\\0' ② str1[i]-str2[i]
【3.19】答案:① j++ ② '\\\\' ③ j++ ④ '\\\\' ⑤ j++ ⑥ '\\0'
【3.20】答案:① t[k]!= '\\0' ② t[k]== '\\0' 【3.21】答案:① <=n ② s ③ 0 ④ fun(k) 【3.22】答案:① a[fmax(a,N)] ② k=p
【3.23】答案:① last*n00 ② x!=min-x ③ flag=0
【3.24】答案:① (x0+a/x0)/2 ② a,x1
注释:根据迭代公式,①处应当是计算迭代值
x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足\时,则要继续迭代,因此②处应当填写\。程序中调用了求绝对值的库函数fabs( )。
【3.25】答案:① 2+age(n-1) ② age(5)
注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1)
对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。 【3.26】答案:① return(1) ② return (sum(n-1)+n)
注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。
将问题\求1~n的累加和\的公式写成递归定义,可以是如下形式;
sum(n)=1 当n=1时
sum(n)=sun(n-1)+n 当n>1时
根据此递归定义,可以很容易完成程序。
【3.27】答案:① return(1) ② n*facto(n-1) 注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式;
n!=1 当n=1时 n!=n*(n-1) 当n>1时
根据此递归定义,可以很容易完成程序。
【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m)
注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句\
(n<2*m) m=n-m;\完成了题目中叙述的\用公式(1)进行简化\的工作。
【3.29】答案:① *str=='\\0' ② 1+strlen(str+1) 注释:求串长算法的关键是确定串结束标记'\\0'的位
置。根据求串长的方法,可以得到如下递归算法:指针
str指向字符串的首字符
如果 当前字符(*str)== 串结束标记'\\0' 则 串长=0
否则 串长 = 1+除第一个字符之外的剩余字符串的串长
因此,在①的位置上应当填写\,以判断当前字符(*str)是否是串结束标记'\\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写\。
【3.30】答案:① &n ② m ③ m/10 ④ m>0 ⑤ r(m)
【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i)
注释:函数prt的功能是输出n个字符c。 【3.32】答案:① y(x, n-1)
注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。 y(x,n)=x 当n=0时 y(x,n)=sqrt(x+y(x,n-1)) 当n>0时
【3.33】答案:① p-- ② *p='\\0' ③ *p=c ④ p-- ⑤*s++
注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行\,将首字符存入临时变量;然后执行\,将尾字符存入串首;执行
\是递归处理串的中间部分,这时,在②处应当填入\,即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写\。
【3.34】答案:① str+1 ② return ①改为 n-2 【3.35】答案:① p>=q ② max=s ③ p,max ④ p+1,q ⑤ &array[0], &array[9]
注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句\; s<=q; s++)\中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填\、⑤处应填\。
由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填\。
当调用函数swap交换两个变量值的时候,要求实参是
变量的地址,因此,③处应填\将最大值存入指针p所指的单元。
由于问题的要求是\从大到小\排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填\。
【3.36】答案:① a+1 ② n+'0' 【3.37】答案:① s注释:p是一个一级指针,赋值后保存二维数组a的首地址,做加法运算加1时,实际地址增加一个它所指向的数据类型的长度。在C语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。 【3.39】答案:① '\\0' 或 0 ② ++
注释:在C语言中,进行字符串处理时,必须注意串结束标记'\\0',它是在进行串处理时的最基本的要求,所以①中要填入'\\0'。为了使用putchar输出一个字符串,则必须有改变指针的运算,这里只能使用++运算。 【3.40】答案:① p++ ② w[i+1]=w[i]
【3.41】答案:① && ② *a
⑤ != ⑥ '\\0' ⑦ w=s ⑧ n++ ⑨ t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0] 【3.42】答案:① *++pa ② *++pa ③ *pa ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n
【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score
注释:这是结构中的最基本概念。
【3.44】答案:① struct student ②
strcmp(stu[i].name,str)==0 ③ break 注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到