浙江大学C语言同步练习册题与解答

浙江大学C语言同步练习册题与解答

ID:82925485

大小:342.77 KB

页数:148页

时间:2023-09-25

上传者:灯火阑珊2019
浙江大学C语言同步练习册题与解答_第1页
浙江大学C语言同步练习册题与解答_第2页
浙江大学C语言同步练习册题与解答_第3页
浙江大学C语言同步练习册题与解答_第4页
浙江大学C语言同步练习册题与解答_第5页
浙江大学C语言同步练习册题与解答_第6页
浙江大学C语言同步练习册题与解答_第7页
浙江大学C语言同步练习册题与解答_第8页
浙江大学C语言同步练习册题与解答_第9页
浙江大学C语言同步练习册题与解答_第10页
资源描述:

《浙江大学C语言同步练习册题与解答》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

学习计算机髙级程序设计语言是ー个概念性和实践性都很强的学习过程。特别是学习C语言就有这两个方面的问题:一方面,在语言的组成成份中有许多基本概念,有的甚至于涉及计算机的硬件知识,有的需要记忆;另一方面,是编程方法和程序设计及上机实践的问题。为了能学好这两个方面的问题,只有通过多做习题多上机,通过多练习可以巩固和提高所学的教材中各章节的基本概念和知识,从而自然而然地记住了这些概念和规则,通过多练习也逐渐掌握了程序设计和编程方法。本书是为配合高等教育自学考试中,以C语言为高级语言的《高级语言程序设计》课程而写的同步练习册。其内容编排按教材的章节编写,与学习者的学习过程同步。学习者在学习大纲、教材的过程中,每学完一定内容后,就可及时做一定数量的练习题。通过学练结合较好地完成学习任务。本书的编写原则是:在每章的习题前,都有对本章在学习和解题过程中的重要疑难问题进行通俗的条理的说明。然后是按考试大纲规定的题型选用教材的全部习题,同时增加几乎近ー倍的根据作者多年的教学积累的精选习题,练习题的安排与教材的安排顺序同步。另外,增加了综合练习题部分,为了读者能全面交叉引用前面学过的所有知识,以及对付自学考试而进行的总复习时,可做一定数量的习题,既能巩固所学的知识,又能及时发现问题并采取有效的补救措施。最后,按大纲规定的考核目标和题型编制了三套综合自测题并给出评分标准和参考答案。所有的练习题都有答案,对ー些较难的题目在答案中还加上解题过程的说明,所有答案的程序都已在计算机上运行通过。在本书的编写过程中,参考了大量有关c语言程序设计书籍和资料以及浙江大学、浙江エ业大学的一些考试题,编者在此对这些参考文献的作者表示感谢。由于编者水平有限,书中难免存在错误和不当之处,敬请广大读者不吝赐教。编者2000年12月第1章概述学习和解题要点1.C语言是什么样的语言?早期的计算机语言是二进制的语言(又称机器指令)。目前的计算机语言有:汇编语言(又称符号语言)、高级语言(又称面向问题的语言)、面向对象语言(如面向对象C++语言)和面向对象可视化语言(如VisualC++)«C语言属于高级语言。2.C程序的基本结构程序文件名.c(源程序)#includemain()语句1ー个完整模块inta;

1函数名0()(ー个完整模块)函数名n()()ー个完整模块1.C程序和语句中用到的符号大小写英文字母。数字字符。可直接键盘输入的符号(33个)。转义字符:如

2、'b、\t等相当于打Enter键、Backspace键、Tab犍所起的作用。n字符被“反斜杠字符(ヽ)”转义了。标识符:C程序中经常要取ー些名字,如变量名、数组名、函数名等,称为标识符。C语言的取名规则是:由字母或下划线开头(一定要这二类字符开头,不能用数字开头)的字母、数字、下划线组成的ー串字符(不能有其他字符)。保留字:如int、char、struct英语单词等虽然符合取名规则,但是C语言把它“保留”作为特殊含义使用。

3练习题ー、单项选择题1.机器指令是属于()。A.低级语言B1高级语言C,面向问题语言D.汇编语言2.下列语言中不属于面向问题的语言是()0A.高级语言B.低级语言3.高级语言编写的程序称为()。c.C语言D.BASIC语言A.高级程序B.源程序4.下列字符中属于键盘符号的是()。C,目标程序D.编译程序A.\B.

45.下列字符中不属于键盘可输入的符号是(C.\t)〇D.\bA.AB.@6.下列不正确的转义字符是()。C.1D.\rA.\\B.V7.下列正确的转义字符是()。C.074D.\〇A.\777B.\8218.下列正确的转义字符是()。C.\xhhD.xffA.\dddB.\xfg9.不是C语言提供的合法关键字是()。C.\xffD.\%A.switchB.cher10.C语言提供的合法关键字是()。C.caseD.defaultA.nextB.string11.正确的标识符是()。C.docaseD.structA.?aB.a=212.正确的标识符是()。C.a,3D.a_3A.int_aB.a-213.不正确的标识符是()。C.a3*4D.3xyA.alB.a[i]14.下列说法中正确的是()。C.a2_iD.intA,由于C源程序是高级语言程序,因此一定要在TC软件中输入B,由于C源程序是字符流组成,因此可以作为文本文件在任何文本编辑的软件中输入C.由于C程序是高级语言程序,因此输入后即可执行D.由于C程序是髙级语言程序,因此它由命令组成15.下列说法中正确的是()。A.C语言程序由主函数和0个到多个函数组成B.C语言程序由主程序和子程序组成C.C语言程序由子程序组成D.C语言程序由过程组成16.下列说法中错误的是()。A.主函数可以分为两个部分:主函数说明部分和主函数体B.主函数可以调用任何非主函数的其它函数C.任何非主函数可以调用其它任何非主函数

5D.程序可以从任何非主函数开始执行二、填充题1.汇编语言属于面向语言,高级语言属于面向语言。2.用高级语言编写的程序称为程序,它可以通过程序翻译一句执行一句的方式执行,也可以通过程序一次翻译产生程序,然后执行。3.在C语言程序中允许出现的字符集是、ヽ和4.转义字符是由符号开始的单个字符或若干个字符组成的。5.C语言的程序中有特殊含义的英语单词称为。6.标识符是用户的ー种,通常用来表示程序中需要辨认的对象。7.C语言中,标识符的定义规则是08.C语言词类主要分为ヽヽヽヽ和等6类。9.C语言的语句主要分为语句、语句、语句、语句、语句、语句、语句和语句等8类。10.C程序是由函数构成的。其中有并且只能有个主函数。C语言程序的执行总是由函数开始,并且在函数中结束。11.C语言程序的注释可以出现在程序中的任何地方,它总是以符号作为开始标记,以符号作为结束标记。

6第2章基本数据类型和运算学习和解题要点1.数据类型c语言中的数据类型比别的语言丰富。要学好这部分内容,首先要掌握c语言的数据在内存中的表示。整型数据:以二进制的形式表示(1)int类型正数:如123(+123)用!6位二进制(二个字节)表示原码00000000(Q111011f符号位〇表示正反码(原码同)101dd-dd01d[215-1=214+213+212+21J+21O+29+2827+26+25+24+23+22+21+2°=32767负数:如-123原码レ号位1表示负反码(符号位不动,其它取反)11111111100001C0补码(补码加1),[111111皿皿11110101010Nd」已知补码求原负数符号位不动,其它取反加1取反最大负整数10000000M111101011101010101dddd皿皿0I川而不用-(215-1)-215=32768因为ー215く-(215-1)所以用ー2班(2)unsigned(int)类型称为无符号整数,它不是指不带“+或-”号的整数,而是指内存表示这类数时没有符号位,16位二进制都用来表示数,因此最大数]亜1111.1咖亜|11|112*5+2*4+2*3+2*2+2**+2*0+29+282426+25+24+23+22+2*+20=65535最小数〇麻)[o|o|o|o|o|ddd°lQlolold()l(3)long(int)类型用32位二进制(四个字节)表示,其他同int型(4)short类型有的计算机(小型、中型、大型机)int即是long,而short用16位二进制(二个字节)表示。因此C语言中,short一定是短整型,long一定是长整型,而int因不同的系统而不同。PC586机int即short,所以一般不用short。(5)在C语言中,整型常量有三种形式的写法:十进制整数(0-9)表示。通常整数的写法。八进制整数(0-7)表示。在整数的前面加数字〇。十六进制整数(0-f)表示。在整数的前面加Ox。长整型常量表示方法:在整数的后面加L或1。

7字符型数据:以二进制的形式表示char型用8位二进制(ー个字节)表示如‘a,,在程序中要用单引号表示,输出时无单引号,内存中表示为ollllldoldol1126+25+20=97即ASCII码97实型数据:以二进制的形式表示(1)float类型如!23.45(+123.45)用32位ニ进制(四个字节)表示为0.12345X103<32位Wn位><32-n位:+个小数「分0.123450.12345的二进制表示03的二进制表示个个指数符指数II+103不同的系统,n的位数有不同,n长,精度高,但可表示的指数小,能表示的数的范围小。反之,则能表示的数的范围大,但精度低。float类型又称为“浮点”类型,把实数的小数点都看成在第一位,而用指数位“浮动”小数点。(2)double类型与float同只不过用64位二进制(八个字节)表示。因此精度高,称双精度。2.变量的概念C语言中的变量可以理解成计算机内存的ー个空间,它必须有一个名字(标识符),可放什么样的数据类型(如定义时前面加intヽfloatヽchar等),它是开辟在内存的一般数据区(又称静态数据区)还是开辟在内存的堆栈区(又称动态数据区),这可由程序中用static或auto(可缺省)来规定。同时,ー个变量有它的有效的使用范围,称之为作用域。最后,每个变量都有地址,这在指针类型时要用到。变量可以ー边定义一边赋初值,在程序运行时可以使它发生变化,因此称之为变量。3.运算符的注意事项(1)双目运算符%的两边一定是要整数,运算结果是整除后的余数,也是整数,注意2%5得2而不是〇〇(2)双目运算符/的两边如果是整数,则结果也是整数,5/2结果为2而不是2.5,即使是floatx;x=l/2;x中也只有0.0,要人为的写成x=l/2.0或x=l.0/2,x中オ是0.5。(3)单目运算符++~放在运算对象的前面时,称为“先加(减)1,后使用”,这一般不会搞错。当放在运算对象的后面时,称为“先使用,后加(减)1”,这时要注意什么时候“使用”。如i=3;(i++)+(i++)+(i++)结果是9而不是12,这里,三个i相加是“使用”,使用后才三次加1,i成为6,“使用”是以整个表达式为准。而i=3;(++i)+(++i)+(++i)结果是18而不是15,这里,三个i依次加1成为6,然后再“使用”。也是以整个表达式为准。又如i=l;if(i-)printf(Rd”,i);输出是。而不是1。这是因为if()中i一是整个表达式,先用i为1,用于“判断”成立,这算“使用”了,然后i减1成为〇,输出时i已为〇〇同理charc='A';switch(c++){case'A':printf('*%c",c);break;},输出为B。(4).算术自反赋值运算符中,注意=赋值号右边是ー个整体,如c%=a-3是c=c%(a-3)而不是c=c%a_3o

8(4).关系运算符中,注意等于比较运算符“=="与赋值运算符“=”容易疏忽,二者是绝然不同的,不然会引起很大的错误。如:i=0;if(i==l)判断得结果应该是不成立,若写成:if6=1)则变成给i赋予1,赋值表达式的结果也是1,判断结果是成立的。(5).应该熟记运算符及其优先级汇总表,熟记运算符之间的运算次序及结合方向。4.表达式注意的问题(1).在算术表达式中应注意各类数值型数据间的混合运算问题,如下:ハdouble-

99.下列数据中不属于“字符常量”的是(:)〇A.'\a'B.'\160'C.‘070,D.07010.char型常量在内存中存放的是()。A.ASCII代码值B.BCD代码值C.内码值D.十进制代码值A.OLB.0821C.40000D.0x2a11.设整型变量叫n,a,b,c,d均为〇,执行(m=a==b)||(n=c=d)后,m,n的值是()。A.0,0B.0,1C.1,0D.1,112.设整型变量叫ルヘト0ヨ均为均执行“(m=a〉b)&&(n=a>b)”后,m,n的值是(A.0,0B.0,1C.1,0D.1,113.设a为2,执行下列语句后,b的值不为0.5的是()。A.b=l.0/aB.b=(float)(1/a)C.b=l/(float)aD.b二l/(a*l.0)14.设a为5,执行下列语句后,b的值不为2的是()。A.b=a/2B.b=6-(-a)C.b=a%2D.b=a>3?2:215.执行语句wx=(a=3,b=a—)w后,x,a,b的值依次为()〇A.3,3,2B.3,2,2C.3,2,3D.2,3,216.intb=0,x=l:执行语句“if(x++)b=x+l;”后,x,b的值依次为()。A.2,3B.2,0C.3,0D.3,217.设有语句inta=3;»则执行了语句a+=a一=a*a;后,变量a的值是()〇A.3B.0C.9D.一1218.设有语句inta=3;,则执行了语句a+二a一二a・二a;后,变量a的值是()〇A.3B.0C.9D.一1219.inta二4,b二3,c二一2,d二2;逻辑表达式a>0&&b&&c〈0&&d>0的值是()0A.1B.0C.-1D.出错20.在以下ー组运算符中,优先级最高的运算符是()。A.<=B.=C.%D.&&21.设整型变量i的值为3,则计算表达式i—i后表达式的值为()〇A.0B.1C.2D.表达式出错22.设整型变量!,j=3;则计算表达式i=j+++j后i,j的值为()〇A.4,4B.6,6C.4,6D.6,423.设整型变量a,b,c均为2,表达式a+++b++c++的结果是()。A.6B.9C.8D.表达式出错24.设整型变量i值为2,表达式(++i)+(++i)+(++i)的结果是()〇A.6B.12C.15D.表达式出错25.设整型变量i,j值均为3,执行了“j=i++,j++,++i”后,1门的值是()。A.3,3B.5,4C.4,5D.6,626.若已定义x和y为double类型,则表达式;x二1,y二x+3/2的值是()。A.1B.2C.2.0D.2.527.sizeof(double)的结果值是()〇A.8B.4C.2D.出错28.表达式“1?(〇?3:2):(10?1:0)”A.3B.2的值是()。C.1D.029.设a=1,b=2,c=3,d=4,则表达式:zaくb?a:cくd?a:d的结果为()〇A.4B.3C.2D.130.设a为整型变量,不能正确表达数学关系:10くaく15的C语言表达式是()。

10A.1010&&a<15B.a==ll||a==12||a==13||a==14D.!(a<=10)&&!(a>=15)31.inta=0;if(a=l)a+=10I结果的值是(A.0B.11C.10D.出错32.下列表达式中符合C语言语法的赋值表达式是()。A.a=7+b+c=a+7B.a=7+b++=a+7C.a=(7+b,b++,a+7)D.a=7+b,c=a+733.设f是实型变量,下列表达式中不是逗号表达式的是()。A.f=3.2,1.0B.f>0,f<10C.f=2.0,f>0D.f=(3.2,1.0)34.下列表达式中,不正确的表达式是()。A.a=l,b=lB.y=int(x)C.a=b=5D.i++35.若有以下定义:chara、intb、floatc、doubled,则表达式a*b+d-c值的类型是()。A.floatB.intC.charD.double36.intn;floatf=13.8J执行“n=((int)f)%3"后,n的值是()。A.1B.4C.4.333333D.4.637.用十进制数表示表达式“121012”的运算结果是()。A.1B.0C.14D.1238.设有整型变量a=35,表达式’'(x&15)&&(x|15)”的值是()〇A.0B.1C.15D.3539.设字符型变量a=3,b=6,计算表达式c=(a'b)<<2后c的二进制值是()。A.00011100B.00000111C.00000001D.0001010040.设a,b和c都是int型变量,且a=3,b=4,c=5,则下面的表达式中值为0的是()。A.'a'&&'b'B.a<=bC.a||b+c&&b-cD.!((a=,A,&&ch<=,Z')?(ch+32):chA.AB.aC.ZD.z44.设有整型变量i、j、k,i值为3,j值为6。计算表达式“k=ljくく3;”后,k的值是()。A.56B.51C.40D.2745.设有无符号短整型变量i、j、k,i值为013,j值为0x13。计算表达式“k=~i|_j>>3;"后,k的值是()。A.06B.0177776C.066D.017776646.设有无符号短整型变量a值为331,计算表达式,=し>>4)&\(~0Cく4)”后,a的值是().A.0B.15C.015D.017二、填充题1.在内存中存储“A”要占用个字节,存储‘A'要占用个字节。2.C语言中的逻辑值“真”是用表示的,逻辑值“假”是用表示。逻辑表达式值为“真”是用表示的,逻辑表达式值为“假”是用表示的。3.符号常量的定义方法是。4.说明变量时,若省略存储类型符,系统默认其为存储类别,该存储类别的类型符为:〇

111.无符号基本整型的数据类型符为,双精度实型数据类型符为,字符型数据类型符为。6,定义变量的完整语句格式是=7.变量的作用域主要取决于变量,变量的生存期既取决于变量,又取决于变量«8.从变量的存储类型来说,变量不允许初始化。变量、变量和变量可以初始化。其中变量如果不进行初始化,则变量和变量的初值不确定,而变量初值为〇。9.设下列运算符:く<、+、++、&&、<=,其中优先级最高的是.优先级最低的是〇10.设二进制数A是00101101,若想通过异或运算Aや使A的高4位取反,低4位不变,则二进制数B应是。11.设a=3,b=2,c=l,则a>b的值为>a>b>c的值为。12.若已知a=10,b=20,则表达式!a

12第3章順序结构、选择结构和循环结构的程序设计学习和解题要点1.格式输入函数(1)格式输入函数中的输入格式字符串中尽量不用非格式字符,如:scanf("a=%d

13",&a);其中a=和'n属于非格式字符,用了这些非格式字符在键盘输入数据时会增加麻烦,明明想给a输入10,却要打入a=10〈回车X回车》,要知道,对于非格式字符,输入时是必须原样输入的。我们如果简单的写成scanf(嘅d”,&a);则只要打入10〈回车)即可。⑵对于作为间隔符逗号也是非格式字符:scanfC%d,%d”,&a,&b);和scanf(嘅d%d”,&a,&b);前者要用逗号间隔输入数据,后者用空格间隔输入数据。(3)被输入的变量,应该用地址,但当ー个字符数组用%s作为字符串整体输入时,只要用数组名,不必加地址,这是因为数组名即地址。(4)被输入的变量,为long和double型时,应用加1的形式如%Id和%If。(5)%0I畑是针对整数而言,而且当用于scanf时,键盘输入数据时,数前不必加。或Ox。数前加〇或Ox是指程序中出现的作为八进制或十六进制常数时。2.格式输出函数(1)格式输出函数中的输出格式字符串中的非格式字符,输出时会原样输出。适当用ー些非格式字符可增加输出的可读性。如:printf("a=%d,b=%d

14”,a,b);输出时会显不出:a=整数,b=整数。(2)当用%md形式控制输出数据的宽度时,若数据不足m位则用空格补足,若数据超过m位则以数据实际位输出。注意%s的用法。(3)被输出的变量,为long型时,要用机d形式。为float和double型时,都用%f形式。(4)当用瓶)或%x输出时,屏幕输出的数据前不会出现0或Ox。数前加0或Ox是指程序中出现的作为ハ进制或十六进制常数时。3.所有的变量都必须先定义,后使用,并且要集中在函数的前部。在中间只能在用大括号括起的复合语句中,并且,它的作用域也就是这个复合语句内。4.if语句(1)if语句的格式是:if(表达式)语句1:else语句2:注意表达式应该有括号,即使是如:if(!(a>0))也不能写成if!(a>0)〇(2)表达式可以是任何表达式。即使是赋值表达式或逗号表达式,C语言只判断表达式最后的值是〇或非〇决定执行语句1或语句2。(3)语句1或语句2只能是ー个语句,if或else如果要执行的是二个以上语句,则必须加大括号。(4)if语句有嵌套时,注意ifelse的配对。5.switch语句(1)switch语句的格式是:switch(表达式)(case常量表达式1:语句组1;)表达式应该有刮号,注意大刮号一定要有并且注意配对。(2)表达式可以是任何表达式,但是通常用整型或字符型。C语言计算表达式的值,然后找常量表达式的值匹配。(3)break是C语言的ー种语句,其作用是跳出switch语句。如果没有break,将会从某个语句组起顺次执行完所有的语句组。有时我们希望这样,有时我们不希望这样。因此可以通过break调整程序的走向。6.循环语句(1)while语句和dowhile语句的表达式都应该有括号,表达式可以是任何表达式。C语言计算表达式的值,非〇时进入或继续循环,〇时终止循环。因此,必须在某个时候使表达式的值为0,否则进入“死”循环。在调试程序时,程序不终止,或运行没有反映,很有可能逻辑上进入了

15“死”循环。(1)while语句的格式中,如果要循环执行的是二个以上语句,则必须对这些语句加大括号,成为复合语句,逻辑上当成一个语句。这一点,初学者容易疏忽。dowhile不可以代替大括号,dowhile中是二个以上语句,也必须对这些语句加大括号,成为复合语句。注意反大括号前的语句还应该有分号。dowhile(表达式);后也不能缺少分号。(2)for语句是循环语句中变化最大的语句。它的格式是:for(表达式1;表达式2;表达式3)语句;表达式1、表达式2、表达式3可以是任何表达式。特别是表达式2不一定是要关系或逻辑表达式。表达式1只执行ー次,C语言计算表达式2的值,非〇时进入或继续循环,0时终止循环。每循环一次都计算表达式3和表达式2一次。(3)for语句中,表达式1、表达式2、表达式3可以任意缺省,但必须保证有二个分号。(5)注意类似下面的错误:for(i=0,j=0;i<10,j<20;i++,j++)语句;其本意是i到10或j到20循环终止,但实际上i<10,j<20是逗号表达式,它的值以j〈20为准,当j等于20时逗号表达式值为〇,其他都是1,无论i为何值。(6)for循环执行的是ー个语句,如果要循环执行的是二个以上语句,则必须对这些语句加大括号,成为复合语句。这一点,初学者非常容易疏忽。(7)在循环体中出现(并执行)的break语句,强制中断循环,不再执行循环体中任何语句,称为“跳出”循环,这时保持循环时的所有值。当循环体中的switch语句内有break语句,则只跳出switch语句,不中断循环。同样,当switch语句中有循环内有break语句,则只跳出循环,不跳出switch语句。(8)在循环体中出现的continue语句,不再执行循环体中本语句之后的语句,重新准备继续下一次循环,称为“跳过”一次循环。(9)在循环语句嵌套时,注意外循环变化一次,内循环要从头变化,执行完整的一次内循环。如for(i=0;<5;i++)for(j=4;j;j—){}:当为i=0时,j从4变到1,当为i=l时,j再从4变到1,等等,这样{}总共执行20次。练习题一、单项选择题1.设a=3,b=4,执行“printf(“%d,%d,(a,b),(b,a));”的输出是()。A.3,4B.4,3C.3,3D.4,42.设a=1234,b=12,c=34执行“printf("|%3d%3d%-3d|

16”,a,b,c);”的输出是()。A.12341234B.1231234|C.1123412-341D.|2341234|3.使用"scanf("x=%f,y=%f”,&x,&y);”,要使x,y均为1.25,正确的输入是()。A.1.25,1.25B.1.251.25C.x=l.25,y=l.25D.x=l.25y=l.254.要使doublex;longa:获得数据,正确的输入语句是()〇A.scanfぐ・%d,%f",&a,&x);B.scanfぐ・%f,%ld”,&x,&a);C.scanf(Rd,%lf‘,&a,&x);D.scanf('%ld,%lf”,a,x);5.要使doublex;longa:的数据能正确的输出,输出语句应是()〇A.printf('*%d,%F*,a,x);B.printf(tl%d,%1£'',a,x);C.scanf('1%ld,%lf”,&a,&x);D.printf(Rid,%f”,a,x);6.设有inta=255,b=8;则printf("%x,%o

17”,a,b);的输出的是()〇A.255,8B.ff,10C.Oxff,010D.输出格式错7.设有inti=010,j=10;则printf(fd,%d

18”,++i,j—);的输出的是()0A.11,10B.9,10C.010,9D.10,9

191.设a、b为字符型变量,执行公じ》!ぜ(‘七=%儲!5=%ゼ’,&へ趴));“后使2为メ',b为‘B',从键盘上的正确输入是()。A.‘A''B'B.'A','B'C.A=A,B=BD.a=A,b=B2.设x,t均为int型变量,则执行以下语句后,t的值为()。x=10;t=x&&x>10;A.不定值B.10C.1D.010.设x,y,z,t均为int型变量,则执行以下语句后,t的值为()〇x=y=z=l;t=++x||++y&&++z;A.不定值B.2C.1D.011.启动TurboC的命令是()0A.TCB.CC.TURBO-CD.TURBOC12.假定所有变量均已正确定义,下列程序段运行后y的值是()0inta二〇,y=10;if(a=0)y—;elseif(a>0)y++;elsey+=y;A.20B.11C.9D.013.假定所有变量均已正确定义,下列程序段运行后x的值是()。a=b=c=O;x=35;if(!a)x--;elseif(b);if(c)x=3;elsex=4;A.34B.4C.35D.314.下面的程序片段所表示的数学函数关系是()。y=-l;if(x!=O)if(x>0)y=l;elsey=0;--1(x<0)T(x<0)-0(x<0)--1(x<0)A.y二0(x=0)B.y=•-1(x=0)C.y="-1(x=0)D.y="1(x=0)ゝ1(x>0).0(x>0).1(x>0).0(x>0)15.inta=l,x=l:循环语句while(a〈10)x++;a++;的循环执行()。A.无限次B.不确定次C.10次D.9次16,下列语句中,错误的是()〇A.while(x=y)5;B.dox++while(x==10);C.while(0);D.do2;while(a==b);17.循环语句for(x=0,y=0;(y!=123)1I(x<4);x++);的循环执行()«A.无限次B,不确定次C.4次D.3次18.循环语句for(i=0,x=l;i=10&&x>0;i++);的循环执行()〇A.无限次B.不确定次C.10次D.9次19.若i、j己定义为int类型,则以下程序段中内循环体的执行次数是()。for(i=5;i;i-)for(j=0;j<4;j++){}A.20B.24C.25D.3020.inti=l,s=0;while(i<100){s+=i++;if(i>100)break;}执行以上程序段后,中放的是()。A.1到101、的和B.1至U100的和C.1到99的和D.以上都不是

2021.假定i和j为int型变量,则执行以下语句后j的值为()。inti=l;switch(i++){case1:for(j=0;j<9;j++)if(i==l)break;case2:for(j=l:j<10;j++)if(i==2)break;case3:printfC*i=%d

21M,i);)A.0B.1C.9D.1022.假定a和b为int型变量,则执行以下语句后b的值为()。a=l;b=10;do{b-=a;a++;}while(b—<0);A.9B.-2C.-1D.823.设x和y均为int型变量,则执行下面的循环后,y的值为()。for(y=l,x=l;yく=50;y++){if(x>=10)break;if(x%2==l){x+=5;continue;}x-=3;)A.2B.4C.6D.824.在C语言中,下列说法中正确的是()。A.不能使用“do语句while(条件)”的循环B."do语句while(条件)”的循环必须使用“break”语句退出循环C.“do语句while(条件)”的循环中,当条件为非〇时将结束循环D.“do语句while(条件)”的循环中,当条件为0时将结束循环25.在C语言的语句中,用来决定分支流程的表达式是()。A,可用任意表达式C,只能用逻辑表达式B.只能用逻辑表达式或关系表达式D.只能用关系表达式26.若有以下程序段,sum=0;i=2;while(i<=10){sum=sum+i;i++;)sum和i都是整型变量,则不能与该程序段等价的程序段是()。A.for(i=2,sum=0;i<=10;i++)sum+=i;B.sum=0;i=2;do{sum=sum+i;i++;while(i<=10);C.sum=0;i=10;while(i>l){sum=sum+i;i—;}D.sum=0;i=ll;do{i—;sum=sum+i;}while(i>l)二、填充题1.结构化程序设计规定的三种基本结构是结构、选择结构和结构。2.三种循环语句是价的。3.当循环体中的switch语句内有break语句,则只跳出语句。同样,当switch语句中有循环语句,内有break语句,则只跳出语句。

