循环与数组

循环结构与数组

概述

​ 循环剩下的内容,包括do…while循环和循环语句的嵌套使用;下午学习了数组的基础知识,包括:数组的基本概念及其存储过程;数组的创建,数组的初始化;数组的遍历;数组的比较;数组的冒泡排序。现总结如下:

1.1 循环结构
1.1.1do…while 循环

基本格式

do{

​ 循环体语句;

}while(条件判断语句);

完整格式:

初始化语句;

do{

​ 循环体语句;

​ 条件控制语句;

}while(条件判断语句);

注意事项:

  • 无论如何,do…while…都会执行一次循环体;
  • while中的条件成立时,才会执行循环体;
  • 小括号后边一定要加分号(“;”);

执行流程

  1. 执行初始化语句;

  2. 执行循环体语句;

  3. 执行条件控制语句;

  4. 执行条件判断语句,看其结果是true还是false

    如果是false,循环结束;

    如果是true,继续执行;

  5. 回到2继续。

package com.kaifamiao.statements;

import java.util.Scanner;

public class Deer {
    public static void main(String[] args) {
        final Scanner s = new Scanner( System.in );

        int age = 0 ;
        // do { 循环体 } while ( 条件 );
        do {
            if( age < 0 || age > 150 ) {
                System.out.println( "你输入的年龄不符合正常人类的寿命范围,请重新输入" );
            } else {
                System.out.println( "请输入你的年龄:" );
            }
            age = s.nextInt();
        } while ( age < 0 || age > 150 );
        System.out.println( "第一个循环中输入的年龄: " + age );

        String msg1 = "请输入你的年龄:";
        String msg2 = "你输入的年龄不符合正常人类的寿命范围,请重新输入";
        boolean error = false;
        do {
            System.out.println( error ? msg2 : msg1 );
            age = s.nextInt();
        } while ( error = age < 0 || age > 150 );
        System.out.println( "第二个循环中输入的年龄: " + age );

        s.close();
    }
}

1.1.2 循环嵌套

在解决实际问题中,循环经常是嵌套使用,从而更好的解决问题;

package com.kaifamiao.statements;

// 用嵌套循环找出1到100之间的质数
public class Donkey {
    public static void main(String[] args) {
        // 第一层循环用于取遍1到100之间所有的自然数
        for( int n = 2; n <= 100 ; n++ ){
            // 先假设n是个质数
            boolean isPrime = true;

            // 判断n是否可以被除1和n之外的自然数整除
            for( int p = 2 ; p <= Math.sqrt(n) ; p++ ) {
                // 若自然数n能够被p整除则可以退出内层循环
                if( n % p == 0 ){
                    // 推翻假设
                    isPrime = false;
                    break; // 跳出当前循环(终止当前循环)
                }
            }

            if( isPrime ) {
                System.out.printf("%d是质数\n", n);
            }
        }
    }
}

1.1.3 跳转控制语句
  • continue:用在循环中,基于条件控制,跳过某次循环体内容的执行,继续下一次的执行;
  • break: 用在循环中,基于条件控制终止循环内容的执行,也就是说结束当前的整个循环。
package com.kaifamiao.statements;

// 鹳:Stork
public class Stork {
    public static void main(String[] args) {

        for ( int i = 1 ; i < 6 ; i++ ) {
            System.out.println( "before break: " + i );
            if( i == 2 ) {
                break;
            }
            System.out.println( "after break: " + i );
        }

        System.out.println( "- ".repeat( 15 ) );

        for ( int i = 1 ; i < 6 ; i++ ) {
            System.out.println( "before break: " + i );
            if( i == 2 ) {
                continue;
            }
            System.out.println( "after break: " + i );
        }
    }
}

1.1.4 label标识的循环
package com.kaifamiao.statements;

// 鸹: Crow
public class Crow {
    public static void main(String[] args) {

        // 用 标签(label) 标识的循环
        outer:for( int i = 1 ; i < 6 ; i++ ){
            inner:for (int j = 1; j < 6; j++) {
                if ( j == 3 ) {
                    // break;
                    // break inner;
                    break outer;
                }
                System.out.printf( "(%d,%d)\t", i , j );
            }
            System.out.println();
        }

        System.out.println( "\n- - - - - - - - - - - - - - - -");

        // 用 标签(label) 标识的循环
        outer:for( int i = 1 ; i < 6 ; i++ ){
            inner:for (int j = 1; j < 6; j++) {
                if ( j == 3 ) {
                    // continue;
                    // continue inner;
                    continue outer;
                }
                System.out.printf( "(%d,%d)\t", i , j );
            }
            System.out.println();
        }

    }
}

