1、全国自考(高级语言程序设计)模拟试卷 4 及答案与解析一、单项选择题1 下列关于 C 语言的描述正确的是( )(A)C 语言是面向硬件的高级语言(B) C 语言是面一种面向对象的程序设计语言(C) C 语言是一种结构化程序设计语言(D)C 语言的前身是汇编语言2 C 语言的基本数据类型包括( )(A)字符型和数值型(B)字符型和逻辑型(C)整型和实型(D)指针型和数据型3 已知有以下定义(假定现有计算机字长为 16) int a=0x48,b=0xf0; ab 的值为( )(A)184(B) 183(C) 290(D)2874 若有以下定义: char s20=“programming“,*p
2、s=s; 则不能代表字符 o 的表达式是( )(A)*(ps+2)(B) s2(C) ps2(D)*ps+=25 若有说明语句:int I,;则以下关于 x、*x、x0、x00的描述正确的是( )(A)x、*x、x0 、x00均表示元素 x00的地址(B)只有 x、*x 表示元素 x00的地址(C)只有 x0、xOL0 表示元素 x00的地址(D)只有x00表示元素的地址6 若有下列类型说明语句: char w;int x;float y;double z ; 则表达式 w*x+z-y 的结果的数据类型是( )(A)char(B) int(C) float(D)double7 下列程序正确的运
3、行结果为( ) #include stdioh main() int a=2,6,8,10,14,18); int *ptr-= a0 , a1,a2,a3,a4);int i; for(i0;i5; i+) ai=ai/2+ai printf(“%dn“,*(*(ptr+2); printf(“%dn“,*(*ptr); (A)12 21(B) 21 12(C) 12 3(D)3 128 以下函数的功能是( ) ABC(ps) char *ps; char *P; p=ps; while(*p+); return(p-ps) ; (A)比较两个字符串的大小(B)求字符串的长度(C)将字符串
4、ps 复制到 P 中(D)以上三种说法都不对9 若 x、y 是 int 型变量,则执行以下语句后的 x 值是( ) #includestdio h main() int x,y; for(y=1,x=1;y50;y+) if(x=10)break ; if(x%2=1) x+=5; x-=3; (A)3(B) 6(C) 7(D)1010 执行下列语句后 b 的值为( ) int a ,b,C ,l=4,m=6,n=8; int *p1= 1,*p2=m,*p3; a=p1=1;b=3*(-*p1)/(*p2)+7; c=*(p3=n)=*p1*(*p2);(A)4(B) 5(C) 7(D)81
5、1 若有以下说明,则在 seanf 函数调用语句中对结构体变量成员引用方式不正确的是( ) struct pub char name20; int age ; int sex; pub5 ,*P;(A)scanf(“%s“,pup0name) ;(B) scanf(“%d“,pup0age) ;(C) scanf(“%d“,p-sex);(D)scanf(“%d“ ,*P age);12 设有以下定义 int a43=1 ,2,3,4,5,6 ,7,8,9),10,11,12 ;int *ptr3=a0,*p=a0; 则以下能正确表达数组元素 a12的表达式是( )(A)*(*ptr+1)2)
6、(B) *(*(p+5)(C) *(*ptr+1)+4)(D)*(*(p+1)+2)13 执行以下程序段后 s 的值为( ) int a=5,64,4,8,9,5,8; int s=0; int k; for(k=0;k8;k+=2) s+=*(a+k) :(A)17(B) 22(C) 27(D)3214 不能把字符串“Hello!“符给数组 b 的语句是( )(A)char b10=H,e,l,l ,o,!;(B) char b10;b=“Hello!“ ;(C) char b10;strcpy(b,“Hello!“) ;(D)char b10=“Hello!“;15 下列选项中合法的数组定
7、义是( )(A)int a=“string“ ;(B) int a5=0,1,2,3,4,5;(C) char a=“sting“;(D)char a=0,1,2,3,4二、填空题16 若有定义:double w6 ;,则数组元素下标的上限为_。17 若有定义语句:int a=10,2,20,3,30,4,40 ,p;p=a ;,则执行“p2+=;之后 p 的值是_ 。18 若定义了 int a9,*p;,将数组元素 a8的地址赋给指针变量 p 的赋语句是_。19 C 语言的保留字主要用于语句的构成,所有保留字均由_组成。20 语句“;“ 是无任何操作的语句,被称为_。21 _是双目运算符,其
8、运算对象是表达式,其值是右边表达式的值。22 若要使用系统函数 getchar(),必须在程序的开头使用预编译命令_。23 若要以八进制输出整型变量,则要在输出语句中加上格式输出符_。24 指针变量的使用主要有两种,一是_;二是引用所指向的变量。25 写出 n 小于 m 的奇数的表达式_。三、程序分析题26 #includestdioh main() int a=2,4,6,8,10; int y=1,x, *P; p= a1; for(x=0;x3;X+) y+=*(p+x); printf(“%dn“,y); 27 #includestdioh main() char *p=“BOOL“,
9、“OPK“,“H“ ,“ASD“); int; for(i=3;i =0;i- ,i-) printf(“%s“,*(p+i); printf(“n“); 28 #includestdioh int d=1: int fun(int p) d+=P+; printf(“%d“,d); main() int a=3; fun(a); d+=a+; printf(“%dn“,d); 29 #includestdioh main() int i,j,row,col,max; int a34=1,2,3, 4,10,4,20,6,0,-1,-3,-5,; max=a00; for(i=0;i 3;i+
10、) for(j=0;j 4;j+) if(aijmax) max=aij;row=i;col=j;) printf(“max=%d,row=%d,col=%dn“,max ,row,col); 四、程序填充题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
11、i,j; x00=1; for(i=1;i N;i+) xi0=_=1;/*第一空 */ for(j=1;j i;j+) if(_)/*第二空*/ xij=_;/*第三空*/ 31 下面程序段可以求出 n!的值。 #includestdioh main() int i,n; long np; scanf(“%d“,n) ; _;/*第一空*/ for(i=2;_;i+)/*第二空*/ _;/*第三空*/ printf(“n=%d,n!=%ldn“,n,np); 32 下面程序可用来统计文件中字符的个数。 #includestdioh main() FILE *fp; long num=0; i
12、f(fp=_)=NULL)/*第一空*/ printf(“Can not open filen“);exit(0) ; while(_)/*第二空*/ _;/*第三空*/ printf(“num=%dn“,num); fclose(fp); 五、程序设计题33 编一个程序其功能是输入一个正整数,判断是否是素数,若为素数则输出 1,否则输出 0。(素数是只能被 1 和本身整除且大于 1 的自然数)34 有一个字符串,包含 n 个字符。写一个函数,将此字符串中从第 m 个字符开始的全部字符复制成为另一个字符串。要求在主函数中输入字符串及 m 值并输出复制结果。全国自考(高级语言程序设计)模拟试卷
13、4 答案与解析一、单项选择题1 【正确答案】 C2 【正确答案】 A3 【正确答案】 A【试题解析】 因计算机字长为 16,故 a 的二进制表示是 0000000001001000,b的二进制表示是 0000000011110000,进行按位加(ab)所得的结果是:0000000010111000(十进制值为 184)。4 【正确答案】 D【试题解析】 *的运算优先级高于“+-“,故*ps+=2 相当于*ps=p+2。5 【正确答案】 C【试题解析】 x0 表示数组 x34第二行的首地址,也是数组元素00 的地址6 【正确答案】 D7 【正确答案】 A【试题解析】 #include stdio
14、h main() int a=2,6,810,14,18); int *ptr=a4 ,a3,a2,a1 ,a0;/* 定义一个指向整型数据的指针的数组,并以数组 a 的前 5 个元素的地址为初值*/ for(i=0;i5 ;i+) ai=ai/2+ai;/*数组 a 的元素分别加上各自现有值的 1/2 并保存在该元素中*/ printf(“%dn“,*(*(ptr+2);/*输出的是指针数组 ptr 的第三个元素所指向的数组 a 的元素值*/ printf(“%dn“,*(*ptr);/* 输出的是指针数组 ptr 的第一个元素所指向的数组 a的元素值*/ 8 【正确答案】 B【试题解析】
15、ABC(ps)char *ps; char *p; p=ps; while(*p+);/* 寻找字符串的结束符“0“, p 的自加在循环体被执行后才被执行*/ return(p-ps);/*求出字符串的长度*/ 9 【正确答案】 A【试题解析】 #include stdioh main() int x, y; for(y=1,x=1 ;y50;y+)/*以 y 为线索进行循环,步进值为 1*/ if(x=10)break;/*如果 x 大于 10 则中断循环*/ if(x%2=1)/*当 x 是奇数时,执行“x+=5;“*/ x+=5; ) X-=3;/*循环执行完毕,x 的值减 3*/ 10
16、 【正确答案】 B【试题解析】 决定 b 的值的是语句 “b=3*(-*p1)/(*p2)+7;“ 根据定义将其转换成变量算术运算式是“b=3*(-1)/m+7=3*(-4)/6+7=5“。11 【正确答案】 D【试题解析】 ?的优先级远高于“和“*“ 。12 【正确答案】 C【试题解析】 int *ptr3=a0 定义了指针数组 ptr 并给这个数组的第一个元素赋值“a0“,“*(*ptr+1)+4)“的含义是:取指针数组 ptr 的第一个元素值再加 5 所得的指针量指向的内存单元的值。13 【正确答案】 B【试题解析】 int a=5,6,4,4,8,9,5,8; int s=0: int
17、 k; for(k=0;k8;k+=2)/*步进值为 2,k=8 时循环终止 */ s+=*(a+k);/*s 的值是 a0、a2、a4、a6的和 */ 14 【正确答案】 B【试题解析】 char b10;b=Hello!“;语句中,b 是数组的首地址而不是变量,故字符串“Hello!“ 的首地址不能赋给 b,也就不能完成把字符串 “Hello!“赋给数组b 的任务。15 【正确答案】 A二、填空题16 【正确答案】 517 【正确答案】 a【试题解析】 *优先级高于“+=“,语句“*p2+=;“ 相当于“(*p)+=2;“,对指针变量 p 没有进行任何算术运算、其值不变。18 【正确答案】
18、 p=a8;19 【正确答案】 小写字母20 【正确答案】 空语句21 【正确答案】 逗号运算符22 【正确答案】 #include stdioh23 【正确答案】 024 【正确答案】 赋值25 【正确答案】 n%2nm【试题解析】 n 小于 m 的奇数即是 nm 又要是奇数。则 nm 和 n 不能做 2整除都要满足,转化为 c 语言表达式即是 n%2nm。三、程序分析题26 【正确答案】 19【试题解析】 #include stdioh main() int a=2,4,6,8,10; int y=1,x, *P; p=a1; for(x=0;x3;x+)/*循环的步进值是 1,执行循环体
19、需满足 x3*/ y+=*(p+x);/*与 y 一起参与运算的是存储于以“a1“为首地址。偏移量为“x“的内存单元内,它属于数组“im a“的 int 型数据*/ printf(“%dn“,y); 27 【正确答案】 ASDOPK【试题解析】 #include stdioh main() char *p=“BOOL“,“OPK“ ,“H“,“ASD“; int i; for(i=3;i 0;i- ,i-)/*循环的步进值是 2,因 i 做了两次自减 1 的运算*/ printf(“%s“,*(p+i);/*打印地址为 p 偏移量为 i 的字符型数组的内存单元的字符串*/ printf(“n“
20、); 28 【正确答案】 4 7【试题解析】 #include stdioh int d=1;/*变量 d 为令局变量,任意一个关于 d 的操作都会影响到 d 的值*/ int fun(int p) d+=p+; printf(“%d“,d); main() int a=3; fun(a): d+=a+: primf(“%dn“,d); 29 【正确答案】 max=20 ,row=1,col=2【试题解析】 #include stdioh main() int i,j,row,col ,max ; int a34=1,2,3, 4, ,10,4,20,6,0,-1,-3,-5,;/* 初始化数
21、组 a34,没有初始化的元素默认为 “0“*/ max=a00; for(i=0;i 3;i+) for(j-0;j4;j+) if(aijmax) max=aij;row=i;col=j;/*用每个元素和 max 对比,比 max 大的将其值赋于 max 并记录其横、纵两个下标的值*/ printf(“max=%d,row=%d,col=%dn“,max,row,col); 四、程序填充题30 【正确答案】 xii, *第一空。将对角线置*/ i!=j*第二空,判定是否为对角线上的元素*/ xij-1+xi-1j/*第三空。根据构成规律 (2)求出该元素的值*/31 【正确答案】 np=1/
22、* 笫一空。给变量 np 赋以 1 的初值*/ i=n/* 第二空。确定乘法运算的上限*/ np*=i/*第三空。求阶乘的乘法运算*/32 【正确答案】 fopen(“fnamedat“ ,“r“)/*第一空。以只读模式打开文件fname dat*/ !feof(fp+),*第二空。测试是否到达文什尾*/ num+/*第三空。字符个数统计*/五、程序设计题33 【正确答案】 #includestdioh main() int i,x,y=1; scanf(“%d1,x);/*输入数值 x*/ for(i=2;i =x/2;i+) if(x%i=0)y=0;break/*用 x 逐一对 2 以上
23、到 x/2 之间的正整数求余*/ printf(“%dn“,y); 34 【正确答案】 #includestdioh #includectypeh char copystr(char *p1,char *p2,int m) int n=0; while(nm-1)/* 寻找第 m 个字符*/ n+; p1+;) while(*p1!=0)/*复制从第 m 个字符到字符串结束这_段字符到*p2 中*/ *p2=*p1; p1+; p2+; *p2=0; main() int m; char str180,str280; printf(“Please input a string(length80) :n“); scanf(“%s“,str1); printf(“nWhich character starting from?n“); scanf(“%d“,m) ; if(strlen(str1)m) printf(“nError input!“); else copystr(str1,str2,m);/*调用函数 copystr()进行字符串输出*/ printf(“nResuh is:%skn“,str2);