同济大学C语言期末考试卷 2005-2006学年第二学期《C程序设计期末试卷》(闭卷) 一、单项选择题(20分) 1. 在定义函数时,能用以下 (1) 标识符作函数名。 A.struct B._abc C. 8abc D. abc@sina.com 2在一个函数被调用执行过程中,当执行到函数体中 (2) 语句后立即无条件返回主调函数。 A.goto B.break C.continue D.return 3.以下关于main函数定义的叙述中,错误的是 (3) 。 A. main函数是自定义函数,因此函数体中的声明和语句都是可选的 B. main函数定义时可以有形式参数也可以没有形式参数 C. main函数定义必须出现在一个源程序的起始位置 D. 在一个源程序中只能有一个main函数定义 4.以下函数定义中正确的是 (4) 。 A. double fun(intx,y){ return x*y;} B. double fun(intx,int x){ return x*x; } C. double fun(register intx,int y){ return x*x;} D. double fun(extern intx,int y){ return x*y;} 5.若函数定义为void fun(intx,inty,int *p) { *p= x>y ? x : y; },且main函数中有声明“int a=1,b=2,c[2]={0};”,则以下语句中正确的是 (5) 。 A.printf(“%d”,fun(a,b,c)); B.fun(a,b,c+1); C.fun(a,b,c[2]); D.fun(1,2); 6. 若函数定义为double fun(double x,double y){ return x/y;},则以下fun引用声明(函数原型)中错误的是 (6) 。 A. double fun(double x,double y); B. double fun(double a,double b); C. double fun(double ,double ); D. float fun(double x,double y); 7.以下程序段中,有语法错误的是 。 A. double f; double f (double x) { return f=x*x; } C. double f (double x) { double f; return f=x*x; } B. double f (double f) { return f*f;} D. double f (double x) { if(x>0){ double f ; return f=x;} else{ double f ; return f= -x;} } 8.以下一维数组声明中,正确的是 (8) 。 A. int a[ ]; B.int b[10],a[b]; C. int a[4]={1,2,3,4,5}; D. int a[sizeof('a')]={'a'}; 9.以下二维数组声明中,正确的是 (9) 。 A. char b[2][3]={“a”.”b”.”c”}; B. char b[][3]={0}; C. char b[2][]={0}; D. char b[][]={0}; 10.已知有二维数组声明“int a[3][3]={1,2,3,4,5,6,7,8,9};”,不能正确输出数组a中第2行(行下标为1)第3列元素(列下标为2)的语句是 (10) 。 A.printf(“%d”,a[1][2]); B. printf(“%d”,*(*(a+1)+2)); C. printf(“%d”,*(a+1)[2]); D. printf(“%d”,*(a[1]+2)); 11.若需要将字符串“happy”和“good luck”存储到数组中,则以下选项中正确的是 (11) 。 A. char s[2][10]; s[2][10]={“happy”, “good luck” }; B. char s[2][10]; s[0]= “happy”;s[1]=“good luck”; C. char s[2][10]; strcpy(s[0][0],“happy”);strcpy(s[1][0],“good luck”); D. char s[2][10]; strcpy(s[0],“happy”);strcpy(s[1],“good luck”); 12.已知有声明“char *s=”happy birthday”,t[10];”,要求将s指向的字符串中“birthday”子串复制到t数组中并输出t数组中的字符串,正确的操作的是 (12) 。 A.puts(strcpy(t,s)); B. puts(strcpy(t,s+6)); C. puts(strcat(t,s)); D. puts(strcat(t,s+6)); 13.在以下结构类型定义中,正确的是 (13) 。 A. struct for { intx,y; }; C. struct For { static int x, y; }; B. struct FOR { intx,y; }; D. struct FOR { int x; int x; };
A.B.C.D.
13. A.B.C.D. 14.已知有数据类型定义及变量声明如下: struct { int a; struct { char name[10];}b; }s={1,”mark”},*ps=&s; 则以下选项中能够输出“mark”的语句是 (14) 。 A.puts(name); B.puts(b.name) C.puts(s.b.name); D.puts(*p.b.name); 15.若已有数据类型定义为“struct { intx,y;}a={2,3},b={0};”,则以下语句中正确的是 (15) 。 A.b=a; B.if(a!=b)b=a; C.b+=a; D.b++; 16.在基于以下全局对象标识符p的声明中,不能做p++运算的声明是 。 A.int p; B.int a[10], *p=a; C. int a[2],*p[2]={a}; D. int a[2][2], (*p)[2]=a; 17. 若已有声明“int a[][3]={{1,2,3},{4,5},{6}},*p1=&a[0][0], (*p2)[3]=a;”,以下选项中的语句分别被执行后,屏幕输出结果不是4选项是 (17) 。 A. printf("%d",a[1][0]); B. printf("%d",a[0][3]); C. printf("%d",p1[4]); D. p2++; printf("%d",p2[0][0]); 18.以下选项均为fun函数的定义,其中有语法错误的是 (18) 。 A. void fun(int x, int *y){ x*=*y;} B. void fun(int x, int *y){ *x*=*y;} C. void fun(int *x,int y){ *x+=y;} D. int *fun(int *x,int y){ return x+=y;} 19.以下表达式中,不要求操作数a必须是左值的选项是 (19) 。 A.a++ B.*a C.--a D.a=0; 20.已知有数据类型定义为“enum flower{ROSE,LILY,TULIP}flo[2]={1,2},*pf;”则以下语句中正确的是 (20) 。 A. flo[ROSE]=LILY; B.ROSE=flo[LILY]; C. pf=&ROSE; D. flo[LILY+TULIP]=LILY; 二、填空题(18分) 1.当定义一个无返回值函数时,函数的返回值类型标应为 (1) 。 2.若已有二维数组声明“int a[][3]={{1},{2},3,4,5,6};”,则该数组共有 (2) 个数组元素。 3.若有如下数据类型定义及数组声明,则p数组在内存中占用的存储字节数为 (3) 。 struct { long x; union { int a; char b; float c;}y; }p[5]; 4.“int (*pa)();”是 (4) 的声明。 5.当程序中需要调用库函数strcmp时,应当包含头文件 (5) 。 6.当某程序准备从一个磁盘文件中读入数据,需要有类似“FILE *fp;”这样的声明,该声明中的FILE是指 (6) 。 7. 以下程序运行后输出结果是 (7) . #include int f(intx,int y) { if(x return x,y; else returny,x; } main() { printf("%d",f(2,3)); } 8. 以下程序运行后输出结果的第一行是 (8) 第二行是 (9) 。 #include void f(int *a,int n, int times) { inti,t=a[0]; for(i=0;i a[n-1]=t; times++; } main() { int a[5]={1,2,3,4},i; f(a,4, a[4]); for(i=0;i<4;i++)printf("%d ",a[i]);