五、双重循环
1.双重循环的定义
在一个循环中,嵌套另一个循环;叫做双重循环(循环的嵌套)
2.双重for循环的格式
外层和内层循环,都是任意循环
原理:外层循环一次,内层循环遍历一轮
遍历:从条件开始,到循环结束,整个循环,称为遍历
for(初始条件1;条件判断1;条件改变1){
// 循环语句1
for(初始条件2;条件判断2;条件改变2){
// 循环语句2
}
}
1.初始条件1;
2.条件判断1;
3.执行循环语句1;
4.初始条件2;
5.条件判断2;
6.执行循环语句2;
7.条件改变2;
8.重复执行5,6,7。直到条件判断2的结果为false;
9.执行条件改变1.
10.从2开始进行循环直到条件判断1为false
- 案例1:打印矩形:
打印矩形:(先循环行,再循环列)
********************
********************
********************
********************
System.out.println("行数");
Scanner sc = new Scanner(System.in);
int rows = sc.nextInt();
System.out.println("列 数");
int cols = sc.nextInt();
for (int i = 1;i<=rows;i++){
//行的内容
for (int j = 1; j <cols;j++){
System.out.print("*");
}
System.out.println("");
- 案例2:九九乘法表
\t:tab水平制表,相当于4个空格
//九九乘法表
for (int i = 1;i <= 9 ;i++ ){
//输出行的内容
for (int j = 1; j <= i ; j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println("");
}
案例3:打印星星
*
***
*****
*******
*****
*****
*****
*****
*
***
*****
*******
*****
***
*
- System.out.println与System.out.print的区别
System.out.println: 输出换行
System.out.print: 输出不换行
3.双重循环中使用break
正常情况break,跳出的是离他最近的循环
public static void main(String[] args){
for(int i = 0; i<3; i++){
System.out.println("i:"+i); // i:0 i:1 i:2
if(i==2){
break;
}
for(int j= 0 ;j<3; j++){
System.out.println("j"+j); // 0 1 2 0 1 2
}
}
}
break 标签:
flag1:
for(int i=0; i<3 ; i++){
System.out.println(i);
flag2:
for(int j = 0 ;j<3; j++){
if(j==2){
break flag1;
}
}
}
4.双重循环中使用continue
正常情况continue,结束这一次离他最近的循环
ontinue 标签
public static void main(String[] args){
flag:for(int i = 0; i<3; i++){
System.out.println("i:"+i); // 0 1 2
flag2:for(int j= 0 ;j<3; j++){
if(j==1){
continue flag;
}
System.out.println("j"+j); // 0 0 0
}
}
}
5.多重循环
多个循环的嵌套
注意:一般不超过三个循环(性能过低),如果超过时,就要进行代码优化。
测试
1.计算饭钱
有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭 共花了500元,每个男人各花30元,
每个女人各花20元,每个小孩各花10元,问男人、女人和小孩各有几人?
男人 ; 1 - 30
女人: 1- 30
小孩 : 1-30
for(int man= 1 ; man<=17; man++){
for(int women = 1; women<=25; women++){
int child = 30-man - women;
if(man*30 + women*20 +child*10 == 500){
//输出
}
}
}
2.分解质因数
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。输入60=2*2*3*5。
3. 从1加到100,求总和。
4. 从 1 加到 100 所有奇数之和。
5.九九乘法表
6.打印星星
六、数组
1.数组概念
案例需求
在需要统计我们班学生成绩的情况,例如计算平均成绩、找到最高成绩等。
假设该我们班有50名学生,用前面所学的知识,程序首先需要声明50个变量来分别记住每位学生的成绩,然后在进行操作,这样做会显得很麻烦,而且错误率也会很高。
// 先要有50个学生的成绩
int score1 = 88;
int score2 = 66;
...
// 有没有一种变量,可以存多个值
score1 = 77;
// 数组
- 数组概念
数组是一种容器,可以同时存放多个(同类型的数据)数据, 数据按照一定的顺序进行排列
在内存开辟一块连续的地址空间 - 数组特点:
1.数组的长度是固定
2.数组存储的数据类型必须相同
3.数组可以存储任意数据类型( 基本类型,引用类型都可以)
2.数组的术语
数组名
下标,从0开始
数据元素:数组中存储的值
3.定义数组
第一种:(推荐)
数据类型[] 数组名;
第二种:
数据类型 数组名[];
4.数组的赋值
静态初始化
数据类型[] 数组名 = {数据元素, 数据元素, 数据元素 … };
数组的长度,由系统根据数据元素的个数来创建,且按照顺序进行存储
动态初始化
数据类型[] 变量名 = new 数据类型[ 长度 ];
// 动态初始化的长度,由用户指定 ; 数据有默认值
int[] scores = new int[3];
// 左边
int 数组存储的数据类型
[] 代表它是一个数组
scores 数组名
//右边
new 创建一个数组 分配内存
int 数据元素的类型为int
[] 说明是一个数组
3 说明数据的长度是3
注: new数组时, 会有默认值
整形基本数据类型 byte short int long默认值都为0
浮点型基本数据类型 float double 默认值为0.0
字符基本数据类型 char 默认值是 ‘ ’ 空格 unicode码为 \u0000
boolean 基本数据类型默认值为false
引用类型的默认值 ,都为null
[扩展]: unicode 编码
测试:
- 求平均值 int[] scores = {11,23,54,567,78};
- 求最大值
错误:
- java.lang.ArrayIndexOutOfBoundsException 数组下标越界