2006年秋浙江省高等学校
计算机等级考试试卷(二级C)
试题1(每小题3分,共12分)
阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序说明】
输入一行字符,统计并输出其中英文字母、数字和其他字符的个数。 运行示例:
Enter characters: f(x,y)=3x+5y-10 letter=5, digit=4, other=6
【程序】 #include <> void main( )
{ int digit, i, letter, other; (1) ch;
digit = letter = other = 0; printf(\"Enter characters: \"); while( (2) != '\\n') if( (3) ) letter ++;
(4) (ch >= '0' && ch <= '9') digit ++; else
other ++;
printf(\"letter=%d, digit=%d, other=%d\\n\ 【供选择的答案】
(1) A、* B、float C、double D、char (2) A、(ch = getchar())
B、ch = getchar()
C、getchar(ch) D、putchar(ch)
当输入的字符不是回车符时执行循环,这是典型语句,背过! (3) A、(ch >= 'a' && ch <= 'z') && (ch >= 'A' && ch <= 'Z') ch <= 'z') || (ch >= 'A' && ch <= 'Z')
C、ch >= 'a' && ch <= 'Z' D、ch >= 'A' && ch <= 'z'
判断是否为字母(大写或小写),这是典型语句! (4) A、if B、else
C、else if
注意配对,所以A错误。
D、if else
B、(ch >= 'a' &&
试题2(每小题3分,共12分)
阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序说明】
输入一个整数,将它逆序输出。要求定义并调用函数reverse(long number),它的功能是返回number的逆序数。例如reverse(12345)的返回值是54321。
运行示例:
Enter an integer: -123 After reversed: -321 【程序】 #include <> void main( ) { long in;
long reverse(long number); printf(\"Enter an integer:\"); scanf(\"%ld\/*6*/
printf(\"After reversed:%ld\\n\ long reverse(long number) { int flag; (6) ;
flag = number < 0 ? -1 : 1; if( (7) ) number = - number; while(number != 0){ res = (8) ; number /= 10; } return flag*res;} 【供选择的答案】
(5) A、reverse( ) B、in
C、reverse(in) D、reverse
从/*6*/那里我们知道实际参数是in,所以这里应该选C。 (6) A、res = 0 B、long res C、long res = 0 D、res
因为这里res的取值达到了54321,超过一般整数的范围,所以要用long型,因此考虑在B和C中选。结合(8)res要有初值,所以选C。 (7) A、number > 0 B、number < 0 C、number != 0 D、number == 0
语句if( (7) ) number = - number;的作用相当于取绝对值函数abs,所以选B。 (8) A、number%10 B、res*10 + number%10 C、number/10 D、res*10 + number/10
由下一句number /= 10;可以推断这里是求余,先排除CD。仔细思考选B。
以下两句:
res = res*10 + number%10; number /= 10;
先求个位数,然后除以10,就得到十位数。也就是说,除以10后,原来的十位数就变成了个位数。
试题3(每小题3分,共12分)
阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序说明】
输入一个3 行2 列的矩阵,分别输出各行元素之和. 运行示例: Enter an array: 6 3 1 -8 3 12
sum of row 0 is 9 sum of row 1 is -7 sum of row 2 is 15 【程序】 #include <> void main( )
{ int j, k, sum = 0; int a[3][2];
printf(\"Enter an array:\\n\"); for(j = 0; j < 3; j++) for(k = 0; k < 2; k++)
scanf(\"%d\ for(j = 0; j < 3; j++){ (10)
for(k = 0; k < 2; k++)
sum = (11) ;
printf(\"sum of row %d is %d\\n\ 【供选择的答案】
(9) A、a[j][k] B、a[k][j] C、&a[j][k] D、&a[k][j]
双层循环,输入数组,根据Scanf的语法,首先排除AB;根据行列关系(先按照行,后按照列),可以推断这里是C。
(10) A、; B、sum = -1; C、sum = 1; D、sum = 0; 每次初值为0,否则会各行累加。
(11) A、sum + a[j][k] B、sum + a[j][j] C、sum + a[k][k] D、0
BC只会累加对角线上的元素,所以错误。D显然不对。因此选A。 (12) A、k B、j C、0 D、1 注意,J表示行,K表示列。
试题4(每小题3分,共12分)
阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序】 #include <> void main( )
{ int k;
for(k = 5; k > 0; k--){ if(k==3)
continue; /* 第6行 */
printf(\"%d \
B、5 4 2 1 B、5 4 2 1 B、5 4 2 1 B、5 4 2 1
C、5 4 D、3 C、5 4 D、3
(15) 。
C、5 4 D、3 C、5 4 D、3
(13) 程序的输出是 (13) 。 A、5 4 3 2 1 A、5 4 3 2 1 A、5 4 3 2 1
A、5 4 3 2 1 本题注意以下两点: 1.break跳出本层循环
2.Contiune结束本次循环,立即执行下一次条件判断。 然后细心即可。
(14) 将第6行中的continue改为break后,程序的输出是 (14) 。 (15) 将第6行中的continue删除(保留分号)后,程序的输出是 (16) 将第6行全部删除后,程序的输出是 (16) 。
试题5(每小题3分,共12分)
阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。 【程序】 # include <> void main()
{ char c, s[80]= \"Happy New Year\"; int i;
void f(char *s, char c); c = getchar(); f(s, c); puts(s); }
void f(char *s, char c) { int k = 0, j = 0; while(s[k] != '\\0'){
if(s[k] != c){ s[j] = s[k]; j++; s[j] = '\\0'; }
}
k++; }
(17) 程序运行时,输入字母a,输出 (17) 。 A、Happy New Year B、Hppy New Yer
C、Hay New Year
D、Happy Nw Yar
(18) 程序运行时,输入字母e,输出 (18) 。 A、Happy New Year B、Hppy New Yer
C、Hay New Year
D、Happy Nw Yar
(19) 程序运行时,输入字母p,输出 (19) 。 A、Happy New Year B、Hppy New Yer
C、Hay New Year D、Happy Nw Yar
(20) 程序运行时,输入字母b,输出 (20) 。 A、Happy New Year B、Hppy New Yer
C、Hay New Year
D、Happy Nw Yar
仔细研究以下语句: if(s[k] != c){
s[j] = s[k]; j++;}
发现其作用是删除数组S中等于字符变量C的元素,或者也可以这样说,把不等于字符变量C的元素都保留。
因此17删除a, 因此18删除e, 因此19删除p, 因此20删除b。
试题6(每小题3分,共12分)
#include <> struct st{
int x, y, z; }; void f(struct st *t, int n); void main( ) { int k, n; struct st time;
scanf(\"%d%d%d%d\ f(&time, n);
printf(\"%d:%d:%d\\n\} void f(struct st *t, int n)
{ t->z = t->z + n; /*等价于z=z+n;*/ if(t->z >= 60){
t->y = t->y + t->z/60; /*等价于y=y+z/60;*/ t->z = t->z%60; } /*等价于z=z%60;*/ t->x = t->x + t->y/60; /*等价于x=x+y/60;*/ t->y = t->y%60; /*等价于y=y%60;*/ }
if(t->x >= 24) t-> x = t->x % 24; }
(21)程序运行时,输入12 12 50 10,输出 (21) 。
A、12:12:0 B、12:12:50 C、12:12:60 D、12:13:0
(22) 程序运行时,输入12 12 30 10,输出 (23) 程序运行时,输入22 59 30 30,输出 (24) 程序运行时,输入23 59 0 300,输出
(22) 。 (23) 。
(24) 。
A、12:12:0 B、12:12:10 C、12:12:30 D、12:12:40 A、23:0:0 B、22:59:60 C、22:59:30 D、22:0:0
if(t->y >= 60){
A、0:4:0 B、23:59:300 C、23:59:00 D、23:0:0
这里主要运用了结构体的知识,当把程序变换为没有结构体的一般形式后(见下面),就非常容易理解了。
程序等价于以下片段:
sacnf(“%d:%d:%d”,&x,&y,&z); f(x,y,z,n);
printf(“%d:%d:%d”,x,y,z); void f(x,y,z,n); z=z+n; if(z>=0) {y=y+z/60; z=z%60; }
if(y>=60) {
x=x+y/60; y=y%60; }
if(x>=24) x=x%24; }
试题7 (14分)
编写程序,输入100个学生的英语成绩,统计并输出该门课程的平均分以及不及格学生的人数。 #include <> main()
{ int nopass=0;n=1;fs; float pjf=; while(n<=100) {
scanf(“input%d”,fs); pjf=pjf+fs;
if(fs<60) nopass++; n++; }
pjf=pjf/100;
printf(“pjf%d”,pjf);
printf(“nopass%d”,nopass); }
程序有多种写法,这只是一种。也可以使用数组。
试题8 (14分)
编写程序,输入一个正整数n,计算并输出下列算式的值。要求定义和调用函数total(n)计算1+1/2+1/3+……+1/n,函数返回值的类型是double。 #include <>
double tatal(int k); {double t=;
for(m=1;m<=k;m++) t=t+m; return t; }
main() {
double s=; int n,i;
scanf(“input %d”,&n); for (i=1,i<=n, n++) s=s+tatal(i); printf(“s=%f”,s); }