《C语言课后习题(31页).docx》由会员分享,可在线阅读,更多相关《C语言课后习题(31页).docx(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-C语言课后习题-第 31 页习 题 一、选择题1. 以下定义数组的语句中正确的是( )。A)int a(10);B)char str;C)int n=5; int a4n;D) #define SIZE 10; char str 1SIZE,strSIZE +2;2. 对两个数组a和b进行如下初始化:static char a=abcd;static char b=a,b,c,d;则下列叙述正确的是( )。A)a与b数组完全相同B)a数组比b数组长度长C. a与b中都存放字符串D. a与b长度相同3. 下列语句中,不正确的是( )。A. static int a23=1,2,3,4,5,6;
2、B. static int a23=1,4,5;C. static int a3=1,4;D. static int a=1,2,3,4,5,6;4. 设有如下形式的字符数组定义: static char str=Beijing; 则执行下列语句后的输出结果为( )。 printf(“%d”, strlen(strcpy(str,Hdllo); A. 7B) 5C) 8D) 9 5. 在下面给出的语句中,( )是对一维数组正确赋初值的语句。A) int a10=This is a string;B) char a =This is a string;C) int a3=1,2,3,4,5,10
3、;D) char a3=This is a string;6. 已知对一维数组ns有如下说明:int ns10;要求使ns的所有元素都取值0。下面不正确的程序段是( )。A) for(j=0;j10;j+) nsj=0;B) ns0=0; for(j=1;j10;j+) nsj=nj1;C) for(j=1;j=10;j+) nsj=0;D) ns0=ns1=ns2=ns3=ns4=ns5=ns6=ns7=ns8=ns9=0;7. 有说明语句:int a 4=1,5,8,7,12,22,9,41,55,27;则数组a第维的长度应该是( C )。A) 2B) 3C) 4D) 58、下面程序运行后
4、,其输出是( ) #includevoid main() static char s30=”abcdefg”; static char t=”abcd”; int i,j; i=0; while(si!=0) i+; j=0; while(tj!=0) si+j=tj; j+; si+j=0; printf(“%sn”,s); A.abcdabcdefg B.abcdefg C.abcd D.abcdefgabcd 9、下面程序运行后,其输出是( ) #includevoid main() int a44,i,j,k; for(i=0;i4;i+) for(j=0;j4;j+) aij=i+j
5、; for(i=1;i4;i+) for(j=i+1;j4;j+) k=aij; aij=aji; aji=k; for(i=0;i4;i+) printf(“n”); for(j=0;j4;j+) printf(“%d ”,aij); A 0 1 2 3 B0 1 2 3 C 0 1 2 3 D3 2 1 0 1 2 3 4 1 2 5 4 1 2 4 2 4 3 2 1 2 3 4 5 2 3 4 5 2 3 5 3 5 4 3 2 3 4 5 6 3 4 5 6 3 4 6 4 6 5 4 3二、填空题1. 任何一个数组的数组元素都具有相同的数绷名和_。2. 同一数组中,数组元素之间是通
6、过_来加以区分的。3. 已知数组e定义为int e 4=1,2,3,4,5,6,7,8;则e是一个_行_列的二维数组,总共有_个元素,最大行下标是_,最大列下标是_,其首行的各元素的值分别是_。4. 要使aa成为具有如下初始值的二维int型数组,则最简单的定义aa的语句是_。1 0 0 0 01 2 0 0 01 2 3 0 01 2 3 4 01 2 3 4 55. 执行下列语句序列后,数组str2中的字符串是_。char str1 =ABCD,str210=XYZxyz;for(i=0;str2i=str1i;i+);6. 有说明语句:int x 4=1,2,3;那么元素x11的取值是_。
7、7. 下面的语句显示输出3行3列数组a的主对角线上的所有元素,请补充完整。for(i=_;i_;_)_printf(_);8. 下面的语句按行显式输出5行3列数组aa的所有元素,请补充完整。for(i=_;i_;_) for(j=_;j_;_) printf(_); printf(_);三、程序阅读1. 写出下列程序的运行结果。#includevoid main ( )int i,a33=1,2,3,4,5,6,7,8,9;for (i=0;i3;i+)printf(%d n, ai2-i);2. 阅读程序,说明其功能及输出的结果。#includevoid main() int k; char
8、 x,a10=a,b,c,d,e,f,g,h,i,j; for(k=0;k5;k+) x=ak; ak=a9k; a9-k=x; for(k=0;k10;k+) printf(%c”,ak); printf(n”);3. 阅读程序,说明其功能及输出的结果。#includevoid main()int j,k;int str =2,-4,5,15,19,-11,16,7;for(j=0,k=j;jstrk) k=j;printf(%c”, k);4. 阅读程序,说明运行后s1,s2数组中保存的字符串内容。#includevoid main()int k=0,j=0; har s110=abcde
9、f,s220=inter; scanf(%s,s1); while(s2k) k+; while(s1j) s2-k=s1+j;printf(%s”, s1);printf(%s”, s2);时,若键盘输入的是net,则s1中的字符串是_,s2中的字符串是_。5. 阅读程序,说明其功能及输出的结果。#include #include main( ) int s1,s2,s3; s1=strcmp(China,Russia); s2=strcmp(China,China); s3=strcmp(Chinaf,Chinae);printf(s1=%dn,s1);printf(s2=%dn,s2),
10、;printf(s3=%dn,s3);四、编程题1. 从键盘输入一组数据,显式输出其最大值。2. 编程实现用插入排序法对55,2,6,4,32,12,9,73,26,37这10个整数进行排序。【提示】插入排序法是一个简单,但相对比较高效的排序方法。插入排序通过将数组中的元素插入到适当的位置来进行排序,步骤如下所述。(1) 将数组中的头两个元素按排序顺序排列。(2) 把下一个元素(第3个)插入到其对应于已排序元素的排序位置。(3) 对于数组中的每个元素重复(2),即把第4个元素插入到适当位置,然后是第5个元素,等等3. 有一个34的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列
11、号。4. 编写一个程序在已知字符串中查找某个字符首次出现的位置,若字符串中没有该字符,给出相应信息。5. 输入一个字符串,统计其中包含的单词个数,假定单词与单词之间用空格分隔。6.编写一个程序,从键盘上输入2行3列数组的元素值,将其转置(即将行和列的元素互换),存到另一个二维数组中。7.设计一个程序,统计某学校3门课程(英语,数学,计算机)的考试成绩。要求能输入考生人数,并按编号从小到大的顺序依次输入考生的成绩,再统计出每门课程的全校总分、平均分以及每个考生课程的总分和平均分。8.设计一程序,它输入10个整数到一个数组中,调整这10个数在数组中的排列位置,使得其中最大的一个数成为数组的首元素,
12、最小的一个数成为数组的末元素。9用字符串拷贝函数实现2个字符串的拷贝。习题 一、单项选择题 1C语言的函数题中,下面( )是正确的。 A)可以定义和调用其它函数 B)可以调用但不能定义其它函数 C)不可调用但可以定义其它函数 D)不可调用及定义其它函数 2以下叙述中不正确的是( )。 A)一个函数中可以有多个return语句 B)函数通过return语句传回函数值 C)主函数可以有形参 D)调用函数须独立语句完成 3以下叙述中不正确的是( )。 A)在不同的函数中可以使用相同的名字的变量 B)函数中的形式参数是局部变量 C)在一个函数内定义的变量只在本函数范围内有效 D)在一个函数内的复合语句
13、中定义的变量在本函数范围内有效 4以下正确的说法是( )。A)实参和与其对应的形参各占用独立的存储单元 B)实参和与其对应的形参共占用一个存储单元 C)只有当实参和与其对应的形参同名时才共占用相同的存储单元 D)形参时虚拟的,不占用存储单元 5C语言规定,函数返回值的类型是由( )决定的。 A)return语句中的表达式类型 B)调用该函数时的主调函数类型 C)调用该函数时由系统临时 D)在定义函数时所指定的函数类型 6若用数组名作为函数调用的实参,传递给形参的是( )。 A)数组的首地址 B)数组中第一个元素的值C)数组中的全部元素的值 D)数组元素的个数 7以下不正确的说法是( )。A)形
14、参的存储单元是动态分配的 B)函数中的局部变量都是动态存储C)全局变量都是静态存储D)动态分配的变量的存储空间在函数结束调用后就被释放了8C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为( )。 A)地址传递 B)单向值传递 C)由实参传给形参,再由形参传回给实参 D)由用户指定传递方式 9已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为( )。 int a34; f(a); A)f(int array6) B)f(int array3) C)f(int array4) D)f(int array25) 10设有如下宏定义: #defin
15、e MU(X,Y) (X)*(Y) a=MU(5,2); b=6/MU(a+3,a); 请问b的表达式是( )。 A) b=6/(a+3)*(a) B) b=6/(a+3)*(a) C) b=6/a+3*a D) b=6/(a+3*a) 二、阅读下面的程序,写出程序运行的结果。1#include void fun(int a,int b,int c) a=456;b=567;c=678; main() int x=10,y=20,z=30; fun(x,y,z); printf(%d,%d,%dn,x,y,z); 程序运行结果: 2func (int a,int b) static int m
16、=0,i=2; i+=m+1; m=i+a+b; return (m); main ( ) int k=4,m=1,p1,p2; p1=func(k,m) ; p2=func(k,m) ; printf(%d,%dn,p1,p2) ; 程序运行结果: 3#include # define MAX 10 int aMAX, i ; sub1 ( ) for (i=0; iMAX; i+) ai=i+i ; sub2 ( ) int aMAX, i ,max ; max=5; for (i=0; iMAX; i+) ai=i ; sub3 (int a ) int i ; for (i=0; iM
17、AX; i+) printf(“%d ”,ai); printf(“n”); main ( ) sub1( ); sub3(a); sub2( ); sub3(a); 程序运行结果: 4#include int fun(int ,int ); main() int a=36,b=4,c; c=fun(b,a); printf(%dn,c); int fun(int u,int v) int w; while(v) w=u%v;u=v;v=w; return u; 程序运行结果: 5#include #define G 3 #define MG(m) (m)*G #define PR(x) pr
18、intf(%dn,x*1000); main() int a=1,b=2; PR(MG(a+b); 程序运行结果:9000 6#include#includemain()void fun(char str , char ch);char s20= abababab,ch= a;fun(s,ch);puts(s);void fun(char str , char ch) int i=0,j; while(stri!=0) if(stri=ch) for(j=i+1;jstrlen(str);j+) strj-1=strj; strj-1=0; else i+; 程序运行结果: 三、编程题 1定义
19、一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 2编写一函数,用递归方法求:1+1/2+1/3+1/4+1/5+1/6+1/7.+1/n。n的值从键盘输入。3编写函数fun(char a ),实现:将字符串a中的元素按照从小到大排序后输出。4已知函数fun(n),n为三位自然数,判断n是否为水仙花数,是返回1,否返回0。在main函数中,输入一个数num,调用fun(num)函数,并输出判断结果。水仙花数是指一个 n 位数 ( n3 ),它的每个位上的数字的 n 次幂之和等于它本身。 5编写函数,功能是删除整型数组a(数组中的元素按值非递减有
20、序排列)中的值为x的所有元素,n为数组a的元素个数,函数返回删除后的数组a元素个数,在main函数中调用此函数,并输出执行删除操作后的数组a中的元素。 6编写函数,将字符串str1中的小写字母全部拷贝到字符串str2中,并返回被拷贝的字符的个数。习题7一、选择题1.若int x ,*px;,则正确的赋值表达式是 。A. px=&x B. px=x; C. *px=&x; D. *px=*x2.有如下程序段int *p ,a=2 ,b=5;p=&a ; a=*p+b ;执行该程序段后,a 的值为 。A. 8 B. 7 C. 6 D. 编译出错3.要求函数的功能是交换x和y中的值,且通过正确调用返
21、回交换结果。能正确执行此功能的函数是 。A. void funtiona (int *x,int *y) int *p; *p=*x; *x=*y;*y=*p; B. void funtionb (int x,int y) int t; t=x;x=y;y=t; C. void funtionc (int *x,int *y) *x=*y;*y=*x;D. void funtiond (int *x,int *y) *x=*x+*y;*y=*x+*y;*x=*x-*y; 4. 若有说明:long *pa ,a;则能通过scanf 语句正确给输入项读入数据的程序段是 。A. *pa=&a; sc
22、anf(%ld,&pa);B. pa=(long *)malloc(8); scanf(%ld,&pa);C. scanf(%ld,pa=&a);D. scanf(%ld,a);5.若有以下定义和语句:int a10=2,4 ,6 ,8 ,10 ,12 ,14 ,16 ,18 ,20 ,*p=a ;则不能表示a 数组元素的表达式是 。A. *p B. a10 C. *a D. ap-a6.若有以下定义和语句:int a23 ,(*pa)3 ; pa=a ;则对a数组元素非法引用是 。A. *(a0+2) B. *(pa+1)2 C. pa00 D. *(pa1+2)7.设有如下的程序段:cha
23、r str =Hello ;char *ptr ;ptr=str ;执行上面的程序段后 ,*(ptr+5)的值为 。A. o B. 0 C. 不确定的值 D. o的地址8.下面各语句行中,能正确进行字符串赋值操作的语句是 。A. char ST5=ABCDE;B. char S5=A,B,C,D,E;C. char *S; S=ABCDE;D. char *S; scanf(%S,S);9.下列函数的功能是 。int fun1(char * x) char *y=x; while(*y+) ; return(y-x-1);A. 求字符串的长度 B. 比较两个字符串的大小C. 将字符串X复制到字
24、符串Y D. 将字符串X 连接到字符串Y 后面10.若有说明:int i, j=5,*p=&i;,则能完成i=j 赋值功能的语句是 。A. i=*p; B. *p=*&j; C. i=&j; D. i=*p;11.设有如下定义:char *aa2=abcd,ABCD;则以下说法中正确的是 。A. aa 数组元素的值分别是abcd和ABCDB. aa 是指针变量,它指向含有两个数组元素的字符型一维数组C. aa 数组的两个元素分别存放着含有4 个字符的一维字符数组的首地址D. aa 数组的两个元素中各自存放了字符a和A的地址二、填空题1 在数组中同时查找最大元素下标和最小元素下标,分别存放在ma
25、in函数的变量max和 min中。#include #define N 7void find(int *a,int *max,int *min) int i; for(i=0;i=*max) ; if(ai str2,则输出正值,如str1 str2,则输出负值。#include int compare(char *p1,char *p2)while( (*p1!=0) & ) p1+; return *p1-*p2; void main( )int m;char str120,str220,*p1,*p2; printf(please input string by line:n); sca
26、nf(%s,str1); scanf(%s,str2); p1= ; p2= ; m=compare(p1,p2); printf(the result is:%dn,m);三、阅读下列程序,给出运行结果。1.#include void compute(int x,int y,int *cp,int *dp)*cp=x*y; *dp=x/y;void main()int a,b,c,d;a=10; b=2;compute(a,b,&c,&d);printf(%d,%dn,c,d);2. #include void main()int a=2,4,6,8,10;int y=1,i,*p; p=&
27、a1;for(i=0;i3;i+) y+=*(p+i);printf(y=%dn,y);3.#include void main()char str=ABCD,*ps;for(ps=str;psstr+4;ps+) printf(%sn,ps);4.#include int funA(int x)return x*x; int funB(int x)return x*x*x; int fun(int (*f1)( ),int (*f2)( ),int x)return f2(x)-f1(x); void main()int i;i=fun(funA,funB,4); printf(%dn,i)
28、;5.#include char mychange(char ch)if (ch=A&ch=Z) ch=ch-A+a; return ch;void main( )char s=ABCDEFG123,*p=s;while(*p) *p=mychange(*p); p+;printf(%sn,s);6.#include void main( )int a5=4,5,6,7,8,*p,*pp;p=a; pp=&p;printf(%d,*(p+);printf(%dn,*pp);四、编程题1.编写函数mystrlen,求一个字符串的长度。要求在main函数中输入字符串,调用mystrlen函数并输出
29、其长度。2.编写函数sort,对传过来的字符串数组进行排序。要求在main函数中输入10个字符串,调用sort函数,然后在主函数输出这10个已排好序的字符串。3.编写程序,从键盘输入月份号,输出该月的英文月名。例如,输入3,则输出March,要求用指针数组处理。习题8一、选择题1. 对于以下的变量定义,表达式 是正确的。struct node char s5;int k; p4;A.p-k=2 B.p0.s=“abc” C.p0-k=2 D.p-s=a2. 设有如下定义:struct node int a; float b; data;int *p;若要使p 指向data 中的a 域,正确的赋
30、值语句是 。A. p=&a; B. p=data.a; C. p=&data.a; D. *p=data.a;3. 设有如下说明typedef struct int n; char c; double x;STD;则以下选项中,能正确定义结构体数组并赋初值的语句是 。A. STD s2=1,A,62,2, B,75; B. STD s2=1,A,62,2, B,75;C. struct s2=1,A,2, B; D. struct s2=1,A,62.5,2, B,75.0;4. 当说明一个共用体变量时系统分配给它的内存是 。A. 各成员所需要内存量的总和 B. 共用体中第一个成员所需内存量C
31、. 成员中占内存量最大者所需的容量D. 共用体中最后一个成员所需内存量5. C 语言共用体类型变量在程序运行期间 。A. 所有成员一直驻留在内存中B. 只有一个成员驻留在内存中C. 部分成员驻留在在内存中D. 没有成员驻留在内存中6. 以下对枚举类型名的定义中正确的是 。A. enum NUM=one ,two ,three ;B. enum NUM one=9 ,two=-1 ,three ;C. enum NUM =one ,two ,three ;D. enum NUM one ,two ,three ;7. 设有如下枚举类型定义:enum LANGUAGE Basic=3 ,Assem
32、bly ,Ada=99 ,COBOL ,Fortran ;枚举量Fortran 的值为 。A. 4 B. 7 C. 101 D. 28. 下面叙述中不正确的是 。A. 用typedef 可以定义各种类型名,但不能用来定义变量B. 用typedef 可以增加新类型C. 用typedef 只是将已存在的类型用一个新的标识符来代表D. 使用typedef 有利于程序的通用和移植9. 以下各选项企图说明一种新的类型名,其中正确的是 。A. typedef tp1 int; B. typedef tp2=int;C. typedef int tp3; D. typedef tp4: int;10. 设有
33、以下说明语句typedef struct int age; char name8;PERSON;则下面叙述中正确的是 。A. PERSON 是结构体变量名 B. PERSON 是结构体类型名C. typedef struct 是结构体类型 D. struct 是结构体类型名二、填空题1. 编写一个程序,首先定义一个复数数据类型,即结构类型。然后按照复数的运算规则进行计算,并按照复数表示的格式进行输出。#include struct complexint real; int imag; c1,c2,s,d;void main( ) scanf(%d%d,&c1.real,&c1.imag); s
34、canf(%d%d,&c2.real,&c2.imag); s.real= ; s.imag= ;if(s.imag =0) printf(sum=%d+%din,s.real,s.imag);elseprintf(sum=%d%din,s.real,s.imag); d.real= ; d.imag= ;if(d.imag =0) printf(difference=%d+%din,d.real,d.imag);elseprintf(difference=%d%din,d.real,d.imag);2. 有五名学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者的学号、姓名和成绩(使用指向一维数组的指针)。#include struct studentint num; char name10; float score;void main()struct student stu5; struct student *p; int i,temp=0; float ; for( p=stu;pnum,p-name,&p-score); for(i=0 ;iamax) amax=stui.score;temp=i; printf( NO: %dn name: %sn score: %4.1fn,p-num,p-nam