C++程序设计案例教程课后习题答案1-13章 北邮(高职).docx
C+程序设计案例教程课后习题答案1-13章 北邮第1章C+语言基础一、选择题1. D 2, C 3. B 4. B 5. B二、填空题1 .特殊符号 2.注释3.大括号 4分号 5.cpp第2章数据类型、运算符和表达式一、选择题D 2. C 3. B 4. A 5. A 6. C 7. B 8. A 9. D10. C 11. C二、填空题1 .整型 2.8103. double 4. 2 1 3000000000010010017. 18. e三、编程题1 .从键盘输入某个字母的ASCII码,如:97 (字母a), 98 (字 母b), 65 (字母A)等,在屏幕上输出给字母。#i ncIude <iostream. h>i nt ma i n (i nt argc, char* argv)二、填空题.类型、数量、下标运算符、下标、索引、常变量1 .必须要转化为一维方式、按行方式、右、越快、a数组的首地 址、(i*n+j)*u2 .地址、NULL、已经分配了内存的变量的地址、变量的地址、直 接访问、间接访问三、写出下列程序运行结果1. 101, 1012. sum=3003.C+ ProgrammingData structureEng Ii shInternetMathemat i csU!Mathemat i csU!U!、简单题.解释运算符“铲和“&”的作用,运算符”和的作用。答:在应用指针变量时,“守是间接引用(dereference)运算 符,作用于一个指针类型的变量,访问该指针所指向的内存数据。因 结果是内存中可寻址的数据。是取地址运算符,作用于内存中一 个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是 获得该数据的地址。运算符“.”和“->”是成员访问运算符(Member Access Oprator) o 在对象或结构外部去访问公有的数据成员或函数成员时,是在对象名 后加(点操作符),再加成员函数名或函数名就可以了。但是这 些成员必须是公有的成员,只有公有成员才能在对象的外面对它进行 访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在 指针变量名后加(箭头操作符),再加公有成员名就可以了。1 .设a为数组名,那么a+是否合法?为什么?答:非法。因为a是指针常量。2 .指针作为函数的参数时,它传递的是什么?实参要用什么?而 使用引用时实参要用什么?何时只能用指针而不能用引用?答:指针作为函数的参数时,它传递的是地址,是指针所指向的 变量或对象的内存首地址,在物理上讲我们传的是指针的值,与传其 它变量是没有差异的,函数获得的是另一个变量的地址,在逻辑上讲 我们是把另一个变量的地址传过去了,可以看作传地址。实参要用变 量或对象的地址。而使用引用时实参要用变量或对象本身。实参为数 组时,只能用指针而不能用引用,因为数组的引用不存在。五、编程题.打印杨辉三角形(10行)。#i ncIude < i ostream. h>i nt ma i n(i nt argc, char* argv)(const i nt n=10;i nt a n n;int i, j;for (i =0;i <n;i +)(for (j=0;j<=i;j+)(if (j-0| | j-i)(aij=1;)e I seai j=ai-1 j-1+ai-1 j;cout«a i j «"t")cout«"nn")return 0;).写一个函数,将一个3阶方阵转置。#i ncIude < i ostream. h>int array3 3;int i, j,t;for (i=0;i<3;i+)for (j=1 + i;j<3;j+)It二array ij;arrayi j=arrayj i;arrayj i=t;)1i nt ma i n (i nt argc, char* argv)(int i, j ;cout<<"请输入矩阵中各元素的值:"«end I ;for (i=0;i<3;i+)for(j=0;j<3;j+)c i n»ar ray i j;cout<<"矩阵转置前:"<<endl;for (i=0;i<3;i+)(for (j=0;j<3;j+)cout«arrayi j«"cout«end I ; convert(array);cout«”矩阵转置后:"Gendl;for (i=0;i<3;i+)(for(j=0;j<3;j+)cout«arrayi j«"cout«end I ;1return 0;)3.使用指针编写函数strcat (),实现两个字符串的首尾连接(将 字符串str2接到st门的后面,st门最后面的''0'被取消)。# i ncIude < i ostream. h>char* strcat (char* s,const char* t)(char* st=s;while(*s)s+;while (*s+=*t+);return st;1i nt ma i n(i nt argc, char* argv)char s1 15 = HHel Io”,s215 = uWor Id"cout«strcat (s1, s2) «end I ;return 0;)第6章 非基本数据类型一、选择题1. C 2. C 3. D 4. A 5. D二、写出下面程序的运行结果zhangsan 37 2493三、编程题1 .定义一个表示日期的结构体变量(包括年月日),写一个函数, 返回值为某天是当年的第几天。#include <iostream. h>struct date定义结构体类型(i nt year;i nt month;i nt day;1;i nti, count, daysofmonth 13 = 0, 31,28, 31,30, 31,30, 31,31,30, 31 ,30,31:i nt ma i n(i nt argc, char* argv)(struct date d; 定义结构体变量i nt days=0;cout<<"请输入日期(年 月 日):"endl;c i n»d. year»d. month»d. day;count二d. day;把dt. d计入总天数for (i=0;i<d. month;i+)count+=daysofmonthi;把输入月份前面的每月的天数累计入总数f (d. month>2&&(d.year%4=0&&d. year%100!=0|d. year%400=0)count+=1;如果是闰年,则要把3月份和3月份以后的总天数加1 cout<<"这一日是这一年的第"<<count<<"日"<<end I ;return 0;11 .定义一种表示学生的姓名,课程名,期中和期末成绩的结构, 然后输入一个学生的期中和期末成绩,计算平均成绩并输出。#incIude <iostream. h>struct studentchar *name;char *coursename;float qzcj;fI oat qmcj;stu="LiPing",“语文”,80,85;i nt mai n (i nt argc, char* argv)(float avgScore;avgScore= (stu. qzcj+stu. qmcj)/2;cout«stu. coursenameV”平均成绩为:"<<avgScoreend I ;return 0;)第7章类和对象一、选择题A 2. B 3. C 4. A 5. A 6. B 7. C 8. D 9. A10. B 11. D 12. B二、程序题4.4.数数数数 2函函函函 01构构构构 /2析析析析 10用用用用 1/tocontinue1.23.45,6Press any key to continuehe student is S he teacher is T ress any key to cont inue三、简答题1 .构造函数和析构函数的作用是什么?什么时候需要自己定义构 造函数和析构函数?答:构造函数是对象建立时,由系统调用的特殊的成员函数。它 的作用是实现数据成员的初始化。析构函数也是一个特殊的成员函数, 它的作用正好与构造函数相反,旨在释放对象所占空间的资源。类中可以定义多个构造函数,实现构造函数重载,以适应不同对象 对数据成员初始化的不同要求。构造函数可以不带参数,作为默认构 造函数,也可以根据数据成员初始化情况,建立带参构造函数。类定义中析构函数只有一个,且不带参数。当对象所在的函数或程 序结束时,系统自动调用析构函数,释放对象所占空间。2 .静态成员函数的主要作用是什么?答:在类中定义函数时,如果函数定义行前有关键字static,那 么这个函数就是静态成员函数。静态成员函数主要用于处理静态数据 成员。3 .定义指向对象成员函数的指针变量的方法和定义指向普通函数 的指针变量方法的不同处?答:与普通指向函数的指针变量不同,定义指向对象成员函数的 指针变量时,指针变量名前需加上类名;初始化指针变量名时,成员 函数名前面需加上类名,即函数类型(类名:*指针变量名)(参数表);/定义指针变指针变量名二&类名:成员函数名;初始化指针变量(对象名.*指针变量名)();调用指针变量所指的对象成员函数4 .分析友元函数的利弊。答:如果在类之外定义的一个函数,这个函数可以是不属于任何 类的非成员函数,也可以是其他类的成员函数,在类体中用friend 对其进行声明,此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员,虽然方便,但它的存在 char c;cout<<"请输入 ASCI I 码值:"。end I ;cin»i ; 输入 ASCI I 码c二 i ;cout«c«end I ;/输出对应字符return 0;12.编写一个程序,将“China”译成密码。编码的规律:用原来 的字母后面第4个字母代替原来的字母。#incIude <iostream. h>i nt ma i n(i nt argc, char* argv)(char c1 ='C',c2二'h',c3二'i',c4二'n',c5二'a'c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;cout«c1 «c2«c3<<c4«c5«end I ;return 0;也对数据成员的安全性产生潜在的威胁。1 .定义一个类Point。要求如下所述:(1)构造函数初始化类Point类的对象;(2)定义函数Distance,计算平面上两点之间的距离。#i ncIude < i ostream>#i ncIude <math. h>us i ng namespace std;cI ass Point(pr i vate:doubIe x1,y1,x2, y2;pub I ic:Po i nt () :x1 (0),y1 (0), x2 (0), y2 (0)Poi nt (i nta1, i ntb1, i nta2, i ntb2) :x1 (a1),y1 (b1),x2 (a2), y2 (b2)1)doub Ie Di stance ()t1=pow(x2-x1,2);t2=pow(y2-y1,2);return sqrt (t1+t2););void ma in ()(Point p (1,2, 4, 2);cout«HThe d i stance i s H«p. D i stance () «end I ;)2.建立一个对象数组,内放5个人的数据(ID号、姓名),设立 一个函数find,用指向对象的指针做函数参数,在find函数中按给 定的ID号输出其姓名。#i ncIude < i ostream>#i ncIude <str i ng.h>us i ng namespace std;c I ass Person(pub I ic:1 nt i d;char name10;pub lie:Person (i nt i, char n 10):i d (i)(strepy (name, n);)boo I f i nd (i nt i d_f i nd)(if (id_find二二id)(,«name«end I ;cout«" i d:"«id«", name: return true;)return false;);i nt ma i n ()(i nt i d_f i nd;Personp 5 = Person (1, "zhao"), Person (2, "q i an11), Person (3, "sun"),Person (4, "I i"),Person (5, "zhou");Person *p_f ind;cout«"p I ease i nput the i d: "«end I ;c i n» i d_f i nd;for (i nt i=0;i<5;i+)(p_f i nd=&p i;i f ( p_f i nd->f i nd (i d_f i nd) break;)return 0;)3.有一信息管理系统,要求检查每个登录系统的用户(User)的 用户名和口令,系统检查合格以后方可登录系统。用C+程序予以描 述。#i ncIude <i ostream>#i ncIude <str i ng. h>us i ng namespace std;cI ass Personpr i vate:char userName10;char password6;pub I ic:Person (char u 10,char p6)(strcpy (userName, u);strcpy (password, p);)boo I f i nd (char name10, char pass 6) (i f (strcmp (userName, name)!=0)(cout«Hnot ex i st"«end I ;return false;) eIse i f (strcmp (password, pass)!=0) cout«n i nva I i d password H«end I ; return false;) e I se (cout«" va lid! "«end I ;return true;)1);i nt ma i n ()(Persons 5 = Person ("zhao","zhao"), Person ("q i an", "q i an"), Person ("sun", "sun"), Person ("Ii", "Ii"), Person("zhou", "zhou") );char name10, pass6;cout«np I ease i nput username: n«end I ;c i n»name;cout«np I ease i nput password: n«end I ;c i n»pass;for (i nt i =0; i <5;i +)(i f ( s i . find (name, pass) break;)4,定义一个类Student记录学生计算机课程的成绩。要求使用静 态成员变量或静态成员函数计算全班计算机课程的总成绩和平均成 绩。#i ncIude < i ostream>#i ncIude <str i ng.h>us i ng namespace std;cI ass Studentpub lie:1 nt i d;char name10;int score;stat i c i nt totaI Score;Student (int i, char n10, int s) : id (i), score (s)lstrepy (name, n);1stat ic void d i sp I ay ()(cout«Htota I Score : H«tota I Score«end I ;cout«HaveScore : n«tota I Score/5«end I ;)stat ic void compute (Student s)totaIScore+=s. score;);i nt Student:totaI Score =0;i nt ma i n 0(Students 5 = Student (1, "zhao", 90), Student (2, "q i an", 82), Student (3, sun", 75), Student (4, " I i", 89), Student (5, "zhou", 62);for (i nt i=0; i<5;i +)(si. compute (s i);)Student: : d i sp I ay ();return 0;1 第8章类的继承与派生一'选择题D 2. A 3. A 4. B 5. B 6. B二、程序题(略)三、简答题1 .派生类对基类的继承方式有哪些?在派生类中,成员有几种 不同的访问属性?答:派生类对基类的继承方式有三种:public、protected x pr i vate0 成员也有三种访问属性:public、protected x private。2 .多级派生的访问属性如何确定?答:多级派生的访问属性确定的原则与单层派生一致。3 .在执行派生类时,如何调用基类的构造函数?答:在派生类构造函数的初始化列表中描述。4 .对数据成员初始化时,如何对子对象初始化?答:在派生类构造函数的初始化列表中,写上子对象名(实际参 数)。5 .程序中有多重继承时,系统如何调用析构函数?答:按照调用构造函数相反的顺序调用析构函数。6 .举例说明多重继承引起的二义性,如何解决此问题?多重继承指一个类从多个基类中派生而来。如果一个派生类有多 个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生 类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这 些数据成员时,可能产生错误,即二义性的错误。C+提供了虚基类 (virtual base class)的方法来解决这个问题,使得派生类在获得 间接基类的数据成员时只保留一份拷贝。7 .谈谈虚基类的作用。在进行多重继承时,为保证最终派生类中只继承一次,通常声明 该基类为所有直接派生类的虚基类。如果虚基类中定义了带参数的构 造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必 须通过这些派生类的构造函数对虚基类构造函数调用。但是,其实只 有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据 成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成 派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函第3章程序控制语句一、选择题1. C 2. C 3. D 4. A 5. B 6. A二、填空题1. do-whi Ie2.顺序结构、选择结构和循环结构3.64. break 5. 4 7 106. 16三、编程题1 .求100200之间不能被3整除也不能被7整除的数。#i ncIude < i ostream. h>i nt ma i n (i nt argc, char* argv)(nt i ;for (i=100; i<=200;i +)(if (i%3=01|i%7=0)cont i nue;e I secout« i «end I ;)return 0;).从键盘输入一个整数,判断该数是否为回文数。所谓的回文数。这就保证了虚基类的数据成员不会被多次初始化。U!、编程题分别声明Teacher类和Cadre类,采用多重继承方式由这两个类 派生出新类TC类。要求:(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。(2)在Teacher类中还包含数据成员tit Ie,在Cadre类中还 包含数据成员post。在TC类中还包含wages。(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员 用相同的名字,在引用这些数据成员时,指定作用域。(4)在派生类TC的成员函数show中调用Teacher类中的 display函数,输出姓名、年龄、性别、职称、地址、电话,然后再 输出职务与工资。#i ncIude< i ostream>#i ncIude<str i ng>us i ng namespace std;cI ass Teacher pr i vate:char name10;nt age;char title 20;char sex 10;char address 100;char teI 20;pub I ic:Teacher (char nam, i nt ag, char t i t , char se , char add , char t )age=ag;strcpy (sex, se); strcpy (name, nam);strcpy (t i 11 e, t i t);strcpy (address,add);strcpy (teI, t);)void d i sp I ay () (cout«name«end I «age«end I «sex«end I «address«end I «t e I «end I ;) );cI ass Cadre(pr i vate:char name10;i nt age;char post20;char sex 10;char address 100;char teI 20;pub I ic:Cadre (char nam, i nt ag, char po, char se , char add , char t )(age=ag;strcpy (sex, se);strcpy (name, nam);strcpy (post, po);strcpy (address,add);strcpy (teI, t);)char * pos 0return post;) );cI ass TC:pub I i c Teacher, pub I i c Cadre (pr i vate:i nt wage;pub I ic:TC (char nam, i nt ag, char po, char char se , char add , char t口,i nt w):wage (w), Teacher (nam, ag, tit, se, add, t), Cadre (nam, ag, po, se ,add, t) vo i d showk ()(Teacher:display0 ;cout«Cadre: : pos () «end I «wage«end I ;);ma i n ()(TCA ("wang", 25, "leader", "teacher", "female", "Nanjing", "13813900 000", 5000);A. showk ();return 0;第9章多态性和虚函数的使用一、选择题1. C. 2. C 3. A 4. C 5.6. D二、程序题(略)三、简答题1 . C+多态性主要体现在哪两个方面?答:在C+中,多态性是指系统调用同名的函数,实现不同的功能。多态性包含静态多态性和动态多态性。静态多态性体现在编译时函数 重载或者运算符重载上;展现了同一类中多个同名函数的处理机制。 而动态多态性是指程序运行过程中通过虚函数动态地确定针对的对 象,展现继承层次结构中同名函数的处理机制。2 .比较函数重载和虚函数在概念上和使用方式有什么区别。函数重载是指函数名称相同,但是参数的个数或者参数的数据类 型不同。因此,系统调用重载函数时,会依据参数确定调用哪一个。而在继承的机制中,基类的成员函数可能会与派生类新增的成员 函数同名,包括参数个数和参数类型,这种现象不属于函数重载。当 基类的一个成员函数被声明为虚函数后,其派生类中的同名函数都自 动成为虚函数。派生类可以对虚函数重新定义。虚函数实现动态多态的问题。3 .比较抽象类、虚函数、纯虚函数的概念和使用上的区别。虚函数通常在基类中定义,定义可以是空,派生类中可以对虚函 数重写,也可以不写。虚函数起到了接口的默认行为作用。纯虚函数在基类中是没有定义的,必须在直接或者间接派生类中 加以实现,它起到了接口的作用。包含了纯虚函数的类,被称为抽象类。抽象类不能建立对象。4 .谈谈虚基类和虚函数,区分两者不同的概念和各自的作用。在继承机制中,一个派生类继承多个直接基类,而这些基类又 有一个公共的基类,这个公共的基类成员在继承中可能产生多个拷 贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这 样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝, 从而消除歧义。用virtual限定符把基类继承说明为虚拟的。虚函数指基类中成员函数声明为virtual ,使它在一个或多个 派生类中被重新定义,虚函数的作用是实现多态性。虚函数必须是 基类的非静态成员函数,其访问权限可以protected或publ ico1.编写一个程序,声明抽象基类Shape,由它派生出3个派生类:Ci r Ice, Rectangle, Tr iangle,用个函数 pr intArea 分别输出以 上三种的面积,3个图形的数据在定义对象时给定。#include<iostream>us i ng namespace std;cI ass Shape(pub I ic:v i rtua I vo i d pr i ntArea () =0;);cI ass Ci rcle:publ ic Shape(pr ivate:i nt r;pub I ic:Ci rc Ie (i nt rr ) : r (rr) vo i d pr i ntArea ()(cout«nthe area of circle: n«3. 14*r*r«end I ;);cI ass Rectang Ie:pub I i c Shapepr i vate:i nt Ien,width;pub I ic:Rectang I e (i nt I, i nt w) : I en (I), width (w) vo i d pr i ntArea ()(cout«"the area of rectangle: "«Ien*width«endI ;);cI ass Tr iangle:pub I ic Shape(pr ivate:i nt base, he i ght;pub I ic:Tr i angle(int b, i nt h) : base (b), hei ght (h) vo i d pr i ntArea ()cout«Hthecout«Hthecout«Hthecout«Htheareaoftr iangle:n«0. 5*base*he i ght«end I ;);1 nt ma i n 0(Circle c (2);c. pr i ntArea ();Rectang I e r (2, 3);r. pr i ntArea ();Tr iangle t (2, 3);t. pr i ntArea ();return 0;12 .改写以上程序,用虚函数分别计算几种图形面积,并求它们之 和。要求用基类指针数组,使它每一个元素指向一个派生类对象。#include<iostream>us i ng namespace std;cI ass Shape pub I ic:v i rtuaI i nt computeArea()=0;v i rtua I vo i d pr i ntArea () =0;); cI ass Ci rcle:publ ic Shape(pr i vate:i nt r;i nt c i rcI eArea;pub I i c:Ci rcle(int rr ) : r (rr) i nt computeArea 0(c i rcIeArea=3. 14*r*r;return c i rcI eArea;)void pr intArea ()(cout«Hthe area of circle: H«c i rc I eArea«end I ; ) );cI ass Rectangle:pub I ic Shape(pr i vate:i nt Ien, width;i nt rectang I eArea;pub I ic:Rectang I e (i nt I, i nt w) : I en (I), width (w) rectangleArea=len*wi dth;return rectang I eArea;)vo i d pr i ntArea ()(cout«Hthe area of rectangle: H«rectang I eArea«end I ;);cI ass Tr iangle:publ ic Shape (pr i vate:i nt bbase, he i ght;i nt tri angI eArea;pub I ic:Tr iangle(int b, i nt h) : bbase (b), he ight (h) i nt computeArea ()(tri angIeArea=(bbase*he i ght)/2;return tr i angI eArea;)vo i d pr i ntArea ()(cout«nthe area of tr iangle: H«tr i ang I eArea«end I ;);数就是从左到右读与从右向左读都是一样的数。例如7887、23432是 回文数。#i ncIude < i ostream. h>i nt ma i n (i nt argc, char* argv)(i nt i, x, r, y=0;cout。”请输入一个整数:”;c i n»x;i 二 x;wh i Ie(i!=0)(r=i%10;i二i/10;y=y*10+r;)if (y=x)cout«x<<"是回文数"<<end I ;if (y!二 x)cout«x<<"不是回文数"<<end I ;return 0;)3.编程求1001000之间所有的水仙花数。“水仙花数”是指一Circle c (2);Rectang I e r (2, 3);Tr iangle t (2, 3);Shape *p 3 = &c, &r, &t;doubIe totalArea=0;for (i nt i =0;i <3;i +) (totaIArea+=pi->computeArea (); pi->pr intArea ();)cout«ntota I Area: n«tota I Area«end I ; return 0;)第10章运算符重载一、选择题1. A 2. D 3. A 4. B 5. D 6. C二、写出下列程序运行结果(略)三、简答题2.(1)只能重载已有的C+运算符,不可自创新的运算符。 重载后运算符的优先级和结合性都不变。重载的功能应当与原有功能相类似。type i dtype i dtype i d3.type i d:.*? :s i zeof3.&&四、编程题1.#i ncIude < i ostream>cI ass MyStr i ng pub I ic:My Str i ng ()(strLength = 0;pStr = new char 1 ;*pStr = '0';)MyStr i ng (const char* pStr i ng)(strLength = strlen(pStr i ng);pStr = new char strLength+1;strcpy (pStr, pStr i ng);)strLength = n;pStr = new char strLength+1;for (uns igned i nt i=0; istrLength; *(pStr+i+)=ch);* (pStr+strLength) = '0';)MyStr i ng (i nt number)(char buffer 20;i nt temp = number ;i f (number<0)number =-number;i nt len = 0;do (bufferIen+ = static_cast<char> (*O' + number%10 );number /= 10;whi Ie (number>0);if (temp<0)buffer Ien+=;buffer I en = 1 01;strLength = len;pStr = new char strLength+1 ;strcpy (pStr, buffer);char ch = 0;for (i nt i =0, j= I en-1 ; i <j ; i +, j一) (ch = pStri;pStr i= pStr j;pStr j = ch;1)MyStr i ng (const MyStr i ng& rStr i ng)(strLength = rStr ing. strLength;pStr = new charstrLength+1;strcpy (pStr, rStr i ng. pStr);)de I ete pStr ;MyStr i ng& operator+ (const MyStr i ng& rStr)