第三章 流程控制与数组
【目标】
掌握boolean类型的用法
了解程序的三种结构
掌握顺序结构程序设计
掌握分支(选择)结构程序设计
掌握循环结构程序设计
掌握循环结构break,continue
掌握数组,一维数组
了解二维数组,多维数组
【内容】
一boolean类型用法

常用的关系运算符:

逻辑运算符:


二程序的三种结构
基本上所有的编程语言中,程序都有三种结构:顺序结构、分支(选择)结构、循环结构。
顺序结构:从上到下的逐行执行代码。
分支结构:根据逻辑判断,有选择的执行其中某段代码。
循环结构:根据逻辑判断,重复执行某个代码块。
三顺序结构程序设计
前面的案例代码块中没有用if、switch、for、while等,都是顺序结构。
四分支(选择)程序设计
If分支结构:
单分支if:
语法:
if(表达式){
代码块
}
说明:如果表达式为true,执行if中的代码块,否则不执行
案例1:键盘输入张浩的成绩,如果成绩大于98,就提示“老师说:不错,奖励一个MP4!”

二路分支:if-else分支
语法:
if(表达式){
代码块1;
}
else{
代码块2;
}
说明:判断表达式是否为true,如果是true,就执行代码块1,;
如果表达式为false,就执行代码块2。
案例2:从键盘输入张浩的Java成绩,如果是score>=60,就输出“恭喜你,考试及格!”,否则就输出“很遗憾,准备补考!”

案例3:从键盘输入一个年份,判断是否是闰年,如果是就输出“X年是闰年”,否则就输出“X是平年”

三目运算符(三元运算符)
语法:表达式?语句1:语句2
多重if选择结构
语法:
If(表达式1){
代码块1;
}else if(表达式2){
代码块2;
}
…..
…….//中间可以有n个elseif(){}
…..
else{
代码块n;
}
说明:
如果表达式1是真的,及执行代码块1;
如果表达式1是false,就判断表达式2,如果表达式2是true,就执行代码块2.
如果代码库2是false,就接着判断…….。
如果if都是false,则执行else中的代码块n
案例:


案例2:从键盘输入月份,输出对应的季节
3,4,5春季 6,7,8夏季 9,10,11 秋季 12,1,2冬季
例如:3月是春季

嵌套if选择结构
语法:
if(条件1){
if(条件2) {
代码块1
} else if(条件3){
代码块4;
}……
else {
代码块2
}
}else {
代码块3
}
说明:
当条件1是true的时候,判断条件2,如果条件2是true,就执行代码块1;
如果条件2是false,就执行代码块2;
如果条件1是false,就执行代码块3.
案例:学校举行运动会,百米赛跑跑入10秒内的学生有资格进决赛,根据性别分别进入男子组和女子组

switch分支结构
语法:
switch(表达式){ JDK6 中表达式的类型是byte,short,int
//JDK7中表达式的类型是byte,short,int,char
case 值1:
语句块;
break;
case 值2:
break;
…
……
default:
语句n;
}
说明:
程序根据switch后面括号内的表达式的值依次判断case后面的值是否匹配。如果遇到了匹配的值,就进入这个case,执行后面的代码块,直到遇到break,跳出switch操作。
如果从第一个case到最后一个case都没有匹配的值,就进入default中,执行语句n。
案例:
从键盘输入1-7,输出对应的星期几的英文单词

案例2:从键盘输入月份,输出对应的季节
3,4,5春季 6,7,8夏季 9,10,11 秋季 12,1,2冬季
例如:3月是春季

五循环结构程序设计
while
语法:
while(表达式){
循环体;
}
说明:判断表达式的值,如果是true,就执行循环体,循环体执行完后,又回到前面判断表达式的值,如果还是true,接着再执行循环体,…….直到表达式为false,结束循环。
案例1:输出”好好学习,天天向上”一百遍

案例2:编写程序实现:1+2+3+….+100的和

案例3:编程实现:输出1-100中所有能被3整除但是不能被5整除的数据
A%3== 0 && a%5 != 0

do…while
语法:
do{
循环语句;
}while(循环条件表达式);
说明:先执行循环语句,然后再判断while后面的条件,如果条件为true,就在执行do里面循环语句;在去判断while条件…..依次循环,直到表达式的值为false,循环结束。
案例1:编写程序实现:1+2+3+….+100的和

案例2:编程实现:输出1-100中所有能被3整除但是不能被5整除的数据

while和do… while区别
while(条件){
循环语句;
}
do{
循环语句;
}while(条件)
while:先判断,再执行
do..while:先执行,再判断,至少会执行一次
for循环
语法:
for(语句1;语句2;语句3){
循环操作;
}
语句1:初始化循环变量,inti = 1;
语句2:循环条件,i<=100
语句3:循环增量,如i++
案例1:编写程序实现:1+2+3+….+100的和

案例2:编程实现:输出1-100中所有能被3整除但是不能被5整除的数据

案例3:


嵌套循环

