2.程序流程控制+Random类+数组

1.顺序结构

开始→步骤A→步骤B→步骤C→结束

流程图

// 顺序结构
public class Demo015Sequence {
	public static void main(String[] args) {
		System.out.println("今天天气不错");
		System.out.println("挺风和日丽的");
		System.out.println("我们下午没课");
		System.out.println("这的确挺爽的");
	}

}

2.判断语句(选择结构/语句)

2.1   判断语句——if语句

2.1.1  单if语句

  • 格式
if(关系表达式) {
      语句体;
}
  • 执行流程
  1. 首先判断关系表达式看其结果是ture还是false
  2. 如果是ture就执行语句体
  3. 如果是false就执行语句体
  • 流程图

public class Demo021f {
	public static void main(String[] args) {
		System.out.println("今天天气不错,正在压马路...突然发现一个网吧");
		int age = 18;
		if ( age>= 18) {
			System.out.println("进了网吧开始嗨");
			System.out.println("遇到一群猪队友,开始骂街");
			System.out.println("感觉不爽,结账走人");
		}
		System.out.println("回家吃饭");
	}

}

2.1.2.  标准if...else语句

  • 格式
if(关系表达式) {
     语句体1;
}else {
     语句体2;
}
  • 执行流程
  1. 首先判断关系表达式看其结果是ture还是false
  2. 如果是ture就执行语句体1
  3. 如果是false就执行语句体2
  • 流程图

public class Domo03IfElse {
	public static void main(String[] args) {
		//判断给定的数据是奇数还是偶数
		//定义变量
		int a = 1;
		if(a % 2 == 0) {
			System.out.println("a是偶数");
		}else {
			System.out.println("a是奇数");
		}
		System.out.println("结束");
	}

}

2.1.3.  扩展if...else if...else语句

  • 格式
if(判断条件1) {
   执行语句1;
} else if (判断条件2) {
   执行语句2;
}
...
} else if (判断条件n) {
   执行语句n;
} else {
   执行语句n+1;
}
  • 执行流程
  1. 首先判断关系表达式1看其结果是ture还是false
  2. 如果是ture就执行语句体1
  3. 如果是false就继续判断关系表达式2看其结果是ture还是false
  4. 如果是ture就执行语句体2
  5. 如果是false就继续判断关系表达式...看其结果是ture还是false
  6.  ...
  • 流程图

public class Demo04IfElse {
	public static void main(String[] args) {
		//x和y的关系满足如下:
		//如果x > = 3,那么 y = 2x + 1;
		//如果-1 < x < 3,那么 y = 2x;
		//如果x < =-1,那么 y = 2x - 1;
		//根据给定的x的值,计算出y的值并输出
		//定义变量
		int x = 5;
		int y;
		if (x >= 3) {
			y = 2* x + 1;
		}else if (x> -1&&x<3) {
			y = 2* x;
		}else {
			y = 2* x - 1;
		}
		System.out.println("y的值是: "+y);
	}

}

2.1.4 案例:指定考试成绩,判断成绩的等级

要求:

  •  90-100  优秀
  •  80-89     好
  •  70-79     良
  •  60-69     及格
  •  60以下   不及格
public class Zuoye01 {
	public static void main(String[] args) {
		int score = 100;
		if (score<0 || score>100) {
			System.out.println("你的成绩是错误的");
		}else if (score>=90 -1&& score<= 100) {
			System.out.println("你的成绩属于优秀");
		}else if (score>=80 -1&& score< 90) {
			System.out.println("你的成绩属于好");
		}else if (score>=70 -1&& score< 80) {
			System.out.println("你的成绩属于良");
		}else if (score>=60 -1&& score< 70) {
			System.out.println("你的成绩属于及格");
		}else {
			System.out.println("你的成绩属于不及格");
		}
	}

}

2.1.5 案例:使用三元运算符和标准的if...else语句分别实现:取两个数字当中的最大值

public class ZuoYe02Max {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		// 首先使用三元运算符
		//int max = a > b ? a : b;
		// if语句
		int max ;
		if (a > b) {
			max = a;
		} else {
			max = b;
		}
		System.out.println("最大值是: "+max);
	}

}

2.2 选择语句——switch语句

2.2.1 格式

switch(表达式) {
  case 常量值1:
     语句体1;
     break;
  case 常量值2:
     语句体2;
     break;
...
  default:
     语句体n+1;
     break;
}

