一、选择题(每小题 1 分,共 20 分)
1、有下列程序
main()
{
union
{
int k;
char i[4];
}*s,a;
s=&a;
s->k=0x38;
s->i[0]=0x39;
printf("%x\n",s->k);
}
输出结果是
A.38 B.39 C.3839 D.3938
2、设 i 是 int 型变量,f 是 float 型变量,用下面的语句给这两个变量输入值:
scanf("i=%d,f=%f",&i,&f);
为了把 100 和 765.12 分别赋给 i 和 f,则正确的输入为
A.100<空格>765.12<回车> B.i=100,f=765.12<回车>
第 2 页 (共 6 页)
C.100<回车>765.12<回车> D.x=100<回车>,y=765.12<回车>
3、设已有定义: char *st="how are you"; 下列程序段中正确的是
A.char a[11], *p; strcpy(p=a+1,&st[4]);
B.char a[11]; strcpy(++a, st);
C.char a[11]; strcpy(a, *st);
D.char a[], *p; strcpy(p=&a[1],st+2);
说明:char *strcpy(char* dest, char *src);
功能:把从 src 地址开始的字符串复制到以 dest 开始的地址空间
4、设 j 为 int 型变量,则下面 for 循环语句的执行结果是
for(j=10;j>3;j--)
{
if(j%3) j--;
j-=2;
printf("%d",j);
}
A.6 3 B.7 4 C.6 2 D.7 3
5、以下程序的输出结果是
main()
{ int i,k,a[10],p[3];
k=5;
for (i=0;i<10;i++) a[i]=i;
for (i=0;i<3;i++) p[i]=a[i*(i+1)];
for (i=0;i<3;i++) k=p[i]*2;
printf("%d\n",k);
}
A.22 B.23 C.25 D.26
6、若有以下说明:
int w[3][4]={{0,1},{2,4},{5,8}};
int(*p)[4]=w;
则取 w 数组中的数值 4 的表达式是
A.*w[1]+1 B.p++, *(p+1) C.w[2][2] D.p[1][1]
7、若 k 是 int 型变量,且有下面的程序片段:
k=-3
if(k<=0) printf("####")
else printf("&&&&");
上面程序片段的输出结果是
A.#### B.&&&& C.####&&&& D.有语法错误
8、以下程序运行后,输出结果是
main()
{
int i=0,j, y=18, a[8];
do
{
a[i]=y%6;
i++;
y=y/2;
} while(y>1);
for(j=i-1;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
}
A.2450 B.2430 C.3240 D.2320
9、以下叙述中不正确的是
A.在不同的函数中可以使用相同名字的变量
B.函数中的形式参数是局部变量
C.在一个函数内定义的变量只在本函数范围内有效
D.空类型函数返回值为 0
10、程序的输出结果是
第 3 页 (共 6 页)
int func( int a, int b)
{ int c;
c=a+b;
return c;
}
main()
{ int x=6, y=7, z=8, r;
r=func(x+y,z);
printf("%d\n",r);
}
A.11 B.20 C.31 D.21
11、程序的输出结果是
main()
{ int a=2,c=5;
printf("a=%d,b=%d\n",a,c);
}
A.a=%2,b=%5 B.a=%d,b=%d C.2,5 D.a=2,b=5
12、设 a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d 的结果为
A.4 B.3 C.2 D.1
13、执行以下程序后,y 的值是
main ( )
{ int a[]={2,4,6,8,10};
int y=1,x,*p;
p=&a[1];
for(x=0;x<3;x++) y + = * (p + x);
printf("%d\n",y);
}
A.17 B.18 C.19 D.20
14、下面四个选项中,全是不合法的用户标识符的是:
A.A P_0 do B.float la0 _A
C.b-a goto int D._123 temp INT
15、程序的输出结果是
int n=4;
while(n) printf("%d ",--n);
A.无输出 B.4 3 2 1 C.3 2 1 0 D.2 1 0 0
16、设有如下的变量定义:
int i=8,k,a,b;
unsinged long w=5;
double x=1,42,y=5.2;
则以下符合 C 语言语法的表达式是
A.a+=(b=4)*(k=3) B.x%(-3) C.a*3=2 D.y=float(i)
17、以下程序的输出结果是
main( )
{ int k=17;
printf("%d,%o,%x\n",k,k,k);
}
A.17,21,11 B.17,17,17 B.17,0x11,021 D.17,021,0x11
18、若有以下定义:
char a;int b;
float c;double d;
则表达式 a*b+d-c 值的类型为
A.float B.int C.char D.double
19、设有以下定义:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a,*p=a[0];
则下列能够正确表示数组元素 a[1][2]的表达式是
第 4 页 (共 6 页)
A.*((*prt+1)[2]) B.*(*(p+5)) C.(*prt+1)+2 D.*(*(a+1)+2)
20、给出以下定义:
char x[]="abcdefg";
char y[]={'a','b','c','d','e','f','g'};
则正确的叙述为
A.数组 X 和数组 Y 等价 B.数组 x 和数组 Y 的长度相同
C.数组 X 的长度小于数组 Y 的长度 D.数组 X 的长度大于数组 Y 的长度
二、判断题(每小题 1 分,共 10 分)
1、若 a 是实型变量,C 程序中允许赋值 a=10,因此实型变量中允许存放整型数。( )
2、函数中的局部变量都是动态存储。( )
3、if 语句、switch 语句可以嵌套,而且嵌套的层数没有限制。( )
4、函数的定义可以嵌套,但函数的调用不可以嵌套。( )
5、do-while 循环中,根据情况可以省略 while。( )
6、形参是虚拟的,不占用存储单元。( )
7、用户若需要调用标准库函数,调用前必须重新定义。( )
8、全局变量使得函数之间的"耦合性"更加紧密,不利于模块化的要求。( )
9、在实际编程中,do-while 循环完全可以用 for 循环替换。( )
10、自增运算符(++)或自减运算符(--)只能用于变量,不能用于常量或表达式。( )
三、填空题(每空 1 分,共 10 分)
1、假定 p 所指对象的值为 25,p+1 所指对象的值为 46,则执行"(*p)++;"语句后,
p 所指对象的值为___________。
2、如果变量定义有:inta=9,c=8;则表达式(a!=c)?--a:++c 运算后变量
c 的值为________。
3、假定一个二维数组为 a[M][N],则 a[i]的地址可表示为__________。
4、已有 int i,j; float x;为将-10 赋给 i,12 赋给 j,410.34 赋给 x;则对应
scanf("%d,%d,%f",&i,&j,&x)调用语句的数据输入形式是__________。
5、若 x=5,y=10,则 x>y 和 x<=y 的逻辑值分别为________和_______。
6、C 语言提供三种逻辑运算符,它们分别是______、_______、_______。
7、空字符串的长度是_______。
四、程序分析题(每空 1 分,共 40 分)
1、读程序,填出表格内容(6 分)
main()
{
int n,s,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
s=0;
for(int j=1;j<=i;j++) s+=j;
sum+=s;
}
printf("%d",sum);
}
i 1 2 3 ... n
j 1 1~2 ...
s 1 1+2 ...
sum 1 1+(1+2) ...
2、读程序,填表(13 分)
void sub(int n, int uu[ ]) //————○1
{
if (n%2==0) uu[n]=uu[n]*2;
第 5 页 (共 6 页)
else uu[n]=uu[n]%5;
}
main( )
{
int i,aa[10]={0,1,2,3,4,5,6,7,8,9};
for(i=0; i<10; i++)
sub(i,aa);
for(i=0; i<10; i++) printf("%d ",aa[i]); //————○2
printf("\n");
}
i 0 1 2 3 4 5 6 7 8 9
○1 uu[i]
0 1 2 3 4 5 6 7 8
○2 aa[i]
0
参数 int n 含义:
参数 int uu[]含义: sub 函数
函数功能:
3、读程序,填表(5 分)
double fun( double x, int y)
{ int i;
double z;
for(i=1, z=x; i<y;i++) z= z* x;
return z;
}
i 1 2 3 ... y-1 y
z x ...
fun 函数功能:
4、读程序,填表(16 分)
键盘输入一行字符(最后有回车):hello
#include"ctype.h"
#include"stdio.h"
main()
{ char str[81],*sptr;
int i;
for(i=0;i<80;i++)
{ str[i]=getchar();
if(str[i]=='\n') break;
}
str[i]= '\0';
sptr=str;
while(*sptr) putchar(*sptr++);
}
下标 i 0 1 2 3 4 5
str[i] 'h'
sptr sptr=&str[0]
*sptr 'h'
程序功能:
五、编程题(每小题 10 分,共 20 分)
编程题要求:
(1)先给出伪代码,然后再写出源码,重要变量和语句要加注释;(伪代码 2 分)
(2)若有子函数,则要给出函数框架设计(函数名、形参、返回类型)。(函数设计 2 分)
1、一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如 6=1+2+3,编程找出 1000 以内的所有完数。
2、编写一函数 fun,实现矩阵(3 行 3 列)的转置(即行列互换)。
1、有下列程序
main()
{
union
{
int k;
char i[4];
}*s,a;
s=&a;
s->k=0x38;
s->i[0]=0x39;
printf("%x\n",s->k);
}
输出结果是
A.38 B.39 C.3839 D.3938
2、设 i 是 int 型变量,f 是 float 型变量,用下面的语句给这两个变量输入值:
scanf("i=%d,f=%f",&i,&f);
为了把 100 和 765.12 分别赋给 i 和 f,则正确的输入为
A.100<空格>765.12<回车> B.i=100,f=765.12<回车>
第 2 页 (共 6 页)
C.100<回车>765.12<回车> D.x=100<回车>,y=765.12<回车>
3、设已有定义: char *st="how are you"; 下列程序段中正确的是
A.char a[11], *p; strcpy(p=a+1,&st[4]);
B.char a[11]; strcpy(++a, st);
C.char a[11]; strcpy(a, *st);
D.char a[], *p; strcpy(p=&a[1],st+2);
说明:char *strcpy(char* dest, char *src);
功能:把从 src 地址开始的字符串复制到以 dest 开始的地址空间
4、设 j 为 int 型变量,则下面 for 循环语句的执行结果是
for(j=10;j>3;j--)
{
if(j%3) j--;
j-=2;
printf("%d",j);
}
A.6 3 B.7 4 C.6 2 D.7 3
5、以下程序的输出结果是
main()
{ int i,k,a[10],p[3];
k=5;
for (i=0;i<10;i++) a[i]=i;
for (i=0;i<3;i++) p[i]=a[i*(i+1)];
for (i=0;i<3;i++) k=p[i]*2;
printf("%d\n",k);
}
A.22 B.23 C.25 D.26
6、若有以下说明:
int w[3][4]={{0,1},{2,4},{5,8}};
int(*p)[4]=w;
则取 w 数组中的数值 4 的表达式是
A.*w[1]+1 B.p++, *(p+1) C.w[2][2] D.p[1][1]
7、若 k 是 int 型变量,且有下面的程序片段:
k=-3
if(k<=0) printf("####")
else printf("&&&&");
上面程序片段的输出结果是
A.#### B.&&&& C.####&&&& D.有语法错误
8、以下程序运行后,输出结果是
main()
{
int i=0,j, y=18, a[8];
do
{
a[i]=y%6;
i++;
y=y/2;
} while(y>1);
for(j=i-1;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
}
A.2450 B.2430 C.3240 D.2320
9、以下叙述中不正确的是
A.在不同的函数中可以使用相同名字的变量
B.函数中的形式参数是局部变量
C.在一个函数内定义的变量只在本函数范围内有效
D.空类型函数返回值为 0
10、程序的输出结果是
第 3 页 (共 6 页)
int func( int a, int b)
{ int c;
c=a+b;
return c;
}
main()
{ int x=6, y=7, z=8, r;
r=func(x+y,z);
printf("%d\n",r);
}
A.11 B.20 C.31 D.21
11、程序的输出结果是
main()
{ int a=2,c=5;
printf("a=%d,b=%d\n",a,c);
}
A.a=%2,b=%5 B.a=%d,b=%d C.2,5 D.a=2,b=5
12、设 a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d 的结果为
A.4 B.3 C.2 D.1
13、执行以下程序后,y 的值是
main ( )
{ int a[]={2,4,6,8,10};
int y=1,x,*p;
p=&a[1];
for(x=0;x<3;x++) y + = * (p + x);
printf("%d\n",y);
}
A.17 B.18 C.19 D.20
14、下面四个选项中,全是不合法的用户标识符的是:
A.A P_0 do B.float la0 _A
C.b-a goto int D._123 temp INT
15、程序的输出结果是
int n=4;
while(n) printf("%d ",--n);
A.无输出 B.4 3 2 1 C.3 2 1 0 D.2 1 0 0
16、设有如下的变量定义:
int i=8,k,a,b;
unsinged long w=5;
double x=1,42,y=5.2;
则以下符合 C 语言语法的表达式是
A.a+=(b=4)*(k=3) B.x%(-3) C.a*3=2 D.y=float(i)
17、以下程序的输出结果是
main( )
{ int k=17;
printf("%d,%o,%x\n",k,k,k);
}
A.17,21,11 B.17,17,17 B.17,0x11,021 D.17,021,0x11
18、若有以下定义:
char a;int b;
float c;double d;
则表达式 a*b+d-c 值的类型为
A.float B.int C.char D.double
19、设有以下定义:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a,*p=a[0];
则下列能够正确表示数组元素 a[1][2]的表达式是
第 4 页 (共 6 页)
A.*((*prt+1)[2]) B.*(*(p+5)) C.(*prt+1)+2 D.*(*(a+1)+2)
20、给出以下定义:
char x[]="abcdefg";
char y[]={'a','b','c','d','e','f','g'};
则正确的叙述为
A.数组 X 和数组 Y 等价 B.数组 x 和数组 Y 的长度相同
C.数组 X 的长度小于数组 Y 的长度 D.数组 X 的长度大于数组 Y 的长度
二、判断题(每小题 1 分,共 10 分)
1、若 a 是实型变量,C 程序中允许赋值 a=10,因此实型变量中允许存放整型数。( )
2、函数中的局部变量都是动态存储。( )
3、if 语句、switch 语句可以嵌套,而且嵌套的层数没有限制。( )
4、函数的定义可以嵌套,但函数的调用不可以嵌套。( )
5、do-while 循环中,根据情况可以省略 while。( )
6、形参是虚拟的,不占用存储单元。( )
7、用户若需要调用标准库函数,调用前必须重新定义。( )
8、全局变量使得函数之间的"耦合性"更加紧密,不利于模块化的要求。( )
9、在实际编程中,do-while 循环完全可以用 for 循环替换。( )
10、自增运算符(++)或自减运算符(--)只能用于变量,不能用于常量或表达式。( )
三、填空题(每空 1 分,共 10 分)
1、假定 p 所指对象的值为 25,p+1 所指对象的值为 46,则执行"(*p)++;"语句后,
p 所指对象的值为___________。
2、如果变量定义有:inta=9,c=8;则表达式(a!=c)?--a:++c 运算后变量
c 的值为________。
3、假定一个二维数组为 a[M][N],则 a[i]的地址可表示为__________。
4、已有 int i,j; float x;为将-10 赋给 i,12 赋给 j,410.34 赋给 x;则对应
scanf("%d,%d,%f",&i,&j,&x)调用语句的数据输入形式是__________。
5、若 x=5,y=10,则 x>y 和 x<=y 的逻辑值分别为________和_______。
6、C 语言提供三种逻辑运算符,它们分别是______、_______、_______。
7、空字符串的长度是_______。
四、程序分析题(每空 1 分,共 40 分)
1、读程序,填出表格内容(6 分)
main()
{
int n,s,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
s=0;
for(int j=1;j<=i;j++) s+=j;
sum+=s;
}
printf("%d",sum);
}
i 1 2 3 ... n
j 1 1~2 ...
s 1 1+2 ...
sum 1 1+(1+2) ...
2、读程序,填表(13 分)
void sub(int n, int uu[ ]) //————○1
{
if (n%2==0) uu[n]=uu[n]*2;
第 5 页 (共 6 页)
else uu[n]=uu[n]%5;
}
main( )
{
int i,aa[10]={0,1,2,3,4,5,6,7,8,9};
for(i=0; i<10; i++)
sub(i,aa);
for(i=0; i<10; i++) printf("%d ",aa[i]); //————○2
printf("\n");
}
i 0 1 2 3 4 5 6 7 8 9
○1 uu[i]
0 1 2 3 4 5 6 7 8
○2 aa[i]
0
参数 int n 含义:
参数 int uu[]含义: sub 函数
函数功能:
3、读程序,填表(5 分)
double fun( double x, int y)
{ int i;
double z;
for(i=1, z=x; i<y;i++) z= z* x;
return z;
}
i 1 2 3 ... y-1 y
z x ...
fun 函数功能:
4、读程序,填表(16 分)
键盘输入一行字符(最后有回车):hello
#include"ctype.h"
#include"stdio.h"
main()
{ char str[81],*sptr;
int i;
for(i=0;i<80;i++)
{ str[i]=getchar();
if(str[i]=='\n') break;
}
str[i]= '\0';
sptr=str;
while(*sptr) putchar(*sptr++);
}
下标 i 0 1 2 3 4 5
str[i] 'h'
sptr sptr=&str[0]
*sptr 'h'
程序功能:
五、编程题(每小题 10 分,共 20 分)
编程题要求:
(1)先给出伪代码,然后再写出源码,重要变量和语句要加注释;(伪代码 2 分)
(2)若有子函数,则要给出函数框架设计(函数名、形参、返回类型)。(函数设计 2 分)
1、一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如 6=1+2+3,编程找出 1000 以内的所有完数。
2、编写一函数 fun,实现矩阵(3 行 3 列)的转置(即行列互换)。