《C语言程序设计郑莉课后习题答案 .doc》由会员分享,可在线阅读,更多相关《C语言程序设计郑莉课后习题答案 .doc(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+语言程序设计(清华大学郑莉)课后习题答案第 一 章 概述1-1 简述计算机程序设计语言的发展历程。解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C+语言是一种面向对象的编程语言,也属于高级语言。1-2 面向对象的编程语言有哪些特点?解: 面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使
2、得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C+语言是目前应用最广的面向对象的编程语言。1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于
3、控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。 1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点?解: 从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是
4、有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体-对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为
5、方便。面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。1-5 什么叫做封装?解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。1-6 面向对象的软件工程包括哪些主要内容?解: 面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)
6、等主要内容。1-7 简述计算机内部的信息可分为几类?解: 计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。 1-8 什么叫二进制?使用二进制有何优点和缺点?解: 二进制是基数为2,每位的权是以2 为底的幂的进制,遵循逢二进一原则,基本符号为0和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。1-9 请将以下十进制数值转换为二进制和十六进制补码:(1)2 (2)9 (3)93 (4)-
7、32 (5)65535 (6)-1 解: (1) (2)10 = (10)2 = (2)16(2) (9)10 = (1001)2 = (9)16(3) (93)10 = ()2 = (5D)16(4) (-32)10 = ()2 = (E0)16(5) (65535)10 = ( )2 = (FFFF)16(6) (-1)10 = ( )2 = (FFFF)161-10 请将以下数值转换为十进制:(1)(1010)2 (2)()2 (3)( )2 (4)(7F)16 (5)(2D3E)16 (6)(F10E)16解: (1)(1010)2 = (10)10(2)()2 = (143)10(3
8、)( )2 = (24515)10(4)(7F)16 = (127)10(5)(2D3E)16 = (11582)10(6)(F10E)16 = (61710)101-11 简要比较原码、反码、补码等几种编码方法。解: 原码:将符号位数字化为 0 或 1,数的绝对值与符号一起编码,即所谓符号绝对值表示的编码。正数的反码和补码与原码表示相同。负数的反码与原码有如下关系:符号位相同(仍用1表示),其余各位取反(0变1,1变0)。补码由该数反码的最末位加1求得。 第 二 章 C+简单程序设计2-1 C+语言有那些主要特点和优点?解: C+语言的主要特点表现在两个方面,一是全面兼容C,二是支持面向对象
9、的方法。C+是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对C的类型系统进行了改革和扩充,因此C+比C更安全,C+的编译系统能检查出更多的类型错误。 C+语言最重要的特点是支持面向对象。2-2 下列标识符哪些是合法的?Program, -page, _lock, test2, 3in1, mail, A_B_C_D解: Program, _lock, test2, A_B_C_D是合法的标识符,其它的不是。2-3 例2.1中每条语句的作用是什么?#include void main(void)coutHello!n;coutWelcome to c+!
10、n;解: #include /指示编译器将文件iostream.h中的代码/嵌入到该程序中该指令所在的地方void main() /主函数名,void 表示函数没有返回值 /函数体标志coutHello!n; /输出字符串Hello!到标准输出设备(显示器)上。coutWelcome to c+!n; /输出字符串Welcome to c+!在屏幕输出如下:Hello!Welcome to c+!2-4 使用关键字const而不是#define语句的好处有哪些?解: const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。2-5 请写出C+语句声明一
11、个常量PI,值为3.1416;再声明一个浮点型变量a,把PI的值赋给a。解: const float PI = 3.1416;float a = PI;2-6 在下面的枚举类型中,Blue的值是多少?enum COLOR WHITE, BLACK = 100, RED, BLUE, GREEN = 300 ;解: Blue = 1022-7 注释有什么作用?C+中有哪几种注释的方法?他们之间有什么区别?解: 注释在程序中的作用是对程序进行注解和说明,以便于阅读。编译系统在对源程序进行编译时不理会注释部分,因此注释对于程序的功能实现不起任何作用。而且由于编译时忽略注释部分,所以注释内容不会增加最
12、终产生的可执行程序的大小。适当地使用注释,能够提高程序的可读性。在C+中,有两种给出注释的方法:一种是延用C语言方法,使用/*和*/括起注释文字。另一种方法是使用/,从/开始,直到它所在行的行尾,所有字符都被作为注释处理。2-8 什么叫做表达式?x = 5 + 7是一个表达式吗?它的值是多少?解: 任何一个用于计算值的公式都可称为表达式。x = 5 + 7是一个表达式,它的值为12。2-9 下列表达式的值是多少?1. 201 / 42. 201 % 43. 201 / 4.0解: 1 502 13 50.252-10 执行完下列语句后,a、b、c三个变量的值为多少?a = 30;b = a+;
13、c = +a;解: a:32 ; b:30 ; c:32;2-11 在一个for循环中,可以初始化多个变量吗?如何实现?解: 在for循环设置条件的第一个;前,用,分隔不同的赋值表达式。例如:for (x = 0, y = 10; x 100; x+, y+)2-12 执行完下列语句后,n的值为多少?int n;for (n = 0; n 100; n+)解: n的值为1002-13 写一条for语句,计数条件为n从100到200,步长为2;然后用while和dowhile语句完成同样的循环。解: for循环:for (int n = 100; n = 200; n += 2); while循
14、环:int x = 100;while (n = 200)n += 2; dowhile循环:int n = 100;don += 2; while(n y)x = y;else / y x | y = xy = x;2-17 修改下面这个程序中的错误,改正后它的运行结果是什么?#include void main()int iint j;i = 10; /* 给i赋值j = 20; /* 给j赋值 */cout i + j = i + j; /* 输出结果 */return 0;解: 改正:#include int main()int i;int j;i = 10; / 给i赋值j = 20
15、; /* 给j赋值 */cout i + j = i + j; /* 输出结果 */return 0;程序运行输出:i + j = 302-18 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。解: 源程序:#include int main()int i;cout i;cout 您输入一个数字是 i endl;return 0;程序运行输出:请输入一个数字:5您输入一个数字是52-19 C+有哪几种数据类型?简述其值域。编程显示你使用的计算机中的各种数据类型的字节数。解: 源程序:#include int main()cout The size of an int is:tt s
16、izeof(int) bytes.n;cout The size of a short int is:t sizeof(short) bytes.n;cout The size of a long int is:t sizeof(long) bytes.n;cout The size of a char is:tt sizeof(char) bytes.n;cout The size of a float is:tt sizeof(float) bytes.n;cout The size of a double is:t sizeof(double) bytes.n;return 0;程序运行
17、输出:The size of an int is: 4 bytes.The size of a short int is: 2 bytes.The size of a long int is: 4 bytes.The size of a char is: 1 bytes.The size of a float is: 4 bytes.The size of a double is: 8 bytes.2-20 打印ASCII码为32127的字符。解: #include int main()for (int i = 32; i128; i+)cout (char) i;return 0;程序运行输
18、出:!#$%G()*+,./:;?ABCDEFGHIJKLMNOP_QRSTUVWXYZabcdefghijklmnopqrstuvwxyzs2-21 运行下面的程序,观察其输出,与你的设想是否相同?#include int main()unsigned int x;unsigned int y = 100;unsigned int z = 50;x= y - z;cout Difference is: x;x = z - y;cout nNow difference is: x endl;return 0;解: 程序运行输出:Difference is: 50Now difference i
19、s: 注意,第二行的输出并非 -50,注意x、y、z的数据类型。2-22 运行下面的程序,观察其输出,体会i+与+i的差别。#include int main()int myAge = 39; / initialize two integersint yourAge = 39;cout I am: myAge years old.n;cout You are: yourAge years oldn;myAge+; / postfix increment+yourAge; / prefix incrementcout One year passes.n;cout I am: myAge year
20、s old.n;cout You are: yourAge years oldn;cout Another year passesn;cout I am: myAge+ years old.n;cout You are: +yourAge years oldn;cout Lets print it again.n;cout I am: myAge years old.n;cout You are: yourAge years oldn;return 0;解: 程序运行输出:I am 39 years oldYou are 39 years oldOne year passesI am 40 y
21、ears oldYou are 40 years oldAnother year passesI am 40 years oldYou are 41 years oldLets print it againI am 41 years oldYou are 41 years old2-23 什么叫常量?什么叫变量?解: 所谓常量是指在程序运行的整个过程中其值始终不可改变的量,除了用文字表示常量外,也可以为常量命名,这就是符号常量;在程序的执行过程中其值可以变化的量称为变量,变量是需要用名字来标识的。2-24 变量有哪几种存储类型?解: 变量有以下几种存储类型:auto存储类型:采用堆栈方式分配内
22、存空间,属于一时性存储,其存储空间可以被若干变量多次覆盖使用; register存储类型:存放在通用寄存器中;extern存储类型:在所有函数和程序段中都可引用;static存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。2-25 写出下列表达式的值:1. 2 3 & 6 92. ! ( 4 5) | (6 2解: 1 12 -13 04 02-28 编写一个完整的程序,实现功能:向用户提问现在正在下雨吗?,提示用户输入Y或N。若输入为Y,显示现在正在下雨。; 若输入为N,显示现在没有下雨。;否则继续提问现在正在下雨吗?解: 源程序:#include #include void
23、 main()char flag;while(1)cout flag;if ( toupper(flag) = Y)cout 现在正在下雨。;break;if ( toupper(flag) = N)cout 现在没有下雨。;break;程序运行输出:现在正在下雨吗?(Yes or No):x现在正在下雨吗?(Yes or No):l现在正在下雨吗?(Yes or No):q现在正在下雨吗?(Yes or No):n现在没有下雨。或:现在正在下雨吗?(Yes or No):y现在正在下雨。2-29 编写一个完整的程序,运行时向用户提问你考试考了多少分?(0100),接收输入后判断其等级,显示出
24、来。规则如下:解: #include void main()int i,score;cout score;if (score100 | score0)cout 分数值必须在0到100之间!;elsei = score/10;switch (i)case 10:case 9:cout 你的成绩为优!;break;case 8:cout 你的成绩为良!;break;case 7:case 6:cout 你的成绩为中!;break;default:cout 你的成绩为差!; 程序运行输出:你考试考了多少分?(0100):85你的成绩为良!2-30 (1)实现一个简单的菜单程序,运行时显示Menu:
25、A(dd) D(elete) S(ort) Q(uit), Select one:提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入为A、D、S时分别提示数据已经增加、删除、排序。输入为Q时程序结束。要求使用if else语句进行判断,用break、continue控制程序流程。解: #include #include void main()char choice,c;while(1)cout c;choice = toupper(c);if (choice = A)cout 数据已经增加. endl;continue;else if (choice = D)cout 数据已经
26、删除. endl;continue;else if (choice = S)cout 数据已经排序. endl;continue;else if (choice = Q)break;程序运行输出:Menu: A(dd) D(elete) S(ort) Q(uit), Select one:a数据已经增加. Menu: A(dd) D(elete) S(ort) Q(uit), Select one:d数据已经删除. Menu: A(dd) D(elete) S(ort) Q(uit), Select one:s数据已经排序. Menu: A(dd) D(elete) S(ort) Q(uit)
27、, Select one:q (2)实现一个简单的菜单程序,运行时显示Menu: A(dd) D(elete) S(ort) Q(uit), Select one:提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入为A、D、S时分别提示数据已经增加、删除、排序。输入为Q时程序结束。要求使用Switch语句。解: 源程序:#include #include void main()char choice;while(1)cout choice;switch(toupper(choice)case A:cout 数据已经增加. endl;break;case D:cout 数据已经删
28、除. endl;break;case S:cout 数据已经排序. endl;break;case Q:exit(0);break;default:;程序运行输出:Menu: A(dd) D(elete) S(ort) Q(uit), Select one:a数据已经增加. Menu: A(dd) D(elete) S(ort) Q(uit), Select one:d数据已经删除. Menu: A(dd) D(elete) S(ort) Q(uit), Select one:s数据已经排序. Menu: A(dd) D(elete) S(ort) Q(uit), Select one:q2-
29、31 用穷举法找出1100间的质数,显示出来。分别使用while,do-while,for循环语句实现。解: 源程序: 使用while循环语句:#include #include void main()int i,j,k,flag;i = 2;while(i = 100)flag = 1;k = sqrt(i);j = 2;while (j = k)if(i%j = 0)flag = 0;break;j+;if (flag)cout i 是质数. endl;i+; 使用dowhile循环语句:#include #include void main()int i,j,k,flag;i = 2;d
30、oflag = 1;k = sqrt(i);j = 2;doif(i%j = 0)flag = 0;break;j+;while (j = k);if (flag)cout i 是质数. endl;i+;while(i = 100); 使用for循环语句:#include #include void main()int i,j,k,flag;for(i = 2; i = 100; i+)flag = 1;k = sqrt(i);for (j = 2; j = k; j+)if(i%j = 0)flag = 0;break;if (flag)cout i 是质数. endl;程序运行输出:2是质
31、数.3是质数.5是质数.7是质数.11是质数.13是质数.17是质数.19是质数.23是质数.29是质数.31是质数.37是质数.41是质数.43是质数.47是质数.53是质数.59是质数.61是质数.67是质数.71是质数.73是质数.79是质数.83是质数.89是质数.97是质数.2-32 比较Break语句与Continue语句的不同用法。解: Break使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句,不能用在别处;continue 语句结束本次循环,接着开始判断决定是否继续执行下一次循环; 2-33 定义一个表示时间的结构体,可以精确表示年、月、日、小时、分、秒;提
32、示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。 解: 源程序见实验指导部分实验二2-34 在程序中定义一个整型变量,赋以1100的值,要求用户猜这个数,比较两个数的大小,把结果提示给用户,直到猜对为止。分别使用while、dowhile语句实现循环。解: /使用while语句#include void main() int n = 18;int m = 0;while(m != n) cout m;if (n m)cout 你猜的值太小了! endl;else if (n m)cout 你猜的值太大了! endl;elsecout 你猜对了! endl;/使用dowhile语句#
33、include void main() int n = 18;int m = 0;docout m;if (n m)cout 你猜的值太小了! endl;else if (n m)cout 你猜的值太大了! endl;elsecout 你猜对了! endl;while(n != m); 程序运行输出:请猜这个数的值为多少?(0100):50你猜的值太大了!请猜这个数的值为多少?(0100):25你猜的值太大了! 请猜这个数的值为多少?(0100):10你猜的值太小了!请猜这个数的值为多少?(0100):15你猜的值太小了!请猜这个数的值为多少?(0100):18你猜对了! 2-35 定义枚举类
34、型weekday,包括Sunday到Saturday七个元素在程序中定义weekday类型的变量,对其赋值,定义整型变量,看看能否对其赋weekday类型的值。解: #include enum weekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday; void main()int i;weekday d = Thursday;cout d = d endl;i = d;cout i = i endl;d = (weekday)6;cout d = d endl;d = weekday( 4 );cout d = d end
35、l; 程序运行输出:d = 4i = 4d = 6d = 4 第三章 函数3-1 C+中的函数是什么?什么叫主调函数,什么叫被调函数,二者之间有什么关系?如何调用一个函数? 解: 一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C和C+语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。调用函数之前先要声明函数原型。按如下形式声明:类型标识符 被调函数名 (含类型说明的形
36、参表);声明了函数原型之后,便可以按如下形式调用子函数:函数名(实参列表)3-2 观察下面程序的运行输出,与你设想的有何不同?仔细体会引用的用法。源程序:#include int main()int intOne;int &rSomeRef = intOne;intOne = 5;cout intOne:tt intOne endl;cout rSomeRef:t rSomeRef endl;int intTwo = 8;rSomeRef = intTwo; / not what you think!cout nintOne:tt intOne endl;cout intTwo:tt intT
37、wo endl;cout rSomeRef:t rSomeRef endl;return 0;程序运行输出:intOne: 5rSomeRef: 5intOne: 8intTwo: 8rSomeRef: 83-3 比较值调用和引用调用的相同点与不同点。解: 值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。3-4 什么叫内联函数?它有哪些特点?解: 定义时使用关键字 inline的函数叫做内联函数;编译器在编译时在调用处用函数体进行