2021-01-04
day04复习
引入案例
请在控制台打印10遍:HelloWorld!!!
public class Demo {
public static void main(String[] args) {
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
System.out.println("HelloWorld!!!");
}
}
问题:代码重复度太高,这种情况又被我们称为代码的冗余。
解决:在Java中对代码冗余这个问题的解决方式为循环语句。
一、循环
1.1循环概述
现实世界中的循环:一周七天的轮换、一年四季的轮换、秒针的转动
Java中的循环:针对某些重复性的相同的或者相似的代码,用特定的语句结构进行改进。
1.2 分类
for循环
while循环
do...while循环
二、 while循环
2.1 格式
基本格式:
while(关系表达式) {
循环体语句;
}
扩展格式:
初始化语句;
while(关系表达式) {
循环体语句;
初始化语句的改变;
}
格式的解释:
1. 初始化语句:就是用来定义一个变量,让其进行改变。(只在开始的时候执行一次)
2. 关系表达式:其结果必须为boolean类型,要么是true,要么是false
3. 循环体语句:要重复执行的相同的或者相似的代码,可以是一句或者多句
4. 初始化语句的改变:就是对初始化语句定义的变量进行改变,这个改变都是向着循环结束的方向渐进。
//使用while改进引入案例:
public class Demo2 {
public static void main(String[] args) {
int i = 0;
while(i < 10) {
System.out.println("HelloWorld!!!");
i++;
}
}
}
2.2 执行流程
1. 执行初始化语句
2. 执行关系关系表达式,看结果是true还是false
---> 如果是false,那么结束循环
---> 如果是true,那么执行循环体语句,并进行下一步
3. 初始化语句改变
4. 回到2
练习:
1. 在控制台打印1-10
2. 在控制台打印10-1
3. 求整数1-100的和
4. 已知珠穆朗玛峰的高度为8848m,一张纸的厚度为0.01m,
那么请问这张纸对折多少次后能超过珠穆朗玛峰的高度。
/*
需求1. 在控制台打印1-10
*/
public class Test {
public static void main(String[] args) {
int i = 1;
while(i <= 10) {
System.out.println(i);
i++;
}
}
}
/*
需求2. 在控制台打印10-1
*/
public class Test2 {
public static void main(String[] args) {
int i = 1;
while(i <= 10) {
System.out.println(11-i);
i++;
}
}
}
/*
需求3. 求整数1-100的和
1 2 3 4 5 6 ... 98 99 100
0+1 = 1
1+2 = 3
3+3 = 6
6+4 = 10
10+5 = 15
15+6 = 21
...
*/
public class Test3 {
public static void main(String[] args) {
//定义一个变量用来存储和
int sum = 0;
int i = 1;
while(i <= 100) { //i = 1 2 3 4 ...99 100
//sum = sum + i;
sum += i;
i++;
}
System.out.println("1-100的和为:" + sum);
}
}
/*
已知珠穆朗玛峰的高度为8848m,一张纸的厚度为0.01m,
那么请问这张纸对折多少次后能超过珠穆朗玛峰的高度。
*/
public class Test9 {
public static void main(String[] args) {
double high = 8848;
double height = 0.01;
//定义一个变量,用来统计纸对折了多少次
int count = 0;
//如果纸的厚度小于8848m,那么就进入while循环继续对折
while(height <= 8848){
//纸进行对折,每次都相当于乘以2
height *= 2;
System.out.println("第" + (++count) + "次高度为:" + height);
}
}
}
三、do…while
基本格式:
do {
循环体语句;
} while (关系表达式);
扩展格式:
初始化语句;
do {
循环体语句;
初始化语句的改变;
}while(关系表达式);
3.1 do…while循环和while循环的区别
do...while语句至少会执行一次
四、for循环
4.1 格式
for(初始化语句; 关系表达式; 初始化的改变){
循环体语句;
}
格式的解释:
1. 初始化语句:就是用来定义一个变量,然后让其进行改变,此语句只在开始的时候执行一次
2. 关系表达式:其结果必须为boolean类型,要么是true,要么是false
3. 初始化语句的改变:可以递增、也可以递减,主要改变是向着循环结束的方向进行即可
4. 循环体语句:就是用来重复执行的代码,可以是一句或多句
4.2 for循环和while循环的区别
1. for循环能限定变量的声明周期,在使用完毕之后就立即被回收了,节省内存。
而while循环在使用完毕并没有被回收,造成了内存的浪费。
2. for一般用于此处明确的循环,而while一般用于次数不明确的循环。
练习:(用for循环)
1. 在控制台打印1-10
2. 在控制台打印10-1
3. 求1-100的整数和
4. 求1-100内的偶数和
5. 求1-100内的奇数和
6. 打印四叶玫瑰数并统计其个数
/*
1. 在控制台打印1-10
2. 在控制台打印10-1
3. 求1-100的整数和
4. 求1-100内的偶数和
5. 求1-100内的奇数和
6. 打印四叶玫瑰数并统计其个数
*/
public class Test {
public static void main(String[] args) {
/*
//1. 在控制台打印1-10
for(int i = 0; i < 10; i++){
System.out.println(i+1);
}
//2. 在控制台打印10-1
for(int i = 0; i < 10; i++){
System.out.println(10-i);
}
//3. 求1-100的整数和
int sum = 0;
for(int i = 1; i <= 100; i++){ //i = 1 2 3 4 ... 99 100
sum = sum + i;
}
System.out.println("1-100的整数和为:" + sum);
//4. 求1-100内的偶数和
//5. 求1-100内的奇数和
int sum_ou = 0;
int sum_ji = 0;
for(int i = 0; i <= 100; i++){
if(i % 2 == 0){
sum_ou += i;
}else{
sum_ji += i;
}
}
System.out.println("偶数和为:" + sum_ou + ",奇数和为:" + sum_ji);
*/
//6. 打印四叶玫瑰数并统计其个数
int count = 0;
for(int i = 1000; i < 10000; i++){
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
int qian = i / 1000;
if(i == (ge*ge*ge*ge + shi*shi*shi*shi + bai*bai*bai*bai + qian*qian*qian*qian)){
count++;
System.out.println(i);
}
}
System.out.println("共有:" + count + "个四叶玫瑰数");
}
}
五、for循环的嵌套
5.1 格式
//外层for
for(初始化语句; 关系表达式; 初始化语句的改变){
//内层for
for(初始化语句; 关系表达式; 初始化语句的改变){
循环体语句;
}
}
注意:
1. for循环的嵌套就是将一个for循环的循环语句体用另一个for循环进行替换。
2. 外层for每执行一次,内层for都要全部执行完毕
练习:
打印出如下星星:
1.
*****
*****
*****
*****
*****
2.
*
**
***
****
*****
3.
*
**
***
****
*****
4.
*****
****
***
**
*
/*
在控制台打印如下星星
*****
*****
*****
*****
*****
*/
public class Test {
public static void main(String[] args) {
//外层for:控制行
for(int j = 0; j < 5; j++){
//内层for:控制列
for(int i = 0; i < 5; i++){
/*
注意:
println是换行打印
print是打印不换行
*/
//System.out.println("*");
System.out.print("*");
}
//每打印一行就换行
System.out.println();
}
}
}
/*
在控制台打印如下图形
*
**
***
****
*****
*/
public class Test2 {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
for(int j = 1; j <= i; j++){
System.out.print("*");
}
System.out.println();
}
}
}
/*
在控制台打印如下图形:
*
**
***
****
*****
结果观察,我们发现:
第一行: 4个空格 1个*
第二行: 3个空格 2个*
第三行: 2个空格 3个*
第四行: 1个空格 4个*
第五行: 0个空格 5个*
*/
public class Test3 {
public static void main(String[] args) {
//外层for:控制行
for(int i = 1; i <= 5; i++){
//打印空格
for(int j = 0; j < 5-i; j++){
System.out.print(" ");
}
//打印星星
for(int k = 0; k < i; k++){
System.out.print("*");
}
//换行
System.out.println();
}
}
}
/*
*****
****
***
**
*
*/
for(int i = 0;i < 5;i++){
for(int j = 0;j < i;j++){
System.out.print(" ");
}
for(int k = 0;k <= 4 - i;k++){
System.out.print("*");
}
System.out.println("");
}
练习:打印九九乘法表
for(int i = 1;i < 10;i++){
for(int j = 1;j <= i;j++){
System.out.print(j + " * " + i + " = " + i*j + " ");
}
System.out.println("");
}
上图显示部分未对齐,将代码进行优化
用三元表达式在积为一位数时在其后追加3个空格,积为2位数时在其后追加2个空格
for(int i = 1;i < 10;i++){
for(int j = 1;j <= i;j++){
System.out.print(j + " * " + i + " = " + i*j + ((i*j >= 10)? " ":" "));
}
System.out.println("");
}