程序填空题一
1. 下面C语言程序将两个递增有序的数值a和b合并一个数组c,并保持递增次序,最后输出数组c.#include < stodio.h>#define M6#define N5main( ){int a[M]={1,3,5,7,9,11} b[N]={2,4,6,8,10} int c[M+N] int i ,j, k; i=j=k=0 while( 1 ) if a[i]
main(){ int a,b;scanf("%d%d",&a,&b);printf("a=%d,b=%d
",a,b);a= ① ; b= ② ; a= ③ ;printf("a=%d,b=%d
",a,b);} 答案: ① a+b ② a-b ③ a-b 或者 ① a^b ② b^a ③ a^b【3.2】下面程序的功能是根据近似公式:π2/6≈ 1/12+1/22+1/32+ …… +1/n2,求π值。#include /*数学函数数包含在头函数math.h 中*/double pi(long n){ double s=0.0;long i;for(i=1;i<=n;i++)s=s+ ① ;return( ② );}答案:① 1.0/(float)(i*i) ② sqrt(6*s) /* sqrt()是求平方根函数*/【3.3】下面程序的功能是计算1-3+5-7+ …… -99+101的值。main(){ int i,t=1,s=0;for(i=1;i<=101;i+=2){ ① ;s=s+t;② ;}printf("%d
",s);}答案:① t=t*i ② t=t>0?-1:1【3.4】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。main(){ float x,amax,amin;scanf("%f",&x);amax=x;amin=x;while( ① ){ if(x>amax) amax=x; if( ② ) amin=x;scanf("%f",&x);}printf("
amax=%f
amin=%f
",amax,amin);}答案: ① x>=0 ② xmain(){ ① ; int i,j;printf("Input 10 numbers please
");for(i=0; ② ;i++ ) scanf("%f", &a[i]);printf("
");for(i=2; ③ ;i++ ) for(j=0; ④ ;j++ )if( ⑤ ) { x=a[j];⑥ ;a[j+1]=x;}printf("The sorted 10 numbers;
");for(i=0; ⑦ ;i++ ) { if( ⑧ ) printf("
");printf("%f\t",a[i]);}printf("
");}答案:① 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.9】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。#include "stdio.h"main(){ int i,a[20],s,count;s=count=0;for(i=0;i<20;i++ )scanf("%d", ① );for(i=0;i<20;i++){ if(a[i]<0)② ;s+=a[i];count++;}printf("s=%d\t count=%d
",s,count);}答案:① &a[i] ② continue注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。【3.10】下面程序的功能是删除字符串s中的空格。#include main(){ char *s="Beijing ligong daxue";int i,j;for(i=j=0;s[i]!='\0';i++)if(s[i]!= ' ') ① ;else ② ;s[j]= '\0';printf("%s",s);}答案:① s[j++]=s[i] ② s[j]=s[i]【3.11】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。#includemain( ){ char s[80];int i,j;gets(s);for(i=j=0;s[i]!= '\0';i++ )if(s[i]!= 'c') ① ;s[j]= '\0';puts(s);}答案:① s[j++]=s[i]【3.12】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。#include char x[]="programming";char y[]="Fortran";main(){ int i=0;while(x[i]!= '\0' && y[i]!= '\0')if(x[i]==y[i])printf("%c", ① );elsei++;} 答案:① x[i++]【3.13】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中, 字符串a已排好序。#include main(){ char a[20]="cehiknqtw";char s[]="fbla";int i,k,j;for(k=0;s[k]!= '\0';k++ ){ j=0;while(s[k]>=a[j] && a[j]!= '\0' )j++;for( ① ) ② ;a[j]=s[k];}puts(a);}答案:① i=strlen(a);i>=j;i-- ② a[i+1]=a[i]【3.14】下面的函数index(char s[], char t[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。index(char s[], char t[]){ int i,j,k;for(i=0;s[i]!= '\0';i++ ){ for(j=i,k=0; ① && s[j]==t[k];j++,k++) ;if( ② ) return (i);}return(-1);}① t[k]!= '\0' ② t[k]== '\0'【3.15】下面程序的功能是计算S= k! 。k=0long fun(int n){ int i;long s;for(i=1;i ① ;i++) s*=i;return( ② );}main(){ int k,n;long s;scanf("%d",&n);s= ③ ;for(k=0;k<=n;k++)s+= ④ ;printf("%ld
",s);}答案:① <=n ② s ③ 0 ④ fun(k)【3.16】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。#include age( int n ){ int c;if( n==1 ) c=10;else c= ① ;return(c);}main(){ int n=5;printf("age:%d
", ② );}答案:① 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.17】下面的函数是一个求阶乘的递归调用函数。facto(int n){ if( n == 1 ) ① ;else return( ② );}答案:① return(1) ② n*facto(n-1)注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式; n!=1 当n=1时n!=n*(n-1) 当n>1时根据此递归定义,可以很容易完成程序。【3.18】下列函数是求一个字符串str的长度。 int strlen( char *str ){ if( ① ) return (0); else return ( ② );}答案:① *str=='\0' ② 1+strlen(str+1)注释:求串长算法的关键是确定串结束标记'\0'的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符如果 当前字符(*str)== 串结束标记'\0'则 串长=0否则 串长 = 1+除第一个字符之外的剩余字符串的串长因此,在①的位置上应当填写"*str=='\0'",以判断当前字符(*str)是否是串结束标记'\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写"1+strlen(str+1)"。 【3.19】函数revstr(s)将字符串s置逆,如输入的实参s为字符串"abcde", 则返回时 s 为字符串"edcba"。递归程序如下:revstr( char *s ){ char *p=s, c;while(*p) p++;① ;if(s