Presentation is loading. Please wait.

Presentation is loading. Please wait.

Java技术与应用 -Java基本语法(第3~7章) 西安交大 卫颜俊 2007年4月 电子信箱:Mr.Java@163.com.

Similar presentations


Presentation on theme: "Java技术与应用 -Java基本语法(第3~7章) 西安交大 卫颜俊 2007年4月 电子信箱:Mr.Java@163.com."— Presentation transcript:

1 Java技术与应用 -Java基本语法(第3~7章) 西安交大 卫颜俊 年4月

2 主要内容 数据类型(Data Types) 运算符与表达式(Operator & Expression)
控制流程(Control Flow) 数组(Array) 字符串(String & StrignBuffer)

3 1. 数据类型(Data Types)

4 文字量

5 转义符 '\t'、'\\'、'\''、'\"'、'\r'、'\n'、'\b'
使用三位八进制数值加“\”前缀来表示ASCII码字符,格式为‘\xxx’ 使用四位十六进制数值加“\u”前缀来表示Unicode码字符,格式为'\uxxxx'

6 常量、变量 合法标识符(包括汉字) 作用域  { } 局部,成员 赋初值

7 变量的赋值与引用赋值 【例3-1】变量赋值演示

8 变量的值传递与引用传递 【例3-2】参数传递演示

9 变量的作用域 对于对象实例变量,可以在定义时赋给初始值,也可以在构造方法中赋给初始值;
对于类静态变量可以在定义时或使用静态初始化器进行赋初始值,但不能在构造方法中赋给初始值。 P.53~P.54例子

10 常量与初始化 常量只能初始化一次 。 对于简单常量,其值不可修改。 对于数组常量,始终保持引用同一个数组,但数组元素值可以改变。
对于其它复杂变量总是对同一个对象的引用,但其内部状态值可以更改。 【例3-3】常量使用演示

11 复杂类型 数组 字符串 类(抽象类,接口)

12 2 .运算符与表达式 运算符是进行操作数(文字量、常量和变量)运算的符号表示。
表达式是将标识符、 关键字、符号和运算符连接起来的有意义的组合体。 包括:赋值、算术、关系、条件、逻辑和位运算符和表达式。

13 赋值运算符与表达式 = 变量赋值:x=84; 运算符表达式:y=(x*5)/6;
方法调用:height=building.getHeight(); 对象分配:Point point=new Point();

14 算术运算符与表达式 双目运算符 :加(+)、减(-)、乘(*)、除(/)和取余(%)
单目运算符 :正(+)、负(-)、加加(++)和减减(--) 【例4-1】“++”和“--”的使用 java.lange.Math类的作用

15 关系运算符与表达式 int x=3; boolean a=x<5; a的结果为true
==(等于)、!=(不等于)、<(小于)、<=(小于等于)、>(大于)和>=(大于等于)以及一种类型比较运算符:instanceof 举例: int x=3; boolean a=x<5; a的结果为true boolean b=x==5; b的结果为false boolean c=x!=x; c的结果为false boolean d=a==c; d的结果为true String s1="Java"; String s2="Java"; boolean e=s1==s2; e的结果为false boolean f=s1.equals(s2); f的结果为true

16 条件运算符与表达式 &&(与)、||(或)、!(反)、~(异或)、&(非简洁与)、|(非简洁或)和?: 【例4-3】条件运算符的使用

17 逻辑运算符与表达式 &(位与)、|(位或)、^(位异或)和~(位取反) 【例4-4】逻辑运算符的使用

18 移位运算符与表达式 >>(带符号右移)、<<(带符号左移)和>>>(无符号右移)
正整数的原码=反码=补码 负整数的反码=原码各位求反 负整数的补码=反码加1 【例4-5】位运算符的使用

19 简洁赋值运算符

20 复合运算符

21 运算符的优先级 从左到右进行,并遵守:括号 > 算术运算符 > 关系运算符和大部分逻辑运算符(除了!号) > 赋值运算符。
在表达式进行运算之前,首先会将其它数据类型转换为最大数据类型,最终结果以等号左边的变量类型为准。 【例4-7】随机产生三个[1,1000]范围的整数,并判断它们是否构成等差和等比数列

22 3. 控制结构 顺序语句有:输入、计算赋值和输出语句 分支语句有:单分支if-else和多分支switch-case语句
循环语句有:while、do和for语句

23 顺序语句 标准输入语句(java.lang包中的System类中的静态成员变量in的方法read )
int read() 读一个字节或字符,返回0到255范围内的 int 字节值,如果没有可读字节,则返回-1。 int read(byte[] b) 读一个字节数组,读取一定数量的字节并将其存储在缓冲区数组b中,并以整数形式返回实际读取的字节数。 int read(byte[] b,int off,int len) 读一个字节数组并截取一部分,读取len个数据字节存入字节数组b,以整数形式返回实际读取的字节数。 java.util包中的Scanner类的nextT()方法 t nextT() 读下一个数。其中,T:Boolean、Byte、Char、double、Float、Int、Short和Long等,t:boolean、byte、char、double、float、int、short和long等。 String nextLine() 读下一行字符串

