第五、六章

第五章程序控制结构

5.1switch分支结构
在这里插入图片描述
每一个分支结构最后要记得加break;表示退出。

import java.util.Scanner;
public class Switch01 {
//编写一个 main 方法
	public static void main(String[] args) {
		/*
		请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
		a 表示星期一,b 表示星期二 …
		根据用户的输入显示相应的信息.要求使用 switch 语句完成
		思路分析
		1. 接收一个字符 , 创建 Scanner 对象
		2. 使用 switch 来完成匹配,并输出对应信息
		代码
		*/
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入一个字符(a-g)");
		char c1 = myScanner.next().charAt(0);//
		//在 java 中,只要是有值返回,就是一个表达式
		switch(c1) {
			case 'a' :
			System.out.println("今天星期一,猴子穿新衣");
			break;
			case 'b' :
			System.out.println("今天星期二,猴子当小二");
			break;
			case 'c' :
			System.out.println("今天星期三,猴子爬雪山..");
			break;
		//..... default:
		System.out.println("你输入的字符不正确,没有匹配的");
		}
		System.out.println("退出了 switch ,继续执行程序");
		}
}

在这里插入图片描述
有时候case里面的语句可以省,例如:
根据用于指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季。

import java.util.Scanner;
public class SwitchExercise {
	public static void main(String[] args) {
		//打印该月份所属的季节。
		//3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
		//思路分析
		//1. 创建 Scanner 对象, 接收用户输入
		//2. 使用 int month 接收
		//3. 使用 switch 来匹配 ,使用穿透来完成,比较简洁
		Scanner myScanner = new Scanner(System.in);
		System.out.println("输入月份");
		int month = myScanner.nextInt();
		switch(month) {
			case 3:
			case 4:
			case 5:
				System.out.println("这是春季");
			break;
			case 6:
			case 7:
			case 8:
				System.out.println("这是夏季");
			break;
			case 9:
			case 10:
			case 11:
				System.out.println("这是秋季");
			break;
			case 1:
			case 2:
			case 12:
				System.out.println("这是冬季");
				break;
			default :
				System.out.println("你输入的月份不对(1-12)");
			}
		}
}

5.2while循环控制
巧妙应用

5.3do…while循环控制语句

  1. do while 是关键字
  2. 也有循环四要素, 只是位置不一样
  3. 先执行,再判断,也就是说,一定会至少执行一次
  4. 最后 有一个 分号 ;
  5. 注意while和do…while的区别
    5.4多重循环控制
    5.4跳转控制语句break
    Math.random()生成大于等于0.0小于1.0的数,乘以100,强制转为int,范围就是[0,99],所以还要+1
    在这里插入图片描述
    明字符串 的内容 比较使用的方法 equals
//实现登录验证,有 3 次机会,如果用户名为"丁真" ,密码"666"提示登录成功,否则提示还有几次机会,请使用 for+break
//完成
import java.util.Scanner;
public class BreakExercise02 {
	public static void main(String[] args) {
		// 思路分析
		// 1. 创建 Scanner 对象接收用户输入
		// 2. 定义 String name ; String passwd; 保存用户名和密码
		// 3. 最多循环 3 次[登录 3 次],如果 满足条件就提前退出
		// 4. 定义一般变量 int chance 记录还有几次登录机会
		
		Scanner myScanner = new Scanner(System.in);
		String name = "";
		String passwd = "";
		int chance = 3; //登录一次 ,就减少一次
		for( int i = 1; i <= 3; i++) {//3 次登录机会
			System.out.println("请输入名字");
			name = myScanner.next();
			System.out.println("请输入密码");
			passwd = myScanner.next();
			//比较输入的名字和密码是否正确
			//补充说明字符串 的内容 比较 使用的 方法 equals
			if("丁真".equals(name) && "666".equals(passwd)) {
			System.out.println("恭喜你,登录成功~");
			break;
		}
		//登录的机会就减少一次
		chance--;
		System.out.println("你还有" + chance + "次登录机会");
		}
		}
}

