admin 管理员组

文章数量: 887021


2024年1月25日发(作者:drink过去式过去分词怎么读)

C语言程序设计模拟试题三及答案

一、选择题(本题共20道小题,每题2分,共40分。)

1. 若有说明,double *p,a;则能通过scanf语句正确给输入项读入数据的程序段是

A)*p=&a; scanf("%lf",p);

B) p=(double*)malloc(8);scanf("%f",p);

C) p=&a;scanf("%lf",a);

D) p=&a; scanf("%le",p);

答案:D

解析:

选项A:此项中 *p是指针指向单元的值引用,&a是a单元的地址,故此项错误。

选项B:scanf中的格式控制符对双精度变量而言是"%lf",而非选"%f",此项错误。

选项c:scanf函数的地址表列中不能写成a,此项错误。

选项D:指针p首先指向a单元,再通过键盘以科学计数格式赋值浮点数,此项正确。

2. 两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是

int main( )

{ int x;

scanf("%d",&x);

if(x + + >5) printf("%d",x);

else printf("%dn",x - -); }

A) 7和5 B) 6和3 C) 7和4 D) 6和4

答案:A

解析:当输入为6时,即x=6,∵++在x后,∴先取x=6与5比较,再取x=6+1=7,6>5成立,输出x=7;同理,当输入为4时,输出x=5。本题考察++,--的优先级与结合性。

3. 下面程序的输出是

A) xyzabcABC B) zabcABC C) yzabcABC D) xyabcABC

#include

#include

int main()

{

char *p1="abc",*p2="ABC",str[50]="xyz";

strcpy(str+2,strcat(p1,p2));

printf("%sn", str);

}

答案:D

解析:strcat将p2字符串连在p1字符串尾,产生新字符串:abcABC,在讲连接后的值赋在str[2]处,即a将z覆盖,产生新的字符组元素:xyabcABC。本题考察字符串函数应用.

4. 若有以下说明:

int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};

char c='a',d,g;

则数值为4的表达式是

A)a[g-c] B)a[4]

C)a['d'-'c'] D)a['d'-c]

答案:D

解析:数值为4的元素的位置在数组内下标为3,∵c=a,d的减去a的得3.

5. 以下叙述中不正确的是

A)在不同的函数中可以使用相同名字的变量

B)函数中的形式参数是局部变量

C)在一个函数内定义的变量只在本函数范围内有效

D)在一个函数内的复合语句中定义的变量

答案:D

解析:c语言在函数中说明的变量为局部变量,只在函数内起作用,不会影响到其他函数。在不同函数中使用相同的变量名不代表是同一变量,A)正确;在函数定义时声明的参数只在函数内部起作用,是函数的局部变量,B)正确;在一个函数中定义的变量是这个函数的局部变量,所以只在函数内部起作用,C)正确;复合语句中定义的变量其作用域是这个复合语句,不会扩大到整个函数,所以D)错误。可参考《c语言程序设计新视角》函数变量的有效范围问题.

6. 请选出以下程序段的输出结果

#include

#define MIN(x,y) (x)<(y)? (x):(y)

int main()

{

int i,j,k;

i=10; j=15;

k=10*MIN(i,j);

printf("%dn",k);

return 0;

}

A) 15 B) 100 C) 10 D)150

答案:A

解析:执行MIN(i,j),∵i=10

7.在C语言中,用于实现打开文件的库函数是( )。

A) fclose() B) fopen() C) fseek() D) rewind()

答案:B

解析:本题考查c语言文件操作函数,答案为B

8. 设有以下语句:

struct st {int n; struct st *next;};

static struct st a[3]={5,&a[1],7,&a[2],9,'0'},*p;

p=&a[0];

则表达式_____的值是6。

A)p + + ->n B) p->n + + C) (*p).n + + D) + + p->n

答案:D

解析:a是先取a[0]的值5然后p自增指向a[1]的n值为7

b是直接取a[0]的5,未经过++运算