1.1.4 三种循环语句的区别
  • do…while循环先执行循环体语句,即至少执行一次;

  • 在for循环里定义的变量,在循环结束后不可以使用,while的初始化语句位于循环体外边,即使循环结束,仍然可以使用;

  • 死循环

    /*for的死循环
    
    //这样的形式的for循环表示for循环的条件永远为真
    
    	for(; ;) {
    		System.out.println("for");
    	}
    /	
    /while的死循环
    		while(true) {
    		System.out.println("while");
    	}/
    /**do...while的死循环
     do{
     System.out.println("do...while");
     }while(true);
    
    */
    
    

    三种循环的区别

    • for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
    • do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)

    for和while的区别

    • 条件控制语句所控制的自增变量,因为归属到for循环的语法结构中,在for循环结束之后,就不能在访问到了;
    • 条件控制语句所控制的自增变量,对于while循环来说,不归属其语法结构中,在while循环结束后,该变量仍然可以继续使用。
1.2 数组
1.2.1数组的定义与创建

数组概述

  • 一次性声明大量的用于存储数据的变量
  • 要存储的数据通常都是同类型数据,例如:考试成绩

什么是数组

​ 数组(array)是一种用于存储多个相同类型的数据的存储模型

数组的定义格式

  • 格式一:数据类型[] 变量名

  • 范例: int [] arr

  • 定义了一个int类型的数组,数组名是arr

  • 格式二: 数据类型 变量名[]

  • 范例:int arr[]

  • 定义了一个int类型的变量,变量名是arr数组

推荐使用格式一

数组初始化

​ java中的数组必须先初始化,然后才能使用。

​ 所谓的初始化,就是为数组中的元素分配内存空间,并为每个数组元素赋值。

数组初始化方式

  • 动态初始化

​ 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值

格式:数据类型[] 变量名 = new 数据类型[数组长度]

范例:int [] arr = new int[3];

  • 静态初始化

    静态初始化:初始化时指定每个元素的初始值,由系统决定数组长度

格式: 数据类型[] 变量名 = {变量值}

package com.kaifamiao.arrays;

// 初始化数组
public class Initialization {
    public static void main(String[] args) {

        // 静态初始化: 定义数组变量时直接使用数组常量对数组进行初始化
        short[] shorts = { 188, 29, 89, 0x24, 01 };
        // 遍历数组
        for( int index = 0 ; index < shorts.length ; index++ ) {
            System.out.printf( "%d\t", shorts[index] );
        }
        System.out.println();

        System.out.println( "~ ".repeat( 10 ) );

        // 创建数组实例(并为每个元素赋予默认值)
        int[] ints = new int[5];
        // 遍历数组
        for (int i = 0; i < ints.length ; i++) {
            System.out.print( ints[i] + "\t");
        }
        System.out.println();

        // 动态初始化: 在创建数组实例后再对数组进行初始化
        ints[0] = 100;
        ints[1] = 99;
        ints[2] = 101;
        ints[3] = 33;
        ints[4] = 99;

        // 遍历数组
        for (int i = 0; i < ints.length ; i++) {
            System.out.print( ints[i] + "\t");
        }
        System.out.println();

        // 基本数据类型的数组中元素默认值:
        //    byte: 0
        //   short: 0
        //     int: 0
        //    long: 0L
        //   float: 0.0f
        //  double: 0.0
        //    char: '\u0000'
        // boolean: false

        System.out.println( "~ ".repeat( 10 ) );

        // 引用类型的数组中元素默认值都是 null
        Object[] objects = new Object[3];
        for (int i = 0; i < objects.length; i++) {
            System.out.println( objects[i] );
        }
    }
}

package com.kaifamiao.arrays;

// 创建数组
public class Creation {
    public static void main(String[] args) {
        // 在定义"数组变量"时使用"数组常量"隐式创建并初始化数组
        byte[] bytes = { 10, 0, 4, 99 };
        System.out.println( bytes[0] );
        System.out.println( bytes[1] );
        System.out.println( bytes[2] );
        System.out.println( bytes[3] );

        // 显式通过 new 关键字来创建"数组实例"并通过"数组产量"初始化数组
        char[] chars = new char[]{ 'm', 'i', 'a', 'o' };
        System.out.println( chars[0] );
        System.out.println( chars[1] );
        System.out.println( chars[2] );
        System.out.println( chars[3] );
    }
}