==和equal的区别:
1.对象类型不同
equals():是超类Object中的方法。
==:是操作符。
2.equals():用来检测两个对象是否相等,即两个对象的内容是否相等。
==:用于比较引用和比较基本数据类型时具有不同的功能,具体如下:
1)基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
2)引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

5.5跳转控制语句continue

  1. continue 语句用于结束本次循环,继续执行下一次循环。
  2. continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的
    使用的规则一样.

5.6跳转控制语句-return
return 使用在方法,表示跳出所在的方法

第 6 章 数组、排序和查找

6.1数组的使用
使用方式1—动态初始化
数组定义:
数据类型 数组类型[] =new 数据类型[大小]
int a[] new int[5];创建一个数组,名字a,存放5个int

使用方式2—动态初始化
先声明数组:
语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;
创建数组:
语法: 数组名=new 数据类型[大小];
a=new int[10];

使用方式3—静态初始化
初始化数组:
语法:数据类型 数组名[]={元素值,元素值,…}

注意细节:
1)数组创建后,如果没有赋值,有默认值
int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
2)数组属引用类型,数组型数据是对象(object)
应用:
创建一个 char 类型的 26 个元素的数组,分别 放置’A’-‘Z’。使用 for 循环访问所有元素并打印出来。提示:char 类型
数据运算 ‘A’+2 -> 'C

public class ArrayExercise01 {
	public static void main(String[] args) {
		/*
		1. 定义一个 数组 char[] chars = new char[26]
		2. 因为 'A' + 1 = 'B' 类推,所以老师使用 for 来赋值
		3. 使用 for 循环访问所有元素
		*/
		char[] chars = new char[26];
		for( int i = 0; i < chars.length; i++) {//循环 26 次
			//chars 是 char[]
			//chars[i] 是 char
			chars[i] = (char)('A' + i); //'A' + i 是 int , 需要强制转换
		}
		//循环输出
		System.out.println("===chars 数组===");
		for( int i = 0; i < chars.length; i++) {//循环 26 次
			System.out.print(chars[i] + " ");
		}
	}
}

6.2数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
    int n1 = 2; int n2 = n1;
  2. 数组在默认情况下是引用传递,赋的值是地址。
    看一个案例,并分析数组赋值的内存图(重点, 难点. )。
    int[] arr1 = {1,2,3};
    int[] arr2 = arr1;
    在这里插入图片描述
    6.3数组拷贝
    将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组, 要求数据空间是独立的.
public class ArrayCopy {
	public static void main(String[] args) {
		//创建一个新的数组 arr2,开辟新的数据空间
		//大小 arr1.length;
		int[] arr2 = new int[arr1.length];
		//遍历 arr1 ,把每个元素拷贝到 arr2 对应的元素位置
		for(int i = 0; i < arr1.length; i++) {
			arr2[i] = arr1[i];
		}
		//老师修改 arr2, 不会对 arr1 有影响. arr2[0] = 100;
		//输出 arr1
		System.out.println("====arr1 的元素====");
		for(int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i]);//10,20,30
		}
	}
}

6.4数组反转

6.5数组添加/扩容
实现动态的给数组添加元素效果,实现对数组扩容。

  1. 原始数组使用静态分配 int[] arr = {1,2,3}
  2. 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4}
  3. 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
import java.util.Scanner;
public class ArrayAdd02 {
	public static void main(String[] args) {
		Scanner myScanner = new Scanner(System.in);
		//初始化数组
		int[] arr = {1,2,3};
		do {
			int[] arrNew = new int[arr.length + 1];
			//遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组
			for(int i = 0; i < arr.length; i++) {
				arrNew[i] = arr[i];
			}
			System.out.println("请输入你要添加的元素");
			int addNum = myScanner.nextInt();
			//把 addNum 赋给 arrNew 最后一个元素
			arrNew[arrNew.length - 1] = addNum;
			//让 arr 指向 arrNew, arr = arrNew;
			//输出 arr 看看效果
			System.out.println("====arr 扩容后元素情况====");
			for(int i = 0; i < arr.length; i++) {
				System.out.print(arr[i] + "\t");
			}
			//问用户是否继续
			System.out.println("是否继续添加 y/n");
			char key = myScanner.next().charAt(0);
			if( key == 'n') { //如果输入 n ,就结束
				break;
			}
			}while(true);
			System.out.println("你退出了添加...");
		}
}

