高级语言程序设计试卷及答案解析
更新时间:2024-06-18 15:54:01 阅读量: 综合文库 文档下载
- 高级语言程序设计试卷答案推荐度:
- 相关推荐
1.1 单项选择题
1.二进制语言是属于()
①面向机器语言②面向问题语言③面向过程语言④面向汇编语言
【解】人们研制了许许多多计算机程序设计语言,其中二进制语言直接来自计算机的指令系统,与具体计算机紧密相关,所以是一种面向机器语言。面向问题语言是为了易于描述和求解某类特定领域的问题而专门设计的一种非过程语言。面向过程语言是一种能方便描述算法过程的计算机程序设计语言。有汇编语言,但没有面向汇编语言。汇编语言也是一种面向机器的语言,与机器语言比较,汇编语言用有助于记忆的符号来代表二进制代码。所以解答是①。
2.下列语言中不属于面向过程的语言是() ①高级语言②低级语言③C语言④PASCAL语言
【解】 C语言和 PASCAL等程序设计语言都是高级语言,它们用于描述复杂加工的处理过程,所以也称它们是面向过程语言。低级语言是指机器语言和汇编语言,低级语言是面向机器的语言,而不是面向问题的语言。所以解答是②。
3.下列字符中属于键盘符号的是() ①②n ③ t ④ b
【解】键盘符号是指键盘上有标记,并能在显示器上直接以其标记字样显示的字符。有许多键盘上有标记的符号,它们不是用于直接显示的,键入这种字符用于表示特定的意义,如常用的回车符。为了能让C程序标记这种符号,程序采用转义字符的方式书写这种字符。如\、\、\都不是键盘字符,在 C语言中,它们都得用转义字符来表达。只有字符才是键盘字符。所以解答是①。但在C程序中,反斜杠字符已特别用作转义字符的引导符,它也得用转义字符的表达形式书写,将它写成\。 4.下列字符列中,不是用来表达转义字符是() ①②\③074 ④
【解】转义字符有三种书写形式:反斜社字符后接上某个规定的字符;反斜杠字符后接上13个八进制数字符;反斜社字符和字符X之后接上1至2个十六进制数字符。后两种分别八进制数和十六进制数直接给出字符的ASCll代码值。而074是八进制整数,不是转义字.所以解答是③。
1 / 80
5.不是C语言提供的合法关键字是() ①switch ②begin ③case ④default
【解】因C语言的关键字表中没有begin,它不是C语言的关键字。所以解答是②。
6.下列字符列中,能作为单个标识符是()l ①? a ② a=2 ③a.3 ④ a___3
【解】在C语言中,规定标识符是这样一种字符序列,由英文字母或下线字符开始,后接任1个英文字母、下线字符和数字符组成。所以问题所列的字符列只有a_3是标识符,其余都l是标识符,一个是由字符\?\开头、一个中间有字符\=\,另一个有字符\.\。所以解答是④。
7.在C语言中,下列说法中错误的是()
①函数定义可以分为两个部分:函数说明部分和函数体 ②主函数可以调用任何非主函数
③任何非主函数可以调用其它任何非主函数 ④程序可以从任何函数开始执行
【解】每个C函数的定义分两部分,函数说明部分和函数体,所以叙述①是正确的叙述。C语言中,函数可以递归调用,主函数可以调用程序中的任何函数,当然可以调用任何非主教的其它函数,所以叙述②是一个正确的叙述。同样理由,叙述③也是正确的。C语言规,C程序只有一个主函数,并总是从主函数开始执行,不能从非主函数开始执行。所以,说程可以从任何函数开始执行是错误的。所以解答是④。 1.2 填充题
1.汇编语言属于面向________语言,高级语言属于面向________语言。
【解】汇编语言与具体计算机密切有关,是属于面向机器的语言;而高级语言用来描述求解题的算法,所以是面向过程的语言。所以解答是:面向机器和面向过程。
2.用高级语言编写的程序称为________程序,它可以通过________程序翻译一句执一句的方式执行,也可以通过________程序一次翻译产生________程序,然后执行。
【解】用高级语言编写的程序称为源程序,源程序不能在计算机上直接运行,运行源程序有种方式:一种是通过解释程序,对源程序逐句解释执行;另一种是先让编译程序将源程序一
2 / 80
翻译产生目标程序(目标程序是计算机可直接执行的机器语言程序,它是一种二进制代码程),然后执行目标程序。
3.转义字符是由________符号开始,后接单个字符或若干字符组成。 4.C语言词类主要分为____、_____、_____和_____等。
【解】语言的基本词汇是指直接由字符序列组成,有确定意义的最基本单位,所以C语言词汇有:字面形式常量。特殊符号(主要是运算符)、保留字和标识符等四类。而表达式、函数调用等是更高级的语言成分,如表达式中还可分运算分量和运算符等;函数调用也是一种表达式,它有函数名标识符、圆括号和实际参数表等。利用基本词汇,按照给定的C语言的句法规则,就可命名程序对象,描述表达式计算、构造语句、函数,直至整个程序。 5.C语言的语句主要分为_____语句、_____语句、_____语句_____语句、______语句和_____语句等。
【解】C语言有多种不同功能的语句,有用于定义数据的,有用于各种存储和计算的,有用于程序流程控制的,有多种分类方法。C语言的语句主要有:数据定义语句、表达式语句、流程控制语句、复合语句、空语句和其它语句。程序中经常使用的赋值表达式语句和函数调用表达式语句都是典型的表达式语句。
6.C程序是由函数构成的。其中有并且只能有_____个主函数。C语言程序的执行总是由_____函数开始,并且在_____函数中结束(如别的函数未调用终止程序执行的库函数)
【解】C程序是由若干函数构成的。其中有并且只能有1个主函数(用main命名)。C程序的执行总是由主函数开始执行,通常在主函数中结束(如没有在别的函数中调用终止程序执行的库函数的话)。
7.C语言程序的注释可以出现在程序中的任何地方,一个注释以双符号作为开始标记,以双符号_____作为结束标记。
【解】C语言程序的注释可以出现在程序基本单词之间的任何地方, C语言程序的注释以双符号\/。非为开始标记,并以双符号\。/\作为结束标记。 2.1 单项选择题
1.下列字符列中,可以作为\字符串常量\的是() ① ABC ② ABC\③\④\
【解】C程序中,一个字符率常量是表示一个字符序列,书写时,用双引号字符前后括住这个字符序列。所以只有\是一个正确的字符率常量,其余都不是。其中,ABC可作为标识符,字符列\不能出现在C程序中,\是一个字符常量。所以解答是②。
3 / 80
2.在以字节存储字符的系统中,\在内存占用的字节数是() ①1 ②2 ③3 ④4
【解】一般来说,一个字符在内存中只占1个字节,\是转义字符,其意义是换行符,它作为一个字符存储,在内存也只占五个字节。所以解答是①。
3.字符串\在内存占用的字节数是() ①3 ②4 ③6 ④8
【解】字符串中的每个字符占1个字节,但C程序在存储字符串时,要在最后一个有效字符后面接上 1个字符串结束的标记符\。这样,存储字符串常量\需要 4个字节。所以解答是②。
4.在以下字符列中,合法的长整型常数是() ① OL ② 4962710 ③ 0.054838743 ④ 2.1869el0
【解】为表示不同范围的整数,整型数据分短整型、基本型和长整型,并对三种整型内部表示的最高位的不同理解,又分别分成无符号和带符号两种。若要明确指明一个整数是长整型的,必须在整数之后接上字符\。所以OL是一个长整型的整型常量,而4962710是基本整型数据,而对于用2个字节表示一个基本整型数据的系统来说,该整数将因超出范围而是一个错误的整数;0.054839743和2.1869el0都是double型的实数。所以解答是①。
5.一个char型数据,它的值在内存中存放的是() ①ASCll代码值②BCD代码值③内码值④十进制代码值
【解】计算机存储字符,通常是存储字符的某种代码值。有许多种字符编码的方法,最流行的是ASCII代码。在C语言中,Char型数据也用ASCII代码表示。所以解答是①。
6.设变量 m,n,a,b,c,d均为以执行(m=a==)||(n=c==d)后,m,n的值是() ①0,0 ②0,1 ③l,0 ④1,1
【解】计算(m=a==b)||(n=c==d)的过程是先计算逻辑或的左运算分量(m=a==b)的值,由于赋位运算符的优先级比关系运算符==的优先级低,又先计算 a==b。因 a,b均为0后,所以比较结果值为1。将1赋给变量m,使变量m的值变为1 。同时这个赋值运算的结果也是1,这样逻辑运算的左运算分量的值为1。由于逻辑或运算的左运算分量值为1,按照C语言对逻辑或运算优化计算的规定,不再计算逻辑或的右运算分量,而直接得到逻辑或运算
4 / 80
的结果为1 。由于逻辑或的右运算分量不曾计算过,所以变量n的值也不为变化。这样,上述表达式计算后,变量m的情为1,变量n的值为0。所以解答是③。
7.设a为5,执行下列计算后,b的值不为2的是() ① b=a/2 ② b=6-(--a)③ b=a%2 ④ b=a<3?3:2
【解】因两个整型数据相除,结果是整数,当a的值为5时,计算表达式b=a/2后,使b的值为2。计算表达式b=6-(--a)是先计算子表达式(--a)的,先让a的值减1变成4,并以减1后的a为子表达式的结果,所以子表达式的结果为4,最后使b的值为2。在计算表达式b= a%2时,求余运算a%2的结果为1,最后使变量b的值为1。计算表达式b=a<3?3:2时,先计算条件表达式a<3?3:2,以2为结果,最后也使变量b的值为人所以解答是③。
8.执行语句\=(a=3,b=a—-);\后,X,a,b的值依次为() ①3,3,2 ②2,3,2 ③3,2,3 ④2,3,3
【解】计算表达式x=(a=3,b=a--)时,先计算赋值号右端圆括号内的逗号表达式。远号表达式要求各子表达式顺序计算,并以最后予表达式的值为整个逗号表达式的结果。所以该表达式计算时,先让变量a的值为3,a--的值是a当时的值,以该值为结果赋给变量b,并以该值为远号表达式的值赋给变量x,然后a的值被减少1。所以计算该表达式后,使变量x,a,b的值依次为3,2,3。所以解答是③。
9.设整型变量m,n,a,b,c,d均为1,执行\=a>b)&&(n=a>b)\后m,n的值是() ①0,0 ②0,l ③1,0 ④1 ,l
【解】表达式(m=a >b)&&(n=a >b)是一个逻辑表达式,它的计算过程是先计算逻辑与的左分量(m=a>b,其中又是先计算a>b。因a>b不成立,结果为0,将0赋给变量m,最后逻辑与的左分量结果为0。由于逻辑运算采用特别的优化计算规则,当逻辑与的左分量结果为0时,不再计算逻辑与的右分量,而直接以0为逻辑与的结果。所以,上述表达式计算使m的值变为0,而n的值没有变,依旧为l。所以解答是②。
10,设有代码\=3;\,则执行了语句\;\后,变量a的值是() ①3 ② 0 ③ 9 ④ -12
【解】由于赋值运算符的结合性自右至左,语句\;\的执行是先计算a*a,得到值 9,再计算 a-=a*a,使 a的值为-6,接着计算 a+=a,使 a的值为-12。所以解答是④。
5 / 80
【解】 do-while语句的一般形式是: do语句
while(表达式);
其语义是重复执行其成分语句,直至表示条件的表达式值为0时结束。do-while语句是正常使用的一种循环结构之一。do-while语句的循环结束条件由while后的表达式值为0所控制,并不一定要有break语句跳出循环来结束循环。do-while语句在条件值非0时,将继续循环,而不是结束循环。条件值为0时,才结束循环。所以正确的选择是④。
15.若有以下程序段,W和k都是整型变量,则不能与该程序段等价的循环语句是() W= k;
LB: if(w==0) gotO LE; w - -; printf(\; goto LB; LE:
①for(w=k;w!=0;W--)printf(\; ② w= k;
While(W--!=0) Prinif(\; ③ w= k;
do{w--; prinif(\); } while( W!= 0);
④ for(w=k;W;--W) printf(\;
【解】问题所给出的程序段用goto语句构造一个循环控制结构,该循环结构的初值是让变量W的值为k的值,循环结束条件是W的情等于0,循环体是让变量W的值减1,并输出一个字符* 。上述循环控制过程用for循环可描述如下: for=(w=k;W!=0; W--) printh(\或写成:
for(w=k ;w;--w) printf(\); 若用while语句,可描述如下: W=k;
while(w--!=0)printf(\;
w++;/*在w等于0时,也执行了一次 w--,这里是对w最后减1的补尝*/ 或更直观地写成: W=k;
16 / 80
while(w!=0){ w--;Printf(\若用do-while语句,可描述如下: W=k; if(W) do{
w--; prinif(\); } while(w); 若写成: W=k; do{
W--; printf(\; } while(w!=0);
是不正确的,因为原代码当k的值为0时,不输出字符*,而上面的改写,当k的值为0时,将输出许许多多的字符*。所以解答应是③。 3.2 填充题
1.结构化程序设计规定的三种基本结构是________结构,选择结构和_______结构。 【解】结构化程序设计的三种基本控制结构是顺序结构、选择结构和循环结构。 2.若有定义\=25,b=14, c=19;\,以下语句的执行结果是______。 if a++<=25&&b--<=2&&c++) prinif(\=%d,b=%d,c=%d\n\,c);
else printf(\=%d,b=%d,c=%d\n\, a, b,c);
【解】问题所给的if语句中,条件a++<=25&&b--<=2&&c++是先求逻辑与的第一个运算分量,它是一个关系式,关系成立。接着判定第二个逻辑与运算分量,又是一个关系式,由于变量b的值是14,b不小于等于2,运算分量的关系式不成立,导致if语句的条件为假,执行else部分。在求且语句的条件时,计算了2个逻辑与分量,使变量a的值增了1,变量 b的值被减了1。所以输出内容是:###a=26,b=13,c=19。 3.以下两条if语句可合并成一条if语句为_____________。 if(a<=b) x=1; else y=2;
if(a>b)printf(\,y); else printf( \=%dn\,x);
【解】在以上两条if语句中,两个条件刚巧相反。若将前一个if语句的第一个成分语句与第二个if语句的第二个成分语句合并;第一个if语句的第二个成分语句与第二个if语句的第一个成分语句合并,写成一条if语句如下: if(a<=b){x=1;printf(\=Y,x);} else{ y=2; printf(\=%dn\,y);}
17 / 80
4.设 i,j,k均为 int型变量,则执行完下面的for语句后,k的值为_______。 for(i=0,j=10;i<=j;i++,j--)k=i+j;
【解】该 for语句以i为0、j为10初始化,循环条件是 i<=j,每次循环后 i增 1、j减 1,循环体是将 i与j的和赋给 k。这样变量 k将保存的是最后一次赋给它的值。一次循环后 i为 l。j为 9,二次循环后 i为 2.j为 8,……,五次循环后 i为 5.j为 5,继续第六次循环,将 i与 j的和10存于 k后,i为 6、j为 4,结束循环。所以循环执行后 k为10。 5.下列程序的功能是输入一个整数,判断是不是素数,若为素数输出1,否则输出0,请为程序填空。 main() {int i,X,y=1; scanf(\%d\,&x); for(i=2;i<=x/2;i++)
if________________ { y=0; break; } printf(\%d\n\,y); }
【解】为判数x是否是素数,预置变量y的值为1(x可能是素数),然后用循环,用2至x/2的整数i测试对X的整除性,若能被其中的某个整数整除,则X是合数,置y的值为0(不是素数),结束测试循环。若都不能整除,则X为素数。i能否整除X,可用求余运算X%i等于0来判定。所以程序中的空框可填 X% i==0。测试 X为素数的代码可写成: y=l;
for( i=2; i<=x/2; i++) if(x%i==0){ y=0; bleak; }
3.3 程序分析题
1.阅读程序,写出运行结果。 main()
{ int a=10, b=4,C=3; if(a<b)a=b; if(a<C) a=C;
printf(\%d,%d,%dn\, a,b,c); }
【解】程序中,第一个if语句if(a
{ int x=100, a=10, b=20, Ok1=5,Ok2=0;
18 / 80
if(a<b)if(b!=15)if(!Ok1) x=1; else if(ok2) x=10; else x=-l;
printf(\%d\n\,x); }
【解】程序预置变量x的值为100,a的值为10,b的值为20,ok1为5,Ok2为0。 程序中给出的if语句可以写成更结构化的形式如下: if(a<b) { if(b!=15){ if(!Ok1) x=1; else{
if(Ok2) x=10; else x=-l; } } }
由于条件a<b成立,并且条件b!=15也成立,而ok1不等于0,执行else后的语句。又因ok2等于0,执行else后的语句赋-1给x。所以程序输出一l。 3.阅读下列程序,写出程序的输出结果。 main() { int y=9; for(; y>0; y--)
if(y%3==0){ printf(\%d\,--y);continue;} }
【解】循环前,变量y的值为9,其中的循环语句在y大于0情况下循环,每次循环后y的值减1。循环体是当y能被3整除时输出表达式--y,输出的是减1后的y值。这样,第一次循环因y为9,能被3整除,输出8,y也变成8。又经两次循环,y的值变为6,又让y减1变成5,并输出5;又经两次循环,y的值变成3,让y减至变成2,输出2;再经两次循环后,y的值变成0,结束循环。所以程序输出852。
3.4 程序设计题
1.编一个程序,输入华氏温度(F),按下列公式计算并输出对应的摄氏温度(C):C= 5( F-32)/9
【解】利用公式:C=5(F-32)/9,输入F氏温度,计算并输出对应的C氏温度,程序要引入两个变量,分别用于存储F氏温度和C氏温度,计算时应采用浮点型,包括公式中的常数也应写成浮点数,不能采用整型和把常数写成整数。因采用整型编写,公式中的除运算
19 / 80
变成整除,会得出与实际要求不一致的结果。程序如下: #include main()
{ float f,c;/*变量定义*/ printf(\输入F氏温度\); scanf(\%f,&f); c= 5.0*(f-32.0)/9.0;
printf(\对应的C氏温度%6.2f\n\,c); }
2.编一个程序,输入一个整数,输出其符号(若≥0,输出1;若<0输出-1)。 【解】程序可用if语句判断输入数的符号,并控制输出1或-l。程序如下: # include main()
{ int c;/*变量定义*/ printf(\输入一个整数\scanf(\%d\,&c); if(C>=0) printf(\; else printf(\; }
3.编一个程序,输入X的值,按下列公式计算并输出y的值。 X(X≤l)
y= {2x-l(l<x<10) 3X-11(10≤X)
【解】输入x,按公式计算y。这可用一个嵌套的if语句分段判断并计算出y的值。然后输出y值。程序如下: # include<stdio.h> main()
{ int x,y;/*变量定义*/ printf(\输入一个整数\); scanf(\%d\,&x); if( x<=l) y=X; else if(x<10)y=2*x-l; else y=3*X-11; printf(\=%d n\, y); }
4.编一个程序,输入三个单精度数,输出其中最小数。
【解】设最小数存于变量min中,为求三个数中的最小数,可分以下多步完成,先预置min
20 / 80
5.语句\;\的输出结果是() ①11 ②10 ③ 9 ④ 8
【解】字符串中的字符可以是一般的普通字符,也可以是由反斜杠字符开头的转义字符。在字符串\中,有三个转义字符,它们是n、1、,所以该字符串的有效字符个数是9。所以正确的回答是③。
6.函数调用\,str2),str3)\的功能是()
①将字符串strl复制到字符串str2中后再连接到字符串str3之后 ②将字符串strl连接到字符串str2中后再复制到字符率str3之后
③将字符串str2复制到字符串strl中后再将字符串str3连接到字符串strl之后 ④将字符串str2连接到字符率strl之后再将字符串strl复制到字符串str3中
【解】函数调用strcat(s1,s2)是将s2字符串复制连接到s1字符串之后,使s1字符串变得更长。函数调用strcpy(s1,s2)是将s2字符串复制到s1,使s1字符串的内容与s2字符串的内容相同。函数调用strcat(strcpy(strl,str2) ,str3) 是先执行strcpy(strl,str2),然后再执行strcat(strl,str3),所以其功能是将字符串str2复制到字符串strl中,然后再将字符串str3复制连接到字符串strl之后。正确的选择是③。
7.设有如下定义,则正确的叙述为() char x[]={\;
char y[]={\,\,\,\,\,\,\;
①数组x和数组y等价②数组x和数组y长度相同
③数组X的长度大于数组y的长度④数组X的长度小于数组y的长度
【解】不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。但用字符初始化时,尽管给出了字符串中的全部字符,还是不会自动有字符率结束字符。但字符串初始化自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多1个字节。所以只有③才是正确的。 4.2 填充题
1.根据变量定义\, a[][3]={1,2,3,4,5,6};\,b[4]=_____,a[1][2]
【解】系统规定,静态变量定义时,若末初始化,系统自动给定二进制代码全0的值。所以
26 / 80
态数组b的元素全为0,当然包括b[4]也为几静态数组a是二维数组,每行有三个元素,在初始化中结出了六个初值,所以数组a有2行。由于数组的元素按行顺序存储,并按行顺序初始化。前三个值是第一行,后三个值是第二行。a[1][2]是第二行的第三列元素,也是 a的最后一个元素,所以其值是6。
2.设有定义语句\,{2},{3}};\则a[l][l]值为_,a[2][1]的值为_。
【解】给二维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对哪些未给出初值的部分元素,系统自动置二进制代码全0的值。由于定义语句只给a[0][0]给定初值l、a[l][0]给定初值2、a[2][0]给定初值3。这样,其它元素都为0值。所以,a[1][1]= 0,a[2][1]= 0。
3.若在程序中用到\函数时,应在程序开头写上包含命令_____,若在程序中用到\函数时,应在程序开头写上包含命令______。
【解】putchar()是系统提供的头文件stdio.h中定义的宏,所以程序要使用它,必须写上包含命令:#include。函数strlen()是系统提供的字符串处理函数之一,字符串处理函数的函数原型说明和它们用到的有关常量、数据结构等,在系统提供的头文件tring.h中定义,所以使用该函数的程序应在程序开头写上包含命令并include。
4.下面程序的功能是输出数组s中最大元素的下标,请填空。 main() {int k, p ;
int s[]={1,-9,7,2,-10,3}; for(p=0, k=p;p<6; p++) if(s[p]>s[k])____________ printf(\,k); }
【解】为要寻找数组中的最大元素的下标,需先预设1个临时最大元素的下标,并顺序逐一考察数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考察了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考察是从首元素开始顺序向后继元素考察。程序中,存储临时最大元素下标的变量是k,变量p控制顺序考察的循环控制变量。当发现当前元素s[p]比临时最大元素s[k]更大时,应该用p更新k。所以在空框处应填入代码\=p;\。
5.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。 # include main()
{int i, j,_____________;
27 / 80
char str[]={\;
for(i=0,j=strlen(str); i 【解】颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量i和j, j是前端元素的下标, j是后端元素的下标, 交换以这两个变量值为下标的元素str和 str[j]。开始时,i的值为 0,j的值为字符率未元素的不标(字符串长度减1)。每次交换后,i增 1,j减1。继续交换的条件是str还位于str[j]的前面,即i { char b[17]={\; int c[64],d,i=0,base=16; long n; printf(\:n\;. scanf(\,&n): do { c=________;i++;n=n/base;} while(n!=0); printf(\:n\; for(--i; i>= 0;--i) {d=c; printf(\,b);} printf(\; 【解】程序中,字符数组b存储十六进制的 16个数字符,整型数组C存储泽出的十六进制数的各位数值.从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n除16 的余.得到它的十六进制的个位数,接着将n除以16。在n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第一个空框处可填代码nose或n。当n的十六进制数的个位、十位、百位等数字依次存放于数组C中后,就从最高位至最低位,参照数组c的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第二个空框处可填入代码[d]。 4.3 程序分析题 1.阅读程序,写出程序运行结果。, main() { static int a[][3]={9,7,5,3,l,2,4,6,8}; int i,j,sl=0,s2=0; 28 / 80 for(i=0; i<3;i++) for(j=0;j<3;j++) { if(i==j) s1=s1+a[j]; if(i+j== 2) s2=s2+a[j]; } printf(\, sl,s2); } 【解】已知数组。共有3行3列席一行依次是9,7,5;每二行是3,1,2;第三行是4,6,8。程序引用数组元素的游标变量是i和j,外循环控制变量i是数组的行下桥,内循环控制变量j是数组的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到S2。将行下标i和列下标j相同的元素累计到sl,sl=a[0][0]+a[l][1]+a[2][2]。将行下标i与列下标j的和为 2的元素累计到 s2,s2=a[0][2]+a[l][l]+a[2][0]。所以sl是18,s2是10。程序输出: 18 10 2.说明下列程序的功能。 main() { int i,j; float a[3][3],b[3][3],x; for(i=0;i<3;i++) for(j=0;j<3 ;j++) { scanf(\; a[j]= x; } for(i=0;i<3;i++) for(j=0;j<3;j++) b[j]=a[j]; for(i=0;i<3;i++) {printf(\; for(j=0;j<3;j++) printf(\,b[j]); } printf(\; } 【解】程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循 29 / 80 环是将数组a转置复制到数组b。程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。 3.写出下列程序的运行结果。 main() {static char a[]={\; int i,j,k; for( i=0;i<5;i++) { printf(\for(j= 0;j for(j=0;j<5 ;j++)printf(\,a[k]); } printf( \; } 【解】程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案: * * * * * * * * * * * * * * * * * * * * * * * * * 4.说明下列程序的功能。 main() { int i,j ; float a[3][3],b[3][3],c[3][3],x; for(i=0;i<3;i++) for(j=0;j<3;j++) { scanf(\,&x); a[j]= x; } for(i=0;i<3;i++) for(j=0;j<3;j++) {scanf(\,&x);b[j]=x; } 30 / 80 for(i=0; i<3; i++) for(j=0;j<3;j++) c[j]=a[j]+ b[j] ; for(i=0; i<3;i++) { printf(\; for(j=0;j<3;j++) printf(\, c[j]); } printf(\; } 【解】程序第一段的功能是按行顺序输入数组a 的元素。程序第二段的功能是按行顺序输入数组b的元素。程序第三段的功能是顺序累加数组a和数组b的对应元素,并将和存于数组C的对应元素中。最后,按行顺序输出数组C的全部元素。 4.4 程序设计题 1.编程序,输入单精度型一维数组 a[10] ,计算并输出 a数组中所有元素的平均值。 【解】为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成C程序如下: # include main() { int i, n=10; float s,a[10] ; printf(\, n); for( i=0;i< n; i++) { scanf(\,&s); a= s; } for(s=0.0,i=0;i printf(\平均值是%.2fn\, s); } 2.编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。 【解】将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量i和j,i是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i的值为0,j的值为末元素的下标。每次交换后,i增1,j减1。继续交换的 31 / 80 条件是i { int a[10], i,j,t,n=10; printf(\, n); for(i=0;i t= a; a=a[j] ;a[j] =t; } for(i=0; i printf(\, a); printf(\; } 3.编程序,输入两个字符串(<40个字符) ,连接后输出(不准用系统函数) 。 【解】将字符串s2连接到字符串s1的计算过程可分两个步骤完成。首先找到字符串s1的末尾,然后参照字符串s2,将字符串s2的全部有效字符逐一复制到字符串s1,最后在字符串s1的末尾接上字符率结束标记符。完整程序如下: # include # define N 40 main() { char s1[N] ,s2[N]; int i,j; printf(\; scanf(\,s1); printf(\; scanf(\, s2); for(i=0; sl!=\; i++) ; for(j=0;s2[j]!=\;i++,j++) so=s[j] ; s1=\ printf(\=%sn\,sl); } 32 / 80 4.编程序按下列公式计算S的值(其中X1、X2、…、Xn由键盘输入): s=∑(xi-x0)(xi-x0) (其中x0是X1、x2、…、Xn的平均值) 【解】输入数组x的n个元素的值,按公式计算。程序首先输入n,设n<100,然后输入n个数据,接着求它们的平均值,最后按计算公式求出s,并输出。程序如下: # include # define N 100 main() { double x[N+1], s; int i,n; do { printf(\; scanf(\,&n); } while(<=0||n>=100); for(i=1; i<=n;i++){ scanf(\,&s);x=s; } for(s=0.0,i=1;i<=n; i++) s+=x ; x[0] = s/n; for(s=0.0, i=1;i<= n;i++) s+=(x-x[0])*(x-x[0]); printf(\, s); } 5.输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。 【解】输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下: # include main() { int a[3][5], i,j,t,n=3, m=5, min,max, minrow, mincol, maxrow, maxcol; printf(\, n,m); for(i=0; i for( j=0;j 33 / 80 min=max=a[[0][0]; minrow=mincol=maxrow=maxcol=0; for(i=0;i max= a[j] ;maxrow= i;maxcol=j ; } if( a[j] min=a[j] ; minrow= i; mincol=j ; } } printf(\=a[%d][%d] =%d MIN= a[%d][%d] =%d n\, maxrow,maxcol,max,minrow,mincol,min) ; } 6.输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。 【解】程序先输入字符率,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量ch中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch- \+\;类似地,若变量ch中的字符是小写字母,则与它对应的大写字母的表达式可以写成ch-\+\。完整程序如下: # include # define N 200 main() { char s[N] ; int i; printf(\; scanf (\,s); for(i=0; s!=\;i++) if(s >=\s=s -\+\; else if(s >=\s= s-\+\; printf(\=%sn\; } 34 / 80 7.设某班50名学生的三科成绩表如下: 课程一课程二课程三 ... ... ... 试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。 【解】程序定义一个50行3列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下: # include # define N 50 # define M 3 main() {int score[N][M], i,j,t; double a[M]; printf(\; for(i=0;i< N; i++) for(j=0;j scanf(\,&t);score[j]=t; } for(j=0;j for(j=0;j printf(\课程%d的平均分是%.2fn\, j+1,a[j]); } 8.编一个程序,输入一个整型数据,输出每位数字,其间用远号分隔。例如,输入整数为2345,则输出应为: 2, 3, 4, 5。 【解】程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以10的余数的办法来求出它的个位,每分拆出一位就将被分拆的数除以10。循环过程直至被分拆的数为0结束。完整程序如下: # include main() 35 / 80 {int a[20],i,base=10; int n; printf(\; scanf(\,&n);/*整数输入*/ i=0;/*对n进行分拆,各位数字自低位到高位存于数组 a*/ do{ a[i++]=n% base; n/= base; } while(n) ; for(i--;i>=0;i--)/*自高位到低位输出*/ printf(\,a, i? \,\:\} 9.编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3。然后输出加密后的字符串。 【解】程序的主要工作是输入字符串,并顺序考察输入字符率中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下: # include # define N 200 main() {char s[N]; int i; printf(\; scanf(\, s); for(i=0;s !=\if(s >=\=\s=3; else if(s=\=\s=3; printf(\=%sn\,s); } 10.编一个程序,将按第9题中加密的字符率(从键盘输入)解密后输出。 【解】本问题编写的程序是完成上一程序的逆操作。同样是顺序考察输入字符串,对满足要求的字符作恢复更改。要求是当字符减3后是大写英文字母时,则对其作减3处理的替换;当字符加3后是小写英文字母时,则对它作加3的处理。如此做法是有错误的,程序未考虑原 先不是英文字母,而未被加3或减3处理,但对它减3或加3后是英文字母时,将被下面的 36 / 80 程序转换成英文字母。所以下面的程序不是完成上题程序的逆操作。但没有简单的办法能避免这个错误。完整程序如下: # include # define N 200 main() {char s[N]; int i; printf(\; scanf(\,s); for(i=0;s !=\;i++) if(s-3>=\s-=3; else if(s+3>=\s+=3; printf(\,s); } 5.1 单项选择题 1.设有定义\=3, b,*p=&a;\,则下列语句中使 b不为3的语句是() ① b=* &a;② b=* p; ③ b=a;④ b=*a; 【解】定义有 int a=3, b,*p=&a;对b赋值的表达式有*&a、*p、a 、*a。引用变量。的值有两种方法,一是直接引用a,二是通过a的指针间接引用a。对于后者,又有多种表达方法,通过指向a的指针p,间接引用a的内容,如*p。或通过求地址运算符由变量a得到其指针&a,再由这指针表达式间接引用 a的内容,如* &a。所以表达式*&a、*p和a都能引用变量a的值,而使b的值为3。而表达式。a是错误的,因为a不是指针变量,不能对它施行取内容运算符。。所以解答是④。 2 .设指针x指向的整型变量值为万,则\,++ *x);\的输出是() ① 23 ② 24 ③ 25 ④ 26 【解】若指针变量x指向某个变量,例如指向变量v,并且变量v的值是25,则表达式++ *x的值是26。这是因为表达式的计算顺序可加圆括号表达成(++(*x)),首先是*x,是对X所指变量V的引用,所以++ *X就是++V。++V是先让变量V增1,并以增至后的V的值为表达式++V的结果,所以其值是 26。所以解答是④。 37 / 80 3.若有说明:\= 7,*p=&i;\,则与\=j;\等价的语句是() ①i=*p;②*P=* &j; ③i==&j;④i=* *p; 【解】指针变量 p指向变量i时,表达式i=*p等价于 i=i;表达式*p=*&j等价于i=j;而表达式i=&j企图将整型变量的指针赋给整型变量,这是错误的;表达式i=* *p也是一种错误的表达式。p是指针,*p是p所指变量j,* *p是企图将整型变量j当作指针,并想通过j间接引用某个变量。所以解答是②。 4.若有说明语句\,*p=a;\,对数组元素的正确引用是() ①a[p] ②P[a] ③*(P+2) ④P+2 【解】在 C语言中,约定数组名单独出现在表达式中时,它表示数组首元素的指针。有int a[10] ,则a可以作为&a[0]使用。另有整型指针变量p,代码p=a实现p指向数组a的首元素。则表达式*(p+2)是引用数组元素a[2]。表达式a[p]和p[a]都是不正确的,下标必须是整型表达式,不可以是指针表达式。表达式p+2是指针表达式,它的值是&p[2]。所以只有表达式*(p+2)引用数组a的元素a[2]。所以解答是③。 5.下面各语句中,能正确进行赋字符串操作的语句是() ①char s[5] ={\②char s[5] ={\③ char *s;s=\;④ char *s;scanf(\, s); 【解】字符串最终存储于字符数组中,存储字符串的字符数组可以是程序主动引入的(定义或动态分配),也可以是字符串常量,由系统分配。其中字符数组用字符串初始化就是字符串存储于由程序引入的字符数组的例子。给字符指针赋字符串则是系统自动分配字符率存储空间的例子。给字符指针赋字符串并不是将一个长长的字符串存于字符指针变量中,而是将字符串常量存储于常量区,并将存储这个字符串的首字节地址赋给指针变量,让指针变量指向字符率常量的首字符。对于以字符串作为字符数组初值的情况,要求字符数组足够的大,能存得下字符串常量。这里有一个特别的规定,若数组的大小少于存储字符串有效字符的字节个数,系统将报告错误;当字符数组的大小只能存储字符串的有效字符,而不能存储字符率结束标记符时,则存储于字符数组中的内容是字符序列,因没有存储字符率结束标记符,存储的内容就不是字符串。如代码char a[5]=\。另外,给字符数组元素逐一赋字符初值,并在字符初值中没有字符串结束标记符,则存于字符数组中的内容也不是字符率。如代码 char s[5]={\,\,\,\,\。特别要注意当字符指针还未指向某个字符数组的元素 38 / 80 时,不可以通过字符指针输入字符串。如代码char *s;scanf(\,s)。若写成char *str;scanf(\,&str)更是错误的了。由于C语言规定数组不能相互赋值,所以只能将字符串常量赋给某字符指针。如代码char *s;s=\是正确的。实际上,字符率\被存储于常量区中,向指针变量赋的是字符指针,让s指向其中的字符\。所以解答是③。 6.若有以下定义,则不能表示a数组元素的表达式是() int a[10]={1,2,3,4,5,6,7,8,9,1o},*p=a; ①*p ② a[10] ③*a ④ a[p-a] 【解】上述代码定义了有10个元素的整型数组。,和定义指针变量p,并让p指向数组元素a[0]。所以代码*p是引用 a[0]。由于数组a只有10个元素,最后一个元素是a[9],表达式a[10]是错误的。数组名a可以作为a的首元素的指针,表达式*a就是a[0] ,是对数组a的首元素a[0]的引用。指针p的值是a,表达式p-a。的值是0,所以a[p-a]就是a[0]。所以解答是②。 7.若有以下定义,则值为3的表达式是() int a[]= {1,2,3,4,5,6,7,8,9,10},*p=a; ①p+=2,*(p++) ③p+=2,* ++p ③p+=3,*p++ ④ p+=2,++ *p 【解】数组a有10个元素,分别有值1至10,指针变量p指向a[0] ①逗号表达式 p+=2,*(P++),先是P+=2使P指向a[2],接着是*(P++),以当时P所指变量a[2]取内容3为表达式的值,同时使p指向a[3]。②返号表达式p+=2,* ++p,先是p+=2使p指向a[2],以后是* ++p,又使 p增1,让它指向a[3],并取指针p所指变量a[3]的内容4作为表达 式的值。③逗号表达式 p+=3,*p++,先是p+=3使p指向a[3],以后是*p++,表达式的值是 a[3]为 4,而使p指向a[4]。④逗号表达式p+=2,++ *p,先是p+=2,使p指向a[2],以后是++ *p,因当时的*p就是 a[2],++a[2]使a[2]增1,变成4,并以4为表达式的值。所以只有p+=2,*(p++)的值是3。所以解答是①。 8.设有定义\,*p=a;\,则*(p+4)的值是() ①\②\③\④不能确定 【解】若有char a[10]=\,*p=a,则指针变量p指向a[0]。在表达式*(p+4)中,p+4指向 39 / 80 a[4],*(p+4)就是a[4]。由于用字符\给字符数组a赋初值,a[4]的值是字符串结束标记符\。所以解答是③。 9.设有代码\;\,其中的ptr是() ①10个指向整型变量的指针 ②指向10个整型变量的函数指针 ③一个指向具有10个元素的一维数组的指针 ④具有10个指针元素的一维数组 【解】代码\;\的分析过程是,因圆括号,括号内的ptr先与字符*结合,字符*修饰标识符ptr是一种指针;接着与后面的一对方括号结合,表示是这样的一种指针,是指向一维数组的;再有方括号中的10,说明这种数组有10个元素。至此,ptr是指向含10个元素的 一维数组的指针。最后,是最前面的int,表示数组元素是int类型的。所以,ptr是一个指向具有10个int型元素的一维数组的指针。所以解答是③。另外,要是①,10个指向整型变量的指针,就是一个指针数组,上述代码应写成\;\,即ptr是一个有10个指向整型变量的数组。要是②,返回值是指向10个整型变量的函数的指针,上述代码应写成\;\,即ptr是指针,指向一种函数,函数的返回值又是一种指针,指向10个元素的数组,数组的元素是整型的。下面的代码是这样的函数指针和函数的例子: # include int a[][10]={{1,2,3,4,5,6,7,8,9,0} ,{0,1,2,3,4,5,6,7,8,9} }; int(*(*ptr)(int))[10]; int(*f( int n))[10] {return a+n; } void main() { int(*p)[10],*q; ptr=f;/*让ptr指向函数f*/ P=(*ptr)(0); q=*p; printf(\; P=(*ptr)(l); q=*p; 40 / 80
正在阅读:
高级语言程序设计试卷及答案解析06-18
街道工委党建工作制度05-13
错过一道风景作文600字07-01
公司劳动合同书(通用4篇)03-27
信息技术考点操作规程201510(1)04-12
牟宗三“良知坎陷”说评析01-15
小学学校应急机构及职责汇编02-25
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 程序设计
- 试卷
- 解析
- 答案
- 高级
- 语言