221.循环体中的continue语句是〇2.若有定义语句“inta=25,b=14,c=19;”,以下语句的执行结果是。if(a++<=25&&b―<=2&&c++)printf(*****a=%d,b=%d,c=%d

23",a,b,c);elseprintf("***a=%d,b或d,c=%d

24",a,b,c);3.以下两条if语句可合并成一条if语句为if(a<=b)x=l;elsey=2;if(a>b)printfぐ’****y=%d

25”,y);elseprintf("****x=%d

26”,x);4.设i,j,k均为int型变量,则执行完下面的for循环后,k的值为.for(i=0,j=10;i<=j;i++,j—)k=i+j;5.下列程序的功能是输入ー个正整数,判断是否能被3或7整除,若能整除,输出“YES”,若不能整除,输出‘'N0”。请为程序填空。main(){intk;scanf("%d,,1&k);ifprintf("YES

27^^);elseprintf("N0

28");)6.下列程序从输入的整数中,统计大于零的整数个数和小于零的整数个数。用输入〇来结束输入,用i,j来放统计数。请为程序填空。main(){n,i,j;printf("输入整数,以0结束输入、n”);scanf('%!”,&n);while{if(n>0)i=;if(n<0)j=;printf("i=%4d,j=%4d

29,\i,j);7.下列程序的功能是输入ー个正整数,判断是否是素数,若为素数输出1,否则输出〇,请为程序填空。main(){inti,x,y=l;scanf('*%d",&x);for(i=2;i<=x/2;i++)if{y=0;break;}printf('*%d

30”,y);}三、程序分析题1.阅读程序,写出运行结果。main()

31{inta=10,b=4,c=3;if(aO;y-)if(y%3==0){printf(<4%d",一y);continue;}}3.阅读下列程序,写出程序运行的输出结果。main(){inti=5;do{switch(i%2){case4:i—;break;case6:iーー;continue;}i-;i-;printf("i=%dヽi);}while(i>0);5.阅读下列程序,当输入为:ab*AB%cd#CD$时,写出程序运行的输出结果。main(){charc;while((c=getchar())!='$'){if('A‘く二c&&cくニ’Z')putchar(c);elseif(4a'<=c&&cく二’z')putchar(c-32);四、程序设计题1.编ー个程序,输入华氏温度(F),按下列公式计算并输出对应的摄氏温度(C):C=5(F-32)/92.编ー个程序,输入一个整数,输出其符号(若ユ0,输出1,若く0,输出ー1)。

321.编ー个程序,输入x的值,按下列公式计算并输出y值;,x(xWl)y=<2x-l(l

33第4章数组学习和解题要点1.要学习和掌握c语言的数组问题,首先必须形成这么ー个观念,当用数组定义语句:【存储类型]数据类型数组名【长度];定义ー个数组时,表明请求计算机在内存开辟ー个大的空间,该空间的名字即为数组名,同时数组名也是该空间在内存的起始地址。空间的大小由“长度”决定,因此‘’长度”必须是正整常数明确确定。即使是N,该N也必须在前面的#defineN中明确指明是多少。该空间可放'‘长度”个同一类型的数据。放什么样的数据由数据类型指定。如:inta[10];表明内存地址为a放10个整数,每个小空间为a⑼,a[l]a[9]aa[0]all]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9|2.有的想用下面的方法定义任意大八的数组:intn:scanfぐ%F,&n);inta[n];认为从键盘输入一多少大整数给n,则就定义多少大的数组。这也是错误的。因为C语言规定,执行语句以后,就不能再出现定义语句。这种根据程序的需要随时申请空间的称为“动态数据结构”,要用以后的结构类型和指针来解决。3.可在定义数组的同时,马上就赋初值。也可由初值的个数决定数组的大小。如:inta[]={l,2,3,4,5,6,7,8,9,10);4.对数值型的数组操作,只能一个元素一个元素的使用,每一的元素的使用都可以看成一个变量的使用,称之为带下标的变量,而决不允许用数组名。如a[i]当i为多少时即为那一个元素。在程序中要时时注意现在是对那ー个元素操作,如在教材中的“冒泡排序法”和“选择排序法”的程序中要注意现在下标是那ー个元素。注意:定义中的inta[10]表示共10个元素,而程序中的a[10]表示带下标的变量。5.二维数组的定义与一维ー样,必须有二个正整常数明确确定,我们可以看成多少行和多少列个元素,如果在定义数组的同时赋初值,则第一维的长度可以省略。无论如何,第二维的长度决不能缺省。6.对数值型的二维数组,也只能一个元素一个元素的使用,这时一定要二个下标,表示那ー行那一列的元素。注意,i并不一定是行,j并不一定是列,a[j][i]在前面的下标j一定是行,后面的下标i一定是列,而无论它是什么名称。7.字符数组和字符串是对同一空间不同的理解。当我们用下标一个字符一个字符处理时,我们把它看成是字符数组,这时输入输出要用“%c”〇当我们把它看成是ー个整体时,这时是字符串。作为字符串,使用时光用数组名,不能带下标。C语言专门提供了一个“%s”来处理字符串。对字符类型的数组有%c和%s之分,而对数值型的数组就只有%d,%f等,只能是数组。8.chara[10];对scanf(缘s”,a)和printfa)都只用数组名,而不必scanf("%s”,&a),因为数组名即地址,但又可看成是字符串变量。9,所有的字符串处理函数中都用数组名,不能带下标,这时我们把它看成是字符串。10.对于字符串,C语言规定:用scanf("%s”,a)格式从键盘接收字符串时,以回车或空格作为字符串的结束,空格及空格后的字符不再被接收。而用gets(a)从键盘接收字符串时,以回车作为字符串的结束,中间的空格照样当成字符接收。用printf("%s”,a)和puts(a)输出字符串时,以,\(),作为字符串的结束,串中的空格照样当成字符输出。

3411.charaロアabed”;这时a为5个字节的字符数组,最后自动加放ー个‘、〇’字符。但strlen(a)的结果是4,表示字符串的长度。strlen测试到'、〇'为止,’、〇'不算长度。sizeof(a)是5,表示chara口类型的内存大小。12.对字符型的二维数组,当把它看成是字符串时,可以只用ー个下标。如chara[3][20];可以看成是3个20个字符的字符串,为a[〇],a[l],a[2]等。可以在任何用字符串的地方,如scanf(%s",a[〇])或puts(a[l])〇13.C语言中,单引号是用于ー个字符的,双引号是用于字符串的,要严格区分。练习题ー、单项选择题1.若有以下数组说明,则数值最大的和最小的元素下标分别是()。inta[12]={l,2,3,4,5,6,7,8,9,10,11,12);A.1,12B.0,11C.1,11D.0,122.若有以下数组说明,则i=10;a[a[i]]元素数值是()。inta[12]={l,4,7,10,2,5,8,11,3,6,9,12};A.10B.9C.6D.53.若有以下说明,则数值为4的表达式是()。inta[12]={l,2,3,4,5,6,7,8,9,10,11,12};charc=,a\d,g;A.a[g-c]B.a[4]C.D.a「d'-c]4.设有定义:chars[12]={“string”};,则p设ntfぐ・%d\rT,strlen(s));的输出是()〇A.6B.7C.11D.125.设有定义:chars[12]={"string”};,A.6B.76.下列语句中,正确的是()。A.chara[3][]={*abc\*1*};C.chara[3]口={'a','T'};则printfぐ・%d

35”,sizeof(s));的输出是()〇C.11D.12B.chara[][3]={*abc\;D.chara[][3]={"a",'T'};7.下列定义的字符数组中,输出printf(Rs

36”,str[2]);的输出是staticstr[3][20]={"basic","foxpro'',"windows"};A.basicB.foxpro8,合法的数组定义是()。A.inta[3][]={0,1,2,3,4,5};C.inta[2][3]={0,1,2,3,4,5,6};9,合法的数组定义是()。A.inta口二{“string"};C.chara={“string"};C.windowsD.输出语句出错B.inta[][3]={0,1,2,3,4};D.inta[2][3]={0,1,2,3,4,5,};B.inta[5]={0,1,2,3,4,5};D.chara[]={0,1,2,3,4,5};10语句“printf(("%d

37",strlen("ats

38012\l\\"));"的输出结果是()〇A.11B.10C.9D.811.函数调用“strcat(strcpy(strl,str2),str3)”的功能是()。A.将字符串str!复制到字符串str2中后再连接到字符串str3之后。B,将字符串str!连接到字符串str2之后再复制到字符串str3之后。C.将字符串str2复制到字符串str!中后再将字符串str3连接到字符串str!之后。D,将字符串str2连接到字符串str!之后再将字符串str!复制到字符串str3中。12.有字符数组定义如下,则合法的函数调用是()chara[]={"!amastudent"},b[]={"teacher"};

39A.strcmp(a,b);B.strcpy(a,b[0]);C.strcpy(a[7],b);D.strcat(a[7],b);12.有字符数组定义如下,则不能比较a,b两个字符串大小的表达式是()chara[]={**abcdefgM),b口={“abcdefh"};A.strcmp(a,b)==0B.strcmp(a,b)>0C.strcmp(a,b)<0D.as[k]);printf(tl%d

40",k);}10.下面程序在a数组中查找与x值相同的元素所在位置。数据从a[l]元素开始存放,请填空。#includemain(){inta[l1],i,x;

41printf(“输入10个整数:");for(i=l;i<=10;i++)scanf(fd",&a[i]);printf(“输入要找的数x:scanf(哪ザ,);a[0]=x;i=10;while(x!=);if()printf("与x值相同的元素位置是:%d

42M,i);elseprintf(“找不到与x值相同的元素!、パ);}1.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。#include“string,h”main(){inti,j,;int型k可当char型用charstr口二{“1234567”};for(i=0,j=strlen(str);:i++.i-)头尾交换,直到中间。{k=str[i];str[i]=str[j];str[j]=k;}}2.以下程序给偶数行的方阵中所有边上的元素和两对角线上的元素置!,其它元素置。。要求对每个元素只置一次值。最后按矩阵形式输出。请填空。main(){inta[10][10],i,j;for(i=0;iく10;i++){a[_][i]=l;a[i][]=1;}/・两对角线上的元素置1*/for(i=l;iく9;i++)a[0][]=1;for(i=l;iく9;i++)a[][i]=l;for(i=l;iく9;i++)a[i][]=1;for(i=l;i<9;i++)a[][9]=1;for(i=l;i<;i++)for(j=l;j<;j++)if()a[i][j]=0;for(i=0;i<10;i++){for(j=0;j<10;j++)printfe%2d",a[i][j]);})は从键盘输入一串字符,下面程序能统计输入字符中各个大写字母的个数。用#号结束输入,请填空。#includemain(){intc[26],i;charca;for(i=0;i<26;i++)c[i]=0;scanf(<4%c",&ca);while(ca!='#')

43{if((ca>=,A9)&&(ca<=9Z9))c[ca-65]+=1;scanf&ca);)for(i二〇;i<26;i++)if(c[i])printf(4t%c:%d个、n”,i+65,c[i]);}14.以下程序可把输入的十进制长整型数以十六进制数的形式输出,请填空。main(){charb[17]={“0123456789ABCDEド’};intc[64],d,i=0,base=16;longn;printf(uEnteranumber:

44");scanf(哪Id",&n);do{c[i]=n%base;i++;n=n/base;}while(n!=0);printf(44Transmitenewbase:

45");for(-i;i>=0;--i){d=c[i];printf(t4%c",b[d]);}}三、程序分析题1.阅读程序,分析程序的功能。#include#includemain(){chars[80];inti;for(i=0;i<80;i++){s[i]=getchar();if(s[i]=='

46')break;)s[i]='\0';i=0;while(s[i])putchar(s[i++]);putchar('

47');}2.说明下列程序的功能。#include#includemain(){charstr[10][80],c[80];inti;for(i=0;iく10;i++)gets(str[i]);

48strcpy(c,str[0]);for(i=l;i<10;i++)if(strlen(c)

49",c);printf(t4%d

50",strlen(c));1.说明下列程序的功能。#include#includemain(){chara[10][80],c[80];inti,j,k;for(i=0;i<10;i++)gets(a[i]);for(i=0;i<9;i++){k=i;for(j=i+l;j<10;j++)if(strcmp(a[j],a[k])<0)k=j;if(k!=i){strcpy(c,a[i]);strcpy(a[i],a[k]);strcpy(a[k],c);})for(i=0;i<10;i++)puts(a[i]);)2.阅读程序,写出运行结果:main(){staticinta[][3]={9,7,5,3,1,2,4,6,8};inti,j,sl=0,s2=0;for(i=0;i<3;i++)for(j=0;j<3;j++){if(i==j)sl=sl+a[i][j];if(i+j==2)s2=s2+a[i][j];}printfC*%d

51%d

52”,si,s2);}3.说明下列程序的功能。main(){inti,j;floata[3][3],b[3][3],x;for(i=0;i<3;i++)for(j=0;j<3;j++){scanf&x);a[i][j]=x;}for(i=0;i<3;i++)for(j=0;j<3;j++)b[j][i]=a[i][j];//a的第i行第j列放到b的第j行第i列

