五、双重循环

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 编码

测试:

  1. 求平均值 int[] scores = {11,23,54,567,78};
  2. 求最大值

错误:

  • java.lang.ArrayIndexOutOfBoundsException 数组下标越界