Java的结构化程序设计.ppt

上传人:牧羊曲112 文档编号:6509911 上传时间:2023-11-07 格式:PPT 页数:75 大小:827KB
返回 下载 相关 举报
Java的结构化程序设计.ppt_第1页
第1页 / 共75页
Java的结构化程序设计.ppt_第2页
第2页 / 共75页
Java的结构化程序设计.ppt_第3页
第3页 / 共75页
Java的结构化程序设计.ppt_第4页
第4页 / 共75页
Java的结构化程序设计.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《Java的结构化程序设计.ppt》由会员分享,可在线阅读,更多相关《Java的结构化程序设计.ppt(75页珍藏版)》请在三一办公上搜索。

1、第3章 Java的结构化程序设计,主 讲:肖 敏 电 话:13886110754 E-mail:,第3章 Java的结构化程序设计,3.1 顺序结构及基本语句赋值语句,赋值运算符=,+=,-=,*=,/=,%=赋值表达式 变量名=表达式 变量名+=表达式int width;width=3;length=width=3;交换两个数值型变量的值设置临时变量交换不能用临时变量交换,int a,b,temp;temp=a;a=b;b=temp;,a=a+bb=a-ba=a-b,3.1 顺序结构及基本语句赋值语句,m,n,a,b,n,a,b,a=a+b,m,m+n,m+n,a,b,b=a-b,n,m,m

2、,a,b,a=a-b,m+n,n,3.1 顺序结构及基本语句输入语句,用户输入APIBufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。BufferedReader(Readerin):创建一个使用默认大小输入缓冲区的缓冲字符输入流。readLine():读取缓冲区内的一个文本行,返回值为StringInputStreamReaderInputStreamReader(InputStreamin):创建一个使用默认字符集的 InputStreamReader。标准输入流:System.in,3.1 顺序结构及基本语句输入语句,用户输入对应的语句

3、,import java.io.*;public class InputTest public static void main(String args)BufferedReader buff;String str;buff=new BufferedReader(new InputStreamReader(System.in);str=buff.readLine();,3.1 顺序结构及基本语句输入语句,将String类型转换为数值类型,import java.io.*;public class InputTest public static void main(String args)Buf

4、feredReader buff;String str;int a;buff=new BufferedReader(new InputStreamReader(System.in);str=buff.readLine();a=Integer.parseInteger(str);,3.2 选择结构语句单分支语句,语句格式,条件,语句块,F,T,执行过程,if 语句块,3.2 选择结构语句双分支语句,语句格式,条 件,语句块1,语句块2,T,F,执行过程:,if(表达式)语句块1;else 语句块2;,3.2 选择结构语句多分支语句,条件1,语句块1,条件2,条件n,语句2,语句块n,语句块n+1

5、,T,T,T,F,F,F,执行过程,if(表达式1)语句块1;else if(表达式2)语句块2;else 语句块n+1;,if-else if语句格式:,3.2 选择结构语句多分支语句举例,输入学生成绩dblGrade,评定其等级。成绩在90,100之间为“优秀”,80,90)为“良好”,70,80)为“中等”,60,70)为“及格”,0,60)为“不及格”,小于0为输入错误。,3.2 选择结构语句多分支语句举例,X=90,优秀,X=80,良好,中等,F,F,T,T,X=70,X=60,X=0,及格,不及格,错误,F,F,F,T,T,T,(1)读取输入的学生成绩(2)将其类型转换为float

6、型,3.2 选择结构语句多分支语句举例,X0,错误,X60,不及格,及格,F,F,T,T,X70,X80,X90,中等,良好,优秀,F,F,F,T,T,T,(1)读取输入的学生成绩(2)将其类型转换为float型,数值2,数值1,数值n,语句块1,语句块2,语句块n,语句块n+1,Y,N,Y,Y,执行过程,求表达式的值,N,N,switch(表达式)case 数值1:语句块1;break;case 数值2:语句块2 break;case 数值n:语句块n;break;default:语句块n+1;,必须为整数类型或字符类型,break语句终止switch结构的执行,3.2 选择结构语句swit

