上海市高等学校计算机等级考试试卷二级 C语言程序设计( B 卷)一、单选题1. 下列C语言的标识符中,不合法的标识符为____________A. starB. 1234C. _a100D. circuit92. 若已定义: int x=10;则表达式 x=(4*5,x*5,x+25) 的值是 ______ 。
A. 20B. 45C. 125D. 353. 若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,30B. 30,30,25C. 25,30,30D. 25,30,255. 程序段:int num=2;while(num)printf(“%d ,”,num--);的运行结果是_______________A. 2,1,B. 2,1C. 2,1,0D. 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==*piB. *pi ==*&jC. i==&jD. i==**pi9. 若有定义:struct person{int id ;char name[20];} per,*s=&per;则以下对结构体成员的引用中正确的____________A. [0]B. s->name[0]C. [8]D. per.id10. 若有以下语句:char x=5,y=9,z; z=(y|x)<<2;则z的二进制值是________________A. 00011011B. 00001010C. 00110100D. 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语言语句是【】图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= 16too large !请输入你猜测的数y= 4too small !请输入你猜测的数y= 9right ! (本题是第三次猜对,得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 ");elseprintf("%s\n", ( 3 )? "too small !" :"too large !");}while(right==0&& 4 );if (right)score+= ( 5 ); /* 统计成绩 */elseprintf("out of time !\n");}printf("\nTotal score:%d\n", score);}2. 以下程序输入10行字符串,要求按字典顺序从小到大排序。
#include <stdio.h>#define N 10int 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. 将两个文本文件中字符'$'之后的内容合并到一个文件中去,其中函数voidsub(FILE*all, FILE*f1 ,FILE *f2 )的功能是将文件指针f1,f2所指向的文件中的内容写到文件指针all所指向的文件中; main函数完成如下功能:先打开目标文件,再依次打开源文件,调用sub函数完成文件内容的拷贝。
例如三个源文件 f1.txt ,f2.txt, 每个文件的内容分别如下文件名内容f1 aaa$aaf2 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*/字样的注释),使其运行能得到正确的结果。