c也是直接取a[0]的5,未经过++运算

d是先取a[0]的5再自增为6

9. C语言中形参的缺省存储类别是

A)自动(auto) B)静态(static)

C)寄存器(register) D)外部(extern)

答案:A

解析:在函数体内声明的变量,在默认情况都是auto型。参考查询《c语言程序设计新视角》变量存储类别。

10. 执行下面的程序段后,变量k中的值为

int k=3, s[2];

s[0]=k; k=s[1]*10;

A) 不定值 B) 33 C) 30 D) 10

答案:A

解析:如题,s[0]=k=3,而s[1]并未初始化,则其内存储的是系统随机给的整数值,通常是负数,因而k也为不定值。

11. 已知字母A的ASCII码为十进制的65,下面程序的输出是

int main()

{

char ch1,ch2;

ch1='A'+'5'-'3';

ch2='A'+'6'-'3';

printf("%d,%cn",ch1,ch2);

return 0;

}

A) 67,D B) B,C

C) C,D D) 不确定的值

答案:A

解析:ch1的ASCⅡ值为65+2对应到字母C,输出格式中ch1以整数形式输出67;ch2的ASCⅡ值为65+3对应到字母D,输出格式中ch2以字符形式输出D.可以参考《c语言程序设计新视角》输出格式说明符。

12. 语句:printf("%d n",12 &012);的输出结果是

A) 12 B) 8 C) 6 D) 012

答案:B

解析:012表示八进制,,二进制表示001010,所以12&012=1100&001010(二进制)=1000(二进制)=8.

13. 以下说法中正确的是

A) C语言程序总是从第一个的函数开始执行

B) 在C语言程序中,要调用的函数必须在int main()函数中定义

C) C语言程序总是从int main()函数开始执行

D) C语言程序中的int main()函数必须放在程序的开始部分

答案:C

解析:c语言程序总是main()函数开始执行,其他子函数通过主函数调用而执行。可以参考《c语言程序设计新视角》中函数部分章节。

14. 以下程序运行后,输出结果是

int main( )

{

char *s="abcde";

s+=2;

printf("%ldn",s);

return 0;

}

A)cde B)字符c的ASCII码值 C)字符c的地址 D)出错

答案:C

解析:s为指针变量,其值为地址,为”abcde”字符串的首地址即a的地址,s+=2等价于s=s+2,即s的值为字符串中a向后移两位对应元素c的地址。

15. 设x和y均为int型变量,则执行下的循环后,y值为

for(y=1,x=1;y<=50;y++)

{

if(x>=10)break;

if(x%2==1){x+=5;continue;}

x-=3;

}

A)2 B)4 C)6 D)8

答案:C

解析:①x=1不满足x>=10,∴继续向下执行,x%2=1,满足第二个if,∴x=x+5=6,y=2进行第二次循环;

②x=6不满足x>=10,∴继续向下执行,x%2=0,不满足第二个if,继续执行x=3,y=3进行第三次循环;

当进行到第六次循环时,x=11满足x>=10跳出循环,此时y=6。

16. 当a=1,b=3,c=5,d=4时,执行下面一段程序后,x的值为

if(a

if(c

else if(a

if(b

else x=3;

else x=6;

else x=7;

A)1 B)2 C)3 D)6

答案:B

解析:如果if-else语句掌握熟练可直接分析程序做题目。否则,先将if和else配对(题目上红色数字即为配对情况)

如果a

17. 若b是int型变量,则表达式b=25/3%3的值为

A)7 B)8 C)6 D)2

答案:D

解析:运算级/与%自左向右,25/3=8,8%3=2,可以参考《c语言程序设计新视角》运算符相关知识。

18. 设C语言中,一个int 型数据在内存中占2个字节,则unsigned int 型数据的取值范围为:

A) 0-255

B) 1-32767

C) 0-65535

D) 0-2147483647

答案:C

