C语言教案资料.doc
如有侵权,请联系网站删除,仅供学习与交流C语言【精品文档】第 20 页练习1. 下面的字符序列中哪些不是合法的变量名: -abc_aaforpp.288to beIBM/PCms-c#microm%usttihswhiler24_s25_a_ba"bc_3452. 假设整型变量a的值是1,b的值是2,c的值是3,在这种情况下分别执行下面各个语句,写出执行对应语句后整型变量u的值。 1) u = a ? b : c;2) u = (a = 2) ? b + a : c + a;3. 假设整型变量a的值是1,b的值是2,c的值是0,写出下面各个表达式的值。 1) a && !(b | c) && !a) 2) !(a && b) | c ? a | b : a && b && c3) !(a + b < c) && b <= c * a - b4. 下面程序在执行时,哪些地方将发生类型转换?程序打印的值是什么? int f (int n, float m) return (m + n) / 4;int main (void) float y = 3;printf("%dn", f(y, y + 1);return 0;5. 写一个简单程序,它输出从1到10的整数。 。 C语言部分一、语言基础单项选择题(每题2分,共30分) (一) C程序是由_和 _构成的。 1A)主函数与子程序 B)主函数与若干子函数 C)一个主函数与一个其它函数 D)主程序与子程序 (二) 以下选项中合法的常量是_D_。 2A) Internet B)E3 C) 02x D) 0xfeL (三) 以下选项中合法的用户标识符是_C_。 3A)for B)3Dmax C)_123Test D)B.dat4A)d=8+a+f=d+8 B)d=(a+8)+ C)d=(8+e,e+,d+8) D)d=8+e+=d+7 (五) 设x,y,a,b,c为int型变量,且值均为0,在Turbo C环境下执行 (x=a=b)|(y=c=b)后,x,y的值是_C_。 5A) 0,0 B) 0,1 C) 1,0 D) 1,1 (六) 设有int i=011,j=10;则printf(“%d,%dn”,+i,j-);的输出结果是_C_。 6A)011,9 B)012,9 C) 10,10 D) 10,9 (七) 以下选项中,与k=i+完全等价的表达式是_A_。 7A)k=i,i=i+1 B)i=i+1,k=i C)k=i+1 D)k+=i+1 (八) 有以下程序段 int n=0,p; do scanf(“%d”,&p); n+; while(p!=123&&n<2); 则dowhile循环的结束条件是_D_。 8A) p的值不等于123并且n的值小于2 B) p的值等于123并且n的值大于等于2 C) p的值不等于123或者n的值小于2 D) p的值等于123或者n的值大于等于2(九) 若定义:int x=3,*p=&x,*q=p;则以下非法的赋值语句是_C_。9. A) p=q B) *p=*q C) p=x D) x=*q(十) 在执行char str10=”Turbo C0”; strlen(strcpy(str,”china”);后结果是_A_。 10A) 5 B) 7 C) 6 D) 9(十一) 执行下列程序 #define M(a,b) (a)>(b)?(a):(b) main() int i=10,j=15;printf(“%dn”,10*M(i,j); 后输出的结果是_A_。11A) 10 B) 15 C) 100 D) 150 (十二) 若有说明:int i,j=5, *p=&i,则与i=j;等价的语句是_B_ 。 12A)i=*p; B) *p=*&j; C) i=&j; D) i=*p;(十三) 设有如下定义,则对data中的a成员的正确引用是_B_ 。 struct sk int a; float b; data,*p=&data; 13A) (*p).data.a B) (*p).a C )p->data.a D) p.data.a (十四) 若有如下定义,则printf(“%dn”,sizeof(them);的输出是_D_ 。 typedef union long x2; int y4; char z8; MYTYPE; MYTYPE them; 14A) 32 B)24 C)16 D) 8(十五) 若需要打开一个已经存在的非空文件"file"进行修改,正确的打开语句是_B_ 。A) fp=fopen(“file”,”r”) B) fp=fopen(“file”,”r+”)C) fp=fopen(“file”,”w”) D) fp=fopen(“file”,”rb+”)二、阅读下列程序,写出运行结果(每题4分,共20分)程序1 #include <stdio.h> main() char sl10,s210,s310,s410; 运行结果: scanf(“%s%s”,s1,s2); aaaa gets(s3); gets(s4); l234 puts(s1); puts(s2); puts(s3); puts(s4); bbbb 5678 程序运行时输入数据为: aaaa l234 bbbb 5678程序2 main() int a=13,b=21,m=0; 运行结果:3 switch(a%3) case 0: m+; break; case 1: m+; switch(b%2) default: m+; case 0: m+; break; printf(“%dn”,m);程序3 #include <stdio.h> 运行结果:54 main() int a34= 0,2,4,6,8,10,12,14,16,18,20,22 ; int (*p)4=a,i,j,k=0; for(i=0;i<3;i+) for(j=0;j<2;j+) k=k+*(*(p+i)+j); printf(“%dn”,k);程序 4 #include <stdio.h> s(int n) 运行结果:22 static int i=1; 32 int j=1; 42 if(n>0) +i; j+; printf(“%d%dn”,i,j); s(n-1); main() int k=3; s(k); 程序5 #include <stdio.h> 运行结果:data=1468 main() char c; int i,data=0; for(i=0;i<4;i+) c=getchar(); if(c<0|c>9) break; data=data*lO+c-0; /*字符转成数字*/ printf(“data=%dn”,data); 程序运行时输入数据为:1468 三、阅读分析下列程序,在_线处填上适当内容,使程序(或函数)完整。 (每空2分,共18分) 1有以下程序,其功能是将从键盘输入的小写字母转换成大写字母输出, 当输入为“#”时,结束转换。 main() char ch; scanf(“%c”,&ch); while( ch!=# ) if(ch>=a&&ch<=z) printf(“%c”, ch-32 ); scanf(“%c”,&ch); 2求Fibonacci数列前20项的值并输出。Fibonacci数列:1,1,2,3,5,8,13, 。可以用如下递归公式求它的第n项: 1 n=1,n=2Fn= Fn-1+Fn-2 n>2 main() static int n,f20= 1,1 ; for(n=2;n<20;n+) fn= fn-1+fn-2 ; for(n=0;n<20;n+) if(n%5=0) printf(“n”); printf(“%lOd”,fn);3输入10个数,从小到大排序。 main() int i,j,p,q,s,a10; printf(“n input l0 unmbers: n”); for(i=0;i<10;i+) scanf(“%d”,&ai); for(i=0;i<9;i+) p=i; q= ai ; for(j=i+1;j<10;j+) if( q>aj ) p=j; q=aj; if(i!=p) s=ai; ai=ap ; ap=s; printf(“n%d”,ai);4下列程序的功能是输入一个字符串存人字符数组a中,然后将其中的所有字符删除后再存入字符数组b,最后将字符数组b中的字符串输出。 #include <stdio.h> #include <string.h> main() char a81,b81,*p1=a, *p2=b; gets(p1); while(*p1!=0) if(*p1=) p1+ ; else *p2+=*p1+ ;puts(b);四、编写程序题(共22分)1求两个整数的最大公约数和最小公倍数。(6分)main()int a,m,n,t; scanf("%d%d",&m,&n); a=m*n; while(t=m%n )!=0) m=n;n=t; printf("greatest common divisor= %dn",n); printf("least common multiple= %dn",a/n);2. 编写一程序,输出如下图形。(8分)main()int m,n; for(n=1;n<=5;n+) for(m=1;m<=n-m;m+) printf(“ ”); printf(“*n”); 3按下述递归定义编写一个计算幂级数的递归函数。(8分) 1 n=0xn= x*xn-1 n>0long fun(int x,int n)long int y; if(n=0) y=1; else y=x*fun(x,n-1); return y;main()int x,n;scanf(“%d%d”,&x,&n);printf(“%ld”,fun(x,n); 基础知识和C语言程序设计一、选择题(每题1分,共50分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。 (1)在计算机中,一个字节所包含二进制位的个数是 A)2 B)4 C)8 D)16 (2)在多媒体计算机中,CD-ROM属于 A)存储媒体 B)传输媒体 C)表现媒体 D)表示媒体(3)在Windows系统中,不同文档之间互相复制信息需要借助于 A)磁盘缓冲区 B)写字板 C)剪贴板 D)记事本 (4)十六进制数100转换为十进制数为 A)256 B)512 C)1024 D)64 (5)能将高级语言编写的源程序转换为目标程序的软件是 A)汇编程序 B)编辑程序 C)解释程序 D)编译程序 (6)在Internet中,用于在计算机之间传输文件的协议是 A) TELNET B)BBS C)FTP D)WWW (7)在Windows环境下,资源管理器左窗口中的某文件夹左边标有“+”标记表示 A)该文件夹为空 B)该文件夹中含有子文件夹 C)该文件夹中只包含有可执行文件 D)该文件夹中包含系统文件(8)在Windows环境下,下列叙述中正确的是 A)在“开始”菜单中可以增加项目,也可以删除项目 B)在“开始”菜单中不能增加项目,也不能删除项目 C)在“开始”菜单中可以增加项目,但不能删除项目 D)在“开始”菜单中不能增加项目,但可以删除项目 (9) 从Windows环境进入DOS方式后,返回Windows环境的命令为 A)QUIT B)WIN C)EXIT D)ESC(10) 下列叙述中正确的是 A)计算机病毒只感染可执行文件 B)计算机病毒只感染文本文件 C)计算机病毒只能通过软件复制的方式进行传播 D)计算机病毒可以通过读写磁盘或网络等方式进行传播(11)以下叙述中正确的是 A)C程序中注释部分可以出现在程序中任意合适的地方 B)花括号“”和“”只能作为函数体的定界符 C)构成C程序的基本单位是函数,所有函数名都可以由用户命名 D)分号是C语句之间的分隔符,不是语句的一部分(12)以下选项中可作为C语言合法整数的是 A)10110B B)0386 C)0Xffa D)x2a2(13)以下不能定义为用户标识符的是 A)scanf B)Void C) _3com_ D)int(14)有以下程序 main() int a; char c=10; float f=100.0; double x; a=f/=c*=(x=6.5); printf(”%d %d %3.1f3.1fn”,a,c,f,x); 程序运行后的输出结果是 A)1 65 1 6.5 B)1 65 1.5 6.5 C)1 65 1.0 6.5 D)2 65 1.5 6.5 (15)以下选项中非法的表达式是 A)O<=x<100 B)i=j=0 C)(char)(65+3) D)x+l=x+l(16)有以下程序 main() int a=l,b=2,m=0,n=O,k; k=(n=b>a)|(m=a<b); printf(”%d,%dn”,k,m); 程序运行后的输出结果是 A)0,0 B)0,1 C)1,0 D)1,1(17)有定义语句:int x,y;,若要通过scanf(“%d,%d”,&x,&y);语句使变量x得到数值11,变量y得到数值12,下面四组输入形式中,错误的是 A)11 12<回车> B)11, 12<回车> C)11,12<回车> D)11,<回车> 12<回车>(18)设有如下程序段: int x=2002,y=2003; printf("%dn",(x,y); 则以下叙述中正确的是 A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出 B)运行时产生出错信息 C)输出值为2002 D)输出值为2003(19)设变量x为float型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是 A)x=x*100+0.5100.0; B)x=(x*100+0.5)100.0; C)x=(int)(x*100+0.5)/100.0; D)x=(x/100+0.5)*100.0;(20)有定义语句:int a=1,b=2,c=3,x;,则以下选项中各程序段执行后,x的值不为3的是 A)if(c<a) x=l; B) if(a<3) x=3; else if(b<a) x=2; else if(a<2) x=2; else x=3; else x=l; C) if(a<3) x=3; D) if(a<b) x=b; if(a<2) x=2; if(b<c) x=c; if(a<1) x=l; if(c<a) x=a; (21)有以下程序 main() int s=O,a=l,n; scanf(”%d”,&n); do s+=1; a=a-2; while(a!=n); printf(”%dn”,s); 若要使程序的输出值为2,则应该从键盘给n输入的值是 A)-1 B)-3 C)-5 D)0 (22)若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0) s=a; for(b=1;b<=c;b+) s=s+l; 则与上述程序段功能等价的赋值语句是 A) s=a+b; B)s=a+c; C)s=s+c; D)s=b+c; (23)有以下程序 main() int k=4,n=O; for(;n<k;) n+; if(n%3!=0) continue; k-; printf(”%d,%dn”,k,n); 程序运行后的输出结果是 A) 1,1 B) 2,2 C) 3,3 D) 4,4(24)要求以下程序的功能是计算:s=1+1/2+1/3+1/10 main() int n; float s; s=1.0; for(n=lO;n>l;n-) s=s+l/n; printf(”%6.4fn”,s); 程序运行后输出结果错误,导致错误结果的程序行是 A)s=1.0; B)for(n=10;n>l;n-) C)s=s+l/n; D)printf("%6.4fn",s);(25)已定义ch为字符型变量,以下赋值语句中错误的是 A)ch=; B)ch=62+3; C)ch=NULL; D)ch=xaa;(26)若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是 A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参(27)有以下函数定义: void fun(int n,double x) 若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是 A)fun(int y,double m); B)k=fun(10,12.5); C)fun(x,n); D)void fun(n,x);(28)有以下程序 void fun(char *a,char *b) a=b; (*a)+; main() char c1=A,c2=a,*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf(”%c%cn”,c1,c2); 程序运行后的输出结果是 A)Ab B)aa C)Aa D)Bb(29)若程序中已包含头文件stdio.h,以下选项中,正确运用指针变量的程序段是 A)int *i=NULL; B)float *f=NULL; scanf(”%d”,i); *f=10.5; C)char t=m,*c=&t; D) long *L; *c=&t; L=0;(30)有以下程序 #include <stdioh> main() printf(”%dn”,NULL); 程序运行后的输出结果是 A)0 B)1 C)-1 D)NULL没定义,出错(31)已定义c为字符型变量,则下列语句中正确的是A)c=97; B)c=”97”; C)c=97; D)c=”a”;(32)以下不能正确定义二维数组的选项是 A)int a22=1,2; B)int a2=1,2,3,4; C)int a22=1,2,3; D)int a2=1,2,3,4;(33)以下选项中不能正确把c1定义成结构体变量的是 A)typedef struct B)struct color cl int red; int red; int green; int green; int blue; int blue; COLOR; ; COLOR cl; C)struct color D)struct int red; int red; int green; int green; int blue; int blue; cl; cl;(34)以下能正确定义一维数组的选项是 A)int num: B)#define N 100 int numN; C)int num0100; D) int N=100; int numN;(35)下列选项中正确的语句组是 A)char s8; s=”Beijing”; B)char *s; s=”Beijing”; C)char s8; s=”Beijing”; D)char *s; s=”Beijing”;(36)已定义以下函数 fun(int *p) return *p; 该函数的返回值是 A)不确定的值 B)形参p中存放的值 C)形参p所指存储单元中的值 D)形参p的地址值 (37)下列函数定义中,会出现编译错误的是 A)max(int x,int y,int *z) B)int max(int x,y) *z=x>y ?x:y; int z; z=x>y ? x:y; return z; C)max(int x,int y) D)int max(int x,int y) int z; return(x>y?x:y); z=x>y?x:y; return(z);(38)有以下程序 #include <stdio.h> #define F(X,Y) (X)*(Y) main() int a=3,b=4; printf(”%dn”,F(a+,b+); 程序运行后的输出结果是 A) 12 B) 15 C) 16 D)20 (39)有以下程序 fun(int a,int b) if(a>b) return(a): else return(b); main() int x=3,y=8,z=6,r; r=fun(fun(x,y),2*z); printf(”%dn,r); 程序运行后的输出结果是 A) 3 B) 6 C) 8 D) 12(40)若有定义:int *p3;,则以下叙述中正确的是 A)定义了一个基类型为int的指针变量p,该变量具有三个指针 B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针 C)定义了一个名为*p的整型数组,该数组含有三个int类型元素 D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素(41)以下程序中函数scmp的功能是返回形参指针s1和s2所指字符串中较小字符串的首地址 #include <stdio.h> #include <string.h> char *scmp(char *s1,char *s2) if(strcmp(s1,s2)<0) return(s1); else return(s2); main() int i; char string20,str320; for(i=0; i<3;i+) gets(stri); strcpy(string,scmp(str0,str1);*库函数strcpy对字符串进行复制* strcpy(string,scmp(string,str2); printf(”%sn”,string); 若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为 A)abcd B)abba C)abc D)abca(42)有以下程序 struct s int x,y;data2=10,100,20,200; main() struct s *p=data; printf(”%dn”,+(p->x); 程序运行后的输出结果是 A) 10 B) 11 C) 20 D) 21 (43)有以下程序段 main() int a=5,*b,*c;c=&b; b=&a; 程序在执行了c=&b;b=&a;语句后,表达式:*c的值是 A)变量a的地址 B)变量b中的值 C)变量a中的值 D)变量b的地址 (44)有以下程序 #include <string.h> main() char str20=”Hello”,”Beijing”,*p=str; printf(”%dn”,strlen(p+20); 程序运行后的输出结果是 A) 0 B) 5 C) 7 D) 20 (45)已定义以下函数 fun(char *p2,char *p1) while(*p2=*p1)!=0)p1+; p2+; 函数的功能是 A)将p1所指字符串复制到p2所指内存空间 B)将p1所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有0(46)有以下程序 main() int x=3,y=2,z=l; printf(”%dn”,x/y&z); 程序运行后的输出结果是 A) 3 B) 2 C) 1 D) 0(47)若fp已正确定义并指向某个文件,当未遇到该文件结束