Java算法第7章
Java面向对象程序设计案例教程(王贺) 第七章习题答案[5页]
1.选择题(1)下列说法中错误的是()A.对Swing构件只能设置一个边框B.Swing构件能建立组合边框或自己设计边框C.在Swing构件中,按钮可以使用图标修饰D.Swing构件支持键盘代替鼠标的操作(2)向容器添加新构件的方法是(A)A. add( )B. insert( )C. fill( )D. set( )(3)关于布局管理器LayoutManager,下列说法中正确的是(D)A.布局管理器是用来部署Java应用程序的网上发布的youtManager本身不是接口C.布局管理器是用来管理构件放置在容器中的位置和大小的D.以上说法都不对(4)JTextField类提供的GUI功能是(A)A.文本区域 B.按钮 C.文本字段 D.菜单(5)将GUI窗口划分为东、西、南、北、中五个部分的布局管理器是(D)A.FlowLayout B.GridLayout C. BoxLayout D. BorderLayout(6)关于Panel,下列说法中错误的是(D)A. Panel可以作为最外层的容器单独存在B. Panel必须作为一个构件放置在其他容器中C. Panel可以是透明的,没有边框和标题D. Panel是一种构件,也是一种容器2.填空题(1)( BorderLayout )包括5个明显的区域:东、南、西、北、中。
(2)Java的图形界面技术经历了两个发展阶段,分别通过提供AWT开发包和(Swing)开发包来体现。
(3)可以使用setLoaction( )、setSize( )或(setBounds( ) )中的任何一种方法设置组件的大小或位置。
(4)( GridLayout )布局管理器使容器中各个构件呈网格布局,平均占据容器空间。
(5)框架的默认布局管理器( BorderLayout)。
3.编程题(1)制作如图7-20所示的登录界面。
图7-20package com.zhouzhou;import java.awt.*;import javax.swing.*;public class Demo11 extends JFrame {// 定义组件JPanel jp1, jp2, jp3;JLabel jlb1, jlb2;JButton jb1, jb2;JTextField jtf1;JPasswordField jpf1;public static void main(String[] args) {// TODO Auto-generated method stubDemo11 d1 = new Demo11();}// 构造函数public Demo11() {jp1 = new JPanel();jp2 = new JPanel();jp3 = new JPanel();jlb1 = new JLabel("用户名");jlb2 = new JLabel("密码");jb1 = new JButton("登录");jb2 = new JButton("取消");jtf1 = new JTextField(10);jpf1 = new JPasswordField(10);// 设置布局管理(上面忘记:extends JFrame,这里出错了) this.setLayout(new GridLayout(3, 1));// 加入各个组件jp1.add(jlb1);jp1.add(jtf1);jp2.add(jlb2);jp2.add(jpf1);jp3.add(jb1);jp3.add(jb2);// 加入到JFramethis.add(jp1);this.add(jp2);this.add(jp3);this.setSize(250, 150);this.setTitle("登录");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}}(2)制作如图7-21所示的选择界面。
第七章 面向对象的Java实现-继承和多态
Java教员
.NET教员
10
为什么需要继承 4-4
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void giveLesson(){ 存在重复代码 System.out.println("启动 Eclipse"); super.giveLesson(); } } public class DotNetTeacher2 extends Teacher { public DotNetTeacher2(String myName, String mySchool) { super(myName, mySchool); } public void giveLesson(){ System.out.println("启动 Visual Studio .NET"); super.giveLesson(); } } 使用继承,可以有效实现代码复用
4
本章目标
掌握继承 掌握super关键字 掌握多态
5
生活中的继承 2-1
生活中,继承的例子随处可见
动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
6
生活中的继承 2-2
子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
可以接收子类类型 public class HQ3 { public void judge(Teacher t){ t.introduction(); t.giveLesson(); 根据实际创建的对象 } 类型调用相应方法 大家好!我是北京中心的李明. 启动 Eclipse 知识点讲解 总结提问
第7章 Java语言类的特性(第4版)
7.4 静态成员
7.4.4 静态初始化器 ♥ 静态初始化器与构造方法区别:(续) • 用new创建多少个新对象,构造方法就调用多 少次,但静态初始化器则在类被加载入内存 时只执行一次。 • 静态初始化器不是方法,它没有方法名、返 回值和参数。 ♥ 如果有多个静态初始化器,则它们在类的初始 化时会依次执行。
4
7.1 类的私有成员与公共成员
7.1.3 缺省访问控制符 ♥ 若在类成员的前面不加任何访问控制符,则 该成员具有缺省的访问控制特性。 ♥ 缺省访问控制权,表示这个成员只能被同一 个包(类库)中的类所访问和调用,如果一 个子类与父类位于不同的包中,子类也不能 访问父类中的缺省访问控制成员,也就是说 其他包中的任何类都不能访问缺省访问控制 成员。 ♥ 同理,对于类来说,如果一个类没有访问控 制符,说明它具有缺省访问控制特性
5
7.2 方法的重载
方法的重载是实现“多态”的方法之一。 方法的重载是指方法带有不同的参数,但使用 相同的名字。int add(int x, int y); int add(int x, int y, int z); 方法的参数不同则表示实现不同的功能,但功 float add(float f1, float f2); 能相似。 float add(float f1, int y); 所谓参数不同是指:参数个数不同、参数类型 float add(int y, float f1); float add(int x, int y); 不同、参数的顺序不同。参数的名字不同不能 int add(int u, int v); 说明是方法的重载。 Java中不允许参数个数或参数类型完全相同, 而只有返回值类型不同的重载。 见教材例7.3
L/O/G/O
第7章_Java_awt 509修改 - 副本 (2)
17
Frame类(框架)
Frame类是Container类的间接子类。当需要一个窗口时, 可使用Frame或其子类创建一个对象。窗口也是一个容器,
可以向窗口添加组件。窗口默认地被系统添加到显示器屏
幕上,因此,不允许将一个窗口添加到另一个容器中。 Frame是顶级窗口,可以显示标题,重置大小。当Frame 被关闭,将产生WindowEvent事件,Frame无法直接监听 键盘输入事件。
文字、图形、图象… 不能像标准组件一样被系统识别和承认,只起装饰作用。 不能响应用户的动作,不具有交互功能。
8
7.2 组件和容器
Java的图形用户界面的最基本组成部分是组件 (Component),组件是一个可以以图形化的方 式显示在屏幕上并能与用户进行交互的对象,例
如一个按钮,一个标签等。
给用户的技术。
目前Java主要提供了两个处理图形用户界面的类库: java.awt和javax.swing。
2
AWT:抽象窗口工具集(Abstract Windows Toolkit), 其外观取决于具体的平台,可用于Java的applet和 application。 java.awt包中包含了一个完整的类集以支持GUI程序的设 计(重量级构件),比如组件、图形等。
7 7
界面元素
容器是用来组织其他界面成分和元素的单元。
可以形成容器的层次,构筑复杂结构 Window(Frame、Applet、Dialog )
组件是图形用户界面的基本单位,它里面不再包含 其他的成分。
GUI组件是图形用户界面标准化的结果。 GUI组件的作用是完成与用户的交互。
用户自定义成分
Canvas Label TextField TextArea Scrollbar
第7章 Java的输入 输出流
第7章 Java的输入/输出流
String dirList[]=f1.list(m); for(int i=0;i<dirList.length;i++) Transcript.println(dirList[i]); } } public MyClass3(File f) { this.f=f; } public boolean accept(File dir, String name){ return name.startsWith("un"); } }
第7章 Java的输入/输出流
该程序的运行结果如图7.3所示。 此程序中,我们为了说明路径分隔符的使用方法, 实例化文件对象的时候给出了全路径,其实由于我们 已经在Java系统中设置好了源路径,只要给出文件名 就行了。 表7.1中,list方法用于列出一个目录中所有的文件 或与某个模式相匹配的文件。下面我们给出两个例子 来讨论带参数或不带参数的list方法的使用。
返回指定格式的目录中的文件名 返回当前目录中的所有文件名 创建目录,成功返回真 创建路径中所有目录,成功则返回真 返回路径分隔符 文件更名,成功返回真 返回文件分隔符 返回对象的字符串表示
第7章 Java的输入/输出流
下面我们给出几个File类的应用实例。通过例题的 使用,希望读者对File类有更清楚的认识。 例7.1 import java.io.*; public class MyClass1 { public static void main(String args[]){ Filef=new File("c:\\jbuilder3\\myprojects\\untitled5\\MyClass1.java"); if(!f.exists())
第七章 Collection 集合框架
• 掌握集合框架继承结构 • 常见集合类的使用
简介
Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操 作对象的接口组成。不同接口描述一组不同数据类型。它们都封装在 java.util包中。 图 7.1 Java集合框架图
简介
集合接口: 个接口 短虚线表示),表示不同集合类型,是集合框架的基础。 个接口( ),表示不同集合类型 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自 抽象类 定 义集合类。 实现类:8个实现类(实线表示),对接口的具体实现。 实现类 集合机构图 * Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set HashSet , TreeSet , LinkedHashSet Map ├Hashtable ├HashMap └WeakHashMap
Collection转换 转换 为Object数组 数组
Object[] toArray() Object[] toArray(Object[] a)
7.3 List
Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList
图 7.2 核心接口 Collection 接口是一组允许重复的对象。 接口是一组允许重复的对象。 Set 接口继承 Collection,但不 , 允许重复, 无序的)。 允许重复,使用自己内部的一个排列机制 (无序的)。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重 ,允许重复,以元素安插的次序来放置元素, 新排列。 新排列。 Map接口是一组成对的键-值对象,即所持有的是 接口是一组成对的键- 接口是一组成对的键 值对象,即所持有的是key-value pairs。Map中 。 中 不能有重复的key。拥有自己的内部排列机制。 不能有重复的 。拥有自己的内部排列机制。 注意: 注意: Ø 容器中的元素类型都为 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类 。从容器取得元素时, 型。
Java语言程序设计(郑莉)第七章课后习题答案
Java语言程序设计第七章课后习题答案1.数组的声明与数组元素的创建有什么关系?答:声明数组仅仅是代表试图创建数组,不分配任何存储空间,声明是为创建做“铺垫”。
2.Vector类的对象与数组有什么关系?什么时候适合使用数组,什么时候适合使用Vector?答:vector是一个能够存放任意对象类型的动态数组,容量能自动扩充,而数组存储固定且类型相同的对象;对于存储固定类型相同的对象使用数组,对于存储不同类型或者动态调整数组大小的情况使用Vector。
3.与顺序查找相比,二分查找有什么优势?使用二分查找的条件?答:对于大数据量中进行查找时二分查找比顺序查找效率高得多;条件是已排序的数组。
4.试举出三种常见的排序算法,并简单说明其排序思路。
答:①选择排序:基本思想是站在未排序列中选一个最小元素,作为已排序子序列,然后再重复地从未排序子序列中选取一个最小元素,把它加到已经排序的序列中,作为已排序子序列的最后一个元素,直到把未排序列中的元素处理完为止。
②插入排序:是将待排序的数据按一定的规则逐一插入到已排序序列中的合适位置处,直到将全部数据都插入为止。
③二分查找:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
5.声明一个类People,成员变量有姓名、出生日期、性别、身高、体重等;生成10个People 类对象,并放在一个以为数组中,编写方法按身高进行排序。
//People类public class People{private String name;private String birthdaydate;private String sex;private double height;private double weight;public People(){//默认构造函数}public People(People p){=;this.birthdaydate=p.birthdaydate;this.sex=p.sex;this.height=p.height;this.weight=p.weight;}public People(String name,String birthdaydate,String sex,double height,double weight){=name;this.birthdaydate=birthdaydate;this.sex=sex;this.height=height;this.weight=weight;}public String getName() {return name;}public void setName(String name) { = name;}public String getBirthdaydate() {return birthdaydate;}public void setBirthdaydate(String birthdaydate) {this.birthdaydate = birthdaydate;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public String toString(){return"姓名:"+name+"\n出生年月:"+birthdaydate+"\n性别:"+sex+"\n 身高:"+height+"\n体重:"+weight;}}//test7_5类public class test7_5 {/***@param args*/public static void main(String[] args) {// TODO Auto-generated method stubPeople[] people={new People("林楚金","1989年8月13日","男",182,63.5),new People("诸葛亮","181年7月23日","男",184,76.6),new People("迈克杰克逊","1958年8月29日","男",180,60),new People("乔丹","1963年2月17日","男",198,98.1),new People("拿破仑","1769年8月15日","男",159.5,63),new People("苍井空","1983年11月11日","女",155,45),};People temp=new People();for(int i=0;i<people.length-1;i++)for(int j=i+1;j<people.length;j++){if(people[i].getHeight()<people[j].getHeight()){temp=people[j];people[j]=people[i];people[i]=temp;}}System.out.println("按身高从小到大排序后的结果如下:");for(int i=0;i<people.length;i++)System.out.println(people[i]+"\n");}}运行结果:6.声明一个类,此类使用私有的ArrayList来存储对象。
第7章异常处理
Error和Exception
1.Error Error用来表示编译和运行错误,如程序进入了死循环、内存溢出等。
Error只能在编译阶段解决,运行时程序本身无法解决,只能依靠其它程序的 干预,否则会一直处于非正常状态。Error处理一般由系统承担,Java本身不 提供相应的Error处理机制。
2.Exception Exception用来表示由程序活动所导致的错误,如运算时除数为0、打开
at Throw1.main(Throw1.java:5)
上例中产生了一个数组下标越界异常,它是RuntimeException的一个子 类,它是Java中的一个基本异常,要想对各种异常类有个全面的了解,需要 去查看Java的JDK Documentation。
我们可以看到,异常产生之后程序终止了执行,并且输出了相应的异常 信息。此例中产生的异常有Java虚拟机自动抛出。
捕获和处理异常
程序发生异常时,会生成一个异常对象,这个异常对象会在方法内部被 抛出,它假设异常将被异常处理程序捕获。如果程序不捕获异常,它就要被 JVM捕获,这个方法将在抛出异常的过程中结束。要是不希望方法就此结束, 可以在方法内部设置一个特殊的块来监视可能产生异常的代码,然后让程序 来捕获并处理异常对象从而不会影响其他语句的执行。在Java中,提供了try 和catch语句来捕获和处理一个或多个异常。语法格式如下:
}
抛出异常
我们可以通过throw语句手动抛出异常。其基本语法格式如下: throw Obj;
其中throw是关键字,Obj是创建的异常类型的对象。在throw语句中同 样是使用new创建异常类型的对象。例如:
class Throw2{ public static void main(String args[]){ try{ System.out.println("Before throw!"); throw new ArithmeticException(); } catch(ArithmeticException e){ System.out.println("ArithmeticException caught!"); } System.out.println("End up!"); }
第7章Java异常处理
try
产生异常对象
异常类型匹配
catch
继续执行
try/catch 块后的代码段
try/catch块
import java.util.Scanner; 输入:2 0 public class Test1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请输入两个整数:"); try{ int x=input.nextInt(); int y=input.nextInt(); int result=x/y; System.out.println("相除的结果为:"+result); System.out.println("程序结束!"); }catch(ArithmeticException e){ System.out.println("除数不能为0!"); } } 除数不能为0! 控制台输出 }
catch
try/catch 块后的代码段
try/catch块
import java.util.Scanner; 输入:10 2 public class Test1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请输入两个整数:"); try{ int x=input.nextInt(); int y=input.nextInt(); int result=x/y; System.out.println("相除的结果为:"+result); System.out.println("程序结束!"); }catch(ArithmeticException e){ System.out.println("除数不能为0!"); } } 相除的结果为5 控制台输出 } 程序结束! 算术异常
Java程序设计教程第7章7.2 多 态
master.feed(xxx); ……
public void feed( XXX xxx ) { xxx.eat();
可否使用一个feed(Pet pet) 实现对所有宠物的喂食?
}
… … 频繁修改代码,代码可扩展性、可维护性差,
}
如何优化?
课堂操作——购置新车2-2
提前做完的同学可以尝试改进系统:
1. 循环从控制台选择汽车种类 2. 从控制台输入天数 3. 累加计算总租金
20/30
多态
总结
使用多态的好处
减少类中代码量 提高代码的可扩展性和可维护性
向上转型——子类转换为父类,自动进行类型转换
向下转型——父类转换为子类,结合instanceof运算符进行强 制类型转换
编写测试方法
调用主人类给狗狗喂的方法 调用主人类给企鹅喂的方法
为什么使用多态5-2
3/30
为什么使用多态5-3
问题
如果再领养XXX宠物,并需要给XXX喂食,怎么办?
添加XXX类,继承Pet类,实现吃食方法 修改Master类,添加给XXX喂食的方法
4/30
为什么使用多态5-4
主人类
练习
需求说明
使用多态实现喂养宠物功能 增加宠物猫并喂食,其健康值增加4
9/30
使用父类作为方法返回值实现多态
使用多态实现领养宠物
使用父类作为方法返回值 实现思路
在Master类添加领养方法getPet(String typeId ) 创建测试类,根据主人选择宠物类型编号来领养宠物
public class Master { public void feed( Dog dog ) { dog.eat(); } public void feed( Penguin pgn ) { pgn.eat(); }
第七章面向对象的Java实现继承和多态精品PPT课件
• 掌握继承 • 掌握super关键字 • 掌握多态
本章目标
5
生活中的继承 2-1
• 生活中,继承的例子随处可见
动物
谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
6
生活中的继承 2-2
• 子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
}
}
}
9
代码存在重复,违背了}“write once, only once”的原则
为什么需要继承 4-3
• 如何改进?有没有可能建立继承关系,让子类自动继承父 类的属性和方法?
Java教员是教员吗? .NET教员是教员吗?
教员
姓名 所在中心
授课 自我介绍
Java教员 .NET教员
10
public class Teacher {
} 使用继承,可以有效实现代码复用
11
如何实现继承 3-1
• 在Java语言中,用extends关键字来表示一个类 继承了另一个类,例如:
public class JavaTeacher2 extends Teacher { //其余代码省略
}
• 在父类中只定义一些通用的属性与方法,例如:
public class Teacher { private String name; // 教员姓名 private String school; // 所在中心 public Teacher(String myName, String mySchool) { //初始化属性值 } public void giveLesson() { //授课方法的具体实现 } public void introduction() { //自我介绍方法的具体实现 }
java语言程序设计(基础篇) 第七章
7.2. 为对象定义类
例如一个圆对象(circle),有数据域圆半径( radius)(标识了圆的属性),圆的行为就是 其面积可以通过方法getArea计算而得。同类型 的对象使用一个公共的类来定义。类就是定义 对象的数据和方法的模板.。一个对象是类的实 例(instance)。你可以生成一个类的很多个实 例,产生一个实例也叫做实例化(instantiation
To distinguish between object reference variables and primitive data type variables (§7.4).
To use classes in the Java library (§7.5).
To declare private data fields with appropriate get and set methods to make class easy to maintain (§7.6-7.8).
第7章 对象和类
在前一部分(2到6章),我们学习了编程基础,学会 使用基本数据类型、控制语句、方法以及数组 ,这些都是所有的面向过程的语言都具有的特 征,但, Java,是个面向对象的语言,不但具有 面向过程语言的要素,也具有抽象、封装、继 承、多态等特征以实现强大的灵活性、模块化 、以及可重用性以开发软件,在这一部分,我 们将学习如何定义、扩展以及使用类与对象
).术语对象、实例通常可互用,类和对象的关
系类似于书版和从书版印刷出很多的书。 下面是个圆的例子。
4
对象
类名: Circle
数据域: radius is _______
方法: getArea
一个类模板
圆对象 1
数据域: radius is 10
第七章-数据结构教程(Java语言描述)-李春葆-清华大学出版社
第二阶段通常用C语言完成,以便实现更复杂的功能, 也使程序有更好的可读性和可移植性。这个阶段的任 务有: 初始化本阶段要使用到的硬件设备。 检测系统内存映射。 将内核映像和根文件系统映像从Flash读到RAM。 为内核设置启动参数。 调用内核。
ห้องสมุดไป่ตู้
7.1.4常见的BootLoader
(1)Redboot Redboot (Red Hat Embedded Debug and Bootstrap)是Red Hat公司开发的一个独立运行在嵌入式系统上的BootLoader程序, 是目前比较流行的一个功能、可移植性好的BootLoader。 Redboot是一个采用eCos开发环境开发的应用程序,并采用了 eCos的硬件抽象层作为基础,但它完全可以摆脱eCos环境运行, 可以用来引导任何其他的嵌入式操作系统,如Linux、Windows CE等。
BootLoader是嵌入式系统在加电后执行的第一段代码, 在它完成CPU和相关硬件的初始化之后,再将操作系 统映像或固化的嵌入式应用程序装载到内存中然后跳 转到操作系统所在的空间,启动操作系统运行。
对于嵌入式系统而言,BootLoader是基于特定硬件平 台来实现的。因此,几乎不可能为所有的嵌入式系统 建立一个通用的BootLoader,不同的处理器架构都有 不同的BootLoader。
第7章 嵌入式Linux系统移植及调试
目录
7.1 Boot Loader基本概念与典型结构 7.2 U-Boot 7.3 交叉开发环境的建立 7.4 交叉编译工具链 7.5 嵌入式Linux系统移植过程 7.6 Gdb调试器 7.7 远程调试 7.8 内核调试
一个嵌入式linux系统通常由引导程序及参数、 linux内核、文件系统和用户应用程序组成。 由于嵌入式系统与开发主机运行的环境不同, 这就为开发嵌入式系统提出了开发环境特殊化 的要求。交叉开发环境正是在这种背景下应运 而生。
java课件 第七章 数组
7.3 数组访问
数组是一种数据结构,它由一组数组元素组 成。 数组是一种对象,它也有自己的成员变量和 方法。 数组一旦创建,就可以通过数组对象的引用 访问数组中的每一个元素,或者访问数组的 成员变量和方法。
14
7.3.1 对数组元素的访问
访问数组元素可以使用以下表达式: <数组对象引用>[<下标>] 数组访问表达式的类型是数组元素的类型,值是对 应数组元素的值。数组访问表达式的计算结果是变 量,可以出现在赋值操作符的左边。 <下标>是一个表达式,其类型可以是byte、char、 short或int型,但最终都会自动单目算术提升为int 型。<下标>的类型不能是long型。 <下标>的取值从0开始,一直到数组的长度减1。如 果<下标>值超出了允许的取值范围,将引发运行时 例外ArrayIndexOutOfBoundsException。
18
7.4 二维数组
在Java语言中,所谓二维数组是指数组的嵌套,即 数组的数组。 一个数组的数组元素类型既可以是基本类型,也可 以是引用类型。其中,引用类型就包括数组类型。 当一个数组的数组元素类型本身是数组类型时,就 形成了二维数组,甚至三维数组、四维数组等。 int[][] 表示一个int型的二维数组。其中: 第1个方括号可 以理解为第一维(外层)数组,其元素类型为int[] 型;第2个方括号可以理解为第二维(被嵌套的内 层)数组,其元素类型为int型。
4
7.1.2 数组变量
数组对象也需要通过变量来引用和操纵,这种变量 称为数组变量。 数组变量是指那些类型为数组类型的变量。 数组变量是引用型变量,其中存储着指向某个数组 对象的一个引用值。定义数组变量的例子:
第7章 流式输入输出
第7章
流式输入输出
第7章 流式输入输出
学习目标
java流式输入/输出原理
java基本I/O流类型 字节流和字符流 节点流和处理流 Java命令行参数和系统属性 标准I/O,文件I/O
第7章 流式输入输出
Java I/O基本原理
为进行数据的输入/输出操作,Java中把不同的输入/输出
Memory Array
Memory String
Pipe
PipedReader
PipedWritຫໍສະໝຸດ rPipedInputStream
PipedOutputStream
第7章 流式输入输出
节点流应用举例--文件复制
import java.io.*; public class Test7_1 { public static void main(String[] args) { try { FileReader input = new FileReader("Test7_1.java"); FileWriter output = new FileWriter("temp.txt"); int read = input.read(); while ( read != -1 ) { output.write(read); read = input.read(); } input.close(); output.close(); } catch (IOException e) { System.out.println(e); } } }
第7章 流式输入输出
I/O 流的链接
第7章 流式输入输出
处理流(Processing Streams)
叶核亚编《JAVA程序设计实用教程》第07章多线程精品PPT课件
7.1.3 并发程序设计
1. 顺序程序设计
① 执行的顺序性。 ② 环境的封闭性。 ③ 执行结果的确定性。 ④ 计算结果的可再现性。
2. 并发程序设计
《Java程序设计实用教程(第4版)》程 序设计实用教程(第4版)》程序设计实
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
版)》程序设计实用教程(第4版)》
3. 线程的状态
4. 线程的并发性 5. 线程调度
《Java程序设计实用教程(第4版)》程 序设计实用教程(第4版)》程序设计实
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
版)》程序设计实用教程(第4版)》
7.2 Java的线程对象
7.2.1 Runnable接口与Thread类 7.2.2 线程对象的优先级 7.2.3 线程对象的生命周期 7.2.4 定时器与图形动画设计
《Java程序设计实用教程(第4版)》程 序设计实用教程(第4版)》程序设计实
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
《Java程序设计实用教程(第4版)》程 序设计实用教程(第4版)》程序设计实
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
版)》程序设计实用教程(第4版)》
【例7.2】 声明实现Runnable接 口的奇数/偶数序列线程。
Thread类的run()方法声明如下:
public void run()
用教程(第4版)》程序设计实用教程 (第4版)》程序设计实用教程(第4
数据结构(Java语言描述)第七章 查找
第七章 查找
目录
1 查找
2 静态查找表
第七章 查找
动态查找表 哈希表 小结
总体要求
•掌握顺序查找、折半查找的实现方法; •掌握动态查找表(包括:二叉排序树、二叉平衡树 、B-树)的构造和查找方法; •掌握哈希表、哈希函数冲突的基本概念和解决冲突 的方法。
7.1基本概念
1、数据项 数据项是具有独立含义的标识单位,是数据不可分 割的最小单位。 2、数据元素 数据元素数是据由项若(名干) 数据项构成的数据单位,是在某
}
性能分析:i 0 1 2 3 4
5 13 19 21 37
Ci 3 4 2 3 4
查找成功:
比较次数 = 路径上的结点数
比较次数 = 结点 4 的层数
比较次数
2
56 7 56 64 75 1 34
判定树
5
8 9 10 80 88 92 2 34
查找37 8
树的深度
0
3
6
9
≤=
log2n +1
1
4
}
【算法7-1】初始化顺序表 public SeqTable(T[] data,int n){
elem=new ArrayList<ElemType<T>>(); ElemType<T> e; for(int i=0;i<n;i++){
e=new ElemType<T>(data[i]); elem.add(i, e); } length=n; }
前者叫作最大查找长度(Maximun Search Length),即 MSL。后者叫作平均查找长度(Average Search Length) ,即ASL。
Java程序设计教程 第7章-Java GUI编程技术
7.2.1 java.awt简介
7.2 java.awt编程技术
Java程序设计
7.2 java.awt编程技术
7.2.2 Component类
❖Component类是java.awt包中最核心、最基本的类。Component类是构成Java图形用 户界面的基础,大部分组件都是由该类派生出来的。Component类是一个抽象类,其 中定义了组件所具有的一般功能,可在屏幕上显示,并可与用户进行交互,其子类如 按钮、文本框等。 ❖Component类定义的方法如下: ❖基本的绘画支持:paint(), repaint(), update()等; ❖字体和颜色等外形控制:setFont(), SetForeground()等; ❖大小和位置控制:SetSize(), SetLocation()等; ❖图像处理:实现接口ImageObserver; ❖组件状态控制(SetEnable, isEnable, isVisible, isValid等。
Java程序设计
7.2 java.awt编程技术
7.2.1 java.awt简介
❖java.awt包提供很多类和接口,包括: ❖基本组件(Component):构成GUI界面的基本元素,具有坐标位置、尺寸、字体、颜 色等属性,能获得焦点、可被操作、可响应事件等。 ❖容器类组件(Container):用来盛放组件的组件等。 ❖2D图形绘制组件(Graphics):提供在组件上绘制图形的方法。 ❖布局管理器(LayoutManager):用来安排容器中组件的位置和大小。 ❖事件处理模型:用来响应图形界面组件所触发的事件。
Java程序设计
7.1 GUI编程的Java实现
7.1.2 swing
第7章__例外处理
throw e;
throws Etype1, Etype2 ……
1、例外的概念
程序中的例外不外乎两种情况:一种是运行环境不能 满足程序运行的要求而出错;一种是程序要解决的问 题的约束而导致的。 不管是哪种情况,编写程序时,程序员要考虑到程序 运行时可能遇到的各种情况(条件),并进行处理; 如果不能处理,或者不知该如何处理,就可以认为是 一种错误,这时,就需要交给别人去处理。 以前,是通过返回错误代码来提示别人程序有错误; 在Java中,则是通过例外机制通知别人出错信息。
1、例外的概念
{
用例外的形式处理错误:
try { openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; } catch(fileopenFailed) catch(sizeDetermineFailed) catch(memoryAllocateFailed) catch(readFailed) catch(fileCloseFailed) finally
Exception:一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。
2、例外的分类
用户自己产生的例外
Throwable
Exception
处理
Error
不做处理 由用户捕获或 声明并处理 RuntimeException
AWTError (in java.awt) …
2、例外的分类
第7章 多线程
第7章多线程一、选择题1.线程调用了sleep()方法后,该线程将进入()状态。
A.可运行状态B.运行状态C.阻塞状态D.终止状态2.关于java线程,下面说法错误的是()A.线程是以CPU为主体的行为B.java利用线程使整个系统成为异步C.创建线程的方法有两种:实现Runnable接口和继承Thread类D.新线程一旦被创建,它将自动开始运行3.在java中的线程模型包含()A.一个虚拟处理器B.CPU执行的代码C.代码操作的数据D.以上都是4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。
A.synchronizedB.includeC.importD.Thread5.线程控制方法中,yield()的作用是()A.返回当前线程的引用B.使比其低的优先级线程执行C.强行终止线程D.只让给同优先级线程运行6.线程同步中,对象的锁在()情况下持有线程返回A.当synchronized()语句块执行完后B.当在synchronized()语句块执行中出现例外(exception)时C.当持有锁的线程调用该对象的wait()方法时D.以上都是7.在以下()情况下,线程就进入可运行状态A.线程调用了sleep()方法时B.线程调用了join()方法时C.线程调用了yield()方法时D.以上都是8.java用()机制实现了进程之间的异步执行A.监视器B.虚拟机C.多个CPUD.异步调用9.下列程序实现简单的线程调度,请回答以下问题:Thread myThread=new MyThreadClass();myThread.start();try{myThread.sleep(10000);}catch(InterruptedExceptione){}myThread.stop();程序执行完第一行后,线程进入________状态;程序执行完第二行后,线程进入________状态;程序开始执行第五行时,线程进入________状态;程序执行完第五行后,线程进入________状态;程序执行完第十行后,线程进入________状态;A.新建状态B.可运行状态C.阻塞状态D.终止状态10.Thread类的方法中,toString()方法的作用是()A.只返回线程的名称B.返回当前线程所属的线程组的名称C.返回当前线程对象D.返回线程的名称11.运行下列程序,会产生什么结果?()1) public class Exercises3_1 extends Thread implements Runable {2) public void run() {3) System.out.println("this is run()");4) }5) public static void main(String args[]) {6) Thread t = new Thread(new Exercises3_1());7) t.start();8) }9) }A.第一行会产生编译错误B.第六行会产生编译错误C.第六行会产生运行错误D.程序会运行和启动12.线程在生命周期中要经历五种状态,若线程当前是新建状态,则它可以到达的下一个状态是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其中,x1,x2,…,xn是实变量,fi是未知量x1,x2,…,xn的非线性 x f x * * * x1 , x 2 , L , x n 实函数.要求确定上述方程组在指定求根范围内的一组解 在指定求根区域D内,选定一个随机点x0作为随机搜索的出 发点.在算法的搜索过程中,假设第j步随机搜索得到的随 机搜索点为xj.在第j+1步,计算出下一步的随机搜索增量 xj.从当前点xj依xj得到第j+1步的随机搜索点.当x<ε时, 取为所求非线性方程组的近似解.否则进行下一步新的随机 搜索过程.
7
舍伍德(Sherwood)算法 设A是一个确定性算法,当它的输入实例为x时所需的计算时 间记为tA(x).设Xn是算法A的输入规模为n的实例的全体,则 当问题的输入规模为n时,算法A所需的平均时间为 t A ( n) = ∑ t A ( x ) / | X n |
x∈ X n
这显然不能排除存在x∈Xn使得 t A ( x) >> t A (n) 的可能性.希望 获得一个概率算法B,使得对问题的输入规模为n的每一个实 例均有 t B ( x ) = t A ( n) + s ( n) 这就是舍伍德算法设计的基本思想.当s(n)与tA(n)相比可忽略 时,舍伍德算法可获得很好的平均性能.
}
5
计算定积分 设f(x)是[0,1]上的连续函数,且0≤f(x)≤1. 需要计算的积分为 I = ∫ f ( x)dx ,积分I等于图中的面积G.
0 1
在图所示单位正方形内均匀地作投点试验,则随机点落在曲 线下面的概率为
Pr { y ≤ f ( x)} = ∫
0 1 x = ∫ f ( x)dx
第7章 概率算法
学习要点 理解产生伪随机数的算法 掌握数值概率算法的设计思想 掌握蒙特卡罗算法的设计思想 掌握拉斯维加斯算法的设计思想 掌握舍伍德算法的设计思想
2
随机数
随机数在概率算法设计中扮演着十分重要的角色.在现实计 算机上无法产生真正的随机数,因此在概率算法中使用的随 机数都是一定程度上随机的,即伪随机数. 线性同余法是产生伪随机数的最常用的方法.由线性同余法 产生的随机序列a0,a1,…,an满足
蒙特卡罗(Monte Carlo)算法 在实际应用中常会遇到一些问题,不论采用确定性算法或概 率算法都无法保证每次都能得到正确的解答.蒙特卡罗算法 则在一般情况下可以保证对问题的所有实例都以高概率给出 正确解,但是通常无法判定一个具体解是否正确. 设p是一个实数,且1/2<p<1.如果一个蒙特卡罗算法对于问 题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算 p p-1/2 法是p正确的,且称p-1/2是该算法的优势. 如果对于同一实例,蒙特卡罗算法不会给出2个不同的正确 解答,则称该蒙特卡罗算法是一致的. 有些蒙特卡罗算法除了具有描述问题实例的输入参数外,还 具有描述错误解可接受概率的参数.这类算法的计算时间复 杂性通常由问题的实例规模以及错误解可接受概率的函数来 描述.
13
拉斯维加斯( Las Vegas )算法
拉斯维加斯算法的一个显著特征是它所作的随机性决策有可 能导致算法找不到所需的解.
void obstinate(Object x, Object y) {// 反复调用拉斯维加斯算法LV(x,y),直到找到问题的一个解y bool success= false; while (!success) success=lv(x,y); }
完全跳跃表与完全二叉搜索树的情形非常类似.它虽然可以 有效地支持成员搜索运算,但不适应于集合动态变化的情况. 集合元素的插入和删除运算会破坏完全跳跃表原有的平衡状 11 态,影响后继元素搜索的效率.
跳跃表
为了在动态变化中维持跳跃表中附加指针的平衡性,必须使跳跃表 中k级结点数维持在总结点数的一定比例范围内.注意到在一个完 全跳跃表中,50%的指针是0级指针;25%的指针是1级指针;…; (100/2k+1)%的指针是k级指针.因此,在插入一个元素时,以概率 1/2引入一个0级结点,以概率1/4引入一个1级结点,…,以概率 1/2k+1引入一个k级结点.另一方面,一个i级结点指向下一个同级 或更高级的结点,它所跳过的结点数不再准确地维持在2i-1.经过 这样的修改,就可以在插入或删除一个元素时,通过对跳跃表的局 部修改来维持其平衡性.
int Split(int n) { int m = floor(sqrt(double(n))); for (int i=2; i<=m; i++) if (n%i==0) return i; return 1; }
事实上,算法split(n)是对范围在1~x的所有整数进行了试除 而得到范围在1~x2的任一整数的因子分割. 16
1 p( x) t ( x) = s ( x) + e( x ) p( x)
14
n后问题
对于n后问题的任何一个解而言,每一个皇后在棋盘上的位置无任 何规律,不具有系统性,而更象是随机放置的.由此容易想到下 面的拉斯维加斯算法. 在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与 已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没 有下一个皇后的可放置位置时为止. 如果将上述随机放置策略与回溯法相结合,可能会获得更好的效 果.可以先在棋盘的若干行中随机地放置皇后,然后在后继行中 用回溯法继续放置,直至找到一个解或宣告失败.随机放置的皇 后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越 大.
10
跳跃表
在一般情况下,给定一个含有n个元素的有序链表,可以将它改造 成一个完全跳跃表,使得每一个k级结点含有k+1个指针,分别跳 过2k-1,2k-1-1,…,20-1个中间结点.第i个k级结点安排在跳跃表 的位置i2k处,i≥0.这样就可以在时间O(logn)内完成集合成员的 搜索运算.在一个完全跳跃表中,最高级的结点是logn级结点.
void Pollard(int n) 知,执行算法的while循环约 p {// 求整数n因子分割的拉斯维加斯算法 次后,Pollard算法会输出n的 RandomNumber rnd; int i=1; 一个因子p.由于n的最小素因 int x=rnd.Random(n); // 随机整数 子p≤ n ,故Pollard算法可在 int y=x; int k=2; O(n1/4)时间内找到n的一个素 while (true) { 因子. i++; x=(x*x-1)%n; // int d=gcd(y-x,n); // 求n的非平凡因子 if ((d>1) && (d<n)) cout<<d<<endl; if (i==k) { y=x; 17 k*=2;} } }
设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概 率.一个正确的拉斯维加斯算法应该对所有输入x均有p(x)>0. 设t(x)是算法obstinate找到具体实例x的一个解所需的平均时 间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失 败所需的平均时间,则有:t(x) = p(x)s(x) + (1 p(x))(e(x) + t(x)) 解此方程可得:
0
1
假设向单位正方形内随机地投入n个点(xi,yi).如果有m个点 落入 m G内,则随机点落入G内的概率 I ≈
n
6
解非线性方程组 求解下面的非线性方程组
f1 ( x1 , x 2 , L, x n ) = 0 f ( x , x ,L, x ) = 0 2 1 2 n LLLLLLLL f n ( x1 , x 2 , L, x n ) = 0
Pollard算法 在开始时选取0~n-1范围内的随机数,然后递归地由
xi = ( xi21 1) mod n 产生无穷序列 x1 , x 2 ,L, x k ,L
对于i=2k,以及2k<j≤2k+1,算法计算出xj-xi与n的最大公因子 d=gcd(xj-xi,n).如果d是n的非平凡因子,则实现对n的一次分 割,算法输出n的因子d. 对Pollard算法更深入的分析可
stopVega s 0 5 12 p s e t 1.0000 262.00 0.5039 0.0465 33.88 13.00 -47.23 10.20 262.00 80.39 222.11
15
整数因子分解 设n>1是一个整数.关于整数n的因子分解问题是找出n的如 m n 下形式的唯一分解式: = p1m1 p 2 2 L p kmk 其中,p1<p2<…<pk是k个素数,m1,m2,…,mk是k个正整数. 如果n是一个合数,则n必有一个非平凡因子x,1<x<n,使得 x可以整除n.给定一个合数n,求n的一个非平凡因子的问题 称为整数n的因子分割问题.
12
跳跃表 注意到,在一个完全跳跃表中,具有i级指针的结点中有一半 同时具有i+1级指针.为了维持跳跃表的平衡性,可以事先确 定一个实数0<p<1,并要求在跳跃表中维持在具有i级指针的 结点中同时具有i+1级指针的结点所占比例约为p.为此目的, 在插入一个新结点时,先将其结点级别初始化为0,然后用 随机数生成器反复地产生一个[0,1]间的随机实数q.如果 q<p,则使新结点级别增加1,直至q≥p.由此产生新结点级 别的过程可知,所产生的新结点的级别为0的概率为1-p,级 别为1的概率为p(1-p),…,级别为i的概率为pi(1-p).如此产 生的新结点的级别有可能是一个很大的数,甚至远远超过表 中元素的个数.为了避免这种情况,用log 1 / p n作为新结点级 别的上界.其中n是当前跳跃表中结点个数.当前跳跃表中 任一结点的级别不超过 log 1 / p n