C程序答案及解析.doc_第1页
C程序答案及解析.doc_第2页
C程序答案及解析.doc_第3页
C程序答案及解析.doc_第4页
C程序答案及解析.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2部分 习题解析第1章 程序设计基础一、选择题1【答案】D 【解析】C程序是由函数构成的。一个C程序至少包含一个main函数,也可以包含一个main函数和若干个其他函数。在C程序中,注释部分对程序的运行结果不产生任何影响,可以在除具有独立含义的语句元素之外的任何地方用“/*”和“*/”对程序和语句进行注释,所以选项D错。2【答案】A 【解析】C语言的函数定义都是相互平行、独立的,也就是说在定义函数时,不能包含另一个函数的定义,即函数不能嵌套定义。但是在调用一个函数的过程中,还可以调用另一个函数,即函数可以嵌套调用,所以选项B错。main函数可以放在程序的任意位置(可以放在程序最前面,程序最后,或在一些函数之前,在另一些函数之后)。一个C程序总是从main函数开始执行,在main函数中结束,而不论main函数在整个程序中的位置如何,所以选项C错。标识符中字母的大小写在C语言中是有区别的,所以选项D错。3【答案】D 【解析】C程序书写自由,一行可以写多条语句,一条语句可以分写在多行上,所以选项A错。main函数中可以没有语句,此时main函数是空函数,所以选项B错。在C程序中,注释部分对程序的运行结果不产生任何影响,使用注释只是为了提高程序的可读性,编译系统不检查注释中的拼写错误,所以选项C错。二、填空题1【答案】main2【答案】main, main3【答案】函数说明,函数体【解析】函数说明即函数的第一行,定义函数时需指明函数的类型、函数名、参数和参数说明等。函数体即函数首部下面的大括号内的部分。如果一个函数内有多个大括号,则最外层的一对为函数体的范围,它定义每个函数所要执行的操作。4【答案】变量声明语句,执行语句【解析】在变量声明语句部分定义程序中所用到的变量,还可以对所调用的函数进行声明。执行部分由若干语句组成。在某些情况下,函数体可以既无变量声明语句,也无执行语句。5【答案】多条,分多行写, ;(分号) 【解析】C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。每个语句和数据定义的最后必须有一个分号,分号是C语句的必要组成部分。6【答案】/* */7【答案】顺序、选择、循环【解析】顺序结构是程序设计语言的基本结构,计算机自动地以语句的顺序一条一条地执行。选择结构用于在备选动作中作出选择。在一些算法中,经常会出现从某处开始,按一定条件反复执行某些步骤的情况,这就是循环结构。三、算法设计题1【解析】l S1:输入a, 令max等于a;l S2:n=1;l S3:输入a,将max与a进行比较,若前者小于后者,将修正max为a;否则max 的值不变;l S4:n=n+1;l S5:n =a? Y N max=a n=n+1当n小于10输出max图1.1 求最大数的N-S图输入nflag=0i=2 r=n/i r等于0? Y Nflag=1 i=i+1 直到i或flag0Y flag为0吗? Nn是素数 n不是素数图1.2 求质数的N-S图 2【解析】l S1:输入n;l S2:n能被15整除吗?若能输出“yes”,否则输出“no”。3【解析】 l S1:输入n;l S2:flag=0;l S3:i=2;l S4:n被i除,得余数r;l S5:如果r=0,表示n能被i整除,flag=1,转S8;否则执行S6 ;l S6:i=i+1;l S7:如果i并且flag0,返回S4;否则转S8;l S8:判断flag的值,若flag=0,输出n是“质数”,否则输出n“不是质数”;结束。 N-S流程图如图1.2所示。第2章 C语言入门一、选择题1【答案】A 【解析】B中1/2是表达式,“/”代表除法,因此B错。可以用一个标识符标识一个常量,但标识符的命名规则为:只能由字母、数字、下划线三种字符构成,且第一个字符必须为字母或下划线。C中不符合标识符的命名规则,因此C错。D中a不是常量,是变量,因此D错。2【答案】A 【解析】字符常量是用单引号括起来的一个字符。C语言中还有一种特殊的字符常量是转义字符。转义字符以开头,后跟C语言约定的一个或几个字符。用一对双引号括起来的字符序列是字符串常量。A中b是字符串常量,A错。反斜线后跟13位8进制数可以用来表示一个ASCII字符,B中101的值为65,因此表示字符A。C中n是转义字符,表示回车换行。x后跟12位16进制数也可以表示一个ASCII字符,D中x41的值是65,表示字符A。3【答案】A 【解析】实型常量必须有小数点。指数形式是由十进制数、阶码标志e或E以及阶码(只能为整数,可以带符号)组成。C语言规定e (E)前必须有数字,e (E)后必须是整数。B中e3错。C中1.5e3.5错。D中45错,因为用十进制表示时必须要有小数点。4【答案】C 【解析】变量名的命名规则要遵循标识符的命名规则。标识符的命名规则是以字母或下划线开始,后跟字母、数字或下划线。选项C中MJohn不合法,C错。5【答案】A二、填空题1【答案】98【解析】字符型数据在内存中存放的并不是字符本身,而是该字符的ASCII码。2【答案】double【解析】这是一个数据类型混合运算的表达式,该表达式中有实数2.5,为了保证数据的正确性,实数2.5自动转换为double型数据后再运算,故最终表达式的结果为double型。3【答案】6.5【解析】(int)x表示把x的值强制转换为int类型,因此(int)x的值为3。计算3+x,由于x为float类型,计算机会自动将3和x转换为double型,结果为6.5。4【答案】5,65【答案】0【解析】因为“+”的优先级高于“/=”,所以表达式“a/=a+a”等价于“a=a/(a+a)”。6【答案】30【解析】先计算(2+3,6*5),它是逗号表达式,整个逗号表达式的值是最后一个表达式的值,为30。接着计算表达式x=30,x+5,由于赋值运算的优先级高于逗号运算符,因此先做赋值x=30,即x的值为30,接着计算x+5,整个表达式的值为35,x的值为30。7【答案】0【解析】先计算a%5结果为4,计算(int)(x+y)结果为9,计算4*9结果为36,计算36%7结果为1,计算1/4结果为0。8【答案】100【解析】“+=”和“*=”的优先级相同,且具有右结合性。先计算a*=a+a,即a=a*(a+a),得值a=50,再计算a+=50,即a=a+50,得a=100。9【答案】5【解析】在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型,再进行赋值。表达式b+=(float)(a+b)/2即是b=b+(float)(a+b)/2。先计算(a+b)的值为,然后将其转换为float型。计算7.0/2得3.5,接着将b转换为double型,计算2.0+3.5的结果为5.5,最后将5.5赋值给b时,自动转换为b的类型int,故b的值为。10【答案】6【解析】sqrt(0.25)的值为0.5,计算0.5+5.7=6.2,再强制将6.2转换为int型。第3章 基本控制结构一、选择题1【答案】D 【解析】putchar(ch)函数向终端输出一个字符,其中ch可以是字符变量、字符常量、转义字符或能有效表示一个字符的整数。2【答案】D 【解析】C语言规定scanf函数中必须有输入项,且输入项必须是变量,因此A、B错。实型数据在输入时不能规定精度,因此C错。3【答案】B 【解析】求余运算符“%”左右两边的运算对象必须都为整数,因此B错。4【答案】A 【解析】ch为字符变量,其中只能存放一个字符,因此A错。5【答案】C 【解析】在选项A中给变量a,b,c赋值,但变量b,c没有定义,有语法错。B中只能完成给c赋值5。D选项不能完成定义变量a,b,c。因此正确答案为C。6【答案】D 【解析】逻辑运算的对象可以是C语言中任意合法的表达式。表达式的值为非零,则视为“真”;值为0时,则视为“假”。7【答案】C 【解析】“&”运算的优先级高于“|”运算。因此正确答案为C。8【答案】C 【解析】若A为奇数,则A%2等于1,A%2=1表达式的结果为真。表达式!(A%2=0)的值为真。A%2的值非0即为真。!(A%2)的结果为0即为假,因此选择C。9【答案】C 【解析】C语言规定,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。本题计算+a,a的值为2,由于a为真,因此后面的表达式不执行,b的值仍为1。10【答案】A 【解析】由于wx的值为0,因此a的值为0,而b=yz不被执行,因此b的值仍保持原值2。11【答案】C 【解析】m的初值为5,判断条件m+5时,即判断55,在判断的同时m自加1,m的值为6。由于55的结果为0,故执行else后的语句。输出6后,m自减1,值为5。12【答案】B 【解析】(exp)?a+:b+是一个三目条件表达式。三目条件表达式运算的过程是:当表达式exp为非0值时即为真,计算a+;当表达式exp等于0时即为假,计算b-。故exp等价于exp!=0,因此答案为B。13【答案】A 【解析】当表达式E为0值时!E为真;当表达式E等于非0时!E为假,故条件!E等同于E=0,因此答案为A。14【答案】C 【解析】需要注意的是,while语句的循环体为空,每次循环条件成立时执行1次空操作,直到循环控制条件(n+2)不成立为止,而该条件不成立时n的值为3,用3判断后n将会再次自加1,故退出循环时,n值变为4。15【答案】A 【解析】需要注意的是while语句的条件abc,由于“”运算符具有左结合性,因此先判断“ab”,结果为1,再判断“1c”,结果为真,进行第一次循环,执行循环体后a=2,b=1,c=1。然后再判断“ab”,结果为0,再判断“0c”,结果为真,进行第二次循环,执行循环体后a=1,b=2,c=0。然后再判断“ab”,结果为1,再判断“1c”,结果为假,退出循环。16【答案】A 【解析】do-while语句的特点是先执行循环体,然后判断循环条件是否成立,故循环体执行的次数至少为1次。while语句是先判断条件,条件为真时,才执行循环体,故循环体执行的次数可能为0次。17【答案】B 【解析】for循环中第2个表达式通常表示条件,若缺省该表达式时,编译器默认为条件为真,即为1。18【答案】C 【解析】循环条件(y=123)&(x4)中,(y=123)进行的是赋值运算,而不是判断相等,因此y的值非0,该条件始终为真。而当x取值0,1,2,3时,(x100永远不可能满足,故A是死循环。选项B中由于省略了所有的表达式,即不设初值,不判断条件,循环变量不增值。将无终止地执行循环体。选项C中k为int型,k自加到32767后,再加1将溢出,k值为-32768,不满足循环条件,退出循环。选项D中,while(s);是个空循环,条件一直为真,是死循环,故选择C。20【答案】B 【解析】x=3,进入循环体,执行x-=2后,x的值为1,输出1。在!(-x)中,x的值先减1,变成0,!0的值为1,循环继续。执行x-=2后,x的值为-2,输出-2。在!(-x)中,x的值先减1,变成-3,!(-3)的值为0,退出循环。二、填空题1【答案】10,15,10【解析】z=10,y=10+5=15,x=15-5=10。2【答案】C:dec=65,oct=101,hex=41,ASCII=A【解析】将字符A分别以十进制整数,八进制数、十六进制数和ASCII码形式打印出来。3【答案】scanf(%f,&x);4【答案】-14【解析】先计算x=x-(x+x)=7-(7+7)=-7,再计算x=x+(-7)=(-7)+(-7)=-14。5【答案】交换a和b的值。6【答案】y%2=17【答案】1【解析】逻辑表达式的值只有“真”和“假”两个,分别用1和0表示。8【答案】(x2&x3)|(x-10)9【答案】20【解析】因为a=0,因此if(a)中的条件为假,执行else 子句中的语句if(!b),因为b=1,故!b为假,其内嵌的if语句不会执行,因此d保持原值20。10【答案】*1*3*【解析】x=1,执行外层case 1标号中的switch语句,y=0,执行内层case 0标号中的语句,输出*1*,接着执行break,跳出本层switch,执行case 2后的语句,输出*3*。11【答案】a=2,b=1【解析】x=1,执行外层case 1标号中的switch语句,y=0,执行内层case 0标号中的语句a+,a的值为1,接着执行break,跳出本层switch,执行case 2后的语句a+,b+,a的值为2,b的值为1。12【答案】36【解析】本题需要注意两点,一是循环的条件n等价于条件n!=0;二是循环体中的两条语句,其中k*=n%10表示取n的个位做累乘,n/=10为去掉n的个位(因为n为整型变量,做整除)。所以题中do-while循环表示依次从低位取出n的各位数字并累乘到变量k中。13【答案】2*x+4*y=9014【答案】x=1,y=20【解析】本题循环体共执行4次。每次进入循环之前i的取值分别为0,3,5,7。15【答案】*#【解析】i的初值为4,循环条件为i=8,共循环5次。第一次循环时,表达式(i/j)的值是1,执行printf(*)语句,遇到break跳出switch结构,进入下一次循环。依此类推。16【答案】i=6,k=4【解析】需要注意的是,循环条件i=k-1是赋值表达式,每次循环将k-1的值赋给i。i值非0时即代表真,可以进入循环;i值为0时即代表假,退出循环。本题循环共进行5次,当k等于4时,满足条件k5,执行break退出循环。17【答案】i10,j%3!=0【解析】打印的数必须是100以内的整数,而j=i*10+6,因此i10。当j不是3的倍数时,进入下一次循环,否则输出该数,因此if后的条件应为j%3!=0。18【答案】2581114【解析】循环体中若i被3除余数为2,则打印输出i,否则进入下一次循环。由于循环条件是i0时不成立,结束循环。第4章 函数一、选择题1【答案】C 【解析】简单变量做实参时,实参对形参的数据传递是“值传递”,即单向传递。只能由实参传给形参,而不能由形参传送回来给形参。在内存中,实参和形参占用不同的存储单元。2【答案】B 【解析】在C语言中,应当在定义函数时指定函数值的类型,缺省时编译系统默认为int型。3【答案】D 【解析】不同函数中可以使用相同名字的变量,他们代表不同的对象,在内存中占不同的单元,互不干扰。形式参数是局部变量,在调用函数时,给形参分配存储单元,并将实参的值传递给形参,调用结束后,形参单元被释放。在一个函数内部定义的变量是内部变量,它在本函数范围内有效,在此函数以外是不能使用这些变量的。在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,离开该复合语句此变量就无效,这种复合语句也可称为“分程序”或“程序块”。4【答案】D 【解析】在定义函数时对函数值的类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中的表达式类型不一致,则以函数类型为主,即函数类型决定返回值的类型。5【答案】D 【解析】有三种函数调用的方式:函数语句(把函数调用作为一个语句);函数表达式(函数出现在一个表达式中);函数参数(函数调用作为一个函数的实参,而不是形参)。二、填空题1【答案】k/10,a2*10【解析】本题主要掌握对整数各位进行分离的方法。程序中a2用来存放百位数,a1用来存放个位数。 2【答案】9【解析】fun函数是将传进来的两个整型参数相加,把和作为函数值返回,注意返回值为float型。在主函数中调用了两次fun函数,第一次调用时对表达式“a+c”和变量“b”的值求和,得到15,转换为实型数作为函数的返回值。第二次调用时把第一次调用的返回值通过强制类型转换成int型15,再和表达式“a-c”相加,得到结果9,转换为float型作为函数值返回。由于输出格式符为%3.0f,输出时没有小数位,故输出为9。3【答案】1 1 1【解析】本题定义了一个fun函数,在该函数中,x是自动变量,执行完fun函数后,自动释放x所占的内存单元。因此,每次调用fun函数,x都被重新分配空间并赋值0。4【答案】5,25【解析】需要注意的是,extern int x,y;语句扩大了变量x,y的范围,因此main函数和num函数中的x和y是相同的变量,在num函数中,x和y的值变为5,25,返回到主函数时,打印的是变化后的x,y的值,即x=5,y=25。5【答案】7911【解析】需要注意的是,f函数内的b为动态局部变量,c为静态局部变量,每次调用f函数后,b变量被释放,而c变量不释放。6【答案】8,17【解析】本题需要注意两点:一是func函数内的m,i为静态局部变量,每次调用函数结束后不释放;二是main函数和func函数中的m 是不同的变量,因此两次调用func函数时的形式都是p=func(4,1)。7【答案】10,20,40,40【解析】x1,x2是全局变量。x3,x4是局部变量。第一次调用sub函数后,由于简单变量的传递是值传递,因此x1=10,x3,x4的值不变。第二次调用sub函数后,x1=40,x2的值不变。8【答案】j=1,y=1,y-【解析】pow函数的作用是求x的y次幂。在修改后的pow函数中,循环体为j=j*x,但j没有赋初值,因此第一个表达式为j=1,y变量用来控制循环的次数,因此可以通过执行y-,y=1使程序执行y次,达到求x的y次幂的目的。第5章 数组一、选择题1【答案】D 【解析】在定义数组时,数组名后是方括号括起来的整型常量表达式,不能用圆括号。在引用数组元素时,下标可用任意类型的表达式,系统自动取整,表达式可以由常量、变量及运算符等组成。2【答案】C 【解析】数组名代表数组的首地址,在编译时已经确定,它是常量,程序运行期间,其值不再被改变,故不允许出现在赋值号的左边。3【答案】C 【解析】字符0标志字符串的结束。计算串长时,只计算字符0之前的字符数量,而不管0之后是什么字符。本题中x69是一个转义字符。由于在八进制数中不允许出现8,因此0不能和后面的数字字符组合在一起。4【答案】D 【解析】系统自动在字符串常量后面加一个0作为结束符。因此ABCDEF在内存中占7个字节。而B数组的长度只有6。5【答案】D 【解析】C语言规定,如果对全部元素都赋初值(即提供全部初始数据),则定义数组时可以缺省对第一维的长度,但第二维的长度不能省,因此选项A,B错。又由于aaaa等串在内存中实际占5个字节,因此选项D错。6【答案】A 【解析】数组名代表数组首元素的地址,用它做实参时,就是把首元素的地址传给形参,形参以此为首地址,这样,实参数组和形参就同占一段内存区。二、填空题1【答案】统计输入的1,2,3的个数【解析】本程序中,第一个for循环对a1,a2,a3三个数组元素赋值0,相当于设了三个计数器。当输入x时,while循环执行ax=ax+1,即对下标为x的数组元素加1(此语句很巧妙地将输入的x值与数组下标关联起来,从而省略了判断),因此可以统计输入的x的个数。第三个循环输出a1,a2,a3的值,也就是输入的1,2,3的个数。2【答案】10 4 6 8 2 4 6 1 2 2 1 4【解析】本程序利用b+j=bi;语句巧妙地完成将数组中的奇数去掉,而只保留偶数的目的。3【答案】(1)10 8 6 5 4 2(2)15 10 8 6 4 2(3)10 10 8 6 4 2【解析】本程序的作用是将整数x插入到有序数组后使数组仍然有序。while循环用来在数组中从后往前找x的插入位置,并使数组元素后移。4【答案】ai,i+,bj,j+【解析】本程序完成归并排序。在while循环中,比较a数组和b数组中的元素,将小的元素放到c数组中。5【答案】&x,2,+k,2【解析】十进制整数转换为二进制整数的方法是:除2求余数,直到商为0为止,逆序打印余数。do-while循环中利用r=x%2求x的余数,利用b+k=r将余数放到数组中,x/=2语句可以求出x被2整除后的商。第6章 指针一、选择题1【答案】B 【解析】第一次调用sub函数时,10传递给变量x,5传递给变量y,x和y是变量的“值传递”;a变量地址传递给指针变量z,此时是“地址传递”它们共用一个内存单元,*z=5-10=-5,本次函数调用结束后a变量的值为-5。第二次调用sub函数时,相当于语句sub(7,-5,&b);,*z=-5-7=-12,本次函数调用结束后b变量的值是-12。第三次调用sub函数时,相当语句sub(-5,-12,&c);,*z=-12-(-5)=-7,本次函数调用结束后c变量的值为-7。变量a,b,c的打印结果为-5,-12,-7,所以选B。2【答案】D 【解析】源程序中,实参为&a,&b,而形参是整型变量 p,q,类型不匹配,所以选项A错。若实参改为a,b,由于实参向形参的单向“值传递”方式,形参值的改变不能使实参值改变,所以选项B出错。若将形参p,q定义为指针,调用函数时p指向a,q指向b,执行函数内的语句后,p,q交换,p指向b,q指向a,但是a,b的值没有交换,所以选项C错。3【答案】B 【解析】ptr1,ptr2指向k,所以* ptr1,*ptr2与k等价。选项A等价于k=k+k。选项C中ptr1,ptr2均是指向整型变量的指针变量,所以可以相互赋值。选项D等价于k=k*k。指针与整数不等价,不能将一个整数值赋给一个指针变量,所以选项B错。4【答案】C 【解析】对于选项 A,系统把字符串常量看成字符串的首地址,该地址应该赋值给一个指针变量,因此错。可以在定义字符数组时对其进行初始化,但数组名表示数组的首地址,是常量,不能赋值,选项B错。C表示将串china的首地址赋给指针变量s,选项C对。语句char c4=d4= abc;中d4在使用之前没有定义,不能使用它,因此选项D错。5【答案】C 【解析】s所指向的字符串中共有以下字符t,a,017,b,c,0。6【答案】C 【解析】遇到0循环结束,判断了以下字符t,a,01,8,b,c。注意八进制数中只有07八个字符。7【答案】C 【解析】字符串ABCDE存放时需要占用6个字节的存储空间,所以选项A错。字符串后应该加0作为串的结束标志,选项B错。C表示将串ABCDE的首地址赋给指针变量s,C对。D中指针变量s没有指向具体的存储单元,它存储的是一个不可预料的值,很危险,选项D错。8【答案】A 【解析】指针变量s被初始化为串abcde的首地址,然后s指针向后移2,指向c,因此输出字符串cde。9【答案】D 【解析】语句p=s;把存放字符串的字符数组s的首地址赋给指针变量p,使p指向字符串的第一个字符p,所以*p与s0相等,选项D正确。s是一个字符数组,而p是一个指针变量,它们的类型不同,且使用方法也不同,选项A错。p中放的是地址,而s中放的是若干个字符,选项B错。s数组长度是6,而p所指字符串的长度是5,选项C错。10【答案】C 【解析】str即代表地址,所以选项A错。指针变量p没有指向具体的存储单元,它存储的是一个不可预料的值,很危险,选项B错。&str2表示确定输入串的首地址,将输入的字符依次放到从str2开始的单元中,选项C对。scanf函数输入时要求给出变量的地址,p2不是地址,选项D错。11【答案】B 【解析】将字符串的地址赋给字符指针变量后,指针就指向了该字符串的第一个字符,p+3后p指向了0,0是一个“空操作符”,ASCII码值为0,选项B正确。12【答案】C 【解析】p+3后p指向了d,strcpy(p,ABCD)将串ABCD复制到p所指的存储空间里,返回p的值,注意:连同串后的0一起复制。strlen(s)求以s为首地址的字符串的长度,本题返回的首地址是p,因此求出的串的长度是4。13【答案】B 【解析】数组名表示数组的首地址,是常量,其值不能改变。14【答案】C 【解析】a+1,&a1代表a1单元的地址。因此选C。二、填空题1【答案】0 1 3 6【解析】本程序需要注意两点:一是在sub函数中,t是静态局部变量,每次函数调用结束后不释放。二是进行函数调用时,指针变量s获得变量i的地址,因此*s等于i。2【答案】gae【解析】本程序的功能是比较两个数组中对应位置上的元素,将相同的字符输出。3【答案】0,s【解析】在字符串末尾应加上结束标志0。要输出字符串,应使指针p获得数组的首地址。4【答案】hELLO!【解析】strcpy(s,sp)将字符串HELLO! 复制到s数组中,从s0开始依次存放。s0= h语句将s0单元的内容替换,因此输出hELLO! 。5【答案】12345【解析】循环体中*p-0的作用是将数字字符转换为数字。6【答案】#9【解析】本程序中book小于book.,strcmp函数的值为负整数,!strcmp(s1,s2)的值为0,,执行else后的语句。strcat(s1,s2)将s2所指字符串连接到s1所指字符串的后面,并自动覆盖s1串末尾的0。因此新的串长为9。7【答案】p1+,*p2 【解析】在while(*p1)循环中,利用p1+使p1指向数组s1中的串结束标志0,确定s2串连接的初始位置。在while(*p2)循环中,用*p1=*p2将p2所指的字符赋到p1所指的单元中,并使p1,p2指针同步向后移动。8【答案】2 【解析】p指向a1,因此*p1就是a1,+(*p)就是+(a1),即把a1单元的值加1。9【答案】1 【解析】p指向a2,执行*-p就是先执行-p,p指向a1,再取a1的值为1。10【答案】x,i-,i!=0 【解析】查找的思路是:将x放在a0单元,在数组中从后往前依次进行比较,若和ai相等,则退出循环。若i0,说明在数组中找到了和x匹配的元素,若i=0,说明没找到。第7章 函数进阶和结构化编程一、选择题1【答案】D【解析】在C语言源程序中允许用一个标识符来表示一个字符串,这个标识符被称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这个过程被称为“宏代换”或“宏展开”。2【答案】C【解析】编译预处理语句以#号开头,它占用一个单独的书写行。C程序对预处理命令行的处理不是在程序执行的过程中进行的,而是在编译时进行。二、填空题1【答案】365【解析】该程序递归调用函数func(),执行过程如下所示:func(132645)return func(1326)*10+5func函数x=132645return func(13)*10+6func函数x=1326return 3func函数x=13func(13)=3func(1326)=36func(132645)=365输出3652【答案】3600【解析】该程序递归调用函数fun ()。int w=3;定义了一个全局变量。int w=10;定义了一个局部变量,C语言规定,若全局变量和局部变量同名时,在局部变量的作用范围内,与之同名的全局变量被“屏蔽”,即它不起作用。因此在main()函数内w=10,而在fun()函数内w=3。 执行过程如下所示:fun(5)*10return fun(4)*5fun函数k=5return fun(3)*4returnfun(2)*3fun (0)=3return fun(1)*2return fun(0)*1return 3fun函数k=4fun函数k=3fun函数k=2fun函数k=1fun函数k=0fun (1)=3fun (2)=6fun (3)=18fun (4)=72fun (5)=360输出36003【答案】880【解析】v=WIDTH+40*20=80+40*20=880。4【答案】2400【解析】v=(WIDTH+40)*20=(80+40)*20=2400。5【答案】5【解析】t=DOUBLE(x+y)=x+y*x+y=1+2*1+2=5。6【答案】x=9,y=5【解析】在main函数中,语句EXCH(x,y)进行宏替换int t; t=a; a=b; b=t; 因此完成了x,y 两个变量的交换。第8章 结构和联合一、选择题1【答案】A【解析】结构体变量的存储空间分配时按照其对应的各成员项的定义顺序进行的。同一结构类型的每个结构变量,存储空间的大小都相同,是各成员项所占空间之和。2【答案】A3【答案】D【解析】程序段定义了结构体数组pup5和指针变量p,然后p指向数组pup5中的第一个元素,因而p-age引用了pup0.age,它表示的是一个值,而不是一个地址。但scanf函数中应该用地址变量,因此答案为D。4【答案】B【解析】在C语言中,typedef可以声明新的类型名来代替已有的类型名,这样可以增加程序的可读性,被声明的新类型名只是原有类型的一个新的名称,而不是一种新的类型,因此答案为B。二、填空题1【答案】printf(%cn,0);【解析】的初值是Mary的首地址,因此要输出M可用0。2【答案】6【解析】cnum0.x的值是1,cnum0.y的值是3,cnum1.x的值是12,cnum1.y的值是7。3【答案】sizeof(bt)或sizeof(struct ps)【解析】函数sizeof有两种格式:sizeof 表达式;和sizeof (类型名);用于求指定的某种数据类型在计算机中所分配或占用的存储空间的大小。4【答案】strcmp(str,)=0,break【解析】查询时,用str和进行比较,如果找到了,就利用break退出循环。字符串的比较用strcmp()函数完成。第9章 指针进阶一、选择题1【答案】C 【解析】数组a是一个4行3列的一个二维数组,a12的值为6。int *p=a1表示定义了指针变量p,并为其初始化数组a中第二行的首地址,*(p+2)表示 (*q)3表示指针变量q指向包含3个整型元素的一维数组,q12即是a12。C中*(q+1)表示a10,值为4,因此选C。2【答案】C 【解析】*ak表示第k行一维数组中第0列元素的地址。选项A、B、D都代表ak0的地址,而选项C代表ak0元素。3【答案】B 【解析】定义二维数组时,第二维下标不能省略,因此选项C、D错。选项A中定义的二维数组只有两行3列,而初始化时的字符串为3个,需要3行存放,因此选项A错。4【答案】B 【解析】*p4表示一个指针数组,数组的每个元素是一个指针变量,因此与此语句等价的是选项C。5【答案】B 【解析】选项A中*(+p)-y+1)表示先使p自加1,p指向a1,取a1.y,即串ab的首地址,该地址再加一后取其指向单元的值,因此取出的为字符d。 选项B中+(+p)-y表示先使p自加1,p指向a1,取a1.y,即串ab的首地址,该地址再自加一。选项C中*(+p)-y+1表示先使p自加1,p指向a1,取a1.y,即串ab的首地址,取该地址指向单元的内容c再加1,因此输出d。 选项D中*+(+p)-y表示先使p自加1,p指向a1,取a1.y,即串ab的首地址,该地址再加一后取其指向单元的值,因此取出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论