实验六 继承三 —— 多继承及继承的应用

合集下载

继承的应用实验报告

继承的应用实验报告

一、实验目的1. 理解继承的概念和作用。

2. 掌握Java中继承的实现方法。

3. 学习如何利用继承提高代码复用性。

4. 通过实验加深对继承的理解和应用。

二、实验环境1. 操作系统:Windows 102. 编译器:Eclipse IDE3. 编程语言:Java三、实验内容1. 创建一个基类:Animal,包含属性name和方法eat()。

2. 创建两个派生类:Dog和Cat,分别继承自Animal类,并添加各自特有的属性和方法。

3. 创建一个主类:TestInheritance,在主函数中创建Animal、Dog和Cat的对象,并调用它们的方法。

四、实验步骤1. 创建基类Animal:```javapublic class Animal {private String name;public Animal(String name) { = name;}public void eat() {System.out.println(name + " is eating."); }}```2. 创建派生类Dog:```javapublic class Dog extends Animal {private String breed;public Dog(String name, String breed) {super(name);this.breed = breed;}public void bark() {System.out.println(name + " is barking."); }}```3. 创建派生类Cat:```javapublic class Cat extends Animal {private String color;public Cat(String name, String color) {super(name);this.color = color;}public void meow() {System.out.println(name + " is meowing."); }}```4. 创建主类TestInheritance:```javapublic class TestInheritance {public static void main(String[] args) {Animal animal = new Animal("Animal");Dog dog = new Dog("Buddy", "Labrador");Cat cat = new Cat("Kitty", "Black");animal.eat();dog.eat();dog.bark();cat.eat();cat.meow();}}```五、实验结果与分析1. 运行主类TestInheritance,观察控制台输出:```Animal is eating.Buddy is eating.Buddy is barking.Kitty is eating.Kitty is meowing.```2. 分析结果:(1)Animal类作为基类,包含一个私有属性name和一个方法eat()。

c#第6章 继承与多态性

c#第6章 继承与多态性

例如: 例如: class Humen { public string name; name; public string sex; sex; public string work ; } class Teacher:Humen Teacher: { public string speciality ; public string department; department; } Human是基类 Teacher是派生类 Human是基类,Teacher是派生类,它拥有基类 是基类, 是派生类, 的全部成员。 的全部成员。
派生类隐藏基类成员 :用new关键字。 new关键字 关键字。 隐藏基类的字段成员: 隐藏基类的字段成员: 派生类可以声明与基类有相同的名称和类型的字 派生类可以声明与基类有相同的名称和类型的字 段成员来隐藏基类的字段。 来隐藏基类的字段 段成员来隐藏基类的字段。这时通过派生类引用 或对象访问的是派生类的字段, 或对象访问的是派生类的字段,基类的相应成员 被屏蔽了。但是通过指向派生类对象的基类引用 被屏蔽了。但是通过指向派生类对象的基类引用 访问的则是基类的字段。 访问的则是基类的字段。 隐藏基类的方法成员: 隐藏基类的方法成员: 派生类可以声明与基类有相同的方法名称和形参 表的方法成员来隐藏基类的方法 基类的方法, 表的方法成员来隐藏基类的方法,与返回类型无 这时通过派生类引用或对象访问的是派生类 关。这时通过派生类引用或对象访问的是派生类 的方法成员,基类的相应方法成员被屏蔽了。 的方法成员,基类的相应方法成员被屏蔽了。但 是通过指向派生类对象的基类引用访问的则是基 指向派生类对象的基类引用访问的则是 是通过指向派生类对象的基类引用访问的则是基 类的成员。 类的成员。 派生类中可以通过 可以通过base关键字访问被隐藏的基 在派生类中可以通过base关键字访问被隐藏的基 类成员。 类成员。 详见例MaskBase。 详见例MaskBase。

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接⼝和异常处理实验5 继承、多态、接⼝和异常处理⼀、实验⽬的1、掌握Java的类和对象的声明和使⽤⽅法;2、掌握Java的类的继承和实现⽅法;3、掌握多态性在类的继承中的运⽤;4、掌握接⼝的定义与使⽤;5、掌握基本异常的处理机制;6、熟悉try语句与catch语句的搭配使⽤;7、了解有异常处理与没有异常处理的差别;8、多重catch语句的使⽤;9、使⽤Throws声明异常和Throw抛出异常。

⼆、实验环境1、PC微机;2、DOS操作系统或 Windows 操作系统;3、Java sdk程序开发环境、eclipse集成环境。

三、实验内容1. 设计三个类,分别是学⽣类Student,本科⽣类UnderGraduate,研究⽣类Postjgraduate,其中Student类是⼀个抽象类,它包含学⽣的基本信息如姓名、所学课程、课程成绩等,⽽Undergraduate类和Postgraduate类都是Student类的⼦类,这两个类计算课程成绩等级的⽅法有所不同,如下表所⽰。

假设某班级⾥既有研究⽣⼜有本科⽣,编写程序统计出全班学⽣2. 和Mobilephone具体实现,并设计⼀个应⽤程序类来使⽤这些类。

3.要求设计⼀个GUI图形窗⼝程序,该程序让⽤户输⼊⼀个星期中的任意⼀天的数字1-7,然后输出该数字所对应的是星期⼏。