package com.kaifamiao.arrays;

// 理解数组基本概念: 数组类型、数组变量、数组常量、下标或索引、数组元素、数组长度
public class Concept {

    public static void main(String[] args) {
        int a = 100;
        System.out.println( a );
        // int[] 是 变量 x 的类型 (数组类型)
        // x 是 变量名称 (数组变量) [也被称作数组名]
        // { 1, 3, 5, 7, 9 } 是 数组常量
        int[] x = { 1, 3, 5, 7, 9 };
        // 通过 x[位置] 形式可以访问数组中指定的值
        // 其中用来表示 位置 的数值被称作 索引 或 下标,比如 x[ 2 ]
        System.out.println( x[ 2 ] );
        // 在数组中存放的每个值被称作元素,比如 x[1]

        // 可以通过 length 属性来获取数组长度(即数组中可以容纳的最多元素个数)
        System.out.println( x.length );
        // 每个数组的 length 属性都是 public 、final 修饰的
        // x.length = 10; // Cannot assign a value to final variable 'length'
    }

}

1.2.2 Java中内存分配

​ Java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

​ 数组在初始化时,会为存储空间添加默认值

  • 整数默认值是0
  • 浮点数默认值是0.0
  • 布尔值的默认值是false
  • 字符的默认值是空字符
  • 引用数据类型默认值是null

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPAvvD98-1666106453459)(.\images\array.png)]

  • 栈内存:存储局部变量

    局部变量:定义在方法中的变量,例如:arr,使用完毕,立即消失

  • 堆内存:存储new出来的内容(实体,对象)

    数组在初始化时,会为存储空间添加默认值

    • 整数默认值是0
    • 浮点数默认值是0.0
    • 布尔值的默认值是false
    • 字符的默认值是空字符
    • 引用数据类型默认值是null

    每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收。

1.2.3数组元素的访问
  • 数组变量访问方式

  • 格式:数组名

  • 数组内部保存的数据的访问方式

  • 格式:数组名[索引]

  • 索引是数组中数据的编号方式

  • 作用:索引用于访问数组中数据使用,数组名[索引]等同于变量名,是一种特殊的变量名,索引从0开始。

  • 索引的特征

    • 索引从0开始
    • 索引是连续的
    • 索引逐一增加,每次加1
1.2.4数组的遍历

​ 所谓遍历,就是按照一定顺序访问数组中的每一个元素。

​ 按理说就是输出或呈现数组中的每一个元素,但是当元素足够多的时候,输出语句已经不可能实现,因此,就可以采用循环的方式,对其索引套用循环。

package com.kaifamiao.arrays;

// 遍历数组
public class Traversal {
    public static void main(String[] args) {

        char[] chars = { '春', '眠', '不', '觉', '晓' };
        // System.out.println( System.identityHashCode( chars ) );
        for( int i = 0, n = chars.length; i < n ; i++ ) {
            char ch = chars[i];
            System.out.println(ch);
        }

        System.out.println( "- ".repeat( 10 ) );

        // 显式创建"数组实例"并用"数组常量"初始化新数组
        chars = new char[]{'处', '处', '闻', '啼', '鸟'};
        // System.out.println( System.identityHashCode( chars ) );
        for( int i = chars.length - 1 ; i >= 0 ; i-- ) {
            char ch = chars[i];
            System.out.println(ch);
        }
    }
}

1.2.5比较两个数组是否相等
  • 判断两个不同的数组实例是否"相等":
    • 首先数组长度相等(元素个数相同)
    • 其次相应位置的元素都相等(相同下标处的元素相等)
package com.kaifamiao.arrays;

import java.util.Arrays;

