1、高级语言程序设计-4 及答案解析(总分:100.00,做题时间:90 分钟)一、B单项选择题/B(总题数:15,分数:30.00)1.系统提供的文件尾测试函数是( )(分数:2.00)A.feof()B.fgectc()C.fseek()D.rewind()2.设有数据定义语句:float a,*pa=a;,则下列选项错误的是( )(分数:2.00)A.*paB.*paC.*aD.*a3.已知程序清单如下( ) #includestdioh main() char c1,c2; scanf(“%c,%c“,c1,c2);switch(c1) case a:printf(“100“);break
2、 case b: switch(c2) case+:printf(“90“);break; case-:printf(“85“);)break break; 当输入“b,-“时,程序的输出结果是(分数:2.00)A.100B.90C.85D.不确定4.以下程序的输出结果是( ) #define f(x)x*x main() int a=6,c; c=f(a); printf(“%d/n“,c); )(分数:2.00)A.6B.9C.18D.365.将字符串转换成浮点数的函数是( )(分数:2.00)A.atof()B.atoi()C.stof()D.stoj()6.下列程序执行后的输出结果是(
3、 ) main() int x=C;printf(“%d/n“,A-x+3);)(分数:2.00)A.1B.2C.3D.57.日期型结构 date是由系统自动定义的,其所在的头文件是( )(分数:2.00)A.stdihB.doh,C.dathD.stdlih8.字符串“save me!“在内存中所占用的字节数是( )(分数:2.00)A.4B.6C.8D.99.下列不属于 C语言标识符的是( )(分数:2.00)A.abcB.ABCC.AB_CD.2abc10.设 charx=a,则 printf(“X=%c,y=%c/n“,x,97);的输出是( )(分数:2.00)A.x=a,y=aB.
4、x=97,y=aC.x=97,y=97D.x=a,y=9711.若有以下说明和语句( ) struct worker int no; char *name; work,*p=work; 则以下引用方式不正确的是(分数:2.00)A.wornoB.(*noC.p-noD.work-no12.下列关于变量赋值及表达式计算时的数据类型转换规则描述正确的是( )(分数:2.00)A.变量赋值时数据类型转换规则是就长不就短,表达式计算时数据类型转换规则是就左不就右B.变量赋值时数据类型转换规则是就左不就右,表达式计算时数据类型转换规则是就长不就短C.变量赋值及表达式计算时的数据类型转换规则是具有强制性而
5、不自动的D.变量赋值及表达式计算时的数据类型转换规则是具有强制性而自动的13.以下程序的输出结果是( ) int d=1; fun(int p) static int d=5; d+=P: printf(“%d“,d); return(d); main() int am=3; printf(“%d/n“,fun(a+fun(d): (分数:2.00)A.6 9 9B.6 6 9C.6 15 15D.6 6 1514.设 int类型的数据长度为 2个字节,则 unsigned int类型的数据取值范围是( )(分数:2.00)A.0255B.-256255C.065535D.-327683276
6、715.执行下列程序后输出的结果是( ) #includestdioh main() int j,i,k=0,m=0; for(i=0;i2;i+) for(j=0;j3;j+) k+,k-=j; m=i+j; print(“k=%d,m=%d/n“,k,m);(分数:2.00)A.k=0,m=5B.k=0,m=3C.k=1,m=5D.k=1,m=3二、B填空题/B(总题数:10,分数:20.00)16.若有说明 int i,j,k;则表达式 i=10,j=20,k=30,k*=i+j 的值为 1。(分数:2.00)填空项 1:_17.print(“%5.3f/n“,123456.12345)
7、;输出为 1。(分数:2.00)填空项 1:_18.表达式3(234)的值为 1。(分数:2.00)填空项 1:_19.执行语句“int s=0,n=5;while(-n)s+=n;“后,变量 s、n 值依次为 1。(分数:2.00)填空项 1:_20.程序中使用了字符串函数(如 scanf),则必须包含的头文件名为 1。(分数:2.00)填空项 1:_21.访问结构体数组元素 ak的成员 b,写作 1。(分数:2.00)填空项 1:_22.执行语句“for(s=0,i=1;i11;i+)if(i=6)continue;s+=i;)t 后,s 值为 1。(分数:2.00)填空项 1:_23.执
8、行语句“n=1;if(n=5)n+;“后,变量 n值为_。(分数:2.00)填空项 1:_24.计算 a、b、C 中最小值的条件表达式为 1。(分数:2.00)填空项 1:_25.执行语句“a=5+(c=6);“后,变量 a、c 的值依次为_。(分数:2.00)填空项 1:_三、B程序分析题/B(总题数:4,分数:16.00)26.#includestdioh int fun(int*a,int i,int j) if(ijj5) i+;j-; ai+=aj:un(a,i,j); return ai; main() int x=2,6,18,10,12,i; for(i=0;i5;i+) if
9、(i=2) print(“%d/n“,fun(x,0,3); (分数:4.00)_27.#includestdioh main() char b=“ABCDEFG“; char *chp=eb7; while(-chpb0) putchar(*chp); (分数:4.00)_28.#includestdioh int ast(int x,int y,int *cp,int *dp) *cp=x+y; *dp=x-Y; main() int a,b,C,d; a=4;b=3; ast(a,b,c,d); printf(“%d%d/n“,c,d); (分数:4.00)_29.#includestd
10、ioh int f1(int x,int y)return xy? x:y;) int f2(int x,int y)return xy? y:x; main() int a=4,b=3,c=5,d=2,e,f,g; e=f2(f1(a,b),f1(C,d);f=f1(f2(ab),f2(c,d); g=a+b+c+d-e-f; printf(“%d,%d,%d/n“,e,f,g); (分数:4.00)_四、B程序填充题/B(总题数:3,分数:18.00)30.函数 YangHui的功能是把杨辉 i角形的数据赋给二维数组的下半三角,形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6
11、 4 1 其构成规律是:(1) 第 0列元素和主对角线元素均为 1(2) 其余元素为其左上方和正上方元素之和(3) 数据的个数每行递增 1 #includestdioh #define N 5 void YangHui(int xNN) int i,j; x00=1; for(i=1;iN;i+) xi0=_=1;/*第一空*/ for(j=1;ji;j+) if(_)/*第二空*/ xij=_;/*第三空*/ (分数:6.00)填空项 1:_31.下面程序段可以求出 n!的值。 #includestdioh main() int i,n; long np; scanf(“%d“,n); _;
12、/*第一空*/ for(i=2;_;i+)/*第二空*/ _;/*第三空*/ printf(“n=%d,n!=%ld/n“,n,np); (分数:6.00)填空项 1:_32.下面程序可用来统计文件中字符的个数。 #includestdioh main() FILE *fp; long num=0; if(fp=_)=NULL)/*第一空*/ printf(“Can not open file/n“);exit(0); while(_)/*第二空*/ _;/*第三空*/ printf(“num=%d/n“,num); fclose(fp); (分数:6.00)填空项 1:_五、B程序设计题/B
13、(总题数:2,分数:16.00)33.编一个程序,对名为“abc.txt“的磁盘文件中“之前的所有字符加密,加密方法是每个字节的内容减10。(分数:8.00)_34.函数 huiwen的功能是检查一个字符串是否是回文。当字符串是回文时,函数返回字符串:“yes!“,否则函数返回字符串:“no!“,并在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:adgda。(分数:8.00)_高级语言程序设计-4 答案解析(总分:100.00,做题时间:90 分钟)一、B单项选择题/B(总题数:15,分数:30.00)1.系统提供的文件尾测试函数是( )(分数:2.00)A.feof() B.fgec
14、tc()C.fseek()D.rewind()解析:2.设有数据定义语句:float a,*pa=a;,则下列选项错误的是( )(分数:2.00)A.*paB.*paC.*aD.*a解析:3.已知程序清单如下( ) #includestdioh main() char c1,c2; scanf(“%c,%c“,c1,c2);switch(c1) case a:printf(“100“);break case b: switch(c2) case+:printf(“90“);break; case-:printf(“85“);)break break; 当输入“b,-“时,程序的输出结果是(分数
15、:2.00)A.100B.90C.85 D.不确定解析:4.以下程序的输出结果是( ) #define f(x)x*x main() int a=6,c; c=f(a); printf(“%d/n“,c); )(分数:2.00)A.6B.9C.18D.36 解析:解析 #define f(x) x*x main() int a=6,b=2,c; c=f(a)/f(b);/*将宏定义代入替换计算可求得结果*/ printf(“%d/n“,c); 5.将字符串转换成浮点数的函数是( )(分数:2.00)A.atof() B.atoi()C.stof()D.stoj()解析:6.下列程序执行后的输出
16、结果是( ) main() int x=C;printf(“%d/n“,A-x+3);)(分数:2.00)A.1 B.2C.3D.5解析:7.日期型结构 date是由系统自动定义的,其所在的头文件是( )(分数:2.00)A.stdihB.doh, C.dathD.stdlih解析:8.字符串“save me!“在内存中所占用的字节数是( )(分数:2.00)A.4B.6C.8D.9 解析:9.下列不属于 C语言标识符的是( )(分数:2.00)A.abcB.ABCC.AB_CD.2abc 解析:10.设 charx=a,则 printf(“X=%c,y=%c/n“,x,97);的输出是( )
17、(分数:2.00)A.x=a,y=a B.x=97,y=aC.x=97,y=97D.x=a,y=97解析:11.若有以下说明和语句( ) struct worker int no; char *name; work,*p=work; 则以下引用方式不正确的是(分数:2.00)A.wornoB.(*noC.p-noD.work-no 解析:12.下列关于变量赋值及表达式计算时的数据类型转换规则描述正确的是( )(分数:2.00)A.变量赋值时数据类型转换规则是就长不就短,表达式计算时数据类型转换规则是就左不就右B.变量赋值时数据类型转换规则是就左不就右,表达式计算时数据类型转换规则是就长不就短
18、C.变量赋值及表达式计算时的数据类型转换规则是具有强制性而不自动的D.变量赋值及表达式计算时的数据类型转换规则是具有强制性而自动的解析:13.以下程序的输出结果是( ) int d=1; fun(int p) static int d=5; d+=P: printf(“%d“,d); return(d); main() int am=3; printf(“%d/n“,fun(a+fun(d): (分数:2.00)A.6 9 9B.6 6 9C.6 15 15 D.6 6 15解析:解析 int d=1; fun(int p) static int d=5;/*变量 d被定义为 static存储
19、类型的 int整型变量,作用域仪限两数 fun(int p)内。函数 fun(int p)被执行之后变量 d仍然存在,再次执行函数fun(int p)时所使用的变量 d的值是上次调用函数 fun(int p)时 d所得到的新值。*/ d+=P; printf(“%d“,d);/*每次调用都会打印输出 d的值*/ return(d);/*返回 d的值*/ main() int a=3; printf(“%d/n“,fun(a+fun(d);/*此处调用函数 fun(int p)时,所用的变量 d为整个程序段头所定义的 d*/ 14.设 int类型的数据长度为 2个字节,则 unsigned in
20、t类型的数据取值范围是( )(分数:2.00)A.0255B.-256255C.065535 D.-3276832767解析:15.执行下列程序后输出的结果是( ) #includestdioh main() int j,i,k=0,m=0; for(i=0;i2;i+) for(j=0;j3;j+) k+,k-=j; m=i+j; print(“k=%d,m=%d/n“,k,m);(分数:2.00)A.k=0,m=5 B.k=0,m=3C.k=1,m=5D.k=1,m=3解析:解析 #includestdioh main() int j,i,k=0,m=0; for(i=0;i2;i+)/*
21、循环条件是“i2“,步进值为 1*/ for(j=0;j3;j+)/*循环条件是“j3“,步进值为 1*/ k+,k-=j;/*此语句为逗号表达式,表达式“k+“和“k-=j“在循环“for(j=0;j3;j+)“中都会被执行*/ m=i+j:/* 此处所使用的 i和 j的值都是在上述循环执行后 i和 j的值*/ printf(“k=%d,m=%d/n“,k,m); 二、B填空题/B(总题数:10,分数:20.00)16.若有说明 int i,j,k;则表达式 i=10,j=20,k=30,k*=i+j 的值为 1。(分数:2.00)填空项 1:_ (正确答案:900)解析:17.print(
22、“%5.3f/n“,123456.12345);输出为 1。(分数:2.00)填空项 1:_ (正确答案:123456.123)解析:18.表达式3(234)的值为 1。(分数:2.00)填空项 1:_ (正确答案:4)解析:19.执行语句“int s=0,n=5;while(-n)s+=n;“后,变量 s、n 值依次为 1。(分数:2.00)填空项 1:_ (正确答案:100)解析:解析 循环体“while(-n)s+=n;“连续执行直到 n等于 0时为止。20.程序中使用了字符串函数(如 scanf),则必须包含的头文件名为 1。(分数:2.00)填空项 1:_ (正确答案:stdioh)
23、解析:21.访问结构体数组元素 ak的成员 b,写作 1。(分数:2.00)填空项 1:_ (正确答案:akb)解析:22.执行语句“for(s=0,i=1;i11;i+)if(i=6)continue;s+=i;)t 后,s 值为 1。(分数:2.00)填空项 1:_ (正确答案:49)解析:解析语句“for(s=0,i=1;i11;i+)if(i=6)continue;s+=i;“中循环体被执行 10次。其中当 i=6时,循外体内“s+=i;“不被执行。23.执行语句“n=1;if(n=5)n+;“后,变量 n值为_。(分数:2.00)填空项 1:_ (正确答案:6 解知析:语句中“if(
24、n=5)“一句给 n赋以 5值,执行“n+;“之后 n的值为 6。)解析:24.计算 a、b、C 中最小值的条件表达式为 1。(分数:2.00)填空项 1:_ (正确答案:ad? a:(bc?(d=b):(d=c))解析:25.执行语句“a=5+(c=6);“后,变量 a、c 的值依次为_。(分数:2.00)填空项 1:_ (正确答案:11 6)解析:三、B程序分析题/B(总题数:4,分数:16.00)26.#includestdioh int fun(int*a,int i,int j) if(ijj5) i+;j-; ai+=aj:un(a,i,j); return ai; main()
25、int x=2,6,18,10,12,i; for(i=0;i5;i+) if(i=2) print(“%d/n“,fun(x,0,3); (分数:4.00)_正确答案:()解析:24 解析 #includestdioh int fun(int*a,int i,int j)/*此函数为采用递归算法的函数*/ if(ijj5)/*保证 i和 j在数组范围内当 ij 时执行下列语句*/ i+;j-; ai+=aj;fun(a,i,j);/*函数自身调用自身的一个递归调用过程*/ return ai;/*返用数组几素 ai的值*/ main() int x=2,6,18,10,12,i; for(i
26、=0;i5;i+) if(i=-2) printf(“%d/n“,fun(x,0,3);/*当 a=2时打印输出 fun(x,0,3)的值*/ 27.#includestdioh main() char b=“ABCDEFG“; char *chp=eb7; while(-chpb0) putchar(*chp); (分数:4.00)_正确答案:()解析:GFEDCB 解析 #includestdioh main() char b=“ABCDEFG“; char*chp=b7;/*指针变量 chp获得数组元素 b7的值*/ while(-chpb0)/*逆序输出*/ putchar(*chp)
27、; 28.#includestdioh int ast(int x,int y,int *cp,int *dp) *cp=x+y; *dp=x-Y; main() int a,b,C,d; a=4;b=3; ast(a,b,c,d); printf(“%d%d/n“,c,d); (分数:4.00)_正确答案:()解析:7 1 解析 #include29.#includestdioh int f1(int x,int y)return xy? x:y;) int f2(int x,int y)return xy? y:x; main() int a=4,b=3,c=5,d=2,e,f,g; e=
28、f2(f1(a,b),f1(C,d);f=f1(f2(ab),f2(c,d); g=a+b+c+d-e-f; printf(“%d,%d,%d/n“,e,f,g); (分数:4.00)_正确答案:()解析:4,3,7 解析 #includestdioh int f1(int x,int y)return xy? x:y; /* 如果xy 则输出 x*/ int f2(int x,int y)return xy? y:x; /*如果 xy 则输出 y*/ main() int a=4,b=3,c=5,d=2,e,f,g; e=f2(f1(a,b),f1(c,d);f=f1(f2(a,b),f2(
29、c,d);/*嵌套调用函数 f1和 f2*/ g=a+b+c+d-e-f; printf(“%d,%d,%d/n“,e,f,g); 四、B程序填充题/B(总题数:3,分数:18.00)30.函数 YangHui的功能是把杨辉 i角形的数据赋给二维数组的下半三角,形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 其构成规律是:(1) 第 0列元素和主对角线元素均为 1(2) 其余元素为其左上方和正上方元素之和(3) 数据的个数每行递增 1 #includestdioh #define N 5 void YangHui(int xNN) int i,j; x00=1; for
30、(i=1;iN;i+) xi0=_=1;/*第一空*/ for(j=1;ji;j+) if(_)/*第二空*/ xij=_;/*第三空*/ (分数:6.00)填空项 1:_ (正确答案:xii,*第一空。将对角线置*/)解析:i!=j*第二空,判定是否为对角线上的元素*/ xij-1+xi-1j/*第三空。根据构成规律(2)求出该元素的值*/31.下面程序段可以求出 n!的值。 #includestdioh main() int i,n; long np; scanf(“%d“,n); _;/*第一空*/ for(i=2;_;i+)/*第二空*/ _;/*第三空*/ printf(“n=%d,
31、n!=%ld/n“,n,np); (分数:6.00)填空项 1:_ (正确答案:np=1/*笫一空。给变量 np赋以 1的初值*/)解析:i=n/*第二空。确定乘法运算的上限*/ np*=i/*第三空。求阶乘的乘法运算*/32.下面程序可用来统计文件中字符的个数。 #includestdioh main() FILE *fp; long num=0; if(fp=_)=NULL)/*第一空*/ printf(“Can not open file/n“);exit(0); while(_)/*第二空*/ _;/*第三空*/ printf(“num=%d/n“,num); fclose(fp);
32、(分数:6.00)填空项 1:_ (正确答案:fopen(“fnamedat“,“r“)/*第一空。以只读模式打开文件fnamedat*/)解析:!feof(fp+),*第二空。测试是否到达文什尾*/ num+/*第三空。字符个数统计*/五、B程序设计题/B(总题数:2,分数:16.00)33.编一个程序,对名为“abc.txt“的磁盘文件中“之前的所有字符加密,加密方法是每个字节的内容减10。(分数:8.00)_正确答案:()解析:#include stdioh #includesldlibh main() FILE *fp; char c; if(fp=fopen(“abctxt“,“r+
33、“)=NULL)/*测试文什是否正确被打开*/ printf(“Can not open file!/n“);exit(0);) while(!feof(fp) if(c=fgetc(fp)!=)/*如果不足字符则进行加密运算*/ c=c-10;/*加密运算*/ fseek(fp,-11,1);/*前移一个字符。因在执行 fgetc(fp)时文什内部指针会自动后移一个字符。指向应被加密字符的下一个字符*/ fputc(c,fp);/*将获得加密后的字符填入该位置,且文件内部指针会自动后移一个字符*/ fseek(fp,01,1);)/*避免指针漂移,定位文件内部指针在当前位置不移动,并将其传递
34、给函数 feof(fp)*/ else break; fclose(fp); return 0; 34.函数 huiwen的功能是检查一个字符串是否是回文。当字符串是回文时,函数返回字符串:“yes!“,否则函数返回字符串:“no!“,并在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:adgda。(分数:8.00)_正确答案:()解析:#includestdioh char *huiwen(char*str)/*回文验证函数,采用地址传递方式*/ char *p1,*p2;int i,t=0; p1=sir;p2=str+(strlen(str)-1);/*p1 和 p2将分别获得字符串头和尾(非“/0“)的地址*/ for(i=0;i=strlen(str)/2;i+) if(*p1+!=*p2-)t=1;break;/*将字符串两端字符进行对比,并向中间靠拢。出现对称不相等的字符(字符串不是回文)就终止循环,将变量 t置为 1*/ if(!t)relurn(“yes!“); else return(“no!“); main() char str50; printf(“Input:“);scanf(“%s“,str); printf(“%s/n“,huiwen(str);