2011~2012学年第二学期C语言期末考试卷答题纸(A卷)
专业班级:学号:姓名:
一、选择题(用铅笔把选中的方格涂黑30×1=30分)
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
21 22 23 24
25 26 27 28
29 30
二、填空题(25×2=50分)
1. 2.
3. 4.
5. 6.
7. 8.
9. 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20.
21. 22.
23. 24.
25.
三、编程题(10×2=20分)
1.编写函数int frinum(long s[][2],long n)实现以下功能:找到2 n范围内的所有亲密数对,将这些亲密数对保存到s指向的二维数组中。函数返回s数组中存储的亲密数对的对数。
编写函数main实现以下功能:求3000以内的亲密数对并输出。
说明:如果A的全部真因子(包括1,不包括A自身)之和等于B;B的全部真因子之和等于A,则称整数A和B为一对亲密数。
2.编写函数int arms(int ar[])实现以下功能:将所有3、4位Armstrong数存入数组ar中,函数返回这些Armstrong数的个数。
Armstrong数是指:一个n位数的各位数字的n次方之和等于该数。例如:153=13+53+33;1634=14+64+34+44。因此,153是3位Armstrong数,1634是4位Armstrong数。
一、选择题(30×1=30分)
1.C语言源程序的基本单位是()。
A 过程
B 函数
C 子程序
D 标识符
2.下列程序的输出结果是()。
main( )
{ int a=7,b=5;
printf("%d\n",b=b/a);
}
A 5
B 1
C 0
D 不确定值
3.假设变量a,b均为整型,表达式(a=5,b=2,a>b?a++:b++,a+b)的值是()。
A 7 B8 C 9 D 2
4. 以下运算符优先顺序的描述中正确的是()。
A 关系运算符<算术运算符<赋值运算符<逻辑运算符
B 逻辑运算符<关系运算符<算术运算符<赋值运算符
C 赋值运算符<逻辑运算符<关系运算符<算术运算符
D 算术运算符<关系运算符<赋值运算符<逻辑运算符
5.设有如下程序段,下面描述中正确的是()。
int k=10; while(k=0) k=k-1;
A 循环执行一次
B 循环是无限循环
C循环体语句一次也不执行 D 循环体语句执行一次
6.以下程序的输出结果为()。
int i;
void prt( )
{ for(i=5;i<8;i++) printf("%c",'*');
printf("\t");
}
main( )
{ for(i=5;i<=8;i++) prt( ); }
A ***
B *** *** *** ***
C *** ***
D * * *
7.在C语言程序中,以下说法正确的是()。
A 函数的定义可以嵌套,但函数的调用不可以嵌套
B函数的定义不可以嵌套,但函数的调用可以嵌套
C 函数的定义和函数的调用都不可以嵌套
D 函数的定义和函数的调用都可以嵌套
8.以下函数调用语句中含有()个实参。
func((e1,e2),(e3,e4,e5));
A 2
B 3
C 5
D 语法错误
9.以“只读”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( )。
A. fp=fopen(″a:\\aa.dat″,″ab″);
B. fp=fopen(″a:\aa.dat″,″a″);
C. fp=fopen(″a:\\aa.dat″,″r″);
D. fp=fopen(″a:\aa.dat″,″wb″);
10.已知职工记录描述如下,在C中,系统为变量w分配()字节的空间。
struct worker
{ int no;
char name[20];
char sex;
union
{ int day; int month; int year;}birth;
} w;
A 29
B 20
C 25
D 6
11.设有以下定义,值为5的枚举常量是()。
enum week{sun,mon=4,tue,wed,thu,fri,sat} w;
A tue
B sat
C fri
D thu
12.下面选项中正确的赋值语句是(设char a[5],*p=a;)()。
A p="abcd";
B a="abcd";
C *p="abcd";
D *a="abcd";
13.设有以下程序段,则值为6的表达式是()。
struct st { int n; struct st *next;};
static struct st a[3]={5,&a[1],7,&a[2],9,0 },*p;
p=&a[0];
A p++->n
B ++p->n
C p->n++
D (*p).n++
14.C语言中的文件类型只有()。
A 索引文件和文本文件两种
B 文本文件一种
C 二进制文件一种
D ASCII码文件和二进制文件两种
15.已知函数fread的调用形式为fread(buffer,size,count,fp),其中buffer代表的是()。
A 存放读入数据项的存储区
B 存放读入数据的地址或指向此地址的指针
C 一个指向所读文件的文件指针
D 一个整型变量,代表要读入的数据项总数16.以下程序的输出结果为()。
main( )
{ int i=010,j=10;
printf("%d,%d\n",i++,j--); }
A 11,9
B 9,10
C 8,10
D 9,9
17.设a为int型变量,执行下列赋值语句后,a的取值分别是()。
a=125.534; a=20.0/3; a=(int)125.521%4;
A 125,6,31
B 125,6,1
C 125,6.666666,31
D 125.534,6.666666,2
18.设i和k都是int类型,则for循环语句()。
for(i=0,k=-1;k=1;i++,k++) printf("****\n");
A 循环结束的条件不合法
B 循环体一次也不执行
C 循环体只执行一次
D 是无限循环
19.以下程序的输出结果为()。
main( )
{ char c;
int i;
for(i=65;i<68;i++)
{ c=i+32;
switch(c)
{ case 'a':case 'b':case 'c':printf("%c,",c);break; default:printf("end");}
}
}
A a,b,c,end
B a,a,a,end
C a,a,a,
D a,b,c,
20.函数调用语句:fseek(fp,-10L,2);的含义是()。
A 将文件位置指针从文件末尾处向文件头的方向移动10个字节
B 将文件位置指针从当前位置向文件头的方向移动10个字节
C 将文件位置指针从当前位置向文件末尾方向移动10个字节
D 将文件位置指针移到距离文件头10个字节处
21.以下程序的输出结果为()。
main( )
{ char s1[40]="country",s2[20]="side";
int i=0,j=0;
while(s1[i]!='\0') i++;
while(s2[j]!='\0') s1[i++]=s2[j++];
s1[i]=0;
printf("%s\n",s1);
}
A side
B country
C sidetry
D countryside
22.下列说法不正确的是()。
A 主函数main中定义的变量在整个文件或程序中有效
B 不同函数中,可以使用相同名字的变量
C 形式参数是局部变量
D 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效23.设有说明int (*ptr)();其中标识符ptr是()。
A 是一个指向整型变量的指针B是一个指针,它指向一个函数值是int的函数
C 是一个函数名D定义不合法
24.定义由n个指向整型数据的指针组成的数组p,其正确的方式为()。
A int p;
B int (*p)[n];
C int *p[n];
D int (*p)( );
25.具有相同类型的指针类型变量p与一维数组a,不能进行的操作是()。
A p=a;
B *p=a[0];
C p=&a[0];
D p=&a;
26. 以下关于预处理命令的叙述错误的是()。
A 预处理命令由预处理程序解释
B 程序中的预处理命令是以#开始的
C 若在程序的一行中出现多条预处理命令,这些命令都是有效的
D 预处理命令既可以出现在函数定义的外部,也可以出现在函数内部
27. 有如下程序段:
char p1[80]=”NanJing”, p2[20]=”Young”, p3=”Olympic”;
strcpy( p1,strcat( p2,p3));
printf(“%s\n”,p1);
执行该程序段后的输出是()。
A NanJingYoungOlympic
B YoungOlympic
C Olympic
D NanJing
28. 已有声明“int x,a=3,b=2;”,则执行赋值语句“x=a>b++?a++;b++”后,变量x、a、b
的值分别为()。
A 3 4 3
B 3 3 4
C 3 3 3
D 4 3 4
29. 下列选项中可用作变量名的是()。
A Case
B a-b
C $cd
D 2ab
30.以下4个程序段中有3个程序的执行效果总是相同的,另一个执行效果不同的是()。
A if( a>b ) c=a,a=b,b=c;
B if( a>b ) { c=a,a=b,b=c;}
C if( a>b ) c=a;a=b;b=c;
D if( a>b ) { c=a;a=b;b=c;}
二、填空题(25×2=50分)
1.判断变量a、b、c的值是否是等差数列中连续的三项的表达式为( 1 )。
2. 表示“当x取值在[1,ln10)范围内时,y取值1,否则 y取值-1”所使用的C表达式为“y=( 2 ) ? 1 : -1 ”。
3. 已有声明“int a,b;”且a 和b的值均大于0,表达式“a%b+a/b*b==a”的值为( 3 )。
4. 除goto语句外,在循环结构中执行( 4 )语句可提前结束本次循环直接进入下一次循环。
5. 若有程序段“int a[10],*p=a,*q; q=&a[5];”,则表达式q-p的值是( 5 )。
6. 若有声明“int r=2;”,则执行语句“printf(“%d”,sizeof(2*3.14*r));”时输出为( 6 )。
7. 以下程序运行时输出到屏幕的结果为(7 )
#include
#define MAX(A,B) A>B ? 2*A : 2*B
void main()
{
int a=1,b=2,c=3,d=4,t;
t=MAX(a+b,c+d);
printf(“%d\n”,t);
}
8. 以下程序运行时输出到屏幕的结果为(8 )
#include
void swap(int a, int b)
{ int t;
if( a>b) t=a,a=b,b=t;
}
void main()
{ int x=13,y=11,z=12;
if( x>y ) swap( x, y);
if( x>z ) swap( x, z);
if( y>z ) swap( y, z);
printf( “%d\t%d\t%d\n”,x, y, z);
}
9. 以下程序运行时输出到屏幕的结果第二行是(9 )。
#include
int f( int x, int y)
{
{ static int x=2;
if ( y>2 )
{ x=x*x;
y=x;
}
else y=x+1;
}
return x+y;
}
void main()
{ int a=3;
printf(“%d\n”,f( a,3));
printf(“%d\n”,f( a,2));
}
10. 以下程序运行时输出到屏幕的结果是(10 )
#include
void fun( int m, int n)
{ if( m>=n)
printf(“%d”, m);
else
fun(m+1, n);
printf(“%d”,m);
}
void main()
{ fun(1,2);}
11. 以下程序运行时输出到屏幕的结果中第一行是(11 ),第二行是(12 ),第三行是(13 )。
#include
#define N 3
void main()
{ int i , j , a[N][N]={1}, f1=0, f2=1, temp;
for( i=1; i for( j=0; j<=i; j++ ) { if( j<=i ) { a[i][j]=f1+f2; temp=f1; f1=f2; f2=f1+temp; } } for( i=0; i { for( j=0; j printf(“%5d”,a[i][j]); printf(“\n”); } } 12. 以下程序求方程的一个近似根。root函数采用二分法计算并返回方程f(x)=0在[a,b]内的一个近似根,main函数调用root函数求方程cos(x)=0在[0, 3.14]内的一个近似根。试完善程序以达到要求的功能。 #include #include double root(double a, double b,double (*f)(double)) { double x,y; if( 14 ) { printf(“There is no root between %f and %f”, a,b); return 0; } do { x=( 15); y=f(x); if( fabs(y)<1e-6 || fabs(b-a)<1e-6) break; if( (16) <0 ) b=x; else a=x; } while(1); return x; } void main() { printf( “\n x=%f”, root( 0 , 3.14 , 17 )); } 13.以下程序在3~50范围内验证:大于等于3的两个相邻素数的平方之间至少有4个素数。例如,3和5是相邻素数,32~52之间有素数11、13、17、19、23.试完善程序以达到要求的功能。 #include #include #include int prime(int n) { int i; for( i=2;i<=sqrt(n);i++) if( 18) return 0; return 1; } void main() { int i , j, k=0, m, n, c, a[30]={0}; for( i=3; i<50; i++) if( prime(i)) 19 ; for( i=0; i { m=a[i]*a[i]; n=a[i+1]*a[i+1]; c=( 20 ); for( j=m+1; j if( 21 ) c++; if( c>=4) printf(“\n%d*%d-%d*%d:%d”, a[i], a[i], a[i+1],a[i+1],c); else { printf(“Error”); exit(0);} } } 14. 存储一组整数的某单向链表结点定义为: typedef struct n { int x; struct n *next; } NODE; 函数NODE *sort(NODE *head) 采用插入法对head 指向的单向链表中存储的数据按成员x值从小到大排序。 算法提示:对链表中从第2个结点开始直到最后结点范围内的每个结点做以下操作:若第i个结点(i 从2开始)的成员x值大于或等于第i-1 个结点的成员x 的值,则保持第i个结点在链表中的位置不变;否则,先将第i个结点从链表中删除(使第i-1个结点的指针域指向第i+1个结点),再将已脱离链表的原第i个结点插入到链表的前i-1个结点中,并保持插入节点后链表的前i个结点按成员x值从小到大有序。请完善sort 函数使其达到要求的功能。 NODE *sort( NODE *head) { 22 *p1,*p2, *q1, *q2; p1=head; p2=p1->next; while(p2) { if( p1->x<=p2->x ) { p1=p2; 23 =p2->next; } else { p1->next= 24 ; q1=head; q2=q1->next; if(p2->x { p2->next= 25 ; head=p2; } else { q1=head; q2=head->next; while(p2->x>q2->x) { q1=q2; q2=q2->next } p2->next=q2; q1->next=p2; } p2=p1->next; } } return head; }