您的当前位置:首页正文

二级C语言等级考试程序填空题题库

2024-07-28 来源:步旅网
程序填空题一

1. 下面C语言程序将两个递增有序的数值a和b合并一个数组c,并保持递增次序,最后输出数组c.

#include < stodio.h> #define M6 #define N5 main( )

{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]c[k++]=a[i++]; else c[k++]=b[j++]; while( 2 )

c[k++]=a[i++]; while(jfor(k=0;k<( 4 );k[++]) printf(%dxt,c[k]; ) 其中(1)(2)(3)(4)处分别填一数据,使程序达到其功能。 答案:

1:i2.下面h函数的功能是计算如下数学函数H的值。请填空。 double fgh(double(*f)(double a),double(* g)(double b), double x,double y)

{return(【1】);}double h(double a,double b) return(fgh(sin,cos,a,b)* fgh(【2】));}

解:(1)(*f)(x+y)/(*g)(y-x) (2)cos,sin,a,b

[解析]本题考察的是函数的声明。要填写的两个空都出现在return语句中,所以要仔细分析函数的返回值。本题的第二个空相对要容易一些,只要根据题干和乘号前面的调用语句对比一下即可得到调用语句的四个参数。第一个空相对要难一些,函数fgh定义时用到了函数指针(*f)和(*g)是为了增加函数的灵活性。根据函数h的定义以及题干要求,可以看出函数fgh应该表示的是乘号两边的某一项。(*f)

1