53for(i=0;i<3;i++){printf(“

54”);for(j=0;j<3;j++)printf(Rf4t,b[i][j]);}1.写出下列程序的运行结果。main(){staticcharaロ=,*'};inti,j,k;for(i=0;i<5;i++){printf("、パ);for(j=0;jmain(){charstrロメ’SSSWILTECH1、1、11叭1WALLMPF';intk;charc;for(k=2;(c=str[k])!メ、〇';k++){switch(c){case*A':putchar(*a');continue;caseT:break;case1:while((c=str[++k])!=,、l'&&c!ゴ、。');case9:putchar('#');case'E':case'L':continue;default:putchar(c);continue;

55)putchar(**');printf(“、n");四、程序设计题1.编程序。输入单精度型ー维数组a[10],计算并输入a数组中所有元素的平均值。2.编程序。输入10个整数存入一维数组,再按逆序重新存放后再输出。3.求一个3X3矩阵对角线元素之和。4.编程序。输入两个字符串(<40个字符),连接后输出(不准用系统函数)。5.编程序按下列公司计算s的值(其中xl、x2、、…、xn由键盘输入)。s=S(xi-xO)2e(其中xO是xl、x2、、…、xn的平均值)6.输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。7.输入一个字符串,将其中的所有大写字母改为小写字母,而所有下写字母全部改为大写字母,然后输出。8.设某班50名学生的三种成绩表如下:课程一课程二课程三试编ー个程序,输入这50个学生的三科成绩,计算并输入每科成绩的平均分。9.编ー个程序,输入ー个短整型数据,输出每位数字,其间用逗号分隔。例如输入整数为2345,则输出应为:2,3,4,5。10.找出ー个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。11.编ー个程序,输入一个字符串,将其中所有的大写英文字母+3,小写英文字母ー3。然后再输出加密后的字符串。12.编ー个程序,将按第9题中加密的字符串(从键盘输入)解密后输出。13.有15个整数按由大到小顺序存放在ー个数组中,输入ー个整数,要求用二分查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印‘‘找不到”。14.有3行每行80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

56学习和解题要点1.内存空间和地址:c程序中定义的任何类型的变量,相当于在计算机内存中开辟存贮空间。每个空间除了有名称(变量名)可放什么样的数值类型之外,还有一个地址的概念。如:inti,j"为可放整型的名叫i和j的变量,则它们的地址分别为&i,幻。ー维数组的名称(数组名)即为地址,如inta[20]则a即为地址,也代表第一个元素a[〇]的地址&a[0],二维数组的intb[3][4];数组名b也是地址,但它不能代表第。行第〇列元素的地址。对二维数组这里有二个层次的地址概念。二维数组b可以看成三个ー维数组组成,它们的名称分别为b[0],b[l],b[2]o它们分别是&b[〇][〇],&b[l][O],&b[2][0]三个第一个元素(每个是ー个整数)的地址。这时b可以看成大元素的(每个元素为4个整数)的数组的地址了,因此b就不是简单的ー个整数的地址,也就是说b(也可写成b+O)代表了b[0]的地址,b+1代表了b[l]的地址。bb[O]「b[l]'b[2]以上讲的地址&i,b[O],b等都是常量,称为地址常量,ー当定义就不可以再变的。2.指针变量:简单地说就是放地址的变量,它是内存中一个空间,不放数据专放地址,不同时候可放不同地址,因此不是如前的地址常量而是可变的变量。指针变量的定义如:有定义inti,*p;p是ー个变量的名称,但它不是一般的变量而是有个・特别标明以示与i的区别。因此这里・是ー个记号表示p与i不同,是指针变量。p可以放ー个地址数但又不是任何的地址数,只可放整型数的地址,如p=&i;因此int*p有三个意义:①说明p是变量名,②有・说明P是指针变量名,③说明p只能放整型数的地址。3.对指针变量的操作赋值操作:通过求地址运算符&求出存储单元地址,赋给指针变量,或把ー维数组名赋给指针变量如:inti,a[10],*p,*q:可以p=&i或p=a;p=&a[〇]等,二个指针变量之间赋值:q=P表示q与P指向同一个地方,或该q跟着P指。当指针变量指向数组后,对指针变量可以比较和加减整数的运算。表示指针变量指向数组元素的前后和在数组元素上移动。4.取指针所指的空间指针运算符・表示取出指针所指的空间(变量或数组元素)如inti=3,*p;p=&i则*p即i,用・p输出时即为3。又如inta[4]=[10,11,12,14},p=a,则・p即为a[〇]为10。5.指向动态分配的空间C语言有一个函数malloc可在程序运行时动态的分配空间,其用法为:p=(类型名・)malloc(sizeof(类型名))。表示由sizeof(类型名)测出该类型所需的字节数,malloc申请这么多字节,同时把它强制类型转换成(类型名・)地址。p是指针变量,就指向这个地址。当然P应预先定义成这个类型的指针变量。6.指向ー维数组的指针的使用当指针指向ー维数组如:int*p,a[10];p=a;后,则p即与a等效,可用p[0],p[l]p[9]与a[O],a[l],...a[9]代表下标元素。也可用・p,*(p+l)...*(p+q)与*a,*(a+l),...*(a+9)

57代表下标元素。另外,与a不同的是p可以为p=p+l或p++运算表示p在数组元素上“移动”。7.指向二维数组的指针的使用变通的指针变量(我们称之为“小”指针),如intb[3][4],*p可以用来指向二维数组,这时把二维数组看成几^ー维的数组ー个ー个的处理才可以。如p=b[O]或p=*b,p=b[l]或p=*(b+l),这里不能写成p=b或p=b+l。*(b+l)与b+1是地址相同概念不同的。b+1代表第1行的地址,我们可称“行地址”,而・(b+1)是第一行第〇列元素的地址,我们可称“元素地址”,由于p是小指针因此只能用来指向元素地址・(b+1),而不能指向b+1。这样取第j个元素可用*(p+j),或*(p+i*4+j)或*p++等。不能用・(*(p+i)+j),p是小指针,+i只是走过i个元素而不是走i行。专门指向数组的指针,我们称之为“大”指针,如int(*p)[4],intb[3][4];可以用来指向二维数组的整个ー维如p=b,p=b+l,而(*p)[j]表示该行第j个元素了。另外还可以用p+i表示移i行,*(p+i)表示该行首元素地址・*(p+i)表示该行首元素值,*(p+i)+j表示在该行位移j地址,*(*(p+i)+j)表示该行第j个元素值。pr,————————-1p_qローlL-J„JEZ3-I8.指针数组和多维指针当定义成int*p[4];时,表示有4个指针,可以用来指向不同的4个整型变量或4个整型数组。使用时要一个ー个的,如p[O]=&i,p[l]=&_j等等。当定义成int**p,表示p是指针的指针,即可以指向指针变量,如int**p,*q,iq=&i,p=&q9.对于字符型的数组,用字符指针特别有意义。当charstr[20],*p;p=str;p就可以当成字符串使用,出现在任何字符串函数中。对于char*p[4];这种指针数组就更加有意义,它表示4个字符指针,可以分别指向4个不同的字符数组(字符串)。注意:charp[10]是10个字符的字符数组char*p[10]是10个指针的数组有!0个字符型指针。10.当指针变量指向一维数组时注意下面的区别:*p++等价于・(P++)取・p的值,后p加1(*p)++取・p的值,后・p的值加1*(++p)与・++p等价,p自加,再取・p值。11.指向结构的指针,有指向结构体的指针和指向结构数组的指针。如:structst{intsno;charsn[10];}s,a[5],*p;指向结构体的指针相当于指针指向单个变量,用p=&s;取结构体的成员用:p->sno指向结构数组的指针相当于指针指向ー维数组,用p=a;可用p++或p+i取数组元素。12.在使用指针变量中,要充分注意C语言并不给指针变量赋初值,因此程序中如果未给指针赋值,则称该指针变量为“无向指针”,使用这种指针是十分危险的。例如:inti=10,*p;*p=10,或・p=i是错误的,因为p没有指向的空间。因此,10或i的值无法赋给・p。同样如有:inta=10,b=20,*p;交换a和b值写成:*p=a;a=b;b=*p;这里・p也是没有指向空间的“无向指针”。同样,char*str;scanfぐ・%s”,str);也是错误的。13.指向数组的指针的例子例1:main(){staticinta[10]={0,1,2,3,4,5,6,7,8,9};int*p,i;printf("打印,移动指针:

58");

59printf("数组a中的值:、rT);for(i=0;i<10;i++)printf("刎,",a[i]);printf("

60");p=&a[4];for(i=4;i〈=6;i++,p++)printf("%d,",*p);printf("

61");printf("%d",*p);printf("endp++

62");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

63");p=&a[4];for(i=4;i<=6;i++,p-)printf("%d,",*p);printf("

64");printf("%d",*p);printf("endp--

65");printf("边打印,边移动指针,不加括号:、n");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

66");p=a;for(i二〇;iく10;i++)printf("%d,",*p++);printf("end*p++、n");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

67");p=&a[9];for(i=0;i<10;i++)printf("%d,",*p-);printf("end*p-

68");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

69");p=a;for(i=0;i<9;i++)printf("%d,",*++p);printf("end*++p、n");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

70");p=&a[9];for(i=0;i<9;i++)printf("%d,",*一p);printf("end*—p

71");printf("边打印,边移动指针,加括号:、n");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

72");P=a;for(i=0;i<10;i++)printf("%d,",*(p++));printf("end*(p++)、n");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

73");P=&a[9];for(i=0;i<10;i++)printf("%d,",*(p--));printf("end*(p--)

74");printf("数组a中的值:、n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

75");P二a;for(i=0;iく9;i++)printf("%d,",*(++p));printf("end*(++p)

76");

77printf("数组a中的值:'n");for(i=0;i<10;i++)printf(*%d,a[i]);printf(*

78*);P=&a[9];for(i=0;i<9;i++)printf("%d,",*(―p));printf("end*(--p)

79");printf("边打印,边使值变化:'n");printf(“数组a中的值:'n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

80");P=a;for(i=0;i<10;i++,p++)printf("%d,",(*p)++);printf("end(*p)++)'n");printf("数组a中的值:'n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

81");p=a;for(i=0;iく10;i++,p++)printf("%d,",(*p)―);printf("end(*p)—

82");printf("数组a中的值:'n");for(i二〇;iく10;i++)printf("%d,",a[i]);printf("

83");P=a;for(i=0;i<10;i++,p++)printf("%d,",++(*p));printf("end++(*p)

84");printf("数组a中的值:'n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("

85");p=a;for(i二〇;iく10;i++,p++)printf("%d,",―(*p));printf("end—(*p)

86");例2:#includevoidmain(){statica[3][4]={1,2,3,4,5,6,7,8,9,10,11,12);inti,j;int(*p)[4],*q;〃p是“大”指针,q是“小”指针p=a;〃p指向二维数组a中的ー维for(i=0;i<3;i++){p=a+i;〃p移动即移过一行for(j=0;j<4;j++)printf("%d,",(*p)[j]);〃取这行的j元素printf("

87");)P=a;for(i=0;i<3;i++){//p+i第i行,*(p+i)第i行首元素地址,*(p+i)+j位移j,*(*(p+i)+j)取元素for(j=0;j<4;j++)printf("%d,",*(*(p+i)+j));printf("

88");)q二a[0];//q是“小”指针,指向首元素for(i=0;i<3;i++){q=・(a+i);〃q指向i行首元素for(j=0;j<4;j++)printf("%d,",*(q+j));〃移过q+j,取元素・(q+j)q=a[0]!〃q指向首元素for(i=0;i<3;i++)

89{for(j=0;j<4;j++)printf(〃%d,〃,*(q+i*4+j));〃移过q+i*4+j,取元素*(q+i*4+j)printf(ヽn");)q二a[0];〃q指向首元素for(i=0;i<3;i++){for(j=0;j<4;j++)printf("刎,",*q++);〃行列ー个ー个的移printf("

90");}q=a[0];for(i=0;i<12;i++)printf("%d,",*q++);〃ー4・一・个的移,移12次printf("

91");for(q=a[0];q

92");练习题ー、单项选择题1.对于同类型的指针变量,不可能进行的运算是()。A.-B.=c.+D,ニニ2.下列不正确的定义是()。A.int*p二&i,i;B.int*p,i;C.inti,*p二&i;D.inti,*p;3.下列正确的定义是(A.intx二3,*p二1;B.intx=3,*P;C.intx二3,*p二x;D.int*p二&x二3;4.设有定义“a=3,b,*p=,则下列语句中使b不为3的语句是()。A.b=*&a;B.b二・p;C.b=a;D.b二・a;5.设指针x指向的整型变量值为25,则printf(Rd

93”,++*x);的输出是()。A.23B.24C.25D.266•若有说明:“inti,j=7,*p=&i;"则与i二j;等价的语句是()。A.i二*p;B.*p二*&j;C.i二&j;D.i二**p;7•若有说明:“charch,*p;”则不能正确获得值的语句是()。A.*p二getchar();B.p二&ch;scanf(fc",p);C.p=(char*)malloc(l);*p=getchar();D.p=&ch;*p=getchar();8.若有以下定义,且。く二iく5,则对数组元素错误的引用是()。inta[]={l,2,3,4,5},*p=a,i;A.*(a+i)B.a[p-a]C.p+iD.*(&a[i])9.若有说明语句“inta[5],*p=a;”,对数组元素的正确引用是()。A.*&a[5]B.*p+2C.*(a+2)D.*a++10.若有说明语句“inta[5],*p=a;”,对数组元素的正确引用是()。A.a[p]B.p[a]C.*(p+2)D.p+211.若有以下定义,且。く二iく5,则对数组元素地址的正确表示是()。intaロ二{1,2,3,4,5},*p二a,i;

94A.&(a+i)B.a++C.&pD.&p[i]8.下面各语句中,能正确进行赋字符串操作的语句是()〇A.chars⑸={"ABCDE"};C.char*s;s="ABCDE";B.chars[5]={*A*,'B',B','D',笛’};D.char*s;scanfC,%sM,&s);9.若有以下定义,则・(p+5)的值为()。A.'0'B.'\0'C.'O'的地址14.若有以下定义,则不能表示a数组元素的表达式是()。inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;A.*pB.a[10]C.*a15.若有以下的定义,则值为3的表达式是()。inta[10]={l,2,3,4,5,6,7,8,9,10},*p=a;A.p+=2,*(p++)B.p+=2,*++pC.p+=3,*p++D,不确定的值D.a[pa]D.p+=2,++*p;chars[]="Hello",*p=s;16.执行语句“chara[10]={"abed"},*p=a"后,*(p+4)的值是()〇A."abed"B.'d'C.'\0'D.不能确定17.若有定义“inta[3][4];”,则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引用是()«A.*(a+4*i+j)B.*(*(a+i)+j)C.*(a+i)[j]D.a[i]+j18.若有定义“inta[3][4],*p;",则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引用是().A.p=aB.*(*(p+i)+j)C.*(p+i*4+j)D.*(*(a+i)+j)19.若有定义“inta[3][4],(*p)[3];”,则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引A.p=a[i]B.p=&a[i][j]C.*(p+i*4+j)D.*(*(p+i)+j)20.若有定义“inta[3][4],*p,*q[3];",且0<=i<3,则错误的赋值语句是()。A.p=aB.q[i]=a[i]C.p=a[i]D.q[i]=&a[2][0]21.设有定义语句“int(*ptr)[10];M,其中的ptr是()»A.10个指向整型变量的函数指针B.指向10个整型变量的函数指针C.ー个指向具有10个元素的ー维数组的指针D,具有10个指针元素的ー维数组22.若有以下定义,则数值为4的表达式是()。intw[3][4]={{0,1},{2,4},{0,1},{0,1}},(*p)[4]=w;A.*w[l]+lB.p++,*(p+l)C.w[2][2]D.p[l][l]23.若有下面的程序片段,则对数组元素的错误引用是()。inta[12]={0},*p[3],**p,i;for(i=0;i<3;i++)p[i]=&a[i*4];PP=P:A.pp[O][l]B.a[10]C.p[3][l]D.*(*(+2)+2)24.若有如下定义和语句,则输出结果是()。int**pp,*p,a=10,b=20;pp=&p;p=&a;p=&b;printf(*'%d,%d

95",*p,**pp);A.10,20B.10,10C.20,10D.20,2025.若有以下定义和语句,则对w数组元素的非法引用是()。

96intw[2][3],(*pw)[3];pw=w;A.*(w[0]+2)B.*pw⑵C.pw[0][0]D.*(pw[l]+2)二、填充题1.C语言中,数组名是一个常量,不能对它进行和运算。由代表它的首地址。2.在C程序中,指针变量只能赋值和值。3.在C程序中,指针变量可以通过,,三种方式赋值。4.在C程序中,可以对指针变量进行和来移动指针。5.“*”称为运算符,"也”称为运算符。6.若两个指针变量指向同一个数组的不同元素,可以进行减法运算和运算。7.设inta[10],*p=a:则对a[3]的引用可以是p[]和*(p8.若d是已定义的双精度变量,再定义ー个指向d的指针变量p的语句是«9.&后跟变量名,表示该变量的,・后跟指针变量名,表示该指计变量,&后指针变量名,表示该指针变量的。10.设有intsz[4],*p=sz:有,>和四种不同的引用数组元素的方法。11.设有char*a="ABCD“;,则printf(嘅s”,a)的输出是:而printf(哪c",*a)的输出是012.设有以下定义和语句,则的值为0inta[3][2]={10,20,30,40,50,60},(*p)[2];p=a;13.以下程序用指针指向三个整型存储单元,输入三个整数,选出其中最小值并输出,请填空。^includemain(){int;a=(int*)malloc(sizeof(int));b=(int*)malloc(sizeof(int));c=(int*)malloc(sizeof(int));min=(int*)malloc(sizeof(int));printf(“输入三个整数:

97");scanfe%d%d断T,);printf(“输出这三个整数:%d%d%d

98”,);*min=*a;if(*a>*b);if(>*c);printf(“输出最小整数:%d

99",);}14.以下程序的功能是从键盘上输入若干个字符(以回车键作为结束)组成一个字符串存入ー个字符数组,然后输出该字符数组中的字符串。请填空。#include"stdio.h"^includeuctype.h"main(){charstr[81],*sptr;inti;for(i=0;i<80;i++){str[i]=getchar();if(str[i]ニニ’'n')break;}str[i]=sptr=str;

100while(*sptr)putchar(*sptr);}15I以下程序从输入的10个字符串中找出最长的那个串及长度。请填空。#include#includemain(){charstrLlO][80],*sp;inti;for(i=0;i<10;i++)gets(str[i]);sp=str[0];for(i=0;i<10;i++)if(strlen(sp)

101*\);printf(“输出最长的那个串的长度:%d

102”,);}三、程序分析题1.阅读下列程序,写出程序的输出结果。main(){char*a[6]={“AB",“CD”,“EF”,“GIF,"IJ”,"KL”};inti;for(i=0;i<4;i++)printf(“%s”,a[i]);printf("

103”);}2.阅读程序,写出程序的主要功能。main(){inti,a[10],*p=&a[9];for(i=0;iく10;i++)scanfぐ・%d”,&a[i]);for(;p>=a;p—)printf(“%d

104",*p);)3.阅读下列程序,写出程序运行的输出结果。charsロゴ'ABCD”;main(){char*p;for(p=s;p*(a+i)){c=*(a+i);p_c=&a[i];}i二*a;*a二*pb;*p_b=i;i=*(a+5);*(a+5)-*p_c;*p_c=i;

105printf(**%d,%d,%d,%d,%d,%d

106M,a[0],a[l],a[2],a[3],a[4],a[5]):}1.设有下列程序,当输入字符串“LEVEL”和“LEVAL”时,试写出运行的结果。Sinclude^includevoidmain(){chars[81],*pi,*pj;intn;gets(s);n=strlen(s);pi=s;pj=s+n-l;while(*pi==,')pi++;while(*pj=*f)pj—;while((pi

107");elseprintf("YES'n");)2.阅读下列程序,写出程序运行的输出结果。#includevoidmain(){char*alpha[4]={〃ABCD","EFGH","IJKL","MNOP"};char*p;inti;p=alpha[0];for(i=0;i<4;p=alpha[++i])printfド%c”,*(p));printf('

108");}3.阅读下列程序,写出程序运行的输出结果。#includevoidmain(){ints[4][4],i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)*(*(s+i)+j)=i-j;for(j=0;j<4;j++){for(i=0;i<4;i++)printf("%4d〃,*(*(s+i)+j));printf("

109");)}4.阅读下列程序,写出程序运行的输出结果。#includevoidmain(){staticinta[4][4];int*p[4],i,j;for(i=0;i<4;i++)p[i]=&a[i][0];for(i=0;i<4;i++){*(p[i]+i)=l;*(p[i]+4-(i+l))=l;}

110for(i=0;i<4;i++){for(j=0;j<4;j++)printf(以2d",p[i][j]);printf("

111");))四、程序设计题(全部题目均要求用指针方法实现)1.输入3个整数,按从大到小的次序输出。2.编ー个程序,输入15个整数存入一维数组,再按逆序重新存放后再输出。3.输入一个字符串,按相反次序输出其中的所有字符。4.输入ー个ー维实型数组,输出其中的最大值、最小值和平均值。5.输入一个3X6的二维整型数组,输出其中最大值、最小值及其所在的行列下标。6.输入3个字符串,输出其中最大的字符串。7.输入2个字符串,将其连接后输出。8.比较2个字符串是否相等。9.输入10个整数,将其中最大数和最后一个数交换,最小数和第1个数交换。10.有10个整数,编ー程序使它循环后移4个位置,再输出该整数。11.写ー程序,将一个3X3的整数矩阵转置,并输出。12.写ー程序,输入一字符串,输出其长度。13.写ー程序,输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少?14.将输入的ー个字符串从第m个字符开始的全部字符复制到另一字符串并输出。15.把10个字符串从小到大排序并输出。

112学习和解题要点1.函数的概念和作用在c程序设计中,为了能完成某种特定的功能,并且能适应不同的被加工数据,返回不同的结果,通常都用函数的形式来设计程序。一个较大的问题(程序),一般都被分解成若干个功能来完成,每个功能即ー个函数ーー程序模块,这也是结构化程序设计的思想。在c语言中一般函数可写成:〈数据类型〉〈函数名〉(〈形参1〉,〈形参2>)return(〈返回值〉);)在某个地方要用函数时,可调用函数:〈函数名〉(〈实参1〉,〈实参2〉)因此,函数可比仿成一个加工器(黑盒):来料说明(形参〉产品(函数返回值)比如函数是磨粉机,形参相当于来料说明,如可加工五谷,函数值是加工结果,如磨成的粉。调用函数即开始使用磨粉机,实参用具体的大米,返回大米粉。实参用小麦,返回面粉等等。2.函数的定义存储类型(返回的)数据类型函数名(形参说明语句序列)(注:此地分不能有分号){函数内用的变量说明序列;(临时工作单元)可执行语句序列;(包括return(表达式)语句))函数的返回值一般是通过return语句获得的。返回的数据类型说明一般应该和return语句中的表达式类型一致,若不一致则以数据类型说明为准。如函数中没有return语句或return:函数无返回值,返回一个用户很难确定的值。说明:函数的数据类型:intcharshortlongfloatdouble・类型。缺省为int型。不返回值为void型。函数的存储类型:内部函数本文件内有效static外部函数可被其他文件函数调用extern3.函数调用:函数名(实参表)可以为独立语句:函数名(实参表);表达式中:变量=函数名(实参表)+其他式;

113实参表与形参表的对应一般要做到三个一致:个数一致类型一致(在学指针时,指针变量和地址对应)次序一致实参都应该己预先说明的,并有确定的值。一般,函数都应先定义后调用。对函数返回值是int或char的可先调用后定义。如果非int或char型的函数一定要先调用后定义,则在函数调用语句前先作一个‘‘申明”,申明的方法是相当于把函数头部抄一遍,加一个分号:存储类型(返回的)数据类型函数名(形参表);(注:此地分号不可少)1.函数调用的数据传递把实参数据复制给形参,形参变量内数据变化不影响实参ーー值调用。这是C语言函数最常规的调用方式main()a45X45{inta=45,b=50;c=max(a,b);1)b50y50intmax(intx,inty){}把实参的地址传给形参,这时形参变量应为指针变量,因此形参实参共用ー个内存位置,形参值的变化也即实参值的变化ーー地址调用(名调用)。#includemain(){inta=50,b=80;swap(&a,&b):)voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;这种方法可使函数除return返回值外,还可通过形参返回值。数组与函数指定的个别数组元素作实参时,是值调用。在C语言中,由于数组名作为地址,因此实参和变参在以下四种情况时都为地址调用:实参和形参都用数组名实参用数组名,形参用指针变量实参和形参都用指针变量实参用指针变量,形参为数组名对后二种情况,实参指针都应先指向具体的数组。无论值调用还是地址调用,都是只能把实参的值传送给形参,形参的值不能传回给实参。2.变量的作用域和生存期变量的作用域是指在程序中可使用(出现)该变量的范围。有全局变量和局部变量。变量的生存期是指(计算机)系统给变量分配内存空间到撒消空间的时段。

114有分配以后固定存储空间(静态存储类别),直到程序结束オ撒消。有随时分配随时撤消的动态分配(动态存储类别).具体有四种自动的(auto)静态的(static)寄存器的(register)外部的(extern)两者有联系又有区别,先要生存才能使用,但不能使用时并不是不存在。总的来说下面几点是重要的:函数的形参和函内定义的变量是局部变量,不在函数内定义的变量是全局变量。只有在定义全局变量和局部静态变量时才能对数组初始化。变量的生存期和作用域变量允许的存储方式生存期作用域外部变量省略(称无存储类型)静态存储时段定义点到程序结束全局变量static内部变量省略(默认为auto)动态存储时段定义该变量的函数或复合语句内部局部变量autoregisterstatic静态存储时段6.递归函数函数体内,直接或间接地调用自己。最终有一个出口,不再调用自己。用推展和回溯法读递归函数的计算结果:intf(intn){inty;2549if(n>0)y=3*f(n-l)+5;elsey=l;return(y);)当inta=6,z;z=f(a);答案为2549练习题ー、单项选择题f(6)""p*f(5)+5848-(13*f(4)+5♦281-(13*f(3)+53*f(2)+593*f(l)+5"8~|「3*f(0)+5n__t11.在C语言程序中,有关函数的定义正确的是()A,函数的定义可以嵌套,但函数的调用不可以嵌套B.函数的定义不可以嵌套,但函数的调用可以嵌套C,函数的定义和函数的调用均不可以嵌套D.函数的定义和函数的调用均可以嵌套2.以下对C语言函数的有关描述中,正确的是()。A.在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参B.C函数既可以嵌套定义又可递归调用C,函数必须有返回值,否则不能使用函数D.C程序中有调用关系的所有函数必须放在同一个源程序文件中3.函数调用语句“f((el,e2),(e3,e4,e5));”中参数个数是()。A.5B.4C.2D.14.C语言中函数的隐含存储类型是(

115A.autoB.staticC.5.能把函数处理结果的二个数据返回给主调函数A.return这二个数B.C,形参用二个这种数据类型的指针D.6.有一函数的定义如:voidfun(char*s){.A.main()B.{chara[20]=uabcdefghM:fun(a);externD.无存储类型,在下面的方法中不正确的是()形参用二个元素的数组用二个全局变量},则不正确的函数调用是()main(){chara[20]=Mabcdefghv;fun(&a[〇]);}C.main(){chara[20]=ttabcdefghM;char*p二a;fun(p);D.}main(){chara[20]=MabcdefghM;fun(a[]);}}7.函数的功能是交换x和y中的值,且通过正确调用返回交换结果。不能正确执行此功能的函数是()«A.funa(int*x,int*y)B.funa(intx,inty){inti,*p=&i;{intt;*p=*x;*x=*y;*y=*p;t=x;x=y;y=t;})C.funa(int*x,int*y)D.funa(int*x,int*y)(intp;{p=*x;*x=・y;*y=p;*x=*x+*y;*y=・x-*y;*x二・x一・y;})8.要求函数的功能是在ー维数组a中查找x值:若找到则返回所在的下标值,否则返回0;数放在a[l]到a[n]中。不能正确执行此功能的函数是()。A.funa(int*a,intn,intx){*a=x;while(a[n]!=x)n--;return(n);)C.func(inta[],intn,intx){int*k;a[O]=x;k=a+n;while(*k!=x)k-;return(k-n);)9.以下程序的输出结果是()。B.funb(int*a,intn,intx){intk;for(k=l;k<=n;k++)if(a[k]==x)return(k);return(0);}D.fund(inta[],intn,intx){intk=0;dok++;while((ksubl(chara,charb){charc;c=a;a=b;b=c;}sub2(char*a,charb){charc;c=*a;*a=b;b=c;}

116sub3(char*a,char*b){charc;c=*a;*a=*b;*b=c;}main(){chara,b;a='A';b='B';sub3(&a,&b);putchar(a);putchar(b)a='A';b二'B';sub2(&a,b);putchar(a);putchar(b);a二'A';b二'B';subl(a,b);putchar(a);putchar(b);A.BABBABB.ABBBBAC.BABABAD.BAABBA10.以下程序的输出结果是()。fun(char**m){++m;printfC*%s

117”,*m);}main(){char*a[]={"BASIC",“FOXPRO",“C"};fun(a);}A.BASICB.ASICC.FOXPROD.C二、填充题1.静态型内部变量的作用域是.2.函数中的形参和调用时的实参都是数组名时,传递方式为,都是变量时,传递方式为»3.函数的形式参数的作用域为,全局的外部变量和函数体内定义的局部变量重名时,变量优先。4.若自定义函数要求返回一个值,则应在该函数体中有一条语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符«5.若函数的形式参数是指针类型,则实参可以是ヽ或。6.若给fun函数的形参s传递字符串:“UU6354abc”(其中“U”表示空格字符),则函数的返回值是。^includelongfun(chars[]){longn;intsign;for(;isspace(*s);s++);sign=(*s==f?-1:1;if(*s=='+'I|*s==")s++;for(n=0;isdigit(*s);s++)n=10*n+(*s-'0‘);return(sign*n);}7.下面函数要求计算两个整数x、y之和,并通过形参z传回该和值,请填空。voidadd(intx,inty,){=x+y;return;}8,以下函数用来在w数组中插入x。n所指向的存储单元中存放w数组中字符个数。数组w中的字符已按从小到大的顺序排列,插入后数组w中的字符仍有序。请填空。voidfun(char*w,charx,int*n){inti,p;P=0;w[*n]=x;while(x>w[p])p++;for(i=*n;i>p;i-)w[i]=w[i-l];w[p]=x;++*n;}9.函数my_cmp()的功能是比较字符串s和t的大小,当s等于t时返回〇,否则返回s和t的第一个不同字符的ASCII码差值,即当s>t时返回正值,当sくt时返回负值。请填空。my_cmp(char*s,char*t)

118{while(*s==*t)(if(*sニニ‘、〇')return(0);++s;++t;}return();}9.以下程序是把字符串中的内容按逆序输出,但不改变串中的内容,请填空。voidinverp(char*a){if(!)return;inverp(a+l);printfCV,*);)三、程序分析题1.阅读函数,写出函数的主要功能。ch(int*pl,int*p2){intp;if(*pl>*p2){p=・pl;*pl=*p2;*p2=p;}}2.阅读函数,写出函数的主要功能。floatav(floataロ,intn){inti;floats;for(i=0,s二。;iくn;i++)s=s+a[i];return(s/n);)3.阅读下面程序,写出运算结果。unsignedfun6(unsignednum){unsignedk=l;do{k*=num%10;num/=10;}while(num);returnk;)main(){unsignedn=26;printfC*%d

119",fun6(n));4.阅读下面程序,写出运算结果,并说明原因。#includemain(){inta[]={3,8,4,2},i;intx=O;for(i=0;i<4;i++){sub(a,x);printfぐ・%3d”,x);})sub(int*s,inty){staticintt=0;y=s[t];t++;}5.阅读下面程序,写出运算结果,并说明函数的功能。#includemain()

120{intm,row,col;inta[3][3]={50,-30,90,35,45,-85,-17,57,97);func(a,&m,&row,&col,3,3);printf(44%d,%d,%d

121”,m,row,col);)func(inta[][],int*x,int*y,int*z,intm,intn){inti,j,*x=a[0][0];for(i=0;imain(){printf(44%5d

122”fun(4));}fun(intn){intt;if((n==0)II(n==l))t=3;elset=n*fun(n-1);returnt;)四、程序设计题1.编ー个名为root的函数,求方程ax2+bx+c二〇的b2-4ac,并作为函数的返回值。其中的a、b、c作为函数的形式参数。2.编ー个函数,若有参数y为闰年,则返回1;否则返回〇。3.编ー个无返回值、名为root2的函数,要求如下:形式参数:a,b,c单精度实型,root单精度实型数组名。功能:计算ax2+bx+c=0的两个实根(设b2-4ac>0)存入root[2]中。4.编ー个无返回值、名为max_min的函数,对两个整数实参能求出它们的最大公约数和最小公倍数并显示。5.编ー个能判断ー个整数是否是素数的函数,并用它求出3到100之间的所有素数。6.编ー个名为days的函数,要求如下:形式参数:整数y,m,d分别表示年、月、日。功能:计算该日是该年的第几天。返回值:整数第几天。7.编一个无返回值、名为trus的函数,要求如下:形式参数:sl[2][3],s2[3][2]整型数组。功能:将si数组转置后存入s2数组中。8.编ー个名为countc函数,要求如下:形式参数:array存放字符串的字符型数组名。

123功能:统计array数组中大写字母的数目。返回值:字符串中大写字母的数目。1.编ー个名为link函数,要求如下:形式参数:si[40],s2[40],s3[80]存放字符串的字符型数组。功能:将s2连接到s1后存入s3中。返回值:连接后字符串的长度。2.编ー个函数,返回ー维实型数组前n个元素的最大数、最小数和平均值。数组、n和最大数、最小数、平均值均作为函数的形式参数,本函数无返回值(用指针方法实现)。3.编ー个函数,用“冒泡法”对字符数组中的字符按由小到大顺序排列。要求字符数组作为形参。4.编ー函数,能将十六进制数转换成十进制数。形参:字符指针,指向放十六进制数的字符数组返回值:十进制整数5.用递归法将一个整数转换成字符串。

124第7章结构型、共用型和枚举型学习和解题要点1.结构体的类型说明在程序中如定义结构体类型:structst{intsno;charsn[20];floatscore[3];):注意:最后分号必不可少!此时structst是类型名(struct与st一起用),它等效于int这样的类型名,可以用来定义变量、数组和指针。如:structstsi,s2,s[10],*p:等等,si,s2为结构体变量,s[10]为结构体数组,p为可指向结构体的指针。注意:structst是类型名,s是变量名,程序中不要把st当成变量去用。2.结构体的使用对结构体,不能整体的引用,只能对其中成员ー个ー个的引用,引用时要以“结构体变量名・成员名”的形式,当某个结构型变量的内层成员又是ー个结构型时,要用“外层结构体变量名.外层成员名.内层成员名”的形式。在输入输出或其他运算时,引用的规则完全依照该成员的数据类型而定。3.对结构体中的数组成员,要按其数组的规则使用,对数值型的要一个元素一个元素使用,如:sl.score[i],sl.sn[i],对字符型的可以整体当成字符串使用。如:si.sn4.对结构体数组,要按一般数值数组的原则使用,不能整体使用数组名。如s[i].sno表示第i个结构体的sno;s[i[].sn[j]表示第i个结构体的sn字符串的第j个字符,s[i].sn表示第i个结构体的字符串sn等等。5.对结构类型指针可以指向单个的结构体也可以指向结构数组。如:p=&si;或p=s;等。这时对结构体成员的引用可用“(*p).成员名”或“p一成员名”。结构类型指针当指向数组时,注意下面的区别:p-sno++等价于(p-»sno)++得到p指向的结构体中成员sno值,用完后该值加1。++p-sno等价于++(pfsno)得到p指向的结构体中成员sno值,先加1再使用。(++p)fsno先使p加1,(指向下ー个元素),再取该元素的sno(p++)-sno先得到p所指的元素son值,然后p加1(即指向下ー个元素)6.当结构类型的成员中有自己类型的指针成员时,一般用作链表处理,即把ー个ー个的结构体用指针相链。例如:structst{intsono;charsn[20];sturctst*next;}*head,*p:可做成如下链表:,,nexthead-....,一~"L日ー「日fロー...--►II-I-NULLfP处理链表时,对于如p=pfnext;理解成p跟着pfnext指。即指针移到下ー个结构体。练习题ー、单项选择题

1251.放100个学生的数据,包括学号,姓名,成绩。在如下的定义中,不正确的是()。A.structstudent{intsno;charname[20];floatscore}stu[100];B.structstudentstu[100]{intsno;charname[20];floatscore};C.struct{intsno;charname[20];floatscore}stu[100];D.structstudent(intsno;charname[20];floatscore);structstudentstu[100];2.设有定义语句"struct{intx;inty;}d[2]={{l,3},{2,7}};w,则printf("%d

126",d[〇].y/d[〇].x*d[l].x);的输出是()〇A.0B.1C.3D.63.设有定义语句"enumteam{my,your=4,his,her=his+10};”,则printf("%d,%d,%d,%d

127”,my,your,his,her);的输出是()〇A.0,1,2,3B.0,4,0,10C.0,4,5,15D.1,4,5,154.以下对枚举类型名的定义中正确的是()。A.enuma={one,two,three);B.enuma{al,a2,a3};C.enuma={”','2','3'};D.enuma{"one”,"two","three"};5.若有如下定义,则printf(“%d

128",sizeof(them));的输出是()〇typedefunion{longx[2];inty[4];charz[8];}MYTYPE;MYTYPEthem;A.32B.16C.8D.246.设有以下说明和定义:typedefunion{longi;intk[5];charc;}DATE;structdate{intcat;DATEcow;doubledog;}too;DATEmax;则下列语句的执行结果是()。printf(“%d",sizeof(structdate)+sizeof(max));A.26B.30C.18D.87.根据下面的定义,能打印出字母M的语句是()。structperson{charname[9];intage;};structpersonc[10]={t4John",17,"Paul",19,"Mary",18,"Adam",16};A.printf(“%c",c[3].name);B.printf(“%c",c[3].name[l]);C.printf(哪c",c[2].name[1]);D.printf0*%c",c[2].name[0]);8.设有如下定义,则对data中的a成员的正确引用是()。structsk{inta;floatb;}data,*p=&data;A.(*p),data,aB.(*p).aC.p->data.aD.p.data,a9.设有如下定义,则对字符串liming的不正确引用是()。structperson{charname[20];chersex;}a={“liming",,m'},*p二&a;A.(*p).nameB.p.nameC.a.nameD.p->name10.设有如下定义成的链表,则值为6的表达式是()。structst{intn;structst*next;}a[3]={5,&a[1],7,&a[2],9,NULL},*p=&a;A.p++->nB.p->n++C.(*p).n++D.++pー)n二、填充题1.以下三种定义结构类型的写法是的。structabc{inta;charc;intb;};

129structabc{inta;intb;charc;};structabc{charc;intb,a;};2."称为运算符,“-〉”称为运算符。3.设有定义语句"struct{inta;floatb;charc;}abc,*p_abc=&abc;99>则对结构体成员a的引用方法可以是abca和p_abca。4.若有以下说明和定义语句,则变量w在内存中所占的字节数是〇unionaa{floatx;floaty;charc[6];};structst{unionaav;floatw[5];doubleave;}w;5.若有以下定义和语句,则表达式++p->a的值是〇structwc{inta;int*b;};intx口二{11,12};yロ={31,32};staticstructwcz[]={100,x,300,y),*p=z;6.以下程序输入20个人的姓名和他们的电话号码(七个数字),然后输入姓名,查找该人的电话号码,请填空。#include#includestructph{charname[10];chartel[8];};main(){s[20];voidreadin(structph*p);voidsearch(structph*p,char*x);charc[10];readin(s);printf(“请输入被查人的姓名:

130”);gets();_search(s,c);)voidreadin(structph*p){inti;for(i=0;i<20;i++,p++){printf(“请输入姓名:%;gets();printf("请输入他的电话号码:%;gets();})voidsearch(structph*p,char*x){inti;for(i=0;i<20;i++,p++)if(strcmp()==0){printf(44%s的电话号码是%s

131”,x,pー)tel);break;}if(i==3)printf(“找不到%s的电话号码!

132”,x);}三、程序分析题1.阅读下列程序,写出运行结果。(字符〇的ASCII码为16进制的30)

133main(){union{charc;chari[4];}z;z.i[0]=0x39;z.i[l]=0x36;printf('<%c

134'',z.c);}1.阅读程序,写出程序的运行结果。main(){structstudent{charname[10];floatkl;floatk2;}a[2]={{"zhang”,100,70},{“wang”,70,80}},*p=a;printf("

135name:%stotal二%f”,p->name,pー>kl+pー)k2);printf("

136name:%stotal二%f",a[l].name,a[l].kl+a[l].k2);}2.阅读程序,写出程序的运行结果。main(){enumem{eml=3,em2=l,em3};char*aaロニ{“AA”,“BB—”DD”};printf(“%s,%s,%s

137”,aa[eml],aa[em2],aa[em3]);}3.阅读程序,写出程序的运行结果。main(){structstd{intid;char*name;floatsf;}a,*p二&a;inti=a.id=1998;char*s二a.name二"Windos98”;floatf=a.sf=1800;printf("%dis%ssal%f

138",i,s,f);printf("%dis%ssal%f

139”,p-〉id,pー〉name,pー〉sf);}4.阅读程序,写出程序的运行结果。voidmain(){structst{intn;structst*next;}a[3]={5,&a[l],7,&a[2],9,&a[0]},*p二a;inti;for(i二〇;i<5;i++)p二pー〉next;printf("p->n=%d

140",p->n);}四、程序设计题

1411.用结构体存放下表中的数据,然后输出每人的姓名和实发数(基本工资+浮动エ资ー支出)。姓名]基本工资「浮动エ资「支出

142zhao240.00400.0075.00qian360.00120.0050.00sun560.000.0080.001.编一个程序,输入10个职エ的编号、姓名、基本工资、职务エ资,求出其中“基本工资+职务エ资”最少的职エ姓名并输出。2.编ー个程序,输入10个学生的学号、姓名、3门课程的成绩,求出总分最高的学生姓名并输出。3.编ー个程序,输入下列学生成绩表中的数据,并用结构体数组存放。然后统计并输出三门课程的名称和平均分数。namefoxbasebasicczhao97.589.078.0qian90.093.087.5sun75.079.568.5li82.569.554.04.定义ー个结构体变量(包括年、月、日)。编ー函数,以结构类型为形参,返回该日在本年中是第几天。5.编写ー个函数,对结构类型(包括学号,姓名,三门课的成绩)开辟存储空间,此函数返回一个指针(地址),指向该空间。

143第8章文件学习和解题要点ー、c语言的文件基本概念1.把内存变量的数据写到磁盘成为文件,也可以从磁盘文件中把数据读入内存。main(){inti,n;打开文件for(i=l:i<=100:i++){scanf&n);把n写到文件去)关闭文件)main(){intn;打开文件while(文件没结束){把文件中的ー个数据读到nprintfn);)关闭文件)2.文件类型指针在stdio.h中定义类型名FILE为文件类型(一定大写),可以用它定义文件类型的指针变量名。如:fp;可用fp来指向ー个磁盘文件。FILE*fp;3.文件的打开函数fp=fopen(“文件名”,“使用方式”);文件打开成功,返回指针,fp即指向文件名;否则返回NULL即〇。其中:文件名:是操作系统可管理的文件名,还可以加路径。如果是把文件名放在字符数组或字符串指针中,则不加“‘‘。如:fp=fopen(uc:\mao\maol.dat",“使用方式’‘);或:charstr[20]={l4maol.dat"};char*strp=Mc:\\mao\\maol.dat";则:fp=fopen(str,“使用方式“);fp=fopen(strp,“使用方式");使用方式:(文本文件)“w"(只写)建立一个新文件,如磁盘上已有同名文件,则被重新复盖。“r"(只读)读ー个已有的文件,如磁盘上没有该文件,则打开出错。“a"(追加)打开一个已有的文件,在该文件尾追加记录。“w+"(读写)与”‘‘ー样,只不过还可以马上读。“r+"(读写)与“r"ー样,只不过还可以改写其中数据。

144“a+"(读写)与“a"ー样添加,也可以读。每ー个加上b变成“wb”“rb”“ab",b+”“rb+”“ab+”则对付二进制文件。1.文本文件和二进制文件把同一数据以二种形式写到二个文件上,ー种为文本文件,ー种为二进制文件。如inti=123;在内存中为二字节二进制:00〇0000011110011以文本文件形式写到文件上,则用三字节,分别放T字符的ASCII、’2,字符的ASCH和3字符的ASCH。当然,当再从文件读回到整型内存变量时,仍然变回到二字节的二进制形式。文本文件:ASCII9798990]0IIロI0I0I0|I|0|0|1|1|0|0|1|0|0|0|1|1|0|0|1|1|以二进制文件形式写到文件上,则仍用二个字节,且以变量在内存中的二进制形式原本的写到文件中。二进制文件:〇]0I〇|〇|〇|0I〇|〇11|rI1I1I0I0I1I1I-2.文件的关闭不用的文件要及时关闭,即断开文件指针与磁盘文件的联系。fclose(fp);3.在对文件进行读(写)时,有一个无形的“指示''(实际上就是文件指针)在文件记录上游动,当文件打开时它在第一个记录,每当读ー个记录向尾走动一次,有一个判断是否读到文件尾的函数feof(fp),当碰到文件结束,函数返回I,在文件头或中间,函数返回0。另外,C语言在用ch=fgetc(fp),ー个字符一个字符读文本文件时,还可用是否读到EOF即(-1)来判断文本文件是否结束。C语言把键盘当成输入用的文本文件,并认为始终以“ビ方式打开,不必有文件指针,if(feof()),输入时以Ctrl-z作为文件结束。同样,C语言把显示器当成输出用的文本文件,并认为始终以“w”方式打开,不必有文件指针。二、文本文件的读写1.字符读写函数fgetcO,fputcO格式:ch=fgetc(fp);从文件fp中读入一个字符到ch。fputc(ch,fp):把ch中的字符写到文件fp。比较ch=getchar();putchar(ch);2.字符串读写函数fgetsO,fputsO格式:fgets(str,n,fp):从文件fp中读入nT个字符到str中,若不到nT个字符就遇到换行符或文件结束,则有多少就读多少。fputs(str,fp);把str中的字符串写到文件fp。比较gets(str);puts(str);3.格式读写函数fscanf(),fprintf()格式:fscanf(fp,44",&);fprintf(fp,44");比较scanf(44",&);printfC4");三、二进制文件的读写1.字节读写函数fgetcO,fputcO

145fgetcO,fputcO可以用来对二进制文件ー个字节ー个字节的读写,而不管字节中是什么内容,反正是二进制。1.freadO,fwriteO格式:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);buffer存放数据的起始地址size读写的字节数count对字节数的重复数2.getw(),putw()读写ー个字(word计算机字长)四、文件的定位1.rewind(fp)把“游标”再从头开始。2.fseek(fp,len,flag);len位移量,负数为向反方向。flag起始点,〇文件头起,1当前位置起,2文件尾起。3.ftell(fp)测试“游标”当前位置i=ftell(fp);五、文件操作检测1.ferror(fp)文件操作有错返回非0,否则为〇〇2.clearerr(fp)调用后,使ferror(fp)返回〇〇五、文件处理例子1.例L把键盘输入的整数分别建成文本文件和二进制文件。#include^includevoidmain(){FILE*fpl,*fp2;inti;if((fpl=fopen(*datal.txt","w"))ニニNULL){printf("打不开文件datal.txt

146");return;}if((fp2=fopen("data2.txt","wb"))ニニNULL){printf("打不开文件data2.txt

147");return;}scanf("%d",&i);while(i!=0){fprintf(fpl,"%d",i);fwrite(&i,2,1,fp2);scanf("%d",&i);}return;}2.例2.把ー个文件拷贝成另ー个文件。#includevoidmain(){FILE*fp;voidcopyf(char*f_l,char*f_2);charf_namel[13],f_name2[13];printf(“输入源文件名:〃);scanf("%s”,f_namel);printf("输入目标文件名:");scanf("%s",f_name2);copy_f(fnamel,fname2);if((fp=fopen(f_name2,"r"))ニニNULL)

148{printf("新文件打不开!

149");return;}printf(〃读入的新文件内容如下:'n〃);while(!feof(fp))putchar(fgetc(fp));printf("

150");fclose(fp);return;}voidcopy_f(char*f_l,char*f_2)(FILE*fpl,*fp2;if((fpl=fopen(f_l,"r"))==NULL){printf("打不开被拷贝的文件'n");return;}if((fp2二fopen(f_2,"w"))ニニNULL){printf("打不开新产生的文件'n");return;}while(!feof(fpl))fputc(fgetc(fpl),fp2);fclose(fpl);fclose(fp2);return;}练习题ー、单项选择题1.C语言中,文件由()A,字符(字节)序列组成B,记录组成C,数据行组成D,数据块组成2.若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是()。A.0B.-1C.非零值D.NULL3.状下列语句中,将c定义为文件型指针的是()。A.FILEc;B.FILE*c;C.filec;D.file*c;4.以读写方式打开ー个已有的文本文件filel,并且FILE*fp,下面fopen函数正确的调用方式是()。A.fp=fopen("filer',"r")B.fp=fopen("filer’,"r+")C.fp=fopen("filer','Tb")D.fp=fopen("filel","w")5.标准库函数fputs(pl,p2)的功能是()。A,从pl指向的文件中读ー个字符串存入p2指向的内存B.从P2指向的文件中读ー个字符串存入p!指向的内存C.从pl指向的内存中读ー个字符串写到p2指向的文件中D.从p2指向的内存中读ー个字符串写到pl指向的文件中二、填充题1.C语言中调用函数打开文件,调用函数关闭文件。2.feof函数可用于文件和文件,它用来判断即将读入的是否为,若是,函数值为。3.若ch为字符变量,fp为文本文件指针,从fp所指文件中读入一个字符时,可用的ニ种不同的输入语句是和。把ー个字符输出到fp所指文件中的二种不同的输出语句是和.

1511.sp=fgets(str,n,fp);函数调用语句从指向的文件输入个字符,并把它们放到字符数组str中,sp得到的地址。而函数的作用是向指定的文件输出ー个字符串,输出成功函数值为.2.“FILE*p”的作用是定义了一个,其中的“FILE”是在头文件中定义的。3.在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数是函数。4.下面的程序用来统计文件中字符的个数,请填空。#includemain(){FILE*fp;longnum=0;if(fp=fopen(Mfname.dat","ビ)ニニNULL){printf("Can'topenfile!

152");exit(0);}while{fgetc(fp);num++;)printf("num=%d

153",num);fclose(fp);}5.下面程序完成从磁盘文件stu.dat中读取N个学生的姓名、学号、成绩后在屏幕上显示输出。请将程序补充完整。#include#defineN100structstudent{charname[20];intno;intscore;}stud[N];main(){FILE*fp;inti;if{printf("Cannotopenfile!

154");exit(0);}for(i=0;i

155",stud[i].name,stud[i].no,stud[i].score);fclose(fp);三、程序分析题1.读程序,指出程序所完成的功能。#includemain(){intchi,ch2;while((chl=getchar())!=E0F)if(chl>=,a*&&chiくニ'z'){ch2=chl-31;putchar(ch2);}elseputchar(chi);)2.读程序,写功能。#includemain(){FILE*fp;intb=0;charch;if((fp=fopen("fname.txt","r"))==NULL){printf(uCannotopenfile!

156");exit(0);}while(!feof(fp)){ch=fgetc(fp);if(chニニ’‘)b+=l;}printf("b二%d

157",b);fclose(fp);)3.读程序,写功能。

158#include"stdio.h"main(){FILE*fl,*f2;intk;if((fl=fopen("c:\tc\pl.c","ビ))ニニNULL){printf("Cannotopenfile!

159");exit(0);}if((f2二fopen("a:\pl.c","w"))ニニNULL){printf(uCannotopenfile!

160");exit(0);}for(k=l;k<=1000;k++){if(feof(fl)break;fputc(fgetc(fl),f2);)fclose(f1);fclose(f2);)1.假定在当前盘当前目录下有2个文本文件,其名称和内容如下:文件名al.txta2.txt内容121314#252627#写出下列程序运行后的输出。^include"stdio.h"main(){FILE*fp;voidfc(FILE*fpl);if((fp=fopen("al.txt",”r"))==NULL){printfC'Cannotopenfile!

161M);exit(1);}else{fc(fp);fclose(fp);}if((fp=fopen("a2.txt“,“r"))==NULL){printfC'Cannotopenfile!

162M);exit(1);}else(fc(fp);fclose(fp):))voidfc(FILE*fpl){charc;while((c=fgetc(fpl))!=*#*)putchar(c);)四、程序设计题1.编ー个程序,从键盘输入200个字符,存入名为“fl.txt”的磁盘文件中。2.从上一题中建立的名为“fl.txt”的磁盘文件中读取120个字符,并显示在屏幕上。3.编ー个程序,将磁盘中当前目录下名为“ccwl.txt”的文本文件复制在同一目录下,文件名改为“ccw2.txt”。4.编程序对名为“CCT.TXT”的磁盘文件中“@”之前的所有字符加密,加密的方法是每个字节的内容减!0o5.编程序对上一题中名为“CCW.TXT”的磁盘文件中“@”字符之前的所有字符解密并显示。

1631.输入100个学生的信息(含学号、姓名、年龄、7科成绩、总分),统计所有学生的总分,然后存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分最高的学生并输出该学生的所有信息。2.编一个程序,统计文本文件中的单词个数。被统计文件的文件名可由键盘任意输入。3.有两个磁盘文件“fl.txt”和“f2.txt”各放一行字母,今要求把这两个文件中的字母合并,按字母顺序排列后,输出到新文件“f3.txt”中去。

164第9章编译预处理与带参数的主函数学习和解题要点1.c程序中,以“#”符号开头的命令是在源程序正式编译前进行处理的‘称为‘’编译预处理”命令。注意,这里是“命令”,而不是语句,因此最后不能加分号。一行只能写一个预处理命令行。C程序中,“宏名”一般用大写,并且中间不能有空格。2.“宏’‘定义的作用是当程序中出现“宏名”时,就在“宏名”的位置用对应的“一串符号”替换。注意,这里纯粹就是“替换”,相当于用“一串符号”去“涂改”“宏名”。如:^definePI3.1416程序中有a=r*r*PI:涂改为a=r*r*;3.1416;;3.带参的“宏”定义也纯粹就是替换。进行宏替换时,先用实参替换‘‘一串符号”中的形参,然后再用被替换过的‘‘一串符号”替换“宏名(形参表)”。4.程序中,用双引号括起来的宏不被替换。5.对带参的“宏”定义,在替换时不要人为的加“括号”。如:#defineW(r)3.14*r*r当a=W(a+b);正确的替换是a=3.14*a+b*a+b:而不是a=3.14*(a+b)*(a+b)这两个括号是人为加的。当然,如果我们是想求半径为a+b的面积时就发生了错误,这时应该把“宏”定义写成«defineW(r)3.14*(r)*(r)因此,为了在调用过程中不出现二义性,应该把字符序列中出现的虚参全部用括号括起来。6.文件包含编译预处理命令有两种格式:"包含文件名”和く包含文件名〉。前者,系统先在本程序文件所在的磁盘和路径下寻找包含文件;若找不到,再按系统规定的路径搜索包含文件。后者,系统仅按系统规定的路径搜索包含文件。7.“包含文件”可以是任意的文件名扩展名,可以是.h也可以是,c,还可以是其他扩展名。文件名前还可以加上盘号和目录,如:ttinclude"d:\user\filel.c"8.带参数的主函数是用于在用命令行的形式运行.exe程序文件时接收参数的。argc接收到包括程序文件名在内的字符串个数,argv的每ー个指针指向ー个参数字符串。其中argv[O]指向程序文件名。9.预处理命令若有变动,必须对程序重新进行编译和连接。练习题ー、单项选择题1.C程序中,以#号带头的行是预编译()A,命令B.语句2.下列正确的预编译命令是()。c,函数D.字符串A.definePI3.14159B.^defineP(a,b)strcpy(a,b)C.^includestdio.hD.^definePI3.14159;3.下列命令或语句中,正确的是()。A.»defineMYNAME="ABC”B.#includestdio.hC.for(i=0;i<10;i++);4.下列命令或语句中,正确的是()。D.structintstu{intname};A.ttdefinePI=3.14159B.include“stdio.h"C.for(i=0,i<10,i++)a++;5.下列命令或语句中,错误的是()。D.staticstruct{inti;}b={2};A.#definePI3.14159B.#include;C.if(2);D.for(;;)if(1)break;6.设有宏定义“#defineAREA(a,b)a*b”,则正确的“宏调用”是()。A.s=AREA(r*r)B.s=AREA(x*y)C.s=AREAD.s=c*AREA((x+3.5),(y+4.1))

1657.设有以下宏定义,则执行语句“z=2*(N+Y(5+l));”后,z的值为()。#defineN3#defineY(n)((N+l)*n)A.出错B.42C.48D.548.设有以下宏定义,intx,m=5,n=l时,执行语句"IFABC(m+n,m,x);"后,x的值为()。ttdefineIFABC(a,b,c)c=a>b?a:bA.5B.6C.11D.出错9.以下程序中的for循环执行的次数是()ttinclude"stdio.h"#defineN2^defineMN+1^defineNUM(M+l)*M/2main(){inti,n=0;for(i=l;i<=NUM:i++){n++;printf('W,n);}printf(“

166");}A.5B.6C.8D.910.设有一程序编译连接成目标程序名为psi.exe,如果输入如下的命令:psi123456AAA/(其中的/表示回车),则程序运行时,会出错的语句是()。A.printf('*%d'',argc);B.printfargv[4]);C.printfargv[3]);D.printfargv[2]);11.格式1ttinclude"文件名’'格式2#includeく文件名〉下面4个结论,正确的是()。A.格式1中的文件名能带路径,而格式2不能B.格式1中的文件名不能带路径,而格式2可以C.如果被包含文件在当前目录下,两种格式都能用D.如果文件名中不带路径,格式1能搜索当前目录和系统规定的路径中搜索包含文件,而格式2不行。12.程序ccwl.c中有函数maxi(),程序ccw2.c中有调用函数maxi()的语句,则当程序ccw.c中有包含命令时,正确的写法是()oA.^include“ccw2.c”B.^include#include“ccwl.c"#includeC.ttincludeMccwl.c"D.两个包含命令次序可以任意#includeMccw2.c”二、填充题1.C程序中,以“#”符号开头的命令是在源程序正式前进行的,称为命令。2.使用分别编译方法时,在不同的编译单位间能传递的变量和函数是。3.设有定义如下:includeF(N)2*N,则表达式f(2+3)的值是〇4.设有如下的宏定义:#includeP(r,a)printf(r,a)当程序中执行‘'P(str,3);“语句后会输出i=3,则在程序中应有定义语句char*str=:5.设有下列程序:#includemain(intargc,char*argv[])){while(-argc>c)printf(^s^,srgv[argc]);printf(“

167”);

168)假定上述程序编译连接成目标程序名为p.exe,如果输入如下的命令:p123AAABBB/(其中的/表示回车)则输出结果是〇三、程序分析题1.阅读下面程序,写出运行结果。ftdefineM5^defineNM*3+4ftdefineMNN*Mmain(){printf(fct%d,%d

169”,2*MN,MN/2);)2.阅读下面程序,写出运行结果。#defineEXCH(a,b){intt;t=a;a=b;b=t;}main(){intx=5,y=9;EXCH(x,y)printf(44x=%d,y=%d

170”,x,y);}3.阅读下面程序,写出运行结果。#definePR(ar)printf('*%d,",ar)main(){intj,a[]={l,3,5,7,9,11,13,15},*p=a+5;for(j=3;j;j-)switch(j){case1:case2:PR(*p++);break;case3:PR(*(--p));4.设下面的程序经编译连接后生成的目标程序名为:ABC.EXE,写出输入以下命令行后的输出:ABCFILE1FILE2/(其中的/表示回车)#include“stdio.h"main(intargc,char*argv[]){inti;printf(44%d

171",argc);for((i二〇;iくargc;i++)printf("%s”,argv[i]);printfC4

172");)5.读程序,写功能。#includemain(intargc,char*argv[]){FILE*fl,*f2;charch;if(argc<3){printf(^Parametermissing!

173,?);exit(0);}if(((fl=fopen(argv[1],'V'))==NULL||(f2=fopen(argv[2],)==NULL){printf(4

174M);exit(0);}while(!feof(fl))fputc(fgetc(f1),f2);fclose(f1);fclose(f2);)四、程序设计题1.三角形的面积为area=Vs(s-a)(s-b)(s-c)其中s=0.5(a+b+c),a、b、c为三角形的三边。定义两个带参的宏,ー个用来求s,另ー个用来求area

175。写程序,在程序中用宏来求三角形的周长和面积。1.设计ー个复制文本文件的程序,源文件名和目标文件名随程序执行时输入。2.设计ー个程序,将随程序执行时输入的两个整数的和、差、积、整除商、模运算的结果输出。3.设计ー个程序,能将随程序执行时输入的任意个整数求和。4.设计ー个比较字符串的程序,两个字符串随程序执行时输入,输出其中大的字符串。

176综合练习ー、判断题1.在Trubo_C中运行ー个C程序时,实际上是运行后缀为.EXE的可执行文件。2•在C语言中整数可用十进制数、八进制数和二进制数三种数制表示。3.在程序的运行过程中,整型常量的值是可以改变的。4.C程序中,用/・和・/界定的部分称之为注释,注释部分对程序的运行不起作用。5.大括弧{}只能用来括复合语句。6.do_while语句构成的循环不能用其它循环语句来代替。7.不能用scanf函数输入字符。8.在C程序中,函数的定义不可以嵌套,但函数的调用可以嵌套。9.ー个变量的作用域取决于变量定义语句在程序中出现的位置。10.C语言的ー个编译预处理命令用#开始,最后加分号。11.C语言源程序文件经过编译、连接之后生成一个后缀为.EXE的文件。12.C语言中以籾开头的数是八进制整数。13.在程序的运行过程中,符号常量的值是可以改变的。14.在C程序中,APH和aph代表不同的变量。15.ー个复合语句在语法上被认为是一条语句。16.只能用while语句构成循环。17.不能用printf函数输出字符。18.C程序中各函数之间既允许直接递归调用也允许间接递归调用。19.在函数外部定义的变量称为全局变量。20.宏定义的命令行可以看作是一条C语句。21.C语言源程序是可以用来直接运行的程序。22.C语言中以%x开头的数是十六进制整数。23.C程序中定义的变量,代表内存中的一个存储单元。24.在C程序中,9ab是非法的用户标识符。25.C语句必须用ー个分号作为结束。26.do_while语句构成的循环不能用break语句退出。27.scanf函数是c语言的标准输入函数。28.C程序的main函数不能有参数。29.在函数内部定义的变量称为局部变量。30.用#include包含的头文件的后缀必须是.h。31.C语言程序的三种基本结构是顺序结构、选择结构和循环结构。32.在C语言中整数只能表示为十进制数的形式。33.在C程序中,无论多少大的整数还是实数,都能准确无误的表示。34.Turbo-C语言中,字符类型数据占1个字节。35.空语句是合法的C语句。36.while语句的循环体不能是复合语句。37.printf函数是c语言的标准输出函数。38.C程序的main函数可以有参数,但参数不能是指针类型。

1773.在main函数中定义的变量称为全局变量。4.ttinclude和#define不是C语句。5.C语言程序的三种基本结构是嵌套结构、选择结构和循环结构。6.C语言中018是合法的ハ进制整数。7.C程序中所要用到的变量应该先定义,后使用。8.十六进制数0x11的十进制数是17〇9.赋值语句是ー种可执行语句。10.for语句的循环体不能是空语句。11.可以调用putchar函数输出字符。12.C程序的main函数可以有参数,但参数不能是整型。13.在ー个C程序中,全局变量和局部变量是不能同名的。14.C编译中的预处理是在编译之前进行的。15.C语言程序的三种基本结构是顺序结构、转移结构和循环结构。16.C语言中Oxe是合法的十六进制整数。17.在程序的运行过程中,其值可以改变的量是变量。18.ハ进制数0x11的十进制数是9。19.在赋值表达式的尾部加上一个分号,就构成了赋值语句。20.C语言不允许循环嵌套。21.可以调用getchar函数输入字符。22.C程序中各函数之间允许直接递归调用不允许间接递归调用。23.局部变量不能在复合语句内部定义。24.宏定义是可以带参数的。二、选择题1.C语言程序的三种基本结构是顺序结构、选择结构和结构。A.循环B.递归C.转移D.嵌套2.以下选项中正确的整型常量是〇A.12.B.-10C.1,900D.123x3.在C语言程序中,用关键字定义基本整型变量。A.intB.floatC.doubleD.char4.Turbo-C语言中,字符类型数据占字节。A.1个B.2个C.4个D.8个5.若a、b、c、d都是int类型变量且初值为〇,不是正确的赋值语句。A.a=b=c=0;B.a=b;C.c+b;D.d=(c=22)-(b++);6.若变量已正确定义并赋值,符合C语言语法的表达式是。A.a=a+1B.int(12.0%2)C.a=a+l;D.a=a7.若a是基本整型变量,c是单精度实型变量,输入语句是错误的。A.scanf("%d,%f",&a,&c);B.scanfa,c);C.scanf("%d%f",&a,&c);D.scanf("d=%d,c=%f",&a,&c);8.对C程序在作逻辑运算时判断操作数真、假的表述,是正确的。A.〇为假非〇为真B.只有1为真C.-1为假1为真D,〇为真非〇为假9.C语言中的简单数据类型有一。A,整型、实型、逻辑型B.整型、实型、字符型

178C.整型、字符型、逻辑型D.整型、实型、字符型、逻辑型1.C语言程序规定必须用main作为。A,主函数名B,子函数名C.程序名D.变量名2.下列语句定义Pf为指向float类型变量f的指针是正确的。A.floatf,*pf=f;B.floatf,*pf=&f;C.float*pf=&f,f;D.floatf,pf=f;3.若pl、p2都是整型指针,pl已经指向变量x,要使p2也指向x,是正确的。A.p2=pl;B.p2=**pl;C.p2=&pl;D.p2=*pl;4.定义ー个4个元素的一维整型数组,是正确的。A.floata[4];B.intaロ={1,2,3,4,5};C.inta[]={1,2,3};D.inta[4]=⑴;14.数组定义为inta[3][2],数组a中有个元素。A.2B.3C.5D.615.以下能正确进行字符串赋值或赋初值的语句组是。A.charstr[3]="key";B.charstr[3]={'k,,,e,,,y,};C.charstr[4];str="key";D.char*s;s="key";16.C语言中,形参的缺省的存储类说明是〇A.autoB.staticC.registerD.extern17.若变量已正确定义,表达式(j=3,j++)的值是。A.3B.4C.5D.018.若x是整型变量,表达式(x-10.0/4.0)的值是。A.2.5B.2.0C.3D.219.为读而打开文本文件aa.dat,的正确写法是。A.fopen("aa.dat","rb");B.fopen("aa.dat","城’)C.fopenCaa.dat","wb");D.fopen("aa.dat","r")20.算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为。A,算术运算、赋值运算、关系运算B.算术运算、关系运算、赋值运算C.关系运算、赋值运算、算术运算D.关系运算、算术运算、赋值运算21.C语言程序的三种基本结构是顺序结构、结构和循环结构。A.选择B,递归C.转移D.嵌套22.以下选项中不正确的整型常量是。A.0B.-10uC.20LD.-123423.在C语言程序中,用关键字定义短整型变量。A.shortB.floatC.doubleD.char24.十进制数16的十六进制数是〇A.11B.12C.13D.1025.若变量已正确定义,是合法的C语句。A.a=l,b=2B.a=l=b;C.a=b=5;D.y=;26.若变量已正确定义并赋值,符合C语言语法的表达式是。A.a=3,5;B.a+=lC.a=a+l=3D.12.3%427.若a是单精度实型变量,c是基本整型变量,以下正确的输入语句是〇A.scanf("%f%d”,a,c);B.scanf("%f%d”,&a,&c);C.scanf("%f%f”,&a,&c);D.scanf("紀为f",&a,&c);28.在C程序中,用表示逻辑值“真”。

179A.trueB.非0的数C.非0整数D.大于0的数22.设有说明语句chara=ヘn';,则变量a〇A.包含1个字符B.包含2个字符C.包含3个字符D.说明不合法3〇.C语言程序由组成。A.子程序B.过程C.函数D,主程序和子程序31.下列语句定义pd为指向int类型变量d的指针,是正确的。A.intd,*pd=&d;B.int*pd=&d,d;C.floatd,*pd=&d;D.float*pd=&d,d;32.若变量己正确定义并且指针p己经指向变量x,贝眼・p相当于•A.xB.*pC.pD.*&x33.定义ー个4个元素的一维整型数组,是不正确的。A.inta[4];B.inta[4]={l,2,3,4,5};C.inta[4]={l,2,3};D.inta[4]={l};34.数组定义为inta[3][2]={l,2,3,4,5,6},数组元素的值为6。A.a[3][2]B.a[2][l]C.a[l][2]D.a[2][3]35.不正确的字符串赋值或赋初值的方式是〇A.charstrロ="string”;B.charstr[7]={,s','t','r','i','n','g'};C.charstr[10];str="string”;D.charstr[7]={'s','t','r','i','n','g',ヘ〇'};36.要调用数学函数时,在#include命令行中应包含〇[13]A."stdio.h"B,"string,h"C.'math,h"D."ctype.hw37.若变量已正确定义,表达式(j=l,++j)的值是〇A.1B.2C.3D.038.若x是单精度实型变量,表达式(x=10/4)的值是〇A.2.5B,2.0C.3D.239.为写而打开文本文件aa.dat,的正确写法是〇A.fopen("aa,dat",“rb")B.fp=fopenCaa.dat'\V)C.fopen("aa.dat","wb")D,fp=fopenCaa.dat,"r")40.下列运算符中优先级最低的是〇A.ツ二”和“く=”B."ゾ和“く”C.“ニニ”和"!二"D.“く二”和“く”41.C语言程序的三种基本结构是结构、选择结构和循环结构。A.顺序B.递归C.转移D,嵌套42.以下选项中正确的实型常量是〇A.0B.-10C.0.19D.1.9*10243.在C语言程序中,用关键字定义长整型变量。A.longB.floatC.doubleD.char44.十进制数8的ハ进制数是〇A.11B.010C.8D.0845.不是合法的C语句。A.{intj;j++;}B.{intj;j++;;}C.{intj;;j++;}D.{j++;intj;}46.若变量a,b已正确定义并赋值,符合C语言语法的表达式是。A.a,bB.aくbC.a2bD.aWb47.对以下的scanf语句,正确的输入方式是〇intkl,k2,k3,k4;scanfC%d%d%d%dエ&kl,&k2,&k3,&k4);A.102030,40B,10203040C.10,203040D.102030,40

18047.表达式!x等效于。A.x==lB.x==0C.x!=lD.x!=048.要定义字符型变量a并赋初值,是正确的。A.chara=3;B.chara="3";C.chara二%;D.chara二・;49.以下函数调用语句中,含有的实参个数是«calc(expl,(exp3,exp4,exp5));A.1B.2C.3D.451,下列语句定义整型指针pl、p2,是正确的。A.intpl,p2;B.int*pl,*p2;C.int*pl,p2;D.int**pl,p2;52.若变量已正确定义并且指针p己经指向变量x,贝リ・&x相当于〇A.xB.*pC.&xD.&*p53.数组定义为“inta[4];w,表达式是错误的。A.*aB.a[0]C.aD.a++54.数组定义为inta[2][3]={1,2,3,4,5,6),数组元素的值为1。A.a[l][2]B.a⑴[1]C.a[2][3]D.a[0][0]55.表达式strlen("hello")的值是〇A.4B.5C.6D.756.要调用字符串函数时,在#include命令行中应包含〇A."stdio.h"B."string,h"C."math,h"D."ctype.h"57.若变量已正确定义且k的值是4,计算表达式(户k++)后,是正确的。A.j=4,k=5B.j=4,k=4C.j=5,k=4D.j=5,k=558.C语言中运算对象必须是整型的运算符是〇A.%B./C.!D.**59.若有charfname口="infile,dal";,则为读而打开文本文件infile,dat的正确写法是A.fopen(infile.dat,"r")B.fopen(infile,dat,"r")C.fopen(fname,"r")D.fopen("fname","r")60.下列运算符中,优先级从高到低依次为〇A.&&,!,||B.||,&&,!C.&&,||,!D.!,&&,||61.在Trubo_C中,C语言源程序文件的后缀是〇A.".c"B.".obゴC.".exe"D.tt.bas"62.以下选项中不正确的实型常量是〇A.0.23E1B.2.3e-lC.1E3.6D.2.3e063.在C语言程序中,用关键字定义无符号型变量。A.unsignedB.floatC.doubleD.char64.C语言程序中可以对程序进行注释,注释部分必须用符号括起来。A.<{<和'}'B.和']'C.ソ・"和"*/"D."*/"和"/*”65.若a、b都是int类型变量,不是正确的赋值语句。A.a=b=60B.a=3.0;C.a=l,3;D.b=0;66.若变量a,b,c已正确定义并赋值,符合C语言语法的表达式是〇A.ab/c;B.a/cXbC.a•bD.a*b/c67.若k是基本整型变量,则以下程序段的输出是〇

181k=8567;printf("1%-6d|

182",k);A.输出格式描述符不正确B.输出为1008567C.输岀为18567|D.输出为ー0856752.为表示“a和b都大于0”,应使用的C语言表达式是〇A.(a>0)U(b>0)B.a&&bC.(a>0)||(b>0)D.(a>0)|(b>0)53.已知字符'b'的ASCII码为98(执行下列语句后输出为。printf("刎,%c",'b','b'+l);A.98,bB,语句不合法C.98,99D.98,c54.以下函数调用语句中,含有的实参个数是»exce((vl,v2),(v3,v4,v5),v6);A.6B.5C.4D.355.若变量已正确定义,表达式可以使指针px指向变量X。A.px=&xB.px=xC.*px=&xD.*px=*x56.若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于〇A.p++B.x++C.*(p++)D.&x++57.数组定义为inta[6],数组a中有个元素。A.4B.5C.6D.758.下列各语句定义了数组,是不正确的。A.inta[l][3];B.intx[2][2]={1,2,3,4};C.intx[2][]={1,2,4,6};D.intm[][3]={l,2,3,4,5,6);59.表达式strcmp("box","boss")的值是ー个〇A.正数B.负数C.0D.不确定的数60.要调用字符函数时,在#include命令行中应包含〇A."stdio.h"B."string,h"C."math,h"D."ctype.h"61.若变量已正确定义且k的值是4,计算表达式(j=k一)后,是正确的。A.j=4,k=4B.j=4,k=3C.j=3,k=4D.j=3,k=362.表达式((int)(3.0/2.0))的值是〇A.1.5B.1.0C.1D.063.若有charfnameロ="outfile.dat";,则为写而打开文本文件outfile.dat正确写法是A.fopen(outfile.dat,"w")B.fopen(outfile.dat,*w*)C.fopen(fname,"w")D.fopen(wfname*,w)64.在C语言中,优先级最低的运算符是»A.*B.«C.+D.,65.C语言源程序文件经过C语言编译程序编译之后生成一个后缀为的文件。A»nr)“1•”ハ“»r-\«1»,,cB..objC.•exeD・•bas66.常数的书写格式决定了常数的类型和值,10L是。A.基本整型常数B.短整型常数C.长整型常数D.无符号型常数67.在C语言程序中,用关键字定义单精度实型变量。A.intB.floatC.doubleD.char68.以下各标识符组中,合法的用户标识符组为«A.b-b和abcB.CCP和floatC.hiy和くfr〉D._isw和!NT69.若a是int类型变量,不是合法的C语句。

183A.{intj;j++;}B.;C.{;}D.,52.把x、y定义成float类型变量,并赋同一初值3.14的定义语句是〇A.floatx,y=3.14;B.floatx,y=2*3.14;C.floatx=3.14,y=3.14;D.floatx=y=3.14;53.若a、b是基本整型变量,则以下程序段的输出是»a=123;b=12345;printf("|%4d,%4dI

184”,a,b);A.1123,12345B.123,12341C.I123,123451D.|123,234588.为表示“x》y》z",应使用的C语言表达式是。A.(x>=y)&&(y>=z)B.(x>-y)AND(y>=z)C.(x>=y>=z)D.(x>=y)&(y>=z)89.执行下列语句后输岀为«printf("%d",‘a'ぐb');A.1B.语法错C.0D.-190.在C程序中,若对函数类型未加说明,则函数的隐含类型为.A.voidB.doubleC.intD.char91.若变量已正确定义并且指针p已经指向变量x,则・p相当于«A.xB.*pC.pD.*&x92.若变量已正确定义,ー不可以使指针p成为空指针。[8]A.p=NULLB.p=0C.p='、0'D.p!=093.数组定义为inta[3]={l,2,3},数组元素的值为3。A.a[0]B.a[l]C.a[2]D.a[3]94.下列各语句定义了数组,是正确的。A.inta[][]={1,2,3,4};B.intx[2][2]={1,2,3,4,5};C.intx[2][]={1,2,4,6};D.intm[][3]={1,2,3,4,5,6};95.若定义chara[80]="windows",bロゴ95";语句printf("%s",strcat(a,b)):输出结果疋〇A.windows95B.windowsC.95D.95windows96.要调用输入输出函数时,在#include命令行中应包含。A."stdio.h"B."string,h"C."math,h"D."ctype.h"97.若变量已正确定义且k的值是4,计算表达式(j=++k)后,是正确的。A.j=4,k=5B.j=4,k=4C.j=5,k=4D.j=5,k=598.表达式(5/2)的值是.A.0B.2C.2.0D.2.599.读二进制文件应调用函数。A.freadB.fwriteC.fgetsD.fputs100.下列运算符中,是关系运算符。A.=B.?:C.==D.«101.C语言源程序文件经过C语言编译程序编译、连接之后生成一个后缀为的文件。..cB、•objC.•exeD・•bas102.常数的书写格式决定了常数的类型和值,10U是ー.A.基本整型常数B.短整型常数C.长整型常数D.无符号型常数103.在C语言程序中,用关键字定义双精度实型变量。A.intB.floatC.doubleD.char104.以下各组标识符,选出合法的用户标识符组。A._PAD和P_DB._scanf和・aC.int和x_lD.2a和max105.若变量已正确定义,是合法的C语句。A.a=l,b=2B.i++;C.a=b=5D.y=int(x);106.把a、b定义成int类型变量,并赋同一初值3的定义语句是〇A.inta,b=3;B.inta,b=3,3;C.inta=3,b=3;D.inta=b=3;

185101.若a、b是基本整型变量,则以下程序段的输出是〇a=l;b=2;printf("a=%%d,b二%d”,a,b);A.a二%l,b=2B.a二%%d,b=lC.a二%d,b=2D.a=%d,b=l102.为表示“a=b或aCc”,应使用的C语言表达式是〇A.(a=b)|I(aplC.p2-plD.pl*p2113.数组定义为inta[3]={l,2,3},数组元素的值为1。A.a[0]B.aLl]C.a[2]D.a[3]114,数组定义为“inta[4][5];"J表达式是错误的.A.*aB.a[l][l]C.&a[2][3]D.++a115.若定义chara[80]="95",b[]-windows";,语句printf("%s",strcpy(a,b)):的输出结果为»A.windows95B.windowsC.95D.95windows1161求一个双精度实数的绝对值,应该调用函数〇A.sqrtB.powC.absD.fabs117.若变量已正确定义且k的值是4,计算表达式(j=-k)后,是正确的。A.j-4,k-4B.j=4,k=3C.j=3,k=4D.j=3,k=3118.表达式(10%2)的值是。A.0B.1C.5D.5.0119.写二进制文件应调用函数。A.freadB.fwriteC.fscanfD.fprintf120.下列运算符中,是赋值运算符。A.+=B.+C.==D.»三、写输出结果1.表达式(Tぐ〇’ぐ2,)的值为«2.下列程序段的输出结果是,intk,a=4,b=3;k=(a—++b)?0:1;printf("%d",k);3.表达式((7〈く1)&1)的值为。4.下列程序段的输出结果是。^defineT16^defineS(T+10)-7printfS*2);5.下列程序段的输出结果是。

186intn;n=3;switch(n){case1:n-1;break;case2:n=2;case3:n=3;break;default:n=4;printf("刎”,n);1.下列程序段的输出结果是。intk=-1;if(!(k<=0))printf("****);elseprintf("###");2.下列程序段的输出结果是0intx=0,y=-l;if(x!=0)y=l;if(x>0)y=l;elsey=0;printf("%d",y);3.以下程序段的输岀结果是〇intk=0,sum=l;do{sum+=2;k++;}while(k<5);printf(吗d",sum);4.对于以下递归函数f,调用f(3)的返回值是intf(intk)(return((k<0)?1:f(k-2)+2);)5.下列程序段的输出结果是。staticchars[卜student^;printf("%c”,*(s+2));IL表达式(5=5ニニ5)的值为012.下列程序段的输出结果是〇intk,a二3,b=2;k=(a-—=b)?0:1;printf("%d",k);13.表达式((2くく1)[2)的值为014.下列程序段的输岀结果是〇#defineM(x,y)(x*y)printf("%d",M(2,3+4));15.下列程序段的输出结果是0intn;n=6;switch(n){case1:n=l;break;case2:n二2;break;case3:n=3;break;default:n二4;printf("%d",n);16«下列程序段的输出结果是〇intk=0;if(!(k==l))printf('***〃);elseprintf(〃###");17.下列程序段的输出结果是〇intx=TO,y=l;if(x>=0)if(x>0)y=0;elsey=-l;printfy);18.以下程序段的输出结果是〇intk=l,sum=8;while(k<6){sum++;k++;)printf("刎”,sum);19.对于以下递归函数f,调用f(3)的返回值是〇f(intn)(return(n<=0?1:f(n-1)+1);)20.下列程序段的输出结果是。intc[]={1,7,12);int*k;k=c;k++;printf("刎",*k);

18717.表达式(4/5*(float)3+(float)3*4/5)的值为22.下列程序段的输出结果是。ttincludeprintf("%d",NULL);23.表达式((411)&3)的值为。24.下列程序段的输出结果是0ttdefineM(x,y)(x*y)printfぐ‘%d”,M(2,3+4));25.下列程序段的输出结果是〇charc=,a*;intk=4;switch(c){case'a':k=l;caseV:k=2;case'c':k=3;)printf("%d",k);26.下列程序段的输岀结果是〇intk=10;if(k<0)printfk<0);elseprintf(u%d",k>=0);27.下列程序段的输出结果是〇intx=0,y=0;if(x>=0)if(x>0)y=l;elseyニ〇;elsey=-l;;printf('%d",y);28.以下程序段的输出结果是〇intk,sum=0;for(k=5:k<10;k++)sum+=k;printf(w%dH,sum);29.对于以下递归函数f,调用f(4)的返回值是intf(intn)(if(n)returnf(n-l)+n;elsereturnn;)30.下列程序段的输岀结果是〇staticchars[1Hwindow;printfs+3);31.表达式(5-1&&3+5/2)的值是。32.下列程序段的输岀结果是〇#includeprintf('%d”,EOF);33.表达式(3&4|2)的值为。34.下列程序段的输出结果是〇#defineM(x,y)(x/y)printf('%d”,M(3+4,6));35.下列程序段的输出结果是〇charc-x;intk=4;switch(c){case:k=3;case*b*:k=2;case'c':k=l;)printf(/z%dzz,k);36.下列程序段的输出结果是〇inta=l,b=2,c=0;if(a

188}while(k>0);printf(晩d”,k);25.对于以下递归函数f,调用f(3)的返回值是。intf(intx)(return((x>0)?f(x-l)+f(x-2):1);)26.下列程序段的输出结果是。int*p,*q,k=5,j=6;q-&k;p=q;q=&j;printf("%d",*p);27.表达式(2-5II(5>=4))的值是。到127。28.用八位二进制表示带符号的整数,则能表示数的范围是从29.表达式C3&7)的值为。30.下列程序段的输出结果是。ttdefineMIN(x,y)(x)<(y)?(x):(y)printfC%d#,10*MIN(10,15));31.下列程序段的输出结果是。charc二'b';intj=0;switch(c){case,,aj=4;breakcase'b'j=3case,,cj=2;breakcase'd'j=l}printfj);32.下列程序段的输出结果是.inta=l,c=0;if(a0){sum++;k-;)printfk);49.对于以下递归函数f,调用f(3)的返回值是0intf(intn){if(n<=l)returnn;elsereturnf(n-l)+f(n-2);}50.下列程序段的输出结果是〇int*p,k=1,j=0;p=&j;q=&k;p=q;(*p)++;printf("服)”,*q);51.表达式(a=b=4,a+1,b+=2,a+b)的值为〇52.用八位二进制表示无符号的整数,则能表示数的范围是从。到53I表达式,7&4)的值为〇54.下列程序段的输出结果是。#defineDD(x,y)(x*x-y*y)printfDD(2*3,2+3));55.下列程序段的输出结果是〇

189ints=0,a=l;switch(a){case1:s+=1;case2:s+=2;default:s+=3;)printf("%d",s);54.下列程序段的输出结果是〇inta=l,c=10;if(a>c)c=a;else;printf("%d*,c);55.下列程序段的输出结果是〇intx=0,y=0;if(x>=0)if(x<0);elsey="l;printfy);56.以下程序段的输岀结果是。intk;for(k=10;k>=0;k―);printf("对",k);57.对于以下递归函数f,调用f(3)的返回值是0intf(intn)(if(nく=1)returnn;elsereturnf(n-l)+n;}58.下列程序段的输出结果是〇int*p,k=5;p=&k;++(*p);printfk);四、阅读下列程序,写出输出结果。1.#includemain(){intk=2;while(k==0)printf(袋d",k);k++;printf(级d#",k))2.intk;for(k=2;k<5;k++)if(4/k==1)break;printf("%d#",k);3.intk=10;while(k=0)k=k—1;printf("%d#",k);4.intk,x;for(k=0,x=0;k<=9&&x!=10;k++)x+=2;printf("舞d#",k);5.intk,x=0;for(k=l;kく=5;k++){if(k%2)x++;elsecontinue;x++;}printf(级d#",x);6.intk;for(k=1;k<4;k++)if(kニニ2)continue;printf("%d#",k);7.#includemain()f(f(2));)intf(intx){staticintk=0;x+=k;

190k++;printf("%d,%d#w,x,k);returnx;}1.#includemain(){intm=O;m=f(2);printf("%d#",m);m=f(3);printf("%d#",m);}intf(intx){staticintk=1;x+=k;k++;printf("%d,",k);returnx;)2.^includemain(){intk;for(k=4;k>=l;k—)fun();}fun(){staticintm=0;m++;printf("%d#",m);)3.^includemain(){intk=l,m=2;m++;{intkニ〇;k+=m*2;printf(M%d,%d#",k,m);k++;printf(M%d,%d#",k,m);)

1911.#includemain(){intk=l,m=2;m++;k++;{intm=0;k=10;m++;k++;printf(M%d,%d#M,k,m);m++;k++;)printf(tt%d,%d#w,k,m);)2.^includeintm=10;main(){intk=l;m++;k++;{intk=-5;m++;k++;printf("%d,%d#M,k,m);m++;k++;}printf("%d,%d#w,k,m);)3.^includeintx,y,z;voidp(int*x,inty){intz;++*x;y—;z=・x+y;printf("%d,%d,%d#*,*x,y,z);)voidmain(){x=2;y=3;z=5;p(&y,x);printf("%d,%d,%d#”,x,y,z);)4.#includeintz;voidp(int*x,inty){++*x;y-;z=・x+y;printf("%d,%d,%d#",*x,y,z);}

192voidmain()(intx=2,y=3,z=4;p(&x,y);printf(,z%d,%d,%d#”,x,y,z);)1.^includeintc;func(int*a,intb){c=(*a)*b;*a=b-l;b++;return(*a+b+l);)main(){inta=4,b=2,p二〇;p=func(&b,a);printf("%d,%d,%d,%d#”,a,b,c,p);}2.#includevoidp(intx,int*y){*y=x++;)voidmain(){intx=0,y=0;P(10,&y);printf("%d,%d#",x,y);p(y,&x);printf("%d,%d#",x,y);}3.#includefunc(inta,intb,int*c,int*d){*c=a+b;*d=a-b;a++;b++;}main(){inta=4,b=3,c=2,d=l;func(d,c,&b,&a);printf("%d,%d,%d,%d#”,a,b,c,d);}4.^includefunc(int*a,intn,int*b){intk;for(k=0;kvoidmain(){longin,power,i;intnum;scanf("%ld',&in);for(power=1;in/power>0;power*二!0);

193power/=10;while(power>0){printf("%d#",in/power);in%=power;power/=10;)}输入02345く回车)1.#includevoidmain()(intm=0,sum=0;charc,oldc=,+';do{c=getchar();if(c<=,9'&&c>=’〇')m=10*m+c-’0';else{if(oldc='+')sum+=m;elsesumーニm;m=0;oldc=c;}}while(c!二‘二’);printf("%d#",sum);}输入ー12+3*10=く回车)2.#includevoidmain()(intn;charch;do{ch二getchar();}while(chぐO'IIch>'7');n=0;do{n=n*8+(ch-'0');ch=getchar();}while(ch>=,0'&&ch<='7');printfn);}输入afds2008b3cく回车)3.^include

194inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12});voidmain(){ints,k;for(s=。,k=。;k<3;k++)s+=a[k][k];printf("%d#",s);for(s=0,k=0;k<3;k++)s+=a[k][3-k];printf("%d#",s);for(s=0,k=0;k<4;k++)s+二*(a[l]+k);printf("%d#",s);)1.#includeintcal(inta,intb,charop){if(opニニ'*')return(a*b);elsereturn(a+b);}main(){intx,y,z,result;charopl,op2;scanf("%d%c%d%c%dn,&x,&opl,&y,&op2,&z);if(op2=='+,&&opl—♦*)result=cal(x,cal(y,z,op2),opl);elseresult=cal(cal(x,y,opl),z,op2);printfC%d#w,result);}输入2+3*5く回车)2.^includevoidmain(){staticchara[5]={,a','e','i','o',1u,};charstr[80];intk,j;gets(str);for(k=0;str[k]!=>\0';k++)for(j=0;j<5;j++)if(str[k]=a[j])str[k]=j+'O';puts(str);)输入Iamastudent.〈回车>3.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示。#includestructnode{

195intnum;structnode*next;);structnode*head;intfun(structnode*h){intkニ〇;structnode*p=h;while(p!=NULL){k+=p->num;p=p->next;}returnk;}main(){intm;m=fun(head);printf(大ニ%d

196”,m);1.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示。#includestructnode{intnum;structnode*next;);structnode*head;intfun(structnode*h){intk=0;structnode*p=h;while(p!=NULL){if(p->next!=NULL)k+=p->num;p=p->next;)returnk;)main(){intm;m=fun(head);printf("m二%d

197",m);head-q2|~|ヤリイピU一一*141^*17rLL2.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示。#includestructnode{intnum;structnode*next;);structnode*head;intfun(structnode*p){intk=0;structnode*pp=p;while(pp!=NULL){if((pp->num)%2==0)k+=pp->num;pp=pp->next;)return(k);}main(){intm;m=fun(head);

198printf("m二%d

199",m);head►10►20►30►40►50NULL1.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示。#includestructnode{intnum;structnode*next;);structnode*head;intfun(structnode*h){intk=0;structnode*p=h;p-head->next;p=p->next;while(p!=NULL){k+=p->num;p=p->next;}return(k);}mainO{intm;m=fun(head);printf("m二%d

200",m);29.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示。#includestructnode{charc;structnode*next;);structnode*head;voidfun(structnode*h){structnode*p=h;while(p!=NULL){if(p->c>=,A*&&p->c<=,Z*)putchar((*p).c);p=p->next;}}main(){intm;m=fun(head);printf("m二%d

201”,m);head->4>3►5►6►7NULL30.若head是node类型的全程量,以head为头指针的链表各节点的值如下图所示ttincludestructnode{intnum;structnode*next;);structnode*head;intfun(structnode*h){intkニ〇;structnode*p=h;while(p!=NULL){k+=p->num;p=p->next;if(p!=NULL)p=p->next;

202}return(k);}main(){intm;m=fun(head);五.编程序1.设计函数strcmp(sl,s2)是字符串比较,根据si,s2大小分别返回负数(sl〈s2),0(sl=s2),正数(sl>s2)。其中负数和正数为si和s2中第一个不同的两个字母的差值。2.分别输出方阵中主对角线、副对角线上元素的和suml和sum2(主对角线为从矩阵的左上角至右下角的连线,副对角线为从矩阵的右上角至左下角的连线)。3.读入n(n<=10)个整数并放入一个数组r中,统计并输出比相邻元素小的数组元素的个数。4.读入n(nく=10)个整数并放入一个数组r中,再读入ー个整数x,统计并输出x在数组r中出现的次数count,如果count>0.再输出x在r中所对应的最小下标(下标从。开始)。5.读入n(n<=10)个整数并放入一个数组「中,将其中的最小值(设唯一)与第一个元素交换,输出该数组。6.读入n(n<=10)个整数并放入一个数组r中,将其中的最大值(设唯一)与最后ー个元素交换,输出该数组。7.统计当前目录下文本文件data.txt中字符‘$’出现的次数。8.统计当前目录下文本文件data.txt中小写字母('a‘到'z')出现的次数。9.统计当前目录下文本文件data,txt中数字字符('0‘到’9')出现的次数。10.将当前目录下文本文件data,txt中的内容,原样输出在屏幕上。11.当前目录下文本文件data.txt中的内容,原样复制到当前目录下的文本文件res.txt。12.从键盘输入n个字符,将它们写入当前目录下的文本文件res.txt。13.sum=l+4+7+10+13,输入正整数n,求sum的前n项和。14.sum=2+4+6+8+10+,输入正整数n,求sum的前n项和。15.sum=l+3+5+7+9+.输入正整数n,求sum的前n项和。16.sum=2+5+8+ll+14)输入正整数n,求sum的前n项和。17.输入正整数n,求!*2*3*...*n的值。18.输入正实数x和正整数n.ズ的值。19.用选择排序法对10个整数从大到小排序。20.输入正实数X、正整数m和n(m,n)后,计算下列表达式的值并输出。Xn(a-n)XX要求定义并调用函数mypow(x,n)计算x,函数返回值的类型为double.21.输入ー个正整数m,如果m是素数,输出“Yes”,否则,输出‘'No"。要求定义并调用函数isprime(x)来判断x是否为素数(素数:除了1和此数本身之外,不能被其它整数整除的自然数,1不是素数,2是素数)。22.输入正整数m和n,如果m+n是质数,输出“Yes”,否则,输出“No”。要求定义并调用函数myfun(x)来判断x是否为质数(质数:除了1和此数本身之外,不能被其它整数整除的自然数)。23.输入正整数m和n,计算m和n之间所有奇数的和,要求定义并调用函数isodd(x)来判断x是否为奇数。24.输入正整数m和n(m2n)后,计算下列表达式的值并输出。m!n!(m-n)!要求将计算阶乘的运算写成函数myfact(n),函数返回值的类型为float。

203综合自测题1ー、单项选择题(每题1分,共20分)1.高级语言编写的程序称为()。A.高级程序B.源程序C.目标程序D.编译程序2.下列说法中错误的是()。A.主函数可以分为两个部分:主函数说明部分和主函数体B.主函数可以调用任何非主函数的其它函数C.任何非主函数可以调用其它任何非主函数D.程序可以从任何非主函数开始执行3.在PC机中,'

204,在内存占用的字节数是()。D.4D.b=a>3?2:2A.1B.2C.34.设a为5,执行下列语句后,b的值不为2的是()。A.b=a/2B.b=6-(—a)C.b=a%25.设整型变量m,n,a,b,c,d均为1,执行"(m=a>b)&&(n=a>b)”后,m,n的值是()。D.1,1A.0,0B.0,1C.1,06.设字符型变量a=3,b=6,计算表达式c=(a-b)く〈3后c的二进制值是()。A.00111000B.00000111C.00000001D.000110007.设a=1234,b=12,c=34执行“printf("|%3d%3d%-3d|

205”,a,b,c);”的输出是()«A.12341234B.I1231234|C.1123412-34|D.|2341234|8.下列语句中,错误的是()。A.while(x=y)5;B.dox++while(x==10);C.while(0);D.do2;while(a==b);9.若有以下说明,则数值为4的表达式是()。inta[12]={l,2,3,4,5,6,7,8,9,10,11,12);charc='a',d,g;A.a[g-c]B.a[4]C.a['d'-'c']D.a「d'-c]10.设指针x指向的整型变量值为25,则printf(Rd

206”,++*x);的输出是().A.26B.25C.24D.2311.若有以下定义,且0〈=i<5,则对数组元素地址的正确表示是()。inta[]={l,2,3,4,5},*p=a,i;A.&(a+i)B.a++C.&pD.&p[i]12.设有定义“a=3,b,*p=&a",则下列语句中使b不为3的语句是()。A.b=*&a;B.b=*p;C.b=a;D.b=*a;13.若有定义“inta[3][4],*p;",则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引用是(),A.p=aB.*(*(p+i)+j)C.*(p+i*4+j)D.*(*(a+i)+j)14.若有以下定义,则数值为4的表达式是()。intw[3][4]={{0,1},{2,4},{0,1},{0,1}},(*p)[4]=w;A.*w[l]+lB.p++,*(p+l)C.w[2][2]D.p[l][1]15.函数调用语句“f((el,e2),(e3,e4,e5));”中参数个数是().

207A.5B.4C.2D.11.能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()A.return这二个数B.形参用二个元素的数组

208C.形参用二个这种数据类型的指针D.用二个全局变量1.设有如下定义,则对data中的a成员的正确引用是()。structsk{inta;floatb;}data,*p=&data;A.(*p).data,aB.(*p).aC.p->data.aD.p.data,a2.设有如下定义成的链表,则值为6的表达式是()。structst{intn;structst*next;}a[3]={5,&a[l],7,&a[2],9,NULL},*p=&a;A.p++->nB.p->n++C.(*p).n++D.++p->n3.状下列语句中,将c定义为文件型指针的是()。A.FILEc;B.FILE*c;C.filec;D.file*c;4.设有以下宏定义,则执行语句“z=2*(N+Y(5+l));”后,z的值为()。#defineN3#defineY(n)((N+l)*n)A,出错B.42C.48D.54二、填充题(每空2分,共30分)1.数学式I——对应的C表达式是0)〇2.ch是char类型变量,“仅当ch是大写英文字母时改变ch为对应小写字母”的C表达式是(2)03.若程序中使用了库函数toupper、strcpy,那么在预处理命令中必须写入的头文件名为(3)。4.student是结构体类型标识符,x是student类型变量,则计算x的字节数的表达式为(4)»5.自定义函数fact的功能是计算k的阶乘,函数原型可以写作“floatfact(int)"«按照以下各小题的要求写出相应的函数原型。⑴自定义函数fl的功能是计算平面上任意两点之间的距离。(5)⑵自定义函数swap的功能是交换调用函数中两个float类型实参变量的值。(6)6.函数sort使用选择法将一维整型数组中各元素按值从大到小排序。voidsort((7)){inti,j,k,temp;for(i=0;i

209#includeSinclude#includevoidmain(){0®;intflag=l;charch;if((fl=fopen("a.txt","r"))ニニNULL){printf("不能打开文件a.txt

210");exit(0);)if((f2=fopen("b.txt","w"))==NULL){printf("不能打开文件b.txt

211");exit(0);)while(00){if(⑫&&ch>=a&&chく二'z')fputc(ch-32,f2);else⑬;if(!isalpha(ch))flag=l;elseflag二〇;)fclose(fl);fclose(f2);}6.设有char*a二'‘ABCD";,则printfC^s”,a)的输出是(14)5而printfC^c",*a)的输出是(15)〇三、程序分析题(每题5分,共30分)1.阅读下列程序,当输入为:ab*AB%cd#CD$时,写出程序运行的输出结果。main(){charc;while((c=getchar())!='$'){if(,A'く二c&&cく二'Z')putchar(c);elseif('a‘く二c&&cく二’z')putchar(c-32);})2.写出下列程序的输出结果:#includeintf(intx){staticinty二1;x+二y;y++;returnx;}voidmain(){intk;k=f(3);printf("%d%d

212",k,f(k));

213}1.写出下列程序的输出结果:#include#includevoidf(char*sl){charc;if(*sl!=‘、〇'){c二*si;strcpy(si,sl+1);f(si);putchar(c);)}voidmain(){f("abcdefg");)2.阅读下面程序,写出运行结果。♦(includevoidmain(){intm=18,s=0;do{switch(m%7){case2:m/=2;s+=2;break;case3:m/=3;s+=3;break;case5:m/=5;s+=5;break;default:m--;s--;);printf("%d

214",s);}whi1e(m);)5.阅读下面程序,写出运行结果。♦♦includevoidmain(){voiddiv(int*,int*);inta[5]={-5,0,60,45,34},i=0,j=2;while(a[i]<=0)i++;while(a[i]!=1)div(a+i,&j);}voiddiv(int*n,int*k){if(*n%*k==0){printf(,z%d,%d

215”,*n,*k);*n/=*k;)else(*k)++;6.阅读下面程序,写出运行结果。Sincludevoidmain(){ints[8],i;charch^B,-l;/・字符A的ASCII码为65*/printf(*%c%d

216”,ch,ch);for(i=7;i>=0:i—){s[i]=ch&l;ch=ch»l;)for(i=0;i<8;i++)printf("机)”,s[i]);printf("

217");)

218四、程序设计题(每题10分,共20分)1.编制程序,输入n个整数(n从键盘输入,n>0),输出它们的偶数和。2.编制函数,将m行n列数组a每行所有元素都除以该行上绝对值最大的那个元素的绝对值,要求所编写的函数原型为"voidf(float**a,intm,intn)"或"voidf(float*a[],intm,intn)"«

219综合自测题2ー、单项选择题(每题2分,共20分)1.下列运算符中自右向左结合的是:A)*B)==〇・>D)++2.下列赋值语句中正确的是:inta[3]={1,2,3},*p;A)p=&a;B)*p=a;C)*(a+l)=a;D)p=a+l;3.如下程序段:intc[]={l,2,3};int*k;k=c;printf(*nextkis刎",*++k);其输出应为:A)1B)2C)3D)以上均不对4.执行i=0;if(i>2)if(i<3)i=l;elsei=2;i=3i后i的值应为:A)1B)2C)3D)语句错误5.对于以下结构定义:struct{ntlen;char*str;}*p;++p->str中的++加在A)指针str上B)指针p上C)str所指的内容上D)以上均不是6.下列程序段的输出结果是:char*c[3]={"FIRST",“SECOND",“THIRD"};printfぐ(%s”,c+1);A)SECONDB)EC)ECONDD)语法有错7.对于以下递归函数f,调用f(4),其返回值为:intf(intn)if(n<=0)return1;returnf(n-l)+(n++);A>10B)11C)15D)以上均不是8.循环for(i=l,j=6;++i!=—j;)s=i+j:将执行A)2次B)3次C)4次D)以上均不是9.下列语句执行后n的值为:n=(4>4-!2)&&(2>1)||(2&6);A)0B)!〇6D)以上均不对10.执行完下列语句段后,i值为:inti;intf(intn)

220staticintm=1;n+=m++;returnn;n-f(l);n=f(2);3B)4C)5D)以上均不是二、填充题(每空2分,共30分)1.运行下列程序段后,n的值是:一intn;n=7&3;switch(n){case1:n=1;break;case2:n=2;break;case3:n=3;break;default:n=4;break;)2.下列程序段的输出结果是:一inti=010,j=10;printf("i二/d,j二%%'n”,i,j);3.如下函数voidf(char*s,char*t){inti;i=0;while(s[i]=t[i])i++;}等价于:voidf(char*s,char*t){while(=*t++);)4.下列程序段的输出结果是:—inta二〇,b二〇;if(++a>0&&++b>0)++a;printf("a=%d,b=%d”,a,b);5.下列程序段执行后,i和j的值分别是inti=6,j=0;while(i-,i!=1){j+=ーi;};6.下列程序段执行后,x和y的值分别是ーint・二5,y=l;do{(x>y)?(x-=l,y+=3):(x+=4,y一二2);}while(x+y<15);7.用下列for循环将小写字母逆序输出(即从z到a),其语句应为:for(i二〇;iく26;i++)8.设有变量定义inti,j,k=2,*ip;则执行下列语句后,i和k的值分别为

