C++语言程序设计课后答案12
更新时间:2024-03-05 02:43:01 阅读量: 综合文库 文档下载
第 一 章 概述
1-1 简述计算机程序设计语言的发展历程。 解:迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程语言有哪些特点?
解:面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。
1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?
解:结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。 由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。
1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点?
解:从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。
面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体--对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。
1-5 什么叫做封装? 解:封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。
1-6 面向对象的软件工程包括哪些主要内容?
解:面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。
1-7 简述计算机内部的信息可分为几类?
解:计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。 1-8 什么叫二进制?使用二进制有何优点和缺点?
解:二进制是基数为2,每位的权是以2 为底的幂的进制,遵循逢二进一原则,基本符号为0和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。
1-9 请将以下十进制数值转换为二进制和十六进制补码: (1)2 (2)9 (3)93 (4)-32 (5)65535 (6)-1
解:(1)(2)10 = (10)2 = (2)16 (2)(9)10 = (1001)2 = (9)16 (3)(93)10 = (1011101)2 = (5D)16 (4)(-32)10 = (11100000)2 = (E0)16 (5)(65535)10 =(11111111 11111111)2 =(FFFF)16· (6)(-1)10 =(11111111 11111111)2 = (FFFF)16 1-10 请将以下数值转换为十进制:
(1)(1010)2 (2)(10001111)2 (3)(01011111 11000011)2 (4)(7F)16 (5)(2D3E)16 (6)(F10E)16 解:
(1)(1010)2 = (10)10 (2)(10001111)2 = (143)10 (3)(01011111 11000011)2 = (24515)10 (4)(7F)16 = (127)10
(5)(2D3E)16 = (11582)10 (6)(F10E)16 = (61710)10 1-11 简要比较原码、反码、补码等几种编码方法。
解:原码:将符号位数字化为 0 或 1,数的绝对值与符号一起编码,即所谓\符号──绝对值表示\的编码。
正数的反码和补码与原码表示相同。 负数的反码与原码有如下关系:
符号位相同(仍用1表示),其余各位取反(0变1,1变0)。 补码由该数反码的最末位加1求得。
第 二 章 C++简单程序设计
2-1 C++语言有那些主要特点和优点?
解:C++语言的主要特点表现在两个方面,一是全面兼容C,二是支持面向对象的方法。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
{cout<<\
cout<<\
解: #include
//嵌入到该程序中该指令所在的地方
void main() //主函数名,void 表示函数没有返回值 { //函数体标志
cout<<\输出字符串Hello!到标准输出设备(显示器)上。 cout<<\输出字符串Welcome to c++!} 在屏幕输出如下: Hello!
Welcome to c++!
2-4 使用关键字const而不是#define语句的好处有哪些?
解: const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。
2-5 请写出C++语句声明一个常量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 = 102
2-7 注释有什么作用?C++中有哪几种注释的方法?他们之间有什么区别?
解:注释在程序中的作用是对程序进行注解和说明,以便于阅读。编译系统在对源程序进行编译时不理会注释部分,因此注释对于程序的功能实现不起任何作用。而且由于编译时忽略注释部分,所以注释内容不会增加最终产生的可执行程序的大小。适当地使用注释,能够提高程序的可读性。在C++中,有两种给出注释的方法:一种是延用C语言方法,使用\和\括起注释文字。另一种方法是使用\,从\开始,直到它所在行的行尾,所有字符都被作为注释处理。
2-8 什么叫做表达式?x = 5 + 7是一个表达式吗?它的值是多少?
解:任何一个用于计算值的公式都可称为表达式。x = 5 + 7是一个表达式,它的值为12。 2-9 下列表达式的值是多少? 1. 201 / 4 2. 201 % 4
3. 201 / 4.0
解: 1. 50 2. 1 3. 50.25 2-10 执行完下列语句后,a、b、c三个变量的值为多少? a = 30; b = a++; 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的值为100
2-13 写一条for语句,计数条件为n从100到200,步长为2;然后用while和do?while语句完成同样的循环。 解: for循环:
for (int n = 100; n <= 200; n += 2); while循环: int x = 100;
while (n <= 200) n += 2;
do?while循环: int n = 100;
do {
n += 2;
} while(n <= 200);
2-14 if ( x = 3 ) 和 if (x = = 3) 这两条语句的差别是什么?
解: 语句if(x = 3)把3赋给x,赋值表达式的值为true,作为if语句的条件;语句if(x == 3)首先判断x的值是否为3,若相等条件表达式的值为ture,否则为false。
2-15 什么叫做作用域?什么叫做局部变量?什么叫做全局变量,如何使用全局变量? 解:作用域是一个标识符在程序正文中有效的区域。局部变量,一般来讲就是具有块作用域的变量;全局变量,就是具有文件作用域的变量。
2-16 已知x、y两个变量,写一条简单的if语句,把较小的的值赋给原本值较大的变量。 解: if (x > y) x = y; else // y > x || y == x y = x;
2-17 修改下面这个程序中的错误,改正后它的运行结果是什么? #include
i = 10; /* 给i赋值 解: 改正:
#include
int i; int j; i = 10; // 给i赋值 j = 20; /* 给j赋值 */
cout << \输出结果 */ return 0;}
程序运行输出:i + j = 30
2-18 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。 解: 源程序: #include
int i;
cout << \请输入一个数字:\cin >> i;
cout << \您输入一个数字是\return 0;}
程序运行输出:请输入一个数字:5 您输入一个数字是5
2-19 C++有哪几种数据类型?简述其值域。编程显示你使用的计算机中的各种数据类型的字节数。
解: 源程序:
return 0;}
#include
int main()
{cout << \cout << \cout << \cout << \cout << \cout << \return 0;} 程序运行输出:
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码为32~127的字符。 解: #include
{for (int i = 32; i<128; i++) cout << (char) i;
return 0;}
程序运行输出:
!\,./0123456789:;<>?@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[\\]^'abcdefghijklmnopqrstuvwxyz<|>~s
2-21 运行下面的程序,观察其输出,与你的设想是否相同? #include
{unsigned int x;
unsigned int y = 100;
unsigned int z = 50;
x= y - z; cout << \
x = z - y; cout << \return 0;}
解: 程序运行输出: Difference is: 50
Now difference is: 4294967246
注意,第二行的输出并非 -50,注意x、y、z的数据类型。 2-22 运行下面的程序,观察其输出,体会i++与++i的差别。 #include
{int myAge = 39; // initialize two integers int yourAge = 39;
cout << \
m_fontSignal.lfEscapement = 0; m_fontSignal.lfOrientation = 0; m_fontSignal.lfWeight = 400; m_fontSignal.lfItalic = FALSE;
m_fontSignal.lfUnderline = FALSE; m_fontSignal.lfStrikeOut = 0;
m_fontSignal.lfCharSet = OEM_CHARSET; m_fontSignal.lfOutPrecision OUT_DEFAULT_PRECIS; m_fontSignal.lfClipPrecision CLIP_DEFAULT_PRECIS;
m_fontSignal.lfQuality = DEFAULT_QUALITY; m_fontSignal.lfPitchAndFamily DEFAULT_PITCH;
strcpy(m_fontSignal.lfFaceName, \ }
// 鼠标右键消息响应函数
void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_nCount < MAX_NAME) {
CNameDlg dlg;
dlg.m_pointTopLeft = point; if(dlg.DoModal() == IDOK)
{
LONG escapement = dlg.m_lEscapement; CString name = dlg.m_strNameEdit; m_signalList[m_nCount].SetValue(name, point, m_colorSignal, escapement, &m_fontSignal); m_nCount++; Invalidate(); } } }
= = =
// 鼠标右键消息响应函数
void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) {
CFontDialog dlg(&m_fontSignal); if(dlg.DoModal() == IDOK) {
dlg.GetCurrentFont(&m_fontSignal); m_colorSignal = dlg.GetColor(); } }
// 绘制框架窗口客户区函数 void CMyWnd::OnPaint() {
CPaintDC dc(this);
for(int i=0; i // 应用程序类 class CMyApp: public CWinApp { public: BOOL InitInstance(); }; // 应用程序类的成员函数 BOOL CMyApp::InitInstance() { CMyWnd *pFrame = new CMyWnd; pFrame->Create(0,_T(\签字留念簿程序\pFrame->ShowWindow(SW_SHOWMAXIMIZED); this->m_pMainWnd = pFrame; return TRUE; } // 全局应用程序对象 CMyApp ThisApp; 7-16 为例9-3的吹泡泡程序添加颜色选择对话框,使其可以绘出五颜六色的泡泡。 程 序:在例9-3的程序基础上作如下修改: 1.在程序首部添加文件包含命令: #include 2.在框架窗口类声明中添加一个COLORREF类型的数组,存放各泡泡的颜色: COLORREF m_colorBubble [MAX_BUBBLE]; 3.修改鼠标左键消息映射函数,添加使用颜色选择公用对话框的代码: void CMyWnd::OnLButtonDown ( UINT nFlags, CPoint point ) { if(m_nBubbleCount < MAX_BUBBLE) { m_colorBubble[m_nBubbleCount] = RGB(200, 200, 200); CColorDialog dlg(m_colorBubble[m_nBubbleCount]); if(dlg.DoModal() == IDOK) m_colorBubble[m_nBubbleCount] = dlg.GetColor(); int r = rand()P+10; CRect rect(point.x-r, point.y-r, point.x+r, point.y+r); m_rectBubble[m_nBubbleCount] = rect; m_nBubbleCount++; InvalidateRect(rect, FALSE); } } 4.修改OnPaint()成员函数,添加根据泡泡颜色使用画刷的代码: void CMyWnd::OnPaint(){ CPaintDC dc(this); CBrush brushNew, *pbrushOld; for(int i=0; i brushNew.CreateSolidBrush(m_colorBubble[i]); pbrushOld = dc.SelectObject(&brushNew); dc.Ellipse(m_rectBubble[i]); dc.SelectObject(pbrushOld); brushNew.DeleteObject();}} 7-17 序列化。如果例12-1的吹泡泡程序使用一般的数组存放泡泡数据(参看例9-1的程序): CRect m_rectBubble[MAX_BUBBLE]; int m_nBubbleCount; 为其文档类重新设计Serialize()函数。 说 明:按例12-1的方法建立项目和输入源代码,但将文档类中的泡泡数据改为以上两行的形式。修改文档类的Serialize()函数,代码如下。 程 序:// 序列化函数 void CMyDoc::Serialze(CArchive& ar){ if(ar.IsStoring()){ ar << m_nBubbleCount; for(int i=0; i ar >> m_nBubbleCount; for(int i=0; i 7-18 修改例12-1的程序并观察其打印结果。 程 序: 在例12-1程序的视图类CMyView类的成员函数OnDraw()中,添加代码沿窗口客户区轮 廓画一矩形: void CMyView::OnDraw(CDC* pDC){ CRect rect; GetClientRect(&rect); pDC->Rectangle(rect); CMyDoc* pDoc = GetDocument(); // 取文档指针 ASSERT_VALID(pDoc); pDC->SelectStockObject(LTGRAY_BRUSH); // 在视图上显示文档数据 for(int i=0; i 7-19 改进吹泡泡程序,使之打印输出与屏幕显示的比例相近。 程 序: 在例12-1基础上修改。首先在CMyView类中重载虚函数OnPrepareDC()。在CMyView类的声明中增加一行: virtual void OnPrepareDC(CDC *pDC, CPrintInfo *pInfo=NULL); 然后添加该函数的定义,设置映射模式为MM_LOMETRIC: // 设置映射模式 void CMyView::OnPrepareDC(CDC *pDC, CPrintInfo *pInfo){ pDC->SetMapMode(MM_LOMETRIC); CView::OnPrepareDC(pDC, pInfo);} 然后修改消息映射函数OnLButtonDown(),将物理坐标转换为逻辑坐标: // 响应点击鼠标左键消息 void CMyView::OnLButtonDown(UINT nFlags, CPoint point){ CMyDoc* pDoc = GetDocument(); // 取文档指针 ASSERT_VALID(pDoc); CClientDC dc(this); // 设置设备环境 OnPrepareDC(&dc); int r = rand()P+5; // 生成泡泡 CRect rect(point.x-r, point.y-r, point.x+r, point.y+r); InvalidateRect(rect, FALSE); // 更新视图 dc.DPtoLP(rect); // 转换物理坐标为逻辑坐标 pDoc->AddBubble(rect); // 修改文档数据 pDoc->SetModifiedFlag(); // 设置修改标志} 7-20 声明一个Person类,并使之支持序列化。 程 序: class CPerson: public CObject{ DECLARE_SERIAL( CPerson) LONG m_IDnumber; // 身份证号码 CString m_strName; // 姓名 CString m_strNation; // 民族 int m_nSex; // 性别 int m_nAge; // 年龄 BOOL m_bMarried; // 婚否 public: CEmployee(){}; CPerson& operator = (CPerson& person); void Serialize(CArchive& ar); }; IMPLEMENT_SERIAL( CPerson, CObject, 1 ) CPerson& CPerson::operator = (CPerson& person) { m_IDnumber = person.m_IDnumber; m_strName = person.m_strName; m_strNation = person.m_strNation; m_nSex = person.m_nSex; m_nAge = person.m_nAge; m_bMarried = person.m_bMarried; return *this; } void CPerson::Serialize(CArchive& ar) { CObject::Serialize( ar); // 首先调用基类的Serialize()方法 if(ar.IsStoring()) { ar << m_IDnumber; ar << m_strName; ar << m_strNation; ar << m_nSex; ar << m_nAge; ar << (int)m_bMarried; } else { ar >> m_IDnumber; ar >> m_strName; ar >> m_strNation; ar >> m_nSex; ar >> m_nAge; ar >> (int)m_bMarried; } } 第 八 章 多态性 8-1 什么叫做多态性 ?在C++中是如何实现多态的? 解: 多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。 8-2 什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现? 解: 带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。但抽象类的派生类并非一定要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象类。 8-3 声明一个参数为整型,无返回值,名为fn1的虚函数。 解: virtual void fn1( int ); 8-4 在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途? 解: 在C++中,不能声明虚构造函数,多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的;可以声明虚析构函数,析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数针对不同的对象进行清理工作。 8-5 实现重载函数Double(x),返回值为输入参数的两倍;参数分别为整型、长整型、浮点型、双精度型,返回值类型与参数一样。 解: 源程序: #include double Double(double); int main() { int myInt = 6500; long myLong = 65000; float myFloat = 6.5F; double myDouble = 6.5e20; int doubledInt; long doubledLong; float doubledFloat; double doubledDouble; cout << \cout << \cout << \cout << \doubledInt = Double(myInt); doubledLong = Double(myLong); doubledFloat = Double(myFloat); doubledDouble = Double(myDouble); cout << \cout << \\<< doubledLong << \ cout << \\<< doubledFloat << \ cout << \<< \return 0; } int Double(int original) { cout << \ long Double(long original) { cout << \return 2 * original; } float Double(float original) { cout << \return 2 * original; } double Double(double original) { cout << \return 2 * original; } 程序运行输出: myInt: 6500 myLong: 65000 myFloat: 6.5 myDouble: 6.5e+20 In Double(int) In Double(long) In Double(float) In Double(double) DoubledInt: 13000 DoubledLong: 130000 DoubledFloat: 13 return 2 * original; DoubledDouble: 1.3e+21 } 8-6 定义一个Rectangle类,有长itsWidth、宽itsLength等属性,重载其构造函数Rectangle()和Rectangle(int width, int length)。 解: 源程序: #include public: Rectangle(); Rectangle(int width, int length); ~Rectangle() {} int GetWidth() const { return itsWidth; } int GetLength() const { return itsLength; } private: int itsWidth; int itsLength; }; Rectangle::Rectangle() { itsWidth = 5; itsLength = 10; } Rectangle::Rectangle (int width, int length) { itsWidth = width; itsLength = length; } int main()
正在阅读:
C++语言程序设计课后答案1203-05
对新医院会计制度改革的探讨01-03
最新业务部门管理制度02-01
小升初语文专题讲义-修改病句04-21
圆周运动410-10
20XX年高中数学教师个人工作总结12-29
谢谢您陌生人作文800字06-20
《大学生创业基础》期末考试10-24
- 必修一物理寒假作业
- 2019-201X年5月大学生入党积极分子思想汇报-word范文模板(3页)
- 药物分析习题五
- 重拾应用意识 体会数学价值(沈建军)
- 2017全国高校辅导员结构化面试题集及参考答案
- 广东徐闻县实验中学2014届高三第二次月测地理试题
- 今天你共鸣了么?
- 2018-2019正能量读后感1000字-推荐word版(6页)
- 2018年中国截切型盖板针布行业专题研究分析报告目录
- 中国移动业务处理流程大全
- 公文写作常用词汇和句子集锦2016
- ARM课程设计说明书
- 教师资格证教育学论文
- 中考试卷分析
- 环境监测试卷(五)
- 党风廉政建设广播稿1
- 快速制作香香宫煮麻辣烫教程
- 《国际金融学》习题
- 文明施工保障措施方案
- 春兰维修资料故障代码
- C++
- 课后
- 程序设计
- 答案
- 语言
- 东海学校2014年元旦文艺汇演节目串词
- 学习解放思想大讨论心得体会
- 《电机设计》(陈世坤)课后习题答案(期末复习资料)(DOC)
- 四年级下册《观察物体》教案新人教版
- 也谈课文插图解读
- 中国收藏品鉴定行业市场前景分析预测报告(目录) - 图文
- 武汉理工大学汇编语言试题(三套,内含答案,2012年期末考试绝大
- 部编版二年级下册道德与法治第13课《我能行》说课稿
- 长整数四则运算源代码数据结构
- 2019年购销合同(经典范本)
- 屏蔽泵的结构原理及分类
- 三机一化教学比武教学设计
- 获奖新闻稿标题怎么写-优秀word范文(3页)
- 中国传统节日选择题及答案
- 访谈稿(终极版)
- LongmanwelcometoEnglish各册优秀教学内容安排 - 图文
- 模具企业的生产计划管理
- 绒线绕绕
- 结构力学课程设计指导书 - 图文
- 未来战争的发展趋势