接着前几天的分支结构的回顾,今天主要回顾一下循环结构和数组方面的一些知识吧。
练习:输入一个数字,然后输出这个数字表示星期几
switch(选择){
case 选项1:Code1;break;
case 选项2:Code2;break;
……
}
1.switch() 中需要一个选项,选项只能是 byte/short/char/int,从JDK 1.7开始,允许使用 String
case 顺序不影响结果
2.如果有一个或者多个 case 之后没有 break,那么这个时候 case 之间的顺序影响结果
练习:输入两个数字以及一个符号,输出这两个数字在这个符号下运算产生的结果
5 9 + ->14
练习:输入三个数字表示年月日,输出这一天在这一年时第几天
2012 3 5 ------>65
2014 3 5 ------>64
需要判断平年闰年:逢百整除 400;不逢百整除 4
2012 % 4 = 0
2100 % 400 = 0 --- false
循环结构:
用于完成一些相同或者相似的重复操作
while(逻辑值){
Code;
}
练习:
1.求 1-100 以内所有的奇数的和 --- i=1; i+=2;
2.打印 100 以内能被 3 整除而不能被 7 整除的数字 int i = 0; i +=3;
3.输入一个数字,输出这个数字是一个几位数。*
4.输入一个数字,输出这个数字的所有因数。 --- 从 1 开始,逐个数字取余这个输入的数字,看是否能够整除 * 20:1 2 4 5 10 20
定义一个循环,需要三个要素:定义一个变量来控制次数,利用判断条件决定循环结束;在循环过程中需要改变变量
do{
Code; //先执行代码块,再执行逻辑值,如果逻辑值为 true,转过头来继续执行代码块;如果为 false,就执行接下来的程序。
}whie(逻辑值);
注意:无论条件是否满足,do-while 的循环体必然至少执行一次。
2 7
for(){定义循环变量; 控制条件; 改变循环变量){ //
1 4 5 6
Code;
}
注意:对于 for 循环而言,如果第二部分的控制条件没有写,那么默认是 true,这个时候就成了一个死循环。
习惯上如果变化不规律或者次数不确定一般使用while(比如,从控制台获取一个大于 10 的奇数,有可能输入很多次,就是用这个)
while(n < 10 || n % 2 ==0){
n =s.nextInt();
}
for(; n < 10 || n % 2 == 0; n = s.nextInt())
//求 1-50 的和 int sum = 0; //对于 for 循环而言,如果第二部分的控制条件没有写,那么默认是 true,这个时候就成了一个死循环。 for(int i = 1; i <= 50; i++){ sum += i; i++; } System.out.println(sum);
练习:百钱百鸡 --- 3 文钱 1只公鸡, 2 文钱 1 只 母鸡,1 文钱 3 只小鸡;100 文钱如何买恰好 100 只鸡? --- 先定义一个循环表示公鸡,嵌套一个循环表示母鸡,计算小鸡的个数,根据各种鸡的个数来计算钱数是否为 100
/** 练习:百钱百鸡 --- 3 文钱 1只公鸡, 2 文钱 1 只 母鸡,1 文钱 3 只小鸡;100 文钱如何买恰好 100 只鸡? --- 先定义一个循环表示公鸡,嵌套一个循环表示母鸡,计算小鸡的个数,根据各种鸡的个数来计算钱数是否为 100 */ import java.util.Scanner; public class Demo2d{ public static void main(String[] args){ Scanner s = new Scanner(System.in); for(int i = 1 ; i <= 33 ; i++) for(int j = 1; j <= 50; j++){ int k = 100 - i - j if(k % 3 == 0 && 3*i+2*j+k/3 == 100){ System.out.print(i+","+j+","+k+" "); } } } }
break 和 continue
break:用于选择结构和循环结构,表示结束当前的一层结构
continue:只能用于循环结构,表示跳过本次循环继续下次循环,
扩展作业:一个循环打印九九乘法表
for(int i = 1; i <= 9; i++){ for(int j = 1; j <= i; j++){ //if(i*j >= 10){ // System.out.print(i+"*"+j+"="+i*j+" "); //}else{ // System.out.print(i+"*"+j+"="+i*j+" "); //} System.out.print(i+"*"+j+"="+i*j+" ");//使用制表符 ,可以不用自己特意去控制了,自动左边对齐了。 } System.out.println(); } //用一个循环输出 for(int i = 1, j = 1; i <= 9; j++){ System.out.print(i + "*" + j + "=" + i * j + " "); if(j == i){ //换行 System.out.println(); i++; j = 0; } }
数组
存储同一类型的多个数据的容器 --- 大小固定的
数组会对放入其中的数据进行编号,编号是从 0 开始的 --- 下标(比数组的长度少一个)
数组的容量 --- 长度
定义格式
数据类型[] 数组名 = new 数据类型[长度];
int arr = new int[5]; 表示定义一个能存储 5 个整型元素的数组
arr[3] = 10; arr[5] = 7; // ArrayIndexOutOfBoundsException ---数组下标越界异常
内存
Java 将所占用的内存划分为了 5 块:栈内存(*)、堆内存(*)、方法区、本地方法栈(涉及到块语言的问题)、PC 计数器(寄存器,跟硬件相关)
栈内存
用于存储变量的,变量在栈内存中使用完成之后会立即移除出栈内存,有种卸磨杀驴的样子。只要遇到 new ,就会在堆中开辟一块空间(从 0-n划分),有地址。对于里面的数据先默认一个值(0),当赋值后改变值。
堆内存
用于存储对象(数组是一种特殊的对象)的。元素在存入堆内存中之后会自动的赋予默认值:byte/short/int -0 long -0L float -0.0f double -0.0 char -'u0000' boolean -false,其他类型的默认值都是null。 [(表示数据类型 --- [ 表示数组) I(如果这是一个数组,那么是这一部分表示数组中的元素类型 --- I 表示 Int) @(标记符号,表示后边是一个地址) 15db9742(可以认为表示一个地址,实际上是这个对象的哈希码的十六进制形式)
对象在用完之后是在不确定的某个时刻被回收。