2.2.2 执行流程

  1. 首先计算出表达式的值
  2. 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行过程中,遇到break就结束
  3. 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束

2.2.3 流程图

public class Demo05Switch {
	public static void main(String[] args) {
		int num = 1;
		switch (num) {
		case 1:
			System.out.println("星期一");
			break;
		case 2:
			System.out.println("星期二");
			break;
		case 3:
			System.out.println("星期三");
			break;
		case 4:
			System.out.println("星期四");
			break;
		case 5:
			System.out.println("星期五");
			break;
		case 6:
			System.out.println("星期六");
			break;
		case 7:
			System.out.println("星期日");
			break;
		default:
			System.out.println("数据错误");
			break;
		}
	}

}

 2.2.4注意事项

  1. 多个case后面的数值不能重复
  2. switch后面小括号当中只能是以下数据类型:☝基本数据类型:byte/short/char/int    ☝引用数据类型: String字符串,enum枚举
  3. switch语句格式可以很灵活,前后顺序可以颠倒,而且break语句可以省略

3.循环结构

3.1循环结构的基本组成

  1. 初始化语句:在循环开始最初执行,而且只做唯一一次
  2. 条件判断:如果成立,则循环继续;如果不成立,则循环退出
  3. 循环体:重复要做的事情内容,若干行语句
  4. 步进语句:每次循环之后都要进行的扫尾工作,每次循环结束之后都要执行一次

3.2循环语句1——for

3.2.1语句格式

for(初始化表达式①;布尔表达式②;步进表达式④) {
        循环体③
}

3.2.2执行流程

  • 执行顺序:①②③④>②③④>②③④...②不满足为止
  • ①负责完成循环变量初始化
  • ②负责判断是否满足循环条件,不满足则跳出循环
  • ③具体执行的语句
  • ④循环后,循环条件所涉及变量的变化情况

3.2.3流程图

3.3循环语句2——while

3.3.1 标准格式

#标准格式
while (条件判断) {
     循环体
}

3.3.2 扩展格式

#扩展格式
初始化语句;
   while  (条件判断②) {
     循环体③;
     步进语句④;
}

3.3.3 执行流程

  • 执行顺序:①②③④>②③④>②③④...②不满足为止
  • ①负责完成循环变量初始化
  • ②负责判断是否满足循环条件,不满足则跳出循环
  • ③具体执行的语句
  • ④循环后,循环条件所涉及变量的变化情况

3.4循环语句3——do...while

3.4.1循环格式

初始化表达式①
     do{
     循环体②
     步进表达式③
}while(布尔表达式④);

3.4.2执行流程

  • 执行顺序:①②③④>②③④>②③④...②不满足为止
  • ①负责完成循环变量初始化
  • ②负责判断是否满足循环条件,不满足则跳出循环
  • ③具体执行的语句
  • ④循环后,循环条件所涉及变量的变化情况

3.4.3流程图

3.5案例:求1-100之间的偶数和

public class Demo01Anli {
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1;i<=100;i++) {
			if(i%2==0) {
				sum+=i;
			}
		}
		System.out.println("结果是:"+sum);
	}

}

3.6三种循环的区别

  1. 如果条件判断从来没有满足过,那么 for循环和while 循环将会执行0次,但是do-while循环会执行至少一次。
  2. for循环的变量在小括号当中定义,只有在循环内部才可以使用。while 循环和while循环初始化语句本来就在外边,所以在循环之外还可以继续使用。

4.条件控制语句

4.1break语句

4.1.1常见的用法

  1. 可以用在switch语句当中,一旦执行,整个switch语句立刻结束
  2. 可以用在循环语句当中,一旦执行,整个循环语句立刻结束。打断循环
public class Demo01Anli {
	public static void main(String[] args) {
		for (int i = 1;i<=10;i++) {
			if(i==4) {
				break;
			}
			System.out.println("hello"+ i);
		}
	}

}

4.1.2关于循环的选择

凡是次数确定的场景多用for循环,否则多用while 循环

4.2continue语句

另一种循环控制语句是continue关键字。

一旦执行,立即跳过当前次循环剩余内容,马上开始下次循环

public class Demo01Anli {
	public static void main(String[] args) {
		for (int i = 1;i<=10;i++) {
			if(i==4) {
				continue;
			}
			System.out.println(i+"层到了");
		}
	}

}

5.死循环

5.1概述