221ip=&k;i=(*ip)++;j=++(*ip);2.下列程序段执行后,i二inti;i=3へ5+Oil&Oxla;3.下列程序段执行后,i=ttdefineM(x,y)x+yttdefineN(x,y)x-yinti;i=M(l,2+3)*3/N(4+2,2);4.下列函数strcmp(sl,s2)是字符串比较,根据s列s2大小分别返回负数(siくs2),0(sl=s2),正数(sl>s2),请将缺少部分补上。其中负数和正数为si和s2中第一个不同的两个字母的差值.strcmp(char*si,char*s2){for(;*sl!=;++sl,++s2)if(*sl!=*s2)break;return();)5.下列程序段的输出结果是:union11{struct{intx;inty;}in;inta;intb;}e;q.a=l;e.b=2;r.in.x=e.a*e.b;s.in.y=e.a+e,b;printf("%d,%d

222”,e.in.x,e.in.y);现有链表,如下图所示,把P0结点插入指针P所指结点的后面,请写出必要的两个语句(次序不能颠倒):(1);(2);structlist{inti;structlist*next;);structlist*head,*p0,*p;モ、程序分析题(共30分)1.(8分)ttincludeintcal(inta,intb,charop)

223{if(op==,ギ)return(a*b);elsereturn(a+b);}main(){intx,y,z,result;charopl,op2;scanf(tt%d%c%d%c%d,,,&x,&opl,&y,&op2,&z);if(opl=ニ屮&&op2==’*')result=cal(x,cal(y,z,op2),opl);elseresult=cal(cal(x,y,opl),z,op2);printf(44%d

224",result);}问题:(D当输入为3+4*5时,上述程序将输出ー(2)当把上述if语句opl=='+'&&op2=ゴ・,中的opl,op2对调后,对于输入为3+4*5时,上述程序将输出:2.写出下列程序的运行结果(8分)#includeintx[3]={l,2,3},sum二0,i;voidfO(inta[]){a[l]=a[0];a[0]=a⑵;a⑵voidfl(void){for(i=0;i<3;i++)sum+=x[i];}voidf2(int*p){intsum=0;sum++;*p=sum;}main(){inty[3]={3,2,1);printf("%d”,x[y[2]]);fO(y);printf(,z%d",y[0]);fl();printf("%d",sum);f2(&sum);f2(&sum);printf("%d,sum);}3.写出下列程序的运行结果(8分)#includevoidf(inta[],intn,intm){inti,j,t;for(i=0;i

