C语言上机题目考试.docx

上传人:b****7 文档编号:26682634 上传时间:2023-06-21 格式:DOCX 页数:137 大小:84.76KB
下载 相关 举报
C语言上机题目考试.docx_第1页
第1页 / 共137页
C语言上机题目考试.docx_第2页
第2页 / 共137页
C语言上机题目考试.docx_第3页
第3页 / 共137页
C语言上机题目考试.docx_第4页
第4页 / 共137页
C语言上机题目考试.docx_第5页
第5页 / 共137页
点击查看更多>>
下载资源
资源描述

C语言上机题目考试.docx

《C语言上机题目考试.docx》由会员分享,可在线阅读,更多相关《C语言上机题目考试.docx(137页珍藏版)》请在冰豆网上搜索。

C语言上机题目考试.docx

C语言上机题目考试

1.有以下程序

inta=3;

main()

{ints=0;

{inta=5;s+=a++;}

s+=a++;printf("%d\n",s);

}

程序运行后的输出结果是_______。

选项:

A.8B.7C.10D.11

评析:

选项A的错误在于switch语句后面不该加分号;

选项B的错误在于switch语句要求每一个case的常量表达式的值必须互不相同;

选项C的错误在于变量a应该用括号括起来,case后面应该是常量表达式,而不是变量。

本题答案为D。

2.若有说明:

intn=2,*p=&n,*q=p;,则以下非法的赋值语句是______。

选项:

A.*p=*qB.p=qC.n=*qD.p=n

评析:

本题的考查点是指针变量的引用。

指针变量不同于整型变量和其它类型的变量,它是用来存放地址(指针)的,不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量,这样的赋值是不合法的。

本题中的答案D就属于这种情况,所以p=n;是非法的赋值语句。

故本题答案为D。

3.在说明语句:

int*f();中,标识符f代表的是______。

选项:

A.一个用于指向整型数据的指针变量

B.一个用于指向函数的指针变量

C.一个用于指向一维数组的行指针

D.一个返回值为指针型的函数名

评析:

int*f()表示f是一个函数,它带回一个指针值,这个指针是指向一个整型数据的。

本题答案为D。

4.以下程序的输出结果是______。

intf()

{staticinti=0;

ints=1;

s+=i;i++;

returns;

}

main()

{inti,a=0;

for(i=0;i<5;i++)a+=f();

printf("%d\n",a);

}

选项:

A.15B.24C.25D.20

评析:

本题主要考的是对变量存储属性的理解,一个变量被指定为静态变量,在编译时就为其分配了存储空间,程序一开始执行便被建立,直到该程序执行结束都存在,而不像动态变量只存在于函数或分程序被调用期间。

在函数多次被调用的过程中静态局部变量的值具有可继承性。

在第一次调用函数结束时,i的值是1,返回值1,第二次调用函数时,i的值保持为1,执行自加操作后,i的值变成了2,到了第三次调用时,i的值保持了上次调用结束时的值,再执行自加,值变成了3。

到第五次调用结束时,i的值是5。

而s的值不具备i的这种可继承性,每次调用时,它都先被重新赋值为1,再执行下面的操作。

本题答案为D。

5.有以下程序

main()

{inti=0,s=0;

do{

if(i%2){i++;continue;}

i++;

s+=i;

}while(i<7);

printf("%d\n",s);

}

执行后输出的结果是______。

选项:

A.21B.28C.16D.12

评析:

本题的考查点是do-while循环语句。

do-while的一般格式如下所示:

do

{语句;

}while(测试表达式);

do-while语句是先执行后判断,其执行流程是:

1、执行循环体;

2、计算测试表达式,若为非0,转向执行do,否则执行while下面的一条语句;

3、执行do-while后面的语句,即退出do-while循环。

本题中,当i=0时,i%2=0,为假不执行{i++;continue;},接着往下执行i++,此时i=1,s=s+i=1,因为i=1符合条件i<7继续循环执行,i=1时以此类推,直到i>=7时结束循环。