解析:c语言中int 取值范围为-32768到32767之间,unsigned int为无符号整型,取值无赋值,因而为0到32767.

19. 下面的程序

int main()

{

int x=3,y=0,z=0;

if(x=y+z)printf("* * * *");

else printf("# # # #");

return 0;

}

A) 有语法错误不能通过编译

B) 输出* * * *。

C) 可以通过编译,但是不能通过连接,因而不能运行。

D) 输出# # # #。

答案:D

解析:由题,x=3不等于y+z=0所以执行else语句,输出# # # #。

20. 若有以下函数调用语句: fun(a+b,(x,y),fun(n+k,d,(a,b)));在此函数调用语句中实参的个数是

A)3 B)4 C)5 D)6

答案:A

解析:本题考查子函数中形参个数,因为fun()函数默认返回一个数,所以在最外层的fun()函数中有三个形式参数。本题需注意函数的套用,相关知识点可以参考《c语言程序设计新视角》中函数部分。

二、填空题(本大题共7小题,每题2分,共14分。)

1. 若有定义:double x[3][5],则x数组中行下标的下限为_________,列下标的下限为__________。

答案:2,4

解析:数组下标从0开使,因而下限为数组长度-1.

2. 设有说明语句"int a[3][4]={{1,2},{3,4,5},{6,7,8}};"则a[0][2]的初始化值为_____________,a[2][2]的初始化值为______________。

答案:0,8

解析:a[0]={1,2},a[0][2]初始化但未赋值为0,a[2]={6,7,8},a[2][2]=8,注意数组下标是从0开始的。

3. 表达式7/2的结果是____________。表达式7%2的结果是____________。

答案;3,1

解析:/为除后取整符号,%为除后取余符号。

4. 若已知a=1.5,b=15,c=1,则表达式a*b&&c的运算结果是____________。

答案:1

解析:首先知道 这几个符号的优先级算术运算符的优先级高于&&,所以先算乘法。a*b>0为真,c=1为真,最后结果为真,用“1”表示

5. C语言的标识符只能由大小写字母,数字和下划线三种字符组成,而且第一个字符必须为______________。

答案:字母数字或下划线

解析:C语言标识符命名规则。

6. 定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是____________。

答案:3

解析:开始,p为指向数组起始地址即1的地址的指针,表达式(*++p)++先算括号内的值:++为自右向左运算,所以p变为指向2,*为取指向地址的值即2,最后经过++的运算后变为3

7. 已有int i,j; float x;为将-10赋给i,12赋给j,410.34赋给x;则对应scanf("%d,%d,%d",&i,&j,&f)调用语句的数据输入形式是__________

答案:10,12,410.34

解析:scanf中“”内以“,”隔开,所以输入应与其保持一致,依然用“,”隔开。

三、判断题(本大题共7小题,每题2分,共14分。)

1. 在实际编程中,do-while循环完全可以用for循环替换( )

答案:对

解析:do-while与for都是用作循环的三种手段,因其都具有循环三要素即循环初始条件,判断条件,循环增量,所以可以相互替代。

2. do-while循环中,根据情况可以省略while( )

答案:错误

解析:do-while循环中 do和while必须同时出现。

3. 若调用一个函数,且此函数中没有return语句,则返回一个不确定的值( )

答案:对

解析:实际在编码中,如果函数的定义返回类型并非void而函数体中又无return语句,编译器就会自动报错,正确的应该在那句话前加一个前提:“函数有返回类型”,即函数返回类型不能是void

4. 函数调用:strcat(strcpy(str1,str2),str3)的功能是将串str2复制到串str1中后再将串str3连接到串str1之后( )

答案:对

解析:根据字符串库函数strcat和strcpy功能得知前一个是连接,后一个是复制。

5. 自增运算符(++)或自减运算符(--)只能用于变量,不能用于常量或表达式( )

答案:对

解析:c语言自增运算或减运算符使用规则

6. 全局变量使得函数之间的"耦合性"更加紧密,不利于模块化的要求( )

