c语言试题月考.docx
《c语言试题月考.docx》由会员分享,可在线阅读,更多相关《c语言试题月考.docx(13页珍藏版)》请在冰豆网上搜索。
![c语言试题月考.docx](https://file1.bdocx.com/fileroot1/2023-1/30/f32afd2c-ac50-44ec-a797-3b194f611d9f/f32afd2c-ac50-44ec-a797-3b194f611d9f1.gif)
c语言试题月考
计算机应用类专业2012年9月份月考C语言试题
一、选择题(5分*10=50分)
1、运行以下程序的输出结果是(D)
main()
{intx=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d%d",x--,y);}
A、10192B、9876C、10990D、101091
【解析】本题中变量x值的变化取决于自增运算符,而变量y值的改变取决于循环语句表达3中变量i的变化,也就是执行循环体后再改变y的值。
但最后一轮由于条件不满足而不输出y值。
循环次数
x
y
执行输出语句后x的值
变量i的值
执行表达3后y的值
1
10
10
9
01
101
2
9
1
8
12
12
2、运行以下程序的输出结果是(B)
main()
{inty=18,i=0,j,a[8];
do{a[i]=y%2;
i++;
y=y/2;
}while(y>0);
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
A、10000B、10010C、00110D、10100
【解析】本题中包含两个循环语句,do语句是分别给数组元素赋值,得a[0]=0,a[1]=1,a[2]=0,a[]3]=0,a[4]=1,结束后变量i的值变为5。
再执行for语句时是采用由后到前输出数组元素的值。
3、已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是(D)(注:
表示回车、︼表示空格)
inta1,a2;charc1,c2;
scanf(“%d%d”,&a1,&a2);
scanf(“%c%c”,&c1,&c2);
A)1020ABB)10︼20
AB
C)10︼︼20︼︼ABD)10︼20AB
4、设x和y均为int型变量,则执行以下循环后,y的值为(C)
#include"stdio.h"
main()
{intx,y;
for(y=1,x=1;y<=50;y++)
{if(x>=10)break;
if(x%2==1)
{x+=5;
continue;
}
x-=3;
}
printf("%d",y);
}
A、2B、4C、6D、10
【解析】根据程序可知,程序每次循环状态如表所示
循环次数
本次循环开始时的x的值
本次循环结束时的x的值
执行一轮循环后变量y的值
1
1
6
2
2
6
3
3
3
3
8
4
4
8
5
5
5
5
10
6
循环执行到第6次时,由于x=10所以退出循环。
因此本题答案为C
5、运行以下程序的输出结果是(A)
#include
voidmain()
{chars[16]="12345\0\t\t\t";
printf("%d%d\n",strlen(s),sizeof(s));
}
A、516B、916C、513D、1316
【解析】本题主要考查字符串处理函数strlen(),sizeof(),strlen()是长度测试函数,在测试过程中如遇到字符串结束标志符时自动停止读取,题中第6个字符为字符串结束标志符就停止,所以有效字符数为5。
sizeof()函数是求某一数据类型所占的内存空间的长度,此题中测试的是字符数组s所占内存空间的长度,而数组s的长度在定义时已明确指出为16,所以sizeof()测出的值是16。
所以本题答案为A。
6、运行以下程序的输出结果是(B)
#include
voidmain()
{inti,a[10]={0,1,2,3,4,5,6,7,8,9};
for(i=1;i<9;i++)a[i]=a[i-1]+a[i+1];
printf("%d%d",a[5],a[7]);
}
A、1014B、2035C、812D、2744
【解析】本题主要考查数组元素的算术运算与其值的变化特点。
循环次数
控制变量i值的值
数据元素a[i]的值
1
1
a[1]=a[0]+a[2]=2
2
2
a[2]=a[1]+a[3]=5
3
3
a[3]=a[2]+a[4]=9
4
4
a[4]=a[3]+a[5]=14
5
5
a[5]=a[4]+a[6]=20
6
6
a[6]=a[5]+a[7]=27
7
7
a[7]=a[6]+a[8]=35
8
8
a[8]=a[7]+a[9]=44
循环到第8次后,变量i的值变为9,不符合条件,退出循环。
根据表格所示本题答案为B。
7、以下程序的输出结果是(A)
main()
{intn=4;
while(n--)
printf("%d",--n);}
A、20B、31C、321D、210
【解析】本题考查while循环语句和自减运算符的运用。
由程序段可知,循环的控制表达式while(n--)中,n相当于while(n)n--;所以每循环一次,n值减1,n值的变化是4,3,2,1,0。
但由于在printf("%d",--n);语句中又存在--n的变化,所以程序中n的变化实质是每循环一轮其值递减2,即420,当n变为0时while(n)条件不满足,退出循环。
8、若变量a,i已正确定义,且i已正确赋值,合法的语句是(B)。
A)a==1B)++i;C)a=a++=5;D)a=int(i)
【解析】本题考查C语言语句的特点,C语言中语句的结束是以“;”为标志。
由此可排除选项A和D。
其二常数不可以赋值给一个表达式也不可以常量赋给常量,由此可排除选项C。
故答案为B。
9、运行以下程序的输出结果是(C)
#include
voidmain()
{chari,s[][5]={"abc","defgh","ijk","xyz"};
for(i=1;i<3;i++)
printf("%s\n",s[i]);
}
AabcBdefghCdefghijkDdefghijk
defghijkijkxyz
ijk
【解析】此题考查字符串数组的含义,字符串数组实质是数组中每一个元素又都是存放一个字符串的数组,所以可以将一个字符数组视为一个二维字符数组。
其中的元素按行占连续的存储单元,且其中有些存储单元是空闲的,各字符串并不是一串连着一串存放,总是从每行的第0个元素开始存放一个新的串。
此题中第二行由于数组长度刚好与字符个数相等,即长度不够,则字符串结束标志符'\O'未能存入s中,而是存在s数组之后的一个单元里,所以本题的存放形式如图示。
S[0]
a
b
c
\0
S[1]
d
e
f
g
h
S[2]
i
j
k
\0
S[3]
x
y
z
\0
题中使用了printf()函数的"%s"格式符来输出字符串,实现时从数组的第一个字符开始逐个字符输出,直到遇到第一个'\0'为止(其后即使还有字符亦不输出)。
10、某店一个月的收入和支出总共记录了N个数据
,
,。
。
。
,其中入记为正数,支出记为负数。
该店用右边的程序框图计算月总收入S和月净盈利V,那么在图中空白的判断框和处理框中,应分别填入下列四个选项中的(C)
(A)A>0,V=S-T
(B)A<0,V=S-T
(C)A>0,V=S+T
(D)A<0,V=S+T
【解析】月总收入为S,因此A>0时归入S,判断框内填A>0,支出T为负数,因此月盈利V=S+T。
二、填空题(4分*5=20分)
1、有inta=3,b=4,c=5,x,y;,则以下表达式的值为0。
!
(x=a)&&(y=b)&&0
【解析】对于C语言中逻辑表达式有且只有“1”和“0”两个逻辑值,在运算过程中按从左至右的顺序进行运算,但要考虑运算符的优先级别。
2、以下程序对输入两个整数,按从大到小顺序输出.请在[]内填入正确内容.
main()
{intx,y,z;
scanf(“%d,%d”,&x,&y);
if(x{z=x;x=y;y=z;}
pringf(“%d,%d”,x,y);
}
【解析】本题是要求按从大到小的顺序输出,程序中的z是用来交换x,y的中间变量,根据后一空中z=x;可知只有当x的值小于y的值时才会进行交换。
3、以下程序是选出能被3整除且至少有一位是5的两位数,打印出所有这样的数及其个数。
请填空。
sub(intk,intn)
{
inta1,a2;
a2=k%10;a2=k%10;a2=k/10;
a1=k/10;a2=(k-a2)/10;a2=k-a2*10;
if((k%3==0&&a2==5)||(k%3==0&&a1==5))
{printf("%d",k);
n++;
returnn;
}
elsereturn-1;
}
main()
{
intn=0,k,m;
for(k=10;k<=99;k++)
{m=sub(k,n);
if(m!
=-1)n=m;}
printf("\nn=%d",n);
}
【解析】本程序是要求选出能被3整除且至少有一位是5的两位数,根据这一特点就说明要成立必须包含两个方面
(1)能被3整除;
(2)其中个位或者十位上有个数字5且同时成立,题中if语句中的条件中包含的第一个方面,所以只需从这个两位数中分别分离出个位或十位与其结合就可以。
154551545775
n=6
三、阅读程序写结果(5分*5=25分)
1、
#include
voidmain()
3,14,32,41,2
{
intx,y,z;
x=y=2;z=3;
y=x++-1;printf("%d,%d\t",x,y);
y=++x-1;printf("%d,%d\t",x,y);
y=z--+1;printf("%d,%d\t",z,y);
y=--z+1;printf("%d,%d\t",z,y);
}
【解析】本题主要考查自增与自减运算符的应用及变量在按顺序执行过程中其值是否发生改变,变量的值一经改变必须使用改变后的值进行下一步的运算,同时一定要考虑其输出格式。
4,7,10
2、
#include
voidmain()
{inti,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
for(i=0;i<3;i++)
printf("%d,",a[i][3-i]);
}
【解析】此题主要考查二维数组中的元素值与下标号的对应关系。
3、
12
#include
voidfun(intx,inty,intz)
{z=x+y;
}
voidmain()
{inta=12;f(5,6,a);
printf("%d\n",a);
}
【解析】本题是考查函数参数的传递关系,题中的参数是传值的关系,所以形参的改变不会影响实参。
故输出时a的值为12。
4、
#include
63
voidmain()
{inti,j=3,a[]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<5;i++)a[i]=i*(i+1);
for(i=0;i<4;i++)j+=a[i]*3;
printf("%d",j);
}
【解析】本题考查
(1)二维数组元素与该元素下标号的对应关系;for循环语句的运行特点;题中所包含的两个for循环语句和一个输出语句这,这三条语句是并列关系而不是嵌套关系,且第一个for循环的作用是改变下标号为0,1,2,3,4的元素的值,分别对应为0,2,6,12,20,其它的元素值不变。
第二个for语句是求出当变量i改变时求出变量j的值,但要注意变量j值的改变后,要用变化后的值而不能用原有的初值,同时最后只有一个值,因为每循环一次并没有输出。
4
5、#include
main()
{intx;
scanf(”%d”,&x);
if(x--<5)
printf(”%d”,x);
else
printf(”%d”,x++);
}
程序运行后,如果从键盘输入5,则输出结果是()
【解析】本题考查双分支if结构的变化关系及自增、自减的变化特点。
四、改错题(指出错误行为2分,更改正确后得3分,分值为25分)阅读程序,修改程序中的错误,不得增行和删行,也不得更改程序结构。
请指出错误所在的行号,并给出该行修改后的程序代码。
1、以下程序中函数fun的功能是:
计算正整数num各位上的数字之积。
例如,若输入252,则输出应该是20。
若输入202,则输出应该是0。
#include
#include
longfun(longnum)
{
longk;
do
{
k*=num%10;
num\=10;
}while(num);
return(k);
}
main()
{
intn;
printf("\Pleaseenteranumber:
");
scanf("%ld",n);
printf("\n%ld\n",fun(n));
}
错误行:
longk;更正:
longk=1;
错误行:
num\=10;更正:
num/=10;
错误行:
scanf("%ld",n);更正:
scanf("%ld",&n);
【解析】本题要求是“计算正整数num各位上的数字之积”,所以必须要分解各位上的数字,其中求余是取个位上的数,除法是取整求出前两位数,下一轮循环再分解取整求出的前两位数。
根据这一点来对照
(1)求积时某一变量的初值必须为1。
(2)各种运算符的写法(3)输入语句要注意什么?
2、下列给定的程序中,函数fun的功能是:
计算并输出k以内最大的10个能被13或17整除的自然数之和。
k的值由主函数传入,若k的值为500,则函数的值为4622。
#include
intfun(intk)
{intm=0,mc=0,j;
while((k>=2)&&(mc<10))
{if((k%13=0)||(k%17=0))
{m=m+k;mc++;}
k--;
(此处要加大括号)
returnm;
}
voidmain()
{system("CLS");
printf("%d\n",fun(500));
}
错误行:
if((k%13=0)||(k%17=0))更正:
if((k%13==0)||(k%17==0))
错误行:
缺少大括号更正:
加大括号
【解析】本题是“计算并输出k以内最大的10个能被13或17整除的自然数之和”,由此看出
(1)在k以内能满足条件的数最多为10个;
(2)求和;(3)能被13或17整除的自然数;对照这三点看if((k%13=0)||(k%17=0))
{m=m+k;mc++;}可知m是用来存储和数,mc是记录满足条件的个数,同时可以看出要整除其余数等于0,而if((k%13=0)||(k%17=0))中是赋值所以存在错误;任意函数的返回值是指整个函数运行结束后,才把值返回,所以return语句在此程序中不能位于while循环语句中。
故缺少花括号。
五、程序设计题(每空5分,共25分)
1、下列给定程序中,函数fun的功能是:
实现两个整数的交换。
例如,给a和b分别输入60和65,输出为:
a=65b=60
#include
voidfun(【int*a,int*b】)
{intt;
【t=*b;*b=*a;*a=t;】
}
voidmain()
{inta,b;
system("CLS");
printf("Entera,b:
");scanf("%d%d",&a,&b);
fun(&a,&b);
printf("a=%db=%d\n",a,b);
}
【解析】本题是考查函数参数的传递与接收之间的对应关系;根据程序中函数fun(&a,&b)可知参数是地址,是传地址的过程,从而知道接收它的必须是地址或用指针来接收,同时运算时就应该用指针运算符来求其值。
2、请补充函数fun(char*s),该函数的功能是:
把字符串中的内容逆置。
例如,字符串中原有的字符串为abcde,则调用该函数后,串中的内容为edcba。
试题程序:
#include
#include
#defineN81
voidfun(char*s)
{inti,n=strlen(s)-1;
chart;
for(i=0;i{t=s[i];
【s[i]=s[n]】;*(s+i)=*(s+n);
【s[n]=t】;*(s+n)=t;
}
}
main()
{chara[N];
system("CLS");
printf("Enterastring:
");
gets(a);
printf("Theoriginalstringis:
");
puts(a);
fun(a);
printf("\n");
printf("Thestringaftermodified:
");
puts(a);
}
【解析】本题是“把字符串中的内容逆置”,所以只要把相应下标的值通过中间变量进行传递就可以。