《C语言-程序设计(郑莉.)课后习题.答案.doc》由会员分享,可在线阅读,更多相关《C语言-程序设计(郑莉.)课后习题.答案.doc(97页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+C+语言程序设计语言程序设计( (清华大学郑莉清华大学郑莉) )课后习题答案课后习题答案第第 一一 章章 概述概述1-11-1 简述计算机程序设计语言的发展历程。简述计算机程序设计语言的发展历程。解:解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,言、高级语言等阶段,C+C+语言是一种面向对象的编程语言,语言是一种面向对象的编程语言,也属于高级语言。也属于高级语言。1-21-2 面向对象的编程语言有哪些特点?面向对象的编程语言有哪些特点?解:解: 面向对象的编程语言与以往各种编程语言有根本的不同,它设面向
2、对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征)态特征)和行为(动态特征) ,形成类。通过类的继承与多态,形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风
3、格统一。因此,面向对象的编程语言使程序能够比较得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。事物所采用的一般思维方法来进行软件开发。C+C+语言是目前语言是目前应用最广的面向对象的编程语言。应用最广的面向对象的编程语言。1-31-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?什么是结构化程序设计方法?这种方法有哪些优点和缺点?解:解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构结构化程序设计的思路是:自顶向下、逐步求精
4、;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发
5、和维护。务分解成许多易于控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。开销,程序的可重用性差。由于图形用户界面的应用,程序运行由顺序运行演变为事件驱由于
6、图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。方法来开发和维护都将非常困难。 1-41-4 什么是对象?什么是面向对象方法?这种方法有哪些特点?什么是对象?什么是面向对象方法?这种方法有哪些特点?解:解: 从一般意义上讲,对象是现实世界中一个实际存在的事物,它从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对
7、象是构成世界的一个独立可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。系统的一个基本单位,由一组属性和一组行为构成。面向对象的方法将数据及对数据的操作方法放在一起,作为一面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体个相互依存、不可分离的整体-对象。对同类型对象抽象出其对象。对同类型对象抽象出其共
8、性,形成类。类中的大多数数据,只能用本类的方法进行处共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。的开发和维护都更为方便。面向对象方
9、法所强调的基本原则,就是直接面对客观存在的事面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。规则和技巧中回到客观世界,回到人们通常的思维。1-51-5 什么叫做封装?什么叫做封装?解:解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可
10、能隐蔽对象的内部细节。务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。1-61-6 面向对象的软件工程包括哪些主要内容?面向对象的软件工程包括哪些主要内容?解:解: 面向对象的软件工程是面向对象方法在软件工程领域的全面应面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(用,它包括面向对象的分析(OOAOOA) 、面向对象的设计(、面向对象的设计(OODOOD) 、面向对象的编程(面向对象的编程(OOPOOP) 、面向对象的测试(、面向对象的测试(OOTOOT)和面向对象)和面向对象的软件维护(的软件维护(OOSMOOSM)等主要内容。)等主要内容。1-71
11、-7 简述计算机内部的信息可分为几类?简述计算机内部的信息可分为几类?解:解: 计算机内部的信息可以分成控制信息和数据信息二大类;控制计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。数值信息两类。 1-81-8 什么叫二进制?使用二进制有何优点和缺点?什么叫二进制?使用二进制有何优点和缺点?解:解: 二进制是基数为二进制是基数为 2 2,每位的权是以,每位的权是以 2 2 为底的幂的进制,遵循逢为底的幂的进制,遵循逢二进一原则,基本符号为二进一原则,基本符号为 0 0
12、 和和 1 1。采用二进制码表示信息,有。采用二进制码表示信息,有如下几个优点:如下几个优点:1.1.易于物理实现;易于物理实现;2.2.二进制数运算简单;二进制数运算简单;3.3.机机器可靠性高;器可靠性高;4.4.通用性强。其缺点是它表示数的容量较小,表通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。示同一个数,二进制较其他进制需要更多的位数。1-91-9 请将以下十进制数值转换为二进制和十六进制补码:请将以下十进制数值转换为二进制和十六进制补码:(1 1)2 2 (2 2)9 9 (3 3)9393 (4 4)-32-32 (5 5)655356553
13、5 (6 6)-1-1 解:解: (1 1) (2 2)1010 = = (1010)2 2 = = (2 2)1616(2 2) (9 9)1010 = = (10011001)2 2 = = (9 9)1616(3 3) (9393)1010 = = (10111011011101)2 2 = = (5D5D)1616(4 4) (-32-32)1010 = = (1110000011100000)2 2 = = (E0E0)1616(5 5) (6553565535)1010 = = (1111111111111111 1111111111111111)2 2 = = (FFFFFFFF
14、)1616(6 6) (-1-1)1010 = = (1111111111111111 1111111111111111)2 2 = = (FFFFFFFF)16161-101-10 请将以下数值转换为十进制:请将以下数值转换为十进制:(1 1) (10101010)2 2 (2 2) (1000111110001111)2 2 (3 3) (0101111101011111 1100001111000011)2 2 (4 4) (7F7F)1616 (5 5) (2D3E2D3E)1616 (6 6) (F10EF10E)1616解:解: (1)(1)(10101010)2 2 = = (1
15、010)1010(2)(2)(1000111110001111)2 2 = = (143143)1010(3)(3)(0101111101011111 1100001111000011)2 2 = = (2451524515)1010(4)(4)(7F7F)1616 = = (127127)1010(5)(5)(2D3E2D3E)1616 = = (1158211582)1010(6)(6)(F10EF10E)1616 = = (6171061710)10101-111-11 简要比较原码、反码、补码等几种编码方法。简要比较原码、反码、补码等几种编码方法。解:解: 原码:将符号位数字化为原码:
16、将符号位数字化为 0 0 或或 1 1,数的绝对值与符号一起编,数的绝对值与符号一起编码,即所谓码,即所谓“ “符号符号绝对值表示绝对值表示“ “的编码。的编码。正数的反码和补码与原码表示相同。正数的反码和补码与原码表示相同。负数的反码与原码有如下关系:负数的反码与原码有如下关系:符号位相同符号位相同( (仍用仍用 1 1 表示表示) ),其余各位取反,其余各位取反(0(0 变变 1 1,1 1 变变 0)0)。补码由该数反码的最末位加补码由该数反码的最末位加 1 1 求得。求得。 第第 二二 章章 C+C+简单程序设计简单程序设计2-12-1 C+C+语言有那些主要特点和优点?语言有那些主要
17、特点和优点?解:解: C+C+语言的主要特点表现在两个方面,一是全面兼容语言的主要特点表现在两个方面,一是全面兼容 C C,二是,二是支持面向对象的方法。支持面向对象的方法。C+C+是一个更好的是一个更好的 C C,它保持了,它保持了 C C 的简的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对点,对 C C 的类型系统进行了改革和扩充,因此的类型系统进行了改革和扩充,因此 C+C+比比 C C 更安全,更安全,C+C+的编译系统能检查出更多的类型错误。的编译系统能检查出更多的类型错误。 C+C+语言最重要的语言最重要的特点
18、是支持面向对象。特点是支持面向对象。2-22-2 下列标识符哪些是合法的下列标识符哪些是合法的? ?ProgramProgram, -page-page, _lock_lock, test2test2, 3in13in1, mailmail, A_B_C_DA_B_C_D解:解: ProgramProgram, _lock_lock, test2test2, A_B_C_DA_B_C_D 是合法的标识符,其它是合法的标识符,其它的不是。的不是。2-32-3 例例 2.12.1 中每条语句的作用是什么?中每条语句的作用是什么?#include#include voidvoid main(void
19、)main(void) cout /指示编译器将文件指示编译器将文件 iostream.hiostream.h 中中的代码的代码/嵌入到该程序中该指令所在的地方嵌入到该程序中该指令所在的地方voidvoid main()main() /主函数名,主函数名,voidvoid 表示函数没有返回值表示函数没有返回值 /函数体标志函数体标志cout y)y)x x = = y;y;elseelse / y y x x | y y = x xy y = = x;x;2-172-17 修改下面这个程序中的错误,改正后它的运行结果是什修改下面这个程序中的错误,改正后它的运行结果是什么?么?#include#
20、include voidvoid main()main()intint i iintint j;j;i i = = 10;10; /*/* 给给 i i 赋值赋值j j = = 20;20; /*/* 给给 j j 赋值赋值 */*/coutcout intint main()main() intint i;i;intint j;j;i i = = 10;10; / 给给 i i 赋值赋值j j = = 20;20; /*/* 给给 j j 赋值赋值 */*/coutcout intint main()main() intint i;i;coutcout i;i;coutcout intint
21、 main()main() coutcout intint main()main() forfor (int(int i i = = 32;32; i?ABCDEFGHIJKLMNOP_QRSTUVWXYZ./0123456789:; 5)5) | (6(6 2 2解:解: 1 1 1 12 2 -1-13 3 0 04 4 0 02-282-28 编写一个完整的程序,实现功能:向用户提问编写一个完整的程序,实现功能:向用户提问“ “现在正在现在正在下雨吗?下雨吗?“ “,提示用户输入,提示用户输入 Y Y 或或 N N。若输入为。若输入为 Y Y,显示,显示“ “现在正现在正在下雨。在下雨。
22、“ “; 若输入为若输入为 N N,显示,显示“ “现在没有下雨。现在没有下雨。“ “;否则继续;否则继续提问提问“ “现在正在下雨吗?现在正在下雨吗?“ “解:解: 源程序:源程序:#include#include #include#include voidvoid main()main() charchar flag;flag;while(1)while(1) coutcout flag;flag;ifif ( ( toupper(flag)toupper(flag) = Y)Y) coutcout voidvoid main()main() intint i,score;i,score;
23、coutcout score;score;ifif (score100(score100 | score#include#include voidvoid main()main() charchar choice,c;choice,c;while(1)while(1) coutcout c;c;choicechoice = = toupper(c);toupper(c);ifif (choice(choice = A)A) coutcout #include#include voidvoid main()main() charchar choice;choice;while(1)while(1
24、) coutcout choice;choice;switch(toupper(choice)switch(toupper(choice) casecase A:A:coutcout #include#include voidvoid main()main() intint i,j,k,flag;i,j,k,flag;i i = = 2;2;while(iwhile(i #include#include voidvoid main()main() intint i,j,k,flag;i,j,k,flag;i i = = 2;2;dodoflagflag = = 1;1;k k = = sqrt
25、(i);sqrt(i);j j = = 2;2;dodoif(i%jif(i%j = 0)0) flagflag = = 0;0;break;break; j+;j+;whilewhile (j(j #include#include voidvoid main()main() intint i,j,k,flag;i,j,k,flag;for(ifor(i = = 2;2; i i voidvoid main()main() intint n n = = 18;18;intint m m = = 0;0;while(mwhile(m !=!= n)n) coutcout m;m;ifif (n(
26、n m)m)coutcout voidvoid main()main() intint n n = = 18;18;intint m m = = 0;0;dodocoutcout m;m;ifif (n(n m)m)coutcout enumenum weekdayweekday Sunday,Sunday,Monday,Monday,Tuesday,Tuesday,Wednesday,Wednesday,Thursday,Thursday,Friday,Friday,SaturdaySaturday; voidvoid main()main() intint i;i;weekdayweekd
27、ay d d = = Thursday;Thursday;coutcout intint main()main() intint intOne;intOne;intint intOne;intOneintOne = = 5;5;coutcout shortshort intint Divider(unsignedDivider(unsigned shortshort intint a,a, unsignedunsigned shortshort intint b)b) ifif (b(b = 0)0)returnreturn -1;-1;elseelsereturnreturn a/b;a/b
28、; typedeftypedef unsignedunsigned shortshort intint USHORT;USHORT;typedeftypedef unsignedunsigned longlong intint ULONG;ULONG;intint main()main() USHORTUSHORT one,one, two;two;shortshort intint answer;answer;coutcout one;one;coutcout two;two;answeranswer = = Divider(one,Divider(one, two);two);ifif (
29、answer(answer -1)-1)coutcout #include#include intint prime(intprime(int i);i); /判一个数是否是质数的函数判一个数是否是质数的函数voidvoid main()main() intint i;i;coutcout i;i;ifif (prime(i)(prime(i)coutcout #include#include intint fn1(intfn1(int i,inti,int j);j); /求最大公约数的函数求最大公约数的函数voidvoid main()main() intint i,j,x,y;i,j,x
30、,y;coutcout i i ; ;coutcout j j ; ;x x = = fn1(i,j);fn1(i,j);y y = = i i * * j j / / x;x;coutcout #include#include intint fn1(intfn1(int i);i);voidvoid main()main() intint i;i;coutcout i i ; ;coutcout longlong GetPower(intGetPower(int x x, intint y);y);intint main()main() intint numbernumber, power;
31、power;longlong answer;answer;coutcout number;number;coutcout power;power;answeranswer = = GetPower(numberGetPower(number,power);power);coutcout 2;n2; fib(1)fib(1) = = fib(2)fib(2) = = 1;1;观察递归调用的过程。观察递归调用的过程。解:解: 源程序见源程序见“ “实验指导实验指导“ “部分实验三部分实验三3-153-15 用递归的方法编写函数求用递归的方法编写函数求 n n 阶勒让德多项式的值,在主阶勒让德多项式
32、的值,在主程序中实现输入、输出;程序中实现输入、输出;解:解: #include#include floatfloat p(intp(int n,n, intint x);x);voidvoid main()main() intint n,x;n,x;coutcout n;n;coutcout x;x;coutcout templatetemplate T voidvoid swap(Tswap(T z;z z = = x;x;x x = = y;y;y y = = z;z; voidvoid main()main() intint j j = = 1 1, k k = = 2;2;doubl
33、edouble v v = = 3.03.0, w w = = 4.0;4.0;coutcout classclass DogDog public:public:DogDog (int(int initialAgeinitialAge = = 0 0, intint initialWeightinitialWeight = = 5);5);Dog();Dog();intint GetAge()GetAge() returnreturn itsAge;itsAge; / inline!inline!voidvoid SetAgeSetAge (int(int age)age) itsAgeits
34、Age = = age;age; / inline!inline!intint GetWeight()GetWeight() returnreturn itsWeight;itsWeight; / inline!inline!voidvoid SetWeightSetWeight (int(int weight)weight) itsAgeitsAge = = weight;weight; / inline!inline!private:private:intint itsAgeitsAge, itsWeight;itsWeight;Dog:Dog(intDog:Dog(int initial
35、AgeinitialAge, intint initialWeight)initialWeight) itsAgeitsAge = = initialAge;initialAge;itsWeightitsWeight = = initialWeight;initialWeight; Dog:Dog()Dog:Dog() /destructor/destructor, takestakes nono actionaction intint main()main() DogDog Jack(2Jack(2,10);10);coutcout classclass RectangleRectangle
36、 public:public:RectangleRectangle (int(int top,top, intint left,left, intint bottom,bottom, intint right);right);RectangleRectangle ()() intint GetTop()GetTop() constconst returnreturn itsTop;itsTop; intint GetLeft()GetLeft() constconst returnreturn itsLeft;itsLeft; intint GetBottom()GetBottom() con
37、stconst returnreturn itsBottom;itsBottom; intint GetRight()GetRight() constconst returnreturn itsRight;itsRight; voidvoid SetTop(intSetTop(int top)top) itsTopitsTop = = top;top; voidvoid SetLeftSetLeft (int(int left)left) itsLeftitsLeft = = left;left; voidvoid SetBottomSetBottom (int(int bottom)bott
38、om) itsBottomitsBottom = = bottom;bottom; voidvoid SetRightSetRight (int(int right)right) itsRightitsRight = = right;right; intint GetArea()GetArea() const;const;private:private:intint itsTop;itsTop;intint itsLeft;itsLeft;intint itsBottom;itsBottom;intint itsRight;itsRight;Rectangle:Rectangle(intRec
39、tangle:Rectangle(int top,top, intint left,left, intint bottom,bottom, intint right)right) itsTopitsTop = = top;top;itsLeftitsLeft = = left;left;itsBottomitsBottom = = bottom;bottom;itsRightitsRight = = right;right; intint Rectangle:GetArea()Rectangle:GetArea() constconst intint WidthWidth = = itsRig
40、ht-itsLeft;itsRight-itsLeft;intint HeightHeight = = itsTopitsTop - - itsBottom;itsBottom;returnreturn (Width(Width * * Height);Height); intint main()main() RectangleRectangle MyRectangleMyRectangle (100,(100, 20,20, 50,50, 8080 ););intint AreaArea = = MyRectangle.GetArea();MyRectangle.GetArea();cout
41、cout classclass RectangleRectangle public:public:Rectangle(floatRectangle(float len,len, floatfloat width)width) LengthLength = = len;len;WidthWidth = = width;width; Rectangle();Rectangle();floatfloat GetArea()GetArea() returnreturn LengthLength * * Width;Width; floatfloat GetLength()GetLength() ret
42、urnreturn Length;Length; floatfloat GetWidth()GetWidth() returnreturn Width;Width; private:private:floatfloat Length;Length;floatfloat Width;Width;voidvoid main()main() floatfloat length,length, width;width;coutcout length;length;coutcout width;width;RectangleRectangle r(length,r(length, width);widt
43、h);coutcout classclass datatypedatatypeenumenumcharacter,character,integer,integer,floating_pointfloating_point vartype;vartype;unionunion charchar c;c;intint i;i;floatfloat f;f;public:public:datatype(chardatatype(char ch)ch) vartypevartype = = character;character;c c = = ch;ch; datatype(intdatatype
44、(int ii)ii) vartypevartype = = integer;integer;i i = = ii;ii; datatype(floatdatatype(float ff)ff) vartypevartype = = floating_point;floating_point;f f = = ff;ff; voidvoid print();print();voidvoid datatype:print()datatype:print() switchswitch (vartype)(vartype) casecase character:character:coutcout c
45、lassclass CircleCircle public:public:Circle(floatCircle(float radius)radius) RadiusRadius = = radius;radius;Circle()Circle()floatfloat GetArea()GetArea() returnreturn 3.143.14 * * RadiusRadius * * Radius;Radius; private:private:floatfloat Radius;Radius;voidvoid main()main() floatfloat radius;radius;coutcout radius;radius;CircleCircle p(radius);p(radius);coutcout class