225f(a,10,3);for(i=0;i<10;i++)putchar(a[i]+,〇');}3.写出下列程序的运行结果(6分)-include#includestructnode{charc;structnode*next;);main(){structnode*head=NULL,*p=NULL,*q,*t;char*s="TheshiningC";while(*s){q=(structnode*)malloc(sizeof(structnode));qー〉c=・s;q->next=NULL;if(head==NULL)head二q;elsep->next=q;p=q;s++;)p二q二head;while(q!=NULL){if(!(q->c>=A'&&q->c<='Z')){if(q==head)head=q->next;elsep->next=q->next;t=q;q二qー〉next;free(t);)else{p=q;q=q->next;})q=head;while(q!=NULL){putchar((*q).c);q=qー〉next;}}四、程序设计题(每题10分,共20分)1.有一100个元素的整数数组,假设已存放了99个从小到大的整数,最后ー个空缺。编写ー程序,从键盘输入任一整数,把它放到数组中,使数组中数据仍然有序并输出。2.请编写ー个带命令行参数的程序prog.c.当运行progfilename时将文本文件filename按原样在标准输出(终端)上输出;当运行prog-ufilename时将文本文件filename全部以大写方式(指字母)在标准输出(终端)上输出;当运行prog-1filename时将文本文件filename全部以小写方式(指字母)在标准输出(终端)上输出;其它运行方式均显示出错信息.综合自测题3ー、单项选择题(每题2分,共20分)

