资源描述
上海市高等学校计算机等级考试试卷二级C语言程序设计B卷
资料仅供参考
上海市高等学校计算机等级考试试卷
二级 C语言程序设计 ( B 卷)
一、单选题
1. 下列C语言的标识符中,不合法的标识符为____________
A. star
B. 1234
C. _a100
D. circuit9
2. 若已定义: int x=10;
则表示式 x=(4*5,x*5,x+25) 的值是 ______ 。
A. 20
B. 45
C. 125
D. 35
3. 若x是int类型变量,y是float类型变量,则为了将数据55和55.5分别赋给x和y,则执行语句: scanf(“%d, %f”,&x,&y,); 时,正确的键盘输入是 ______ 。
A. 55,55.5↙
B. x=55, y=55.5↙
C. 55↙55.5↙
D. x=55↙y=55.5↙
4. 若有说明语句:int x=25,y=20,z=30;
则执行语句:if(x>y) {y=z; z=x;} x=y; printf(“%d,%d,%d”,x,y,z); 后,输出是____________
A. 25,20,30
B. 30,30,25
C. 25,30,30
D. 25,30,25
5. 程序段:int num=2;
while(num)
printf(“%d ,”,num--);
的运行结果是_______________
A. 2,1,
B. 2,1
C. 2,1,0
D. 2,1,0,
6. 若有说明:int a[3][4],s;则对数组a的元素引用正确的是____________
A. s=0; for(i=0;i<=3;i++) for(j=0;j<4;j++) s+=a[i][j];
B. s=0; for(j=0;j<=4;j++) for(i=0;i<3;i++) s+=a[i][j];
C. s=0; for(i=0;i<4;i++) for(j=0;j<=3;j++) s+=a[j][i];
D. s=0; for(i=0;i<3;i++) for(j=0;j<4;j++) s+=a[i][j];
7. 如果形参获取实参的地址,则____________作为函数调用时的实参。
A. 数组名
B. 全局量
C. 数组中全部元素的值
D. 数组中的元素个数
8. 若有定义:int i,j,*pi=&i; 则与i==j等价的比较表示式是____________
A. i==*pi
B. *pi ==*&j
C. i==&j
D. i==**pi
9. 若有定义:struct person{
int id ;
char name[20];
} per,*s=&per;
则以下对结构体成员的引用中正确的____________
A. per.name[0]
B. s->name[0]
C. per.name[8]
D. per.id
10. 若有以下语句:char x=5,y=9,z; z=(y|x)<<2;
则z的二进制值是________________
A. 00011011
B. 00001010
C. 00110100
D. 00001100
二、填空题
1. 设有说明语句:int a=15, b=6;
则a/b的十进制数值为________
2. 设有说明语句:int x=3, y=2; 则计算表示式(x=0)&& (y=6*x) 后变量y的值是_____________
3. 设a,b,c,t为整型变量,初值为a=3,b=4,c=5,执行完语句t=!(a+b)+c-1||b+c/2后,t的值是_____________
4. 定义函数时,将其类型定义为void 则表示所定义的函数返回值为____________.
5. 下列程序的输出结果是________________
f(int a[])
{ int i=0;
while (a[i]<=10)
{ printf(“%d ”, a[i]);
i++;
}
}
main()
{ int a[]={8,4,10,11,9,20};
f(a);
}
6. 下列程序的输出结果是______________
long fib(int g)
{ switch(g){
case 0: return(0);
case 1:
case 2: return(2);
}
return ( fib(g-1) + fib(g-2) );
}
main()
{ long k;
k = fib(5);
printf("k=%ld\n", k);
}
7. 假定建立了以下链表结构:struct node{
int id ;
struct node *next;
} *head,*p;
如图6-11所示:指针p指向一个新结点,将新结点插入到链表中的两条C语言语句是【 】
插入P后的链表
p
head
7
2
9
2
图6-11 新结点插入到链表
三、程序填空题 ( 本大题 3 道小题 ,每空 3 分,共 30 分)。
1. 下列程序的功能是:计算机给出10个不大于31的正整数让人猜,并根据猜中的情况统计总得分后输出。具体规则如下:
(1) 计算机每给出一个要猜的数最多允许中5次,第一次猜对得10分,第二次猜对得8分,第三次猜对得6分,第四次猜对得4分,最后一次猜对得2分,否则不得分。
(2) 若人猜的数太小,计算机给出提示“too small !”;若人猜的数太大,计算机给出提示“too large !”;若人猜对这个数,计算机给出提示“right !”, 并给出下一个数继续让人猜;若一个数已经猜了5次都猜错,计算机给出提示“out of time !”,也给出下一个数继续让人猜。直至猜完10个数。
下面是人猜一个数的过程,有下划线的部分是人猜的数:(假设机器产生的随机数为9)
请输入你猜测的数y= 16
too large !
请输入你猜测的数y= 4
too small !
请输入你猜测的数y= 9
right ! (本题是第三次猜对,得6分)
#include <stdio.h>
#include <stdlib.h>
void main()
{ int i, c, x, y, score, right;
1 ; /* 变量赋初值 */
for (i=1; i<=10; i++)
{ x=random(32);
/* 随机产生一个不大于31的要猜的数 */
c=0;
do{ c++;
printf("\n 请输入你猜测的数y= ");
scanf("%d", &y);
right=(y==x); /* 猜对时right为1,否则为0 */
if (right==1)
printf(" 2 ");
else
printf("%s\n", ( 3 )? "too small !" :"too large !");
}while(right==0&& 4 );
if (right)
score+= ( 5 ); /* 统计成绩 */
else
printf("out of time !\n");
}
printf("\nTotal score:%d\n", score);
}
2. 以下程序输入10行字符串,要求按字典顺序从小到大排序。
#include <stdio.h>
#define N 10
int biggerthan( char *str1, char *str2 )
/*若字符串str1大于 str2时,则返回1*/
{ for ( ; *str1 || *str2; 1 )
{ if ( *str1 > *str2 )
return 2 ;
else if (*str1<*str2)
return 0 ;
}
return 0; /* 两个字符串相等 */
}
void main()
{ char ls[N][100];
char *ps[N], *t;
int i, j;
for ( i = 0; i < N; i++ )
{ gets( ls[i] );
ps[i] = ls[i];
}
for ( i = 0; i < N-1; i++ ) /* 冒泡法排序 */
for ( j = 0; j < N-i-1; j++ )
if ( biggerthan( 3 ) )
{ t = ps[j];
4 ;
5 ;
}
for ( i = 0; i < N; i++ )
printf( " %s \n",ps[i] );
}
3. 将两个文本文件中字符'$'之后的内容合并到一个文件中去,其中函数void sub(FILE*all, FILE*f1 ,FILE *f2 )的功能是将文件指针f1,f2所指向的文件中的内容写到文件指针all所指向的文件中; main函数完成如下功能:先打开目标文件,再依次打开源文件,调用sub函数完成文件内容的拷贝。
例如三个源文件 f1.txt ,f2.txt, 每个文件的内容分别如下
文件名 内容
f1 aaa$aa
f2 bbb$bb
则产生一个新的目标文件fall.txt,包括f1,f2三个文件字符'$'之前的内容,fall的内容为aabb。
#include <stdio.h>
#include <stdlib.h>
main(){
FILE *f1, *f2,*fall;
void sub(______1________ );
if ((fall=fopen(______2_______ ))==NULL) {
printf("Cannot open file!\n");
exit(1);
}
if ((f1=fopen("f1.txt","r"))==NULL || (f2=fopen("f2.txt","r"))==NULL) {
printf("Cannot open file!\n");
exit(1);
} else {
sub(______3________ );
______4________ ;
}
fclose (f1);
fclose(f2);
}
void sub(FILE *all, FILE *f1, FILE *f2)
{
char c;
while((fgetc(f1))!='$');
while((c=fgetc(f1))!=EOF) fputc(c,all);
while((fgetc(f2))!='$');
while((c=fgetc(f2))!=EOF) fputc(c,all);
}
四、操作题
三.程序调试题
1. 程序调试题1(E_3_1.c)
调试要求:下列程序不能得到正确的结果,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*modified*/字样的注释),使其运行能得到正确的结果。将结果(包括E_3_1.c文件和E_3_1.exe文件)保存到指定目录中。
功能说明:统计一字符串中各个字母出现的次数,该字符串从键盘输入,统计时不区分大小写。对数字、空格及其它字符都不予统计。最后在屏幕上显示统计结果。
例如字符串:“abcdefgh23 ABCDEF abc”的统计结果与输出格式为:
a b c d e f g h i j k l m n o p q r s t u v w x y z 出现的次数为:;
3 3 3 2 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#include <stdio.h>
#include <string.h>
void main( )
{
int i, a[26];
char ch,str[80],*p=str;
gets(&str); /* 获取字符串 */
for(i=0;i<26;i++) a[i]=0; /* 初始化字符个数*/
while(*p) {
ch=(*p)++; /* 移动指针统计不同字符出现的次数 */
ch=ch>=’A’&&ch<=’Z’ ?ch+’a’-‘A’:ch;
/* 大小写字符转换*/
if(’a’<=ch<=’z’) a[ch-‘a’]++;
}
for(i=0;i<26;i++) printf(“%2c”, ’a’+i); /* 输出26个字母 */
printf(“出现的次数为:\n”);
for(i=0;i<26;i++) printf(“%2d”,a[i]);
/* 输出各字母出现次数 */
printf(“\n”);
}
2. 程序调试题2(E_3_2.C)
调试要求:下列程序不能得到正确的结果,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*modified*/字样的注释),使其运行能得到正确的结果。将结果(包括E_3_1.c文件和E_3_1.exe文件)保存到指定目录中。
功能说明:递归算法求xn,即xn=x*xn-1,其中x为实数,n≥0。原程序(见\E_3_2.c)
void main(){
float x, y;
int n;
scanf("%f%d",&x,&n);
y=xn(x,n);
printf("x^n=%f\n",y);
}
float xn(float x, int n){
fload z;
if(n<0) {
printf("n is a wrong number!\n");
exit(0);
}
if(n!=0) z=1;
else z=xn(x,n);
return z;
}
五. 编程题
1.编程题1(E_5_1.c)
编程要求:请按题中的功能要求,编写程序并能得到正确结果。将结果(包括E_5_1.c文件和E_5_1.exe文件)保存到指定目录中。
功能说明:编写一个函数,将数组a中的n个数每5个相邻的元素为一组分别求和(假设求和结果不溢出),结果放到数组b中,最后一组如果不足5个也进行求和。例如,若数字a的元素为4,8,3,3,0,5,2,9,7,8,4,3,2,1,8,4,3,2,则数组b的元素为18,31,18,9。
2.编程题2(E_5_2.c)
编程要求:请按题中的功能要求,编写程序并能得到正确结果。将结果(包括E_5_2.c文件和E_5_2.exe文件)保存到指定目录中。
功能说明:某中学要对新入学的10名学生根据考试成绩分到插入到两个班(class1,class2)中,插入的方法是成绩第1名在class1班,第2名在class2班,第3名在class1班,第4名在class2班,依次类推,…,原来class1,class2学生是按成绩由高分到低分排列的。
请编写程序,输入这10个学生的编号和成绩,输出如下格式的分班情况:
Class1班:编号 成绩; 编号 成绩; …
Class2班:编号 成绩; 编号 成绩; …
展开阅读全文