第二部分C程序设计
一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)
21.某程序需要使用一个代表常数3.14的符号常量名p,以下定义中正确的是(21) 。
A.#define p 3.14; B.#define p(3.14)
C.#define p=3.14 D.#define p 3.14
22.下列四个选项中,属于C语言关键字的是(22) 。
A.Float B.single C.double D.real
23.已知某编译系统中singed int类型数据的长度是16位,该类型数据的最大值是(23) 。
A.32767 B.32768 C.127 D.65535
24.以下关于if语句和switch语句的叙述中错误的是(24) 。
A.if语句和switch语句都可以实现算法的选择结构
B.if语句和switch语句都能实现多路(两路以上)选择
C.if语句可以嵌套使用
D.switch语句不能嵌套使用
25.已有声明“char *s1="China", s2[10], *s3="Nanjing"; *s4;”,以下字符串赋值语句在执行时可能出现错误的是(25) 。
A.strcpy(s3, s1); B.strcpy(s4, s1);
C.strcpy(s2, s1); D.strcpy(s2, s3);
26.已有声明“int x=0, *p=&x;”,以下语句中有语法错误的是(26) 。
A.printf("%d", *x); B.printf("%d", &x);
C.printf("%d", *p); D.printf("%d", x);
27.以下叙述中错误的是(27) 。
A.在函数外可以声明变量
B.变量声明的位置决定了该变量名的使用范围
C.函数调用时在函数内声明的变量所得到的值将无法保存到该函数的下一次调用
D.在函数外声明的变量,其值可以保存到该程序运行结束
28.已有声明“int t=1;”,则执行“printf("%d", (t+5, t++));”时输出结果是(28) 。
A.1 B.6 C.2 D.7
29.已有声明“static char *p="Apple";”,则执行“puts(p+2);”时输出结果是(29) 。
A.Apple B.Cpple C. pple D.ple
30.以下选项均欲声明变量p,其中错误的是(30) 。
A.typedef struct Person B.struct Person
{ char name[20]; { char name[20];
int age; int age;
}Per; };
Per p; struct Person p;
C.struct D.struct
{ char name[20]; { char name[20];
int age; int age;
}Per; }p;
Per p;
二、填空题(请将答案填写在答题纸的相应答题号内,每个答案只占一行,共30分)
●基本概念(5分)
1.C语言源程序中用十六进制表示整型常数必须以(1) 开头。
2.如果一个循环结构的循环体至少要执行一遍,则最适合描述该循环结构的语句是(2) 语句。
3.若要声明一个无符号整型变量x,则正确的声明形式是“(3) int x;”。
4.已知有声明“int n=12; double a;”则执行语句“a=n/=5;”后,a的值为(4) 。
5.若有数据类型定义如下:
union A{float a1; float a2;};
则表达式sizeof(union A)的值为(5) 。
●阅读程序(13分)
6.以下程序运行时,输出到屏幕的结果是(6) 。
#include
enum color{BLACK, YELLOW, BLUE=3, GREEN, WHITE};
void main()
{ char *colorname[]={ "Black", "Y ellow", "Blue", "Green", "White"};
enum color c1=GREEN, c2=BLUE;
printf("%s", colorname[c1-c2]);
}
7.以下程序运行时,输出到屏幕的结果是(7) 。
#include
void main()
{ int a=0, b=1, d=10;
if(a)
if(b)
d=20;
else
d=30;
printf("%d\n", d);
}
8.以下程序运行时,输出到屏幕的结果中第一行是(8) ,第二行为(9) 。
#include
void fun(int a, int *b)
{ a++;
(*b)++;
}
void main()
{ int a[2]={1, 1};
fun(a[0], &a[1]);
printf("%d\n%d", a[0], a[1]);
}
9.以下程序运行时,输出到屏幕的结果中第一行是(10) ,第二行为(11) ,第三行是(12) 。
#include
#include
void main( )
{ int a[100]={0}, i, j, k;
for(i=1; i<100; i++)
a[i]=i+1;
printf("%4d%4d%4d\n", a[0], a[1], a[2]);
for(j=1; j<100; j++)
{ if(a[j]!=0)
for(k=j+1; k<100; k++)
if(a[k]%a[j]==0)
a[k]=0;
}
for(k= 1, i=0; k<100; k++)
if(a[k]!=0)
{ printf("%4d ", a[k]);
i++;
if(i%3==0) printf("\n");
}
}
10.以下程序运行时,输出到屏幕的结果中第一行是(13) ,第二行为(14) 。
#include
#include
int fun(int a, int b)
{ int n;
while(a!=b)
{ n=abs(a-b);
a=(a>b)?b:a;
b=n;
}
return a;
}
void main( )
{ printf("%d\n%d\n", fun(9, 15), fun(9, 5)); }
11.以下程序运行时,输出到屏幕的结果中第一行是(15) ,第二行为(16) 。
#include
int fun1(int p[], int n)
{ int i, s=0;
for(i=0; i s+=p[i]; return s; } int fun2(int *s, int n) { if(n==1) return *s; else return (*s)+fun2(s+1, n-1); } void main( ) { int a[]={1, 2, 3, 4, 5}; printf("%d\n%d", fun1(a, 3), fun2(a, 3)); } 12.以下程序运行时,输出到屏幕的结果中第一行是(17) ,第二行为(18) 。 #include #include int fun(char str[]) { int i, j, len; len=strlen(str); for(i=0, j=0; str[i]; i++) if((str[i]>= 'A'&&str[i]<= 'Z')||(str[i]>= 'a'&&str[i]<= 'z')) str[j++]=str[i]; str[j]= '\0'; return len-j; } void main() { char ss[80]= "It23is!"; int n; n=fun(ss); printf("%d\n%s\n", n, ss); } ●完善程序(12分) 13.以下程序中函数judge的功能是判断x指向的int类型数组(长度为n)中各元素之间的逻辑关系。若n个元素的值均相等则输出“all elements are same”;若n个元素的值无序则输出“no order”;若n个元素的值按升序排列则输出“ascend”;若n个元素的值按降序排列则输出“descend”。请完善程序以达到要求的功能。 #include void judge( (19) , int n ) { int f, i=0; while(i i++; if(i== (20) ) { printf("\n all elements are same"); return; } if(x[i] else f=0; for(; i if(f&&x[i]>x[i+1]||!f&& (21) ) { printf("\n no order"); return; } if( (22) ) printf("\n ascend"); else printf("\n descend"); } void main( ) { int a[5]={1, 2, 3, 4, 5}, b[5]={5, 4, 3, 2, 1}, c[5]={1, 4, 2, 3, 5}, d[5]={2, 2, 2, 2, 2}; judge(a, 5); judge(b, 5); judge(c, 5); judge(d, 5); } 14.以下程序的功能是判断一个n 阶对称方阵是否双对称矩阵。4阶对称矩阵是指a ij =aji (1≤i ≤4, 1≤j ≤4)。4阶双对称矩阵是指一个4阶对称矩阵的第1列与第4列对换,第2列与第3列对换后仍然是对称矩阵。函数issym(int m[][N], int n)的功能是判断二维数组m 中存放的一个n 阶方阵是否为对称矩阵,如果是则函数返回值1,否则返回值0。函数exchange(int a[][N], int n)的功能是将二维数组a 中存放的一个n 阶矩阵作横向翻转,即:将矩阵的第1列与第n 列对换,第2列与第n-1列对换,…,直到n/2列为止。 例如,对称矩阵? ? ?? ????? ???------112 31 0322 3013 21 1是双对称矩阵,而对称矩阵????? ? ??? ???-------011 11 8921 9631 235 不是双对称矩阵。 #include void exchange(int a[][N], int n) { int i, j, t; for(j=0; j } } int issym(int m[][N], int n) { int i, j; for(i=0; i /*对称矩阵判断*/ return 0; (25) ; } void main() { int a[N][N]; int n=4, i, j, r1, r2; for(i=0; i for(j=0; j scanf("%d", &a[i][j]); for(i=0; i { for(j=0; j printf("%4d", a[i][j]); printf("\n"); } r1=issym(a, n); exchange( (26) ); r2= issym(a, n); if(r1+r2==2) printf("matrix is double symmetric\n"); else printf("matrix is not double symmetric\n"); } 15.函数deletelist的功能:在head指向的单向链表中查找是否出现多个x值相同的结点。如果发现存在这样的结点,则保留第一个结点,删除其他重复出现的结点。 typedef struct point { int x; struct point *next; } (27) ; POT *deletelist(POT *head) { POT *p, *p1, *p2; p= (28) ; while(p->next!=NULL) { p1=p; p2=p->next; while(p2!=NULL) { if(p2->x==p->x) { p1->next= (29) ; free(p2); p2=p1->next; } else { p1=p2; p2=p2->next; } } p= (30) ; } return head; }