2261.C语言程序的三种基本结构是顺序结构、选择结构和结构。A、循环B、递归C、转移D、嵌套2.若x是单精度实型变量,表达式(x=10/4)的值是〇A、2.5B、2.0C、3D、23.表达式!x等价于〇A、x==0B、x==lC、x!ニ〇D、x!二14.若变量已正确定义且k的值是4J计算表达式(j=k-)后,〇A、j=3,k=3B、j=3,k=4C、j=4,k=4D、j=4,k=35.算术运算符、赋值运算符和关系运算符的运算优先级按从高到低的顺序依次为ーA、算术运算、赋值运算、关系运算B、关系运算、赋值运算、算术运算C、算术运算、关系运算、赋值运算D、关系运算、算术运算、赋值运算6.C语言中,形参的缺省的存储类说明是.〇A、autoB、staticC、registerD、extern7.下列语句定义pf为指向float类型变量f的指针,是正确的。A、floatf,*pf=f;floatf,*pf=&f;C、float*pf=&f,f;D、floatf,pf=f;8.表达式sizeof(“key")的值是〇A、1B、2C、3D、49.将程序prog,c编译后运行:prog-nlahelloworld则・(*(argv+2))是。A.VB、C、HD>V10.若a是整型变量,表达式“(aへ”a)等价于〇A、スB、1C、〇D、2二、填充题(每空3分,共24分)1.printf(/z%d,%〇»%x",0x12,12,012)I的输出结果是〇2.下列程序段的输出结果是〇#defineF(x)x-2#defineD(x)x*F(x)printfC%d,%d",D(3),D(D(3)));3.下列程序段的输出结果是〇intk;char*s="ABC”;for(k=10;k!=0;k—);printf("%d”,k);while(*s++)putchar(*s);4.下列程序的输出结果是ー。voidfun(intk){staticinta;printf("%d,”,a);a+=k;}main(){intk;for(k=l;k<=3;k++)fun(k);}5,下列程序的输出结果是〇main(){structst{intx,y;}a[4]={{10,20),{30,40},{50,60),{70,80)):structst*p=a;printfCz%d,t

227p++->x);printf("%d,",++p->y);printf("%d

228z\(a+3)->x);}6,下列程序的输出结果是〇^include"stdio.h"voidmain(){intk,j,m,n,a[6][6],b[6];m=3,n=2;for(k=0;klongfib(intg){switch(g){case0:return(0);case1:case2:return(2);)printf("g二%d,",g);return(fib(g-l)+fib(g-2));)main(){longk;k=fib(4);printf("k=%ld

229,z,k);)8.用typedef定义一个长度为10的整型数组NUM是三、程序分析题(每题5分,共20分)1.写出下列程序的输出结果。#includeintx,y,z;voidp(int*x,inty){—*x;y++;z=*x+y;printf(*%d,%d,*,*x,y);}voidmain(){x=5;y=2;z=0;P(&x,y);printf(*%d,%d,%d—”,x,y,z);P(&y,x);printf("%d,%d,%d

230",x,y,z);)2.写出下列程序的输出结果,并指出该程序的功能。#includevoidmain(){intx,k;x=14;for(k=0;x!=0;x&=x-l)++k;printf("%d

231",k);}3.写出下列程序的输出结果。#includevoidmain(){intv[]={6,3,4,1,2};intn=5;intgap,j,k,temp;for(gap=n/2;gap>1;gap/=2)for(j=gap;j=0&&v[k]>v[k+gap];k-=gap){temp=v[k];v[k]=v[k+gap];v[k+gap]=temp;}for(k=0;k<5;k++)printf("%d,",v[k]);}4.输入123450后,写出下列程序的输出结果。#defineLENsizeof(structline)^defineNULL0structline{intnum;structline*next;}main(){structline*pl,*p2,*head;intj,k=0;pl=p2=head=(structline*)malloc(LEN);

232scanf("%d”,&pl->num);while(pl->num!=0){pl=(structline*)malloc(LEN);scanf("%d”,&plー〉num);if(pl->num==0)p2->next=NULL;else{p2->next=pl;p2=pl;}k++;)p2->next=head;pl=head->next;pl=pl->next;for(j=l;j<=k;j++){printf("->%dヽpl->num);pl=pl->next;)}四、程序填空题(每空2分,共20分)1.输入10个点的坐标(设坐标为整数值),输出距原点最远的点(设唯一)的坐标及该点距原点的距离.#includevoidmain(){struct{intx,y;floatlength;}point[10];intk,sub=0;for(k=0;k<10;k++){scanf("%d%d”,&point[k].x,&point[k].y);point[k].length=(1))for(k=l;k<10;k++)if((2))⑶printf("(%d,%d)%f

233”,point[sub],x,point[sub],y,point[sub],length);)2.将输入的n个字符串连接成1个字符串,然后输出该字符串.#include#includevoidmain(){charstr[10][20],string[200];intk,n;scanf("%d",&n);for(k=0;k