永远停不下来的循环

5.2标准格式

while (true) {
    循环体
}

6.循环嵌套

6.1概述

指一个循环的循环体是另一个循环。总循环次数=外循环次数*内循环次数

6.2格式

for(初始化表达式①;循环条件②;步进表达式⑦) {
    for(初始化表达式③;循环条件④;步进表达式⑥) {
        执行语句⑤;
}

6.3执行流程

  • 执行顺序:①②③④⑤⑥>④⑤⑥>⑦②③④⑤⑥>④⑤⑥
  • 外循环一次,内循环多次
  • 比如跳绳:一共五组,每组跳10个。5组就是外循环,10个是内循环

6.4练习:使用循环嵌套,打印5*8矩形

	public static void main(String[] args) {
		//打印5行*号,每行8个
		//外循环5次,内循环8次
			for (int j = 0;j<=5;j++) {
				for (int k = 0;k<=8;k++) {
					//不换行打印*
					System.out.print("*");	
				}
				//内循环打印8个*后,需要一次换行
				System.out.println();
			}
	}

 7.数组

7.1概念 

一种容器,可以同时存放多个数据值

7.2.特点

  • 数组是一种引用数据类型
  • 数组当中的多个数据,类型必须统一
  • 数组的长度在程序运行期间不可改变

7.3.数组的初始化

在内存中创建一个数组,并且向其中赋予一些默认值

7.3.1动态初始化(指定长度)

在创建数组的时候,直接指定数组当中的数据元素个数

7.3.2格式

数据类型[] 数组名称 = new 数据类型[数组长度];

 解析:

  • 左侧数据类型:数组当中保存的数据,全部是统一的数据类型
  • 左侧的中括号:代表我是一个数组
  • 左侧数组名称:给数组取一个名字
  • 右侧的 new :代表创建数组的动作
  • 右侧数据类型:必须和左边的数据类型保持一致
  • 右侧中括号的长度:数组中,可以保存多少个数据,是一个int数字

7.3.3静态初始化(指定内容)

在创建数组的时候,不直接指定数组当中的数据元素个数多少,而是直接将具体的数据内容进行指定

7.3.4基本格式

数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};

7.3.5省略格式

数据类型[] 数组名称 =  {元素1,元素2,...};

7.3.6注意事项

  • 虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出长度
  • 静态初始化标准格式可以拆分成两个步骤
int[] arrayA;
arrayA = new int[] {11,21,31};
  • 动态初始化也可以拆分成两个步骤
int[] arrayB;
arrayB = new int[3];
  • 静态初始化一旦使用省略格式,就不能拆分成两个步骤
  • 如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化

7.4访问数组元素进行获取

直接打印数据名称,得到的是数组对应的内存地址哈希值

7.4.1访问数据元素的格式

数据名称[索引值]

索引值:一个int数字,代表数组当中元素的编号

【注意】索引值从0开始,一直到“数组长度-1”为止

7.5访问数组元素进行赋值

使用动态初始化数组时,其中的元素将会自动拥有一个默认值,规则如下:

  • 如果是整数类型,那么默认为0
  • 如果是浮点类型,那么默认为0.0
  • 如果是字符类型,那么默认为‘\u0000'
  • 如果是布尔类型,那么默认为false
  • 如果是引用类型,那么默认为null

【注意事项】:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成了大括号中的具体数值

8.Java中的内存划分

8.1.分类

Java的内存需要划分为5个部分:

8.1.1栈(Stack)

存放的都是方法中的局部变量。方法的运行一定在栈当中

  • 局部变量:方法的参数,或者是方法()内部的变量
  • 作用域:一旦超出作用域,立刻从栈内存中消失

8.1.2堆(Heap)

凡是new出来的东西,都在堆当中。堆内存里面的东西都有一个地址值:16进制。堆内存里面的数据,都有默认值,规则:

  • 如果是整数类型,那么默认为0
  • 如果是浮点类型,那么默认为0.0
  • 如果是字符类型,那么默认为‘\u0000'
  • 如果是布尔类型,那么默认为false
  • 如果是引用类型,那么默认为null

8.1.3方法区(Method Area)

存储.class相关信息,包含方法的信息

8.1.4本地方法栈(Native Method Stack)

与操作系统相关

8.1.5寄存器(pc Register)

与CPU相关

8.2一个数组的内存图

8.3两个数组的内存图

8.4两个引用指向同一个数组的内存图

