西电21秋高级语言程序设计(C)模拟题一答案
高级语言程序设计(C)模拟题一一、选择题(本题共20道小题,每题2分,共40分。)
1. 以下程序的输出结果是
int main()
{
char c=‘z';
printf(“%c”,c-25);
Return 0;
}
A) a B) Z C) z-25 D) y
答案:A
解析:‘z’对应的ASCII码是122,122-25=97,输出的是%c,即字符的形式,97对应小写字母a。
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<回车>
C)100<回车>765.12<回车> D)x=100<回车>,y=765.12<回车>
答案:B
解析:输入的格式需要和双引号中的格式保持一致,因此“i=”“j=”和“,”都不能缺少。
3. 设已有定义: char *st="how are you"; 下列程序段中正确的是
A) chara, *p;strcpy(p=a+1,&st);
B) chara; strcpy(++a, st);
C) chara; strcpy(a, st);
D) chara[], *p; strcpy(p=&a,st+2);
答案:A
解析:B项中a不能进行自增运算;C项a的空间不足;D项中定义a的格式有误。
4. 设j为int型变量,则下面for循环语句的执行结果是
for(j=10;j>3;j--)
{
if(j%3)j--;
--j;--j;
printf("%d",j);
}
A)6 3 B)7 4 C)6 2 D)7 3
答案:B
解析:if语句中,如果j除以3的余数不为零就进行一次自减,所以第一次输出的值为7;第二次循环开始时,j=6,自减两次后输出值为4。结尾再进行一次自减后不满足循环条件,故跳出循环。
5. 以下程序的输出结果是
int main()
{
int i,k,a,p:
K=5;
for (i=0;i<10;i++) a=i;
for (i=0;i<3;i++) p=a;
for (i=0;i<3;i++) k+=p*2;
printf("%d\n",k);
return 0;
}
A)20 B)21 C)22 D)23
答案:B
解析:第一个循环语句将a到a分别赋值1到9。由第二个循环语句,我们可以知道p数组中存储的数值为0,2,6。第三个循环语句执行运算k=5+2*0+2*2+2*6=21。
6. 若有以下说明:
int w={{0,1},{2,4},{5,8}};
int(*p)=w;
则数值为4的表达式是
A) *w+1 B) p++,*(p+1)
C) w D) p
答案:D
解析:p指向w。A项的取得w的值再加1,所以结果为3;B项已经指向w数组存储空间之外;C项根据w数组的定义为0;D项即相当于w。
7. 若k是int型变量,且有下面的程序片段:
k=-3;
if(k<=0) printf("####")
else printf("&&&&");
上面程序片段的输出结果是
A) #### B) &&&& C) ####&&&& D) 有语法错误,无输出结果
答案:D
解析:if和else之间需要有分号隔开。
8. 以下程序运行后,输出结果是
int main( )
{
int y=18,i=0,j,a;
do
{
a=y%2;i++;
y=y\2;
} while(y>=1);
for(j=i-1;j>=0;j--)
printf("%d",a);
printf("\n");
return 0;
}
A)10000 B)10010 C)00110 D)10100
答案:B
解析:这是一个十进制转化二进制的程序,第一个循环将y除以2所得余数存入a数组中,第二个循环将余数逆向输出。
9. 以下叙述中不正确的是
A)在不同的函数中可以使用相同名字的变量
B)函数中的形式参数是局部变量
C)在一个函数内定义的变量只在本函数范围内有效
D)在一个函数内的复合语句中定义的变量可以在本函数范围内有效
答案:D
解析:复合语句中定义的变量的生命周期,只在该复合语句的控制范围内有效,超过这个范围就没有了。
10. 请读程序:
#include<stdio.h>
func( int a, int b)
{
int c;
c=a+b;
return c;
}
int main()
{
int x=6, y=7, z=8, r;
r=func(( x--,y++,x+y),z--);
printf("%d\n",r);
return 0;
}
上面程序的输出结果是
A) 11 B) 20 C) 21 D) 31
答案:C
解析:func(( x--,y++,x+y),z--)中,前一个括号中为逗号运算符,所以先计算x--与y++,但结果为x+y=(6-1)+(7+1)=13,再对13和z进行求和,所以r=21。
11. 以下程序的输出结果是
# include <stdio.h>
int main()
{
int a=2,c=5;
printf("a=%%d,b=%%d\n",a,c);
return 0;
}
A) a=%2,b=%5 B) a=2,b=5 C) a=%%d,b=%%d D) a=%d,b=%d
答案:D
解析:在printf函数当中,“%%”即表示“%”本身,此时两个“%”变为表示一个字符“%”,“d”前就没有了控制格式的“%”,所以“d”就仅仅表示一个字符。
12. 设a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d的结果为
A) 4 B) 3
C) 2 D) 1
答案:D
解析:问号冒号运算符就表示if-else语句,问号前为条件,第二项为条件为真的结果,最后一项为条件为假的结果。将表达式后看作一部分,a<b?a:(c<d?a:d),判断a<b为真,所以结果就为a。
13. 执行以下程序后,y的值是
int main ( )
{
int a[]={2,4,6,8,10};
int y=1,x,*p;
p=&a;
for(x=0;x<3;x++)y + = * (p + x);
printf("%d\n",y);
return 0;
}
A) 17 B) 18 C) 19 D) 20
答案:C
解析:p指针指向a的位置,其内容为4。循环语句中,p+x表示指针向右移x个单元,所以y=1+4+6+8=19。
14. 下面四个选项中,全是不合法的用户标识符的是:
A、AP_0 do B、float la0 _A
C、b-a goto int D、_123 temp INT
答案:C
解析:标识符的命名规则:由字母、数字、下划线组成,第一个字符必须是字母或者下划线,标示符的命名不能同C语言的关键字相同。
15. 以下程序的输出结果是
int main()
{ int n=4;
while(n--)printf("%d ",--n);
return 0;
}
A) 20 B) 31 C) 321 D) 210
答案:A
解析:n--先运算再自减,--n先自减再运算。第一次循环判定时n=4,进入循环,并自减,此时n=3;输出时先自减,所以输出2。第二次循环以此类推,输出0。之后在进行判断时,n=0,故跳出循环。
16. 设有如下的变量定义:
int i=8,k,a,b;
unsinged long w=5
double x=1.42,y=5.2
则以下符合C语言语法的表达式是
A)a+=a-=(b=4)*(a=3) B)x%(-3); C)a=a*3=2 D)y=float(i)
答案:A
解析:B项浮点数不能进行取余计算;C项赋值运算从右向左,a*3=2为非法格式,常数项不能出现在赋值运算的左边;D项强制转换应为y=(float)i。
17.两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是
int main( )
{
int x;
scanf("%d",&x);
if(x + + >5) printf("%d",x);
else printf("%d\n",x - -);
return 0;
}
A) 7和5 B) 6和3 C) 7和4 D) 6和4
答案:A
解析:x++与x--均为先进行运算再进行自增或自减。所以输入6时,判断为真,x=6+1=7,所以输出7;输入4时,判断为假,x=4+1=5,输出5后,x再进行自减。
18. 若有以下定义:
char a;int b;
float c;double d;
则表达式a*b+d-c值的类型为
A)float B)int C)char D)double
答案:D
解析:在类型不同的计算中,默认向高级别的类型转换。
19. 设有以下定义:
int a={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)=a,*p=a;
则下列能够正确表示数组元素a的表达式是
A) *((*prt+1) ) B) *(*(p+5))
C) (*prt+1)+2 D) *(*(a+1)+2)
答案:D
解析:a的值为6。prt为数组指针,指向a,一次的偏移量为3个单元;p指针也指向a。A项格式错误;B项两次对指针取内容有误;C项值为a的地址值加3;D项a+1表示a+1行,所以D项确实表示的是a。
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的长度
答案:C
解析:x以字符串形式存储,在数组最后会添加一个字符串结束符’\0’,所以长度比Y大1。
二、填空题(本大题共7小题,每题2分,共14分。)
1. 假定p所指对象的值为25,p+1所指对象的值为46,则执行"(*p)++;"语句后,p所指对象的值为___________。
答案:26
解析:(*p)++表示p指针所指地址中的值自增
2. 如果变量定义有:int a=9,c=8;则表达式(――a!=c++)?――a:++c的值为________。
答案:10
解析:判断a-1是否不等于c,因为a-1=c,所以判定为否,此时c=8+1=9,取值++c,所以值为10。
3. 假定一个二维数组为a,则a的地址值(以字节为单位)为__________。
答案:a+i或*(a+i)
解析:二维数组中,a表示第i行第一项地址值,a+i表示a偏移i行。
4. 已有int i,j; float x;为将-10赋给i,12赋给j,410.34赋给x;则对应scanf("%d,%d,%f",&i,&j,&x)调用语句的数据输入形式是__________
答案:-10,12,410.34
解析:格式输入函数,按照格式要求把两个整数和一个实数通过键盘输入赋值给相应变量。
5. 若x=5,y=10,则x>y和x<=y的逻辑值分别为________和_______。
答案:0 ,1
解析:根据x和y的值可知,x>y的结果为假,x<=y的结果为真。
6. C语言提供三种逻辑运算符,按优先级高低它们分别是_________, ________,_________。
答案:!、||、&&
解析:根据C语言逻辑运算符的优先级可得结果。
7. 空字符串的长度是__________。
答案:1
解析:字符串结束符占用一个空间。
三、判断题(本大题共7小题,每题2分,共14分。)
1. 若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数( )
答案:错
解析:实型中存放的不是整型,其存储内容已经经过转换。
2. 函数中的局部变量都是动态存储( )
答案:错
解析:静态存储方式是指在程序运行期间分配固定的存储空间的方式,动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。
3. 主函数main中定义的变量在整个文件或程序中有效()
答案:错
解析:主函数main中定义的变量属于局部变量。
4. 函数的定义可以嵌套,但函数的调用不可以嵌套( )
答案:错
解析:C语言语法规定函数不能嵌套定义,但可以嵌套调用。
5. do-while循环中,根据情况可以省略while()
答案:错
解析:do-while是一种格式,必须同时出现。
6. 形参是虚拟的,不占用存储单元()
答案:错
解析:形参在运行时需要分配空间。
7. 用户若需要调用标准库函数,调用前必须重新定义()
答案:错
解析:标准库函数调用前只要声明即可。
四、程序分析题(用列表法列出关键变量在运行过程中的值)
(本题共3道小题,每题4分,共12分。)
1. 若输入3,2,1,则下面程序的输出结果是____________。
#include<stdio.h>
void sub( int n,int uu[])
{
int t;
t=uu;
t+=3*uu;
n++;
if(t>=10)
{
uu=t/10;
uu=t%10;
}
else uu=t;
}
int main( )
{
int i, n, aa={0,0,0,0,0,0};
scanf("%d,%d,%d",&n,&aa,&aa); //
for(i=1; i<n; i++) sub(i,aa); //
for(i=0; i<=n; i++) printf("%d_",aa);
printf("\n");
return 0;
}
答案:2_7_2_1
解析:
i / 1 2
t(sub函数中) / 7 21
aa 2 2 2
aa 1 7 7
aa 0 0 2
aa 0 0 1
2. 以下函数的功能是____________________________________
double fun( double x, int y)
{
int i;
double z;
for(i=1, z=x; i<y;i++) z=z*x;
return z;
}
答案:求x的y次方
解析:循环y-1次,每次乘以x,因为最初z=x,所以最终z=x的y次方。
i 1 2 ...... y
z x x2 ...... xy
3. 以下程序的输出是:_________________________________
#include"ctype.h"
#include"stdio.h"
int main()
{
char str,*sptr;
gets(str);
sptr=str;
while(*sptr) putchar(*sptr++);
return 0;
}
键盘输入:abcde
答案:abcde
解析:str数组存储字符串,sptr指向str开头,while判定sptr中内容不为结束符时输出并自增,所以改程序效果即为输出字符串。
str ‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘\0’
sptr ‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘\0’
五、编程题(本大题共2小题,每题10分,共20分)
1. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
答案:
#include<stdio.h>
int main()
{
int i,j,sum;
for(i=2;i<=1000;i++)
{sum=0;
for(j=1;j<=i/2;j++)
if( i%j==0) sum+=j;
if(i==sum)printf("%d,",i);
}
return 0;
}
解析:从1开始到n/2,判断是否整除,再判断因数之和与n是否相等,这样即可判断是否是完数。
2. 编写一函数fun,实现矩阵(3行3列)的转置(即行列互换)
答案:
int fun(int array)
{
int i,j,t;
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
{
t=array;
array=array;
array=t;
}
}
解析:以3*3二维数组存储,a与a、a与a、a与a中数值交换。
学 院
- 学年 第 学期c程序设计 试卷(参考答案)
题号 一 二 三 四 五 六 七 八 九 总 分
得分
一、选择题(本题共20道小题,共40分。)
1. A
2. B
3. A
4. B
5. B
6. D
7. D
8. B
9. D
10. C
11. D
12. D
13. C
14. C
15. A
16. A
17. A
18. D
19. D
20. C
二、填空题(每空1分,共10分。)
1. 26
2. 10
3. a+i或*(a+i)
4. 10,12,410.34
5. 0 ,1
6. ! , &&, ||
7. 0
三、判断题(本题共10道小题,共10分。)
1. 错
2. 错
3. 对
4. 错
5. 错
6. 错
7. 错
8. 对
9. 对
10. 错
四、列表分析程序(本题共3道小题,共20分)
1. 2_7_2_1
2. 求x的y次方
3. abcde
页:
[1]