234(4)for(k=l;k='0'&&s[k]<='9'||s[k]>="a'&&s[k]<='f'){if(s[k]>=’〇'&&s[k]<='9")⑺if(s[k]>="a"&&s[k]<="f')(8)k++;}returnd;}4.函数month_day(year,yearday,ftmonth,&day)的功能是将给定的某年第几天转换为相应的月和日。例如:调用month一day(1988,60,&m,&d)后,m的值是2,d的值是29(即!988年的第60天是1988年2月29日)。判别闰年的条件:能被4整除但不能被100整除或能被400整除。voidmonthday(intyear,intyearday,int*pmonth,int*pday){staticintday_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};intk,leap;leap=year%4==0&&year%100!=0year%400==0;for(k=l;yearday>day_tab[leap][k];k++)(9)*pmonth=(10)*pday=yearday;}五、程序设计题(共16分)1.[程序说明](5分)请编写函数sum_fact(number),返回number的因子之和。(能整除number的数就是它的因子,number定义为inい例如sum_fact(6)=12(因为1,2,3,6是6的因子)2.[程序说明](11分)文本文件input.txt中存放了一批整数,将其中每个数的因子之和顺序写入文件output,txto(必须调用第1小题中定义的函数sumfact(number)计算number的因子之和)例:若文件Mput.txt中存放了!,2,6,则每个数的因子之和分别是1312,它们被写入文件output.txto

235第1章概述练习题答案ー、单项选择题12345ABBAD1112131415DABBA678910CACBD16D二、填充题1.机器语言问题的2.源程序解释3.大小写英文字母(52个)编译目标可执行程序数字(10个)键盘符号(33个)转义字符4.\5.保留字6.自定义字符序列7.由字母或下划线开头的字母、数字、下划线组成的ー串符号8.常量变量运算符函数调用表达式保留字9,数据定义赋值函数调用表达式流程控制复合空其他10.1主主11,/**/第2章基本数据类型和运算练习题答案ー、单项选择题12345ABACB1112131415CBBCC2122232425ADACB3132333435BCDBD4142434445CDBBD二、填充题1.212.非〇013.«define符号常量4.动态auto678910CADCA1617181920ADBAC2627282930CABDA3637383940ACBDD46C5.unsigneddouble6.存储类型符数据类型符7.内部变量或是外部变量char变量名に初值1变量名n=初值n;内部变量或外部变量存储类型8.外部参照型自动型寄存器型静态型自动型寄存器型静态型9.++&&

23610.1111000011.10(a>b>ca>b为1l>c假为〇)12.1(先求!a为〇0b){y=2;printf(tt***y=%d

237w,y);}else{x=l;printf(“***x=%d

238”,x);},7.108.((k%3==0)II(k%7==0))9.int(n!=0)i+1j+1scanf(''%dz,,&n)10.(x%i==0)三、程序分析题1.10,4,32.—13.8524.31-15.ABABCDCD四、程序设计题1.解:mian(){floatc,f;printf("输入华氏温度(F):

239");scanf("版",&f);c=5.0*(f-32)/9;printf("对应的摄氏温度(C)=%f

240",c);

241)2,解:main()

242{inta;printf("输入整数:

243w);scanf(M%d",&a);if(a>=0)printf(''0

244,z);elseprintf(x'-l

245,z);)3.解:main(){floatx,y;printf("输入数x:

246");scanf("%f",&x);if(x<=l)y=x;elseif(l

247zz,y);}4.解:main(){floatx,y,z,t;printf(“输入三个单精度数x,y,z:

248");scanf("%f,%f,%f”,&x,&y,&z);t=x;if(y

249",t);)4.解:main(){inti,j,k;for(i=l;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++)if(i*i*i+j*j*j+k*k*k==1099)printf(“各位数字的立方和等于1099的整数是:%d

250",i*100+j*10+k);}6.解:main(){inti,a,p=0,n=0,z=0;printf(“输入10个整数(用空格分开):

251”);for(i=l;i<=10;i++){scanf(ヽ、%dzz,&a);if(a>0)p++;elseif(a<0)n++;elsez++;)

252printf("正数的个数二%d

253",p);printf(“负数的个数ニ%d

254",n);printf("零的个数ニ%d

255",z);}

256main(){e=x;while(x>le-6){n=l;for(i=l;i<=m;i++)n=n*i;m++;x=l.0/n;e=e+x;)printf(、、e=%f

257”,e);)8,解:main(){intr=l;doublex=l,y=0;while(x>le-6){x=l.0/(r*r+l);printf("x或f

258”,x);y=y+x;r++;)printf("y二%f

259”,y);}9,解:main(0{inti;for(i=0x20;i<=0x6f;i++)printf(“十进制数值=%d,对应字符=%c

260",i,i);)10.解:main()(inti;for(i=l;i<=100;i++){if(i%5!=0)printf(''i=%3di*i=%4d”,i,i*i);elseprintf(''i=%3di*i=%4d

261",i,i*i);)i=l;while(i<=100){if(i%5!=0)printf(、、i或3di*i=%4d",i,i*i);elseprintf(''i=%3di*i=%4d

262”,i,i*i);i++:)i=l;do(

263if(i%5!=0)printf(、、i或3di*i=%4d”,i,i*i);elseprintf(、'i=%3di*i=%4d

264”,i,i*i);i++;}while(i<=100);)9,解:“辗转相除法”算法如下:(1)将两数放备份a,b。(2)将两数中大的那个放在m中,小的放在n中。(3)求出m被n除后的余数r。(4)若余数r为0则执行步骤(7);否则执行步骤(5)。(5)把除数(n中的)作为新的被除数(放m中),把余数(r中的)作为新的除数(放n中)〇(6)重复步骤(3)(4)直到r为0,(7)输出n即为最大公约数(8)原数(在备份a,b中)相乘除最大公约数即为最小公倍数。#includevoidmain(){intm,n,a,b,r,t;printf("输入个正整数:");scanf("%d,%d",&m,&n);a=m;b=n;if(m>0&&n>0){if(m

265”,a,b,n);}elseprintf(”输入了负数!'n");printf("%d和%d的最小公倍数为%(1、。”,a,b,a*b/n);return;}12.解:#includevoidmain(){inta,n,s,i,t;printf("输入a和n的值:");scanf("%d,%d",&a,&n);

266printf(a=%d,n=%d:

267”,a,n);t=a;for(i=l,s=0;i<=n;i++){s=s+t;t=t*10+a;printf("a+aa+aaa+・・・・+aa..a=%d

268",s);return;)13I解:#includevoidmain(){inti,j,k,a;printf("水仙花数是:

269");for(i=l;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++){a=i*100+j*10+k;if(a=i*i*i+j*j*j+k*k*k)printf("刎、n",a);}return;)14.解:#includevoidmain(){intn,s=0;printf(“输入一个正整数:");scanf(“如",&n);do{s+=n%10;n/=10;}while(n>0);printf("各位数之和是:%d

270",s);return;)15.解:设今天的挑子数为y,昨天的挑子数为x则有:y=x-(x/2+l)x=2*(y+1)从第!0天y=l起求出x,把x又当成今天(y二x)求昨天(x),这样向前推9天,即为第一天的挑子数。#includevoidmain(){inti,x,y=l;for(i=l;i<10;i++){x=2*(y+1);y=x;

271}printf(第一天共摘下桃子数为:%d

272”,x);return;)第4章数组练习题答案

273ー、单项选择题345678910ABDCBAC111213141511.12.ki^include8.&a[i]i%9printf(、、%3d

274”,a[i])9.k二p10.&xa[i]i——i!=013.'A'-65ヽB'-6525该程序利用了字符的ASCII码和整数的对应方法,数组c的下标为〇到25,当输入为ca='A'则ca-65=0,c[〇]的值加1,依此类推。而输出时c[i]的下标i+65正好又是相应的字母。0ca!二’#'scanf(、ヽ%c〃,&ca)6514.c[i]中放除16后的余数把c[i]中的余数作b下标,取相应的字符如:n二254n%16余14n=n/16n=15n%16余15n二n/16n二〇891011121314151689ABCDEF\063c0123・・・.1415d=c[l]=15取b[15]二Fd=c[0]=14取b[14]=E结果输出FEn%baseb[d]三、程序分析题1.该程序从键盘输入一行字符放在字符数组中,然后输出。2.该程序从输入的10个字符串中找出最长的那个串并显示长度。3.该程序的功能是从键盘输入10个字符串,从小到大排序并输出。4.运行结果,输出3x3矩阵的主对角线和辅对角线的元素之和。

27518101.把矩阵a转置放到矩阵b2.运行结果输出:3.运行结果把3x3矩阵a和b对应元素相加到矩阵c,输出矩阵c。4.程序边定义边赋值的方式定义了一个字符数组str。它包括22个字符(注意‘'1‘和’'11'分别代表一个特定字符)及末尾由系统自动加入的串结束标志''0'.〇程序利用for循环逐个读出str数组中的字符赋给字符变量c,再由内嵌的switch语句根据c的值来控制具体输出的字符。直到读到字符串结束标志''0'为止。(1)循环是从k=2开始,首先读取的是str中的第三个字符S。循环体内除switch语句外,还有一条语句:putchar('*');(2)continue语句要跳过循环体内尚未执行的语句,结束本次循环;break语句则仅仅跳出switch语句,仍要执行循环体中的语句。(3)当从str中读取的字符与case中所有常量表达式的值都不相等时,执行default后的语句,原样输出字符,并跳过putcharC*')结束本次for循环,(如第三个S,第一个W,I,T,C,H,第三个W,M和P均属此)。(4)当读到字符L时,与case中的‘L'相等,执行continue,结束本次for循环。没有输出。(5)当读到字符1时,与case中的’1'相等,执行break语句,跳出switch,输出ー个字符・。(6)当读到字符''1'(第一次出现的)时,代表一个8进制的1,与case中的1相等,执行while循环。在while循环中,首先执行c=str[++k],取下一个字符''11',它既不等于又不等于''〇',while循环继续执行,取出'W'。同理,再次执行while循环,取出字符''1",从而结束while循环,滑向下ー个case,输出字符'#',顺序执行到continue,结束本次for循环。(7)当读到大写字母A时,与case中的'A'相等,输出ー个小写字母a,并结束本次for循环。经以上分析可知,程序输出结果为:SWITCH*#WaMP*四、程序设计题1.解:#includevoidmain(){floata[10],x;inti;for(i=0;i<10;i++){scanf(、、%f",&x);a[i]=x;}for(i=0,x=0;i<10;i++)x=x+a[i];x=x/10.0;printf(“平均值=%f'n”,x);return;2,解:#includevoidmain(){inta[10],x,i;for(i=0;i<10;i++)scanf(、ヽ%d”,&a[i]);

276for(i=0;i<5;i++){x=a[i];a[i]=a[9-i];a[9~i]=x;}for(i=0;i<10;i++)printf(''%d",a[i]);printf(、、ヽn〃);return;)3.解:/・算法:数组a[3][3]a[0][0]a[0][l]a[0][2]a[l][0]a[l][l]a⑴⑵a⑵[0]a⑵⑴a[2][2]*/ttincludevoidmain()(floata[3][3],suml=0,sum2=0;inti,j;for(i=0;iく3;i++)for(j=0;j<3;j++)scanf("%f”,&a[i][j]);for(i=0;i<3;i++){for(j=0;j<3;j++)printf(*%f\a[i][j]);printf("

277");)for(i=0;iく3;i++)suml=suml+a[i][i];for(i二〇;iく3;i++)sum2=sum2+a[i][3-i-l];printf("主对角线的和是suml=%f

278z\suml);printf(“辅对角线的和是sum2二%f

279",sum2);return;)4,解:#include#includevoidmain(){chara[40],b[40],c[80];inti,j;printf(“分二行输入两个字符串:

280);gets(a)gets(b);for(i=0;a[i]!=/\0r;i++)c[i]=a[i];for(j=0;b[j]!二ヘ〇,;j++)c[i+j]=b[j];c[j]二,、〇,;puts(c);return;}5.解:#include#defineN10

281voidmain(){floatx[N],t,x0=0,s=0;inti;for(i=0;i

282,z,s);return;6,解:^includemain(){inta[3][5],i,j,max,min,maxi,maxh,mini,minh;for(i=0;i<3;i++)for(j=0;j<5;j++)scanf(、ヽ%d〃,&a[i][j]);max=min=a[0][0];for(i=0;i<3;i++)for(j=0;j<5;j++){if(a[i][j]>max){max=a[i][j];maxl=i;maxh=j;}if(a[i][j]#includevoidmain(){chara[80];inti;gets(a);for(i=0;ivoidmain(){floata[50[3],vag[]={0,0,0},x;

283inti,j;printf(“每人一行的输入50名学生的三种成绩'n”):for(i=0;i<50;i++)for(j=0;j<3;j++){scanf&x);a[i][j]=x;}for(j=0;j<3;j++)for(i=0;i<50;i++)vag[j]=vag[j]+a[i][j];for(j=0;j<3;j+=)vag[j]=vag[j]/50;printf(“课程一的平均分=%f

284课程二的平均分=%f

285课程三的平均分=%f

286,f,vag[0],vag[l],vag[2]);return;)9,解:#includevoidmain(){inta[5],n,i=0;printf(“输入一短整数:

287");scanf(ヽ、%d〃,&n);do{a[i]=n%10;i++;n=n/10;}while(n!=0);for(--i;i>0;--i)printf('ヽ%c,a[i]+48);printf(v%c

288,z,a[0]+48);return;}10.解:#includevoidmain()(floata[3][3],max,min;inti,j,k,max_k,min_k,flag二。;for(i=0;iく3;i++)for(j=0;j<3;j++)scanf(*%f*,&a[i][j]);for(i=0;iく3;i++){for(j=0;j<3;j++)printf(*%f*,a[i][j]);printf('

289");)for(i=0;iく3;i++){max=a[i][0];max_k=0;for(j=l;j<3;j++)if(a[i][j]>max){max=a[i][j];max_k=j;}min=a[0][maxk];min_k=0;for(k=l;k<3;k++)

290if(a[k][maxk]

291",min_k+l,max_k+l,a[min_k][max_k]);})if(!flag)printf("找不到鞍点、n");return;}10.解:#include4includevoidmain(){chara[80];inti;gets(a);for(i=0;i#includevoidmain(){chara[80];inti;gets(a);for(i=0;i^defineN15voidmain(){inta[N];inti,t;inttop二NT,low二〇,mid;for(i=0;i

292/Z输出数组看看printf(〃数组是:'n");for(i=0;i

293");printf("请输入要查找的数:");scanf("%d",&t);while(low1){mid=(top-low)/2+low;if(t=a[mid]){printf("%d位于表中第%d个数、n”,t,mid+1);break;}elseif(t#includevoidmain(){chara[3][80];inti,j,d,x,s,k,q;d=x=s=k=q=0;printf(〃输入3行文字,每行不超过80个字符、n〃);for(i=0;i<3;i++)gets(a[i]);for(i=0;i〈3;i++)for(j=0;j<80&&a[i][j]!='、〇';j++)if(a[i][j]>=A'&&a[i][j]くニ'Z')d++;elseif(a[i][j]>=,a'&&a[i][j]<=,z')x++;elseif(a[i][j]>=,O'&&a[i][j]<=,9')s++;elseif(a[i][j]=-')k++;elseq++;printf("大写字母数:%d

294",d);printf("小写字母数:%d

295",x);printf("数字字符数:%d、n〃,s);printf("空格字符数:%d

296",k);printf("其他字符数:%d

297",q);return;)

298第5章指针练习题答案ー、单项选择题12345678910CABDDBACCC11121314151617181920DCBBACBCDA2122232425CDCDC二、填充题1.地址加减赋值数组名2.地址NULL3.取地址运算符,相互赋值,赋NULL4.加减整数++,—5.指针(取值)取地址6.比较7.3+38.double*p=&a9.地址指的变量地址10.sz[i],p[i],*(sz+i)和*(p+i)11.ABCDA12.5013.*min,*a,*b,*ca,b,c*a,*b,*c*min=*b*min*min=*c*min14.,、〇,++15.sp=str[i]spstrlen(sp)三、程序分析题1.程序输出:ABCDEFGH2.程序的主要功能:把输入的10个整数反序一行ー个的输出。3.程序运行的输出结果:AABCDBBCDCCDDD4.该程序找出数组中最大和最小的元素,分别与第一和最后的元素交换,运行结果输出:13,10,-3,1,7,-215.程序用pi和指针pj指向字符串s的头尾,然后逐步向中比较字符,到不等时终止。若都相等,则是“回文”,回答“YES”,否则回答“N0”。因此当输入字符串“LEVEL”时,输出“YES”,当输入字符串“LEVAL”时输出“N0”。6.四个字符指针指向四个字符串,程序每次循环P指向一个字符串,输出第一的字符・P,运行的输出结果:AEIM7.程序运行输出:0123-1012-2-101-3-2-108.程序运行输出:10010110

29901101001四、程序设计题1.^includemain(){inta,b,c,*pa=&a,*pb=&b,*pc=&c;scanf(ヽ、%d,%d,%d〃,pa,pb,pc);if(*pa>=*pb)if(*pb>*pc)printf(''%d,%d,%d

300'',*pa,*pb,*pc);elseif(*pa>*pc)printf(''%d,%d,%d

301'',*pa,*pc,*pb);elseprintf(ヽ、%d,%d,%d

302'',*pc,*pa,*pb);elseif(*pc>*pb)printf(''%d,%d,%d

303'',*pc,*pb,*pa);elseif(*pa>*pc)printf(''%d,%d,%d

304'',*pb,*pa,*pc);elseprintf(''%d,%d,%d

305'',*pb,*pc,*pa);)2.^include#defineN15main(){inta[N],b,*p,*q;for(p二a;pくa+N;p++)scanf(''%dz,,p);for(p=a,q=a+N-l;p

306");}3.^include#includemain(){charstr[81],*sptr;gets(str);sptr二str+strlen(str)-1;for(;sptr>=str;sptr-)printf(''%c",*sptr);printf(''

307");)4.#include#defineN10main(){floata[N],avg,*pm,*ps,*p;for(p二a;pくa+N;p++)scanf(''%f",p);pm=ps=a;avg=*a;for(p=a+l;p*pm)pm=p;if(*p<*ps)ps=p;

308avg+=*p;)printf(“ー维实型数组最大值二%f

309",*pm);printf("ー维实型数组最小值二%f

310",*ps);printf("ー维实型数组平均值二%f

311”,avg/N);)1.#includemain(){inta[3][6],(*p)[6],i,j,maxh二〇,maxi二〇,minh二〇,mini二0,max,min;for(p=a,i=0;i<3;i++)for(j=0;j<6;j++)scanf(ヽ、%d〃,*(p+i)+j);printf("二维数组是:

312w);for(p=a,i=0;i<3;i++,p++){for(j=0;j<6;j++)printf(''%3d〃,(*p)[j]);printf(''

313");}max二min二a|_0」[0];for(p=a,i=0;i<3;i++)for(j=0;j<6;j++){if(*(*(p+i)+j)>max){maxh二i;maxi二j;max=*(*(p+i)+j);}if(*(*(p+i)+j)くmin){minimi;mini二j;min二*(*(p+i)+j);}}printf("最大值是:%d所在的行:%d所在的列:%d

314w,a[maxh][maxi],maxh,maxi);printf("最小值是:%d所在的行:%d所在的列:%d

315”,a[minh][mini],minh,mini);}2.^include#includemain(){chars[3][81],*p[3]={s[0],s[l],s[2]},*tp;inti;printf("输入3个字符串:、n”);for(i=0;i<3;i++)gets(p[i]);tp=p[o];for(i=l;i<3;i++)if(strcmp(p[i],tp)>0)tp=p[i];printf(“其中最大的字符串是:%s

316w,tp);)3.^include#includemain(){chara[40],b[40],c[80],*s,*t=c;gets(a);gets(b);s=a;for(;*s;)*t++=*s++;

317s=b;for(;*s;)*t++=*s++;*t二’、〇’;puts(c);)1.^include#includemain(){chara[81],b[81],*s=a,*t=b;gets(a);gets(b);whilw(*s&&*t)if(*s++!二・t++)break;if(!*s&&!*t)printf("%s与%s相等、U",a,b);elasprintf("%s与%s不相等、n”,a,b);}2.^include#defineN10main(){intx[N],*p二x,*min,*max,11,t2;printf(〃输入十个整数(用空格分开):、n〃);for(p=a;pくa+N;p++)scanf("%d”,p);min=&a[0];max二&a[NT];for(p=a;p*max)max二p;)tl二*min;*min二a【〇];a[〇]二tl;t2二・max;*max=a[N-l];a[N-l]=t2;for(p二a;pくa+N;p++)printf(*%dt*p);)3.^includevoidmain(){intx[100],i,n,m,end_num,*p;printf("输入整数个数n(少于100个):");scanf(*%d*,&n);printf(〃输入%d个整数(用空格分开):、n〃,n);for(p二x;p

318endnum二x[n-1];for(p=&x[n-l];p>=x;p-)*p=*(p-1);x[0]=end_num;)printf("这%d个整数移动后%d是:'n",n,m);for(p=x;p

319*);}1.#includevoidmain(){inta[3][3],i,j,t,*p,(*q)[3];P二a[0];printf(〃输入3X3个整数:'n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d”,p++);p二a[〇];printf("3X3的整数矩阵:'n〃);for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%3d”,*(p+i*3+j));printf("

320");}q=a;for(i=0;i<3;i++)for(j=i;j<3;j++){t=*(*(q+i)+j);*(*(q+i)+j)=*(*(q+j)+i);*(*(q+j)+i)=t;}printf("转置后3X3的整数矩阵:'n");for(i=0;i<3;i++){for(尸〇;jく3;j++)printf("%3d”,*(*(q+i)+j));printf("

321");2.^include#includevoidmain(){chara[80],*p;intcount=0;printf("输入一个字符串:'n");gets(a);p=a;for(;*p!='\0';p++)count++;printf("这个的长度是:%d

322",count);

323)1.#include#includevoidmain(){chara[80],*p;intup=0,lp=0,k=0,s=0,q=0;printf("输入一个字符串:、n");gets(a);P=a;while(*p!=\0,){iffA1<=*p&&*p<=,Z')up++;elseif('a‘く二*p&&*pく='z')lp++;elseif('〇'くニ・p&&*p<='9')s++;elseif(*pニニ‘')k++;elseq++;p++;}printf("大写字母个数是:%d

324*,up);printf("小写字母个数是:%d

325*,Ip);printf("空格个数是:%d

326",k);printf("数字个数是:%d

327",s);printf("其他字符个数是:%d

328",q);}2.#include#includevoidmain(){chara[80],b[80],*p,*q;intm;printf("输入一个字符串:'n");gets(a);printf("输入第几个字符开始复制:つ;scanf("%d",&m);p=a;q=b;for(p=p+m-l;*p!=,\0';p++,q++)*q=*p;*q二''〇';printf("被复制的字符串是:%s

329",b);)3.#include^includevoidmain(){chara[10][80],t[80],*p[10],*k;inti,j;printf(〃输入10个字符串:'n");

330for(i=0;iく10;i++){p[i]=a[i];gets(p[i]);}printf("这10个字符串原来是:'n");for(i=0;i<10;i++)puts(p[i]);for(i=0;i<9;i++){k=p[i];

331for(j=i+l;j<10;j++)if(strcmp(k,p[j])>0)k=p[j];if(k!=p[i]){strcpy(t,k);strcpy(k,p[i]);strcpy(p[i]»t);}printf(〃这10个字符串交换后:、べ);for(i=0;i<10;i++)puts(p[i]);第6章函数练习题答案ー、单项选择题12345678910BACCADBCAC二、填充题1.所定义的函数或复合语句内2.地址传递值传递3.函数内部局部4.56returnvoid变量地址指针数组名fun函数中,先由for(;isspace(*s);s++):移过字符串中的先导空格字符,系统函数isspace(*s)是判断空格字符的。若有字符'-',sign放ー1,否则放1,移过字符'-‘或’+<〇从此取出字符串中的数字字符(系统函数isdigit(*s)是判断数字字符的)其他字符不要,变成整数后,按位乘10相加(n=n*10+(*s-'0')),最后返回数sign*n值。63547.由于不用return返回值,因此z必须为指针int*z.调用时用add(a,b,&c)使z指向实参c,相加结果放・z=x+y即放实参c。8.w中从0算起有n指向数个字符,则w[*n]是空的,先把x中的字符放w[*n]。找出按序x中字符应放的位置p。(while(x>w[p])p++),从最后ー个字符w[i=*n](即要插入的字符)开始向前移位(w[i]=w[i-l])直到位p,则就把最后ー个字符(即要插入的字符)插入到了p位。9.*s-*t10.该递归函数的出口是if,因此,在此要填入遇到字符串结束标志时返回。字符串结束标志的方式有四种:*a=='、0',*a==NULL,*a==0或!*a。由于if中已有求反运算符!,故可填入:*a或填(*a!='\0'),(*a!=NULL),(*a!=0)〇显然%c*后要填入a.三、程序分析题1.函数的功能是能把pl和p2所指的实参数据交换。2.函数的功能:求出n个实数的平均值3.运算结果:把ー个无符号整数一位一位取出相乘。结果为!24.程序运算结果:〇〇〇〇,这是因为sub(a,x)的调用x对应y,是值调用,y的值并不返回给x,四次调用x都是。。5.程序运算结果:-85,1,2该函数的功能是求二维数组中最小元素值及它的行列下标。由于有三个数据要返回,因此用三个整数指针,而调用这个函数时,用了三个整数的地址。6.求fun(4),可用推展和回溯法读递归函数计算结果为:72程序设计题1.解floatroot(floata,floatb,floatc){return(b*b-4*a*c);}

3321.解intyear(inty){if((y%4==0&&y%100!=0)|y%400==0)return1;elsereturn0;}2.解#includevoidroot2(floatroot[2],floata,floatb,floatc){floatp;p=sqtr(b*b-4*a*c);root[0]=(-b+p)/(2*a);root[1]=(-b-p)/(2*a);}4,解voidmax_min(intm,intn){inta,b,t,r;a=m;b=n;if(m

333",a,b,n);printf("%d和%d的最小公倍数是%

334w,a,b,a*b/n);}5,解#include#includeintprime(intm){intk,i;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)return0;return1;}voidmain(){inta;for(a=3;a<=100;a++)if(prime(a))printf(、ヽ%3d〃,a);printf(、、、n〃);