7、ch语句举例,TestSwitch.java,public class TestSwitch public static void main(String args)throws IOException BufferedReader buf;String str;int grade,level;buf=new BufferedReader(new InputStreamReader(System.in);str=buf.readLine();grade=Integer.parseInt(str);level=grade/10;,3.2 选择结构语句switch语句举例,switch(level

8、)case 1:case 2:case 3:case 4:case 5:System.out.println(E);break;case 6:System.out.println(D);break;,case 7:System.out.println(C);break;case 8:System.out.println(B);break;case 9:System.out.println(A);break;,3.2 选择结构语句选择结构的嵌套,if if else else if else,if switch(表达式)case If Else case else,3.2 选择结构语句练习,输入

9、三个数值,判断能否构成三角形。如果能,判断三角形的形状。输入三个值a,b,c,求二次型方程ax2+bx+c=0的解输入年份、月份和日期,判断是否为一个正确的日期,并求出该日期的下一天的年份、月份和日期。,3.3 循环结构语句,循环:指一些操作或运算,具有:重复性 规律性 有限次、有规律、重复 有限性循环的要素:循环的要素:赋初值:设置循环的初始条件循环体:重复做什么?循环变量的修改:更改循环控制状况循环(结束)条件:如何继续?(何时结束?),3.3 循环结构语句for循环,for语句格式,for(赋初值;判断条件;循环变量修改)语句块,3.3 循环结构语句for循环举例,求3200内的所有素数

10、百钱买百鸡:“百钱买鸡问题”出自公元前五世纪中国数学家张丘建的算经:鸡公每只五元,鸡母每只三元,而鸡仔每元三只。用一百元买一百只鸡,鸡公、鸡母和鸡仔(cocks,hens,chicks)各有多少只呢?x,y,z分别表示鸡公、鸡母和鸡仔x+y+z=1005*x+3*y+z/3=100,3.3 循环结构语句for循环练习,所有数字之和为5的三位数有多少个?某次考试共26个题,对一道得8分,错一道扣5分,小张做完全部题目却得了零分,问他答对、错的共多少?填数游戏:3652838256,3.3 循环结构语句for循环举例,Java代码,for(inti=0;i1000;i+)for(intj=0;j1

11、00;j+)for(intk=0;k10;k+)function(i*j*k);,3.3 循环结构语句for循环举例,Java代码,for(inti=0;i10;i+)for(intj=0;j100;j+)for(intk=0;k1000;k+)function(i*j*k);,3.3 循环结构语句for循环举例,Java代码,int i,j,k;for(i=0;i10;i+)for(j=0;j100;j+)for(k=0;k1000;k+)function(i*j*k);,3.3 循环结构语句while循环语句,语句格式,while(判断条件)循环体;循环控制变量增(减)值;,3.3 循环结

12、构语句while循环语句,编程序计算当n为多大时下列不等式成立。1+1/2+1/3+1/n10while循环,int n=0;float sum=0;while(sum=10)n+=1;sum+=1.0/n;System.out.print(“n=+n);,3.3 循环结构语句do while循环语句,语句格式,do 循环体;循环控制变量增(减)值;while(判断条件),3.3 循环结构语句do while循环语句,执行如下程序代码a=0;c=0;do-c;a=a-1;while(a0);后,c的值是()A0 B1 C-1 D死循环,3.3 循环语句,循环总结,已知循环次数 for循环 wh

13、ile 先判断循环次数未知 do 循环 do while 先循环,(1)循环变量的初值(2)循环体(3)循环结束条件,求素数求水仙花数百钱买百鸡打印九九乘法表等,3.4 跳转语句,break和continue在循环语句中的区别break可以用在switch语句中,表示退出switchbreak和switch可以加标签使用,相当于goto语句,for(.).continue/break;.System.out.prinln(a);,3.5 数组,数组的声明和引用数组的for each循环数组的复制关于数组的常用API数组的排序二维数组的声明和引用二维数组的双重for each循环,3.5 数组,

14、一组相同类型和名称的变量集合。数组a表示逻辑上相关的一组数据a0表示第一个元素a1表示第二个元素,3.5 数组一维数组的声明和引用,数组的声明和初始化数组注意事项数组的赋值与引用在声明时直接赋值初始化一个匿名数组:不创建新变量采用for循环进行赋值,int a;int a;int a=new int100;其中:int a只是定义变量名,没有分配空间,也没有定义元素个数。语句int a=new int10规定了数组大小,默认值都为0,分配了空间。Boolean型数组初始值是false,char型是u0000,类(class)数组是null。,(1)数组的下标为099,试图访问a100会提示“a

15、rray index out of bounds”访问异常。(2)获得数组中元素的个数,使用a.length。(3)一旦创建数据,大小不能改变,如果需要扩 展,使用array list。,type arrayName=value1,values2,valuesn;int smallPrimes=2,3,5,7,11,13;,new type value1,values2,valuesn;new int 2,3,5,7,11,13;,int a=new int100;for(int i=0;ia.length;i+)ai=2*i+1;System.out.println(ai);,3.5 数组数

16、组的for each循环,for each循环语句格式 for(variable:collection)适用于遍历数组中的每个元素,并且循环内部不涉及到下标值。,int a=new int100;for(int i=0;ia.length;i+)ai=2*i+1;System.out.println(ai);,int a=new int100;for(int element:a)System.out.println(element),3.5 数组数组的复制,数组的复制,int smallPrimes=2,3,5,7,11,13;int luckyNumbers=smallPrimes;,3.5

17、 数组数组的复制方法,System.arraycopy方法Java SE6.0之前版本staticvoid arraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)src:源数组;srcPos:源数组的起始位置Dest:目标数组;destPos:目标数组起始位置length:要复制数组元素的数量从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束,3.5 数组数组的复制方法,Arrays.copyOf方法public static int copyOf(intoriginal,intnewLength)复

