C语言上机题目考试.docx
- 文档编号:26682634
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:137
- 大小:84.76KB
C语言上机题目考试.docx
《C语言上机题目考试.docx》由会员分享,可在线阅读,更多相关《C语言上机题目考试.docx(137页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 上机 题目 考试