程序设计实用案例选讲(袁卫华)案例选讲第二次.ppt_第1页
程序设计实用案例选讲(袁卫华)案例选讲第二次.ppt_第2页
程序设计实用案例选讲(袁卫华)案例选讲第二次.ppt_第3页
程序设计实用案例选讲(袁卫华)案例选讲第二次.ppt_第4页
程序设计实用案例选讲(袁卫华)案例选讲第二次.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计实用案例选讲程序设计实用案例选讲 Part 1: Java基础编程 计算机科学与技术学院 网络工程教研室 袁卫华 计算机科学与技术学院网络工程教研室 第二次课 一、案例分析:媒体信息输入输出 二、知识点讲解: 1)类,子类,封装和继承 2)捕捉用户的键盘输入 三、案例功能的进一步分析 四、小结和作业 计算机科学与技术学院网络工程教研室 一、案例分析:媒体信息输入输出 u一、案例介绍 设计程序实现书和CD等媒体信息的输入和输出。 编程要求(用户需求) 1)使用命令行方式来实现,程序执行后提示用户选择可以执 行的操作类型。 2)根据用户的选择,提示用户输入相应的信息,最终在屏幕 上输出这些信息。 3)要求使用循环来完成,以接受用户的多次输入;当用户选 择退出时,程序执行结束。 4)对于不合要求的输出,要求给出提示信息,并允许用户重 新输入。 计算机科学与技术学院网络工程教研室 u一、案例介绍 碰到这样一个题目,应该如何下手去做? 1.思路分析: 1)要完成本题的功能,需要定义几个类? 是否一个包含main方法的主类,用来控制用户操作的流程? 是否需要定义表示书和CD的类文件吗? 2)书和CD等媒体都可能包含哪些信息?(具有哪些特征来 描述这些实体?) 需要设计实体类来描述它们的这些特征吗? 类里面除了描述这些特征的数据成员,是否还需要定义一些 方法,来对这些数据成员进行操作和处理? 3)有哪些程序功能可以放在实体类的方法中去实现? 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u一、案例介绍 碰到这样一个题目,应该如何下手去做? 1.思路分析: 一、案例分析:媒体信息输入输出 1)定义类book,描述书的基本信息,定义相关方法对书的 信息进行输入和输出操作。 2)定义类CD,描述CD的基本信息,定义相关方法对CD的 信息进行输入和输出操作。 3)定义一个包含main()方法的类,对系统流程进行控制, 并在该类中实例化book类对象和CD类对象,通过调用类对 象的方法,完成媒体信息的输入和输出处理。 计算机科学与技术学院网络工程教研室 u一、案例介绍 1.思路分析: 书和CD都包含哪些信息呢? 1)书包含以下信息:名字,价格,作者,出版社, ISBN,出版日期。 2)CD包含以下信息:名称,价格,演唱者,出版社, ISRC,发行商。 这两个类有没有共同的信息,是否需要定义一个共同 的父类? 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u一、案例介绍 1.思路分析: 2)这两个类有没有共同的信息,是否需要定义共同的基类? 一、案例分析:媒体信息输入输出 3)类里面除了描述这些特征的数据成员,还需要哪些方法? 需要在类中定义对书和CD 的各种信息进行输入输出的方法! 计算机科学与技术学院网络工程教研室 u二、案例编程实现 首先设计一个程序原型,实现其基本功能,然后在程序原型 基础上对程序代码进行扩展,设计一个功能完成的程序。 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u二、案例编程实现 1. 父类-MyMedia_Ver_0 .java 数据成员:数据成员名及其数据类型 构造方法和其他方法 class MyMedia_Ver_0 String mediaName;/ 出版物名称 float mediaPrice;/ 出版物价格 String mediaPress;/ 出版社 String mediaAuthor;/ 作者(演唱者) BufferedReader bin; public MyMedia_Ver_0(String aName, float aPrice, String aPress, String aAuthor) /构造方法 void mediaNameInput() / 出版物名称输入方法 void mediaPriceInput() / 出版物价格输入方法 void mediaPressInput() / 出版社输入方法 void mediaAuthorInput() / 作者(演唱者)输入方法 /Class 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u二、案例编程实现 2.子类-MyBook _Ver_0 .java class MyBook_Ver_0 extends MyMedia_Ver_0 String publishDate = null;/ 出版日期 String bookISBN;/ 书的ISBN MyBook_Ver_0( String aName, float aPrice, String aPress, String aAuthor, String aBookISBN) / 构造方法 public void bookOtherInfo() / 书的其他相关信息输入方法 public void getBookInfo() / 输出书的相关信息 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u二、案例编程实现 2.子类-MyCD_Ver_0 .java class MyCD_Ver_0 extends MyMedia_Ver_0 String cdISRC;/ CD的ISRC String cdPublisher;/ CD的发行商 MyCD_Ver_0(String aName, float aPrice, String aPress, String aAuthor, String aCdISRC, String aCdPublisher) public void cdOtherInfo() / CD相关信息的输入成员函数 public void getCDInfo() / 输出CD的相关信息 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u二、案例编程实现 3.主类的设计- Cases_MediaMain_Ver_0.java 设计主类Cases_MediaMain_Ver_0,实现如下功能: 在命令行方式下,提示用户选择一个可以执行的操作类型 。 用户输入结束后,将用户输入的信息输出到控制台中。 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 u二、案例编程实现 3.主类的设计- Cases_MediaMain_Ver_0.java 一、案例分析:媒体信息输入输出 计算机科学与技术学院网络工程教研室 主 类 程 序 流 程 图 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 Java是完全面向对象的,程序是由对象组成的,每个对象有 自己的属性和能够执行的方法。类是构造对象的模板或蓝图 ,由类构造对象的过程称为创建类的实例。 封装:将数据成员和行为结合在一个包中,并对对象的使用 者隐藏了数据的实现方式,对象中的数据被成为实例域,操 作数据的过程被称为方法。 继承是指基于已经存在的类(基类,父类)构造一个新类( 子类),子类可以复用父类的数据域和方法。 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 封装与继承 类MyMedia的数据成员 : String mediaName; float mediaPrice; String mediaPress; String mediaAuthor; BufferedReader bin; 类MyBook的数据成员: String mediaName; float mediaPrice; String mediaPress; String mediaAuthor; BufferedReader bin; Date bookPublishDate = null; String bookISBN; 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 封装与继承 类MyMedia的方法: void mediaNameInput() void mediaPriceInput() void mediaPressInput() void mediaAuthorInput() 类MyBook的数据成员: void mediaNameInput() void mediaPriceInput() void mediaPressInput() void mediaAuthorInput() public void bookOtherInfo() public void getBookInfo() 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 u 构造方法:用于创建一个对象,并对该对象进行初始化。 问题一:读程序,找一下类MyMedia_Ver_0.java和 MyBook_Ver_0.java的构造方法在哪里?如何定义的? public MyMedia_Ver_0 () public MyMedia_Ver_0 (String aName, float aPrice, String aPress, String aAuthor) mediaName = aName; mediaPrice = aPrice; mediaPress = aPress; mediaAuthor = aAuthor; bin = new BufferedReader(new InputStreamReader(System.in); 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 u 构造方法:用于创建一个对象,并对该对象进行初始化。 问题一:读程序,找一下类MyMedia_Ver_0.java和 MyBook_Ver_0.java的构造方法在哪里?如何定义的? MyBook_Ver_0() MyBook_Ver_0(String aName, float aPrice, String aPress, String aArtist,String aBookISBN) super(aName, aPrice, aPress, aArtist); bookISBN = aBookISBN; 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 u 构造方法:用于创建一个对象,并对该对象进行初始化。 问题一:读程序,找一下类MyMedia_Ver_0.java和 MyBook_Ver_0.java的构造方法在哪里?如何定义的? 默认构造方法: 如果在编写一个类时没有编写构造方法,系统就会提供一 个默认的构造方法,在这个方法中将所有的数据成员被设 置为默认值: 其中数值型为0,布尔型为false,对象引用为null。 也可以在程序中自己定义一个没有任何参数的构造方法, 方便进行对象的实例化操作,以减少NullPointerException 异常的抛出。 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 u 构造方法:用于创建一个对象,并对该对象进行初始化。 问题一:读程序,找一下类MyMedia_Ver_0.java和 MyBook_Ver_0.java的构造方法在哪里?如何定义的? 重载构造方法 由于类的构造方法可以重载,所以可以采用多种形式设置 类的数据成员的初始状态,确保不管如何调用构造方法, 每个实例域都可以被设置为一个有意义的初值。 计算机科学与技术学院网络工程教研室 二、知识点:类,子类,封装和集成 u 构造方法:对定义的对象进行初始化。 问题二:构造方法的命名有什么特点?构造方法应该 何时被调用? p 构造方法必须与类同名,并且总是伴随着new操作符的执行 而被调用的。其主要功能是创建类对象并为类对象提供初始 化。 MyBook_Ver_0 book = new MyBook_Ver_0(); MyBook_Ver_0 book = new MyBook_Ver_0(“ “, 0.0f, “ “, “ “, “ “, “ “); 问题三:子类MyBook_Ver_0.java构造方法的定义与其 父类MyMedia_Ver_0.java有什么不同? super(aName, aPrice, aPress, aArtist); 计算机科学与技术学院网络工程教研室 u 构造方法 super(aName, aPrice, aPress, aArtist); 作用:调用父类MyMedia_Ver_0中含有参数 MyMedia_Ver_0 (String aName, float aPrice, String aPress, String aArtist)的构造方法 如果子类构造方法没有显式调用超类构造方法,就会调用 超类的默认构造方法(没有任何参数),如果超类中没有 不带参数的构造方法(默认构造方法),而子类的构造方 法又没有显式地调用超类的其他构造方法的语句,Java编 译器将会报错。 二、知识点:类,子类,封装和集成 计算机科学与技术学院网络工程教研室 u 构造方法 二、知识点:类,子类,封装和集成 计算机科学与技术学院网络工程教研室 u 第一种方式: 阅读MyMedia_Ver_0.java,找一下捕捉用户键盘输入的代码 ? BufferedReader br = new BufferedReader(new InputStreamReader(System.in); choice = Integer.parseInt(br.readLine(); 其中键盘输入System.in,是一个未经包装的原始的 InputStream的对象。在使用时通常用 InputStreamReader(System.in)将System.in转换为 BufferedReader。 BufferedReader类有一个很有用的方法:readLine(),用于 读取用户输入的一行数据,每一行数据对应一个输入值。 br.readLine()提取的数据以字符串形式存储在变量中。 二、知识点:捕捉用户的键盘输入 计算机科学与技术学院网络工程教研室 u 如果用户将输入的两个输入值放在同一行中,应该怎么办 呢? u 第二种方式:扫描器Scanner Scanner in = new Scanner(System.in); /用指定的输入流System.in创建一个Scanner对象 choice = in.next(); /读取下一行内容 java.util.Scanner类,这是一个用于扫描输入文本的实用程 序,Scanner类还可以任意地对字符串和基本类型(如int和 double)的数据进行分析,可以使用该类创建一个对象: Scanner reader=new Scanner(System.in); 二、知识点:捕捉用户的键盘输入 计算机科学与技术学院网络工程教研室 u 第二种方式:扫描器Scanner reader对象调用下列方法(函数),读取用户在命令行输入的 各种数据类型: nextByte(),nextDouble(),nextFloat,nextInt(), nextLine(),nextLong(),nextShort() 上述方法执行时都会造成堵塞,等待用户在命令行输入数 据回车确认。 String next():读取下一个单词(以空格作为分隔符) 二、知识点:捕捉用户的键盘输入 计算机科学与技术学院网络工程教研室 u 第二种方式:扫描器Scanner应用举例 public class ScannerExample1 public static void main(String args) System.out.println(“请输入若干个单词“); Scanner reader = new Scanner(System.in); double sum = 0; int m = 0; while (reader.hasNext() String str=reader.next(); m+; System.out.println(“这是第“+m+“个单词:“+str); 二、知识点:捕捉用户的键盘输入 计算机科学与技术学院网络工程教研室 u 第二种方式:扫描器Scanner应用举例 二、知识点:捕捉用户的键盘输入 计算机科学与技术学院网络工程教研室 三、程序功能的进一步分析 u一、案例分析 再次阅读类MyMedia_Ver_0.java,MyBook_Ver_0.java , MyCD_Ver_0.java ,MyMedia_Ver_0.java代码,是否实现了题目中 所要求的全部功能?程序中有没有需要进一步改进的地方? 3)要求使用循环来完成,以接受用户的多次输入;当用户选择退出 时,程序执行结束。 4)对于不合要求的输入,要求给出提示信息,并允许用户重新输入 。 对于下列数据成员,需要对其格式进行限制吗? String mediaName;/ 出版物名称 float price;/ 出版物价格 String press;/ 出版社 String artist;/ 作者(演唱者) 计算机科学与技术学院网络工程教研室 u二、问题提出 在案例实现的第一版中,用户可以输入任意信息,程序里面 没有对用户输入内容是否符合所需数据类型进行检查的语句 。 但是我们希望 String mediaName;/ 出版物名称-出版物的名称不能为空! float mediaPrice;/ 出版物价格-出版物价格应该由数字组成, 而且价格不能为负值! String publishDate = null;/ 出版日期-出版日期最好是Date日 期型数据,如可以这样限定日期格式“2000-01-01” 在命令行操作方式下如何对这些数据的输入格式进行限制? 三、程序功能的进一步分析 计算机科学与技术学院网络工程教研室 u三、解决方法 1. String mediaName;-出版物的名称不能为空! 通过mediaName = bin.readLine(); 提取用户的输入后,判定 其是否为空,如果为空,提示用户重新输入即可。 需要对MyMedia_Ver_0 .java中的mediaName输入方法 mediaNameInput()进行改进! 如何改进? 可以加一个布尔型变量bFlag控制循环输入流程。 三、程序功能的进一步分析 计算机科学与技术学院网络工程教研室 u三、解决方法 1. String mediaName;-出版物的名称不能为空! 三、程序功能的进一步分析 计算机科学与技术学院网络工程教研室 u三、解决方法 2. float price;-价格应该由数字组成,价格不能为负值! 希望出现如下图所示的提示信息来限制用户输入信息格式 应该如何对mediaPriceInput() 方法进行改进? 三、程序功能的进一步分析 计算机科学与技术学院网络工程教研室 u三、解决方法 2. float price;-价格应该由数字组成,价格不能为负值! 定义一个限制格式的字符串模式,限定输入的字符串只能输入数 字,小数点和正负号组成。 public static boolean isNumericRegex(String str) / 正则表达式,判定输入的字符串是否是由数字组成的 Pattern pattern = Ppile(“+-?(d*.d+)|(d+)$“); Matcher matcher = pattern.matcher(str.trim(); return matcher.matches(); 正则表达式:描述了一种字符串匹配的语法规则,我们可以 依据该规则来检查一个字符串是否含有子串,将匹配的子串 进行替换,或者从某个子串中取出符合某个条件的子串。 三、程序功能的进一步分析 计算机科学与技术学院网络工程教研室 u三、解决方法 2. float price;-价格应该由数字组成,价格不能为负值! Pattern pattern = Ppile(“+-?(d*.d+)|(d+)$“); 三、程序功能的进一步分析 /* * using Regular Expression * * support Numeric format: * “33“ “+33“ “033.30“ “-.33“ “.33“ “ 000.000 “ * * param str * String * return boolean */ 计算机科学与技术学院网络工程教研室 u三、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论