24 read输入语句举例 int i; try{ i=System.in.read(); }catch(IOException e){}
char c=(char)i; byte b[]=new byte[256];//定义一个包含256个元素的字节数组 int len= System.in.read(b); String s=new String(b,0,len);//定义一个字符串,其值来自于b中从b[0]开始的len个字节 float f=Float.parseFloat(s);//字符串转换为float类型

25 Scanner输入语句举例 Scanner sc = new Scanner(System.in); int x=sc.nextInt();
【例5-1】根据输入的半径和高度,分别计算圆面积、圆柱全面积和圆锥侧面积。

26 输出语句 标准输出语句(java.lang包中的System类的out成员变量的方法print、println和write )
void print(T t) 输出指定数值 void println(T t) 输出指定数值并带换行 void write(int b) 输出指定的字节值 void write(byte[] buf, int off, int len) 输出len个字节,起始位置从数组的第off个元素开始。 格式化输出语句(System.out.printf方法) (java.util包中提供了Formatter类的format方法 ) PrintStream printf (String 格式字符串, Object... 参数); 举例: System.out.printf ("%4$s %3$s %2$s %1$s %4$s %3$s %2$s %1$s","a", "b", "c", "d"); //输出结果:"d c b a d c b a" System.out.printf ("%3d %x",23,34); //输出结果:" 23 12" System.out.printf ("%8.2f", ); //输出结果:" "