18、制指定的数组,截取或用 0 填充,以使副本具有指定的长度。对于在原数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效而在原数组无效的所有索引,副本将包含 0。当且仅当指定长度大于原数组的长度时,这些索引存在。,3.5 数组数组的复制方法,Arrays.copyOfRange方法public static int copyOfRange(intoriginal,intstart,int end)从数组original的start开始复制指定的数组,使副本具有指定长度end-start,3.5 数组数组的复制,使用Systems的arraycopy()方法:Java SE6.

19、0之前版本System.arraycopy(from,fromIndex,to,toIndex,count)指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。int smallPrimes=2,3,5,7,11,13;int a=new int6;System.arraycopy(smallPrimes,0,a,0,6);Arrarys类的copyOf()方法实现对数组的复制Arrays.copyOf(from,length)int smallPrimes=2,3,5,7,11,13;int a=new int6;a=Arrays.copyOf(smallPr

20、imes,smallPrimes.length);a=Arrays.copyOf(smallPrimes,3);,3.5 数组数组的复制,使用Systems的arraycopy()方法和Arrarys类的copyOf()方法实现对数组的复制之后的内存示意图,3.5 数组数组的API,Arrays的常用方法static String toString(type a):返回指定数组内容的字符串表示形式 copyOf(typeoriginal,intnewLength):复制指定的数组,使副本具有指定长度copyOfRange(typeoriginal,intstart,int end):复制指定的

21、数组,使副本具有指定长度end-startstatic void sort(type a)static void binarySearch(type a,type v)static void binarySearch(type a,int start,int end,type v)static void fill(type a,type v)static boolean equals(type a,type b),3.5 数组数组的排序,Arrays.sort方法对数值型数组进行排序public static void sort(inta)对指定的 int 型数组按数字升序进行排序。该排序算法

22、是一个经过调优的快速排序法,改编自 Jon L.Bentley 和 M.Douglas McIlroy 合著的 Engineering a Sort Function,Software-Practice and Experience Vol.23(11)P.1249-1265(November 1993)。此算法在许多数据集上提供 n*log(n)性能,这导致其他快速排序会降低二次型性能。参数a:要排序的数组,3.5 数组数组的排序,Arrays.sort方法对数值型数组进行排序public static void sort(inta,intfromIndex,inttoIndex)对指定 i

23、nt 型数组的指定范围按数字升序进行排序。排序的范围从索引 fromIndex(包括)一直到索引 toIndex(不包括)。参数:a-要排序的数组 fromIndex-要排序的第一个元素的索引(包括)toIndex-要排序的最后一个元素的索引(不包括),3.5 二维数组的声明及引用,二维数组的声明和初始化Type arrayName=new type 行元素个数列元素个数;int twoDimArray1=new int56;int twoDimArray2=16,3,2,13,5,10,11,8,9,6,7,12;二维数组的访问arrayNameij双重for循环进行数组元素的访问for e

24、achfor(int row:twoDimArrays)for(int element:row)System.out.println(element);,3.5 二维数组的维数,从最高维起分别为每一维分配内存,int twoDimAarry=new int5for(int i=0;i=4;i+)twoDimArrayi=new inti,int twoDimAarry=new int5;for(int i=0;i=4;i+)twoDimArrayi=new inti+1;,3.6 字符串,Java.lang.String类字符串对象创建的四种方法字符串对象创建的原理String类的常用方法St