// 判断两个不同的数组实例是否"相等":
// 1、首先数组长度相等(元素个数相同)
// 2、其次相应位置的元素都相等(相同下标处的元素相等)
public class Equal {
    public static void main(String[] args) {

        int[] first = { 10, 0, 4, 88 };
        System.out.println( first );

        int[] second = { 10, 0, 4, 88 };
        System.out.println( second );

        System.out.println( first == second ); // false

        if( first == second ) {
            System.out.println( "相等" );
        } else if( first.length == second.length ) {
            boolean equal = true;
            for (int i = 0; i < first.length; i++) {
                if( first[i] != second[i] ) {
                    equal = false;
                    break;
                }
            }
            System.out.println( equal ? "相等" : "不相等" );
        } else {
            System.out.println( "两个数组不相等" );
        }

        System.out.println( "- ".repeat( 10 ) );

        boolean result = Arrays.equals( first, second );
        System.out.println( result );
    }
}

1.2.6数组的冒泡排序
package com.kaifamiao.arrays;

import java.util.Arrays;

// 数组排序: 冒泡排序
public class BubbleSort {
    public static void main(String[] args) {
        int[] array = { 10, 2, 9, 3, 6, 7, 8, 4, 5, 1 };
        // 遍历数组
        for (int i = 0; i < array.length; i++) {
            System.out.printf("%d\t", array[i]);
        }
        System.out.println();

        // 冒泡排序
        for( int i = 0 ; i < array.length - 1 ; i++ ) {
            System.out.printf( "第%d轮\n" , i + 1 );
            for (int j = 0; j < array.length - 1 - i ; j++) {
                if (array[j] > array[j + 1]) {
                    array[j] ^= array[j + 1];
                    array[j + 1] ^= array[j];
                    array[j] ^= array[j + 1];
                }
                System.out.println("\t" + Arrays.toString(array));
            }
        }

        // 遍历数组
        for (int i = 0; i < array.length; i++) {
            System.out.printf("%d\t", array[i]);
        }
        System.out.println();

        // 使用冒泡排序对 char 数组进行排序
        // char[] chars = { 'k','a','i','f','a','m','i','a','o'}
        // 排序后的顺序是 a a a f i i k m o
    }
}

2 问题及解决方式
2.1 33选7
package com.ikaifamiao.homework;

import java.util.Arrays;
import java.util.Random;

public class NumberChoose {
    public static void main(String[] args) {
        int[] str = new int[7];
        for (int i = 0; i < 7; i++) {
            Random random = new Random();
            int number = random.nextInt(34);
            for (int j = 0; j < i; j++) {
                if (str[i] == str[j]) {
                    str[i] = number;
                    i--;
                    break;
                }
            }
        }
        for (int i = 0; i < 7; i++) {
            System.out.println(str[i] + " ");
        }
    }
}

22.2 二进制转换器
package com.ikaifamiao.homework;

import java.util.Scanner;

// 二进制转换器
public class BinaryConverter {
    public static void main(String[] args) {
        // 创建扫描器
        Scanner s = new Scanner( System.in );
        System.out.println( "请输入一个整数" );
        final int input = s.nextInt();
        final int sign = input >= 0 ? 1 : -1;

        //求取用户所输入整数的绝对值
        int t = input >= 0 ? input : -input;

        int[] bits = new int[32];
        for (int i = 0; i < bits.length; i++) {
            System.out.printf("%d", bits[i]);
        }
        System.out.println();

        int index = bits.length - 1;
        while ( t > 0 ){
            int y = t % 2; // 整除2求余数
            bits[ index ] = y ; // 将余数保存到数组指定位置
            index--;
            t = t / 2 ; // 整除2求商并赋值
        }

        if( sign == 1 ) {
            System.out.print( input + "的二进制形式是:");
            for (int i = 0; i < bits.length; i++) {
                System.out.printf("%d", bits[i]);
            }
            System.out.println();
        } else {

        }

        // 关闭扫描器
        s.close();
    }
}

22.3 六十甲子
package com.kaifamiao.arraydemo;

public class Chronology {
    public static void main(String[] args) {
        char[] heavenlyStems = { '甲' , '乙' , '丙' , '丁' , '戊' , '己' , '庚' , '辛' , '壬' , '癸' };
        char[] earthlyBranches = { '子' , '丑' , '寅' , '卯' , '辰' , '巳' ,
                '午' , '未' , '申' , '酉' , '戌' , '亥' };
        int j = 0;
        int year  = 0;
        int k = 0;
        while (year <60){
            for (int i = 0; i < 10; i++) {
                if (j == 12){
                    j=0;
                }
                System.out.print(" "+heavenlyStems[i]+earthlyBranches[j]);
                k++;
                if (k==12){
                    System.out.println();
                    k=0;
                }
                year++;
                j++;
            }
        }
    }
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值