3356.解intdays(inty,{intn;switch(l){case1:n=0;case2:n=n+31;case3:n二n+28;case4:n=n+31;case5:n=n+30;case6:n=n+31;case7:n=n+30;case8:n=n+31;case9:n=n+31;case10:n=n+30case11:n=n+31case12:n=n+30intm,intd)if(m==1)break;if(m==2)break;if(m==3)break;if(m==4)break;if(m==5)break;if(m==6)break;if(m==7)break;if(m==8)break;if(m==9)break;;if(m==10)break;;if(m==ll)break;}n=n+d;if(m>2)if((y%4==0&ay%100!=0)||(y%400==0))n=n+1returnn;}7,解voidtrus(intsi[2][3],ints2[3][2]){inti,j;for(i=0;i<2;i++)for(j=0;j<3;j++)s2[j][i]=sl[i][j];8,解includeintcountc(chararray[]){inti,n=0;for(i=0;i=,Z')n++;returnn;}9,解includeintlink(charsi[40],chars2[40],chars3[80]){inti,k,n=0;for(i=0;i

336returnn;}10.解voidfun(floata[],intn,float*max,float*min,float*vag){inti;*vag=a[0];*max=a[0];*min=a[0];for(i=l;i*max)*max=a[i];if(a[i]<*min)*min=a[i];*vag=*vag+a[i];}*vag=*vag/n;}11.解voidsortc(chara[]){intn,i,j;charch;n=strlen(a);for(i=0;ia[j+l]){ch=a[j];a[j]=a[j+l];a[j+l]=ch;}}12.解#includeinttv(char*s){intm,n=0;while(*s!=‘、〇'){if(isalpha(*s))*s=toupper(*s);switch(*s){case'F':m=15;break;case'E':m=14;break;case'D':m=13;break;case'C':m=12;break;case'B':m=11;break;case'A':m=10;break;default:m=*s-48;n=n*16+m;s++;}returnn;)13.解

337^includechara[255]J〃全局数组voidcontw(intm)〃递归转换{intn;statici=l;charc;if(m!=0){n=m%10;c=n+48;a[i]=c;m=m/10;i++;contw(m);)return;)voidconvert(char*b)〃倒置数组{int1,i;charc,*p;l=strlen(b);p=b+lT;for(i=l,b++;i<=l/2;i++,b++,p—)(c二*b;*b二*p;*p=c;}return;}voidmain()(intn;voidcontw(intm);voidconvert(char*b);printf(“输入一整数:“);scanf("%d",&n);if(n<0){a[0]='-';n=-n;}elsea[0]='';contw(n);convert(a);printf("字符串:%s

338",a);return;}第7章结构型、共用型和枚举型

339练习题答案单项选择题1BL2.3.4.5.23DD填充题等价成员5678910CBDBBD指向成员->18101解答该题,++pー〉a即要能画出如下的存储结构示意图:++(p->a)»由于p->z数组则p即z,pー>a即z[〇].a为100,再将此值自增1,后取值,为1016.structphcp->namep->telp->name,x三、程序分析题1.运行结果:由于对union类型变量z,z.i[〇]和z.c为同一内存位置,所以输出字符9。2.显然p指向结构数组第一个元素,故运行结果,第一个printf输出name二zhangtotal=170.0而a[l]为结构数组第二个元素,故第二个printf输出name=wangtotal=150.03.枚举值em3的值为2,因此相当于输岀aa[3],aa[l],aa[2],故运行结果为DD,BB,CC4.程序的运行结果:由于p指向a,a和变量i,f,s等同时赋初值,因此二个printf同输出:1998isWindowssal1800.005.程序的运行结果:p->9四、程序设计题1.main(){structemp{charname[10];floatjbg;floatfdg;floatzc;}e[3]={卜zha〇〃,240,400,75},{、、qian〃,360,120,50},卜sun”,560,0,80}};inti;for(i=0;i<3;i++)printf("姓名:%5s,实发数:%7・2f

340”,e[i].name,e[i].jbg+e[i].fdg-e[i].zc);2.main()

341{structemp{inteno;charen[20];floatjbg;floatzwg;}a[10]:inti,k;floatmin;printf(“输入10个职エ:编号,姓名,基本工资,职务エ资:

342w);for(i=0;i<10;i++)scanf(''%d,%s,%f,%fz,,eno,a[i].en,&a[i].jbg,&a[i].zwg);min=a[0].jbg+a[0].zwg;for(k二〇,i=l;i<10;i++)if(min>a[i].jbg+a[i].zwg){min=a[i].jbg+a[i].zwg;k=i;}printf("基本工资+职务エ资最少的职エ姓名是:%s

343w,a[k].en);}1.main(){structstudent{intsno;charsn[20];floatscore[3];floatsum;}s[10],*p=s,*q;inti;floatmaxニ〇;printf(〃输入10个学生:学号,姓名:

344成绩1成绩2成绩3:

345〃);for(;psno,p->sn);p->sum=0;for(i=0;i<3;i++){scanf(、ヽ%f〃,&pー〉score[i]);p->sum+=p->score[i];}}p=s;q=p;max=p->sum;for(;psum){max=pー>sum;q=p;}printf(“总分最髙的学生姓名是:%s总分%f

346w,q->sn,q->sum);2.main(){structstudent{charsn[20];floatscore[3];floatavg;}s[4]={{''zhan〃,97.5,89.0,78.0,0},{'ヽqian〃,90.0,93.0,87.5,0},{''sun〃,75.0,79.5,68.5,〇},{''li",82.5,69.5,54.0,0],},*p=s;inti;for(;p

347{for(i=0;i<3;i++)p->avg+=p->score[i];p->avg/=3;P=S;printf(''namefoxbasebasiccaverage

348,z);for(;pくs+4;p++)printf(''%-10s%4.If%8.If%8.If%8.2f

349,z,p->sn,p->score[0],pー)score[1],pー)score⑵,p->avg);}1.intdays(structdate*p){intn;switch(1){case1:n=0;if(p->m==l)break;case2:n=n+31;if(p->m==2)break;case3:n=n+28;if(p->m==3)break;case4:n=n+31;if(p->m==4)break;case5:n=n+30;if(p->m=5)break;case6:n二n+31;if(p->m==6)break;case17:n=n+30;if(p->m==7)break;case8:n=n+31;if(p->m==8)break;case9:n=n+31;if(p->m==9)break;case10n=n+30;if(p->m==10)break;case11n=n+31;if(p->m==ll)break;case12n=n+30;)n=n+p-〉d;if(p->m>2)if((p->y%4==0&&p->y%100!=0)||(p->y%400==0))n=n+l;returnn;}2.structstudent{intsno;charname[10];floatscore[3];);structstudent*nnew(){structstudent*p;p=(structstudent*)malloc(sizeof(structstudent));returnp;)第8章文件练习题答案ー、单项选择题

35012345ACBBC二、填充题1.fopenfclose2.文本二进制文件结束标志非零3.ch=fgetc(fp)fscanf(fp,〃%c〃,&ch)fputc(ch,fp)fprintf(fp,ch)4.fpn-1strfputs写入文件的实际字符数5.文件型指针变量stdio.h6.rewind()7.(!feof(fp))8.((fp=fopen(vstu.dat,z,,zrb,z))==NULL)fread(stud,sizeof(structstudent),N,fp)三、程序分析题1.该程序的功能是:从键盘读入ー个字符,如果是小写字母,则变成大写输出到屏幕上,否则原样输出。当打入ctrl-z(即EOF)时,输入结束。2.该程序的功能是:统计文本文件fname.txt中的空格字符数。3.该程序的功能是:把C盘根目录下的tc目录中的文件pl.c复制到A盘的根目录下,取同样的文件名pl・c。如果C盘中的pl.c文件超过1000字节,则最多复制1000字节。4.该程序先打开al.txt文件,然后调用函数fc(),把文件中#号字符以前的内容在屏幕上现示。再打开a2.txt文件,然后调用函数fc(),把文件中#号字符以前的内容在屏幕上接着现示。因此程序运行后输出121314252627四、程序设计题1.解^include''stdio.hzzmain(){FILE*fp;inti;if((fp=fopen(''fl.txtJ〃w〃))ニニNULL){printf(''Cannotopenfile!

351zz);exit(1);}for(i二1;iく二200;i++)fputc(getcharO,fp);fclose(fp);}2.解^include''stdio.hzzmain(){FILE*fp;inti;if((fp=fopen(''fl.txt","r"))ニニNULL){printf(''Cannotopenfile!

352");exit(1);}for(i二l;iく二120;i++)putchar(fgetc(fp));fclose(fp);)3.解#include''stdio.h"main(){FILE*fl,*f2;if((fl=fopen(''ccwl.txt",zzr"))==NULL){printf(''Cannotopenfile!

353zz);exit(0);}

354if((f2=fopen(''ccw2.txt”,〃w〃))ニニNULL){printf(''Cannotopenfile!

355");exit(0);}while(!feof(fl))fputc(fgetc(fl),f2);fclose(f1);fclose(f2);}1.解设计思路:从文件CCW.TXT中读ー个字符(字节),减10后写到ー临时文件TMPCCW.TXT,直到读到字符‘@’。然后两文件反绕到头,从文件TMPCCW.TXT中读ー个字符,写回到文件CCW.TXT,把原字符复盖。因此两文件用r+和w+的形式打开。#includemain(){FILE*fpl,*fp2;charch;if((fpl二fopen("ccw.txt","r+"))=NULL){printf("Cannotopenfile!

356");exit(0);)if((fp2=fopen("tmpccw.txt","w+"))ニニNULL){printf("Cannotopenfile!

357");exit(0);)while((ch=fgetc(fpl))!=,0?){fputc(ch-10,fp2);}rewind(fpl);rewind(fp2);do{ch=fgetc(fp2);if(!feof(fp2))fputc(ch,fpl);}while(!feof(fp2));fclose(fpl);fclose(fp2);}5,解#includemain(){FILE*fpl;charch;if((fpl=fopen("ccw.txt","r"))==NULL){printf("Cannotopenfile!

358");exit(0);}while((ch=fgetc(fpl))!二'®)putchar(ch+10);fclose(fpl);}6.解方法一、定义ー个结构变量,每输入ー个学生信息,即存入磁盘二进制数据文件student.dat中。建立存有100个学生信息的文件后,设计ー个总分为0的hs学生,再打开读取该文件,每读入ー个学生信息,即与hs比较,寻找总分最高的学生在hs,并输出该学生的所有信息。#include#include#includevoidmain(){structstudent(intsno;

359charsn[20];intsage;floatsg[7];floatsum;};structstudents,t,hs;FILE*fp;inti,j;if((fp二fopen("student,dat","w"))==NULL){printf("Cannotopenfile!

360");exit(0);}printf("以学号'n姓名'n年龄'n成绩1成绩2成绩3成绩4成绩5成绩6成绩7的形式输入:'n");for(i二〇;iく100;i++){printf("学生%d:

361",i+1);scanf("%d",&s.sno);scanf("%s",s.sn);scanf("%d",&s.sage);s.sum=0;for(j=0;j<7;j++){scanf("%f",&s.sg[j]);s.sum=s.sum+s.sg[j];)fwrite(&s,sizeof(structstudent),1,fp);}fclose(fp);if((fp=fopen("student,dat","r"))==NULL){printf("Cannotopenfile!

362");exit(0);}hs.sum=0;while(!feof(fp)){fread(&t,sizeof(structstudent),1,fp);if(t.sum>hs.sum){hs.sno=t.sno;strcpy(hs.sn,t.sn);hs.sage=t.sage;for(j=0;j<7;j++)hs.sg[j]=t.sg[j];hs.sum=t.sum;)}printf("总分最高的学生是");printf("学号:%d姓名:%s年龄:%d

363",hs.sno,hs.sn,hs.sage);printf("成绩1成绩2成绩3成绩4成绩5成绩6成绩7总分、n");

364for(j=0;j<7;j++)printf("%5.If",hs.sg[j]);printf("%5.lf'n,hs.sum);方法二、定义ー个100个元素的结构数组s,输入100个学生的信息后,一次存入磁盘二进制数据文件student.dat中。再打开该文件,读入100个学生信息到100个元素的结构数组t中。数组t中,用结构指针sp和hsp寻找总分最高的学生,使hsp指向它,并输出该学生的所有信息。voidmain()(structstudent{intsno;charsn[20];intsage;floatsg[7];floatsum;};structstudents[100],t[100],*sp,*hsp;FILE*fp;inti,j;floathsum=0;if((fp=fopen("student.dat","w"))==NULL){printf("Cannotopenfile!

365");exit(0);}printf("以学号'n姓名い年龄ゝn成绩1成绩2成绩3成绩4成绩5成绩6成绩7的形式输入:、n");for(i=0,sp=s;i<100;i++,sp++){printf("学生%d:

366",i+1);scanf1%d”,&sp->sno);scanf("%s",sp->sn);scanf("%d",&sp->sage);sp->sum=0;for(j=0;j<7;j++){scanf("%f",&sp->sg[j]);sp->sum=sp->sum+sp->sg[j];)}fwrite(s,sizeof(structstudent),100,fp);fclose(fp);if((fp=fopen("student,dat","r"))==NULL){printf("Cannotopenfile!

367");exit(0);}fread(t,sizeof(structstudent),100,fp);for(i=0,hsp=t,sp=t;i<100;i++,sp++){if(sp->sum>hsum){hsum=sp->sum;hsp=sp;

368printf("总分最高的学生是");printf("学号:%d姓名:%s年龄:%d

369*,hsp->sno,hsp->sn,hsp->sage);printf(〃成绩1成绩2成绩3成绩4成绩5成绩6成绩7总分、n〃);for(j=0;j<7;j++)printf("舫.If",hsp->sg[j]);printf("%5.lf

370",hsp->sum);fclose(fp);}7,解#includevoidmain(){charfname[20];FILE*fp;intnum=0,wordニ〇;charch;printf(〃输入要统计的文件名:“);scanf("%s,z,fname);if((fp=fopen(fname,"r"))==NULL){printf("打不开文件%s

371",fname);exit(0);}while(!feof(fp)){ch=fgetc(fp);if(ch==,')word=0;elseif(word==0){word=l;num++;)}printf("%s文件中有%d个单词、n",fname,num);fclose(fp);}8.解#includemain(){FILE*fpl,*fp2,*fp3;chara[160],ch;inti=0,j,n;if((fpl=fopen("f1.txt","r"))==NULL){printf("打不开文件fl.txt!

372");exit(0);)if((fp2=fopen("f2.txt","r"))==NULL){printf("打不开文件f2.txt!

373");exit(0);)if((fp3=fopen("f3.txt","w"))ニニNULL){printf("打不开文件f3.txt!

374");exit(0);)while(!feof(fpl)){ch=fgetc(fpl);if(!feof(fpl))a[i++]二ch;/・读文件fl.txt放到数组a中・/

375while(!feof(fp2)){ch=fgetc(fp2);if(!feof(fp2))a[i++]=ch;/・读文件f2.txt接着放到数组a中・/}a[i]=\0J;n=i;for(i=0;ia[j]){ch=a[i];a[i]=a[j];a[j]=ch;}i=0;while(a[i]!=,\0?){fputc(a[i],fp3);i++;}/・把数组a逐个字母写入文件f3.txt*/fclose(fpl);fclose(fp2);fclose(fp3);}第9章编译预处理与带参数的主函数练习题答案单项选择题1A11D二、1.2.3.4.5.BC12C填充题编译处理8910ACB“编译预处理”非静态存储类型变量和外部函数7i二〃%d

376〃BBBAAA123命令行中有4个字符串(包括p),因此,argc=4,argv[0]-p,argv[l]f123,argv[2]->AAA,argv[3]-*BBBO三、程序分析题1.程序运行结果为:50252.程序运行结果为:x=9,y=53.程序运行结果为:99114.程序输出:3ABCFILE1FILE25.该程序的功能是:在用命令行的形式运行本程序时,必须在程序名后加二个参数,这二个参数分别表示磁盘上的二个文件名。程序运行后,能把第一个文件的内容拷贝到第二个文件。如果命令行缺少参数或文件打不开,程序终止运行并显示出错情况。四、程序设计题1.解#include#include#defineS(a,b,c)0.5*(a+b+c)#defineAREA(a,b,c)sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))main()

377{floata,b,c;printf("输入三角形的三条边长:a,b,c

378w);scanf(、ヽ%f,%f,%f",&a,&b,&c);if((a+b>c)&&(b+c>a)&&(c+a>b)){printf(“周长二%f

379",2*S(a,b,c));printf(“面积=%f

380",AREA(a,b,c));)elseprintf(wa,b,c的长度不能构成三角形、n”);}2.解#includemain(intargc,char*argv[]){FILE*fl,*f2;charch;if(argc<3){printf(''Error!Useage:program_namesource_file_nameobjectfile_name

381");exit(0);}if((fl=fopen(argv[1],"r"))==NULL){printf(''Cannotopensourcefile!

382");exit(0);}if((f2=fopen(argv[2],"w"))==NULL){printf(''Cannotopenobjectfile!

383");exit(0);}while(!feof(f1))fputc(fgetc(fl),f2);fclose(f1);fclose(f2);)3.解#include#includemain(intargc,char*argv[]){inta,b;if(argc<3){printf(''Parametermissing!

384");exit(0);}a=atoi(argv[l]);b=atoi(argv[2])1〃在stdlib.h中有库函数atoi,把字符串转换成整数printf(''%5d+%5d=%5d

385",a,b,a+b);printf(''%5d-%5d=%5d

386",a,b,a-b);printf(''%5d*%5d=%5d

387",a,b,a*b);printf(''%5d/%5d=%5d

388",a,b,a/b);printf(''%5d%%%5d=%5d

389",a,b,a%b);)4.解#include#includemain(intargc,char*argv[])

390{inti,sumニ〇;

391for(i=l;i

392w,sum);)2.解#include#includemain(intargc,char*argv[]){if(argc<3)(printf(''Parametermissing!

393,z);exit(0);}if(strcmp(argv[l],argv[2])>0)puts(argv[l]);■)elseputs(argv[2]);综合练习答案ー、判断题题号12345678910答案ノJXVXXXVJX题号11121314151617181920答案ノXXVJXXVJX题号21222324252627282930答案XXJVVXJXVX题号31323334353637383940答案ノXXVJXJXXJ题号41424344454647484950答案XXJVJXJXXJ题号51525354555657585960答案XXJVJXJXXJ二、选择题题号12345678910答案ABAACDBABA题号11121314151617181920答案BADDDAADDB题号21222324252627282930答案ABADCBBBAC题号31323334353637383940答案ACBBCCBBBC题号41424344454647484950答案ACABDABBAB题号51525354555657585960答案BADDBBAACD题号61626364656667686970答案ACACADCADD题号71727374757677787980答案ABCCADBCCD题号81828384858687888990

394答案BCBDDCCAAC题号919293949596979899100答案ADCDAADBAC题号101102103104105106107108109no答案cDCABCDBCC题号”I112113114115116117118119120答案cDADBDDABA三、写输出结果题号12345678910答案100123###0115u题号11121314151617181920答案。16104***11347题号21222324252627282930答案2.401103103510dow题号31323334353637383940答案1-12312-1055题号41424344454647484950答案1-12841520-1022题号51525354555657585960答案10255043610-1-166四、阅读下列程序,写出输出结果1、3#7、2,1#3,2#13、4,1,5#2,4,5#19、2#3#4#5#25、1502、3#8、2,3#3,5#14、3,2,5#3,3,4#20、-19#26、583、〇#9、1#2#3#4#15、4,3,8,9#21、12827、104、5#10、6,3#1,3#16、0,10#10,10#22、18#21#26#28、145、6#11、11,1#12,3#17、・1,3,2,1#23、25#29、TA6、4#12、ー4,12#2,13#18、3,2,1,6#24、10m0st4dlnt.30、16五,编程序1.strcmp(char*si,char*s2){for(;*sl!=’、〇’;++sl,++s2)if(*sl!=*s2)break;return(*sl-*s2);}2.ttinclude#defineSIZE5main(){inta[SIZE][SIZE],m,n,suml,sum2;for(m=0;m

395z,,suml,sum2);

3961.^include"stdio.h"voidmain(){intk,count,n,r[10];scanfC%d*,&n);for(k=0;k

397”,count);}2.#include"stdio.h"voidmain(){intx,k,sub,count,n,r[10];scanf("%d",&n);for(k=0;k

398”,count);if(count>0)printf('1"subscriptis%d

399”,sub);}3.^include"stdio.h"voidmain(){intx,k,minsub,n,a[10],temp;scanf("%d",&n);for(k=0;ka[k])minsub=k;temp=a[〇];a[0]=a[minsub];a[minsub]=temp;for(k=0;k

400for(k二〇;kくn;k++)printf("%d",a[k]);}1.#includevoidmain(){FILE*fp;charch;intcountニ〇;if((fp=fopen("data.txt","r"))==NULL){printf("不能打开文件data,txt!

401");exit(0);)while((ch=fgetc(fp))!=EOF)if(ch=,$z)count++;printf("%d”,count);fclose(fp);}2.^includevoidmain(){FILE*fp;charch;intcount=0;if((fp=fopen("data,txt",〃r"))ニニNULL){printf("不能打开文件data.txt!

402");exit(0);}while((ch=fgetc(fp))!=EOF)if(ch>=,a'&&chくニ’z')count++;printf("%d",count);fclose(fp);3.^includevoidmain(){FILE*fp;charch;intcount=0;if((fp=fopen(*data.txt","r"))ニニNULL){printf("不能打开文件data,txt!

403");exit(0);)while((ch=fgetc(fp))!=EOF)if(ch<=,9'&&ch>:'O')count++;printf("%d",count);fclose(fp);}4.^includevoidmain(){FILE*fp;charch;intcount二〇;if((fp=fopen("data,txt","r"))ニニNULL){printf("不能打开文件data.txt!

404");exit(0);)while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);)5.^includevoidmain()(FILE*fpin,*fpout;charch;if((fpin=fopen("data,txt","r"))==NULL){printf("不能打开文件data.txt!

405");exit(0);)if((fpout=fopen("res.txt","w"))ニニNULL){printf("不能打开文件res.txt!

406");exit(0);

407}while((ch二fgetc(fpin))!=EOF)fputc(ch,fpout);fclose(fpin);fclose(fpout);11.4includevoidmain(){FILE*fpout;charch;intk,n;if((fpout=fopen(*res.txt","w"))ニニNULL){printf("不能打开文件res.txt!

408");exit(0);)scanf('ヽ%d〃,&n);for(k=0;kvoidmain(){intm,n,i;longsum;sum=0;m二1;scanf(、ヽ%d〃,&n);for(i二〇;i〈n;i++){sum+=m;m+=3;)printf("%ld

409",sum);)3.^includevoidmain(){intk,n,j;longsum;sum=0;k=2;scanf(ヽ、%d〃,&n);for(j=0;j

410",sum);}15.#includevoidmain(){intk,n,j;longsum;k二1;sum二。;scanf(''%d〃,&n);for(j=0;j

411printf("%ld

412”,sum);)15.^includevoidmain(){intk,n,j;longsum;k=2;sum=0;scanf(''%d",&n);for(j=0;j

413*,sum);}16.^includevoidmain(){intk,n;floaty;y=l;scanf(、ヽ%d〃,&n);for(k=l;k<=n;k++)y*=k;printf("%f

414”,y);)17.^includevoidmain(){intk,n;floatx,yy=l;scanf(ヽ、%f%d〃,&x,&n);for(k=l;k<=n;k++)y*=x;printf("%f

415”,y);)18.^defineN10main()(inti,j,k,max,t;inta[N];/・输入数据・/printf(”请输入10个数据:'n");for(i二〇;iCN;i++)scanf("%d”,&a[i]);/・排序・/

416for(i=0;iくNT;i++)(max=i;for(j=i;jdoublemypow(floatx,intn){doubley;intj;y=l;for(j=l;j<=n;j++)y*=x;returny;}voidmain(){intm,n;floatx,e;scanf(、ヽ%d%d%f”,&m,&n,&x);e=mypow(x,m)/mypow(x,n)/mypow(x,m-n);printf("%f

417”,e);}16.^include#includevoidmain(){intm;scanf("%d",&m);if(isprime(m))printf("Yes");elseprintf("No");)intisprime(intx)(inti,m;if(x==l)return0;m=sqrt(x);for(i=2;iく=m;i++)if(x%i==0)return0;

418return1;}15.^include#includeくmath.h>voidmain(){intm,n;scanfぐ‘%d%d”,&m,&n);if(myfun(m+n))printf("Yes");elseprintf("No");)intmyfun(intx){intk;for(k=2;k<=x/2;k++)if(x%k==0)return0;return1;}16.^include#includevoidmain(){intm,n,k;longsum;sum=0;scanf("%d%d",&m,&n);for(k=m;k<=n;k++)if(isodd(k))sum+=k;printf(v%ld

419",sum);)intisodd(intx){return(x%2);}17.#includefloatmyfact(intn){floaty;intj;y=l;for(j=2;j<=n;j++)y・二j;returny;)voidmain(){intm,n;

420floatescanf(、'%d%d",&m,&n);e=myfact(m)/myfact(n)/myfact(m-n);printf("%f

421",e);综合自测题1答案一、单项选择题(每题1分,共20分)

42212345BDACB1112131415DDCDC678910DABDA1617181920ABDBC二、填充题(每空2分,共30分)1..⑴sqrt(s*(s-a)*(s-b)*(s-c))2.⑵ch=(ch>=A'&&chくニ'Z')?ch+32:ch3.(3)ctype.h和string,h4.(4)sizeof(student)或sizeof(x)5.(5)floatfl(float,float,float,float)(6)voidswap(float*,float*)或voidswap(float&,float&)6.(7)inta[],intn(8)a[k]0),输出它们的偶数和。#includevoidmain(){inti,n,x,sum=0;scanf("釈T,&n);for(i=l;i<=n;i++){scanf("%d",&x);if(x%2==0)sum+=x;)printf("%d

423",sum);)2.编制函数,将m行n列数组a每行所有元素都除以该行上绝对值最大的那个元素的绝对值,要求所编写的函数原型为"voidf(float**a,intm,intn)"或"voidf(float*a[],intm,intn)"〇voidf(float**a,intm,intn){inti,j;floatx;for(i=0;i

424for(j=l;jfabs(x))x=fabs(*(*(a+i)+j));for(j=0;jnext=p0三、程序分析题(共30分)1(1)23⑵35221613_3456789012—4—TC四、程序设计题(每题10分,共20分)1.main(){inta[100],i,k;/・输入99个有序整数・/for(i=0;i<99;i++)scanf;/*输入ー个整数・/scanf&k);/・把它放到数组适当位置*/for(i=98;i>=0;i--)if(a[i]>k)a[i+l]=a[i];

425else{a[i+l]=k;break;}

426/・输出数组・/for(i=0;i<100;i++)printf(*a[%d]=%d”,i,a[i]);printf('

427");}1.#include#includevoidmain(argc,argv)intargc;char**argv;{FILE*fp;char*option,*fi1ename;inttagニ〇;charch;if(argc<2argc>3)(printf(''Argumenterror

428〃);return;}if(argc==3){if(strcmp(argv[l],''T")==0)tag=l;elseif(strcmp(argv[1],''-u〃)==0)tag=2;else(printf(''Optionerror

429,z);return;}filename=argv[2];}elsefilename=argv[l];if((fp=fopen(fi1ename,ヽ'r"))==NULL){printf(''Cannotopenfile

430〃);return;while(!feof(fp)){ch=fgetc(fp);if(tag==1)putchar(tolower(ch));elseif(tag==2)putchar(toupper(ch));elseputchar(ch);}fclose(fp);return;综合自测题3答案一、单项选择题(每题2分,共20分)题号12345678910选择ABADCABDCC二、填充题(每空3分,共24分)118,14,A27,一130BC10,41,7063,7,11,40,1,3,57g=4,g=3,k=68typedefintNUM[10]三、程序分析题(每题5分,共20分)14,3,4,2,7—1,5,4,1,623统计二进制数中1的数目

43132,1,4,3,6,(4,1,2,3,6,j)434512四、程序填空题(每空2分,共20分)(1)sqrt(point[k].x*point[k].x+point[k].y*point[k].y);(2)point[k].length>point[sub],length(3)sub=k;(4)strcpy(string,str[0]);(5)strcat(string,str[k]);(6)chars[]或char*s(7)d=d*16+s[k]-’〇';(8)d=d*16+s[k]-'a'+10;(9)yearday-=day_tab[leap][k];(10)k五、程序设计题(共16分)1、intsum_fact(intnumber)定义、变量说明、返回2分(intk,sum=0;if(number<0)number=-number;for(k=1;k<=number;k++)1分if(number%k==0)sum+=k;2分returnsum;}2、#include头文件、变量说明1分main()(FILE*fpin,*fpout;intx;if((fpin=fopen("input,txt","r"))==NULL){2分printflCan'topenfileinput.txt

432");exit(0);}if((fpout=fopen("output,txt","w"))==NULL){2分printflCan'tcreatfileoutput.txtzz);exit(0);}while(!feof(fpin)){1分fscanf(fpin,"%d",&x);2分fprintf(fpout,"%d",sumfact(x));2分}fclose(fpin);关闭文件1分fclose(fpout);

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