案例1:某次程序大赛,某些班有某些名学员参加,学员的成绩由用户输入,计算该班参赛学员的平均分

案例2:编写程序,打印九九乘法表


案例3:打印输出下面的图形

分析步骤:

上半部分:

六循环控制break,continue
Break:可以再switch中使用,也可以在循环结构中使用
Break案例:

结果:

Continue:结束当前这一次循环

结果:

案例:


数组的定义、初始化:

数组定义:
语法:
数据类型[]数组名字;//常用 int [] a;(推荐)
数据类型 数组名字[];//不常用 inta[];
数组初始化:
静态初始化:
静态初始化:初始化数组时由程序员指定类每个元素的值,不指定数组的长度,长度由系统自己计算.
int[]a;
a =new int[]{1,2,3};
int[]a = new int[]{1,2,3};
int[]a = {1,2,3}; 简写 最常用
案例://错误的
int[] a;
a= {1,2,3};
动态初始化:
初始化数组时程序员只指定数组长度,不指定数组元素的值,系统自动给数组分配初始值。
int[]a;
a =new int[5];
int[]a = new int[5];
系统初始值:
byte、short、int、long ---------------- 0
float、double ---------------- 0.0
char ---------------- ‘\u0000’ 对应空
boolean ---------------- false
String ---------------- null
引用类型:数组、类、接口---------------- null
访问数组元素
数组中每个元素都有一个下标,下标是从0开始
Int[]a = {1,2,33,34,56,7};
元素 下标 元素值
1 ----------------- 0 ---------- a[0]
2 ----------------- 1 ---------- a[1]
33----------------- 2 ----------- a[2]
34----------------- 3 ----------- a[3]
56----------------- 4 ----------- a[4]
7 ----------------- 5 ----------- a[5]
案例:

案例2:下标越界

结果:

案例3:数组初始值


访问所有元素
要输出数组中所有的元素,需要用到循环,比如for,foreach

如果数组很长怎么办?怎么知道循环多少次?
在java中数组有一个属性length,记录了数组的长度.

补充:在JDK5之后加入一个foreach循环,可以输出数组元素

数组应用
数组求和:
案例:有一组学生成绩如下:79,85,96,52,68求出这组学生成绩总和

数组求平均值:
案例:有一组学生成绩如下:79,85,96,52,68求出这组学生成绩的平均分

数组求最大值、最小值
案例:有一组学生成绩如下:79,85,96,52,68求出这组学生成绩的最高分、最低分
最大值:最小值

把上面代码合并:

查找某个元素是否在数组中
案例:有一组学生成绩如下:79,85,96,52,68,从键盘输入一个分数,查找该数组中是否包含这个分数

分段统计
eg:有一组学生成绩:78,65,96,52,88,统计出及格人数和不及格人数

eg:有一组学生成绩:78,65,96,52,88,统计出高于平均分的人数和低于平均分的人数

eg:有一组学生成绩:78,65,96,52,88,统计出90-100分,81-89分,70-79分,60-69分,0-60分的人数

数组内存分析
栈内存:基本数据类型变量值,引用类型变量的地址
堆内存:引用类型的真实值
案例一:


案例二:


案例三:


案例四:


八二维数组、多维数组
Java中没有多维数组、一维数组中放的是多个普通变量,二维数组中放的是多个一维数组,三维数组中存放的是多个二维数组….
二维数组

二维数组定义
语法:数据类型[][] 数组名;//常用 int[][] c;
数据类型 数组名[][];//不常用 intc[][];
二维数组初始化
静态初始化
初始化数组时由程序员显示的指定数组中每个元素的值,不指定数组的长度,长度由系统自己统计。
案例1:
int[][]a;
a= new int[][]{{1,2,3},{5,6,7}};
案例2:
int[][]a = new int[][]{{1,2,3},{5,6,7}};
int[][]a = {{1,2,3},{5,6,7}}; 简写最常用
案例3://错误的
int[][] a;
a = {{1,2,3},{5,6,7}};
动态初始化:
初始化数组时程序员只指定数组长度,不指定数组元素的值,系统自动分配数组的初始化值。
案例1:
int[][] a;
a =new int[3][3];
案例2:
int[][]a = new int[3][3];
案例一:(遍历)输出二维数组中的所有元素

案例2:五子棋


三维数组

案例1:输出三位数组所有的元素

数组排序:
排序
选择排序和冒泡排序
选择排序
每一趟排序都从待排序的数组中找到最小(或最大)的一个元素,把这个最小的元素放在已排好序的数组的最后位置,直到全部排序完成。
int[]a = {12,23,9,24,15,3,18 }


选择排序,从大到小

冒泡排序
冒泡排序步骤:
比较相邻两个元素,如果第一个大于第二个,就交换他们两个。
对每一对相邻的元素做同样的工作,从开始第一对到结尾的最后一对。最后一个元素是数组中元素的最大值。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对剩下的元素重复上面的步骤,直到没有任何一个数字需要比较。


从大到小排序