答案:对

解析:全局变量在程序中的作用规则

7. 函数的定义可以嵌套,但函数的调用不可以嵌套( )

答案:错

解析:函数的调用仍可嵌套。

四、程序分析题(用列表法列出关键变量在运行过程中的值)

(本题共3道小题,每题4分,共12分。)

1. 设有以下程序:

int main()

{

int n1,n2;

scanf("%d",&n2);

while(n2!=0) //(1)

{

n1=n2%10; //(2)

n2=n2/10; //(3)

printf("%d",n1);

}

return 0;

}

程序运行后,如果从键盘上输入6734;则输出结果为_________。

答案:4376

解析:

(1)n2 6734 673 67 6

(2)n1

(3)n2

4

673

3

67

7

6

6

0

2. 以下程序输出的最后一个值是__________。

int ff(int n)

{ static int f=l;

f=f*n;

return f;

}

int main()

{ int i;

for(I=1;I<=5;I++ printf("%dn",ff(i));

return 0;

}

答案:120

解析:i=1,ff(i)=1,ff中i=1;

i=2,ff(i)=2,ff中i=2;

i=4,ff(i)=24,ff中i=4;

i=5,ff(i)=120,ff中i=5;

i=6,不满足循环条件,退出循环,最后一个值为120,本题考查子函数中static i=3,ff(i)=6,ff中i=3;

变量的作用域问题。

3. 下列程序的输出结果是___________。

int ast(int x,int y,int * cp,int * dp)

{ *cp=x+y;

*dp=x-y;

}

int main()

{

int a,b,c,d;

a=4;b=3;

ast(a,b,&c,&d);

printf("%d %dn",c,d);

return 0;

}

答案:7,1

解析:a=4,b=3,调用ast,*cp=7,*dp=1,注意实参中后两项是c、d的地址,因而*cp、*dp为分别指向c,d的指针,所以c,d分别赋以7,1.本题考查函数间信息传递(传递地址)情形,可以参考《c语言程序设计新视角》函数间信息的传递部分内容。

五、编程题(本大题共2小题,每题10分,共20分)

1. 打印出杨辉三角形(要求打印出10行如下图)

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

答案

1. int main()

{int i,j;

int a[10][10];

printf("n");

for(i=0;i<10;i++)

{a[i][0]=1;

a[i][i]=1; ……………………………(1)

for(i=2;i<10;i++)

for(j=1;j

a[i][j]=a[i-1][j-1]+a[i-1][j]; ……………………………(2)

for(i=0;i<10;i++)

{for(j=0;j<=i;j++)

printf("%5d",a[i][j]); …………………………………注意

printf("n");

}

}

解析:本题考查杨辉三角,首先应清楚杨辉三角数表规律

(1)第一列与对角线上元素全为1。

(2)其余元素为上一行正对元素与正对元素的前一个元素之和。

然后考虑数据的存储用二维数组,二维数组以行优先进行存储,注意循环嵌套的顺序以及循环三要素。最后进行输出,《c语言程序设计新视角》输出格式内容描述。

2. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

答案:

#include

int main()

{

int i,j,k,m,t=0,n=0;

int a[10];

int b[1024];

for(m=2;m<1000;m++)

{

for(i=1,j=1;i<=m/2;i++)

{

if (m%i==0)

{

b[j]=i;

j++;

}

}

for(k=1;k

t=t+b[k];

if(m==t)

{

a[n]=m;

n++;

}

t=0;

}

for(i=0;i

printf("%dn",a[i]);

return 0;

}

解析:本题考查1000以内完数,首先应清楚完数特点如题一个数如果恰好等于它的因子之和,进而考虑获得因子的方法:模为零。然后考虑因子存放在数组中,接着将得到的因子数组中的元素相加,看是否等于被除数,若满足条件,将其放入完数数组中。最后将完数数组中的元素输出。

10


本文标签: 函数 变量 循环 输出 数组