25、ring类的缺陷Java.lang.StringBuffer类及常用的一些方法Java.lang.StringBuilder类及常用的一些方法,3.6 字符串Java.lang.String类,String类是final的,不可被继承。public final class String;String类是的本质是字符数组char,并且其值不可改变。private final char value;String类对象有个特殊的创建的方式,直接指定String x=abc,abc就表示一个字符串对象。而x是abc对象的地址,也叫做abc对象的引用。String对象可以通过“+”串联。串联后会生成新的

26、字符串。也可以通过concat()来串联。,3.6 字符串Java.lang.String类,String类对象的不可改变性,string类型对象是不可改变,也就是说,当你想改变一个string对象的时候,比如:name=“madding”,那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个“tom”没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。,3.6 字符串字符串对象创建的四种方法,直接指定。String s2=abc;使用串联生成新的字符串。String s3=ab+c;使用new关键字创建字符串String s1=new Str

27、ing(abc);由字符数组创建字符串char ch=H,e,l,l,o;String s2=new String(ch);,3.6 字符串String对象的创建原理(1),String类对象的不可改变性String s1=“Hello”;s1=“Good Afternoon”;,String池,Hello,Good Afternoon,栈,s1,3.6 字符串String对象的创建原理(1),直接指定String对象和串接字符串时,内存示意图,String a=”abc”;String b=”abc”;String c=”ab”+”c”;,String池,abc,栈,a,b,c,ab,c,a

28、=b测试两个引用是否指向同一个对象(StringTest),3.6 字符串String对象的创建原理(2),使用new关键字创建字符串时,内存示意图String s1=“abc”;,String池,abc,栈,s1,堆,String池,abc,堆,String池,abc,堆,String池,abc,堆,栈,String池,abc,堆,s1,栈,String池,abc,堆,s1,栈,String池,abc,堆,3.6 字符串String对象的创建原理(2),使用new关键字创建字符串时,内存示意图String s1=“abc”;String s2=new String(“abc”);,3.6 字

29、符串String对象的创建原理(2),String s1=abc;String s2=new String(abc);String s3=new String(abc);String s4=ab+c;String s5=c;String s6=ab+s5;System.out.print(s1=s2:);System.out.println(s1=s2);System.out.print(s2=s3:);System.out.println(s2=s3);System.out.print(s1=s4:);System.out.println(s1=s4);System.out.print(s1

30、=s6:);System.out.println(s1=s6);,s1=s2:falses2=s3:falses1=s4:trues1=s6:false,3.6 字符串String类的常用方法,int length()返回当前字符串中的字符个数。boolean equals(String str)区分大小写比较两个字符串的内容是否相等。boolean equalsIgnoreCase(String str)不区分大小写比较两个字符串的内容是否相等。char charAt(int index)返回当前字符串中index处位置的字符。String toLowerCase()将当前字符串中所有字符转

31、换为小写形式。String toUpperCase()将当前字符串中所有字符转换为大写形式,3.6 字符串String类的常用方法,String substring(int BIndex)截取当前字符串中从BIndex开始到末尾的子串。boolean startsWith(String str)测试当前字符串是否以str字符串为开头。char replace(char c1,char c2)将当前字符串中的c1字符转换为c2字符。String trim()返回去掉了当前字符串前后空格的字符串。int indexOf(String str,int i)在当前的字符串中从i处查找str子串,若找到

32、,返回子 串第一次出现的位置,否则返回-1。,3.6 字符串String类的缺陷,串接字符串时,内存示意图,String c=”ab”+”c”;,String池,abc,栈,c,ab,c,3.6 字符串String类的缺陷,String使用的缺陷:String一经初始化后,就不会在改变其内容了。对String字符串的操作实际上对其副本(原始拷贝)的操作,原来的字符串没有改变。比如:string s=a;/创建了一个字符串s=s+“b”;/实际上原来的“a”字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是“ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内

33、存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。,3.6 字符串StringBuffer类及常用方法,StringBuffer append(char c)将字符c放到字符串缓冲区之后 StringBuffer append(String str)将字符串str放到字符串缓冲区之后 StringBuffer deleteCharAt(int index)删除字符串缓冲区中第index位置的字符 StringBuffer insert(int k,char c)在字符串缓冲区的第k个位置插入字符c StringBuffer insert(int k,String str)在字符串

