• 335.50 KB
  • 2022-04-22 11:17:51 发布

计算机二级《笔试宝典》习题答案与详解.doc

  • 46页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'培恩IT教育系列教材-习题详解-www.born365.cn第一章C语言基础知识一、选择题1.【A】分析:C语言中,标志符包括:关键字、预定义标识符、和用户标识符。其中我们常用的关键字只有30来个,也就是说要学好C语言,我们只需要记住30来个单词就可以了。用户标识符由字母、数字和_组成标识符只能由字母、数字和下划线组成;其第一个字符必须是字母或下划线;标识符区分大小写字母。如int与Int是两个完全不同的标识符。2.【B】3.【B】分析:if为关键字,肯定不能做为用户标识符。预定义标识符可以作为“用户标识符”使用,只是这将使这些标识符失去系统规定的原意,所以一般也不要将预定义标识符作为“用户标识符”使用。4.【D】分析:sizeof为关键字,不能做为用户标识符。5.【D】分析:用户标识符命名规则里规定,不能以数字开头。6.【B】分析:与第5题类似。7.【C】分析:与第5题类似。8.【D】分析:int为关键字,所以不能定义为用户标识符,但是scanf为预定义标识符,最好也不要用做用户标识符。9.【B】分析:A选项long为关键字;C选项以数字5开头;D选项中包括非法的.。10.【A】分析:A选项中包括非法的.。11.【C】分析:C选项中以数字开头。12.【A】分析:B选项中包含非法的-;C选项中以数字开头;D选项中包含关键字。13.【D】分析:该题有误,D)floatUSS应该为D)floatU$$。由于D选项包含非法字符$,所以答案为D。14.【A】分析:B选项中赋值运算符的左边不能是表达式;C选项中赋值运算符的左边不能是表达式;D选项中C语言中强制类型转换的正确格式应该为“(类型名)表达式”,即应该为(double)(x)/10。15.【A】分析:%运算符的运算对象必须是整型,%=是%和=的复合运算符,所以其运算对象也必须是整型。16.【C】分析:字符型变量可以被赋予单个字符和小于128的整型数据,当是整型数据时,相当于是对应字符的ACSII码值。字符是用""括起来的单个字符。17.【B】分析:在C语言中无“:=”运算符,故A错误,C选项中int18.5%3应该为(int)18.5%3;D选项中赋值运算符的左边不能是表达式。18.【B】46 培恩IT教育系列教材-习题详解-www.born365.cn19.【B】分析:B选项中八进制中不能出现数字8。20.【D】分析:十六进制数只能以0X或0x开头,不能以oX开头。21.【C】分析:本题考查指数的表示形式,选项A中E后面只能是整数,0.5是小数;选项B中E后面不能为空;选项D中E前面不能为空。22.【C】分析:本题考查指数的表示形式,选项A中E后面只能是整数,5.0是小数;选项B中E前面不能为空;选项D中E后面不能为空。23.【A】分析:选项B中八进制中不能出现数字8,选项C中e后面不能是小数,选项D中e后面不能为空。24.【B】分析:选项B中e后面是小数0.4,所以非法。25.【B】分析:字符是用""括起来的单个字符字符常量是,B选项其实是一个转义字符。26.【B】分析:选项B中e后面只能是整数,0.5是小数。27.【D】分析:选项D中赋值运算符的左边不能是表达式。28.【C】分析:选项C中E后面只能是整数,0.5是小数。29.【D】分析:3.6-5/2+1.2+5%2=3.6-2+1.2+1=3.8,本题目考察算术运算符,需要注意整数除以整数结果只能是整数。30.【C】分析:①a+=a-=9a=3②a+=-6a=-6③a=a+(-6)a=-1231.【A】分析:A选项中最右边的赋值符号的左边不能为表达式,只能是变量,故A不正确。32.【A】分析:本题考查C语言中的注释,程序中以“/*”开头并且以“*/”结尾的部分表示程序的注释部分。计算机运行程序时,完全不理会程序的注释部分,这部分将被完全忽略掉。因此/*给a赋值b=20;给b赋值*/不被运行,所以a=10,b=0;答案为A。33.【B】分析:选项A中n2没有定义,选项C中在定义f之前不能使用它,选项D中E后面必须是整数。34.【C】分析:选项C的强制类型转换int(f)应该为(int)f。35.【D】分析:本题考查自增(自减)运算符:自增运算符在变量之前时,变量的值加1,表达式的值为变量的值加1,自增运算符在变量之后时,变量的值加1,表达式的值为原变量的值。自减运算符类似。①printf("%d%d",++m,n++);输出的值为1334m=13n=35②printf("%d%dn",--n,--m);输出的值为3412n=34m=1246 培恩IT教育系列教材-习题详解-www.born365.cn36.【C】分析:A选项中%的运算对象只能时整数;B选项的赋值运算符的左边不能是表达式;D选项的赋值运算符的左边不能是表达式。37.【B】分析:语句必须以;结束,而A选项没有 ;号;C选项没有赋值符号=,因此不构成赋值表达式;D选项的强制类型转换应该为(int)(a+b)。38.【B】分析:本题考查运算规则,*和/运算符的运算规则为从左到右运算。当/运算符的运算对象为整型时,结果一定为整型,所以1/2=0。39.【D】分析:自加、自减运算符的运算对象可以是char型变量、int型变量和float型变量,但不能是常量。40.【A】41.【B】分析:当运算符/的运算对象都是整型时,结果一定是整型,所以8/5=1,1+0.4结果为1.4,当1.4赋值给c时,因为c是整型,只能存储整型数据,系统会自动将.14转换为整型数据1,再将1赋值给c,答案为B。42.【D】分析:(int)a+b/b=(int)5.5+2.5/2.5=5+1.000000=b=6.000000,答案为D。43.【D】分析:当/运算符的运算对象为整型时,结果一定为整型。y=x+3/2=x+1=3.000000。答案为D。44.【A】分析:1.0/c2*c1=1.0/2*1=0.5*1=0.5,由于c3为整型,0.5转换为0,再赋值给c3,所以c3的值为0。45.【D】46.【A】分析:本题考点与第35题类似,x++*1/3=11*1/3=3。47.【D】分析:D选项中的$不是标识符的合法符号,标识符只能有字母、数字和下划线组成。48.【A】分析:因为赋值运算符的左边不能是表达式,B和C选项错误;D选项中的强制类型转换int(x)应该为(int)x。49.【C】50.【A】分析:本题考查转义字符。转义字符是用“”后面跟八进制或十六制数来表示一个字符。51.【C】分析:本题考查十进制和十六进制之间的转换。52.【D】分析:通过#defined2,d为一常量,由于自增(自减)运算符的运算对象不能是常量,所以答案为D。53.【C】分析:根据各进制数的规则很容易得出答案。54.【A】分析:A选项应该为"\",具体查看书本上的转义字符。55.【D】分析:与第54题类似,具体查看书本上的转义字符。56.【D】57.【C】46 培恩IT教育系列教材-习题详解-www.born365.cn分析:字符常量是""括起来的单个字符或转义字符。二、填空题1.8.9分析:7+3.8/2=7+1.9=8.92.关键字预定义标识符用户标识符3.84.八十十六5.intfloatdouble6.1617分析:本题考查自增运算符,a++表达式的值是a变化之前的值,a变量本身加1。46 培恩IT教育系列教材-习题详解-www.born365.cn第二章顺序结构一、填空题1.【B】分析:A选项,printf函数可以没有输出项,当没有输出项时,函数输出“”括起来的字符串;C选项,在C语言中,整数可以以十进制、八进制或十六进制的形式输出,但不能以二进制的形式输出;D选项,调用getchar函数读入字符时,只能从键盘上输入字符。所以答案选B。2.【C】分析:C选项错误:随意使用空语句将会导致逻辑错误。3.【D】分析:在C语言中,所有的变量都必须先定义后使用,而在本程序中,变量π在使用之前没有定义,所以会出现编译错误,答案为D。该程序的修改有两种方法:1、在定义变量s时,同时定义变量π,并初始化为3.14;2、在程序最前面使用宏定义#defineπ3.14。4.【D】分析:该printf函数的输出项为逗号表达式,根据printf函数的定义,没有语法错误;在上一章,我们学习了,逗号表达式的值为最后一个表达式的值,所以表达式(x,y)的值为y的值,即2003,因此答案为D。5.【A】分析:本题主要考查数据的表示方式,和printf函数的格式控制。%d表示以十进制输出数据,%o表示以八进制输出数据,m的值是以十进制表示的,所以以原样输出,n的值是以八进制表示的,所以也以原样输出,答案为A。6.【C】分析:同上题一样,本题也是考查数据的表示方式,和printf函数的格式控制。%X表示以十六进制输出数据,通过计算,m的值为十六进制的0,所以答案为C。通过该题我们必须注意一点,不管以十进制、八进制还是以十六进制输出数据时,数据前面不会有0、0x。7.【B】分析:本题考查自增、自减运算符,以及printf函数的输出项。从printf函数的一定可以知道,当输出项为表达式时,输出该表达式的值;自加(自减)在变量之前时,表达式的值为变量加1以后的值,自加(自减)在变量之后时,表达式的值为变量的原始值,答案为B。8.【C】分析:本题考查点与第5、6题类似,只是n的值是以十进制表示的,但却是以八进制输出的,所以要先转化为八进制,即为0400,所以答案为C。9.【B】分析:printf函数的定义:当输出格式说明个数少于输出项时,那么多余的输出项不输出。所以只输出666,答案为B。10.【C】分析:012转为十进制为10,再以指定的两位格式输出为10;十进制102有三位,指定位数是两位。当指定格式的位数少于输出数据的位数时,按实际数的位数输出,即输出102,答案为C。11.【B】分析:①a=f/=c*=(x=6.5)②a=f/=c*=6.5x=6.5③a=f/=65c=65④a=100.0/65=1f=100.0/65=1.5⑤a=1,c=65,f=1.5,x=6.546 培恩IT教育系列教材-习题详解-www.born365.cn12.【B】分析:本题考查长整形变量的输出格式。%和d中间必须加l(L的小写)。13.【C】分析:①m=(k+=i*=k)②m=(k+=i=2*2=4)i=4③m=(k=2+4=6)k=6④m=6答案为C。14.【C】分析:同10题类似,当指定格式的位数少于输出数据的位数时,按实际数的位数输出,即输出1234。答案为C。15.【D】分析:自加(自减)运算符,根据“符号在前,先加减后使用;符号在后,先使用后加减。”进行计算①x=-m++x=-3,m=4②x=x+8/++n③x=-3+8/5=-2④x=-2答案为D。16.【D】分析:从scanf函数的定义可以得出答案。17.【A】分析:在scanf()函数中,“”括起来的格式说明中,除了输入格式控制之外,其它的都要原样输入,所以答案为A。18.【A】分析:本题考查的与第17题一样,在scanf()函数中,“”括起来的格式说明中”,”要原样输入,所以答案选A。19.【C】分析:本题考查运算符的优先级和简单的编程思想,大家通过答案反过来推敲以知道如何形成解决一个问题的编程思想。20.【A】分析:由getchar()函数的定义可得知答案,请大家理解透该函数的定义。21.【A】分析:用scanf()函数输入字符型数据,当输入格式为%d时,等于输入以该整型数据为ASCII码值的字符,所以答案为A。22.【B】分析:A:main()函数后面不能有;号;C:注释以/**/成对括起来的;D:命令行必须以#号开始。所以答案为B。23.【C】分析:本题考查的知识点与第17、18题一样,只不过时一种逆向思维。24.【B】分析:输入的是876543.0,由于输入格式说明中指定了a的位数为两位,所以计算机会把87分配给a;接着计算机继续把6分配给b,由于6后面输入的是空格,计算机认为分配结束.同时把6转为6.000000(b是实型变量)25.【A】分析:本题与第7、15题类似。46 培恩IT教育系列教材-习题详解-www.born365.cn26.【D】分析:在prinf()函数的格式控制中,两个连着写的%,计算机会输出一个%,接下来的d原样输出。所以答案为D。27.【B】分析:该题是考查scanf()函数的输入格式控制,以及后面的数组的知识,将在后面详细讲解。28.【A】分析:此题不好解析,大家只要记住这一点,并在以后学习过程中注意就可以了。29.【A】分析:scanf()函数的定义:输入项为变量的地址,所以选项A,B错误;本题还牵涉到指针变量的概念,后面将会学习到,变量d其实是一个指针变量,指针变量其实就是储存一个变量的地址,所以选项B错误。30.【D】分析:此题和第7题类似。31.【D】分析:此题考查自减运算符、逗号运算符和printf()函数的概念,前两个知识点,在前面的题目中,我们已经讲述过了;当printf()函数的输出项为表达式时,输出的是该表达式的值,对于表达式z+1的值为3,所以答案为D。32.【B】分析:本题只要很好地理解scanf()函数的定义,很容易得出答案。33.【A】分析:本题有误:“不正确的输入形式”应该改为“正确的输入形式”。只要很好地理解scanf()函数的定义,很容易知道答案为A。本题还考查了一个知识点,那就是分隔符,在C语言中,有三类分隔符,分别是:回车、空格和tab键。34.【D】分析:先计算a*a的值为9,再计算a-=9(此时a的值是3),计算后a的值为-6,整个表达式(a-=a*a)的值是-6,然后计算a加上表达式的值(此时a的值为-6),输出结果为-1235.【A】分析:表达式c-25相当于字符c的ASCII值减25,当以%c的格式输出时,相当于输出ASCII值为c-25的字符,所以答案为A。36.【B】分析:gets()函数可以从键盘读入含有空格字符的字符串,它以回车为输入结束的标志。37.【C】38.【C】分析:由于x为int型变量,所以x=1.2后,x的实际值为1;由于y也是int型变量,所以y=(x+3.8)/5.0后,y的值为0。因此d*y的值为0,答案为C。39.【A】分析:此题考查算术运算符号“/”的使用,由于“/”的运算对象为整型,所以其结果只能是整型,20/3=6,答案为A。40.【A】分析:与第35题类似。41.【B】分析:printf()函数的定义:“”括起来的部分除了%d之外其它的原样输出。42.【C】分析:本题考查转义字符,"b"是退格符,所以遇到"b",就会把前面一个字符删除掉,"、\为转义字符,分别输出"和,所以答案为C。43.【C】46 培恩IT教育系列教材-习题详解-www.born365.cn分析:本题不好用文字表述,请大家通过编译器调试看结果,并记住这个知识点。二、填空题1.88分析:0210转为十六进制为882.1分析:本题涉及到第三章选择结构的内容,将在第三章讲述。3.220.000000分析:①x=f*=n/=(c=50)c=50②x=f*=n/=50③x=f*=2n=2④x=20.0f=20.0本题需要注意的地方,当以%f格式输出的时候,小数点后保留6位。4.11分析:9转为8进制是115.252137分析:本题考查十进制、八进制和十六进制之间的相互转化,输出格式中的空格对应输出。6.7分析:a="H"-"A"+"0"a=7+"0",所以以%c格式输出时,结构为字符7。7.1B分析:运行a=getchar();scanf("%d",&b);后,a="B",b=33,其它的运算和第6题类似。8.n1=%dnn2=%d分析:从输出结果中可知:n1=n2=必须在相应位置输入,并且输出n1后要换行。这种题目在考试时(笔试和机试)经常出现,大家一定要多加训练。9.i=10,j=20回车分析:scanf()函数中,除了%d之外,其它的都要原样输入。10.B66分析:字符A的ACSII码值为65,所以字符B的ACSII码值为66,当以%d格式输出ch时,即输出66。11.b分析:相同字符的小写的ACSII码值比大写的ACSII码值大32。12.261分析:177转为8进制是26113.-3分析:%运算符的操作必须时整数(正整数和负整数)。14.16分析:赋值运算符的运算规则为从左往右。①a+=(a=8)②a+=8a=8③a=1615.2,1分析:①a=a+ba=3b=2②b=a-ba=3b=1③a=a-ba=2b=1该类题必须小心,千万不能忘记“,”号,否则为0分。16.1030046 培恩IT教育系列教材-习题详解-www.born365.cn分析:%*d表示忽略一个数的输入,10赋值给i,20被忽略,30赋值给j,而k未获得新的值,保持原值0,所出输出10300。17.12分析:输入时,12分析作为字符"1"和"2"赋值给ch1和ch2。46 培恩IT教育系列教材-习题详解-www.born365.cn第三章选择结构一、选择题1.【B】分析:此题主要考察逻辑运算。首先x=1,y=1,那么!x为0,y--是--在后,则先使用后自减,y的值就是表达式y--的值,为1。因此!x||y--等价于0||1,结果为1。2.【D】分析:此题主要是考语句的特征。一条语句只包含一个分号,D项有两个分号,应该是两条语句,所以选D。if(b==0)m=1;是条if语句,n=2;是条赋值语句。3.【D】分析:此题主要是考逻辑运算和关系运算的优先级别.掌握!、算术运算符和&&的优先级别依次降低。4.【A】分析:此题主要是考了逻辑、关系和算术运算,熟练掌握逻辑运算、关系运算和算术运算的优先级别后,就不难了。A选项中!a为0,所以!a==1为假,那么就不用计算&&后面的表达式了,因为0“与”任何数均为假;B项中先计算出aa为真,所以(n=b>a)为1,那么将不会去计算m=ab>c的值为0,所以不执行其后的语句;在判断第二个条件,c-1>=d46 培恩IT教育系列教材-习题详解-www.born365.cn表达式的结果为真,所以执行其下面的语句,那么将输出d+1的值为3,所以选答案B。14.【D】分析:此题主要考查if,else的配对问题。这里在if后面跟了两条语句,其中第一条是if的子句,第二条是条独立的语句,这样第二条语句就夹在了if和else之间,使得else找不到和它配对的if。所以程序会出错。15.【C】分析:请大家记住:else总是和之前与其最近的且不带else的if配对。16.【A】分析:此题考查的是条件表达式的求解顺序。参照附录可知,它的结合方向是自右至左,所以先求得右边一个条件表达式的值为2,再求得左边一个的值为1,即选A。17.【B】分析:此题考查的是条件表达式求解问题。先看第一个条件表达式语句,ac为假,所以条件表达式等价于k=k;所以答案选B。18.【C】分析:此题考查的是真假条件的等价问题。x-y为真表示x-y是非0的,也即x-y<0或x-y>0。所以答案选C。19.【C】分析:此题主要是考查条件表达式和条件运算符。首先求括号内条件表达式a>c?a:c的值为c,那么整个表达式就等价于d=a>b?c:b;求解这个条件表达式得d=c,所以答案选C。20.【D】分析:此题主要是考查在switch语句中break和default的作用及break的适用范围。break语句可以在switch语句中使用也可以在循环结构中使用,只能在这两个地方使用。switch语句中可以有default也可以没有。switch语句中可以有break语句也可以没有。21.【D】分析:此题主要考查switch语句的语法规则。A选项错在swich(a+b);这里多了一个分号。请大家注意switch后圆括号中的表达式的值必须是整型或字符型,不能为实型。B选项错在有两个case3。C选项case后面只能是常量表达式,而这里出现变量,所以错误。答案选D。22.【C】分析:同21题。23.【A】分析:此题主要考查if和else配对问题。此题关键就是else是与第二个if配对组成一条if-else语句。因此首先判断a>b为假,那么跳过其子句,即if-else语句,直接执行最后一条printf语句,将d输出。因此答案选A。二、填空题1.10200分析:此题多数同学会得到的答案是10201,显然是没有弄清楚第三条赋值语句:c=(a%b<1)||(a/b>1).这是将后面一个逻辑表达式的值给c。先计算第一个圆括号里面的内容,a%b的值是10(而不是0),所以10<1为假;a/b的值为0,0>1为假。在逻辑或运算的时候,两个运算对象都为假,则结果为假。所以c的值为0.答案是:102002.0分析:此题主要考查关系表达式。我们主要就是要计算a>b>c的值,首先a>b为真,其值为1,那么1>c为假,所以整个表达式为假,其值为0。所以d为0。3.585858分析:此题考查if语句。首先scanf语句使a的值为58,接着执行后面三条if语句,这三个if46 培恩IT教育系列教材-习题详解-www.born365.cn结构是相互独立的,是互不相关的,只要他们的条件成立,就要执行其子句。a>50、a>40、a>30、都为真,所以执行printf三次,a被输出3次。4.yes分析:此题考查if-else语句。赋值表达式c=a+b的值就是左边变量的值,为4,那么表达式为真,所以执行其后的printf语句,将yes输出。5.20,0分析:此题关键点if的子句只能是一条语句或一条复合语句,表达式x==y为假,跳过if子句t=x;,接着继续执行x=y;y=t;,因此最后x为20,y为0。6.4,5,99分析:同上题。7.-4分析:此题考查if语句。首先第一条if语句n=0那么!n为真,执行x-=1;使x值为1,接着第二条if语句m为1条件为真,执行x-=2;使x值为-1,再执行第三条if语句,x为-1条件为真,执行x-=3;使x值为-4。最后执行printf将-4输出。8.4分析:从键盘得到x的值为5,那么判断表达式x--<5,x--的值为5,所以为假,判断了之后x的值变为4。此时执行else子句,将x++输出,为4。9.3分析:此题主要考查条件运算符。程序要输出(P/3>0?p/10:p%3)这个条件表达式的值。P为30,所以p/3=10,10>0显然为真,所以整个表达式的值应该是p/10的值,p/10得3。10.1分析:此题考查if-else语句。因为a为5,a!=0为真,所以p=a!=0等价与p=1,整个表达式p=a!=0为真,执行if子句,将p输出,输出为1。11.21分析:此题考查switch语句的嵌套。x为1,则外层switch语句选择case1,case1又是一个switch语句,y为0,执行case0的a++使a的值变为1,然后执行break语句跳出内层的switch的语句,接着执行外层switch语句的case2,a++;b++;使a的值变为2,b的值变为1,然后执行break语句跳出外层的switch语句。最后执行printf语句将a,b输出,输出为21。12.a+b>c&&a+c>b&&b+c>a分析:此题是逻辑预算和if语句的结合。题目的提示很明显,构成三角形的条件是需要同时满足三条件:a+b>c,a+c>b,b+c>a,程序中的if的条件就是构成三角形的条件,所以我们填入a+b>c&&a+c>b&&b+c>a。这里大家注意同时满足条件我们需要用与逻辑,任意满足一个条件我们需要用或逻辑。46 培恩IT教育系列教材-习题详解-www.born365.cn第四章循环结构一、选择题1.【A】分析:此题考查while循环。第一轮循环,k的值为5,进入循环,(--k)表达式的值为4(真),同时k的值改变为4,输出表达式k-=3的值1,同时k的值为1。第二轮循环,k为1,表达式(--k)的值为0,结束循环。所以选A。2.【C】分析:此题是条件等价的问题。当E不等于0是条件为真,E等于0时条件为假。因此只有E==0不符合上述条件。所以答案选C。3.【B】分析:此题考查while循环。第一轮循环,n为9,n>6为真,执行n--;使n值变为8,接着执行printf语句输出8。第二轮循环,n为8,n>6为真,执行n--;使n值变为7,接着执行printf语句输出7。第三轮循环,n为7,n>6为真,执行n--;使n值变为6,接着执行printf语句输出6。此时n为6,n>6为假,结束循环。所以选B。4.【D】分析:此题是while循环和switch语句的结合。第一轮循环,k为5,k>0为真,执行switch语句,没有case5,所以执行default的break语句跳出switch语句(注意是跳出switch语句),接着执行k--;使k值变为4。第二轮循环,k为4,k>0为真,执行switch语句,没有case4,所以执行default的break语句跳出switch语句,接着执行k--;使k值变为3。第三轮循环,k为3,k>0为真,执行switch语句,执行case3的n+=k;使n值变为3,接着执行k--;使k值变为2。第四轮循环,k为2,k>0为真,执行switch语句,执行case2没有任何语句,那么什么都不做,因为没有break语句所以要继续执行case3的n+=k;使n值变为5,接着执行k--;使k值变为1。第五轮循环,k为1,k>0为真,执行switch语句,执行case1的n+=k;使n值变为6,因为没有break语句所以要继续执行case2(什么都不做),和case3的n+=k;使n值变为7,接着执行k--;使k值变为0。此时k为0,k>0为假,跳出循环,执行printf语句,将n输出,为7。所以答案选D。5.【A】分析:此题是考查while循环。第一轮循环,x为0,y为5,z为3,(z>0&&x<4)为真,执行y=y-1;、z--;、x++;三条语句,y值为4,z值为2,x值为1。第二轮循环,(z>0&&x<4)为真,执行y=y-1;、z--;、x++;三条语句,y值为3,z值为1,x值为2。第三轮循环,(z>0&&x<4)为真,执行y=y-1;、z--;、x++;三条语句,y值为2,z值为0,x值为3。此时(z>0&&x<4)为假,跳出循环,执行printf语句,将x,y,z输出,所以答案选A。6.【D】分析:while循环,do-while循环,for循环三种循环可以相互转换。do-while循环,在while后的表达式为零时结束循环,使用break语句也可以强制结束。7.【C】分析:此题考查do-while循环。do-while循环一定会先执行循环体一次,执行printf语句,x-=2的值为1,输出为1。此时--x的值为0,x的值变为0,所以!(--x)为真。进入第二轮循环,执行printf语句,x-=2的值为-246 培恩IT教育系列教材-习题详解-www.born365.cn,输出-2。此时--x的值为-3,所以!(--x)为假。跳出循环。所以答案选C。8.【B】分析:此题考查do-while循环。因为循环体中有语句s+=1;,s的初值为0,若要使程序的输出值为2,那么循环体要执行两次。因此在第二轮循环结束后,a!=n因该为假,执行两次循环就是执行a=a-2;两次后a的值为-3,所以n的值应为-3。答案选B。9.【C】分析:此题考查for循环。i为1,i<6为真,执行sum+=i;,此时大家注意sum没有初值,所以得到不确定的值,此后不论循环怎么执行sum的值都为不确定,所以答案选C。10.【D】分析:变量i每次增量为2,变化过程为:1->3->5->7->9,语句s+=i+1每次执行使s增加的数为:2,4,6,8,10,所以s的值为自然数1~10中偶数的值。11.【B】分析:B选项每次进入循环体,都要先执行p=1;即1赋值给p.所以不能求出5!的值。12.【C】分析:C项s=s+1/n,1/n首先运算,n为整型变量,1也是整型变量,当n=2…10时,1/n的值都为整数0,故C不正确。13.【C】分析:本题考察点在for循环的基本概念和switch语句的基本知识。构成for循环的循环体的是一个switch语句。首先i的值为0,进入第一轮循环。在switch语句中,符合case0的条件,输出i的值,即输出一个0。根据switch语句的性质,在case后面没有break语句,还要继续完成下面的case后的各个语句,直到遇到break或者switch语句结束为止。因此还需要完成case2后面的输出,再次输出一个0,同理,default后面的输出i也要执行。第一轮循环输出了000。i自加为1,进入第二轮循环。没有匹配的case,执行default后面的输出。第二轮循环输出了一个1。i自加为2,进入第三轮循环,执行case2后面的输出,并执行default后面的输出。第三轮循环输出了22。i自加为3,i<3为假,跳出for循环。因此,程序最后输出的结果是000122。答案选择C。14.无分析:此题分析同13题。有印刷错误,最后答案为41。没有这个选项。15.【D】分析:变量i的值为0,执行while循环,表达式(i<10)为真,进入循环体,执行if(i<1)continue;表达式(i<1)为真,执行continue;提前结束此轮循环体的执行(后面两语句不执行),再判断表达式(i<10)的值,为真,进入循环体,执行if(i<1)continue;因为i的值为0,没改变,表达式(i<1)仍为真,执行continue;提前结束此轮循环体的执行(后面两语句不执行),再判断表达式(i<10)的值,为真,进入循环体……。就这样程序一直执行循环,进入死循环。16.【D】分析:首先for(;;)三个表达式都缺省,那么循环无条件执行。第一轮循环,i为0,i==3||i==5为假,i==6也为假,执行i++使i变为1,执行s+=i使s变为1。第二轮循环,i为1,i==3||i==5为假,i==6也为假,执行i++使i变为2,执行s+=i使s变为3。第三轮循环,i为2,i==3||i==5为假,i==6也为假,执行i++使i变为3,执行s+=i使s变为6。第四轮循环,i为3,i==3||i==5为真,执行continue会提前结束此次循环体的执行,不会结束整个for语句的执行。此后的分析同15题。46 培恩IT教育系列教材-习题详解-www.born365.cn17.【A】分析:此题while循环嵌套了for循环。第一轮循环,i为0,i<20为真,进入for循环无条件执行,i%10==0为真,执行break语句结束整个for循环。接着执行i+=21使i变为21,执行a+=i使a变为21。第二轮循环,i为21,i<20为假,循环结束。所以答案选A。18.【C】分析:此题题目印刷有问题。应该是i++%5==0,++i%8==0此题的分析思路应该是只有当i++%5==0,++i%8==0都为真的时候才会将i输出。我们对四个选项进行分析,如果A选项24正确,那么因为判断的时候i自加了两次,所以i进入循环体的值为22,那么i++%5==0就为假了。所以A选项不对。分析C选项32,那么进入循环时,i为30,则i++%5==0,++i%8==0都为真,所以答案选C。19.【B】分析:此题是for嵌套。每执行一次最外层的for(i=1;i<=4;i++)这个循环就输出一行,内层第一个for循环for(j=1;j<=4-i;j++)printf("");是输出此行的空格,内层第二个for循环for(j=1;j<=_______;j++)printf("*");是输出此行的*号。第一行应该是先输出3个空格,然后输出一个*号,最后输出换行符。那么分析第一行i为1,进入内层第一个for循环,那么for(j=1;j<=4-i;j++)等价于for(j=1;j<=3;j++)可以看出循环执行三次,输出三个空格。进入第二个for循环for(j=1;j<=_______;j++)它只执行一次,空白处值应为1。依此分析后面三行,空白处值应分别为3、5、7。所以答案选B。一、填空题1.y=-1分析:本题需要注意的是while(y--)后面紧跟一个分号,它表示while循环的循环体部分是一个空语句,而不是printf语句。考察点在循环结束的标志,应特别加以注意。(1)程序首先将y的值初始化为10。进入while循环后,表达式y--的值为10,即为真,执行空循环体,此时y的值为9。第一轮循环结束。(2)进入第二轮循环,y--的值为9,表达式仍然为真,继续执行空循环体,此时y的值为8。第二轮循环结束。(3)如此反复,直到进入第十轮循环。y--的值为1,表达式为真,继续执行空循环体,此时y的值为0,第十轮循环结束。(4)进入第十一轮循环,y--的值为0,表达式为假,不执行空循环体,此时y的值为-1,跳出while循环。最后得到y的值为-1。2.8921分析:从键盘上输入1298,n2为1298,进入while循环。第一轮循环,n2!=0为真,进入循环体,执行n1=n2%10使n1赋为8,执行n2=n2/10使n2赋为129,将n1输出,输出8。第二轮循环,n2!=0为真,进入循环体,执行n1=n2%10使n1赋为9,执行n2=n2/10使n2赋为12,将n1输出,输出9。第三轮循环,n2!=0为真,进入循环体,执行n1=n2%10使n1赋为2,执行n2=n2/10使n2赋为1,将n1输出,输出2。第四轮循环,n2!=0为真,进入循环体,执行n1=n2%10使n1赋为1,执行n2=n2/10使n2赋为0,将n1输出,输出1。此时n2!=0为假,循环结束。输出为8921。3.0分析:i的值从5变化到0时,for语句中的第二个表达式都为真。t=5*4*3*2*1*0=0。46 培恩IT教育系列教材-习题详解-www.born365.cn4.5分析:for循环语句的循环体是空语句;第一轮循环,s为0,i为1,i<3为真,执行空语句,然后执行i++使i变为2,s+=i使s变为2。第二轮循环,s为2,i为2,i<3为真,执行空语句,然后执行i++使i变为3,s+=i使s变为5。此时i<3为假,循环结束。输出s为5。5.6分析:此题属于循环的嵌套。当i=1时,j<=i为假,输出0个#号,当i=2时,j<=2,内存循环执行一次输出1个#号,依此分析,当i=3时,输出2个#号,当i=,4时,输出3个#号,共输出6个#号。大家特别注意每次进入内层循环j都没有赋初值为2。6.i<10j%3(或j%3!=0)分析:从j=i*10+6可以看出当i从1变化9时,就把100以内个位数为6的所有整数都选出来了。if( )continue;这条if语句很明显是判断是否能被3整除,如果不能则执行continue,去判断下一个数。所以填入条件j%3(或j%3!=0)。7.132分析:m=0,n=0,k=0,i=9第一轮循环,当i值为9时,i<=11为真,执行switch语句,(i/10)的值为0,匹配case0,执行m++,n++,再执行break语句,跳出switch体,再执行i++,i值为10;此时m值为1,n的值为1,k的值为0。第二轮循环,当i值为10时,i<=11为真,执行switch语句,(i/10)的值为1,匹配default,执行k++,n++,结束switch体,执行i++,i值为11.此时m值为1,n的值为2,k的值为1。第三轮循环,当i值为11时,i<=11为真,执行switch语句,(i/10)的值为1,匹配default,执行k++,n++,结束switch体,执行i++,i值为12.此时m值为1,n的值为3,k的值为2。此时i值为12,i<=11为假,循环结束。输出为132。8.17分析:首先x为15,x>10&&x<50为真,执行x++使x变为16,x/3为3,为真,执行x++使x变为17,执行break语句结束整个while循环。将x输出为17。9.j>0或j>=1i分析:此题是循环嵌套。外层的这个for(j=4;;j--)循环,控制输出的行数。输出为4行,所以填入j>0或j>=1。内层的for(i=1;i<=4;i++)循环控制每行的元素个数。x=(j-1)*4+;这条语句就是要求出每个元素的值。当j从4变化到1时,(j-1)*4的值分别为12,8,4,0。从元素的值可以看出每行的元素都是依此增1,正好符合i的变化规律,所以第二空填入i。46 培恩IT教育系列教材-习题详解-www.born365.cn第五章指针一、选择题1.【C】分析:+运算符对指针没有意义。2.【A】分析:p,q是指针变量存放着n2,n1的地址。*p等价于n2,*q等价于n1。所以与n2=n1;语句等价的是*p=*q;3.【B】分析:p是指针变量存放着x的地址。*p等价于x。因此输出*p就是输出x的值为0。4.【D】分析:此题考查类型是否符合的问题。我们之前学过的整型,实型,字符型变量都是值级别的变量,存放的是一个值。而今天学习的指针变量是存放地址的变量,是地址级别的变量。p是地址级别,*p等价于n就是值级别了。所以只有D错误,p为地址级别,n是值级别。之后我们还会遇到地址的地址级别。5.【D】分析:同第3题6.【A】分析:NULL就是0,内存单元最开始的地方,地址为0的那一点,它没有对应的内存单元。7.【C】分析:A,B选项错在,定义了指针,但是没有初始化就使用,也就是说你并不知道这个指针指向哪个内存单元,就想通过指针访问该内存单元。D选项错在s=p;这里s和p的类型不一致。8.【B】分析:p指向a,*p等价于a为10,所以a=*p+b;等价于a=10+1;。答案选B。9.【D】分析:A,B选项错在,NULL是一个特殊地址,它是地址为0的那一点,它没有对应的内存单元,因此不能通过NULL访问到内存单元。C选项错在*c是值级别了不能存放地址。D答案这个转义字符就是0的意思,L=""等价于L=NULL。正确。10.【B】分析:同第2题。11.【C】分析:此程序定义了两个整型变量a和b,并且定义了三个基类型为整型的指针变量p、q和r。然后将整型变量a的地址赋给指针变量p,将整型变量b的地址赋给指针变量q。接下来,语句r=p;是将指针变量p中存放的地址赋给指针变量r,则指针变量r也存放了整型变量a的地址,然后语句p=q;是将指针变量q中存放的地址赋给了指针变量p,则指针变量p中存放的是整型变量b的地址,即指针变量p指向了整型变量b,语句q=r;是将整型变量a的地址赋给指针变量q,则指针变量q指向了整型变量a。最后通过printf语句依次输出指针变量p,q所指向的存储单元中的值和变量a,b中的值,应为8,7,7,8。12.【A】分析:scanf函数的数据列表中的数据要求是地址量,只有A符合。a,*pa是值级别的量,&pa是地址的地址。13.【D】分析:同第4题。14.【D】分析:double类型应该对应%lf所以B选项错误。*p=&a;类型不匹配,A选项错误。scanf46 培恩IT教育系列教材-习题详解-www.born365.cn函数的数据列表中的数据要求是地址量,C选项错误。15.【C】分析:定义了整型变量a,整形指针b和指针的指针变量c。b中存放着a的地址,c中存放b的地址。所以*c等价于b,那么**c等价于*b等价于a。16.【A】分析:同第6题和第9题。17.【C】分析:p1、p2、p中分别存放着a、b、c的地址。因此*p1等价于a,*p2等价于b,*p等价于c。所以*p=*p1*(*p2)等价于c=a*b,c被赋为3。二、填空题1.k*k分析:scanf函数的数据列表中的数据要求是地址量,printf函数的数据列表中的数据要求是值级别的量。2.07分析:p1存放的是k的地址,所以p1==&m为假,a被赋0。*p1等价于k,*p2等价于m,所以(*p1)/(*p2)+7等价于k/m+7,k,m都为整型k/m为0,b被赋7。46 培恩IT教育系列教材-习题详解-www.born365.cn第六章数组一、填空题1.【B】分析:此题考查一维数组的定义。一维数组的定义,其数组长度即方括号中必须为常量,不能为变量,例如选项C,D。一维数组在定义并且初始化时可以省略数组的长度,但在单纯的定义时,数组的长度一定不能省,例如选项A。所以答案选B。2.【B】分析:此题是数组的简单引用。第一轮循环,i=0,判断i++<7成立,此时i变为1,进入循环体,但此时i=1,p[1]=12不满足if条件即p[i]%2为0,不执行j+=p[i]。第二轮循环,i=1,判断i++<7成立,此时i变为2,进入循环体,但此时i=2,p[2]=13满足if条件即p[i]%2为1,执行j+=p[i]。按照此方法,将整个while循环执行完,得到j=p[2]+p[4]+p[6]=45,即B正确。3.【A】分析:此题主要考查循环嵌套引用数组。第一个循环体执行完是将x[0],x[1],x[2],x[3]进行从大到小排序。第二个循环体执行完是将x[4],x[5],x[6],x[7]进行从小到大排序。4.【D】分析:此题同第二题很类似。首先i为0,i<7&&p[0]%2为真,执行k=k+p[0],即k=11,然后执行i++使i变为1,再进行判断,i<7&&p[1]%2为真,执行k=11+p[1],所以k=24,执行i++使i变为2,再进行判断,此时i<7&&p[2]%2为假,循环结束,输出k值,为24。5.【D】分析:此题是考查数组名是数组的首地址。p是一个指针变量,存放地址的,选项A,B,C都是将值赋给p,显然错误。D选项是a[2]的地址赋给p。所以答案选D。6.【B】分析:此题是通过指针来引用数组。由定义inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2;我们可知,p中存放了a[3]的地址,或者p指向了a[3],q中存放了a[5]的地址,或者q指向了a[5]。那么*p和*q就分别等价于a[3]和a[5],两着相加得10。所以答案选B。7.【C】分析:此题是指针,数组,循环的结合。首先p指向了a[1]。进入循环,x为1,x<3为真,执行y+=p[1];,此题的关键点就在这里p[1]等于多少?因为p指向了a[1],所以p[0]就等价与a[1],p[1]就等价与a[2],p[2]就等价与a[3],依次类推。所以执行y+=p[1]使y的值变6,然后i++使i变为2,x<3为真,执行y+=p[2];使y值变为14。所以答案选C。8.【A】分析:此题是指针,数组,循环的结合。第一轮循环,执行p=a;,那么p指向数组的a[0],p*s比较数组中两个数的大小。11.【A】分析:从函数调用f(a,3,7)可以看出,数组首地址a,整数3,整数7,分别传到形参b、m、n中。那么for(i=m;i="0"&&s[i]<="9"分析:程序的功能是将字符串s中的数字字符放入d数组中,通过for循环可以依次访问到字符串s的各个字符,if(){d[j]=s[i];j++;}这条if语句就是要判断这个字符是不是数字,如果是数字则将其放入d数组。最后补上一个"",才能用puts输出。9.p+n分析:while(p[n]!=c&&p[n]!="")n++;这个while循环就是如果没有找到要找的字符就将n自加。如果找到了就要使p指向这个字符,因此返回为p+n。10.*t分析:因为n=strlen(s);所以*(s+n)就是s所指字符串abcd的后面一个内存单元,根据题目的意思现在要将t所指的字符串接过来,所以*(s+n)=这里填入*t,后面s++;t++;使s和t都指向下一个内存单元。11.strlen(str)+str-1t==0huiwen(str)分析:回文即正向与反向的拼写都一样,p1=str;  p2= ;这条语句使p1为字符串的首地址,p2为字符串的末地址,所以填入strlen(str)+str-1。if(*p1++!=*p2--){  t=1;break;  }这条if语句就是如果正向与反向的拼写不一样,t被赋1。所以if()  return("yes!");这条if语句条件就是正向与反向的拼写是一样,返回yes!,所以填入t==0。最后一空就是调用函数huiwen,来判断从键盘输入的是不是回文。12.a*b*c*d*分析:在while循环中,str[2*i]=str[i];是将str[0]为astr[1]为bstr[2]为cstr[3]为dstr[4]为’/0’分别赋到str[0]str[2]str[4]str[6]str[8],然后str[2*i-1]="*"是将str[1]str[3]str[5]str[7]赋为"*"。所以答案是a*b*c*d*。46 培恩IT教育系列教材-习题详解-www.born365.cn第十章对C语言的深入讨论一、选择题1.【A】分析:C语言中用于结构化程序设计的三种基本结构是顺序结构、选择结构、循环结构。2.【C】分析:C语言以接近英语国家的自然语言和数学语言作为语言的表达形式。3.【B】分析:C语言中规定,C语言中没有逻辑类型但有集合类型。4.【C】分析:程序的含义表明将输入的参数命令行看作字符串,argc为5,argv[1],argv[3],分别指向字符串abcdh3。通过for循环将这个两个字符串的长度累加并存放到len中。所以答案选C。5.【C】分析:main()函数的参数通常是两个,第一个必须是int型,第二个必须是字符串的指针。6.【D】分析:int*f()表示返回值是指针的函数。如果是函数指针形式为int(*f)()7.【C】分析:对函数指针的定义和调用(*f)()都必须用这样的形式两个括号都不能少。8.【B】分析:此题是概念题,函数funA调用了函数funB,函数funB又调用了函数funA,称为函数的间接递归调用。9.【C】分析:此题是函数递归调用:fun(7)调用后等价于7-fun(5),又去调用fun(5),fun(5)又相当于5-fun(3)这时程序相当于计算7-(5-fun(3)),即7-5+fun(3),又去调用fun(3),fun(3)又相当于3-fun(1),程序相当于计算7-5+3-fun(1),结果为2。10.【A】分析:此题也是函数递归调用:x的输入值为10,调用fun(10),相当于以下过程:fun(10)=10+fun(9);10+fun(9)=10+9+fun(8)10+9+fun(8)=10+9+8+fun(7)10+9+8+fun(7)=10+9+8+7+fun(6)10+9+8+7+fun(6)=10+9+8+7+6+fun(5)..........10+9+8+7+6+5+4+3+2+fun(1)=10+9+8+7+6+5+4+3+2+1;结果为5511.【A】分析:A:正确,B:作用域没有发生变化。C:不一定。如静态变量。D:不相同。12.【C】分析:f()函数中的i是static类型,所以其值会保留为上一次起算的结果。13.【A】分析:形参的缺省存储类型auto型。14.【A】分析:malloc()函数的括号里是字节数,p是整型指针,所以函数返回值用(int*)强制转换为整形指针,B,C正确。calloc()46 培恩IT教育系列教材-习题详解-www.born365.cn函数第一个参数是单元的个数,第二个参数是单元的字节数,返回值强制转换为整形指针,D正确。15.【A】分析:指针p和q指向同一存储区域,因此,scanf(“%s%s”,p,q);实际是给一块内存区域进行了两次赋值,第一次赋值被第二次赋值覆盖了,所以值为def,因此输出为defdef.。16.【D】分析:见教材typedef的应用。17.【A】分析:可以用typedef将已存在的类型用一个新的名字来代表,但并不是增加了一种新的类型。18.【D】分析:A:预处理命令不一定要放在程序开头。B:一行只能有一条预处理命令。C:宏名可以小写,但一般用大写进行区别。D:正确19.【C】分析:此题注意宏替换一定要原样替换。f(x)为带参数的宏,f(8)相当于8*8=64,f(4)相当于4*4=16,同样f(4+4)相当于4+4*4+4=24,f(2+2)相当于2+2*2+2=8所以结果是4,3。20.【A】分析:此题同19题,还是注意原样替换。21.【C】分析:根据typel.h中的宏定义,N为5,所以M1为15。然后第二段程序包含了文件typel.h,所以其中的宏定义仍然有效,则M2为10。所以i为25。22.【B】分析:main函数可以在任何地方出现。程序有且只有一个main函数,程序从main函数开始执行。23.【B】分析:首先将s^=32表示成s=s^32;然后把s的值32转换为相应的二进制,即00100000,然后与32进行按位异或:00100000^0010000000000000结果转换为十进制,即为0。答案选择B。其实如果根据按位异或的性质:如果两个运算对象的值相等,按位异或的结果必为0。这样就能迅速完成这道题。24.【A】分析:a=7^3;首先把7和3均转换为二进制,分别得到00000111和00000011。再把两者进行按位异或运算:00000111^0000001100000100结果转换为十进制,即为4。b=~4&3;~的优先级高于&,先计算~4,得到11111011,再与00000011进行按位与运算:11111011&0000001100000011结果转换为十进制,即为3。答案选择A。25.【A】分析:同23题。26.【A】分析:a=4|3;首先把4和3均转换为二进制,分别得到00000100和0000001146 培恩IT教育系列教材-习题详解-www.born365.cn。再把两者进行按位或运算:00000100|0000001100000111结果为7。b=4&3;首先把4和3均转换为二进制,分别得到00000100和00000011。再把两者进行按位与运算:00000100&0000001100000000结果为0。答案选A.27.【D】分析:x,y都为整型所以x/y为1,转换为二进制为00000001。~z转换为二进制为11111110。00000001&1111111000000000所以答案选D。28.【D】分析:x中的值为10100111,那么2+x为10101001,~3为11111100,所以(2+x)^(~3)为:10101001^1111110001010101所以答案选D。29.【D】分析:0x3为十六进制,转换为二进制00000011,0x8为十六进制,转换为二进制00001000所以b=a|0x8为00001011,c=b<<1,b<<1即将00001011左移一位,得到00010110。答案选D。30.【C】分析:同第4题。31.【D】分析:宏替换一定是原样替换。N为5,M为6,f(2)等价与2×6为12,f(1+1)等价于1+1×6为7。32.【B】分析:m,i都是静态变量,第二次调用函数时不会对它们初始化。33.【C】分析:同26题。一、填空题1.findbig分析:这是利用函数指针调用函数的题目,函数名相当于函数的入口地址,函数指针应该存放被调用函数的函数名。2.c分析:c作为实参用作宏定义的参数,起到临时存放变量值的作用。3.3*sizeof(double)分析:malloc()函数是用来动态划分内存空间的,传递的参数是空间所占的内存大小,即字节数,按照题目要求分配3个double型的内存单元,应该填入3*sizeof(double)。4.!sknahT分析:T18.c文件包含了myfun.c文件,所以myfun.c文件中定义的fun()函数,可以在T18.c文件中调用。46 培恩IT教育系列教材-习题详解-www.born365.cn5.4分析:根据宏定义K为4.5,所以循环执行4次。46 培恩IT教育系列教材-习题详解-www.born365.cn第十一章结构体与共用体一、选择题1.【C】分析:C 题目中是使用了typedefstructNODE,那么我们一定要指导tepydef就是替代的意思。所以是用OLD来替代structNODE作为结构体的类型。同时我们要记住这里的NODE是可以省略的。2.【B】分析:本题是考查结构体的定义。A选项是我们一定要记住的,C选项中的x、y、z是写在结构体里面,所以它们都是结构体的成员,D选项中我们知道structex的组合是结构体的类型,这两个缺一不可。选项B中的example是结构体变量名,一般在右大括号后面的是结构体变量名。3.【B】分析:INTEGERp等价于int*p。所以B是正确的。INTEGER*q等价于int**q。4.【C】分析:在本题中TT为结构体名,用关键字typedef对结构体进行说明,CIN一个具体的结构体类型名等价于structTT,可以用CIN来直接定义结构体变量,而不用再写struct。A:答案不能用TT直接定义结构体变量,一般格式为(structTT结构体变量名);B:答案概念错误,D:答案CIN不是结构体变量,是一个具体的结构体类型名。5.【C】分析:本题和第一题类似,也是对结构体定义的typedef的考查,B中ST不是结构体类型了,被NEW替代了,选项D中我们知道NEW是一个结构体类型,所以不是结构体变量,当出现了typedefstruct这样的定义时,在右括号出现的NEW就是结构体类型,不是结构体变量了。6.【A】分析:由于typedefstructS是替换的意思,所以本题目中是用T来代替structS这个结构体类型,所以T的左右等于了structS的作用了,也就是可以用T来定义结构体变量,如Tborn中的born就是结构体变量。当然,structS就失去了原来的作用,不可以用来作结构体类型了。7.【C】分析:考查的是结构体变量的赋值,data是一个结构体变量,data是用两个域的,一个是a,一个是b。那么现在data.a是对a的引用,所以data.a的地址就是&data.a。那么p=&data.a;显然是正确的。8.【D】分析:这是一个给结构体赋值的简单实例,A:答案是给结构体数组中的成员s[0]中的字符数组name赋初值,s[0].name表示该结构体中字符数组的首地址,B:选项中表示给结构体数组s中的结构体s[0]中的age变量赋初值,C:答案中&(ps->sex)等价于将结构体指针变量指向的结构体s[0]中的成员sex并进行取址运算,等价于&s[0].sex;D:答案明显错误,不能给变量直接赋值,用scanf函数必须用取址运算,ps->age,在这里等价于s[0].age.9.【B】ptC[0]C[1](10,a)(20,b)(20)[1,2][3,4]ptC[0]C[1](10,a)(20,b)(20)[1,2][3,4]分析:本题和第八题是类似的,我们看到B项中的scanf("%s",&std.name);的&std.name它是scanf的第二个部分,它必须是地址,但是这个地方我们知道std是数组,所以不可以直接使用数组名std,B选项、选项C一样的使用数组元素&std[0].name才正确。10.【C】分析:第三题的结构我们可以用以下关系表示:ptC[0]C[1](10,a)(20,b)(20)[1,2][3,4]ptC[0]C[1](10,a)(20,b)(20)[1,2][3,4]46 培恩IT教育系列教材-习题详解-www.born365.cn选项A:实际上是将y指针变量所指向的数组a中的数组的第一个数字拿出来,所以a答案应该为1,选项B:是将pt结构体指针变量所指向的结构体数组c中c[0]的成员x的值取出来,所以我们可以知道选项B的结果为10;选项C由于指向运算符的优先级别高于自加运算,所以是pt结构体指针变量所指向的结构体数组c中c[0]的成员x的值自加之后的值结构为11;D选项结构体指针变量pt++表示将pt所指向的变量由c[0]改为c[1]的首地址,再将x的值取出来,由于x的值为20,所以答案D也可以排除。11.【D】分析:第11题的结构我们可以用以下关系表示:p20“200401”21“200402”22“200403stu[0]stu[1]stu[2]A:答案实际上是将p所指向的变量由stu[0]改为stu[1]的首地址,并将stu[1]中的成员num取出所以A答案的结果为字符串常量“200402”;选项B将p所指向的stu[0]中的成员num取出所以结果为字符串常量“200401”;选项C是将p所指向的首地址为stu[0]中的成员num取出所以结果为字符串常量“200401”,C选项中的括号不能省略;选项D中不存在结构体变量stu[3],所以不存在stu[3].age成员。12.【B】分析:由*p=data知道现在的p是指向了第一个结构体数组元素data[0]的,那么现在p->x就相当于是data[0].x,++(p->x)就相当于是++(data.[0].x),所以就是数值11。++在前面是先使用使data.[0].x自加1得到数值11,然后在把data.[0].x的现在的数值11作为整个自加表达式++(data.[0].x)的数值。13.【C】分析:本题和十二题有相似的考查点,p=aa;使结构体指针p指向了结构体数值的第一个数组元素aa[0],然后p->x等价于aa[0].x,那么++(p->x)等价于++(aa[0].x)的。所以这个地方是得到51,注意++在前和在后的区别。14【A】分析:这里考查了结构体的定义和赋值。首先从定义上知道,A和B是正确的,有typedef的话,STD才是结构体类型,所以才可以用STD来定义变量。然后看到结构体中的成员第二个是字符型的,所以赋值的时候要用单引号,所以B用的双引号就错了。15.【D】分析:本题主要是对链表的考察,答案A是将变量q->next的值赋值给p->next变量,q->next在这里指的是图中结构体指针变量r所指向的那个结构体变量存储空间的首地址,这时q->next变量中存储的事指针变量r所指向的那个结构体变量存储空间的首地址所以能够完成具体操作;答案B中p->next->next等价于变量q->next所以答案A、B是等价的;答案C直接将r所指向的那个结构体变量存储空间的首地址赋值给p->next变量,所以也能够完成具体操作,答案DP=q->next实际上不是删除节点的操作,不能将结点删除,只是改变结构体变量p所指向节点的首地址,实际上完成D答案的操作后将使结构体指正p、r指向同一个节点。16.【D】分析:本题实际上也是考查的链表,第一个元素是p,p->next=q;之后我们知道p的后面是元素q,根据q->next=r;我们知道元素q之后是r。p->num+q->next->num实际上就等价于p->num+r->num,所以结果可以知道是10+30=40。17.【CAB】分析:第一空是函数CreatList返回值得类型,我们可以从程序中得到返回值h46 培恩IT教育系列教材-习题详解-www.born365.cn为结构体指针变量,我们可以从程序中找到答案;第二空是给结构体指针p所指向的成员中的date变量赋值,这个值来自函数形参的传递值,所以我们选择答案A,结构体指针在这里只起一个传递的作用,具体结构如下图:第三空是在将新开辟的节点与链表联接后,将指针变量p所指向的首地址传递给结构体指针变量q,使结构体指针变量同时指向新开辟的单元的首地址,所以选B答案。lnextinextpqht18.【C】分析:我们知道union是共用体,共用体最大的特点是所有的成员都是在一个共同的区间的。所以这里成员n、c、都是在同一区间,现在将u1.c="A";这个共同的区间中实际上就是"A"的ASCII的数值,这里要看u1.n的数值实际上就是u1.c的数值,这里是以%c输出,所以就是字符A。19.【B】分析:本题考查的是共用体的知识,共用体变量x中有两个成员分别是i、c、f。那么这两个成员是占一个共用的区间的。当然共用体x的所占字节大小就是成员i、c、f中字节最大的哪个成员,这里就是float类型的f。共用体x不可以直接使用,所以A,D错误。C项中的x是四个字节,y是两个字节,所以也错了。D中x.c是一个字符型,可以赋值一个不大于255的整数。D正确。20.【B】分析:s[2]是有两个元素的结构体数组元素。主函数中的f(s[0]);是将第一个结构体数组元素作为实参传递给函数f(structSTUp),传的是数值,所以形参的变化不会改变实参的数值。那么我们输出s[0].num,s[0].TotalScore的数值就是在main函数中赋的初始值,也就是20044,550。注意:传数值,不会改变实参的数值,这个对结构体也是成立的。21.【B】分析:stus[3]是有三个元素的结构体数组元素,for(i=0;i<3,i++)这个循环的三次,每次都是在计算下面这个sum=sum+p->score[i];的数值,实际上是计算p->score[0]+p->score[1];+p->score[2]三个数的相加。*p=s表示结构体指针是指向了第一个结构体数组元素s[0]的。由结构体数组元素的初始化,我们知道实际上就是s[0].score[0]+s[0].score[1]+s[2].score[0]的90+95+85得到270。以%6.2f输出就是270.00。22.【D】分析:本题是对共用体基本概念的考查。选项A是正确。共用体每个成员的起始地址是相同的。共用体所占的字节数目是共用体所有成员中所占空间最大的那个。本题就是double c。所以B选项正确。选项C中data.a=5;实际上就可以看成data.c赋值了5.000000。因为它们是共用一个区间的,所以printf("%f",data.c);输出结果为5.000000。选项D中data是共用体变量名,是不可以整体使用的。所以不可以作为函数的实参的。23【B】分析:本题是对结构体定义的考查。这里使用了typedef所以是替换的作用,那么PER就是作为结构体的类型。不是结构体变量名。本题和第一题相似,区别是省略的typedefstruct后面的名称,第一题有一个名称,本题没有。这两种方式都是正确的。经判断可知B是正确的。46 培恩IT教育系列教材-习题详解-www.born365.cn24.【D】分析:这个是在共用体中嵌套了结构体的题目。共用体变量a的字节数是6个(成员中字节数最多的那个,本题中是成员u,它是一个结构体),由于共用体中的成员都是使用共用的一个区间,所以我们规定结构体变量中的数值是最后一次对结构体变量成员赋值的数值。本题中最后一次赋值是a.k=0;所以要输出a.u.x就是最后一次赋值的0。25.【C】分析:共用体的所占字节数目是所有成员中字节数占用最大的那个变量。结构体所占的字节数是所有成员的所占字节数目的相加。所以我们可以知道UnionUu的u占了4个字节,结构体变量a则占了2+4=6个字节数目。26.【B】分析:s[2]是结构体的数组,有两个数组元素,每个数组元素有三个成员变量,分别为a、b、c。由初始化structabcs[2]={{1,2,3},{4,5,6}};可以知道s[0].a是等于1的,s[1].b是等于5的。所以s[0].a+s[1].b就是1+5得到的是6。二、填空题1.5分析:本题实际上是链表的处理。首先我们知道结构体structNODE是含有两个域的,一个数据域,一个指针域。structNODEs[3]是三个结构体数组元素,s[0].next=s+1;s[1].next=s+2;s[2].next=s;实际上是把三个元素依次首尾链接起来。p=s;q=p->next;r=q->next;是让结构体指针分别指向了s[0]、s[1]、s[2]。sum+=q->next->num;中的q->next->num实际上就是s[2].sum。sum+=r->next->next->num;的r->next->next->num实际上就是s[1].sum。也就是说最后是把s[2].sum+s[1].sum的,也就是得到3+2=5。2.structnode*分析:自身结构体指针变量的类型必须和定义的结构体相同,由于是指针变量所以我们在后面加一个*号3.sizeof(structnode)分析:注意mallco函数的基本格式,后面表示在内存中动态分配一个长度为sizeof(structnode)的连续空间,在链表中非常常见。4.80分析:求字节数目,我们要一步一步的来。STU是共用体类型,它的成员有charname[10]; longsno; charsex; floatscore[4];四个。共用体所占的字节数目就是成员中最大的那个。这里就是floatscore[4]它占了16个字节。STUa[5];表示有5个这样的共用体元素,所以sizeof(a)就是5*16=80。46 培恩IT教育系列教材-习题详解-www.born365.cn第十二章文件一、选择题1.【C】分析:定义文件指针的语句应该是FILE*fp,由于是文件指针,所以定义的时候要出现是指针的*号。其它几项是正确的,大家要牢牢记住。2.【D】分析:文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件。二进制文件由二进制数据序列组成,文本文件是有ASCII组成的。C语言是可以读写二进制文件和文本文件的。文件分为顺序读写文件和随机读写文件。3.【D】分析:这个题目很明显,顺序读写方式是适用于二进制文件的。并且二进制文件还可以随机读写方式来处理。这里要记住的是随机读写方式不适用于文本文件。4.【D】分析:错误很明显,FILE定义的文件指针是可以指向二进制文件和文本文件。5.【D】分析:A项中不仅可以顺序读取,还可以随机读取数据。B项中打开一个已存在的文件并进行了写操作后,当打开的方式不同,对原文件中数据的处理是不同的。有的覆盖,有的是接着写,有的是覆盖掉一部分。6.【D】分析:这道题目在课本上已经详细介绍了。A是判断文件是否结束。B是告诉文件现在离文件开头多少字节,C是从指定的文件中读取一个字符数据。7.【B】分析:该题在课本上也介绍过。feof(fp)函数读到末尾时候的返回数值是非0值。feof函数和表识符EOF之间的区别:文本文件中,数据是以字符的ASCII的代码值的形式存放的,我们知道,ASCII代码的范围是0到255,不可能出现-1,因此可以用EOF作为文件结束的标志。但是EOF只可以处理文本文件,不可以处理二进制文件。8.【A】分析:考点同第七题类似。因为feof(文件指针)的作用是判断文件是否结束,是则返回1否则返回0,本题中未遇到文件结束,所以应返回0,选A.9.【C】分析:首先是注意题目要求处理的方向,是从C语言的程序中把变量的数据放到文件中。注意这里是要求以二进制文件处理。fwrite函数的功能:用来写二进制文件。fwrite函数处理的方向:把程序中数据内容写道文件中去。fread函数方向错了。其它fprintf函数、fputc函数处理的不是二进制。10.【D】分析:fopen函数的两个参数都是字符串,(一定是双引号)。第一个参数是打开的文件名,第二个参数文件的打开方式。注意:如果文件名中存在反斜杠(),必须使用两个反斜杠来代替,所以A、C都错了。由于文件是要进行读、写操作的。所以打开方式要求是r+。11.【A】分析:fopen函数的两个参数都是字符串,(一定是双引号)。这里fout=fopen("abc.txt","w");的两个参数都是单引号,所以错了。12.【C】分析:文本文件f1.txt中原有内容为:good。"w"的打开方式是当指定的文件不存在,系统将用指定的文件名建立一个新文件。如果指定的文件是存在的,则将从文件的最开头开始写,并且文件中原有的内容将全部消失。也就是f1.txt中原有内容都会消失。只有新写入的内容abc。46 培恩IT教育系列教材-习题详解-www.born365.cn13.【B】分析:通过第一个for语句,依次将1,2,3写入到文件中,并且1,2,3之间无间隔符,所以通过fscanf(fp,”%d%d”,&k,&n);将123赋给了k。n从文件中得不到数据,所以仍为初始化的值,所以最后的结果为1230。14.【D】分析:通过第一个for语句,依次将1,2,3,4,5写入到文件中,并且1,2,3,4,5之间是有间隔符空格的,if(i%3==0)fprintf(fp,"n");是每行输出三个数字。所以第一行是 123。第二行是45。各个数据之间有空格。rewind(fp);是回到文件开头。通过fscanf(fp,”%d%d”,&k,&n);将1赋值给了k,2赋值给了n。所以最后的结果为12。15.【A】分析:fprintf(fp,"%dn",i);fprintf(fp,"%dn",j);是分别把i、j的数值写道文件中去。由于写的时候%d后面有换行符号n。它是作为分隔符号的,所以我们知道20在第一行,30在第二行。由于不在同一行,将这两个数据读出的时候会隔开处理。所以fp=fscanf(fp,"%d%d",&k,&n);的k、n分别为20,30。16.【A】分析:该题中第一个fwrite函数将字符串s1的前7个字母输入到文件test.txt中,即把字符串“Fortran”写到文件test.txt中。再调用fseek函数将文件的位置移动到文件的开始位置处。第二次调用fwrite函数将字符串s2的前5个字符写到文件test.txt中,根据打开文件时候的打开方式,这样的处理会覆盖掉文件中原来的开头5个字符,而后面的字符不变。因此文件中的内容为Basican。17.【B】分析:考查fseek函数,这个函数中预定义表示SEEK_END是指最后一个字符的后面。for(i=0;i<4;i++)fwrite(&ch[i],1,1,fp);是经过四次循环把数组ch中的内容abcd依次写到abc.dat文件中。fseek(fp,-2L,SEEK_END);表示从文件的最后往前面移动两个字节,正好到了字母c的位置。现在用fread(&t,1,1,fp);可将字符c放到变量t中。所以输出的时候是字符c。18.【B】分析:fp=fopen(fn,"W");打开方式会将以前文件中的所有内容替换掉。主函数中先后调用了这两个函数,实际上WriteStr("t1.dat","start");是写把"start"写入文件t1.dat。而WriteStr("t1.dat","end");是写把"end"写入文件t1.dat,但是把以前的start给替换掉了。19.【D】分析:通过第一个for循环使得数组中的值依次写入文件中,fseek(fp,-2L*sizeof(int),SEEK_END),是从后往前移动-2×2个字节。负号表示往前移动。这样使得指针移到3所在的字节的首位置,fread(&b,sizeof(int),1,fp);把指针fp所指的值放到变量b中,所以结果是3,选D二、填空题1.“d1.dat”,”rb”分析:此题考查函数fopen的用法,注意文件的打开方式,以读打开二进制文件的方式为”rb”。2.Hell分析:这里考查了函数fgets的使用,该函数一个重要的考点是:这里实际输入的字符个数比给定的要少一个。题目给定的是5,所以实际输入的应该是5-1=4,即Hell。3."bi.dat","r"分析:该题是对文件打开函数的考查。fopen函数的两个参数都是字符串,(一定是双引号)。第一个参数是打开的文件名,第二个参数文件的打开方式。读入的是字符,所以打开的方式是r,表示是文本文件。4、fopen  fell分析:该题目是考查对文件的函数的含义的了解,首先要用fopen打开文件,所以第一空是填写fopen。统计文件的长度,要先用fseek(myf,0,SEEK_END);46 培恩IT教育系列教材-习题详解-www.born365.cn把文件指针移动到文件末尾。然后用处理文件的函数ftell来统计文件的长度。5.!feof(fp)解析:考察函数feof的使用。参考课本P111页。如果文件结束返回1,否则返回0。所以这里如果还没有到文件结尾的时候就继续读入字符。知识点概要:学习本章内容首先要弄清楚文件的概念,尤其是读文件和写文件的概念。具体参考课本P109页第一节。这里对其中几个概念稍加解释一下:1、顺序读写文件:进行读或写操作时总是从文件开头开始,从头到尾的读写,不能任意读写。2、随机读写文件:可以不从开头读写,可从任意位置开始读写文件。3、ASCII文件(也称为文本文件):这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,整数5678的存储形式为:ASC码:00110101001101100011011100111000↓↓↓↓十进制码:5678共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。4、二进制文件:是按二进制的编码方式来存放文件的。例如,整数5678在计算机中的存储形式为:0001011000101110只占二个字节。如将其存放到二进制文件中,其存放的内容就是0001011000101110。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。46 培恩IT教育系列教材-习题详解-www.born365.cn公共基础参考答案第一章数据结构与算法:一、选择题:1-5BCCDC6-11DCABCD16-20CAACD 21-25CDBAD26-32CBBBABD二、填空题:1.算法 2.空间复杂度和时间复杂度3.空间 4.存储结构5.存储结构 6.逻辑7.相邻 8.459.物理独立性 10.栈11.线性结构 12.读栈顶元素13.n,n+1  14.3215.中序 16.250 17.n(n-1)/218.n第二章程序设计一、选择题:1-5DDADA  6-8BAD二、填空题:1.功能性注释2.循环结构3.对象4.类5.封装6.重用性7.对象8.消息9.继承第三章软件工程基础:一、选择题:1-5 DCCCC6-10DCDAB11-15BABAA16-20DDDDA21-25CCABB26-27DC二、填空题:1.变换型 2. 结构的设计3.数据结构 4.程序调试5.调试  6.驱动模块7.静态分析第四章数据库技术基础一、选择题1-10CCBCC,ADAAB11-20ACCDA,BBAAB21-25BDBCB二、填空题:1.数据库系统2.关系模型3.关系4.元组5.参照完整性6.概念7.数据库管理系统(DBMS)8.查询9.概要设计阶段10.完整性控制11.多对多46'