和(*g)用来表示sin或cos,参数x和y的加减法运算作为sin或cos函数的参数,故应填写(*f)(x+y)/ (*g)(y-x)。 3.下面程序的作用是将以下给出的字符按其格式读入数组ss中,然后输出行、列号之和为3的数组元素,请在____处填入正确内容。 A a f c B d e b c g f D main() {

static char ss[4][3]={'A','a','f','c','B','d','e','b','C','g','f','D'}; int x,y,z;

for(x=0;【1】;x++) for(y=0;【2】;y++) {z=x+y; if(【3】) printf(\"%c\n\",ss[x][y]); } }

解:(1)x<4 (2)y<3 (3)z==3

[解析]本题应用穷举法找到满足要求的值。第一个空:变量x为行数所以是x<4;第二个空:变量y为列数所以是y<3;第三个空:判断x+y是否为3所以是z==3。 4.下面程序的作用是将以下给出的字符按其格式读入数组ss中,然后输出行、列号之和为3的数组元素,请在____处填入正确内容。 A a f c B d e b c g f D main() {

static char ss[4][3]={'A','a','f','c','B','d','e','b','C','g','f','D'}; int x,y,z;

for(x=0;【1】;x++) for(y=0;【2】;y++) {z=x+y; if(【3】) printf(\"%c\n\",ss[x][y]); }

}

解:(1)x<4 (2)y<3 (3)z==3

[解析]本题应用穷举法找到满足要求的值。第一个空:变量x为行数所以是x<4;第二个空:变量y为列数所以是y<3;第三个空:判断x+y是否为3所以是z==3。

程序填空题二

【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。 #include main() { int a,b;

scanf(\"%d%d\;

printf(\"a=%d,b=%d\\n\; a= ① ; b= ② ; a= ③ ;

printf(\"a=%d,b=%d\\n\; }

答案: ① 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;

2

② ; }

printf(\"%d\\n\; }

答案:① t=t*i ② t=t>0?-1:1

【3.4】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。 main()

{ float x,amax,amin; scanf(\"%f\; amax=x; amin=x; while( ① )

{ if(x>amax) amax=x; if( ② ) amin=x; scanf(\"%f\; }

printf(\"\\namax=%f\\namin=%f\\n\n); }

答案: ① x>=0 ② x【3.5】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。

fun(int x,int b[]) { int k=0,r; do

{ r=x% ① ; b[k++]=r; x/= ② ; }while(x); }

答案: ① 2 ② 2

【3.6】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。 main() { int i,j;

for(i=0; ① ;i++) { j=i*10+6;

if( ② ) countinue;

printf(\"%d\; } }

答案:① i<=9 ② j%3!=0 说明:100以内的个位数为6的数有10个,即6、16、26、36、46、56、66、76、86、96

【3.7】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。 hcf(int m,int n) { int r; if(mr=m%n; while( ② ) { m=n; n=r; r=m%n; } ③ ; }

答案:① m=n ② r!=0 ③ return(n)

【3.8】下面程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序。排好序的10个数分两行输出。程序如下: #include main() { ① ; int i,j;

printf(\"Input 10 numbers please\\n\"); for(i=0; ② ;i++ ) scanf(\"%f\; printf(\"\\n\");

for(i=2; ③ ;i++ ) for(j=0; ④ ;j++ ) if( ⑤ ) { x=a[j]; ⑥ ;

a[j+1]=x; }

printf(\"The sorted 10 numbers;\\n\"); for(i=0; ⑦ ;i++ ) { if( ⑧ ) printf(\"\\n\");

3

printf(\"%f\\; }

printf(\"\\n\"); } 答案:① 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\ count=%d\\n\; }

答案:① &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[j++]=s[i] ② s[j]=s[i]

【3.11】下面程序的功能是将字符串s中所有

的字符'c'删除。请选择填空。 #include main( )

{ 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\① ); else i++; }

答案:① 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中的开始位置(下标值),否则送回

4

-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=0

long fun(int n) { int i; long s;

for(i=1;i ① ;i++) s*=i;

return( ② ); }

main() { int k,n; long s;

scanf(\"%d\; s= ③ ;

for(k=0;k<=n;k++) s+= ④ ;

printf(\"%ld\\n\; }

答案:① <=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\\n\② ); }

答案:① 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(s5

{ c=*s; *s=*p; ② ;

revstr(s+1); ③ ; } }

如下是由非递归实现的revstr(s)函数: revstr (s) char *s;

{ char *p=s, c; while( *p ) p++; ④ ;

while( s

【3.20】下面函数用递归调用的方法,将str中存放的长度为n的字符串反转过来,例如原来是\"ABCDE\",反序为\"EDCBA\"。 void invent(char *str,int n) { char t; t=*str ; *str=*(str+n-1) ; *(str+n-1)=t ; if ( n>2 ) invent ( ① ,n-2); else ② ; }

答案:① str+1 ② return ①改为 n-2

【3.21】下面程序的功能是实现数组元素中值的逆转。

#include

main()

{ int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10}; invert(a,n-1);

for(i=0;i<10;i++) printf(\"%4d\; printf(\"\\n\"); }

invert(int *s,int num) { int *t,k; t=s+num; while( ① ) { k=*s; *s=*t; *t=k; ② ; ③ ; } }

答案:① s【3.22】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。

void fun(char *w,char x,int *n) { int i,p=0;

while(x>w[p]) ① ;

for(i=*n;i>=p;i--) ② ; w[p]=x; ++*n; }

答案:① p++ ② w[i+1]=w[i] }

【3.23】下面程序的功能是输入学生的姓名和成绩,然后输出。 #include struct stuinf

{ char name[20]; /* 学生姓名 */ int score; /* 学生成绩 */ } stu, *p; main ( ) { p=&stu;

printf(\"Enter name:\"); gets( ① );

printf(\"Enter score: \"); scanf(\"%d\", ② );

printf(\"Output: %s, %d\\n\", ③ , ④ ); }

6

答案:① stu.name ② &stu.score ③ p->name ④ p->score

【3.24】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。 •• #include #include #define NUM 4 • struct student • { int rank; char *name; float score; ••••••••};

•••••••• ① stu[ ]={ 3,\"liming\",89.3, •••••••• 4,\"zhanghua\",78.2, •••••••• 1,\"anli\",95.1, •••••••• 2,\"wangqi\",90.6 };

••••••••main()

••••••••{ char str[10]; •••••••• int i; •••••••• do

{ printf(\"Enter a name\"); •••••••• scanf(\"%s\",str);

•••••••• for( i=0;i•••••••• { printf(\"Name :%8s\\n\",stu[i].name);

•••••••• printf(\"Rank :%3d\\n\",stu[i].rank); •••••••• printf(\"Average :%5.1f\\n\",stu[i].score); •••••••• ③ ; •••••••• }

•••••••• if( i>=NUM ) printf(\"Not found\\n\"); •••••••• }while( strcmp(str,\"0\")!=0 ); ••••••••} 答案:① struct student ② strcmp(stu[i].name,str)==0 ③ break

注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stu[i].name,str)==0。③处应当将控制退出内层的for循环,只能选择break语句。 【3.25】下面函数将指针p2所指向的线性链

表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。 #define NULL 0 struct link { float a;

struct link *next; };

concatenate ( p1,p2 ) struct list *p1,*p2; { if( p1->next==NULL ) p1->next=p2; else

concatenate( ① ,p2); }

答案:① p1->next

【326】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。 struct student { long num; int score;

struct student *next; };

struct student *creat()

{ struct student *head=NULL,*tail; long num; int a; tail= ① malloc(LEN); do

{ scanf(\"%ld,%d\; if(num!=0)

{ if(head==NULL) head=tail; else ② ;

tail->num=num; tail->score=a;

tail->next=(struct student *)malloc(LEN); }

else tail->next=NULL; }while(num!=0); return( ③ ); } 答案:① (struct student *) ② tail=tail->next ③ head

注释:①malloc函数的作用是在内存开辟指定字节数的存储空间,并将此存储空间的地址返回赋给尾指针tail,但是此地址为void型,应

7

将其强制转换为所要求的结构指针类型。 ②新开辟的结点的内存地址存于tail所指向的已建立的链表的尾结点的结构成员next,新结点连入链表以后,尾指针tail应指向新的结点。

【3.27】下面程序的功能是统计文件中的字符的个数。

#include main()

{ long num=0; ① *fp;

if((fp=fopen(\"fname.dat\{ printf(\"Can't open the file! \"); exit(0); }

while( ② ) { fgetc(fp); num++; }

printf(\"num=%d\\n\; fclose(fp); }

答案:① FILE ② !feof(fp)

注释:FILE 是文件结构类型名。feof()是测试文件结束标志的函数。

因篇幅问题不能全部显示,请点此查看更多更全内容