27 分支语句 if ( 关系或条件表达式 ) 语句; if (关系或条件表达式) 语句1 else语句2; 嵌套分支语句
【例5-4】将学生成绩转换为五分制。 switch(数值表达式){// boolean、byte、short、char和int case 值1: 语句1; break; …… defalut: 其它语句; }

28 循环语句 while (关系或条件表达式) 语句; do 语句 while (关系或条件表达式);
for(循环变量赋初始值;关系或条件表达式; 循环变量值的修正) 语句; for(变量修饰 变量类型 变量名:表达式) 举例: int[] a = {1, 3, 5, 7, 9}; int sum = 0; for (int x : a) sum += x; 【例5-9】查找2~n之间的素数的第2种做法

29 其它语句 标签语句 标签名: break语句 break;或break 标签名;
标签语句 标签名: break语句 break;或break 标签名; continue语句 continue;或continue标签名; return语句 return;或return表达式; exit语句 System.exit(状态值); 【例5-10】break、continue和标签的联合使用。

30 递归 什么是递归? 什么是递归函数? 三个最经典的递归问题: 裴波那契数列:f(0)=0;f(1)=1;f(n)=f(n-1)+f(n-2)
一个著名的故事:“老和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,……。这样没完没了地反复讲故事,直到最后老和尚烦了停下来为止。” 什么是递归函数? 直接调用自己或通过另一函数间接调用自己的函数。 不断将大问题转化为小问题,直至问题有解为止。 三个最经典的递归问题: 裴波那契数列:f(0)=0;f(1)=1;f(n)=f(n-1)+f(n-2) Ackerman函数: 梵塔(Hanoi)问题

31 递归程序举例 梵塔(Hanoi)问题 源自一个古老的传说,相传在古印度的一座神庙前,有一根串着64个祭神用的圆盘的柱子,这些圆盘是按大小顺序叠放的,大的在下,小的在上,僧侣们要将这些圆盘借助一个柱子移到另一个柱子上,移动过程中,一次只能移动一个,并且要始终保证每个柱子上的圆盘大的在下,小的在上,什么时候移完,就意味着世界末日。

32 梵塔(Hanoi)问题算法 将A上的n-1片金片借助C针移到B针上; 把A针上剩下的一片金片由A针移到C针上;
最后将剩下的n-1个金片借助A针由B针移到C针上。

33 综合举例 【例5-13】猜数游戏。

34 4.数组 数组是一种复合数据类型,代表一组同类型的变量。 数组是一种特殊的对象。
从存储方式来看,数组所代表的变量按顺序连续存放,数组本身使用一个标识符来定义,称为数组名。 所代表的每一个变量称为数组元素,数组元素在内存中所处的位置称为下标。 数组的长度是指数组中的元素个数。 数组也遵守一般变量的先定义后使用的原则。

35 数组举例 记录一个班的10名同学的数学成绩 其中,score.length ==10
定义10个变量:float score1,score2,…,score10分别存放每个同学的数学成绩 定义1个数组变量: score[]=new float[10]; 其中,score.length ==10 每个元素为: score[i](i=0,…,9) 类型为float 数组为score

36 一维数组 定义格式 举例: 类型名 数组名[][=初值];或 类型名[] 数组名[=初值]; int ai[]; //定义一个整数数组
float score[]; //定义一个float数组 float[] score; Object ao[]; //定义一个Object数组 String names[]; //定义一个字符串数组 byte[] rowvector, colvector, matrix[]; //分别定义两个字节数组和一个字节数组的数组 MyClass<int>amc[]; //定义一个带参数的对象数组

37 一维数组的初始化 数组的定义中并不为数组元素分配内存 静态初始化 使用一对大括弧“{}”加数据来对数组进行初始化 举例:
int ai[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//数组ai有10个数组元素,即ai.length为10,每个元素类型为int char[] ac = {'n', 'o', 't', ' ', 'a', ' ', 'S', 't', 'r', 'i', 'n', 'g'}; //数组ac有12个数组元素,即ac.length为12,每个元素类型为char String countryNames[] = { "中国", "美国", "法国"};//数组countryNames有3个数组元素,即countryNames.length为3,每个元素类型为String MyClass amc[] = { new MyClass(), new MyClass(), new MyClass() };//数组amc有3个数组元素,即amc.length为3,每个元素类型为MyClass Color colorPalette[] = {Color.RED, Color.GREEN, Color.BLUE };//数组colorPalette有3个数组元素,即colorPalette.length为3,每个元素类型为Color

38 一维数组的初始化(2) 动态初始化 举例: 使用构造对象的方法(new运算符)来初始化数组
int ai[] = new int[10];//数组ai有10个数组元素 int length = 35; float score[] = new float[length];//数组score有35个数组元素 String countryNames[] = new String[] { "中国", "美国", "法国"};//数组countryNames有3个数组元素,即countryNames.length为3,每个元素类型为String

39 一维数组的引用 举例: for (int i = 0; i < ai.length; i++) {
System.out.println(ai[i] * ai[i]); }

40 一维数组的完整例子 【例6-1】模拟体育比赛中的胜、平和负3种状态10000次,统计并显示每种状态的次数。
( (int) (Math.random() * 10000)) % 3 【例6-2】查找数组中是否存在某个数值。 关键代码: for (int x : arrayOfInts) { …}

41 二维数组 定义格式 举例: 类型名 数组名[][] [=初值];或 类型名[] 数组名[] [=初值];或
类型名[][] 数组名[=初值]; 举例: int ai[][]; int[] ai []; int [][]ai;

42 二维数组的初始化 二维数组的定义中不为数组元素分配内存, 分静态初始化和动态初始化 举例:
1 : int ai1[][] = new int[3][3]; 2 : int ai2[][] = { 3 : {1, 2, 3}, {4, 5, 6}, { 7, 8, 9} 4 : }; 5 : int ai3[][] = new int[3][]; 6 : ai3[0] = new int[3]; 7 : ai3[1] = new int[2]; 8 : ai3[2] = new int[1]; 9 : int ai4[][] = { 10: {1, 2, 3}, {4, 5}, {6} 11: }; 12: int ai5[][] = { 13: {1, 2}, null, {3, 4, 5} 14: };

43 二维数组的引用 举例: for (int i = 0; i < ai4.length; i++) {
for (int j = 0; j < ai4[i].length; j++) { System.out.println(ai4[i][j] * ai4[i][j]); }

44 二维数组的完整例子 【例6-4】输出如下所示的杨辉三角形。
三角形中的每一行除最左和最右为1之外,中间的每一行每一列的值=上一行当前列的值+上一行前一列的值。

45 数组与算法 java.util.Arrays类和java.lange.System类中提供了数组的初始化、拷贝、克隆、比较、查找与排序等方法。 1. 初始化方法:System.fill(a,val); 其中,a为要初始化的数组,val为初始化值。 2. 拷贝方法:Arrays.arraycopy(src,srcPos,dest,destPos,length); 其中,src为原始数组,srcPos为原始数组起始下标,dest为目标数组,destPos为目标数组起始下标,length为要拷贝的元素个数。 3. 克隆方法:a.clone(); 其中,a为数组,返回值为目标数组。 “=”表示数组引用,而clone表示复制。

46 数组与算法(2) 4. 比较方法:Arrays.equals(a1,a2);
其中,a1、a2为要比较的两个数组, “==”表示为同一个引用,而equals表示元素相等。 5. 数组排序方法:Arrays.sort(a); 其中,a为待排数组。 6. 查找方法:Arrays.binarySearch(a,key); 其中,a为待查数组,key为查找关键值,返回值为查找到的数组下标,如果未找到,返回-1。 7. 元素批输出方法:Arrays.toString(a); 其中,a为待输出数组,返回值为数组元素构成的字符串。如果直接输出a的话,得到的只是a的内存标识号,而不是所有元素值。

47 举例 【例6-7】数组与算法演示。

48 举例 【例6-8】对一组数据进行分析。原始数据如下表6-1所示: 表6-1 W县2003-2006年苹果产量表(单位:万担)
要求预测2007年的产量,采用的算法: 算术平均: 几何平均: 增长速度: 发展速度:

49 5.字符串 字符串是指用一对双引号将若干个字符括起来组成的字符序列。
Java语言中的字符串表面上是字符序列,内部却是使用对象来表示的,不能把字符串与字符数组等同起来。 包括定长字符串和可变长字符串 有时为了提高存取效率,采用定长字符串,使用String类的对象; 有时则为了修改的灵活性,采用可变长字符串,使用StringBuffer类的对象。

50 定长字符串的定义格式 String 变量名=<字符串文字量>; String() 构造一个空字符串
其中,<字符串文字量>为由一对双引号("")括起来的字符序列。 String() 构造一个空字符串 String(String original) 由原始字符串构造新的字符串 String(char[] value) 由字符数组构造字符串 String(char[] value,int offset,int count) 由字符数组的一部分构造字符串 举例: String word="月随碧山转,水合青山流。杳如星河上,但觉云林幽。"; String s=new String(); String firstName=new String("杰克"); char asc[]={'伦', 敦'} String lastname=new String(asc); String name=new String(firstName +'•'+ lastname);

51 定长字符串的引用格式 对于字符串文字量可以直接使用,而一旦定义好一个字符串变量,就可以按名存取。
String类提供了一个方法length()取得字符串的长度,即它所包含的字符个数。 比如上例中的s.length()为0,name.length()为5等。

52 定长字符串的处理算法 “+”运算符,不但可以将两个字符串拼接,还可以将其它类型的值与字符串拼接,得到一个新的字符串。
String类的常用方法

53 定长字符串举例 【例7-1】定长字符串处理方法综合演示。 【例7-2】判断字符串是否为回文。

54 可变长字符串 举例:对于可变长字符串"Dot saw I",其长度为9,而容量为17。

55 可变长字符串的定义格式 StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符。
StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 StringBuffer(String str) 构造一个字符串缓冲区,并将其初始化为指定的字符串内容。 举例: StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(28); StringBuffer s3 = new StringBuffer("地球只有一个,请爱惜她!");

56 可变长字符串的引用格式 StringBuffer类提供length()方法计算长度,capacity()方法计算容量。

57 可变长字符串的处理算法 StringBuffer类的常用方法

58 可变长字符串举例 【例7-3】可变长字符串处理方法综合演示。 【例7-4】字符串、字符数组的转换。 【例7-5】从字符串中提取单词。

59 可变长字符串举例 【例7-6】字符串四则运算表达式的计算。
算法简述:StringTokenizer类是java.util包中提供的一个解析字符串的类,其方法如下: StringTokenizer(String str, String delim) 为指定字符串构造一个StringTokenizer类的对象。其中,str为原始字符串,delim参数中的字符都是起分隔标记作用的分隔符序列。分隔符字符本身不作为标记。 boolean hasMoreTokens() 测试此标记的字符串中是否还有更多的可用标记。如果此方法返回true,那么后续调用无参数的nextToken方法将成功地返回一个标记。 public String nextToken() 返回下一个标记。

60 综合例子 【例7-7】给定一篇英文,要求完成以下功能: (1) 显示所有汉字符号; (2) 将字母转换为大写; (3) 去掉非字母符号;
(4) 统计各个字母出现的次数(不区分大小写); (5) 每个字母只保留一个。

61 作业2题目 P.46: 11.定义分数类,包括分子和分母变量、构造方法、加减乘除方法、化简方法、计算方法和显示方法。
P.68: 5. 给定x和m的值,计算: P.95: 5.找出1~10000范围内分别满足如下条件的数: (1) 7的倍数 (2) 带7的数 (3) 带777的数 P.111: 4. 已经有一个n×m的稀疏矩阵:int A[][]={{...},{...},...}; 请定义一个新数组int B[][],要求仅保存A中非零元素。 P.123: 8. 解剖身份证号字符串的意义。使用数组或String或StringBuffer验证身份证号。要求: (1) 分别对15位和18位进行处理; (2) 对正确的分别显示:出生年月日、性别和省份; (3) 对错误的显示:"输入错误"信息。。

62 实验2题目 P.360: 实验项目2

63 本讲结束! 谢谢!


Download ppt "Java技术与应用 -Java基本语法(第3~7章) 西安交大 卫颜俊 2007年4月 电子信箱:Mr.Java@163.com."

Similar presentations


Ads by Google