1、全国自考(高级语言程序设计)模拟试卷 3 及答案与解析一、单项选择题1 下列关于 C 程序的描述不正确的是( )(A)C 程序是由 C 语句组成的语句序列(B) C 程序由若干个函数构成(C)主函数可以调用其他任何函数(D)C 程序的执行可以从任何函数开始2 以下符合 C 语言语法的实型常量是( )(A)1.2E0.5(B) 3.14.159E(C) 0.005(D)E153 设整型变量 a 的值是 6,执行下列语句后 a 的值是 ( ) switch(a%2) case 0:a-=2; case 1:a+=1; default :a=6 ; (A)4(B) 5(C) 6(D)74 设有定义“
2、chara=2,b=5;“ 求表达式“ab2“的值(假定现有计算机字长为16) ( )(A)-32(B) 32(C) -23(D)235 有以下程序段( ) int n,t=1 ,s=0; scanf(“%d“,n); dos=s+t;t=t-2;while(t!=n) ; 为使此程序不陷入死循环,从键盘输入的数据应该是(A)任意正奇数(B)任意负偶数(C)任意正偶数(D)任意负奇数6 有以下程序段( ) main() int x=0,y=5,z=3; while(z- 0+x5)y=y-1; printf(“%d,%d,%dn“ ,x,y,z); 程序执行后的输出结果是(A)3,2,0(B)
3、 3,2,-1(C) 4,3,-1(D)5,-2 ,-57 设变量已正确定义,则以下能正确计算 f=n!的程序段是( )(A)f=0: for(j=1 ; j=n ;j+)f*=j ;(B) f=1; for(j=1;jn;j+)f*=j;(C) f=1; for(j=n;j1;j+)f*=j;(D)f=1 for(j=n ;j-2 ;j-)f*=j;8 有以下程序( ) main() int i,n=0 ; for(i=2 ; i5;i+) do if(i%3)continue; n+ ; while(!i); n+; printf(“n=%dn“,n); 程序执行后的输出结果是(A)n=2
4、(B) n=3(C) n=4(D)n=59 有以下程序( ) #includestdioh char fun(char x,char y) if(x)return y; main() inta=9,b=8 ,c=7; printf(“%cn“,fun(fun(a,b),fun(b,c): 程序的执行结果是(A)7(B) 8(C) 9(D)函数调用出错10 有以下程序( ) #includestdioh int a=2; int f(int*A) return(*A)+; main() int s=0; int a=5 ; s+=f( a); s+=f(a) ; printf(“%dn“,s);
5、 执行后输出结果是(A)10(B) 9(C) 7(D)811 若 x 是整型变量,pb 是基本类型为整型的指针变量,则正确的赋值表达式为( )(A)pb=x(B) pb=x(C) *pb=x(D)*pb=*x12 设有数组定义:char array=“china“;,则数组 array 所占用的空间为( )(A)4 个宁节(B) 5 个字节(C) 6 个字节(D)7 个字节13 如果打开文件时,选用的文件操作方式是“wb+“则下列说法中正确的是( )(A)要打开的文件必须存在(B)打开文件后只能渎数据(C)文件打开后删除原内容再写(D)打开文件后只能写数据14 设有 int a=10,11,1
6、2,*p=a0 ;,则执行完*p+;*p+=1;后 a0,a1,a2的值依次是( )(A)10,11,12(B) 11,12,12(C) 10,12,12(D)11,11,1215 有以下程序( ) main() int i,s=0 ; for(i=1;i 10;i+=2)s+=i+1; printf(“%dn“,s); 程序执行后的输出结果是(A)自然数 19 的累加和(B)自然数 110 的累加和(C)自然数 19 中的奇数之和(D)自然数 110 中的偶数之和二、填空题16 与标准输出设备所对应的文件型指针名为_。17 将字符串写入文件时,不写入文件的字符串结束标志是_。18 将字符转换
7、成 ASC代码值的函数是_。19 文件包含命令是以_为开头的编译预处理命令。20 _是 C 语言中唯一的一个三目运算符,它是由两个符号组成。21 数组 int arry59;的第二维下标的最大值是 _。22 在进行程序清单的编译时,_是先于编译进行的。23 已知 char str=“ABCD“;,则语句 printf(“%d“,strlen(str) ;的输出是_。24 设 int a;float b;char c ;long d;double e;unsigned u;,则表达式 a+c/b-d*e+u 值的类型是_。25 设 int x=5; x+=x-=x*x; 则 x 的值是_。三、程
8、序分析题26 以下程序运行时输入:12回车,执行后输出结果 #includestdioh main() char ch1,ch2;int n1,n2; ch1=getchar();ch2=getchar(); n1=ch1-0;n2=n1*10+(ch2-0) ; printf(“%dn“,n2); 27 #includestdioh void f(int y,int*x) y=y+*X; *x=*x+y; main() int x=2,y=4; f(y,x); printf(“%d%dn“,x,y); 28 #includestdioh char *ss(char *s) return s+
9、strlen(s)/2;) main() char *p,*str=“abcdefgh“; p=ss(str);printf(“%sn“, p); 29 #includestdioh int f(int a, int n) if(n1)return a0+f( a1,n-1); else return a0; main() int aa3=1,2,3,s; s=f(aa0,3);printf(“%dn“,s); 四、程序填充题30 完善下面程序段,以使其完成以下数学函数的计算。 #includestdio h #includemath h main() float x,y,f1,fun();
10、scanf(“%f%f“,x,y); f1=x*x/fun(_);/*第一空*/ printf(“A=%fn“, f1); float fun(float f) float f2; f2=f*f+sqrt(1+_/*第二空*/+_);/*第三空 */ return(f2); 31 以下程序能将字符串 Program!反向打印出来,请填空。 #includestdioh void out(char *str) char *s=_;/*第一空*/ if(*s=NULL)return: while(_)s+;/*第二空 */ s-; printf(“%cn“,*s); _=NULL;/*第三空*/
11、out(str); main() char c=“Program!“; out(c);32 下面程序把从终端读入的文本(用“作为文本结束的标志)复制到一个名为bidat 的新文件中,请填空。 #includestdioh FILE *fp; main() char ch; if(fp=_)=NULL)/*第一空*/ exit(0); while(_)!=)/*第二空*/ fputc(ch,fp); _;/*第三空*/ 五、程序设计题33 编一个程序,对名为“abc.txt“的磁盘文件中“34 函数 huiwen 的功能是检查一个字符串是否是回文。当字符串是回文时,函数返回字符串:“yes!“,
12、否则函数返回字符串:“no!“,并在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:adgda 。全国自考(高级语言程序设计)模拟试卷 3 答案与解析一、单项选择题1 【正确答案】 D2 【正确答案】 C3 【正确答案】 C4 【正确答案】 C【试题解析】 整型常量值在 0127 之间的,C 语言规定可以把它看成一个字符型常量,其所对应的字符就是该值作为 ASC代码值所对应的那个字符。5 【正确答案】 D【试题解析】 t 的初始值为 1,n 循环步进值为-2;若不想令程序陷入死循环,则输入的数据应该是任意负奇数。6 【正确答案】 B【试题解析】 循环体共执行三次,y=5-3=2。因受循环
13、限定条件“z-0+x 5“的限制,当 z=0 时,循环被直接终止而不再执行“+x 5“ 的判定,x 的值仍是上次循环时所获得的值 3。此时 Z-仍执行一次,z=-1。7 【正确答案】 D【试题解析】 f=n!=n(n-1)(n-2)(n-3)-(n-(n-2)1,是自然数 1 到 n 的乘积。语句“for(j=n;j =2;j-)f*=j;“从 j 的初值 n 开始,依次减 1 并将与 f 的乘积赋于 f,符合题虑。8 【正确答案】 C【试题解析】 main() int i,n=0 ; for(i=2;i5 ;i+)/*i 初始值为 2,循环执行条件为 i5,步进值为 1*/ do if(i%
14、3)continue;/*当 i%3 的值非 0 时,跳过下面语句直接执行 while 判定*/ n+;/*当 i%3 的值为 0 时,执行本行语句后再执行 while 判定。整个运算过程中,本语句仅被执行 1 次*/ while(!i);/* 当 i 的值为 0 时执行第二次 do-while 循环*/ n+;/*此行为 for 循环体内语句,被执行 3 次*/ printf(“n=%dn“,n);/*本程序段变量 n 共执行自加 1 运算 4 次,故 n 的值为 4*/ 9 【正确答案】 A【试题解析】 #include stdioh char fun(char x,char y) if(
15、x)return y; /*如果变量 X 不为空则返回 y*/ main() inta=9,b=8,c=7;/*变量 a、b、c 所获得的是 9、8、7 的 ASC码值*/ printf(“%cn“,fun(fun(a,b),fun(b,c);/* 打印的是字符变量“fun(fun(a,b),fun(b,c)“*/ 10 【正确答案】 C【试题解析】 #include stdioh int a=2: int f(int*A) return(*A)+;/* 返回值是 *A,因为参数传递是地址传递,实参的实际值将被改变*/ main() int s=0; inta=5;s+=f(a);/*此处使用
16、的 a 是本段“内所定义的变量 a*/ s+=f(a);/*此处使用的 a 是全局变量 a*/ printf(“%dn“,s); 11 【正确答案】 B12 【正确答案】 C13 【正确答案】 C14 【正确答案】 C【试题解析】 +和“*“具有相同的优先级别,运算时都是采用自右向左结合运算的方式。“*p+“ 在运算时先运算 “*p“再运算“p+“。在运算“*p+=1“ 时,P 已做过一次自加 1 运算,而“*“运算的优先于“+-“ 运算;故“*p+=1“等同于 a2+=1。15 【正确答案】 D【试题解析】 main() int i,s=0; for(i=1;i 10;i+=2)/*i 的初
17、始值为 1,步进值为 2,循环条件是 i10*/ s+=i+1;/* 从上述循环条件来看,应为求自然数 19 中的奇数之和;但是有意思的是“s+=i+1“ 改变了现状, “+“的运算优先级别高于“+=“,故“1“在每次 s 的求和运算中都有一份功劳。现实是,每次 s 的求和运算都多加了一个 1,结果就成了自然数 110 中的偶数之和*/ printf(“%dn“,s); 二、填空题16 【正确答案】 stdout17 【正确答案】 018 【正确答案】 toascii()19 【正确答案】 #include20 【正确答案】 条件运算符21 【正确答案】 822 【正确答案】 宏替换23 【正
18、确答案】 424 【正确答案】 double25 【正确答案】 -40三、程序分析题26 【正确答案】 12【试题解析】 #include stdioh main() char ch1,ch2;int n1,n2; ch1=getchar();ch2=getchar();/* 变量 ch1 和 ch2 分别获得初值 1 和 2*/ nI=ch1-0;n2=n1*10+(ch2-0);/*变量 ch1 和 ch2 都以其 ASC值参与运算*/ printf(“%dn“,n2); 27 【正确答案】 8 4【试题解析】 #include stdioh void f(int y,int*x)/*参数
19、为指针变最,采用地址传递方式*/ y=y+*x;*x=*x+y; main() int x=2,y=4: f(y,x); printf(“%d%dn“,x,y); 28 【正确答案】 efgh【试题解析】 #include stdioh char *ss(char *s)/*函数为指针型函数,返回值为字符串 s 的中问一个字符的地址*/ return s+strlen(s)/2; main() char *p, *str=“abcdefgh“; p=ss(str):printf(“%sn“,p);/*打印输出以地址 p 为起始地址的字符串*/ 29 【正确答案】 6【试题解析】 #includ
20、e stdioh int f(int a,int n) if(n1)return a0+f( a1 ,n-1);/*这是一个递归调用过程*/ else return a0; main() int aa3=1,2,3 ,s; s=f(aa0 ,3);printf(“%dn“ ,s); 四、程序填充题30 【正确答案】 exp(x-y)/*第一空。由语句“f1=x*x/fum(_);“知此处为函数A(x,y)的表达式。且函数 fun()是函数表达式 A(x,y) 的分母,应由 x、y 两个变量组成。而此参数应满足语句“f2=f*f+sqrt(1+_+_);“ 和“return(f2);(函数A(x
21、,y)的分母 )“;故空应为变 “f“的表达式,再结合数学函数 A(x,y)的原形可得到此空应为 exp(x-y)*/ 2*f/*第二空。由语句“f2=f*f+sqrt(1+_+_);“和数31 【正确答案】 本题是采用的递归算法。 str/*第一空。指针变量 s 获得传递而来的初值 c*/ *s/*第二空 a 第一次循环负责找到字符串的结尾,第二次及以后循环负责找到字符串中的空字符*/ *s/*第三空。输出该字符后将其置空,以标记本次输出的位置为下次输出做准备*/ 32 【正确答案】 fopen(“bi.dat“ ,“W“)/*第一空。语句“if(fp=_)=NULL)“的用意是测定打开文件
22、是否成功,fp 所获得的值是文件 bidat 的首地址。*/ ch=getchar()/*第二空。语句“while(_)!=)“ 是为了测试文本是否结束,变量 ch 获得的是从终端设备获得的字符*/ fclose(fp)/*第三空。处理完成后关闭该文件*/五、程序设计题33 【正确答案】 #include stdioh #includesldlib h main() FILE *fp; char c; if(fp=fopen(“abctxt“,“r+“)=NULL)/*测试文什是否正确被打开*/ printf(“Can not open file!n“);exit(0) ;) while(!f
23、eof(fp) if(c=fgetc(fp)!=)/*如果不足 字符则进行加密运算*/ c=c-10;/* 加密运算*/ fseek(fp,-11,1);/*前移一个字符。因在执行 fgetc(fp)时文什内部指针会自动后移一个字符。指向应被加密字符的下一个字符*/ fputc(c,fp);/*将获得加密后的字符填入该位置,且文件内部指针会自动后移一个字符*/ fseek(fp,01 ,1);)/*避免指针漂移,定位文件内部指针在当前位置不移动,并将其传递给函数 feof(fp)*/ else break; fclose(fp); return 0; 34 【正确答案】 #includestd
24、ioh 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(“%sn“,huiwen(str);