最后得出s=16。

故本题答案为A。

6.下面程序的输出结果是______。

main()

{inta[]={1,2,3,4,5,6,7,8,9,0},*p;

p=a;

printf("%d\n",*p+9);

选项:

A.1B.0C.10D.9

评析:

本题中,p=a,则表明指针p指向数组a的第一个元素,即a[0]。

指针运算符"*"的优先级高于加法运算符"+",所以"*p+9"相当于a[0]+9,即10。

本题答案为C。

7.有以下程序

inta=2;

intf(int*a)

{return(*a)++;}

main()

{ints=0;

{inta=5;

s+=f(&a);

}

s+=f(&a);

printf("%d\n",s);

}

执行后输出结果是______。

选项:

A.8B.10C.9D.7

评析:

在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。

本题中的inta=5;只在{inta=5;s+=f(&a);}内有效。

在函数之外定义的变量称为外部变量,外部变量是全局变量。

全局变量可以为本文件中其它函数所共用。

它的有效范围为:

从定义变量的位置开始到本源文件结束。

本题的开头inta=2;即为全局变量,实际上起作用的也就是这个。

故本题答案为C。

8.有如下程序

main()

{floatx=2.0,y;

if(x<0.0)y=0.0;

elseif(x<10.0)y=1.0/x;

elsey=1.0;

printf("%f\n",y);

}

该程序输出结果是______。

选项:

A.0.000000B.0.250000C.1.000000D.0.500000

评析:

本题考查的是if…else语句的使用。

x=2.0,符合第二个if语句的条件x<10.0,所以执行y=1.0/x语句,即y=1.0/2.0=0.500000。

本题答案为C。

9.若已定义:

inta[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。

选项:

A.p+1B.++pC.a++D.a+1

评析:

本题的考查点是数组地址的表示。

选项C中,数组名所表示的数组地址不能被重新赋值。

本题答案为C。

10.设a=5、b=6、c=7、d=8、m=2、n=2,执行

(m=a>b)&&(n=c>d)

后n的值为______。

选项:

A.4B.2C.3D.1

评析:

本题的考查点是逻辑与运算。

在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。

本题中,(m=a>b)的值为0,求出整个表达式的值为0,不需执行(n=c>d),所以n仍为2。

故本题答案为B。

11.下列选项中正确的语句组是______。

选项:

A.char*s;s="Beijing"

B.chars[8];s="Beijing"

C.chars[8];s={"Beijing"}

D.char*s;s={"Beijing"}

评析:

本题的考查点是字符串的定义和赋初值。

选项A、C是对字符数组初始化,可以是逐个字符赋给数组中各元素,也可以对整个字符串赋初值,但必须是字符型(s型),并且C语言规定,只有静态存储(static)数组和外部存储(extern)数组才能初始化。

所以选项A、C都不对。

应该这样来实现:

staticchars[]="Beijing";选项B、D是想通过字符指针来实现,正确的格式是char*s;s="Beijing"。

故本题答案为D。

12.设有如下程序段

chars[20]="Beijing",*p;

p=s;

则执行p=s;语句后,以下叙述正确的是______。

选项:

A.s和p都是指针变量

B.s数组中元素的个数和p所指字符串长度相等

C.可以用*p表示s[0]

D.数组s中的内容和指针变量p中的内容相同

13.有以下程序

main()

{intm=3,n=4,x;

x=-m++;

x=x+8/++n;

printf("%d\n",x);

}

程序运行后的输出结果是______。

选项:

A.-1B.5C.3D.-2

评析:

本题考查的是混合运算。

此题考的是++在变量前或变量后如何作用。

++在变量前和变量后的唯一区别就在于在执行“++变量”所在的语句时,是先将变量加1再执行它所在语句还是先执行它所在的语句再使变量加1,当++在变量后时,也就是“变量++”,那就是先将变量值代入表达式运算后再使变量加1;而“++变量”是先使变量加1,再把加1后的结果放入表达式进行运算。

这两种情况,在执行完变量所在的语句后,它们在内存中的值都是加过1之后的值了。

所以本题中x=-m++执行后x=-3,而执行x=x+8/++n时,必须先将n加1,再代入表达式运算。

所以答案为D。

14.设有条件表达式:

(EXP)?

i++:

j--,则以下表达式中与(EXP)完全等价的是______。

选项:

A.(EXP==1)B.(EXP!

=0)C.(EXP==0)D.(EXP!

=1)

评析:

本题的考查点是C语言条件运算。

条件运算符有三个操作数。

它的形式是:

(EXP)?

exp1:

exp2。

如果EXP的值为非零,那么整个表达式的值就是表达式exp1的值,如果EXP的值为零,那么整个表达式的值就是exp2的值。

选项B的功能是判断EXP的值的是否不为0,如果不为0,则"(EXP!

=0)"的值为真;否则,"(EXP!

=0)"的值为假,与题面的条件表达式意思一致。

故本题答案为B。

15.设有以下定义

uniondata

{intd1;floatd2;}demo;

则下面叙述中错误的是______。

A.变量demo与成员d2所占的内存字节数相同

B.若给demo.d1赋99后,demo.d2中的值是99.0

C.变量demo和各成员的地址相同

D.变量demo和各成员的地址相同

评析:

本题的考查点是共用体的存储特点。

共用体的存储特点:

(1)同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;

(2)共用体变量中起作用的成员是最后一次存放的成员,即在存入一个新的成员后原有的成员失去作用,所以选项D的说法是错误的;

(3)共用体变量的地址和它的成员的地址是同一个地址,且各成员的地址也相同,因为共用体成员是共同占用同一段存储空间的,所以选项B,C的说法都正确;

(4)共用体变量不能整体被赋值,也不能给共用体变量赋初值;

(5)共用体所占的内存长度等于最长的成员的长度,所以选项A的说法正确。

故本题答案为D。

16.请读程序:

#include

#include

main()

{

char*s1="AbCdEf",*s2="aB";

s1++;s2++;

printf("%d\n",strcmp(s1,s2));

}

上面程序的输出结果是______。

选项:

A.正数B.负数C.零D.不确定的数

评析:

本题的考查点是字符串比较函数strcmp()的应用。

strcmp(X1,X2)是串比较函数,当X1>X2时返回值为正数,当X1

本题中"s1"、"s2"分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,指针变量s1指向的是串"bCdEf"的首地址,即"b"的地址,而指针变量s2指向的是"B"的地址。

而在字符串比较中,大小的确定是各个字符串相应位置字符的ASCII码值的大小决定的,"B"的ASCII码值为66,"b"的ASCII码值为98,所以s1>s2,返回值为正数。

故本题答案为A。

17.若a、b、c1、c2、x、y均是整型变量,正确的switch语句是______。

switch(a+b);

{case1:

y=a+b;break;

case0:

y=a-b;break;

}

switch(a*a+b*b)

{case3:

case1:

y=a+b;break;

case3:

y=b-a;break;

}

switcha

{casec1:

y=a-b;break;

casec2:

x=a*b;break;

default:

x=a+b;

}

switch(a-b)

{default:

y=a*b;break;

case3:

case4:

x=a+b;break;

case10:

case11:

y=a-b;break;

}

A.④

B.②

C.③

D.①

评析:

选项A的错误在于switch语句后面不该加分号;

选项B的错误在于switch语句要求每一个case的常量表达式的值必须互不相同;

选项C的错误在于变量a应该用括号括起来,case后面应该跟上常量表达式,而不是变量。

本题答案为D。

18.C语言源程序名的后缀是______。

选项:

A..cB..exeC..objD..cp

评析:

本题的考查点是C语言源程序名的后缀。

C语言源程序名的后缀是.c,对源程序进行编译后得到一个后缀为.obj的目标程序,然后把目标程序进行连接操作,则可得到一个后缀为.exe的可执行文件。

故本题答案为B。

19.有如下程序

#defineN2

#defineMN+1

#defineNUM2*M+1

main()

{

inti;

for(i=1;i<=NUM;i++)

printf("%d\n",i);

}

该程序中的for循环执行的次数是______。

选项:

A.8B.6C.7D.5

评析:

本题的考查点是对C语言中宏定义的理解。

分别将N,M的宏定义代入NUM的表达式中,可以得到NUM=2*2+1+1=6,所以当常数NUM作为for循环的终止条件时,应当循环6次。

故本题答案为B。

20.有以下程序

main()

{unsignedchara=2,b=4,c=5,d;

d=a|b;d&=c;printf("%d\n",d);

}

程序运行后的输出结果是______。

选项:

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

评析:

本题考查的是逻辑运算。

本题中主要是进行位的逻辑运算。

将a的值转换为二进制为:

00000010,b的值转换为二进制为:

00000100,将a、b进行按位或运算(参加计算的两个位只要有一个为1,那么运算结果为1),因此此时d的二进制为:

00000110,c的值转换为二进制为:

00000101,接下来将d和c进行按位与运算(参加计算的两个位都为1,则结果为1,否则为0),结果为:

00000100,转换成十进制数结果为4。

故本题答案选B。

21.以下程序的输出结果是______。

voidfun()

{staticinta=0;

a+=2;printf("%d",a);

}

main()

{intcc;

for(cc=1;cc<4;cc++)fun();

printf("\n");

}

答案:

246

评析:

循环for(cc=1;cc<4;cc++)被执行了3次。

在函数fun中,由于a是static型变量,所以函数第1次调用后,a=2;第2次调用后,a=4;第3次调用后,a=6。

22.以下程序运行后的输出结果是______。

main()

{intp=30;

printf("%d\n",(p/3>0?

p/10:

p%3));

}

答案:

3

评析:

本题的考查点是C程序设计。

考察的主要知识点是条件表达式。

(p/3>0?

p/10:

p%3)是一个条件表达式。

条件表达式的一般形式为:

表达式1?

表达式2:

表达式3。

条件表达式的执行顺序为:

先求解表达式1,若为真则求解表达式2,此时表达式2的值就是整个条件表达式的值。

若表达式2的的值为假,则求解表达式3,表达式3的值就是整个条件表达式的值。

条件运算符的结合方向为“自右至左”。

本题中p=30,p/3>0为真,所以求解p/10的值为3,即为整个表达式的值。

23.以下函数把b字符串连接到a字符串的后面,并返回a中新字符串的长度。

请填空。

strcen(chara[],charb[])

{intnum=0,n=0;

while(*(a+num)!

=______)num++;

while(b[n]){*(a+num)=b[n];num++;______;}

return(num);

}

答案:

第一空:

‘\0’或0或NULL

第二空:

n++或++n或n+=1或n=n+1或n=1+n

评析:

第1个循环是为了计算a串的长度,串以NULL结束,所以第1个空应填'\0'或0或NULL;第2个循环是为了在a串的后面加上b串,num++是为了将a串的下标向前移动,毫无疑问,b串的下标也必须向前移动,所以第2个空必须填n++或与此等功能的其它表达式。

24.下面程序的输出是______。

main()

{intarr[10],i,k=0;

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

arr[i]=i;

for(i=1;i<4;i++)

k+=arr[i]+i;

printf("%d\n",k);

}

答案:

12

评析:

本题的考查点是for循环。

第一个循环

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

arr[i]=i;

是将数组元素0至9分别赋值为0到9;

第二个循环

for(i=1;i<4;i++)

k+=arr[i]+i;

可以变化成以下形式:

for(i=1;i<4;i++)

k=arr[i]+i+k;

将数组arr[1]、arr[2]、arr[3]的各个值计算可以得到k的最终值为12。

25.下列程序段的输出结果是______。

main()

{charb[]="Hello,you";

b[5]=0;

printf("%s\n",b);

}

答案:

Hello

评析:

字符串中,数值0或符号'\0'表示字符串的结束。

本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。

因此,只输出前五个字符,即Hello。

26.以下程序的功能是:

输出a、b、c三个变量中的最小值,请填空。

#include

main()

{inta,b,c,t1,t2;

scanf("%d%d%d",&a,&b,&c);

t1=a

______;

t2=c

______;

printf("%d\n",t2);

}

答案:

第一空:

a:

b

第二空:

c:

t1

评析:

本题的考查点是条件运算。

通过题意及输出语句可知,t2用来存放a,b,c三个变量中的最小值。

程序首先通过条件运算符比较变量a和b,使得其中小的那个值赋值给变量t1;然后再通过变量c与t1进行比较,将小的值赋给变量t2,从而求得a,b,c三个变量中最小的值。

条件运算符的一般形式为:

表达式1?

表达式2:

表达式3

条件运算符的执行顺序:

先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。

若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。

由于t1存放是a,b中较小的数,所以当a

b",同理本题第二空填"c:

t1"。

27.下面程序的运行结果是:

______。

#defineN10

#defines(x)x*x

#definef(x)(x*x)

main()

{inti1,i2;

i1=1000/s(N);i2=1000/f(N);

printf("%d%d\n",i1,i2);

}

答案:

100010

评析:

本题的考查点是宏定义。

根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*10)=10。