四、实验步骤实验内容⼀1.建⽴package experiment5_1,其最终⽬录结构如下:2.建⽴Student类:package experiment5_1;public abstract class Student {final static int CourseNo = 3;String name;String type;int[] courses;String courseGrade;public Student(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name; courses = new int[CourseNo];courseGrade = "" ;}public abstract void calculateGrade();public String getName( ) {return name;}public String getType( ) {return type ;}public String getCourseGrade( ) {return courseGrade;}public int getCourseScore(int courseNumber) {return courses[courseNumber];}public void setName(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name;}public void setType(String type) {this.type = type;}public void setCourseScore(int courseNumber, int courseScore) { //按课程索引号设置课程成绩this.courses[courseNumber] = courseScore ;}}3.建⽴外部类(1)研究⽣类Postjgraduatepackage experiment5_1;public class postgraduate extends Student {public postgraduate(String name) {super(name);type = "研究⽣";}public void calculateGrade() {// TODO Auto-generated method stubint total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += courses[i];};average = total / CourseNo;if (average>=90&&average<100) courseGrade = "优秀"; else if (average>=80&&average<90) courseGrade = "良好"; else if (average>=70&&average<80) courseGrade = "⼀般"; else if (average>=60&&average<70) courseGrade = "及格"; else courseGrade = "不及格";}}(2)本科⽣类UnderGraduatepackage experiment5_1;public class undergraduate extends Student {public undergraduate(String name ) {super(name);type = "本科⽣";}public void calculateGrade() {int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += getCourseScore(i) ;};average = total / CourseNo;if (average>=80&&average<100) courseGrade = "优秀"; else if (average>=70&&average<80) courseGrade = "良好"; else if (average>=60&&average<70) courseGrade = "⼀般"; else if (average>=50&&average<60) courseGrade = "及格"; else courseGrade = "不及格";}}4.编写代码测试函数package experiment5_1;public class polymorphism {public static void main(String[] args) {Student[] students = new Student[5];students[0] = new undergraduate("陈建平");students[1] = new undergraduate("鲁向东");students[2] = new postgraduate("匡晓华");students[3] = new undergraduate("周丽娜");students[4] = new postgraduate("梁欣欣");for (int i=0; i<5 ;i++) {students[i].setCourseScore(0,87);students[i].setCourseScore(1,90);students[i].setCourseScore(2,78);}for (int i=0; i<5 ;i++) {students[i].calculateGrade();}System.out.println("姓名" + " 类型" +" 成绩");System.out.println("-----------------------");for (int i=0; i<5 ;i++) {System.out.println(students[i].getName( )+" "+students[i].getType( )+" "+students[i].getCourseGrade( ));}}}实验内容⼆1.建⽴package experiment5_2,其最终⽬录结构如下:2.写接⼝Soundable代码:package experiment5_2;public interface Soundable {public void increaseV olume( );public void decreaseV olume( );public void stopSound( );public void playSound( );}3.创建三个类Radio、Walkman和Mobilephone具体实现,分别添加代码:// Mobilephone类package experiment5_2;class Mobilephone implements Soundable{public void increaseV olume( ) {System.out.println("增⼤⼿机⾳量");}public void decreaseV olume( ) {System.out.println("减⼩⼿机⾳量");}public void stopSound( ) {System.out.println("关闭⼿机");}public void playSound( ) {System.out.println("⼿机发出来电铃声");}}// Walkman类package experiment5_2;class Walkman implements Soundable { public void increaseV olume( ) { System.out.println("增⼤随声听⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩随声听⾳量"); }public void stopSound( ) {System.out.println("关闭随声听");}public void playSound( ) {System.out.println("随声听发出⾳乐"); }}// Radio类package experiment5_2;class Radio implements Soundable{ public void increaseV olume( ) { System.out.println("增⼤收⾳机⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩收⾳机⾳量"); }public void stopSound( ) {System.out.println("关闭收⾳机");}public void playSound( ) {System.out.println("收⾳机播放⼴播"); }}4.创建people类及编写测试代码://People类package experiment5_2;class People {public void listen(Soundable s) {s.playSound( );}}//测试代码package experiment5_2;import java.util.Scanner;public class InterfaceTest {public static void main(String[] args) {int i;People sportsman = new People( );Scanner scanner = new Scanner(System.in);Soundable[] soundDevice = new Soundable[3];//往声⾳设备数组中放⼊能发声的设备soundDevice[0] = new Radio( );soundDevice[1] = new Walkman( );soundDevice[2] = new Mobilephone();System.out.println("你想听什么? 请输⼊选择:0-收⾳机1-随声听2-⼿机");i = scanner.nextInt( );//开始听声⾳sportsman.listen(soundDevice[i]);soundDevice[i].increaseV olume( );soundDevice[i].stopSound();scanner.close();}}实验内容三1.建⽴package experiment5_3,其最终⽬录结构如下package experiment5_3;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DateTransf extends JFrame implements KeyListener{/****/private static final long serialVersionUID = 1L;private static DateTransf frm;private static JTextField txt;private static JTextField data;DateTransf() {setTitle("数字与星期转换");setLocation(700, 300);setSize(400,130);}public static void main(String[] args) {frm = new DateTransf();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setLayout(new GridLayout(2,2));txt = new JTextField(12);data = new JTextField(12);JLabel lable1 = new JLabel("输⼊数字:");JLabel lable2 = new JLabel("星期⼏:");frm.add(lable1);txt.addKeyListener(frm);frm.add(txt);frm.add(lable2);frm.add(data);frm.setVisible(true);}public void keyPressed(KeyEvent e) {if (e.getSource() == txt) {if (e.getKeyCode() == KeyEvent.VK_ENTER) // 判断按下的键是否是回车键{try {int number = Integer.parseInt(txt.getText());switch (number) {case 1:data.setText("Mon");break;case 2:data.setText("Tue");break;case 3:data.setText("Wen");break;case 4:data.setText("Thu");break;case 5:data.setText("Fri");break;case 6:data.setText("Sat");break;case 7:data.setText("Sun");break;default:JOptionPane.showMessageDialog(null, "您输⼊的数字不是1~7","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMATION_MESSAGE); break;}}catch (Exception e1) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "您输⼊的不是整数","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMA TION_MESSAGE); }}}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}2.编译运⾏五、实验结果●实验内容⼀结果:●实验内容⼆结果:●实验内容三结果:六、实验⼩结1.这次实验的内容⽐较多,需要掌握Java的类和对象的声明和使⽤⽅法、Java的类的继承和实现⽅法、多态性在类的继承中的运⽤、接⼝的定义与使⽤、基本异常的处理机制、try语句与catch语句的搭配使⽤等等;2. 在实验过程中,重点是要区分好实例和类,灵活掌握类的调⽤。

面向对象程序设计(物联网)大纲2019

面向对象程序设计(物联网)大纲2019

《面向对象程序设计》课程教学大纲[课程编号]:[英文名称]:Object Oriented Programming[课程性质]:专业课[先修课程]:物联网工程导论,程序设计基础[适用专业]:物联网工程[学分数]:4[总学时]:64[实践学时]:32一、课程的简介:《面向对象程序设计》是物联网工程专业的专业课。

课程主要任务是介绍面向对象编程技术-Java,通过学习Java语言中的数据类型,运算,语句结构及其程序设计的基本方法及Java 高级功能,目的是使学生掌握一门基于网络的程序设计语言,了解面向对象程序设计的基本概念与方法,掌握Java语言编程的方法和技术,进而学会利用Java语言学会解决一般应用问题;通过大量的程序实例和相关练习,逐步掌握Java的面向过程和面向对象的功能,从而掌握面向对象程序设计的基本知识和基本技能。

使学生了解最新的具有强大支持的计算机编程新语言Java ,加深对独立于操作平台、多任务、线程等概念的理解,并为后续的专业课程奠定程序设计基础。

二、课程教学总体要求:1.目标——课程注重软件理论知识和学术基础教学。

全面、系统地介绍Java语言的基础知识、运行机制、多种编程方法和技术,通过讲授这些构成Java应用程序的基本要素和必备知识,使学生理解并掌握面向对象的程序设计方法,建立牢固扎实的理论基础。

——掌握Java中常用工具类的使用,及用Java设计图形用户界面程序的方法和技巧。

相关技术涉及软件产业、信息产业和现代服务业,代表未来社会产业发展方向。

——培养学生应用Java解决和处理实际问题的思维方法与基本能力。

理解Java的平台无关性,掌握用Java语言进行面向对象程序设计的方法。

课程体系基本明确,软件人才培养能力基本形成,创新型复合型人才的社会需求不断提高。

2.知识——主要学习面向对象软件开发方面的基本理论和基本知识,接受从事研究与软件开发的基本训练,具有一般计算机相关工程的分析设计和解决实际问题的能力。

java实验指导书

java实验指导书

实验一java开发环境及语言基础实验目的(1)确保正确配置java开发环境。

(2)了解javac和java命令的使用。

(3)熟悉java中的运算符。

(4)掌握条件语句和循环语句的使用。

(5)掌握通过命令行参数接受数据。

(6)掌握用Scanner类接受数据。

实验内容(1)在控制台中输入java命令,查看输入结果。

(2)编写一个java程序,计算半径为3.0的圆周长和面积并输出结果。

(3)求a+aa+aaa+...+a...a(n个)的和,其中a为1~9之间的整数。

例如,当a=3、n=4时,求3+33+333+3333的和。

(4)给定一个正整数m,统计其位数,分别打印每一位数字,再按照逆序打印出各位数字。

(5)用Scanner类方法输入三角形三边求三角形面积。

实验要求(1)JDK的安装及配置。

(2)在DOS及eclipse下编辑、编译运行第一个java程序:hello world。

(3)求圆周长和面积用方法实现,主函数调用。

(4)从命令行输入1~9之间的整数a,当所求的和大与106时,输出相应的a值及所求的和值。

(5)用Scanner类的方法输入正整数m,m的值不应该超过99999,否则给出错误信息。

应引入包:import java.util.Scanner,然后在需要的方法中实例化对象:Scanner sc = new Scanner(System.in),最后调用对象的next方法,如int n=nextInt(),接受整数。

实验二数组实验目的(1)掌握数组的定义和使用方法。

(2)熟悉数组的排序、查找的方法。

(3)巩固循环的使用。

实验内容(1)使用for循环,将二维数组的行与列互换,即完成矩阵的转置。

(2)编写数组的排序程序。

(3)编写杨辉三角。

实验要求(1)编写一个界面1 选择排序2 冒泡排序3插入排序4 快速排序5 退出当选择1、2、3、4、5的时候完成相应的功能。

(2)杨辉三角形状为等腰三角形实验三字符串实验目的(1)掌握正则表达式的使用。

4继承和多重继承

4继承和多重继承
};
class BlackPerson:public Person { 人(Person) public: BlackPerson() { SetColor(black); } //... };
黑人类具有人类
的所有的属性和 方法,又有自己 的特殊之处(肤 色为黑色)。
人类: 父类(基类) 黑人类: 子类(派生 类) 黑人类与人类之 间是继承与被继 承的关系
参见下表:
• 存取方式与继承的关系:
public
存储类型 继承类型 public protected private
protected protected protected private
private 不可用 不可用 不可用
public protected private
举例
例如:
class Base {public: int m1; protected: int m2; private: int m3; }; class PrivateClass:private Base {public: void test() {m1=1;m2=2;m3=3;} };
}
判断上述程序的语句是否正确?
• 为什么?
四、派生类的构造函数和析构函数
• • • • 1 、单继承方式下派生类构造函数的定义 2、 多继承方式下派生类构造函数的定义 3 、派生类构造函数执行的次序 4、举例
1 、单继承方式下派生类构造函数的定义
• 定义格式如下: 派生类名::派生类构造函数名(参数表): 基类构造函数名(参数表) { //派生类构造函数的函数体 } 在这个定义格式中,派生类构造函数名后面内 的参数表中包括参数的类型和参数名,而基类 构造函数名后面括号内的参数表中只有参数名 而没有参数类型,并且这些参数必须是来源于 派生类的构造函数名后面括号内的参数。

类的继承与多态性实验报告

类的继承与多态性实验报告

类的继承与多态性实验报告目录1.介绍2.什么是多态3.多态在Java中的技术基础4.示例5.多态的好处6.总结介绍之前的文章介绍过类的封装性和继承性,现在是时候聊聊面向对象编程的三大特性之一的最后一个类的多态性了。

多态的基础是继承(包括了接口的实现)和方法的覆盖。

什么是多态多态对应的英文单词是polymorphism,百度翻译给出的翻译是:n.多型现象,多态性; 多机组合形式;按字面意思就是多种状态、形态、姿态等等,潜台词就是某个东西具有多种状态、形态、姿态等等。

那是什么东西呢?在面向对象的编程语言里面(当然就包括Java了)就是某个方法或函数。

那方法的多种状态、形态、姿态有是个什么意思呢?这其实是指同一个方法具有多个方法体,就是方法的实现。

而方法的相同与否是由方法签名决定的。

所以,多态其实本质上是指同一个类的同一个方法却具有不同的行为特征。

状态、形态、姿态指的就是行为特征。

多态在Java中的技术基础然而,在Java中,同一个类里面是不可能存在两个签名相同而实现不同的方法的,否则的话会导致无法判断该执行哪个方法,因此在编译时就会报错。

所以,肯定是在两个类中才有可能存在两个签名相同而实现不同的方法,一个实现在这个类,另一个实现在另一个类。

而如果这两个类毫无瓜葛,那么肯定就与多态的本质(同一个类的同一个方法却具有不同的行为特征)自相矛盾了。

所以,这两个类肯定是有某种联系的。

我们再想想,什么概念是能够让两个不同的类却又能称为同一个类的?答案就是类的继承/扩展,就是现实中的“某东西是某类东西”的概念,就是“具体和抽象”的思想。

比如,男人是人,女人也是人,男人类和女人类就借助于人类建立了某种联系,而人类具有的某个行为在男人类和女人类中是有着不同体现的,比如人类的吃饭这个行为,男人类的体现是狼吞虎咽,女人类的体现是细嚼慢咽。

例子不是很恰当,但意思就是这么个意思。

所以说,Java里面多态的技术基础就是方法的覆盖,当然,在Java中覆盖不仅仅发生在类的继承/扩展上,还可能发生在接口的实现上。

实验三 继承和多态

实验三 继承和多态

实验三继承和多态一、实验目的1.熟练掌握封装性,多态性的概念。

2.熟练掌握抽象类abstract的概念。

3.熟练掌握接口interface的概念。

4.熟练包package的概念以及编译运行的方法。

二、实验内容1.编写一个Java Application程序,该程序有个点Point类,它包含横坐标x和纵坐标y 两个属性,再给Point定义两个构造方法和一个打印点坐标的方法Show。

定义一个圆Circle 类,它继承Point类(它是一个点,圆心(Center)),除此之外,还有属性半径Radius,再给圆定义2个构造方法、一个打印圆的面积的方法PrintArea和一个打印圆中心、半径的方法Show(其中显示圆心可以用super.Show()的方式)。

编写一测试类,对其进行编译、运行。

结果如何?如去掉语句“super.Show();”,再看看运行结果。

理解程序中重载和多态性的运用。

2.完成以下步骤要求:(1)设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected类型的成员变量x和y,获取和设置x和y值的public方法。

(2)设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径的protected类型的成员变量r,获取和设置r值的public方法、计算圆面积的public 方法。

(3)设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的protected类型的成员变量h、获取和设置h值的public方法、计算圆柱体体积的public 方法。

(4)建立若干个Cylinder对象,输出其轴心位置坐标、半径、高及其体积的值。

3.学校中有老师和学生两类人,而在职研究生既是老师又是学生,对学生的管理和对教师的管理在他们身上都有体现。

(1)设计两个信息管理接口StudentInterface和TeacherInterfaceo其中,StudentInterface接口包括setFee方法和getFee方法,分别用于设置和获取学生的学费;TeacherInterface接口包括setPay方法和getPay方法,分别用于设置和获取教师的工资。

程序设计基础实验指导书

程序设计基础实验指导书

图A-1 C 语言程序的调试、运行步骤
图A-1 中,虚线表示当某一步骤出现错误时的修改路线。

运行时,无论是出现编译错误、连接错误,还是运行结果不对(源程序中有语法错误或逻辑错误),都需要修改源程序,并对它重新编译、连接和运行,直至将程序调试正确为止。

图A-2新建文件
如果程序已经输入过,可选择“文件”菜单的“打开”菜单项,并在查找范围中找到正确的文件夹,调入指定的程序文件。

3 程序保存
在打开的VC++界面上,可直接在编辑窗口输入程序,由于完全是Windows
入及修改可借助鼠标和菜单进行,十分方便。

当输入结束后,保存文件时,因指定扩展名“.C”,否则系统将按C++扩展名“.CPP”保存。

如图A-3所示。

图A-4 编译连接菜单图A-5 编译连接正确
图A-7 数据输入输出窗口
图A-9 关闭程序工作区。

OS实验六——精选推荐

OS实验六——精选推荐

OS实验六《操作系统》实验报告实验三进程管理及进程通信⼀.实验⽬的利⽤Linux提供的系统调⽤设计程序,加深对进程概念的理解。

体会系统进程调度的⽅法和效果。

了解进程之间的通信⽅式以及各种通信⽅式的使⽤。

⼆.实验准备复习操作系统课程中有关进程、进程控制的概念以及进程通信等内容(包括软中断通信、管道、消息队列、共享内存通信及信号量概念)。

熟悉本《实验指导》第五部分有关进程控制、进程通信的系统调⽤。

它会引导你学会怎样掌握进程控制。

阅读例程中的程序段。

三.实验⽅法⽤vi 编写c 程序(假定程序⽂件名为prog1.c)编译程序$ gcc -o prog1.o prog1.c 或$ cc -o prog1.o prog1.c运⾏$./prog1.o四.实验内容及步骤⽤v i编写使⽤系统调⽤的C语⾔程序。

1.编写程序。

显⽰进程的有关标识(进程标识、组标识、⽤户标识等)。

经过5 秒钟后,执⾏另⼀个程序,最后按⽤户指⽰(如:Y/N)结束操作。

编译运⾏结果:2.编写程序。

实现⽗进程创建⼀个⼦进程。

体会⼦进程与⽗进程分别获得不同返回值,进⽽执⾏不同的程序段的⽅法。

编译运⾏:思考:⼦进程是如何产⽣的?⼜是如何结束的?⼦进程被创建后它的运⾏环境是怎样建⽴的?答:⼦进程由fork()函数创建,通过exit()函数⾃我结束,⼦进程被创建后核⼼将为其分配⼀个进程表项和进程标识符,检查同时运⾏的进程数⽬,并且拷贝进程表项的数据,由⼦进程继承⽗进程的所有⽂件。

3.编写程序。

⽗进程通过循环语句创建若⼲⼦进程。

探讨进程的家族树以及⼦进程继承⽗进程的资源的关系。

程序如下:编译运⾏:思考:①画出进程的家族树。

⼦进程的运⾏环境是怎样建⽴的?反复运⾏此程序看会有什么情况?解释⼀下。

183922472248 2252 22542249 2251 22532250每⼀次运⾏返回的进程号都不相同,但是都符合家族进程树,出现这样的情况是由于系统本⾝就是随机分配进程号的。

java类的继承实验总结

java类的继承实验总结

java类的继承实验总结
在Java中,类的继承是面向对象编程的重要特性之一。

通过继承,子类可以从父类继承属性和方法,从而实现代码复用和层次化设计。

在实验过程中,我深入学习了Java的继承机制,总结了以下几点经验:
1. 子类可以继承父类的非私有属性和方法,可以重写父类的方法。

在重写方法时,要遵循Liskov替换原则,确保子类可以替换掉父类。

2. Java中只支持单继承。

利用接口可以实现多重继承的效果。

3. super关键字可以访问父类的属性和方法,也可以调用父类的构造方法。

4. 父类的构造方法会被自动调用,如果没有显式地调用super(),则会默认调用父类的无参构造方法。

如果父类没有无参构造方法,则需在子类中显式调用super()并传入相应的参数。

5. 子类构造方法中的第一行可以调用super(),也可以调用this()。

但是二者不能同时出现。

6. 父类和子类的引用可以相互转换,但是只能通过向上转型实现。

在向上转型时,子类的特有属性和方法会被隐藏。

通过这次实验,我更深刻地理解了Java的继承机制,并掌握了其在面向对象设计中的重要作用。

在今后的Java开发中,我将充分利用继承的优势,编写出更加优雅和高效的代码。

继承与多态性

继承与多态性

[标准实验报告]南昌航空大学实验报告2011 年11 月12 日课程名称:面向对象程序设计B 实验名称:继承与多态性班级:10202327 姓名:吕潇同组人:指导教师评定:签名:一、实验目的根据现有类建立新类;学习构造基类和虚函数的用法。

二、实验内容(本次实验要完成的内容)应用VC++6.0的编辑环境构造一个类Jhtx及其派生类,该类主要实现关于几何图形的基本操作。

对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。

试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。

三、概要设计(实现的功能,函数原型及说明等)对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。

试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。

Geometry(double c) 基类构造函数初始化{r=c;}virtual void GetArea()=0; 求面积的纯虚函数原型virtual void GetPeriMeter()=0; 求周长的纯虚函数原型virtual void GetColume()=0; 求体积的纯虚函数原型四、详细设计(程序中核心代码,并要有相应注释——函数功能、参数说明、重要语句的注解)class Geometry{ 抽象基类public:Geometry(double c){r=c;}//~Geometry();virtual void GetArea()=0; 分别用于求面积周长virtual void GetPeriMeter()=0; 体积的纯虚函数原型virtual void GetColume()=0;protected:double r;};--------------------------------------------------------------class Rectangle:public Geometry{public: 矩形派生类virtual void GetColume(){} 纯虚函数的重定义Rectangle(double a,double b,double c):Geometry(c){x=a;y=b; } 构造函数初始化//~Rectangle();void GetArea() 求面积的纯虚函数{ 在派生类中的重定义cout<<"The Rectangle's Area is";cout<<x*y<<endl;}void GetPeriMeter(){ 纯虚函数重定义cout<<"The Rectangle's PeriMeter is";cout<<2*(x+y)<<endl;}protected:double x;double y;};-------------------------------------------------------------------class Circle:public Geometry{ 派生类圆的类public:virtual void GetColume(){}Circle(double c):Geometry(c) 构造函数{}//~Circle();virtual void GetArea() 求面积的纯虚函数的重定义{cout<<"The Circle's Area is";cout<<3.14*r*r<<endl;}virtual void GetPeriMeter() 求周长的纯虚函数的重定义{cout<<"The Circle's PeriMeter is";cout<<2*3.14*r<<endl;}};------------------------------------------------------------class Ball:public Circle{ 圆的派生类球的类public:Ball(double c):Circle(c){ }virtual void GetArea() 求面积的纯虚函数的重定义{cout<<"The Ball's Surface Area is";cout<<6*3.14*r*r<<endl;}virtual void GetColume() 求体积的纯虚函数的重定义{cout<<"The Ball's V olume is";cout<<(4/3)*3.14*r*r*r<<endl;}//~Ball();};-------------------------------------------------------------------class Column:public Circle{ 园的派生类圆柱的类public:Column(double h,double c):Circle(c){H=h;}virtual void GetArea() 求面积的纯虚函数的重定义{cout<<"The Column's Surface Area is";cout<<(2*3.14*r*r)+(2*3.14*r*H)<<endl;}virtual void GetColume() 求体积的纯虚函数的重定义{cout<<"The Column's V olume is";cout<<3.14*r*r*H<<endl;}//~Column();protected:double H;};五、程序调试(包括调试过程中遇到的问题及解决方法、程序测试数据及结果)class Ball:public Circle{Public:Ball(double c):Circle(c){ }virtual void GetArea(){cout<<"The Ball's Surface Area is";cout<<6*3.14*r*r<<endl;}virtual void GetColume(){cout<<"The Ball's Volume is";cout<<(4/3)*3.14*r*r*r<<endl;}//~Ball();};在派生类球的类中将 public 写成Public导致错误不能编译成功六、实验总结(对实验过程中出现的问题进行总结、指出程序中还需进一步完善的地方、在本次实验中学到的内容及自身不足等)对本次试验进行总结:1.应对实验整体架构进行了解。

python多继承简单案例

python多继承简单案例

python多继承简单案例摘要:1.Python支持多继承2.多继承允许一个类继承自多个父类3.案例:使用多继承定义动物类和狗类、猫类4.子类继承父类的属性和方法5.创建对象并使用属性和方法正文:Python是一种支持多继承的编程语言。

多继承允许一个类继承自多个父类,从而可以重用多个类中的属性和方法。

这对于代码的模块化和复用非常有用。

下面是一个简单的Python多继承案例:首先,我们定义了一个基类`Animal`,它具有`name`和`species`属性以及一个`speak`方法。

这个方法在子类中被重写了,以便每个子类可以有不同的表现。

```pythonclass Animal:def __init__(self, name, species): = nameself.species = speciesdef speak(self):pass```接下来,我们定义了两个子类`Dog`和`Cat`,它们分别继承自`Animal`类。

在子类的构造函数中,我们调用了父类的构造函数,以便初始化父类中的属性和方法。

```pythonclass Dog(Animal):def __init__(self, name, breed):super().__init__(name, "Dog")self.breed = breeddef speak(self):return "Woof!"class Cat(Animal):def __init__(self, name, color):super().__init__(name, "Cat")self.color = colordef speak(self):return "Meow!"```最后,我们创建了两个对象`my_dog`和`my_cat`,并使用它们来输出属性值和调用方法。

Python多重继承使用方法详解!

Python多重继承使用方法详解!

Python多重继承使用方法详解!继承是面向对象编程的重要方式,通过继承子类就可以扩展父类的功能。

而在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类。

那么Python多重继承如何使用?本篇文章为大家介绍一下Python多重继承使用方法,快来看看吧。

语法:class subClass(Base1,Base2)该语法的含义是创建了一个subClass类,让它同时继承了Base1和Base2的相关特性,关于继承还有以下规则需要遵循:1. 继承只会继承父类的方法,不能继承父类的变量;2. 要想继承父类的变量,需要执行父类的__init__(self)方法;3. 下划线开头的变量或方法,会被认为是受保护的,不能直接点出来,但如果强制打出来的话也一样能用,只是会有警告;4. 静态方法中不能使用self,用@staticmethod声明这是一个静态方法。

实例:class A(object):def __init__(self):print('A')super(A, self).__init__()class B(object):def __init__(self):print('B')super(B, self).__init__()class C(A,B):def __init__(self):print('C')super(C, self).__init__()以上实例是子类C多重继承了A和B的特性,是多重继承最基本的用法,除此之外,还有很多用法,多重继承的使用是需要注意的,使用不当,它带来的麻烦可能比解决的问题还多,因此,除非现有代码无法实现想要的功能,建议不考虑使用多重继承!。

class类的继承方式

class类的继承方式

class类的继承方式
1. 单继承:一个子类只继承一个父类,Python默认使用单继承,子类可以继承父类所有的属性和方法,并且可以重写。

2. 多继承:一个子类可以继承多个父类,使用逗号分隔,在继承时,子类会继承所有父类的属性和方法。

3. 多层继承:一个子类可以同时继承另一个类和这个类的父类,也就是说,继承关系可以形成一个继承树。

4. 菱形继承:一种特殊的多层继承,多个子类继承同一个父类,然后又同时继承一个共同的父类,这会导致方法被重复继承,从而产生一些问题。

为了解决这个问题,Python提供了MRO(Method Resolution Order)算法,用于确定方法的调用顺序。

《极限挑战》在做的一场“社会实验”

《极限挑战》在做的一场“社会实验”

鲇鱼效应、囚徒困境、零和游戏《极限挑战》在做的一场‎“社会实验”作者:南方周末记‎者朱晓佳发自:北京2016-05-29 09:50:48 来源:作品上架标签极限挑‎战黄磊所谓“极限挑战”,表面上是任‎务挑战,本质上是在‎测试人与人‎之间的信任‎、人与人之间‎交往的安全‎范围。

(节目组供图‎/图)一切都像是‎偶像剧。

黄磊跑到浦‎东,在几乎是全‎上海最贵的‎L ED屏上‎投了几个字‎:“回极挑起点‎桥黄磊”。

平时,这里的广告‎价码最少3‎0万一小时‎,这条,因为有黄磊‎刷脸和卖嘴‎——免费。

“极挑”,是东方卫视‎户外真人秀‎节目《极限挑战》的简称。

2016年‎4月17日‎,节目播出第‎二季。

重启后第一‎集,黄磊、黄渤、孙红雷、罗志祥、张艺兴、王迅六位嘉‎宾被各自扔‎在上海街头‎,他们要在不‎使用电话的‎情况下,想办法彼此‎会合。

“LED广告‎找人”,纯粹是黄磊‎的“脑洞”,节目组想都‎没想过——“也没那个预‎算”。

孙红雷通过‎电台节目喊‎话,张艺兴在出‎租车上听到‎,一番苦找,两人终于在‎电台大堂偶‎遇。

孙红雷那时‎正穿着一件‎军大衣,落寞地等待‎行李。

张艺兴一心‎急,跳过安检防‎护栏,上前和他相‎拥,此时,《东京爱情故‎事》的背景音乐‎响起。

找到彼此时‎的激动是真‎的;上一季里,孙红雷骗走‎张艺兴的箱‎子,张艺兴崩溃‎到哭,也是真的。

“真真假假,在游戏中失‎去,在游戏中获‎得。

”黄渤用他语‎录式的鸡汤‎,向南方周末‎记者感慨。

第一季开播‎时,《极限挑战》曾被批评为‎是韩国《无限挑战》的山寨版。

现在,人们越来越‎看得清二者‎的不同,这或许因为‎,《极限挑战》在自己的套‎路上走得足‎够远。

重录?重录!《极限挑战》的一切套路‎,都是在第一‎季第二集中‎确立的。

导演任静至‎今记得,第一季第一‎集节目录制‎后的第三天‎,她站在东方‎卫视中心总‎监李勇的办‎公室里坚决‎提出:重录。

首次录制,效果不好。

早上七点到‎九点,节目组录完‎了第一部分‎——一个类似于‎“螳螂捕蝉,黄雀在后”的连环追击‎游戏。

C++II普通版课程-大纲

C++II普通版课程-大纲

C++程序设计II课程编码:课程英文译名:C++ Programming(2)课程类别:公共基础课开课对象:信息类专业开课学期:第二学期学分: 3 学分总学时:48学时;理论课学时:32 学时;实验学时:16学时先修课程:数理逻辑,线性代数,C++程序设计I教材:《C++程序设计(修订版)——设计思想与实现》,钱能著,清华大学出版社,2009.6 《C++程序设计教程(第二版)实验指导》,钱能著,清华大学出版社,2007.8参考书:【1】《C++程序设计教程(第二版)》,钱能著,清华大学出版社,2009.6【2】《C++程序设计教程(第二版)习题与解答》,钱能著,清华大学出版社,2009.7 【3】《C++Primer Plus(第五版)中文版》,[美]普拉塔(Prata,S.),孙建春/韦强译,人民邮电出版社,2005.1【4】《C++程序设计》,谭浩强编著,清华大学出版社,2004.8一、课程的性质、目的和任务C++是一门高效实用的通用型程序设计语言,它既可进行过程化编程,也可进行基于对象的模块化编程,也可进行面向对象编程。

在计算机科学飞速发展的今天,C++能够很好地作为描述具体问题的工具,又可高效地实现各种编程方法的程序。

作为程序设计语言,其在软件产业界得到了无可比拟的广泛应用。

开设《C++程序设计II》课程,对信息类专业来说,是为了尽早使用优秀的编程语言,开展以计算机算法实现为工具的领域研究,以及为进一步学习各自领域的开发工具打下基础。

《C++程序设计II》课程,是《C++程序设计I》课程学习的继续,是高级编程技术的学习。

通过充分的程序设计实践,掌握C++程序设计各种方法,理解抽象编程本质,理解抽象数据类型、封装、继承、多态、模板、异常等高级编程概念。

学会用对象化的方法,组织和调试有数百行语句规模的多文件、多类型的程序工程,并进一步了解C++内部特性,学会标准模板库的简单使用,实质性提高操作C++开发环境和编程实现的能力。

实验题目——精选推荐

实验题目——精选推荐

实验题⽬⾯向对象编程(Java)——实验教学⼤纲内容⼦类与继承——三种⼈ (1)1、相关知识点 (1)2、实验⽬的 (1)3、实验要求 (1)4、实验指导 (2)⼦类与继承——计算利息(2014.11.20) (3)1、相关知识点 (3)2、实验⽬的 (3)3、实验要求 (3)4、实验指导 (4)5、思考题 (4)组件及事件处理——布局与⽇历(2014.11.28) (5)1、相关知识点 (5)2、实验⽬的 (5)3、实验要求 (5)4、实验指导 (6)5、思考题 (6)⼦类与继承——三种⼈1、相关知识点由继承⽽得到的类称为⼦类,被继承的类称为⽗类(超类),Java不⽀持多重继承,即⼦类只能有⼀个⽗类。

⼈们习惯地称⼦类与⽗类的关系是“is-a”关系。

如果⼦类和⽗类在同⼀个包中,那么⼦类⾃然地继承了其⽗类中不是private的成员变量作为⾃⼰的成员变量,并且也⾃然地继承了⽗类中不是private的⽅法作为⾃⼰的⽅法。

继承的成员变量或⽅法的访问权限保存不变。

⼦类和⽗类不在同⼀个包中时,⽗类中的private和友好访问权限的成员变量不会被⼦类继承,也就是说,⼦类只继承⽗类中的protected和public访问权限的成员变量作为⼦类的成员变量;同样,⼦类只继承⽗类中的protected和public访问权限的⽅法作为⼦类的⽅法。

⼦类声明的成员变量的名字和从⽗类继承来的成员变量的名字相同时,将隐藏所继承的成员变量。

⽅法重写是指⼦类中定义的⼀个⽅法,这个⽅法的类型和⽗类的⽅法的类型⼀致或者是⽗类⽅法的类型的⼦类型,并且这个⽅法的名字、参数个数、参数类型和⽗类的⽅法完全相同。

⼦类如此定义的⽅法称为⼦类重写的⽅法。

⼦类继承的⽅法所操作的成员变量⼀定是被⼦类继承或隐藏的成员变量。

重写⽅法既可以操作继承的成员变量,调⽤继承的⽅法,也可以操作⼦类新声明的成员变量,调⽤新定义的其他⽅法,但⽆法操作被⼦类隐藏的成员变量和⽅法。

Python中多继承与super()用法

Python中多继承与super()用法

Python中多继承与super()⽤法Python类分为两种,⼀种叫经典类,⼀种叫新式类。

两种都⽀持多继承。

考虑⼀种情形,B继承于A,C继承于A和B, 但C需要调⽤⽗类的init()函数时,前者会导致⽗类A的init()函数被调⽤2次,这是不希望看到的。

⽽且⼦类要显式地指定⽗类,不符合DRY原则。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# 经典类class A():def __init__(self): print 'A'class B(A):def __init__(self): A.__init__(self) print 'B'class C(B, A):def __init__(self):A.__init__(self)B.__init__(self) print 'C'采⽤新式类,要求最顶层的⽗类⼀定要继承于object,这样就可以利⽤super()函数来调⽤⽗类的init()等函数,每个⽗类都执⾏且执⾏⼀次,并不会出现重复调⽤的情况。

⽽且在⼦类的实现中,不⽤到处写出所有的⽗类名字,符合DRY原则。

1 2 3 4 5 6 7 8 9 10 11 12 13 14# 新式类class A(object):def __init__(self):print 'A'class B(A):def __init__(self):super(B, self).__init__() print 'B'class C(B, A):def __init__(self):super(C, self).__init__() print 'C'采⽤super()⽅式时,会⾃动找到第⼀个多继承中的第⼀个⽗类,但是如果还想强制调⽤其他⽗类的init()函数或两个⽗类的同名函数时,就要⽤⽼办法了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六继承㈢——多继承及继承的应用一、实验目的1.理解多继承的概念,熟悉多继承的定义及应用;2.理解多继承方式下的二义性产生原因,熟悉解决二义性的方法;3.进一步熟悉继承的综合应用。

二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠多继承的概念如果一个派生类由二个或二个以上的基类派生得到,称为多重继承(多继承)㈡多继承派生类的定义格式:class 派生类名:继承方式1 , 基类名1, 继承方式2, 基类名2, …{ 派生类新定义的成员}㈢多继承派生类的构造函数1.定义格式:构造函数名(总参数表):基类名1(参数表1), 基类名2(参数表2),…{ 构造函数的函数体}2.说明⑴多继承的构造函数的总参数表必须提供所有基类构造函数的值及新增数据成员的值。

⑵定义派生类对象时,多继承方式下构造函数的执行顺序为:先执行所有基类的构造函数(按排列顺序)后执行派生类的构造函数。

⑶释放派生类对象时,析构函数的执行顺序与构造函数的执行顺序相反。

㈣多继承派生类中为数据成员提供值的函数在多继承方式下,为数据成员提供值的函数必须同时为所有基类的数据成员提供值。

㈤多继承的二义性1.同名函数产生的二义性在多重继承方式下,如果在多个基类中有同名成员函数,可能出现二义性问题。

解决办法是在调用函数时使用类名及作用域运算符。

2.间接基类产生的二义性在多重继承下,如果一个派生类由二个或以上基类派生得到,而这些基类又是由一个基类派生得到的,也会产生二义性。

解决办法是使用虚基类,即在定义直接基类时,将间接基类说明为虚基类。

定义格式:class 直接基类名: virtual 继承方式间接基类名{ 派生类新定义的成员}四、实验内容㈠验证及认知实验按要求调试下列程序,并回答相关问题。

程序1(exp_601.cpp)#include<iostream.h>class X{ int x;public :X(int a=0){x=a;}//基类X的构造函数void set_x(int a){x=a;}void show(void){cout<<" x="<<x;}};class Y{ int y;public :Y(int b=0){y=b;}//基类Y的构造函数void set_y(int b){y=b;}void show(void){cout<<" y="<<y;}};class Z:public X,public Y//class Z:public X,private Y{ int z;public :Z(int a=0,int b=0,int c=0): X(a),Y(b){z=c;} //派生类Z的构造函数void set_xyz(int a,int b,int c){ set_x(a); set_y(b);z=c;}void show_z(void){cout<<" z="<<z;}void print(void){ show(); //显示x的值show(); //显示y的值show_z(); //显示z的值}};void main(){ Z obj1(3,4,5),obj2;obj2.set_xyz(10,20,30);obj1.print();cout<<endl;obj2.print();cout<<endl;}问题:⑴编译该程序,会出现编译错误,其原因是在定义Z类的print ( )成员函数中的show( )函数调用时出现了。

解决的方法是:⑵将“show(); //显示x的值”中的“show( )”改为⑶将“show(); //显示y的值”中的“show( )”改为⑷调试成功后的输出结果是:⑸成员函数void set_xyz(int a,int b,int c)中“set_x(a)”的作用是,“set_y(b)”的作用是。

程序2(exp_602.cpp)#include<iostream.h>class base{ private:int a;public:base(int x){ a=x;cout<<"Constructing base a="<<a<<endl;}};class base1:public base{ private:int b;public:base1(int x1,int x2):base(x1){ b=x2;cout<<"Constructing base1 b="<<b<<endl;}};class base2:public base{ private:int c;public:base2(int x1,int x2):base(x1){ c=x2;cout<<"Constructing base2 c="<<c<<endl;}};class derived: public base1,public base2{ private:int d;public:derived(int x1,int x2,int x3,int x4):base1(x1,x2),base2(x1,x3){ d=x4;cout<<"Constructing derived d="<<d<<endl;}};void main(void){ derived obj(2,3,4,5);}问题:⑹编译运行程序的输出结果是:⑺从输出结果中可看出,间接基类“base”被调用了两次,产生原因是“derived”的两个直接基类“base1”、“base2”拥有共同基类“base”,产生了。

⑻将程序中“class base1:public base”改为“class base1:virtual public base”“class base2:public base”改为“class base2:virtual public base”“derived(int x1,int x2,int x3,int x4):base1(x1,x2),base2(x1,x3)”改为“derived(int x1,int x2,int x3,int x4):base(x1),base1(x1,x2),base2(x1,x3)”重新编译运行程序的输出结果是:⑼“virtual public base”表示间接基类“base”为。

㈡知识应用实验按要求调试程序(完善类的定义及主程序)。

1.题目:通过继承方式处理学生成绩。

2.内容⑴类的定义:人“person”类(person.h中定义):包括姓名、性别、出生日期(日期“date”本身是一个类,包括年、月、日三个成员——定义在date.h中)三个数据成员;学生“student”类(student.h中定义),公有继承person类,新增学号、系、进校时间(date对象)三个数据成员;成绩score类(score.h中定义):新增课程科数、成绩数组数据成员。

⑵成绩处理:源程序存放在“exp_603.cpp”中。

3.要求⑴完善类的定义;⑵程序调试办法:每建好一个类,均在main()函数中进行测试成功后再定义下一个类,测试程序以“exp_test.cpp”存盘;⑶所有类定义测试后再调试、完善成绩处理程序。

程序://测试程序exp_test.cpp#include<iostream.h>#include<iomanip.h>#include" " //用不同类头文件void main( ){ ……}//各个类的定义//date类的定义:存放在date.h中class date{ private:int year,month,day; //年、月、日三个私有成员public:date(void){ year=1980;month=1;day=1;}void set_date(int y,int m,int d){ } //完成成员函数的定义int get_year(void){ } //完成成员函数的定义int get_month(void){ } //完成成员函数的定义int get_day(void){ } //完成成员函数的定义};//person类的定义:保存在person.h中#include<string.h>#include"date.h"class person{ protected:char name[11];char sex[2];date birthday;public:person(void); //无参构造函数void set_person(char *na,char *s,int y,int m,int d);char *get_name(void){ } //完成成员函数的定义char *get_sex(void){ } //完成成员函数的定义int get_year(void){ } //完成成员函数的定义int get_month(void){return birthday.get_month();}{ } //完成成员函数的定义void print(void);};person::person(void) //无参构造函数{ strcpy(name,"无名氏");strcpy(sex,"男");birthday.set_date(1980,1,1);}void person::set_person(char *na,char *s,int y,int m,int d) { } //完成成员函数的定义void person::print(void){ cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"出生日期:"<<birthday.get_year()<<"年";cout<<birthday.get_month()<<"月";cout<<birthday.get_day()<<"日"<<endl;}//student类的定义:存放在student.h中#include"person.h"class student :public person{ public :int id;char department[20];date enterdate;public :student(void);void set_student(int n ,char *s,int y,int m,int d);int get_id(void){ } //完成成员函数的定义char *get_department(void){ } //完成成员函数的定义int get_enteryear(void){ } //完成成员函数的定义int get_entermonth(void){ } //完成成员函数的定义int get_enterday(void){ } //完成成员函数的定义void print(void);void print_base();};student::student(void){ strcpy(name,"无名氏");strcpy(sex,"男");birthday.set_date(1980,1,1);id=0;strcpy(department,"计算机");enterdate.set_date(2000,9,1);}void student::set_student(int n ,char *s,int y,int m,int d)//n、s、y、m、d分别为id、department、enterdate提供值{ } //完成成员函数的定义void student::print(void){ cout<<"学号:"<<id<<endl;person::print();cout <<"系(专业):"<<department<<endl;cout<<"进校日期:"<< enterdate.get_year()<<"年";cout<<enterdate.get_month()<<"月";cout<<enterdate.get_day()<<"日"<<endl;}void student::print_base(){ cout<<setw(8)<<get_id();cout<<setw(12)<<get_name();cout<<setw(4)<<get_sex();cout<<setw(6)<<get_year()<<"-"<<get_month()<<"-"<<get_day(); cout<<setw(20)<<get_department();cout<<setw(6)<<get_enteryear()<<"-"<<get_entermonth();cout<<"-"<<get_enterday()<<endl;}//score类的定义:存放在score.h中#include"student.h"const int M=10;class score:public student{ private:float sc[M],aver;int m;public:score(void); //无参构造函数void set_score(float x[],int n); //提供成绩float get_score(int i) //得到第i科成绩{ } //完成成员函数的定义float get_aver(void) //得到平均成绩{ } //完成成员函数的定义void print(void);void print_score(void);};score::score(void) //无参构造函数{strcpy(name,"无名氏");strcpy(sex,"男");birthday.set_date(1980,1,1);id=0;strcpy(department,"计算机");enterdate.set_date(2000,9,1);int i;m=M;for(i=0;i<m;i++)sc[i]=0;aver=0;}void score::set_score(float x[],int n) //提供成绩:完成成员函数的定义{ int i;float sum=0;m=n;for(i=0;i<m;i++){ }aver=sum/m;}void score::print(void) //重载输出print(){ student::print();int i;for(i=0;i<m;i++)cout<<" "<<sc[i];cout<<" "<<aver<<endl;}void score::print_score(void){ int j;cout<<setw(8)<<get_id();cout<<setw(12)<<get_name();for(j=0;j<m;j++)cout<<setw(6)<<get_score(j);cout<<" "<<setw(6)<<get_aver()<<endl;}//成绩处理程序:保存在exp_603.cpp中#include<iostream.h>#include<iomanip.h>#include"score.h"void input_base(score *p,int n); //学生基本数据输入void input_score(score *p,int n,int m); //学生成绩输入void print_base(score *p,int n); //学生基本数据输出void print_score(score *p,int n,int m); //学生成绩输出score &average(score *p,int n,int m); //普通函数:平均成绩计算void sort(score *p,int n,int m);//普通函数:按平均成绩排序void main(){ int n,m;cout<<"学生人数:";cin >>n;cout<<"考试科数:";cin>>m;score *p,aver;p=new score[n]; //动态分配内存单元——动态数组if(p==NULL){ cout<<"内存分配失败"<<endl;return ;}int ch;do{cout<<"\n\n 请选择:\n";cout<<" 1. 输入学生基本数据\n";cout<<" 2. 输入学生成绩\n";cout<<" 3. 计算课程平均成绩\n";cout<<" 4. 输出学生基本数据\n";cout<<" 5. 输出学生成绩\n";cout<<" 6. 按平均成绩排序\n";cout<<" 0. 退出\n";cout<<"\n 输入你的选择:";cin>>ch;switch(ch){ case 1 : input_base(p,n);break;case 2 : input_score(p,n,m);break;case 3 : aver=average(p,n,m);break;case 4 : print_base(p,n);break;case 5 : print_score(p,n,m);aver.print_score();break;case 6 : sort(p,n,m);break;case 0 : break;}}while(ch);delete []p; //释放内存}void input_base(score *p,int n) //学生基本数据输入{ int i,id,y1,m1,d1,y2,m2,d2;char name[11],sex[3],dpt[20];cout<<"\n 请输入学生基本数据:";for(i=0;i<n;i++){ cout<<"第"<<i+1<<"个学生:\n";cout<<"学号:";cin>>id;cout<<"姓名:";cin>>name;cout<<"性别:";cin>>sex;cout<<"出生年:";cin>>y1;cout<<"出生月:";cin>>m1;cout<<"出生日:";cin>>d1;cout<<"所在系:";cin>>dpt;cout<<"入学年:";cin>>y2;cout<<"入学月:";cin>>m2;cout<<"入学日:";cin>>d2;p[i].set_person( );//完成函数的调用p[i].set_student( );//完成函数的调用}}void input_score(score *p,int n,int m){ int i,j;float x[M];for(i=0;i<n;i++){ cout<<p[i].get_id()<<p[i].get_name()<<"的成绩:"<<endl;for(j=0;j<m;j++){ cout<<"第"<<j+1<<"科成绩:";cin>>x[j];}p[i].set_score( );//完成函数的调用}}void print_base(score *p,int n){ int i;for(i=0;i<n;i++)p[i].print_base();cout<<endl;}void print_score(score *p,int n,int m){ int i;for(i=0;i<n;i++)p[i].print_score();}score &average(score *p,int n,int m) //用返回引用的方法{ int i,j; float s[M]={0};static score aver; //返回的对象必须是静态的for(j=0;j<m;j++){ for(i=0;i<n;i++)s[j]=s[j]+p[i].get_score(j);s[j]=s[j]/n;}aver.set_person("平均成绩"," ",0,0,0);aver.set_score( );//完成函数的调用return aver;}void sort(score *p,int n,int m)//选择法排序:完成空白处的内容{ score t;float a;int i,j,k;for(i=0;i<n-1;i++){ a=p[i].get_aver();k=i;for(j=i+1;j<n;j++)if( ){ a=p[j].get_aver();k=j;}if( ){ t=p[i];p[i]=p[k];p[k]=t;}}}㈢程序设计实验编程对日期时间型数据进行处理。

相关文档
最新文档