c语言第5章测试题(2)
- 格式:doc
- 大小:33.50 KB
- 文档页数:7
练习5-1答案一、选择题1.合法的数组说明语句是( B )。
A.int a[]="string"; B.int a[]={0,1,2,3,4,5};C.char a="string"; D.char a[5]={'0', '1', '2', '3', '4', '5'};2.以下对一维整型数组a的说明正确的选项是( D )。
A.int a(10); B.int n=10, a[n]; C.int n; D.#define SIZE 10scanf("%d", &n); int a[SIZE];int a[n];3.:int a[10];,那么对a数组元素的正确引用是( D )。
A.a[10] B.a[3.5] C.a(5) D.a[10-10] 4.以下对一维数组a进行正确初始化的语句是( C )。
A.int a[10]=(0, 0, 0, 0, 0); B.int a[10]={};C.int a[]={0}; D.int a[2]={10, 9, 8};5.对以下说明语句的正确理解是( B )。
int a[10]={6, 7, 8, 9, 10};A.将5个初值依次赋给a[1]至a[5]B.将5个初值依次赋给a[0]至a[4]C.将5个初值依次赋给a[6]至a[10]D.因为数组长度与初值的个数不相同,所以此语句不正确二、填空题6.求所有不超过200的N值,N的平方是具有对称性质的回文数。
所谓回文数就是将一个数从左到右与从右到左读都是一样的,例如:34543和1234321都是回文数。
例如:满足题意要求的数有:N=1,11*11=121;N=111,111*111=12321。
#include <stdio.h>main(){int m[16], n, i, t, count=0;long a, k;printf("Result is:\n");for (n=10; n<200; n++){ k=0;t=1;a=n*n;for (i=1; a!=0; i++){ ①;a/=10;}for (; i>1; i--){ k+=m[i-1]*t;②;}if ( ③ ) printf("%2d:%10d %10d\n", ++count, n, n*n);}}那么①为( m[i]=a%10; )、②为( t*=10; )、③为( k==n*n )。
第五章1、设二维数组A【8】【10】是一个按行优先顺序存储在内存中的数组,已知A【0】【0】的起始存储位置为1000,每个数组元素占用4个存储单元,求:(1)A【4】【5】的起始存储位置。
A【4】【5】的起始存储位置为1000+(10*4+5)*4=1180;(2)起始存储位置为1184的数组元素的下标。
起始存储位置为1184的数组元素的下标为4(行下标)、6(列下标)。
2、画出下列广义表D=((c),(e),(a,(b,c,d)))的图形表示和它们的存储表示。
略,参考第5·2节应用题第5题分析与解答。
3、已知A为稀疏矩阵,试从时间和空间角度比较采用两种不同的存储结构(二维数组和三元组表)实现求∑a(i,j)运算的优缺点。
稀疏矩阵A采用二维数组存储时,需要n*n个存储单元,完成求∑ii a(1≤i≤n)时,由于a【i】【i】随机存取,速度快。
但采用三元组表时,若非零元素个数为t,需3t+3个存储单元(t个分量存各非零元素的行值、列值、元素值),同时还需要三个存储单元存储存稀疏矩阵A的行数、列数和非零元素个数,比二维数组节省存储单元;但在求∑ii a(1≤i≤n)时,要扫描整个三元组表,以便找到行列值相等的非零元素求和,其时间性能比采用二维数组时差。
4、利用三元组存储任意稀疏数组时,在什么条件下才能节省存储空间?当m行n列稀疏矩阵中非零元素个数为t,当满足关系3*t<m*n时,利用三元组存储稀疏数组时,才能节省存储空间。
5、求下列各广义表的操作结果。
(1)GetHead((a,(b,c),d))GetHead((a,(b,c),d))=a(2)GetTail((a,(b,c),d))GetTail((a,(b,c),d))=((b,c),d)(3)GetHead(GetTail((a,(b,c),d)))GetHead(GetTail((a,(b,c),d)))=(b,c)(4)GetTail(GetHead((a,(b,c),d)))GetTail(GetHead((a,(b,c),d)))=()第六章1、已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法画出此树,并回答下列问题:(1)哪个是根结点?(2)哪些是叶结点?(3)哪个是g的双亲?(4)哪些是g的祖先?(5)哪些是g的孩子?(6)哪些是e的子孙?(7)哪些是e的兄弟?哪些是f的兄弟?(8)结点b和n的层次号分别是什么?(9)树的深度是多少?(10)以结点c为根的子树的深度是多少?(11)树的度数是多少?略。
第五章数组一、单项选择1.若要定义一个具有5个元素的整型数组,以下错误的定义语句是( C)2.下列选项中,能正确定义数组的语句是( D)3.下面是有关C语言字符数组的描述,其中错误的是( D)4.有以下程序,程序运行时若输入:how are you? I am fine<回车>则输出结果是( C)#include<stdio.h>int main(){ char a[30],b[30];scanf("%s",a);gets(b);printf("%s\n %s\n",a,b);return 0;}5.以下选项中正确的语句组是( D)6.若有定义语句:int m[]={5,4,3,2,1},i=4;则下面对m数组元素的引用中错误的是( A )7.以下数组定义中错误的是( A)8.下列选项中,能够满足"若字符串s1等于字符串s2,则执行ST"要求的是 ( A )9.有以下程序,程序运行后的输出结果是( C)#include <stdio.h>#include <string.h>int main(){char x[]="STRING";x[0]='0';x[1]='\0';x[2]=0;printf("%d %d\n",sizeof(x),strlen(x));return 0;10.有以下程序,程序运行后的输出结果是( B )#include <stdio.h>#include <string.h>int main(){char a[20]=”ABCD\0EFG\0”,b[]=”IJK”;strcat(a,b); printf(“%s\n”,a);return 0;二、程序设计1./* 编写程序,实现矩阵(3行3列)的转置(即行列互换)。
第5章判断题1-1C语言函数返回类型的默认定义类型是void。
(1分)T F1-2函数形参的存储单元是动态分配的。
(1分)T F1-3如果函数定义出现在函数调用之前,可以不必加函数原型声明。
(1分)T F1-4C 语言程序中可以有多个函数, 但只能有一个主函数。
(1分)T F1-5局部变量如果没有指定初值,则其初值不确定。
(1分)T F1-6C语言中,通过函数调用只能获得一个返回值。
(1分)T F1-7函数的实参和形参都可以是变量、常量和表达式。
(1分)T F1-8按照C语言的规定,在参数传递过程中,既可以将实参的值传递给形参,也可以将形参的值传递给实参,这种参数传递是双向的。
(1分)T F1-9按照C语言的规定,实参和形参的命名不得重复。
(1分)T F1-10一个函数定义中可以完整地包含另一个函数的定义。
(1分)T F1-11函数调用得到的值,可以作为另一次函数调用时的参数。
(1分)1-12c语言每个函数的返回值都是int型的。
(1分)T F1-13C语言在函数调用时,若形参实参都是普通变量,实参和形参可以共用存储单元。
(1分)T F1-14函数的形参都属于全局变量。
(1分)T F1-15实参向形参进行数值传递时,数值传递的方向是单向的,即形参变量值的改变不影响实参变量的值。
(1分)T F1-16全局变量只能定义在程序的最前面,即第一个函数的前面。
(1分)T F1-17全局变量与局部变量的作用范围相同,不允许它们同名。
(1分)T F1-18为了便于计算机存储管理,C语言把保存所有变量的数据区,分成动态存储区和静态存储区,静态局部变量被存放在动态存储区。
(1分)T F1-19自动变量如果没有赋值,其值被自动赋为0。
(1分)T F1-20静态局部变量如果没有赋值,其存储单元中将是随机值。
(1分)T F单选题2-1C语言中函数返回值的类型是由()决定的。
(1分)A.B.调用该函数的主调函数的类型C.调用函数时临时决定D.定义函数时所指定的函数类型2-2在一个被调用函数中,关于return 语句使用的描述,错误的是()。
单选题1、关于数组的定义与初始化,下列哪一项是错误的()A.int arr[5] = {1,2,3,4,5};B.int arr[] = {1,2,3,4,5};C.int arr[5] = {1,2,3};D.int arr[5] = {1,2,3,4,5,6};2、在定义数组int arr[10]后,下列选项中对arr的引用正确的是()A.arr[10]B.arr[6.3]C.arr(6)D.arr[0]3、在C语言中,引用数组元素时,其数组下标的数据类型允许是()4、若int arr[5] = {1,2,3}; 则arr[2]的值为()5、在执行int arr[][3] = {1,2,3,4,5,6}:语句后,arr[1][0]的值为()6、关于二维数组,下列选项能正确定义并赋初值的是()A.int n = 5,b[n][n];B.int a[1][2] = {{1},{3}};C.int c[2][] = {{1,2},{3,4}};D.int a[3][2] = {{1,2},{3,4}};7、阅读下列程序段:char s[18] = "a book!";printf("%.4s\n", s);其输出结果为()A.a book!B.a bookC.a bo8、阅读下列程序:int a[4][4] = { { 1, 3, 5, }, { 2, 4, 6 }, { 3, 5, 7 } };printf("%d%d%d%d\n", a[0][0], a[1][1], a[2][2], a[3][3]);正确的输出结果为()9、阅读下面程序:int i;int x[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };for (i = 0; i<4; i++)printf("%3d", x[i][3 - i]);下列选项中哪一项是正确的输出结果()A.1 5 9 13B.1 6 11 16C.4 7 10 13D.4 8 12 1610、下列描述中不正确的是()。
第五章习题答案一、选择题1) 有以下程序#include <stdio.h>main(){ int n=2,k=0;while(k++&&n++>2);printf("%d %d\n",k,n);}程序运行后的输出结果是A)0 2 B)1 3 C)5 7 D)1 22)有以下程序:main(){ int k=5;while(--k) printf("%d",k-=3);printf("\n");}执行后的输出结果是()。
A)1 B)2 C)4 D)死循环3)有以下程序#include<stdio.h>main(){int y=10;while(y--);printf(”y=%d\n”,y);}程序执行后的输出结果是A)y=0 B)y= -1 C)y=1 D)while构成无限循环4) 若变量已正确定义,有以下程序段i=0;do printf("%d,",i);while(i++);printf("%d\n",i)其输出结果是A)0,0 B)0,1 C)1,1 D)程序进入无限循环5)有以下程序:main(){ int i;for(i=1;i<=40;i++){ if(i++%5==0)if(++i%8==0) printf("%d",i); }printf("\n");}执行后的输出结果是()。
A)5 B)24 C)32 D)406) 有以下程序#includes <stdio.h>main(){ int a=1,b=2;for(;a<8;a++) {b+=a; a+=2;}printf ("%d,%d\n",a,b);}程序运行后的输出结果是(A)9,18 (B)8,11 (C)7,11 (D)10,147) 有以下程序#include<stdio.h>main(){int y=9;for( ; y>0;y--)if(y%3= =0) printf("%d",--y);}程序的运行结果是A)741 B)963 C)852 D)8754218) 一下程序段中的变量已正确定义for(i=0;i<4;i++,j++)for(k=1;k<3;k++); printf("*");程序段的输出结果是A)******** B)**** C)** D)*9) 有以下程序#iinclude <stdio.h>main(){ int i,j;for(i=3; i>=1; i--){ for (j=1;j<=2;j++) printf(“%d”,i+j);printf(“\n”);}}程序的运行结果是()A) 2 3 4 B) 4 3 2 C) 2 3 D) 4 53 4 5 5 4 3 3 4 3 44 5 2 3 答案:D 10)有以下程序main(){int i,j;for(i=1;i<4;i++){for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);printf(“\n”);}}程序运行后的输出结果是A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=32*1=2 2*2=4 2*2=4 2*3=63*1=3 3*3=9C) 1*1=1 D) 1*1=11*2=2 2*2=4 2*1=2 2*2=41*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=911) 有以下程序#include<stdio.h>main(){int i,j,m=55;for(i=1;i<=3;i++)for(j=3;j<=i;j++) m=m%j;printf("%d\n",m);}程序的运行结果是A)0 B)1 C)2 D)312) 有以下程序#include <stdio.h>main(){ int i=5;do{ if (i%3= =1)if (i%5= =2){printf(“*%d”,i); break; }i++;}while(i!=0);printf(“\n”);}程序的运行结果是A)*7 B)*3*5 C) *5 D)*2*6 答案:A13) 有以下程序#include <stdio.h>main(){ int c=0,k;for(k=1;k<3;k++)switch(k){ default:c+=k;case 2:c++;break;case 4:c+=2;break;}printf("%d\n",c);}程序运行后的输出结果是A)3 B)5 C)7 D)914) 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是A)n=0;while((ch=getchar())!='\n')n++;B)n=0;while(getchar()!='\n')n++;C)for(n=0;getchar()!='\n';n++);D)n=0;for(ch=getchar();ch!='\n';n++);15)有以下程序#includemain(){int a=1,b=2;while(a<6){b+=a;a+=2;b%二10;}printf(”%d,%d\n”,a,b);}程序运行后的输出结果是A)5,11 B)7,1 C)7,11 D)6,116) 要求通过while循环不断读入字符,当读入字母N时结束循环。
一、选择题1.设有程序段”int k=10;while(k=0)k=k-1;”,则下面叙述正确的是D 循环体语句一次也不执行2.设有程序段”int x=0,s=0;while(!x!=0)s+=++x;printf(“%d”,s);”则A 运行程序段后输出13.若有语句”int x=3;do{printf(“%d\n”,x-=2);}while(!(--x));”,则该程序段C 输出的是1和-24.下面循环语句中,错误的是D int a=1,b=2;do b--while(b= =0);5.已知”int i=5;”,下列do…while循环语句的循环次数为C 5do{printf(“%d\n”,i--);}while(i!=0);6.循环语句”for(int i=0,j=10;i=j=10;i++,j--)”的循环次数是D 无限7.循环语句”while(int i=0;)i--;”的循环次数是A 08.下述有关break语句的描述中,不正确的是C break语句用于if语句的内嵌语句内,它结束该if语句9.下面关于循环语句的描述中,错误的是B 循环体内必须同时出现break语句和continue语句10.以下不是死循环的是D for(;(c=getchar()!=’\n’);)printf(“%c”,c);11.执行语句”for(i=0;i++<3;);”后,变量i的值为C 412.语句”for(x=0,y=0;y!=1&&x<4;x++);”是C 循环4次13.与语句”while(!x);”等价的语句是A while(x= =0);14.执行下列程序段后a的值为B 2int a=1,b=10;do{b-=a;a++;}while(b--<0)二、编程题1.读入用户输入的6个整数并显示其平均值。
#include<stdio.h>main(){float sum=0;int tmp;int i;for(i=0;i<6;i++){printf("输入第%d个数:",i+1);scanf("%d",&tmp);sum=sum+tmp;}printf("平均值是:%f",sum/6);}2.先读入一个正整数n,然后计算并显示前n个偶数的和。
5.2基础实验一、程序分析1.以下程序的运行结果是a=3,b=7↙。
#include <stdio.h>intmain( ){ int a=2,b=8;while(b--<0)b-=a ;a++ ;printf(“a=%d,b=%d\n”,a,b);return 0;}2.以下程序的运行结果是sum=14。
#include <stdio.h>intmain( ){ int n,sum= 0 ;n=2345;do{ sum = sum +n%10;n=n/10;} while(n);printf(“sum=%d ”,sum);return 0;}3.以下程序的运行结果是2550。
#include <stdio.h>intmain( ){ int i,s=0;for(i=0;i<=100;i++)if(i%2==0)s=s+i;printf(“%d”,s);return 0;}4.以下程序的运行结果是#↙。
#include <stdio.h>intmain( ){ int i;for(i=1;i<6;i++){ if(i%2) {printf(“#”);break;}printf(“*”);}printf(“\n”);return 0;}5.以下程序的运行结果是#*#*#↙。
#include <stdio.h>intmain( ){ int i;for(i=1;i<6;i++){ if(i%2) {printf(“#”);continue;}printf(“*”);}printf(“\n”);}6.以下程序的运行结果是。
#include <stdio.h>intmain( ){ int i,j;for(i=1; i<=4;i++){ for(j=1;j<=2*i-1;j++)printf(“”);for(j=1;j<=4-i;j++)printf(“*”);printf(“\n”);}return 0;}5.3拓展实验一、程序分析2.⊙以下程序的运行结果是:x=5 y=3 z=0↙。
第5章补充习题及答案习题5.1 选择题(1)对定义语句int iArr[2]; 的正确描述是:()A. 定义一维数组iArr,其中包含iArr[1]和iArr[2]两个元素B. 定义一维数组iArr,其中包含iArr[0]和iArr[1]两个元素C. 定义一维数组iArr,其中包含iArr[0]、iArr[1]和iArr[2]三个元素D. 定义一维数组iArr,其中包含iArr(0)、iArr(1)和iArr[2]三个元素(2)以下关于数组的说法,不正确的是:()A. C语言中可以通过通过数组名对数值型数组进行整体的输入或输出B. 数组中的各元素依次占据内存中连续的存储空间C. 同一数组中的元素具有相同的名称和类型D. 在使用数组前必须先对其进行定义(3)有以下程序()#include “stdio.h”void main( ){ int iArr[3]={1,2,3},i;for(i=3; i>=1; i++) printf(“ %d ” , iArr[i] );}则程序运行后的输出结果是:A. 1 2 3B. 不确定的值C. 编译出错D. 3 2 1(4)执行以下程序段后,iArr[2]的值是:()int iArr[10]={1,2,3,4,5,6,7,8,9,10},i,j,t; i = 0 ; j = 9;while( i < j){ t= iArr[i] ; iArr[i] = iArr[j]; iArr[j]=t;i++; j--; }A. 8B. 2C. 3D. 9(5)有以下程序:#include “stdio.h”void main(){ char chA[10]=”abcdef”, chB[5]=”AB\0c”;strcpy(chA,chB);printf(“%c”, chA[3]);}则程序的运行结果是:()A. dB. cC. \0D. 05.2 填空题(1)对于二维数组iA[5][10],判断下列对数组元素的引用正确的是。
难度(*)
3、下面程序段
int k=2;
while (k=0) {printf(“%d”,k);k--;}
则下面描述中正确的是。
(C)
A )while 循环执行10 次
B )循环是无限循环
C )循环题语句一次也不执行
D )循环体语句执行一次
16、t为int类型,进人下面的循环之前,t的值为0 while( t=l )
{ ……}
则以下叙述中正确的是(B)
A) 循环控制表达式的值为0 B) 循环控制表达式的值为1
C) 循环控制表达式不合法D) 以上说法都不对
难度(**)
14、下述程序段的运行结果是(C)。
int a=1,b=2, c=3, t;
while (a<b<c) {t=a; a=b; b=t; c--;}
printf(“%d,%d,%d”,a,b,c);
A)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1
17、下面程序的功能是在输入的一批正数中求最大者,输入0 结束循环,选择填空。
(B)
main ( )
{ int a,max=0;
scanf(“%d”,&a);
while ( 【】) {
if (max<a) max=a ;
scanf (“%d”,&a);
}
printf(“%d”,max);
}
A)a==0 B)a C)!a==1 D)!a
36、以下程序的输出结果是(B)
void main()
{ int num= 0;
while(num<=2)
{ num++; printf("%d\n",num);}
}
A) 1 B) 1 C) 1 D) l
2 2 2
3 3
4
37、以下程序中,while循环的循环次数是(D)
void main()
{ int i=0;
while(i<10)
{ if(i<1) continue;
if(i==5) break;
i++;
}
......
}
A) 1 B) 10 C) 6 D) 死循环,不能确定次数
43、要求以下程序的功能是计算:s= 1+1/2+1/3+……+1/10
void main()
{ int n; float s;
s=1.0;
for(n=10;n>1;n--)
s=s+1/n;
printf("%6.4f\n",s);
}
程序运行后输出结果错误,导致错误结果的程序行是(C)
A) s=1.0; B) for(n=10;n>1;n--)
C) s=s+1/n; D) printf("%6.4f\n",s);
52、以下程序运行后的输出结果是___52___________。
void main()
{ int i=10, j=0;
do
{ j=j+i; i--;}
while(i>2);
printf("%d\n",j);
}
3、下述语句执行后,变量k 的值是。
(B)
int k=1;
while (k++<=9);
A)10 B)11 C)9 D)无限循环,值不定
15、以下程序执行后sum的值是(C)
main()
{ int i , sum;
for(i=1;i<6;i++) sum+=i;
printf("%d\n",sum);
}
A) 15 B) 14 C) 不确定D) 0
51、根据以下近似公式求π值:()
(π*π)/6=1+1/(2*2)+1/(3*3)+..+1/(n*n)
现在请你在下面的函数中填空,完成求π的功能。
#include "math.h"
main()
{ double s=0.0,pi; int i;
for(i=1;i<=n;i++) s=s+______1.0/(i*i)_______ ;
pi=sqrt(6*s));
}
50、要使以下程序段输出10个整数,请填入一个整数。
for(i=0;i<=_18_______ ;printf("%d\n",i+=2));
难度(***)
28、下述程序用“碾转相除法”计算两个整数m 和n 的最大公约数。
该方法的基本思想是计算m 和n 相除的余数,如果余数为0 则结束,此时的被除数就是最大公约数。
否则,将除数作为新的被除数,余数作为新的除数,继续计算m 和n 相除的余数,判断是否为0 ,等等,请填( 3 )空使程序完整。
main ( )
{ int m,n,w;
scanf(“%d,%d”,&m,&n);
while (n) {
w= 【1 】;(m%n)
m= 【2 】;(n)
n= 【3 】;(w)
}
printf(“%d”,m);
}
8、下面程序的功能是把316表示为两个数的和,使两个数分别能被13和11整除,请选择填空。
(B)
main()
{ int i=0, j, k;
do{ i++; k = 316 – 13*i; }while( );
j = k/11;
printf(“316=13*%d+11*%d”, i, j);
}
A) k/11 B)k%11
C) k/11==0 D) k%11==0。