2022年自学考试《C语言程序设计》练习题及答案6
【3.26】下面的函数sum(int n)完成计算1~n的累加和。
sum(int n)
{if(n<=0)
printf('data errorn');
if(n==1)①;
else②;
}
【3.27】下面的函数是一个求阶乘的递归调用函数。
facto(int n)
{if(n==1)①;
else return(②);
}
【3.28】组合问题,由组合的基本性质可知:
(1)C(m,n)=C(n-m,n)
(2)C(m,n+1)=C(m,n)+C(m-1,n)
公式(2)是一个递归公式,一直到满足C(1,n)=n为止。当n<2*m时,可先用公式(1)进行简化,填写程序中的空白,使程序可以正确运行。
#include'stdio.h'
main()
{int m,n;
printf('Input m,n=');
scanf('%d%d',&m,&n);
printf('The combination numbeers is%dn',combin(m,n));
}
combin(int m,int n)
{int com;
if(n<2*m)m=n-m;
if(m==0)com=1;
else if(m==1)①;
else②;
return(com);
}
【3.29】下列函数是求一个字符串str的长度。
int strlen(char*str)
{if(①)return(0);
else return(②);
}
【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。
#include'stdio.h'
main()
{int n;
printf('Input n:');
scanf('%d',①);
r(n);
printf('n');
}
r(int m)
{printf('%d',②);
m=③;
if(④)
⑤;
}
【程序填空题参考答案】
【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)
注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句'if(n<2*m)m=n-m;'完成了题目中叙述的'用公式(1)进行简化'的工作。
【3.29】答案:①*str==''②1+strlen(str+1)
注释:求串长算法的关键是确定串结束标记''的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符
如果当前字符(*str)==串结束标记''
则串长=0
否则串长=1+除第一个字符之外的剩余字符串的串长
因此,在①的位置上应当填写'*str==''',以判断当前字符(*str)是否是串结束标记''。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写'1+strlen(str+1)'。
【3.30】答案:①&n②m%10③m/10④m>0⑤r(m)
热门推荐:
自考有疑问、不知道如何选择主考院校及专业、不清楚自考当地政策,点击立即了解》》
推荐阅读: