多态练习题
- 格式:doc
- 大小:30.50 KB
- 文档页数:11
java 接口的练习题Java接口的练习题在Java编程语言中,接口(Interface)是一种特殊的引用类型,它可以理解为一种约定或契约,用于规定类所需要实现的方法。
在本篇文章中,我们将通过一些练习题来巩固和提升对Java接口的理解和运用。
练习一:接口的基本使用请定义一个名为Shape的接口,该接口中应包含计算面积的方法和计算周长的方法。
具体要求如下:```javapublic interface Shape {double getArea();double getPerimeter();}```接下来,请创建一个名为Rectangle的类,该类实现Shape接口,并且包含长度和宽度两个属性,并分别实现计算面积和计算周长的方法。
具体要求如下:```javapublic class Rectangle implements Shape {private double length;private double width;public Rectangle(double length, double width) {this.length = length;this.width = width;}@Overridepublic double getArea() {return length * width;}@Overridepublic double getPerimeter() {return 2 * (length + width);}}```最后,请编写一个测试类,验证Rectangle类的功能是否正确。
具体要求如下:```javapublic class TestShape {public static void main(String[] args) {Rectangle rectangle = new Rectangle(5, 4);System.out.println("矩形的面积:" + rectangle.getArea());System.out.println("矩形的周长:" + rectangle.getPerimeter());}}```运行上述测试类,输出的结果应为:```矩形的面积:20.0矩形的周长:18.0```练习二:接口的多态性请在Shape接口中增加一个方法用于打印形状的信息,并在Rectangle类中对该方法进行实现。
多做练习题一、基础概念理解2. 简述面向对象编程中的封装、继承、多态的概念。
4. 请说明什么是事件驱动编程以及其应用场景。
5. 简述数据库中的SQL语言的作用及其基本命令。
二、数据结构与算法1. 请列举常用的线性数据结构。
2. 描述二叉树的特点及其常见操作。
3. 简述排序算法的类别,并给出冒泡排序和快速排序的基本思想。
4. 请解释什么是哈希表,并说明其查找和插入的时间复杂度。
5. 描述图的表示方法以及图的遍历算法。
三、编程语言特性1. 请列举Python中的几种基本数据类型。
2. 简述Java中的泛型以及其作用。
3. 描述C++中的指针与引用的区别。
4. 请说明JavaScript中闭包的概念及其应用。
5. 简述TypeScript中的类型注解和类型推断。
四、软件工程1. 请解释软件开发生命周期模型。
2. 简述敏捷开发的核心价值观和原则。
3. 描述单元测试、集成测试和系统测试的区别。
4. 请说明版本控制系统的作用以及Git的基本操作。
5. 简述软件架构设计的基本原则。
五、网络与通信1. 请解释TCP/IP协议栈的层次结构。
2. 描述HTTP协议的工作原理及其常见方法。
3. 简述RESTful API的设计原则。
4. 请说明Websocket协议的特点及其应用场景。
5. 描述网络安全的常见威胁及其防范措施。
六、数据库技术1. 请列举关系型数据库的常见类型。
2. 简述数据库范式及其作用。
3. 描述索引的作用及其类型。
4. 请说明事务处理的基本概念及其特性。
5. 简述数据库的备份与恢复策略。
七、操作系统1. 请解释进程与线程的区别。
2. 描述内存管理的基本策略。
3. 简述文件系统的常见类型及其特点。
4. 请说明操作系统的调度算法。
5. 描述操作系统的安全机制。
1. 请解释机器学习的基本概念及其分类。
2. 描述深度学习的基本原理。
3. 简述自然语言处理的基本任务。
4. 请说明计算机视觉的主要应用领域。
5. 描述强化学习的基本思想。
作业题一、写出下列程序运行结果1.#include<iostream>using namespace std;class A {public:virtual void func( ) {cout<<”func in class A”<<endl;} };class B{public:virtual void func( ) {cout<<”func in class B”<<endl;} };class C:public A,public B{public:void func( ) {cout<<”func in class C”<<endl:}};int main( ){C c;A& pa=c;B& pb=c;C& pc=c;pa.func( );pb.func( );pc.func( );}2.#include<iostream>using namespace std;class A{public:virtual ~A( ){cout<<”A::~A( ) called “<<endl; }};class B:public A{char *buf;public:B(int i) { buf=new char[i]; }virtual ~B( ){delete []buf;cout<<”B::~B( ) called”<<endl;}};void fun(A *a) {delete a;}int main( ){ A *a=new B(10);fun(a);}二、程序设计题1有一个交通工具类vehicle,将它作为基类派生小车类car、卡车类truck和轮船类boat,定义这些类并定义一个虚函数用来显示各类信息。
5.2定义一个shape抽象类,派生出Rectangle类和Circle类,计算各派生类对象的面积Area( )。
多态性与虚函数1.概念填空题1.1 C++支持两种多态性,分别是编译时和运行时。
1.2在编译时就确定的函数调用称为静态联编,它通过使用函数重载,模板等实现。
1.3在运行时才确定的函数调用称为动态联编,它通过虚函数来实现。
1.4虚函数的声明方法是在函数原型前加上关键字virtual。
在基类中含有虚函数,在派生类中的函数没有显式写出virtual关键字,系统依据以下规则判断派生类的这个函数是否是虚函数:该函数是否和基类的虚函数同名;是否与基类的虚函数参数个数相同、类型;是否与基类的虚函数相同返回类型。
如果满足上述3个条件,派生类的函数就是虚函数。
并且该函数覆盖基类的虚函数。
1.5 纯虚函数是一种特别的虚函数,它没有函数的函数体部分,也没有为函数的功能提供实现的代码,它的实现版本必须由派生类给出,因此纯虚函数不能是友元函数。
拥有纯虚函数的类就是抽象类类,这种类不能实例化。
如果纯虚函数没有被重载,则派生类将继承此纯虚函数,即该派生类也是抽象。
3.选择题3.1在C++中,要实现动态联编,必须使用(D)调用虚函数。
A.类名B.派生类指针C.对象名D.基类指针3.2下列函数中,不能说明为虚函数的是(C)。
A.私有成员函数B.公有成员函数C.构造函数D.析构函数3.3在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(A)。
A.相同B.不同C.相容D.部分相同3.4当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中(A)。
A.都是虚函数B.只有被重新说明时才是虚函数C.只有被重新说明为virtual时才是虚函数D.都不是虚函数3.5(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。
A.虚析构函数B.虚构造函数C.纯虚函数D.静态成员函数3.6 以下基类中的成员函数,哪个表示纯虚函数(C)。
A.virtual void vf(int);B.void vf(int)=0;C.virtual void vf( )=0;D.virtual void vf(int){ }3.7下列描述中,(D)是抽象类的特性。
接口编程练习题在软件开发中,接口编程是一项非常重要的技能。
通过接口编程,我们可以实现不同模块之间的通信和交互,提高代码的可复用性和可维护性。
为了帮助大家熟悉接口编程,我将给出一些接口编程的练习题,供大家实践和探索。
练习题一:接口定义请定义一个名为"Shape"的接口,具有计算面积和计算周长的两个方法。
这个接口可以被不同的图形类实现,比如圆形、正方形等。
每个图形类都需要实现这两个方法,并根据具体的形状计算出相应的面积和周长。
练习题二:接口的实现请创建一个圆形类"Circle",实现上述"Shape"接口,并根据半径计算圆形的面积和周长。
具体的计算公式可以自行选择。
练习题三:多态性应用请创建一个方法"printShapeInfo",接收一个"Shape"类型的参数,并打印该图形的面积和周长信息。
在方法内部,借助接口的多态性,可以接收不同形状的图形对象,并调用对应的方法。
练习题四:接口的扩展请思考并设计一个扩展"Shape"接口的子接口或实现类,增加计算体积的方法。
然后创建一个相应的图形类,实现该接口,并实现计算体积的方法。
练习题五:接口的应用场景请思考并描述在实际项目中,接口编程可以带来哪些好处和应用场景。
举例说明接口编程在实践中的应用情景,以及通过接口编程实现的功能和效果。
通过以上的练习题,我们可以初步了解和掌握接口编程的基本概念和用法。
接口编程的灵活性和可扩展性使得我们可以更好地进行模块化开发和代码复用,提高项目的开发效率和质量。
在实际的软件开发中,合理地运用接口编程可以帮助我们更好地组织和管理代码,提高系统的可维护性和可拓展性,是一个非常重要的编程技能。
希望大家通过这些接口编程的练习题,能够更加深入地理解和应用接口编程的思想和方法,为自己的软件开发能力提升打下坚实的基础。
希望大家能够在实践中不断探索和学习,不断提高自己的编程水平。
C++习题3(继承和多态)C++习题3(继承和多态)一、选择题1、在C++中,类与类之间的继承关系具有( C )A)自反性 B)对称性 C)传递性 D)反对称性2、在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制 B)保持不变 C)受保护 D)不受保护3、按解释中的要求在下列程序划线处填入的正确语句是:( C )#include class Base{public:void fun(){cout<<"Base::fun"<<=""> fun()cout<<"Derived::fun"<fun();4、在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制 B)保持不变 C)受保护 D)不受保护5、在哪种派生方式中,派生类可以访问基类中的protected 成员(B )A)public和private B)public、protected和private C)protected和private D)仅protected6、当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A)public成员 B)private成员 C)protected成员 D)友元7、不论派生类以何种方法继承基类,都不能使用基类的(B )A)public成员 B)private成员 C)protected成员 D)public成员和protected成员8下面叙述错误的是(S )。
A )基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的 D)基类的protected 成员不能被派生类的对象访问9、下列说法中错误的是(S )。
动物学练习题一一、是非题(对的打“√”,错的打“×”)1.双名法是国际上对种统一采用的命名法,它是由拉丁文或拉丁化的文字组成,属名在前,种名在后,属名和种名的第一个字母都要大写。
()2.生物重演律指出系统发育能够重演个体发育的主要过程。
()3.原生动物是单细胞构成的完整的有机体,作为一个动物体是最简单的,但作为一个细胞却很复杂。
()4.有些原生动物以群体的形式存在。
()5.草履虫在有光的情况下进行光合营养,无光情况下进行吞噬营养。
()6.海绵动物和腔肠动物都是两胚层动物。
( )7.海绵动物是一类在海里行漂浮生活的动物。
(×)8.海绵动物又称为多孔动物或侧生动物。
()9.海绵动物无真正的胚层,只有原始的细胞分化,无明确的组织。
()10.海绵动物是最原始最低等的多细胞动物,它有了细胞分化,但没有明确的组织。
()11.海绵动物的体腔不发达,因此它是最原始最低等的多细胞动物。
()12.海绵动物是真正后生动物的开始。
()13.腔肠动物的水管系统与棘皮动物的水管系统同源,都是属于次生体腔的一部分。
( )14.腔肠动物是两胚层动物。
()15.腔肠动物具有两种基本形态:水螅型和水母型。
()16.珊瑚全部生活在海洋中。
()17.腔肠动物是一类比较高等的原生动物。
()二.填空题:1.动物界的分类阶梯是______、______、______、______、______、______;用英文表示分别是______、______、______、______、______和______。
2.五界学说将生物分为以下五个界:_______界、_______界、_______界、_______界和_______界。
3.动物的四大组织为:________、________、________、________。
4.动物命名的双名法由两部分组成,第一部分是该物种的,第二部分是该物种的,最后加上定名人。
5.一群相同或相似的细胞及其相关的非细胞物质彼此以一定的形式连接,并形成一定的结构,担负一定的功能,称为。
面向对象练习题一、选择题1. 在面向对象编程中,以下哪个概念不是面向对象的核心概念?A. 封装B. 继承C. 多态D. 函数2. 以下哪个选项是Java语言中实现多态的方式?A. 通过继承B. 通过接口C. 通过重载D. 通过重写3. 在面向对象编程中,一个类可以有多少个父类?A. 0个或1个B. 1个C. 多个D. 无数个4. 以下哪个关键字在Java中用于定义一个类?A. structB. classC. interfaceD. enum5. 以下哪个是Java中创建对象的关键字?A. newB. createC. instanceD. object二、填空题6. 在面向对象编程中,______ 是指将数据和操作这些数据的方法结合在一起。
7. 一个类可以包含______ 和______ 两种成员。
8. 封装的目的是______ 数据,并对外部隐藏内部细节。
9. 继承可以使得子类获得父类的______ 和______。
10. 多态性允许不同类的对象对同一消息做出响应,但具体______ 取决于对象的实际类型。
三、简答题11. 简述面向对象编程的三大特性,并举例说明它们在实际编程中的应用。
12. 解释什么是接口,并说明接口与抽象类的区别。
13. 描述如何使用Java实现一个简单的类,并说明如何创建该类的实例。
四、编程题14. 编写一个Java类`Person`,包含属性`name`和`age`,以及一个方法`introduce()`,该方法输出个人信息。
15. 假设你已经有一个名为`Animal`的抽象类,它包含一个抽象方法`makeSound()`。
编写一个名为`Dog`的类,继承自`Animal`,并实现`makeSound()`方法,使得`Dog`对象调用该方法时输出"Woof!"。
16. 创建一个Java程序,包含一个名为`Vehicle`的类,它有一个属性`speed`和一个方法`increaseSpeed(int increment)`。
●第一章Java入门●第二章数据类型和运算符●第三章流程控制与数组●第四章封装●第五章继承●第六章抽象类与接口●第七章多态●第八章异常●第九章多线程机制●第十章输入输出流●第十一章使用泛型和集合框架●第十二章基于Swing的图形用户界面(GUI)设计●第十三章Java事件驱动编程第一章练习题(Java入门)1.下列哪项不是JDK所包含的内容?(选一项)A.Java编程语言B.工具及工具的APIC.Java EE扩展APID.Java平台虚拟机2.下列关于JDK、JRE和JVM的描述。
哪项正确?A.JDK中包含了JRE,JVM中包含了JREB.JRE中包含了JDK,JDK中包含了JVMC.JRE中包含了JDK,JVM中包含了JRED.JDK中包含了JRE,JRE中包含了JVM3.下列哪个工具可以编译java源文件?A.javacB.jdbC.javadocD.junit4.JDK工具javadoc的作用是哪项?A.生成Java文档B.编译Java源文件C.执行Java类文件D.测试Java代码5.以下哪些包是Java标准库中常用的包?(选三项)A.java.langB.javax.servlet .httpC.j ava. ioD.java.sql6.使用JDK工具生成的Java文档的文件格式是?A.XML格式B.自定义格式c.二进制格式D.HTML格式7.以下关于JVM的叙述,哪项正确?(选两项)A.JVM运行于操作系统之上,它依赖于操作系统B.JVM运行于操作系统之上,它与操作系统无关C.JVM支持Java程序运行,它能够直接运行Java字节码文件D.JVM支持Java程序运行,它能够直接运行Java源代码文件8.以下关于支持Java运行平台的叙述,哪项错误?A.Java可在Solaris平台上运行B.Java可在Windows平台上运行C.Java语言与平台无关。
Java程序的运行结果依赖于操作系统D.Java语言与平台无关。
多态性10.2 典型例题分析与解答例题1:指出下列对定义重载函数的要求中,哪些是错误的提法。
A.要求参数的个数不同。
B.要求参数中至少有一个类型不同。
C.求函数的返回值不同。
D. 要求参数的个数相同时,参数类型不同。
答案: C例题3:下面关于友元的描述中,错误的是()。
A. 友元函数可以访问该类的私有数据成员B. 一个类的友元类中的成员函数都是这个类的友元函数C. 友元可以提高程序的运行效率D. 类与类之间的友元关系可以继承答案:D1例题4:下述静态成员的特性中,()是错误的。
A. 静态成员函数不能利用this指针B. 静态数据成员要在类体外进行初始化C. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符D. 静态数据成员不是所有对象所共有的答案:D例题5:关于虚函数的描述中,()是正确的。
A. 虚函数是一个静态成员函数B. 虚函数是一个非成员函数C. 虚函数既可以在函数说明时定义,也可以在函数实现时定义D. 派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型参考答案:D2例题11:分析下列程序的输出结果。
#include <iostream.h>class A{public:A() { cout<<"A's cons."<<endl; }virtual ~A() { cout<<"A's des."<<endl; }virtual void f() { cout<<"A's f()."<<endl; } void g() { f(); }};class B : public A{public:B() { f(); cout<<"B's cons."<<endl; }3~B() { cout<<"B's des."<<endl; }};class C : public B{public:C() { cout<<"C's cons."<<endl; }~C() { cout<<"C's des."<<endl; }void f() { cout<<"C's f()."<<endl; }};void main(){ A *a=new C;a->g();delete a;}4运行结果:A's cons.A's f().B's cons.C's cons.C's f().C's des.B's des.A's des.10.3 教材习题解答1.选择题(1)下列关于动态联编的描述中,错误的是()。
第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。
这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。
答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。
如有任何不同,则认为是(5)而不是虚函数。
除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。
答案:(1)同虚函数名(2)同参数表(3)同返回类型。
如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。
一、Java基础语法1.1. 数据类型int a = 10;double b = 3.14;char c = 'A';boolean d = true;1.2. 变量声明与赋值声明一个整型变量并赋值为100。
声明一个字符串变量并赋值为"Hello, World!"。
声明一个布尔型变量并赋值为false。
1.3. 运算符计算 5 + 6 2 的结果。
计算 (10 / 3) 2 的结果。
将变量 a 的值增加 5。
1.4. 条件语句如果变量 a 大于 10,输出 "a is greater than 10"。
如果变量 b 小于 0,输出 "b is negative"。
如果变量 c 等于 'A',输出 "c is 'A'".1.5. 循环语句使用 for 循环输出 1 到 10 的所有整数。
使用 while 循环输出 1 到 5 的所有整数。
使用 dowhile 循环输出 1 到 3 的所有整数。
二、面向对象编程2.1. 类与对象定义一个名为 Person 的类,包含 name 和 age 两个属性。
创建一个 Person 对象,并设置其 name 为 "John" 和 age 为25。
2.2. 构造方法修改 Person 类,添加一个构造方法,接收 name 和 age 作为参数。
创建一个 Person 对象,并使用构造方法设置其属性。
2.3. 方法在 Person 类中添加一个方法,用于输出对象的 name 和 age。
创建一个 Person 对象,并调用其方法输出信息。
2.4. 继承定义一个名为 Student 类,继承自 Person 类。
在 Student 类中添加一个属性:score。
创建一个 Student 对象,并设置其 name、age 和 score。
多态的练习题多态(Polymorphism)是面向对象编程的重要特性之一,在实际应用中起到了非常关键的作用。
掌握多态的概念和使用方法对于提高程序的灵活性和可扩展性至关重要。
本文将介绍一些多态的练习题,帮助读者巩固对多态的理解和运用。
1. 题目一:动物的叫声我们有多种动物,包括狗、猫和鸟等,它们都有自己特有的叫声。
请使用多态的方式来实现一个动物类 Animal,以及各个具体动物的子类(Dog、Cat、Bird)。
在 Animal 类中定义一个名为 makeSound 的方法,用于输出不同动物的叫声。
在子类中重写该方法,分别输出对应动物的叫声。
示例代码:```javapublic class Animal {public void makeSound() {System.out.println("动物发出叫声");}}public class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("狗狗汪汪叫"); }}public class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}}public class Bird extends Animal {@Overridepublic void makeSound() {System.out.println("鸟儿唧唧叫"); }}public class Main {public static void main(String[] args) { Animal[] animals = new Animal[3];animals[0] = new Dog();animals[1] = new Cat();animals[2] = new Bird();for (Animal animal : animals) {animal.makeSound();}}}```2. 题目二:几何图形的面积计算我们有三种几何图形:圆形、矩形和三角形,它们都有自己对应的面积计算公式。
第4章继承与多态一.选择题1. 编译和运行以下两文件结果是( D )。
//文件P1.javapackage MyPackage;class P1{void afancymethod(){System.out.println("What a fancy method");}}//文件P2.javapackage YourPackage;import MyPackage.*;public class P2 extends P1{public static void main(String argv[]){P2 p2 = new P2();p2.afancymethod();}}A.两个均通过编译,P2运行时输出What a fancy methodB.没一个通过编译C.两个均通过编译,但P2运行时出错D.P1 通过编译,但P2出现编译错误2.下列程序运行的结果是(A )。
package a;package b;public class D{public static void main(String args[]) {System.out.println("^_^,今天心情不错!");}}A.出现编译错误B.^_^,今天心情不错!C.通过编译,运行时出错D.以上都不对3.Java的核心类库中哪个包,Java系统能自动引入(B )。
A.java.io B.ngC. D.java.util4.下列程序运行结果是( A )。
private class Base{Base(){int i = 100;System.out.println(i);}public class Pri extends Base{static int i = 200;public static void main(String argv[]){Pri p = new Pri();System.out.println(i);}}A.编译错误B.200 C.100 200 D.1005.下列程序运行结果是(C )。
1、生成表示学生的类XS,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄,并将他们全部定义为纯虚函数;生成CZS类表示初中生,包含数据成员xm、xb和nl表示学生的姓名、性别和年龄,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄;再生成类GZS表示高中生和类DXS表示大学生,同样包含相同含义的数据成员xm、xb和nl,也包括成员函数dispXM()、dispXB()和dispNL()。
要求:(1)设计和实现基本类XS(2)设计和实现派生类CZS,GZS和DXS(3)分别生成CZS、GZS、DXS类对象(4)将CZS、GZS、DXS类对象的指针赋给指针赋给XS类的指针变量。
(5)分别用XS类的指针和引用访问dispXM()、dispXB()和dispNL()函数。
(6)观察程序结果。
#include <iostream>#include <string.h>using namespace std;class XS{public:virtual void dispXM()=0;virtual void dispXB()=0;virtual void dispNL()=0;};class CZS:public XS{public:CZS(char * m="张三",int b=1,int n=14);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};CZS::CZS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void CZS::dispXM(){cout<<"name:"<<xm<<endl;}void CZS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl;}void CZS::dispNL(){cout<<"age:"<<nl<<endl;}class GZS:public XS{public:GZS(char * m="张三",int b=1,int n=17);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};GZS::GZS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void GZS::dispXM(){cout<<"name:"<<xm<<endl;}void GZS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl;}void GZS::dispNL(){cout<<"age:"<<nl<<endl;}class DXS:public XS{public:DXS(char * m="张三",int b=1,int n=20);void dispXM();void dispXB();void dispNL();protected:char xm[9];int xb,nl;};DXS::DXS(char *m,int b,int n){strcpy(xm,m);xb=b,nl=n;}void DXS::dispXM(){cout<<"name:"<<xm<<endl;}void DXS::dispXB(){if(xb==1)cout<<"Man"<<endl;if(xb==0)cout<<"Woman"<<endl; }void DXS::dispNL(){cout<<"age:"<<nl<<endl;}void displayP(XS *p){p->dispXM();p->dispXB();p->dispNL();}void displayR( XS &p){p.dispXM();p.dispXB();p.dispNL();}void main(){CZS czs("赵一",1,12);GZS gzs("钱二",0,15);DXS dxs("孙三",1,18);XS *p;//定义抽象基类的指针变量pp=&czs;//将初中生对象czs的地址赋给pdisplayP(p);p=&gzs;//将高中生对象czs的地址赋给pdisplayP(p);p=&dxs;//将大学生对象czs的地址赋给pdisplayP(p);cout<<"\n----------------------------------------\n";XS &r1=czs;//定义抽象基类的引用变量r1为czs的别名displayR(r1);XS &r2=gzs;//定义抽象基类的引用变量r2为czs的别名displayR(r2);XS &r3=dxs;//定义抽象基类的引用变量r3为czs的别名displayR(r3);cout<<"\n----------------------------------------\n";}2、某小型公司主要有3类人员:经理、兼职技术人员、兼职销售员。
这些人员分别具有以下属性。
经理:姓名、编号、固定工资、当月薪水、计算月薪、显示信息兼职技术人员:姓名、编号、工作小时、每小时工资额、当月薪水、计算月薪、显示信息;兼职销售员:姓名、编号、销售额、销售额提成、当月薪水、计算月薪、显示信息要求:人员编号基数为1000,每输入一个人员信息编号顺序加1月薪计算办法是经理固定月薪8000元;兼职技术人员按100元/小时领取月薪;兼职推销员按当月销售额的4%提成。
根绝题目要求,设计一个基类employee,然后派生出technician (兼职技术人员)类、manager(经理)类和salesman(兼职销售员)类。
部分成员函数设置为虚函数将“<<”和“>>”运算符#include <iostream>#include <iomanip>#include <string.h>#include <fstream>using namespace std;const int Maxr=100;class Employee //职工类{int tag;//删除标记int no;//职工编号char name[20];char zw[20];//职工姓名int salary;//职工工资public:Employee(){}char *getname() {return name;}//获取名字int gettag() {return tag;}//获取标记int getno() {return no;}//获取编号int getsalary(){return salary;}void setzw(char q[])//设置名字{strcpy(zw,q);}void setname(char na[])//设置名字{strcpy(name,na);}void getsalary(int sa){salary=sa;}void delna(){tag=1;}//删除void addemp(int n,int sa,char *na,char *q)//增加{tag=0;no=n;salary=sa;strcpy(name,na);strcpy(zw,q);}void disp()//显示职工信息{cout < <"│" < <setw(10) < <no < <"│" < <setw(10) < <name < <"│" < <setw(10) < <salary < <"│" < <setw(10) < <zw < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;}};class Database//职工数据类{int top;Employee read[Maxr];public:Database()//将职工信息从employee.txt读取到read[]中{ Employee s;top=-1;fstream file("employee.txt",ios::in);while (1){((char *)&s,sizeof(s));if (!file) break;top++;read[top]=s;}();}void clear()//删除所有{top=-1;}int addemp (int n, int sa,char *na,char*q) //增加职工{Employee *p=query(n);if (p==NULL){top++;read[top].addemp(n,sa,na,q);return 1;}return 0;}Employee *query(int empid){for (int i=0;i <=top;i++)if (read[i].getno()==empid && read[i].gettag()==0) return &read[i];return NULL;}Employee *query1(char empna[20]){for (int i=0;i <=top;i++)if ((read[i].getname()==empna) && read[i].gettag()==0)return &read[i];return NULL;}void disp() //职工信息显示{for (int i=0;i <=top;i++)read[i].disp();}void empdata();~Database() //将read[]中的信息读如到employee.txt中{fstream file("employee.txt",ios::out);for (int i=0;i <=top;i++)if (read[i].gettag()==0)((char *)&read[i],sizeof(read[i]));();}};void Database::empdata()//职工维护{int choice=1;int m=1;int b=1;char rname[20];int empid; int empsa;char q[20];Employee *r;while (choice!=0){cout < <"职工维护1:新增2:更改3:删除4:查找5:显示6:全删0:退出=>"; cin>>choice;switch (choice){case 1:cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ 经理:1,并按回车键│\n";cout < <setw(50) < <" │ 业务经理:2,并按回车键│\n";cout < <setw(50) < <" │ 普通职工:3,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>m;while(m!=0){switch(m){case 1:cout < <"输入经理编号:";cin>>empid;cout < <"输入奖金: ";cin>>empsa;cout < <"输入经理姓名:";cin>>rname;addemp(empid,8000+empsa,rname,"经理"); break;case 2:cout < <"输入业务经理编号:";cin>>empid;cout < <"输入月提成: ";cin>>empsa;cout < <"输入业务经理姓名:";cin>>rname;addemp(empid,4000+empsa,rname,"业务经理"); break;case 3:cout < <"输入职工编号:";cin>>empid;cout < <"输入工资: ";cin>>empsa;cout < <"输入职工姓名:";cin>>rname;addemp(empid,empsa,rname,"普通职工"); break;}break;}break;case 2:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该职工不存在" < <endl;break;}cout < <"输入新的工资:" < <endl;cin>>empsa;r->getsalary(empsa);cout < <"请输入新的职务" < <endl;cin>>q;r->setzw(q);addemp(empid,empsa,rname,q);break;case 3:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该读者不存在" < <endl;break;}r->delna();break;case 4:cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ 按编号查找1,并按回车键│\n";cout < <setw(50) < <" │ 返回2,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>b;while(b!=0){switch(b){case 1:cout < <"输入职工编号:";cin>>empid;r=query(empid);if (r==NULL){cout < <"该职工不存在" < <endl;break;}cout < <"├—————┼—————┼—————┼—————┤" < <endl;cout < <"│" < <setw(10) < <"编号" < <"│" < <setw(10) < <"姓名" < <"│" < <setw(10) < <"工资" < <"│" < <setw(10) < <"职务" < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;r->disp();break;case 2:break;}break;}break;case 5:cout < <"├—————┼—————┼—————┼—————┤" < <endl;cout < <"│" < <setw(10) < <"编号" < <"│" < <setw(10) < <"姓名" < <"│" < <setw(10) < <"工资" < <"│" < <setw(10) < <"职务" < <"│" < <endl;cout < <"├—————┼—————┼—————┼—————┤" < <endl;disp();break;case 6:clear();break;}}}void main(){int choice=1;Database EmpDB;while(choice!=0){cout < <"***************************************************************************** ***" < <endl;cout < <endl;cout < <endl;cout < <setw(20) < <"******************************欢迎使用职工管理系统******************************" < <endl;cout < <endl;cout < <endl;cout < <setw(50) < <" ┌—————————————┐\n";cout < <setw(50) < <" │ 请选择您所需的操作│\n";cout < <setw(50) < <" │ │\n";cout < <setw(50) < <" │ 操作1,并按回车键│\n";cout < <setw(50) < <" │ │\n";cout < <setw(50) < <" │ 返回0,并按回车键│\n";cout < <setw(50) < <" └—————————————┘\n";cin>>choice;switch(choice){case 1:while(1){cout < <setw(20);EmpDB.empdata();break;break;}}}}3、堆栈的特点是:先进先出定义了一个堆栈类stack,包括初始化,压栈(就是将元素放在栈顶)、弹栈(取栈顶的一个元素),释放堆栈等操作要求运用模版实现,堆栈中可以根据需求放入double、int、char*等数据对象。