34、缓冲区的第k个位置插入字符串str StringBuffer replace(int m,int n,String str)将字符串缓冲区中第m到n之间以字符串str取代 StringBuffer reverse()将字符串缓冲区中的字符串按反向排列,3.6 字符串StringBuffer类及常用方法,public class SbufferTest public static void main(String args)StringBuffer str=new StringBuffer(Sun,length=10Sun&StarratS&nuSratS&nuS,3.7 方法,方法的定义及调用

35、参数的传递变量和常数作为参数的传递调用数组作为参数的传递方法的嵌套调用方法的递归调用,3.7 方法引子,引例(1)求m!(2)求n!(3)求(m-n)!(4)求m!/(n!*(m-n)!),int i,m;long result=1L;for(i=1;i=m;i+)result=result*i;,3.7 方法引子,方法在程序设计中,往往将应用按功能或其他目的划分为若干个模块。这些模块,都是可重复使用的、独立的。优点将复杂问题简单化便于代码的调试与维护 提高代码的可读性和利用率,3.7 方法方法的定义及调用,方法定义public|private|protected static|final|n

36、ative|synchronized void|int|char|long|string methodName(参数列表)/方法主体;方法的调用语句是否为静态方法:静态方法通过类名.方法名(实参列表)调用,否则通过对象名.方法名(实参列表)调用。是否有返回值:有返回值,方法调用只能作为语句的一部分;无返回值,方法调用可以直接作为语句,3.7 方法变量和常数作为参数的传递,变量和常数作为参数的传递例:定义一个求阶乘的方法factor公用public静态static返回long型结果 long形参:整型变量 int npublic static long factor(int n)/方法体,3.7

37、 方法变量和常数作为参数的传递,例:定义一个求阶乘的方法factor,public class ComputeFactor public static void main(String args)int a=5;System.out.println(ComputeFactor.factor(a);System.out.println(factor(6);public static long factor(int n)long result=1L;for(int i=1;i=n;i+);result=result*i;return result;,3.7 方法数组作为参数的传递,定义maxs()

38、方法,接收一维数组,输出元素的最大值。在main()方法中调用max方法,求一组学生成绩的最高分。,public class ArrPart public static void main(String arg)int score=65,35,98,86,77,60;maxs(score);public static void maxs(int sarr)/一维数组的接收 int tt=sarr0;for(int i=0;isarr.length;i+)if(ttsarri)tt=sarri;System.out.println(The best score is+tt+!);,数组名,类型必

39、须与实参一致元素个数不能写,3.7 方法数组作为参数的传递,定义maxs()方法,接收一维数组,输出元素的最大值。在main()方法中调用max方法,求一组学生成绩的最高分。,public class ArrPart public static void main(String arg)int score=65,35,98,86,77,60;maxs(score);public static void maxs(int sarr)/一维数组的接收 int tt=sarr0;for(int i=0;isarr.length;i+)if(ttsarri)tt=sarri;System.out.pr

40、intln(The best score is+tt+!);,3.7 方法方法的嵌套调用,main()fun1(),fun1()fun2(),fun2(),方法的嵌套调用执行过程,3.7 方法方法的嵌套调用,求组合数定义一个求阶乘的方法public static int fact(int r)定义一个求组合数的方法public static int factor(int m,int n)在main()方法中调用factor方法求阶乘,3.7 方法方法的嵌套调用,public class EmbedMethod public static void main(String args)int a=

41、5;int b=3;System.out.println(EmbedMb(a,b);System.out.println(comb(6,3);public static int fact(int r)if(r=1)return 1;else return r*fact(r-1);public static int comb(int m,int n)(return EmbedMethod.fact(m)/(fact(n)*fact(m-n);,3.7 方法方法的递归调用,方法的递归调用一个方法在自身定义的内部调用自己,这样的方法称为递归方法。例:求fac(n)=n!的方法。根据求n!的定义n!=

42、n*(n-1)!,写成如下形式:,1 n=1fac(n)=n*fac(n-1)n1,3.7 方法方法的递归调用,import java.io.*;public class Factor public static void main(String args)throws IOException BufferedReader buff;String str;int num;buff=new BufferedReader(new InputStreamReader(System.in);str=buff.readLine();num=Integer.parseInt(str);System.out.println(fact(num);public static int fact(int n)if(n=1)return 1;else return n*fact(n-1);,3.7 方法方法的递归调用,fac(4)=4*fac(3),fac(3)=3*fac(2),fac(2)=2*1,fac(2)=2*fac(1),fac(1)=1,fac(3)=3*2,fac(4)=4*6,fac(4)的执行过程,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号