6.6排序的介绍
1内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法)
2外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
3冒泡排序法;冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部

6.7查找
index索引技巧
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否
包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值

import java.util.Scanner;
public class SeqSearch {
	public static void main(String[] args) {
		/*
		思路分析
		1. 定义一个字符串数组
		2. 接收用户输入, 遍历数组,逐一比较,如果有,则提示信息,并退出
		*/
		//定义一个字符串数组
		String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入名字");
		String findName = myScanner.next();
		//遍历数组,逐一比较,如果有,则提示信息,并退出
		//这里老师给大家一个编程思想/技巧, 一个经典的方法
		int index = -1;//技巧
		for(int i = 0; i < names.length; i++) {
			//比较 字符串比较 equals, 如果要找到名字就是当前元素
			if(findName.equals(names[i])) {
				System.out.println("恭喜你找到 " + findName);
				System.out.println("下标为= " + i);
				//把 i 保存到 index
				index = i;
				break;//退出
			}
		}
		if(index == -1) { //没有找到
			System.out.println("sorry ,没有找到 " + findName);
		}
	}
}

6.8二维数组
使用方式 1— 动态初始化

  1. 语法: 类型[][] 数组名=new 类型[大小][大小]
  2. 比如: int a[][]=new int[2][3]

在这里插入图片描述
使用方式 2:—动态初始化
先声明:类型 数组名[][]; TwoDimensionalArray02.java
再定义(开辟空间) 数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0)
在这里插入图片描述

public class TwoDimensionalArray03 {
	public static void main(String[] args) {
		/*
		看一个需求:动态创建下面二维数组,并输出
		i = 0: 1
		i = 1: 2 2
		i = 2: 3 3 3 一个有三个一维数组, 每个一维数组的元素是不一样的
		*/
		//创建 二维数组,一个有 3 个一维数组,但是每个一维数组还没有开数据空间
		int[][] arr = new int[3][];
		for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
			//给每个一维数组开空间 new
			//如果没有给一维数组 new ,那么 arr[i]就是 null
			arr[i] = new int[i + 1];
		//遍历一维数组,并给一维数组的每个元素赋值
			for(int j = 0; j < arr[i].length; j++) {
				arr[i][j] = i + 1;//赋值
			}
		}
		System.out.println("=====arr 元素=====");
		//遍历 arr 输出
		for(int i = 0; i < arr.length; i++) {
			//输出 arr 的每个一维数组
			for(int j = 0; j < arr[i].length; j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();//换行
		}
	}
}

使用方式 4— 静态初始化
定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}}
应用:打印杨辉三角形
在这里插入图片描述

public class YangHui {
	public static void main(String[] args) {
		/*
		使用二维数组打印一个 10 行杨辉三角
		1
		1 1
		1 2 1
		1 3 3 1
		1 4 6 4 1
		1 5 10 10 5 1
		规律
		1.第一行有 1 个元素, 第 n 行有 n 个元素
		2. 每一行的第一个元素和最后一个元素都是 1
		3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值. arr[i][j]
		arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; //必须找到这个规律
		*/
		int[][] yangHui = new int[12][];
		for(int i = 0; i < yangHui.length; i++) {//遍历 yangHui 的每个元素
			//给每个一维数组(行) 开空间
			yangHui[i] = new int[i+1];
			//给每个一维数组(行) 赋值
			for(int j = 0; j < yangHui[i].length; j++){
				//每一行的第一个元素和最后一个元素都是 1
				if(j == 0 || j == yangHui[i].length - 1) {
				yangHui[i][j] = 1;
			} else {//中间的元素
				yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];
				}
			}
		}
		//输出杨辉三角
		for(int i = 0; i < yangHui.length; i++) {
			for(int j = 0; j < yangHui[i].length; j++) {//遍历输出该行
				System.out.print(yangHui[i][j] + "\t");
			}
			System.out.println();//换行. 
			}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值