1、高级语言程序设计-8 及答案解析(总分:100.00,做题时间:90 分钟)一、B单项选择题/B(总题数:15,分数:30.00)1.若有以下说明,则在 seanf函数调用语句中对结构体变量成员引用方式不正确的是( ) struct pub char name20; int age; int sex; pub5,*P;(分数:2.00)A.scanf(“%s“,pup0nam;B.scanf(“%d“,pup0ag;C.scanf(“%d“,p-se;D.scanf(“%d“,*ag;2.设有以下定义 int a43=1,2,3,4,5,6,7,8,9),10,11,12; int *ptr3
2、=a0,*p=a0; 则以下能正确表达数组元素 a12的表达式是( )(分数:2.00)A.*(*ptr+1)2)B.*(*(p+5)C.*(*ptr+1)+4)D.*(*(p+1)+2)3.不能把字符串“Hello!“符给数组 b的语句是( )(分数:2.00)A.char b10=H,e,l,l,o,!;B.char b10;b=“Hello!“;C.char b10;strcpy(b,“Hello!“);D.char b10=“Hello!“;4.若 x、y 是 int型变量,则执行以下语句后的 x值是( ) #includestdioh main() int x,y; for(y=1,
3、x=1;y50;y+) if(x=10)break; if(x%2=1) x+=5; x-=3; (分数:2.00)A.3B.6C.7D.105.已知有以下定义(假定现有计算机字长为 16) int a=0x48,b=0xf0; ab 的值为( )(分数:2.00)A.184B.183C.290D.2876.若有以下定义: char s20=“programming“,*ps=s; 则不能代表字符 o的表达式是( )(分数:2.00)A.*(ps+2)B.s2C.ps2D.*ps+=27.若有说明语句:int I,;则以下关于 x、*x、x0、x00的描述正确的是( )(分数:2.00)A.x
4、、*x、x0、x00均表示元素 x00的地址B.只有 x、*x 表示元素 x00的地址C.只有 x0、xL0表示元素 x00的地址D.只有x00表示元素的地址8.以下函数的功能是( ) ABC(ps) char *ps; char *P; p=ps; while(*p+); return(p-ps); (分数:2.00)A.比较两个字符串的大小B.求字符串的长度C.将字符串 ps复制到 P中D.以上三种说法都不对9.执行以下程序段后 s的值为( ) int a=5,64,4,8,9,5,8; int s=0; int k; for(k=0;k8;k+=2) s+=*(a+k):(分数:2.00
5、)A.17B.22C.27D.3210.C语言的基本数据类型包括( ) A字符型和数值型 B字符型和逻辑型 c整型和实型 D指针型和数据型(分数:2.00)A.B.C.D.11.下列选项中合法的数组定义是( )(分数:2.00)A.int a=“string“;B.int a5=0,1,2,3,4,5;C.char a=“sting“;D.char a=0,1,2,3,412.执行下列语句后 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);(分数
6、:2.00)A.4B.5C.7D.813.若有下列类型说明语句: char w;int x;float y;double z; 则表达式 w*x+z-y的结果的数据类型是( )(分数:2.00)A.charB.intC.floatD.double14.下列关于 C语言的描述正确的是( )(分数:2.00)A.C语言是面向硬件的高级语言B.C语言是面一种面向对象的程序设计语言C.C语言是一种结构化程序设计语言D.C语言的前身是汇编语言15.下列程序正确的运行结果为( ) #includestdioh main() int a=2,6,8,10,14,18); int *ptr-=a0,a1,a2
7、,a3,a4); int i; for(i0;i5;i+) ai=ai/2+ai printf(“%d/n“,*(*(ptr+2); printf(“%d/n“,*(*ptr); (分数:2.00)A.12 21B.21 12C.12 3D.3 12二、B填空题/B(总题数:10,分数:20.00)16.与标准输出设备所对应的文件型指针名为 1。(分数:2.00)填空项 1:_17.将字符串写入文件时,不写入文件的字符串结束标志是 1。(分数:2.00)填空项 1:_18.将字符转换成 ASC代码值的函数是 1。(分数:2.00)填空项 1:_19.文件包含命令是以 1 为开头的编译预处理命令
8、。(分数:2.00)填空项 1:_20. 1是 C语言中唯一的一个三目运算符,它是由两个符号组成。(分数:2.00)填空项 1:_21.数组 int arry59;的第二维下标的最大值是 1。(分数:2.00)填空项 1:_22.在进行程序清单的编译时, 1 是先于编译进行的。(分数:2.00)填空项 1:_23.已知 char str=“ABCD“;,则语句 printf(“%d“,strlen(str);的输出是 1。(分数:2.00)填空项 1:_24.设 int a;float b;char c;long d;double e;unsigned u;,则表达式 a+c/b-d*e+u值
9、的类型是 1。(分数:2.00)填空项 1:_25.设 int x=5; x+=x-=x*x; 则 x的值是_。(分数:2.00)填空项 1:_三、B程序分析题/B(总题数:4,分数:16.00)26.#includestdioh void main() int i; for(i=1;i5;i+) printf(“%d/t%c/n“,i,(A+i); (分数:4.00)_27.#includestdioh void main() int i,j,a44; for(i=0;i4;i+) for(j=0;j4;j+) aij=1+i;-j; for(i=0;i4;i+) for(j=0;j4;j+
10、) if(aij0)printf(“%3 d“,aij); printf(“/n“); (分数:4.00)_28.#includestdioh int f(int n) static int s=1; while(n)s*=n-; return s; main() int i,j; i=f(3);j=f(5); printf(“The output is:/n“); printf(“i=%d j=%d/n“,i,j); (分数:4.00)_29.#includestdioh int trans(int m,int n) int i; if(mn) i=m%n;trans(m,n); else
11、i=m: if(i10)printf(“%d/n“,i): else printf(“%c“,A+i-10): main() int i; printf(“The output is:/n“); printf(“n%d/n“,-23); trans(21,3); printf(“n%d/n“,123); trans(123,16); (分数:4.00)_四、B程序填充题/B(总题数:3,分数:18.00)30.将一个十进制整数转变成一个二进制整数。 #includestdioh main() int i=0j,n,num20;scanf(“%d“,_);/*第一空*/ while(n!=0)
12、numi+=_;/*第二空*/ n=_;)/*第三空*/ for(j=i-1;j=0;j-) printf(“Ha“,numj); printf(“/n“); (分数:6.00)填空项 1:_31.以下程序用来统计从终端输入的字符中大写字母的个数。以“$“作为输入结束标记。 #includestdioh #includectypch main() int num126,i;char c; for(i=0;i26;i+) numi=0; while(_)!=$)/*第一空*/ if(isupper(c)numc-65+=1; for(i=0;i26;i+) if(_)/*第二空*/ printf
13、(“%c:%d/n“,_,numi);/*第三空*/ (分数:6.00)填空项 1:_32.输入 5个字符,从中找出最大的并输出。要求用字符数组存放此字符,并用指针数组元素分别指向这5个字符。 #includestdioh main() char a5,*p5,*max; int I; for(I=0;I5;I+) _;/*第一空*/ for(I=0;I5;I+) scanf(“%C“,pI); max=p0; for(I=0;_;I+)/*第二空*/ if(*max*pI) _;/*第三空*/ printf(“%c“,*max); (分数:6.00)填空项 1:_五、B程序设计题/B(总题数
14、:2,分数:16.00)33.输出 100以内所有个位数字为 7且能被 3整除的数。(分数:8.00)_34.一个二维数组 int a44,请将其填满并输出其四个边的元素。(分数:8.00)_高级语言程序设计-8 答案解析(总分:100.00,做题时间:90 分钟)一、B单项选择题/B(总题数:15,分数:30.00)1.若有以下说明,则在 seanf函数调用语句中对结构体变量成员引用方式不正确的是( ) struct pub char name20; int age; int sex; pub5,*P;(分数:2.00)A.scanf(“%s“,pup0nam;B.scanf(“%d“,pu
15、p0ag;C.scanf(“%d“,p-se;D.scanf(“%d“,*ag; 解析:解析 “的优先级远高于“和“*“。2.设有以下定义 int a43=1,2,3,4,5,6,7,8,9),10,11,12; int *ptr3=a0,*p=a0; 则以下能正确表达数组元素 a12的表达式是( )(分数:2.00)A.*(*ptr+1)2)B.*(*(p+5)C.*(*ptr+1)+4) D.*(*(p+1)+2)解析:解析 “int *ptr3=a0“定义了指针数组 ptr并给这个数组的第一个元素赋值“a0“,“*(*ptr+1)+4)“的含义是:取指针数组 ptr的第一个元素值再加 5
16、所得的指针量指向的内存单元的值。3.不能把字符串“Hello!“符给数组 b的语句是( )(分数:2.00)A.char b10=H,e,l,l,o,!;B.char b10;b=“Hello!“; C.char b10;strcpy(b,“Hello!“);D.char b10=“Hello!“;解析:解析 “char b10;b=“Hello!“;语句中,b 是数组的首地址而不是变量,故字符串“Hello!“的首地址不能赋给 b,也就不能完成把字符串“Hello!“赋给数组 b的任务。4.若 x、y 是 int型变量,则执行以下语句后的 x值是( ) #includestdioh main
17、() int x,y; for(y=1,x=1;y50;y+) if(x=10)break; if(x%2=1) x+=5; x-=3; (分数:2.00)A.3 B.6C.7D.10解析:解析 #includestdioh 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*/ 5.已知有以下定义(假定现有计算机字长为 16) int a=0x48
18、,b=0xf0; ab 的值为( )(分数:2.00)A.184 B.183C.290D.287解析:解析 因计算机字长为 16,故 a的二进制表示是 0000000001001000,b 的二进制表示是0000000011110000,进行按位加(ab)所得的结果是:0000000010111000(十进制值为 184)。6.若有以下定义: char s20=“programming“,*ps=s; 则不能代表字符 o的表达式是( )(分数:2.00)A.*(ps+2)B.s2C.ps2D.*ps+=2 解析:解析“*“的运算优先级高于“+-“,故*ps+=2 相当于*ps=p+2。7.若有
19、说明语句:int I,;则以下关于 x、*x、x0、x00的描述正确的是( )(分数:2.00)A.x、*x、x0、x00均表示元素 x00的地址B.只有 x、*x 表示元素 x00的地址C.只有 x0、xL0表示元素 x00的地址 D.只有x00表示元素的地址解析:解析 x0表示数组 x34第二行的首地址,也是数组元素00的地址8.以下函数的功能是( ) ABC(ps) char *ps; char *P; p=ps; while(*p+); return(p-ps); (分数:2.00)A.比较两个字符串的大小B.求字符串的长度 C.将字符串 ps复制到 P中D.以上三种说法都不对解析:解
20、析 ABC(ps)char *ps; char *p; p=ps; while(*p+);/*寻找字符串的结束符“/0“,p 的自加在循环体被执行后才被执行*/ return(p-ps);/*求出字符串的长度*/ 9.执行以下程序段后 s的值为( ) int a=5,64,4,8,9,5,8; int s=0; int k; for(k=0;k8;k+=2) s+=*(a+k):(分数:2.00)A.17B.22 C.27D.32解析:解析 int a=5,6,4,4,8,9,5,8; int s=0: int k; for(k=0;k8;k+=2)/*步进值为 2,k=8 时循环终止*/ s
21、+=*(a+k);/*s 的值是 a0、a2、a4、a6的和*/10.C语言的基本数据类型包括( ) A字符型和数值型 B字符型和逻辑型 c整型和实型 D指针型和数据型(分数:2.00)A. B.C.D.解析:11.下列选项中合法的数组定义是( )(分数:2.00)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解析:12.执行下列语句后 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;
22、c=*(p3=n)=*p1*(*p2);(分数:2.00)A.4B.5 C.7D.8解析:解析决定 b的值的是语句“b=3*(-*p1)/(*p2)+7;“根据定义将其转换成变量算术运算式是“b=3*(-1)/m+7=3*(-4)/6+7=5“。13.若有下列类型说明语句: char w;int x;float y;double z; 则表达式 w*x+z-y的结果的数据类型是( )(分数:2.00)A.charB.intC.floatD.double 解析:14.下列关于 C语言的描述正确的是( )(分数:2.00)A.C语言是面向硬件的高级语言B.C语言是面一种面向对象的程序设计语言C.C
23、语言是一种结构化程序设计语言 D.C语言的前身是汇编语言解析:15.下列程序正确的运行结果为( ) #includestdioh 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(“%d/n“,*(*(ptr+2); printf(“%d/n“,*(*ptr); (分数:2.00)A.12 21 B.21 12C.12 3D.3 12解析:解析 #includestdioh main() int a=2,6,810,14,18); int *ptr=a4
24、,a3,a2,a1,a0;/*定义一个指向整型数据的指针的数组,并以数组 a的前 5个元素的地址为初值*/ for(i=0;i5;i+) ai=ai/2+ai;/*数组 a的元素分别加上各自现有值的 1/2并保存在该元素中*/ printf(“%d/n“,*(*(ptr+2);/*输出的是指针数组 ptr的第三个元素所指向的数组 a的元素值*/ printf(“%d/n“,*(*ptr);/*输出的是指针数组 ptr的第一个元素所指向的数组 a的元素值*/ 二、B填空题/B(总题数:10,分数:20.00)16.与标准输出设备所对应的文件型指针名为 1。(分数:2.00)填空项 1:_ (正确
25、答案:stdout)解析:17.将字符串写入文件时,不写入文件的字符串结束标志是 1。(分数:2.00)填空项 1:_ (正确答案:/0)解析:18.将字符转换成 ASC代码值的函数是 1。(分数:2.00)填空项 1:_ (正确答案:toascii-|_|-)解析:19.文件包含命令是以 1 为开头的编译预处理命令。(分数:2.00)填空项 1:_ (正确答案:#include)解析:20. 1是 C语言中唯一的一个三目运算符,它是由两个符号组成。(分数:2.00)填空项 1:_ (正确答案:条件运算符)解析:21.数组 int arry59;的第二维下标的最大值是 1。(分数:2.00)填
26、空项 1:_ (正确答案:8)解析:22.在进行程序清单的编译时, 1 是先于编译进行的。(分数:2.00)填空项 1:_ (正确答案:宏替换)解析:23.已知 char str=“ABCD“;,则语句 printf(“%d“,strlen(str);的输出是 1。(分数:2.00)填空项 1:_ (正确答案:4)解析:24.设 int a;float b;char c;long d;double e;unsigned u;,则表达式 a+c/b-d*e+u值的类型是 1。(分数:2.00)填空项 1:_ (正确答案:double)解析:25.设 int x=5; x+=x-=x*x; 则 x
27、的值是_。(分数:2.00)填空项 1:_ (正确答案:-40)解析:三、B程序分析题/B(总题数:4,分数:16.00)26.#includestdioh void main() int i; for(i=1;i5;i+) printf(“%d/t%c/n“,i,(A+i); (分数:4.00)_正确答案:()解析:1 B 2 C 3 D 4 E 解析 #includestdioh void main() int i; for(i=1;i5;i+)/*限定循环次数为 4次*/ printf(“%d/t%c/n“,i,(A+i);,/*输出的值并输出 ASC值为(A+i)“字符*/ 27.#i
28、ncludestdioh void main() int i,j,a44; for(i=0;i4;i+) for(j=0;j4;j+) aij=1+i;-j; for(i=0;i4;i+) for(j=0;j4;j+) if(aij0)printf(“%3 d“,aij); printf(“/n“); (分数:4.00)_正确答案:()解析:1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 解析 #includestdioh void main() int i,j,a44; for(i=0;i4;i+)/*限定循环次数为 4次*/ for(j=0;j4;j+)aij=1+i;-j
29、;/*限定循环次数为 4次*/ for(i=0;i4:i+) for(j=0;j4;j+) if(aij0)printf(“%3d“,aij);/*设置输出格式为 3个字符的宽度,不足的宽度以空格补齐*/ printf(“n“); 28.#includestdioh int f(int n) static int s=1; while(n)s*=n-; return s; main() int i,j; i=f(3);j=f(5); printf(“The output is:/n“); printf(“i=%d j=%d/n“,i,j); (分数:4.00)_正确答案:()解析:The ou
30、tput is: i=6 j=720 解析 #includestdioh int f(int n) static int s=1;/*s 被定义为静态变量,函数 f()退出时其值被保留,且再次进入该函数时不再被初始化,该变量所使用的值为最近一次凋函数 f()时所得到的值。*/ while(n)s*=n-; return s; main() int i,j; i=f(3);/*第次凋用 f(),s 被初始化为 1,运算过程中 s的值被改变为 6,所以 i=6*/ j=f(5);/*第二次调用 f(),s 不再被初始化而是以值 6参与本次运算,故 j的值为 654321=720*/ printf(
31、“The output is:/n“); printf(“i=%d j=%d/n“,i,j); 29.#includestdioh int trans(int m,int n) int i; if(mn) i=m%n;trans(m,n); else i=m: if(i10)printf(“%d/n“,i): else printf(“%c“,A+i-10): main() int i; printf(“The output is:/n“); printf(“n%d/n“,-23); trans(21,3); printf(“n%d/n“,123); trans(123,16); (分数:4.
32、00)_正确答案:()解析:The output is: n-23 解析 #include stdioh int trans(int m,int n) int i; if(mn) i=m%n;trans(m,n);/*如果 mn,则将 m除以 n的余数赋给 i,并再次调用函数 trans()*/ else i=m; if(i10)printf(“%d/n“,i);/*如果 i10,则打印输出 i的值*/ else printf(“%c“,A+i-10); main() int i; printf(“The output is:/n“); printf(“n%d/n“,-23);trans(21
33、,3); printf(“n%dkn“,123); trans(123,16); 四、B程序填充题/B(总题数:3,分数:18.00)30.将一个十进制整数转变成一个二进制整数。 #includestdioh main() int i=0j,n,num20;scanf(“%d“,_);/*第一空*/ while(n!=0) numi+=_;/*第二空*/ n=_;)/*第三空*/ for(j=i-1;j=0;j-) printf(“Ha“,numj); printf(“/n“); (分数:6.00)填空项 1:_ (正确答案:n/*第一空。从键盘上输入十制数 n*/)解析:n%2/*第二空。取
34、余数填补低位*/ n/2/*第三空*。为下一次循环进行更高的一位运算做准备/31.以下程序用来统计从终端输入的字符中大写字母的个数。以“$“作为输入结束标记。 #includestdioh #includectypch main() int num126,i;char c; for(i=0;i26;i+) numi=0; while(_)!=$)/*第一空*/ if(isupper(c)numc-65+=1; for(i=0;i26;i+) if(_)/*第二空*/ printf(“%c:%d/n“,_,numi);/*第三空*/ (分数:6.00)填空项 1:_ (正确答案:c=getcha
35、r()/*第一空。得到从键盘输入的值,并判断是不是结束标志“$“*/)解析:numi/*第二空。判断用以记录个数的数组元素是否为 0,如为 0则不输出*/ i+65/*第三空。从语句“numc-65+=1;“可知数组对字符的记录是通过下标和字符的 ASC值之间的关系进行的。故此处应填上与之相应的换算关系*/32.输入 5个字符,从中找出最大的并输出。要求用字符数组存放此字符,并用指针数组元素分别指向这5个字符。 #includestdioh main() char a5,*p5,*max; int I; for(I=0;I5;I+) _;/*第一空*/ for(I=0;I5;I+) scanf
36、(“%C“,pI); max=p0; for(I=0;_;I+)/*第二空*/ if(*max*pI) _;/*第三空*/ printf(“%c“,*max); (分数:6.00)填空项 1:_ (正确答案:pI=aI/*第一空。给指针数组 P的元素分别赋以相应的数组 a的元素的地址*/)解析:I25/*第二空。确定循环的次数,以防数组越界*/ max=pI/*第三空。将最值赋予字符变量max*/五、B程序设计题/B(总题数:2,分数:16.00)33.输出 100以内所有个位数字为 7且能被 3整除的数。(分数:8.00)_正确答案:()解析:#includestdioh main() in
37、t i,a; for(i-0;i10;i+) a=i*10+7;/*求个位为 7的数*/ if(a%3=0)printf(“%d/n“,a);/*判断其是否能被 3整除*/ 34.一个二维数组 int a44,请将其填满并输出其四个边的元素。(分数:8.00)_正确答案:()解析:#includestdioh main() int a44; int i,j; for(i=0;i4;i+) for(j=0;j4;j+) scanf(“%d,aij); for(i=0;i4;i+) for(j=0;j4;j+) if(i=0)|(i=3)printf(“%d“,aij);/*如果是第一行或第四行则输出该元素*/ else if(j=0)|(j=3)printf(“%d“,aij);/*如果是第一列或第四列则输出该元素*/