故本题答案为:

1000和10。

28.设有定义:

floatx=123.4567;,则执行以下语句后的输出结果是______。

printf("%f\n"(int)(x*100+0.5)/100.0);

答案:

123.460000

评析:

本题考查的是表达式的运算。

输出语句的表达式:

(int)(x*100+0.5)/100.0是指先运算表达式中的"x*100+0.5",然后将其结果强制转换为int型,即:

(int)(123.4567*100+0.5)=(int)12346.17=12346,接下来进行"/100.0"的运算即:

12346/100.0=123.46,原因是除运算是双目运算,当一边是整型数,一边是实型数时,系统自动将整型转换为实型数,然后进行运算,又因为最后的的输出格式是float类型的实数,所以结果为123.460000。

29.以下程序运行后的输出结果是______。

main()

{intx=15;

while(x>10&&x<50)

{x++;

if(x/3){x++;break;}

elsecontinue;

}

printf("%d\n",x);

}

答案:

17

评析:

本题的考查点是while循环语句。

当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++;后跳出循环体,此时x的值为17。

故本题答案为:

17。

30.若输入字符串:

abcde↙,则以下while循环体将执行______次。

while((ch=getchar())=='e')printf("*");

答案:

0或零

评析:

函数getchar()是从键盘得到用户输入的一个字符。

用户输入的第1个字符是a,不管后面输入的是什么,ch的值都是'a',因此条件(ch=getchar())=='e'为假,这个循环不会被执行。

31.有以下程序段

charch;intk;

ch='a';k=12;

printf("%c,%d,",ch,ch,k);printf("k=%d\n",k);

已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是______。

选项:

A因变量类型与格式描述符的类型不匹配输出无定值

Ba,97,k=12

Ca,97,12k=12

D输出项与格式描述符个数不符,输出为零值或不定值

评析:

本题的考查点是数据的输入与输出,输入输出函数的调用。

printf函数的参数包括格式控制和输出列表,本题的第一个printf格式控制符"%c,%d"是指输出一个字符型数据和一个整型数据(C语言规定,不管格式符的个数与输出变量的个数是否相等,则均按格式符的个数输出,如果格式符的个数小于输出变量的个数,则按自左至右的顺序,多余的变量值不输出,若格式符的个数大于输出变量的个数,则多余格式符则由程序自动输出任意值),由于字符a的ASCII码为97,所以第一个printf输出"a,97,";第二个printf用于输出整型变量k的值,即"k=12",所以本题程序输出的结果是"a,97

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1