上海大学 面向对象的程序设计 答案
面向对象程序设计课后答案(完整版)
面向对象程序设计课后答案(完整版)第二章2-4#includeusing namespace std;Add(int a,int b);int main(){int x,y,sum;cout>x>>y;sum = add(x,y);cout >*p;p++;}p = p-20;for( i=0;i0) countp++;if(*p>age ;try{checkagescore(name,age);}catch( string){cout<<"exception :name is exit"<<endl;continue;}catch(int){cout<<"exception :age is not proper"<<endl;continue;}cout<<"name:"<<name<<" age :"< }return 0;}第三章3-1(1)A (2)C (3)B (4)C (5)C(6)B (7)B (8)C (9)C3-7(1)main()函数中p1.age = 30;语句是错误的。
age 是类的私有成员(2)构造函数应当给常数据成员和引用成员初始化,将构造函数改为:A(int a1,int b1):a(a1),b(b1){}或A(int a1 ):a(a1),b(a){}再将main中的A a(1,2); 改为A a(1);(3)(1)在Test 类中添加语句:void print();void Print(){cout<<x<<"-"<<y<<"="<<x-y<<endl;}改为void Test::Print(){cout<<x<<"-"<<y<<"="<<x-y<<endl;}main函数中Init(38,15);改为:A.Init(38,15);Print();改为:A.Print();3-8(1)Constructing AConstructing BDestructing BDestructing A(2)double a,double bpoint & pp.x3-9class box{int len1,len2,len3;public:box(int l1,int l2,int l3){len1 = l1;len2 = l2; len3 = l3;} long volumn(){return len1*len2*len3;}};3-10class Test{int m1,m2;public:void Init(int a,int b){m1 = a;m2 = b;}void Pring(){cout<<m1<<" "<<m2<<endl;}};3-11略3-12}第四章4-6(1)D (2)D (3)D (4)D (5)B(6)D4-7(1)static int count = 0;这样初始化静态成员值是不对的将其改为static int count;在类外,main函数前加int Sample::count = 0;(2)#include//#includeusing namespace std;class Ctest{private:int x; const int y1;public:const int y2;Ctest(int i1,int i2):y1(i1),y2(i2) {y1 =10;//y1 为常量不能赋值x = y1;}int readme() const;};int Ctest::readme ()const{int i;i = x;x++; //常函数内不能改变成员值return x;}int main(){Ctest c(2,8);int i = c.y2;c.y2 = i;//y2为常量,不能改值i = c.y1;//y1私有,类外不能访问return 0;}将出错语句全部注释4-8(1)题中印刷错误,将class C构造函数改为: C(){cout<<"constructor C:";}运行结果为:constructor Aconstructor Bconstructor C(2)40(3)3434-9#include#includeclass Date{int year;int month;int day;public:Date(int y,int m,int d){year=y;month=m;day=d;}void disp(){cout<<year<<" "<<month<<" "<<day<<endl;}friend int count_day(Date &d,int k);friend int l(int year);friend int h(Date &d1,Date &d2);};int count_day(Date &d,int k){static int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,3 1},{31,29,31,30,31,30,31,31,30,31,30,31}};// 使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年int j,i,s;if(l(d.year))j=1;//闰年,取1else j=0;//非闰年,取0if(k)//K非0时{s=d.day;for(i=1;i<d.month;i++)//d.month为输入的月份s+=day_tab[j][i-1];}else//K为0时{s=day_tab[j][d.month]-d.day;for(i=d.month+1; i<=12; i++)s+=day_tab[j][i-1];}return s;//S为相差的天数}int l(int year){if(year%4==0&&year%100!=0||year%400==0) // 是闰年return 1;else // 不是闰年return 0;}int h(Date &d1,Date &d2){int days,day1,day2,y;if(d1.year<d2.year)//第一个日期年份小于第二个日期年份{days=count_day(d1,0);for(y=d1.year+1;y<d2.year;y++)if(l(y))//闰年。
面向对象程序设计答案
m_fReal += c.m_fReal;
m_fImag += c.m_fImag;
return *this;
}
Complex& operator-= (const Complex &c)
{
m_fReal -= c.m_fReal;
m_fImag -= c.m_fImag;
return *this;
在日常生活或者说日常编程中,简单的问题用面向过程的思路解决,更加直接有效,但是当问题的规模稍大时,如要描述三万个人吃饭的问题,或者要构建一个航空母舰模型的时候,用面向过程的思想是远远不够的。而且面向过程程序的代码复用性、可扩展性、可移植性、灵活性、健壮性都会在处理大规模问题中出现问题。
二、综合回答(每小题15分,共30分)
一、简答题(每小题6分,共30分)
1、面向过程思想的优点是什么?
与人类思维习惯一致;稳定性好:以object模拟实体,需求变化不会引起结构的整体变化,因为实体相对稳定,故系统也相应稳定;可重用性好;可维护性好
2、比较Java和C++?
JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c++为了照顾大量的C语言使用者,从而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,摒弃了其他语言的不足之处,从根本上解决了c++的固有缺陷。用C++可以使用纯过程化的编程,也可以是基于对象的编程,还可以是面向对象的编程,当然大部分是混合编程,c++可以跨平台
面向对象程序设计试卷及答案
考试试卷A(答案)面向对象程序设计注意事项:1. 请考生按要求在试卷装订线内填写、学号和年级专业。
2. 请仔细阅读各种题目的答复要求,在规定的位置填写答案。
3. 不要在试卷上乱写乱画,不要在装订线内填写无关的内容。
4. 总分值100分,考试时间为120分钟。
一.单项选择(本大题共10小题,每题3分,共30分)1. C#中每个int类型的变量占用〔B 〕个字节的内存。
〔A〕8 〔B〕4 〔C〕2 〔D〕12. 面向对象的特点是〔A 〕〔A〕封装、继承、多态〔B〕抽象、封装、多态〔C〕抽象、继承、封装〔D〕抽象、多态、重载3. C#控制台程序的主入口点是〔C 〕〔A〕Page_Load函数〔B〕Run函数〔C〕Main函数〔D〕Form_Load函数4. 引用类型存储在〔B 〕中。
〔A〕堆栈〔B〕堆内存〔C〕队列〔D〕列表5. 在C#中,表示一个字符串的变量应使用以下哪条语句定义〔B 〕〔A〕CString str 〔B〕string str〔C〕Dim str as string 〔D〕char *str6.在中,用来与数据源建立连接的对象是〔A 〕。
〔A〕Connection对象〔B〕Command对象〔C〕DataAdapter对象〔D〕DataSet对象7. 在类的定义中,类的〔 B 〕描述了该类的对象的行为特征。
〔A〕类名〔B〕方法〔C〕所属的名字空间〔D〕私有域8. 如果未显式赋值,则将整型值〔 B 〕赋给枚举中的第一个元素。
〔A〕1 〔B〕0 〔C〕2 〔D〕39. float类型的值可以隐式转换成〔 C 〕类型的值而保持值不被改变。
〔A〕char 〔B〕long 〔C〕double 〔D〕int10. 在C#中,假设Class1是一个类,而IExample 是一个接口,下面的〔 A 〕类声明是正确的。
〔A 〕class Employee: Class1, IExample〔B 〕class Employee: IExample, Class1〔C 〕class Employee- Class1, IExample〔D 〕class Employee: Class1/IExample二.判断题 (本大题共5小题,每题3分,共15分)1. C#中子类可以继承多个基类,也可以继承一个接口。
(完整版)《面向对象程序设计》答案
实验一熟悉VC++IDE开发环境一、实验目的1、熟悉VC++6.0集成开发环境,熟练掌握VC++6.0项目工作区、各种编辑器、菜单栏和工具栏的使用。
2、掌握如何编辑、编译、连接和运行一个C++程序。
3、通过运行简单的C++程序,初步了解C++源程序的结构和特点。
二、实验要求1、分析下列程序运行的结果。
程序一:#include <iostream.h>int add(int x,int y=8);void main(){ int x=4;cout<<add(x)<<",";cout<<add(x,add(add(x,add(x))))<<endl;}int add(int x,int y){ return x+y;}//12,28程序二:#include <iostream.h>void main(){ int *p,i;i=5;p=&i;i=*p+10;cout<<"i="<<i<<endl;}//i=15程序三:#include <iostream.h>void main(void){ int i=10;int &r=i;r++;cout<<"i="<<i<<", r="<<r<<'\n';i=88;cout<<"i="<<i<<", r="<<r<<'\n';}//i=11,r=11i=88,r=88程序四:#include <iostream.h>int f(int i){ static int k=1;for(;i>0;i--)k +=i;return k;}void main(){ int i;for(i=0;i<5;i++)cout<<f(i)<<" ";}// 1 2 5 11 21程序五:#include <iostream.h>void func();int n=1;void main(){ static int a;int b= -9;cout <<"a:"<<a<<" b:"<<b<<" n:" <<n<<endl;b+=4;func();cout <<"a:"<<a<<" b:"<<b<<" n:"<<n<<endl;n+=10;func();}void func(){ static int a=2; int b=5;a+=2;n+=12;b+=5;cout <<"a:" <<a<<" b:" <<b<<" n:" <<n <<endl;}// a:0 b:-9 n:1a:4 b:10 n:13a:0 b:-5 n:13a:6 b:10 n:35实验二C++对C的扩充一、实验目的1、了解在面向对象程序设计过程中C++对C功能的扩充与增强,并善于在编写程序的过程中应用这些新功能。
《面向对象程序设计》习题四答案
面向对象程序设计习题4
(3) 下列程序中,基类base和派生类d1、d2中都含有私有、 保护和公有成员,d1类是base的派生类,d2是d1问属性的变化
面向对象程序设计习题4 #include <iostream.h> #include <iostream.h> class base class base {{private: int n1; private: int n1; protected: int k1; protected: int k1; public: public: base(){n1=0;k1=1;} base(){n1=0;k1=1;} void fun1(){cout<<n1<<k1<<endl;} }; void fun1(){cout<<n1<<k1<<endl;} }; class d1:public base class d1:public base {{ int n2; int n2; protected: protected: int k2; int k2; public: public: d1(){n2=10;k2=11;} d1(){n2=10;k2=11;} void fun2(){cout<<n1<<k1<<endl; cout<<n2<<k2<<endl;} }; void fun2(){cout<<n1<<k1<<endl; cout<<n2<<k2<<endl;} }; class d2:public d1 class d2:public d1 {{ int n3; int n3; protected: protected: int k3; int k3; public: public: d2(){n3=20;k3=21;} d2(){n3=20;k3=21;} void fun3() void fun3()
面向对象程序设计课后答案
面向对象程序设计课后答案面向对象程序设计是计算机科学领域的一门重要课程,通过学习这门课程,我们可以深入理解面向对象的编程思想和方法。
本文将针对面向对象程序设计的一些常见问题给出详细的答案,帮助读者更好地理解和掌握这门课程。
一、什么是面向对象程序设计?面向对象程序设计(Object-Oriented Programming,简称OOP)是一种软件开发的方法和思想,它将程序中的数据和操作数据的方法组合成一个对象,通过对象的相互调用来完成任务。
面向对象程序设计可以更好地模拟现实世界的事物和关系,提高软件的可维护性和可扩展性。
二、面向对象程序设计的基本特征有哪些?1. 封装(Encapsulation):将数据和操作封装在一个对象中,对外部隐藏内部的实现细节,提供统一的接口进行访问。
2. 继承(Inheritance):通过继承可以使一个类获取另一个类的属性和方法,减少代码的重复性,提高代码的复用性。
3. 多态(Polymorphism):不同的对象可以对相同的消息做出不同的响应,同一个方法可以根据具体的对象类型来执行不同的操作。
三、什么是类和对象?1. 类(Class):类是一种抽象的数据类型,它定义了对象共同具有的属性和方法。
类是面向对象程序设计的基础,用于描述对象的特征和行为。
2. 对象(Object):对象是类的一个实例,具有类定义的属性和方法。
对象是面向对象程序设计的基本单位,可以通过对象来访问和操作数据。
四、如何定义一个类?在面向对象程序设计中,可以通过以下步骤来定义一个类:1. 确定类的名称:类名通常使用大写字母开头,采用驼峰命名法。
2. 确定类的属性:类的属性是描述对象特征的变量,可以包括基本数据类型和其他对象。
3. 确定类的方法:类的方法是描述对象行为的函数,可以有参数和返回值,用于操作类的属性。
五、如何创建对象?在面向对象程序设计中,可以通过以下步骤来创建对象:1. 使用关键字new来实例化一个对象:Object obj = new Object();2. 调用对象的构造方法(Constructor):构造方法用于初始化对象的属性,在类中可以定义一个或多个构造方法。
面向对象程序设计习题及答案
面向对象程序设计一、选择填空1.关于C++与C语言得关系描述中,(D)就是错误得.(A)C语言就是C++得一个子集(B)C语言与C++就是兼容得(C)C++对C语言进行了一些改进(D)C++与C语言都就是面向对象得2.下面关于对象概念得描述中,(B)就是错误得。
(A)对象就就是C语言得结构变量(B)对象代表着正在创建得系统中得一个实体(C)对象就是一个状态得操作(或方法)得封装体(D)对象之间得信息传递就是通过消息进行得3.下面关于类概念得描述中,(D)就是错误得。
(A)类就是抽象数据类型得实现(B)类就是具有共同行为得若干对象得统一描述体(C)类就是创建对象得样板(D)类就就是C语言得结构类型4.按照标识符得要求,(A)符号不能组成标识符。
(A)连接符(B)下划线(C)大小写字母(D)数字字符5.下列符号中,(C)不可作为分隔符。
(A),(B): (C)? (D);6.在16位机中,int型字宽为(A)字节.(A)2(B)4(C)6(D)87.类型修饰符unsigned修饰(D)类型就是错误得.(A)char(B)int (C)long int(D)float8.对于int *pa[5];得描述,(D)就是正确得。
(A)pa就是一个指向数组得指针,所指向得数组就是5个int型元素(B)pa就是一个指向某数组中第5个元素得指针,该元素就是int变量(C)pa[5]表示某个数组得第5个元素(D)pa就是一个具有5个元素得指针数组,每个元素就是一个int型指针。
9.下列关于指针得运算中,(D)就是非法得。
(A)两个指针在一定条件下,可以进行相等或不等得运算.(B)可以有一个空指针赋值给某个指针.(C)一个指针可以加上一个整数。
(D)两个指针在一定条件下,可以相加.10.指针可以用来表示数组元素,下列表示中(A)就是错误得.已知:inta[3][7];(A)*(a+1)[5](B)*(*a+3)(C)*(*(a+1))(D)*(&a[0][0]+2)11.下列表示引用得方法中,(A)就是正确得。
《面向对象程序设计》答案
0837一、BCABB DDCBA二、1、答:程序运行的输出结果是:1 2 6 24 1202、3、问题(1):Test3是SuperTest的子类(或SuperTest是Test3的父类,或继承关系)。
问题(2):super指对象的父类(或超类);this指使用它的对象本身(或对对象自己的引用)。
问题(3):程序的输出是:<\ p="">Hi, I am OliveNice to meet you!Age is 7My age is 7My parent"s age is 35<\ p="">4、答:问题(1):new FileOutputStream(“out.txt”)dout.writeInt( ‘0’ + i);dout.close( );new FileInputStream(“out.txt”)din.readInt( )din.close( );问题(2):常被用于读取与存储(读写或输入/输出)基本数据类型的数据。
问题(3):文件out.txt的内容是:0 1 2 3 4 5 6 7 8 9程序在控制台窗口输出:0,1,2,3,4,5,6,7,8,9,三、import java.io.DataOutputStream;import java.io.FileOutputStream;import java.io.IOException;public class TestSort {public static int MAXSIZE = 61;public static void sortInt(int[] arr) { // 采用选择法对一维数组进行排序for (int i = 0; i < arr.length - 1; i++) {int k = i;for (int j = i + 1; j < arr.length; j++)if (arr[j] < arr[k])k = j; // 用k记录最小值的下标if (k > i) { // 在外循环中实施交换arr[i] = arr[i] + arr[k];arr[k] = arr[i] - arr[k];arr[i] = arr[i] - arr[k];}}}public static void main(String args[]) {int score[] = new int[MAXSIZE];try {for (int i = 0; i < MAXSIZE; i++)score[i] = (int) (Math.random() * 100 + 0.5);sortInt(score);DataOutputStream dout = new DataOutputStream(new FileOutputStream(\"score.txt\"));for (int i = 0; i < MAXSIZE; i++) {dout.writeInt(score[i]);System.out.println(score[i]);}dout.close();// 结果保存到文件} catch (IOException e) {System.err.println(\"发生异常:\" + e);e.printStackTrace();}// try-catch结构处理异常}}。
面向对象程序设计教程 答案
面向对象程序设计教程(C++语言描述)题解与课程设计指导第1章面向对象程序设计概论一、名词解释抽象封装消息【问题解答】面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节.消息是面向对象程序设计用来描述对象之间通信的机制。
一个消息就是一个对象要求另一个对象实施某种操作的一个请求。
二、填空题(1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。
(2) 结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。
(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法;而面向对象的程序设计方法,程序可表示为程序=对象+消息.(4)结构化程序设计方法中的基本模块是过程;而面向对象程序设计方法中的基本模块是类。
(5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。
三、选择题(至少选一个,可以多选)(1) 面向对象程序设计着重于( B )的设计。
A。
对象B. 类C。
算法D. 数据(2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做( C )。
A. 抽象B. 继承C. 封装D. 多态(3) 在面向对象程序设计中,类通过( D )与外界发生关系。
A. 对象B. 类 C。
消息 D. 接口(4)面向对象程序设计中,对象与对象之间的通信机制是( C )。
A。
对象 B. 类 C。
消息 D. 接口(5)关于C++与C语言的关系的描述中,( D )是错误的。
A. C语言是C++的一个子集 B。
C语言与C++是兼容的C。
C++对C语言进行了一些改进 D。
C++和C语言都是面向对象的【结果分析】C语言是面向过程的。
C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。
(6)面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。
上海大学 面向对象的程序设计 答案
雷电老师的上机实验答案(部分)。
以下文字中,红色为应填入的答案,绿色为代码的注释,蓝色为老师没有讲过的知识补充,紫色为我不确定的题目☆第二章从C到C++1. 以下说法正确的有A. 面向对象程序设计的基本特征是封装、继承、多态B. 名字空间的作用是提供逻辑分类和防止名字冲突2. 代码填空#include <iostream>using namespace std;//这是因为std涵盖了标准C++的定义和声明,可以把std 想象成一个很大的名字空间名,cin、cout都是其内部定义的函数namespace myLib //此处定义了名叫“myLib”的名字空间{int maxV(int& a,int& b){return a>b?a:b;}} //此空间里面的所有函数的全名为:myLib::maxV int main( ){int x,y;cin >>x>>y;//因为题目要求要输入两个函数,所以我们采取依次输入的方法cout <<myLib::maxV( x,y ); //输出maxV函数值,名字空间里面定义过的函数,全名为:“名字空间名::函数名”return 0;}输入 1 2 输出 2 //maxV函数的意思是取两个参数中较大的一个△这里说一下typedef的两条用法,下面的题目要用到:用途一:定义一种类型的别名,而不只是简单的宏替换。
可以用作同时声明指针型的多个对象。
比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
面向对象程序设计试题及答案
面向对象程序设计试题及答案一、试题1. 请简要解释面向对象(Object-Oriented)程序设计的概念。
2. 列举面向对象程序设计中的四个基本特征,并分别进行简要描述。
3. 请说明封装(Encapsulation)在面向对象程序设计中的作用和优势。
4. 解释继承(Inheritance)在面向对象程序设计中的概念和用途。
5. 什么是多态(Polymorphism)?请解释多态的概念以及其在面向对象程序设计中的重要性。
6. 简要介绍抽象类(Abstract Class)和接口(Interface)的概念,并说明它们之间的区别。
7. 请解释类(Class)与对象(Object)之间的关系。
8. 在面向对象程序设计中,什么是构造函数(Constructor)?请说明构造函数的作用和使用方法。
9. 请示范一个使用面向对象程序设计的简单实例,并说明你所设计的类的结构和功能。
二、答案1. 面向对象程序设计是一种以对象为中心的编程方法,通过定义表示对象属性和行为的类来组织程序结构,以实现代码的重用性、灵活性和可维护性。
2. (1)封装:将数据和对数据的操作封装在一个类中,通过访问权限控制,保护数据的安全性和完整性。
(2)继承:通过建立类之间的继承关系,实现代码的重用,具有层次性和扩展性。
(3)多态:允许不同类的对象对同一消息作出不同的响应,实现代码的灵活性和扩展性。
(4)抽象:通过抽象类和接口的定义,隐藏对象的具体实现细节,提供统一的接口和规范。
3. 封装的作用是将数据和对数据的操作封装在一个类中,外部无法直接访问类的内部实现细节,只能通过类提供的接口访问和操作数据。
封装的优势包括:(1)提高代码的可维护性和可读性,减少代码的重复。
(2)保护数据的安全性和完整性,防止外部直接对数据进行非法操作。
(3)降低模块之间的耦合度,提高代码的灵活性。
4. 继承是面向对象程序设计中的一个重要概念,它通过建立类与类之间的继承关系,实现代码的重用和扩展。
面向对象程序设计习题及答案
面向对象程序设计一、选择填空1.关于C++与C语言的关系描述中,(D)是错误的。
(A)C语言是C++的一个子集(B)C语言与C++是兼容的(C)C++对C语言进行了一些改进(D)C++和C语言都是面向对象的2.下面关于对象概念的描述中,(B)是错误的。
(A)对象就是C语言的结构变量(B)对象代表着正在创建的系统中的一个实体(C)对象是一个状态的操作(或方法)的封装体(D)对象之间的信息传递是通过消息进行的3.下面关于类概念的描述中,(D)是错误的。
(A)类是抽象数据类型的实现(B)类是具有共同行为的若干对象的统一描述体(C)类是创建对象的样板(D)类就是C语言的结构类型4.按照标识符的要求,(A)符号不能组成标识符。
(A)连接符(B)下划线(C)大小写字母(D)数字字符5.下列符号中,(C)不可作为分隔符。
(A), (B):(C)?(D);6.在16位机中,int型字宽为(A)字节。
(A)2 (B)4 (C)6 (D)87.类型修饰符unsigned修饰(D)类型是错误的。
(A)char (B)int (C)long int (D)float8.对于int *pa[5];的描述,(D)是正确的。
(A)pa是一个指向数组的指针,所指向的数组是5个int型元素(B)pa是一个指向某数组中第5个元素的指针,该元素是int变量(C)pa[5]表示某个数组的第5个元素(D)pa是一个具有5个元素的指针数组,每个元素是一个int型指针。
9.下列关于指针的运算中,(D)是非法的。
(A)两个指针在一定条件下,可以进行相等或不等的运算。
(B)可以有一个空指针赋值给某个指针。
(C)一个指针可以加上一个整数。
(D)两个指针在一定条件下,可以相加。
10.指针可以用来表示数组元素,下列表示中(A)是错误的。
已知:int a[3][7];(A)*(a+1)[5] (B)*(*a+3) (C)*(*(a+1)) (D)*(&a[0][0]+2) 11.下列表示引用的方法中,(A)是正确的。
面向对象程序设计教程答案
面向对象程序设计教程(C++语言描述)题解与课程设计指导第1章面向对象程序设计概论一、名词解释抽象封装消息【问题解答】面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。
消息是面向对象程序设计用来描述对象之间通信的机制。
一个消息就是一个对象要求另一个对象实施某种操作的一个请求。
二、填空题(1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。
(2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。
(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法;而面向对象的程序设计方法,程序可表示为程序=对象+消息。
(4)结构化程序设计方法中的基本模块是过程;而面向对象程序设计方法中的基本模块是类。
(5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。
三、选择题(至少选一个,可以多选)(1)面向对象程序设计着重于( B )的设计。
A. 对象B. 类C. 算法D. 数据(2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做( C )。
A. 抽象B. 继承C. 封装D. 多态(3)在面向对象程序设计中,类通过( D )与外界发生关系。
A. 对象B. 类C. 消息D. 接口(4)面向对象程序设计中,对象与对象之间的通信机制是( C )。
A. 对象B. 类C. 消息D. 接口(5)关于C++与C语言的关系的描述中,( D )是错误的。
A. C语言是C++的一个子集B. C语言与C++是兼容的C. C++对C语言进行了一些改进D. C++和C语言都是面向对象的【结果分析】C语言是面向过程的。
C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。
(6)面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。
面向对象程序设计答案
面向对象程序设计答案面向对象程序设计答案一、单项选择题二、简答题1. 答:对象是一些相关的变量和方法的软件集。
软件对象经常用于模仿现实世界中我们身边的一些真实对象。
对象是理解面向对象技术的关键。
你可以发现现实世界中的对象有两个共同特征:它们都有状态和行为。
比如某条狗有自己的状态(比如名字、颜色、生育以及饥饿等等)和行为(比如摇尾巴等等)。
同样某辆自行车也有自己的状态(比如当前档位、两个轮子等等)和行为(比如刹车、加速、减速以及改变档位等等)2. 答:C中结构只含数据成员,不含成员函数;C++中类即含数据成员,又含成员函数.类定义中默认情况下的成员是private的,而结构定义中的默认情况下的成员是public的3. 答:类对其成员有三种存储控制public 类内外均可见protected 类内及派生类可见private 只有类内可见4. 答:C++程序的内存格局通常分为四个区:*全局数据区(data area)*代码区(code area)*栈区(stack area)*堆区(heap area)全局变量、静态数据、常量存放在全局数据区,所有类成员函数和非成员函数存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间被作为堆区。
5. 答:在默认的拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,这种被称为浅拷贝。
但是,一个类可能拥有资源,当其构造函数分配了一个资源(例如某个堆内存地址)的时候,会发生什么?如果拷贝构造函数简单地制作了一个该资源的引用的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源。
当对象析构时,该资源将经历两次资源返还。
这个时候,我们在执行拷贝时,最好同时对资源本身进行复制,这种拷贝方法,我们称之为深拷贝。
6. 答:静态数据成员的主要应用场合为:1) 用来保存流动变化的对象个数。
2)作为一个标志,用来指示一个特定的动作是否发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
雷电老师的上机实验答案(部分)。
以下文字中,红色为应填入的答案,绿色为代码的注释,蓝色为老师没有讲过的知识补充,紫色为我不确定的题目☆第二章从C到C++1. 以下说法正确的有A. 面向对象程序设计的基本特征是封装、继承、多态B. 名字空间的作用是提供逻辑分类和防止名字冲突2. 代码填空#include <iostream>using namespace std;//这是因为std涵盖了标准C++的定义和声明,可以把std 想象成一个很大的名字空间名,cin、cout都是其内部定义的函数namespace myLib //此处定义了名叫“myLib”的名字空间{int maxV(int& a,int& b){return a>b?a:b;}} //此空间里面的所有函数的全名为:myLib::maxV int main( ){int x,y;cin >>x>>y;//因为题目要求要输入两个函数,所以我们采取依次输入的方法cout <<myLib::maxV( x,y ); //输出maxV函数值,名字空间里面定义过的函数,全名为:“名字空间名::函数名”return 0;}输入 1 2 输出 2 //maxV函数的意思是取两个参数中较大的一个△这里说一下typedef的两条用法,下面的题目要用到:用途一:定义一种类型的别名,而不只是简单的宏替换。
可以用作同时声明指针型的多个对象。
比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
用途二:用在旧的C代码中(具体多旧没有查),帮助struct。
以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:struct tagPOINT1{int x;int y;};struct tagPOINT1 p1;而在C++中,则可以直接写:结构名对象名,即:tagPOINT1 p1;估计某人觉得经常多写一个struct太麻烦了,于是就发明了:typedef struct tagPOINT{int x;int y;}POINT;POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
3. 有函数typedef char* LPTSTR; //此处规定了LPTSTR的类型是一个字符型的指针,这里为typedef的用途一int GetSystemDirectory( LPTSTR lpBuffer, int uSize);//函数中的两个参数类型,第一个为字符型的指针,第二个为整型正确的调用代码是(多选)A. char dir[200]; GetSystemDirectory( dir, 200 );//dir[200]表示一个数组,dir也可以理解为该数组第一个成员的地址(类似于指针)B. char *pdir=new char[200]; GetSystemDirectory( pdir, 200 );//前半句定义了一个字符型的指针pdir并且动态创建了一个长度为200的字符型数组,所以可以满足后半句中函数参数的要求C. char *dir; GetSystemDirectory( dir, 200 );//前半句定义了一个字符型的指针dir,但是为什么不选这项我也不清楚,我要问问老师D. string dir; GetSystemDirectory( dir, 200 );//dir的类型是一个字符串型的,不满足函数参数的要求E. LPTSTR lpBuffer; GetSystemDirectory( dir, 200 );//dir不知道从何而来,前半句定义lpBuffer为一个LPTSTR(字符类型的指针,为什么?看这道题的第一个注释)类型,并没有提到dir4. 有函数typedef struct _SYSTEMTIME {WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds;} SYSTEMTIME, *LPSYSTEMTIME; //此处用到了typedef的用途一:SYSTEMTIME和*LPSYSTEMTIME两者等价,类型都为结构体_SYSTEMTIME,只是SYSTEMTIME定义的变量为结构体_SYSTEMTIMELE类型,而LPSYSTEMTIME定义的变量的指针为结构体_SYSTEMTIME类型void GetSystemTime( LPSYSTEMTIME lpSystemTime );//此处要求lpSystemTime为结构体_SYSTEMTIME的指针正确的调用代码是(多选)A. LPSYSTEMTIME time; GetSystemTime( time );//用LPSYSTEMTIME定义变量的形式为LPSYSTEMTIME * time,所以题目中time不是一个指针类型B. SYSTEMTIME *ptime; GetSystemTime( ptime);C. SYSTEMTIME time; GetSystemTime( &time );D. SYSTEMTIME *ptime=new SYSTEMTIME; GetSystemTime( ptime);5.根据下面的调用char str[200]; bool ok = getstr( str,200); //①我们观察getstr 函数里面的两个参数:str是一个大小为200的数组的数组名,同时也是指向这个数组第一个元素的指针名(基地址);200为这个数组的元素个数,也同时是这个数组表示的存储空间里面基地址的偏移量②可以观察到ok的类型是bool型,所以函数getstr也应为bool型写出其函数原型(多选)A. void getstr( char str,int size );//不符合②B. bool getstr( char str[],int size );C. bool getstr( char *p,int len );D. ok=getstr( str,200 );//函数原型应包括函数得到类型6.下面哪条代码是错误的?A. string s; s="i love C++"; cout<<s<<'\n'; //p32 2.5.4 读写stringB. string s1="i love c++"; char s2[30]; s2=s1; cout<<s2<<'\n';//p33的2.5.5,明确说明了赋值时,左边必须是一个string类型得到字符串,右边可以是一个string类型的字符串,也可以是一个C风格的字符串或仅仅是一个char字符C. string s; s="i love "; s+="C++"; cout<<s<<'\n';//p34 2.5.6 字符串的连接D. string s="i love you",t; t=s+"!"; cout<<t<<'\n';//同上7.如下代码的输出是 p.x=4 p.y=-11 //注意cout输出内容的格式,不要忘记“p.x=”,“p.y=”#include <iostream>using namespace std;struct point{ int x,y;};void move (point& q){ q.x--;q.y++;}int main(){point p;p.x=5;p.y=-12;move(p);cout<<"p.x="<<p.x<<'\n';cout<<"p.y="<<p.y<<'\n';return 0;}8.如下代码的输出是 *p.x=4 *p.y=-11#include<iostream>using namespace std;struct point{int *x,*y;};void move (point& q){--*q.x; //此处是将q.x所指向的内容自减1++*q.y; //此处是将q.y所指向的内容自增1}int main(){point p;int a=5,b=-12;p.x=&a; //此处,令a的地址为p.xp.y=&b; //此处,令b的地址为p.ymove(p);cout<<"*p.x="<<*p.x<<'\n';cout<<"*p.y="<<*p.y<<'\n';return 0;}9.写一段代码double * db_ptr = new double;分配一个类型为double的存储空间,并将它的地址赋给变量db_ptr//此题代码也可为: double * db_ptr;db_ptr = new double;10.下面代码输出为 5 ,有一行错误修改为:int & ai(int i){int j=1;改为static int j=1;//因为代码定义了一个引用返回类型,j和b直接关联在一起,没改之前,当return j时,存储j的空间已经收回,所以要把j改为静态(全局)变量j += i;return j;}int main(){int& b=ai( 1 );b++;b = ai( 2 );cout<<b;}11.下面代码填空//此题主要是考枚举的概念,p28 2.4.4#include<iostream>using namespace std;enum {MinSize=0,MaxSize=1000};enum Color{red=0xff0000,green=0xff00,blue=0xff};void draw( Color color){if(color==red)cout<<"红"<<endl;else if(color==green)cout<<"绿"<<endl;else if(color==blue)cout<<"蓝"<<endl;}int main(int argc, char* argv[]){int a[MaxSize];for(int i=0;i<MaxSize;i++){a[i]=i;}Color color= red;draw(color);return 0;}12.下面代码的输出er:越界! 0 1 2 //此题考察例外处理,p53 2.8 const int MaxSize=3;int curr=0;int A[MaxSize];void append(int x){if( curr<MaxSize)A[curr++] = x;elsethrow "er:越界!";}int main(int argc, char* argv[]){int i;try{for(i=0;i<5;i++)append(i);}catch(char *e){cout<<e<<endl;}for(int j=0;j<i;j++)cout<<A[j]<<" ";cout<<endl;return 0;}☆第三章类类(1)设计并实现类(P127 3-7)1. 填空class Profession{string name;string title;double avgIncom;public:Profession(){} //构造函数Profession(string name){ this->name=name;} //构造函数~Profession(){} //析构函数int CompareIncome( Profession &profes){if( this->avgIncom < profes.getavgIncom()) return -1;else if(this->avgIncom == profes.getavgIncom() )return 0;//根据main函数最后输出结果的形式得出,特别注意C++的等于用“==”表示else return 1;}static int CompareIncome( Profession &profes1,Profession&profes2){if(profes1.getavgIncom()< profes2.getavgIncom() ) return -1;else if( profes1.getavgIncom()> profes2.getavgIncom()) return 1;else return 0;}string getname(){return name;}//name是字符串类型string gettitle(){return title;}double getavgIncom(){return avgIncom;}//avgIncom是double型void setname( string name ) { this->name=name;}//表示Profession类里面定义的name被setname的参数赋值void settitle( string title ) { this->title=title;}void setavgIncom( double avgIncom ) { this->avgIncom=avgIncom;}};int main( ){Profession prof[2];for(int i=0;i<2;i++){string name;string title;double avgIncom;cin>>name>>title>>avgIncom;prof[i].setname(name);//在循环中对两个prof都进行setname操作,但是要它们自己调用自己的成员函数setnameprof[i].settitle(title);prof[i].setavgIncom(avgIncom);}for(i=0;i<2;i++){cout<<prof[i].getname()<<"\t"<<prof[i].gettitle()<<"\t"<<prof[i].getavgIncom()<<"\t"<<endl;//两个prof分别调用各自的成员函数getname}int comp= Profession::CompareIncome( prof[0],prof[1] );//用到Profession类里面的函数,调用方法就为以上形式cout<<prof[0].getname()<<"avgIncom 比"<< prof[1].getname();if( comp < 0 )cout<<"少"<<endl;else if( comp > 0 )cout<<"多"<<endl;elsecout<<"相同"<<endl;return 0;}2. 改写settitle成员函数为外式实现void Profession::settitle( string title ) { this->title=title;}//因为是外联式实现(写在类外面),所以要用到“::”域解析操作符3. 改写析构函数为外联式实现Profession::~Profession(){}//同理4. 考察main()函数中的调用代码:prof[i].settitle(title);设对象prof[0]的地址0x11234567,对象prof[1]的地址0x21234567那么运行分别进入成员setname函数体中,this值分别是0x11234567、0x21234567//p119 最右边有■的一句话:this指向对象c1,即this的值为&c1类(2)以下是第3章类教材中的练习1. 78页 3.1.8-2 Airplane airplane; (注:对象名airplane) Airplane airplanes[5]; (注:5个对象的数组,名airplanes)2. 79页3.1.8-5 //与struct区别开来,struct成员都是公有的A.私有B.公有3. 79页 3.1.8-9 改为//此题牵涉到成员函数外联实现的表现形式A. private: unsigned getHeadCount() const;B. unsigned Circus::getHeadCount() const { ... }C. Circus:: unsigned getHeadCount() const { ... }D. unsigned Circus::getHeadCount() { ... }4. 82页 3.2.7-2 getTop其声明及内联式的实现(注:不考虑栈可能是空的情况)int getTop() {return arr[top];}//所写代码只要满足要求即可5. 85页 3.3.5-5 错的地方修改为A. void setAux(string& s){ dm=s;}B. void setAux(const string& s) const { dm=s;}C. void set(string& s)const{ setAux( s ); }D. void set(const string& s) { setAux( s ); } //修改之前set 函数使用const标记的,而setAux是非const类型,所以这种调用是错误的,具体陈述请见p84 最后一段6. 105页 3.5.12-2 错的地方修改为Z();//构造函数没有函数类型7. 106页 3.5.12-7 错的地方修改为public: //构造函数需要被调用,所以必须为公有成员函数8. 106页 3.5.12-9 错的地方修改为R(const R&arg); (注:参量要使用const 修饰) //拷贝构造函数的定义,p95 3.5.49. 106页 3.5.12-13 输出 1 -999 //这道题要说明什么我也不清楚10. 107页 3.5.12-19 错的地方修改为A. public: void C( int a ) { c = a; }B. const int c = 0;C. public: const int c;D. public: C( int a ) c(a) { }//此题表示的是,当要对const类型的对象赋值时,不能直接在函数内部赋值,需要用到构造函数的初始化段11. 108页 3.5.12-22 错的地方修改为~A(); //析构函数没有函数类型12. 117页 3.7.4-3 补上所缺的代码int C::x=0; (注:设初值为0)//因为x为static类型,属于全局变量,所以可以在类的外面对x赋值,但要用到“::”域解析操作符13. 117页 3.7.4-4 错误地方修改为A. ++this->xB. this->++xC. s函数内不能访问xD.public: int x;//static函数不能访问非static内容,具体陈述见p155 中间一段14. 117页 3.7.4-5 输出 1 2 3 //s为static类型,属于全局变量15. 120页 3.8.2-1 错的地方修改为A.void g( C& c1);B.g(c1);C.p->m();D.c1.g(&c1);//必须用这种形式,p118 例3-42以下是自编练习:16. 设有 class CC { public: CC( int x ){} };以下创建对象的方法正确的有(多选)A. CC c(1);B. CC *pc=new CC(1);C. CC cs[2]={C(1),C(2)};D. CC c;E. CC cs[2]={1,2};F. CC c1(1); CC c2(c1);//因为构造函数带有参数,所以创建对象时,必须要带参数创建,所以只有D没有带参数,故选ABCEF17. 设有 class CC{ public: void m(); static void sm(); int a; static int s;}以下正确的有(多选)A. CC c; c.m(); c.sm();B. CC c; CC::m(); c.sm();C. CC c; c.m(); CC::sm();D. CC c; CC::m(); CC::sm();E. int CC::s=0;F. void CC::sm(){ s=9;}G. void CC::m(){ this->s=9;}H. void CC::sm(){ this->a=9;}//见p115 例3-39 后面有一个表格,说明了当成员函数是static类型时,可以用C::sm()调用,也可以用c.sm()调用;当成员函数非static类型时,只能用c.m()调用。