2004 — 2005 学年考题
一、选择题(单选,2 分×13=26 分)
1. 下列哪一组常量全部合法___A__。
A) 0xffff
986L
'\037'
B) 01a
0.23e
+2e-1
C) "a"
.12E5
5e-9.3
D) '\0xf'
0011
(int)5.e0
2. 有定义 float x=10.0, y; 则下列表达式中符合语法的是__B__。
A) y=x%2
B) y=x+(y=3)
C) y=int(x)/10
D) y=(-x)++
3. 已知 i、j、k 为 int 型变量,若从键盘输入:1,2,3,使 i 的值为 1; j 的值为 2; k 的值为 3,
以下选项中正确的输入语句是__ C__。
A) scanf("%2d%2d%2d",&i,&j,&k);
C) scanf("%d,%d,%d",&i,&j,&k);
B) scanf("%d%d%d",&i,&j,&k);
D) scanf("i=%d,j=%d,k=%d",&i,&j,&k);
4. 下述表达式中, A 可以正确表示 x≤0 或 x≥1 的关系。
A) (x>=1) || (x<=0)
C) (x>=1)&&(x<=0)
B) !((x>=1) || (x<=0))
D) (x>=1),(x<=0)
5. 若已定义 int x,y; 下面程序段的运行结果是 D 。
x=y=0;
while(x<15){y++; x+=++y ;}
printf("%d, %d", y ,x) ;
B) 6, 12
A) 20, 7
C) 20, 8
D) 8, 20
6. 若定义:char a[ ]= "hello!"; char b[20]={ 'h', 'e', 'l', 'l', 'o', '!'};
则 sizeof(a)和 sizeof(b)的值为__ D__。
A) 6 和 6
C) 6 和 20
B) 7 和 6
D) 7 和 20
7. 语句 while(!e){………} 中的表达式!e 与以下表达式 A 等价。
D) e = =1
A) e = = 0
B) e!=0
C) e!=1
8. 若定义:int a[10]={10*1}; 则下面正确的说法是 C 。
A) a 数组所有元素都得到初值 1;
B) a[0]元素初值为 10,其余元素初值不确定;
C) a[0]元素初值为 10,其余元素初值为 0;
D) 初值表不合语法。
9. 已知一个函数的定义如下:
float fun(int x , int y[10])
{ ……… }
则该函数正确的函数原型声明是 C 。
A) float fun(int , int );
C) float fun(int x , int y[ ]);
B)
D)
float fun(int x , y[10]);
fun(int x , int y[10]);
10. 如有宏定义#define Max(x,y)
(x)>(y)? (x) : (y) 则执行以下程序段后的输出为
__ C__。
int z, a=15, b=30;
z=3*Max(a,b); printf("%d\n", z++);
A) 91
B) 90
C) 15
D) 16
11. 若定义:int a[10][10],*p; 在执行 p=&a[0][0];后,数组元素 a[i][j]的等价表示形式为
B 。
A) p+i*10+j
B) *(p+i*10+j)
C ) p+i*10+j+1
D) *(p+i*10+j+1)
12. 有如下定义:
struct stu
{ char name[10];
struct {int y; int m; int d;}birthday;
float score[3]; } b;
则该结构体变量 b 的存储字节数是:___ B___。
A) 17
B) 28
C) 11
D) 20
13. 以下正确的说法是 D 。
A) 静态局部变量不释放,所以与全局变量作用相同;
B) void 类型函数不能有 return 语句;
C) 如果是结构体类型的数组,数组中各元素的类型可以不一致;
D) 程序执行时,数组的大小不可改变,而链表的结点数是可改变的。
二、填空题(每空 1 分,共 18 分)
1. 五个运算符 -> = && >= / 中, 优先级最高的是 -> ,符合右结合性的是_=__。
2. 将条件“x 能被 3、5、7 之一整除”写成逻辑表达式为 x%3==0|| x%5==0|| x%7==0 。
3. 若有定义 int k=0, n=123; 执行下列程序段循环语句后,k 值是 321 。
do {k=k*10+n%10; n/=10;} while(n);
4. 在多层嵌套的循环结构中,最内层的 break 语句使程序流程跳出 内循环 。
5. 若定义:char a[ ]="\xah0\0y\"AB",i; 则下面程序段的输出结果是
3 。
i=0; while(a[i]!=0) i++; printf("%d",i);
6. 若用数组名作为函数调用的实参,传递给形参的是 数组的指针(首地址) ,用函数名作为
函数调用的实参,传递给形参的是
函数的指针(入口地址)
。
7. 函数的形参变量在 函数调用 时分配内存单元, 函数调用执行 后,该变量所占单元被释放。
8. 若定义:int a=1, b=2; 则表达式 a^b 的值为 3 (11) ,a&b 的值为 0 (00) 。
9. 若定义 int a=0xf ,b, c; 执行 b=a<<4; c=~(a | b); printf("%x" ,c);的输出结果为_ff00_。
10. 若定义:char c[5], *p1=c; float x[3], *p2=x; 则执行 p1++; p2++;后,p1 的值增加
1 个字节;p2 的值增加 4 个字节;printf("%d,%d\n", sizeof(p1), sizeof(p2));
的结果是___2,2____。
11. 若定义:char c1[ ]="abcdefg" , *p=c1; 则执行 while(*p!=0)p++; printf("%d\n", p-c1);
后输出结果为__7___。
12. 访问单向链表时,除头结点外,每个结点的地址都由 前一个结点
给出;
三、程序阅读题 (每题 6 分,共 30 分)
1. 阅读程序并写出程序的运行结果.
#define N 6
main( )
{ int a[N];
int i, c;
scanf("%2d%2d",&a[0] , &a[1]);
printf("%3d%3d",a[0] , a[1]); c=a[1]-a[0];
for(i=2;i
int fun(int m)
{ static int a=1;
a=a*m; sum+=a;
return a; }
3. 阅读程序并写出程序的运行结果
main( )
{ char s1[80]="We study ", s2[ ]="English";
catenate(s1, s2);
puts (s1);
}
catenate(char s1[ ], char s2[ ])
{ int i, j;
for(i=0;s1[i]!='\0';i++);
for(j=0;s2[j]!='\0';j++,i++)
s1[i]=s2[j];
s1[i]='\0';
}
We study English
4. 下面程序的功能是输入一个数组并求数组中的最大元素值及其在数组中的位置。程序中有四处错
误,请改正。
main( )
{ int a[10], b , i, k;
for(i=0;i<10;i++) scanf("%d", a[i]);
b=max(a , k);
printf("max=%d , No=%d\n", b ,k+1);
}
max(int a[ ] , int *j)
{ int i , m;
m=a[0]; j=0;
for(i=1;i<10;i++)
if(a[i]>m){m=a[i]; j=i;}
return m;
}
&a[i]
&k
*j
*j
5. 下面程序的功能根据用户选择输出 sin 或 cos 曲线,请完成_______中的内容。
“math.h”
#include
#include "stdio.h"
main( )
{ char c; double (*p)( );
;
void print(double (*p)(double))
printf("Enter selection(sin/cos:1/2):");
c=getchar( );
if(c= ='1') p=sin;
else if(c= ='2') p=cos;
print( p );
getch();
}
void print(double (*p)(double))
{ int i,j,sp; double x,y;
for(i=0;i<=360;i=i+20)
{ x=3.141592/180.*i;
;
(*p)(x)
y=
printf("x=%-4d y=%7.2f",i,y);
sp=30+y*20;
for(j=1; j<=sp; j++) printf(" ");
printf("*\n"); }
}
四.程序设计题(第 1 题 10 分,第 2 题 16 分,共 26 分)
1. 编写程序,输入一个日期(1~31 之间的整数)以及当月第一天的星期数,计算该日期为星期几
(星期数=(当月第一天的星期数+该日期-1)%7;0 为星期日、1 为星期一 …,依此类推),输出
其对应的英文名称(星期日、星期一 … 星期六依次对应:SUN、MON、TUE、WED、THU、FRI
、SAT)。程序可实现多次输入输出,直到输入的日期不在 1~31 的范围内,结束程序。
要求:用 switch 语句实现分支结构。
#include "stdio.h"
void main()
{ int day,xqs,week;
printf("请输入一个日期(1~31)");
scanf("%d",&day);
while(day>=1 && day<=31)
{ printf("请输入当月第一天的星期数(0~6)");
scanf("%d",&xqs);
if(xqs>=0 && xqs<=6)
{ week=(xqs+day-1)%7;
switch(week)
{ case 0 : printf("日期:%d 是 SUN(星期日)\n",day);break;
case 1 : printf("日期:%d 是 MON(星期一)\n",day);break;
case 2 : printf("日期:%d 是 TUE(星期二)\n",day);break;
case 3 : printf("日期:%d 是 WED(星期三)\n",day);break;
case 4 : printf("日期:%d 是 THU(星期四)\n",day);break;
case 5 : printf("日期:%d 是 FRI(星期五)\n",day);break;
case 6 : printf("日期:%d 是 SAT(星期六)\n",day);break;
}
}
printf("请输入一个日期(1~31)");
scanf("%d",&day);
}
}
2. 有 3 名学生,每人信息为:学号及 3 门课成绩。编写程序,利用文本文件及结构体实现学生
信息的查找。
结构体类型为:struct studata
{ long num ;
int score [3] ; };
要求:
1) 编写 search 函数,查找各门课均高于 80 分的学生,找到则输出到文件“good.txt”中,找不则
输出 “not found” ;
2) 学生信息已存在文件“stu.txt”中,由主函数从该文件中读取数据。
stu.txt 文件中数据为:
26001 77 80 73
26002 90 88 82
26003 80 98 85
#include "stdio.h"
#include
struct studata
{ long num;
int score[3];};
void main()
{ struct studata stu[3];
void search(struct studata stu[]);
int i;
FILE *fp;
if((fp=fopen("stu.txt","r"))==NULL)
{ printf("can not open file:stu.txt\n");
exit(0);
}
for(i=0; !feof(fp); i++)
{ fscanf(fp,"%ld%d%d%d",&stu[i].num,
&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
fclose(fp);
search(stu);
}
void search(struct studata stu[])
{ int i, f=0;
FILE *fp;
if((fp=fopen("good.txt","w"))==NULL)
{ printf("can not open file:good.txt\n");
return;
}
for(i=0;i<3;i++)
{ if( stu[i].score[0]>=80 && stu[i].score[1]>=80 && stu[i].score[2]>=80)
{ f=1;
fprintf(fp,"%ld %d %d %d\n",stu[i].num,
stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
fclose(fp);
if(!f)printf("\n not found!\n");
}