9.常见的问题

9.1数组索引越界异常

索引值从0开始,一直到“数组长度-1”为止

如果访问数组元素的时候,索引编号并不存在,那么将会发生数组索引越界异常(ArrayIndexOfBoundsException)

原因:索引编号出错

解决:修改成为正确的索引编号

9.2空指针异常

所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有

数组必须new初始化才能使用其中的元素,如果只是赋值了一个null,没有进行new的创建,那么将会发生空指针异常(NullPointerException)

原因:忘了new

解决:补上new

10.获取数组的长度

10.1格式

数组名称.length

得到一个int数字,代表数组的长度

10.2注意

  1. 数组一旦创建,程序运行期间,长度不可改变
    int [ ] arrayC = new int[3];
    System.out.println(arrayC.length);//3
    arrayC = new int[5];
    System.out.println(arrayC.length);//5
    

案例一:数组的遍历输出

/*
 遍历数组:对数组当中的每一个元素进行逐一处理。默认处理方式就是打印输出
 */
public class Array {
	public static void mian(String[] args) {
		int[] array = {15,25,30,40,50 };
		// 首先使用原始方式
		System.out.println(array[0]);
		System.out.println(array[1]);
		System.out.println(array[2]);
		System.out.println(array[3]);
		System.out.println(array[4]);
		//使用循环,次数是数组的长度
		for (int i = 0;i < 5;i++) {
			System.out.println(array[i]);
		}
		int len = array.length;//长度
		for (int i = 0;i < len;i++) {
			System.out.println(array[i]);
		}
	}

}

案例二:求出数组中的最值

public class ArrayMax {
	public static void mian(String[] args) {
		int[] array = {5,15,30,10000};
		int max = array[0];
		for(int i = 0;i < array.length;i++) {
			//如果当前元素比max更大,则换人
			if (array[i] > max) {
				max = array[i];
			}
		}
		System.out.println("最大值:"+ max);
		int min = array[0];
		for(int i = 0;i < array.length;i++) {
			//如果当前元素比max更小,则换人
			if (array[i] < min) {
				min = array[i];
			}
		}
		System.out.println("最小值:"+ min);
	}

}

案例三:数组元素反转

  1. 数组元素反转,其实就是对称位置的元素交换
  2. 通常遍历数组用的是一个索引:int i = 0;现在表示对称位置需要两个索引:int min = 0;int max = array.length-1;
  3. 如何交换两个变量的值:
  • int a =10;
  • int b =20;
  • int temp = a;
  • a=b;
  • b=temp;

4.什么时候停止交换

  • min==max
  • min>max
public class ArrayRevese {
	public static void mian(String[] args) {
		int[] array = {5,15,30,4o,50};
		//遍历打印数字原来的样子
		for(int i = 0;i < array.length;i++) {
	        System.out.println(array[i]);
		}
		/*
        初始化语句:int min = 0, max = array.length-1
        条件判断:min < max
        步进表达式:min++ ,max--
        循环体:用第三个变量倒手
        */
		for(int min = 0, max = array.length-1;min < max;min++ ,max--) {
			int temp = array[min];
            array[min]=array[max];
            array[max]=temp;
		}
		//再次打印遍历输出数组后的样子
        for(int i = 0;i < array.length;i++) {
	        System.out.println(array[i]);
	}

}

11.数组作为方法参数——传递地址 

数组可以作为方法的参数,当调用方法的时候,向方法的小括号进行传参,传递进去的是数组的地址值

public static void mian(String[] args) {
		int[] array = {5,15,30,40,50};
		 printArray(array);
}
public static void printArray(int[] array) {
         for(int i = 0;i < array.length;i++) {
	        System.out.println(array[i]);
		}
}

12.数组作为方法返回值——返回地址

一个方法可以有0,1,多个参数,但只能有0或1个返回值。

一个方法中产生多个数据进行返回时,使用一个数组作为返回值类型

数组作为方法的参数,传递的是数组的地址值

数组作为方法的返回值,返回的是数组的地址值

public static void mian(String[] args) {
       int[] result = calculate(10,20,30);
       System.out.println("总和:"+result[0]);
        System.out.println("平均值:"+result[1]);
}
public static int[] calculate(inta,int b, int c) {
         int sum = a+b+c;
         int avg = sum/3;
          int[] array = {sum,avg}
          return array;
	       
		
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱿鱼G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值