需求
- 输出1900年到2023年之间所有的闰年
- 每够10个年份,换一行
1. 思考过程
- 第一个需求需要输出1900年到2023年之间所有的闰年,是重复执行输出年份这个代码,那么需要用到循环结构;
- 同时不仅要求输出年份,而且对于输出的年份有限制,要求输出闰年的年份,只有一条路👉只有闰年才输出,所以需要在循环for中嵌套一个if去判断当前年份是否是闰年,如果是闰年则输出,平年则不输出;
- 第二个需求,需要每输出10次闰年就换一行,转换成编程的需求就是每经过十次输出了闰年的循环就输出一次换行;
- 进一步转换需求就是需要记录输出了循环的次数是几次,然后到10次就换一次行即👉次数可以被10整除的时候就进行一次换行
2. 代码
- 第一次写出来的代码
package Homework;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
/*
1. 输出1900年到2023年之间所有的闰年
2. 每够10个年份,换一行
*/
int count = 0; //声明一个计数变量,记录输出闰年的次数
for (int year = 1900;year<=2023;year++){ //循环变量是年份 起始年份为1900年 直到2023年 每次循环自增1年
if((year%4==0 && year%100!=0)||year%400==0){ //条件是当年份是闰年的时候执行一次输出年份
System.out.print(year+" "); //输出一次闰年
count++; //每输出一次闰年计数自增1
}
if(count%10==0) { //每当输出了10次闰年则换行
System.out.println("");
}
}
}
}
一开始我是认为没有问题的,但是最终输出的结果是:
"C:\Program Files\Zulu\zulu-8\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.4\lib\idea_rt.jar=60108:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Zulu\zulu-8\jre\lib\charsets.jar;C:\Program Files\Zulu\zulu-8\jre\lib\crs-agent.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\cldrdata.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\dnsns.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\jaccess.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\legacy8ujsse.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\localedata.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\nashorn.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\openjsse.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\sunec.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\sunmscapi.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Zulu\zulu-8\jre\lib\ext\zipfs.jar;C:\Program Files\Zulu\zulu-8\jre\lib\jce.jar;C:\Program Files\Zulu\zulu-8\jre\lib\jfr.jar;C:\Program Files\Zulu\zulu-8\jre\lib\jsse.jar;C:\Program Files\Zulu\zulu-8\jre\lib\management-agent.jar;C:\Program Files\Zulu\zulu-8\jre\lib\resources.jar;C:\Program Files\Zulu\zulu-8\jre\lib\rt.jar;C:\Users\52939\IdeaProjects\jsd202310\out\production\jsd202310" Homework.text
1904 1908 1912 1916 1920 1924 1928 1932 1936 1940
1944 1948 1952 1956 1960 1964 1968 1972 1976 1980
1984 1988 1992 1996 2000 2004 2008 2012 2016 2020
Process finished with exit code 0
- 对于问题的溯源和思考:对于第二个需求的思考有一些问题,原来思考的是每经过10次输出闰年的循环就换行,根,根据这个逻辑写出来的代码是有问题的,所以这个需求的真正含义应该是,每输出10次闰年,并且这一次循环输出了闰年才换行!这个才是真正的需求,知道了真正的需求那就好办了第一个想法是给
System.out.println("")
的if加上闰年的判断条件
package Homework;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
/*
1. 输出1900年到2023年之间所有的闰年
2. 每够10个年份,换一行
*/
int count = 0; //声明一个计数变量,记录输出闰年的次数
for (int year = 1900;year<=2023;year++){ //循环变量是年份 起始年份为1900年 直到2023年 每次循环自增1年
if((year%4==0 && year%100!=0)||year%400==0){ //条件是当年份是闰年的时候执行一次输出年份
System.out.print(year+" "); //输出一次闰年
count++; //每输出一次闰年计数自增1
}
if(count%10==0 &&((year%4==0 && year%100!=0)||year%400==0)) { //每当输出了10次闰年则换行
System.out.println("");
}
}
}
}
- 加完之后发现上面的if已经有过同样的条件限制,所以可以直接
package Homework;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
/*
1. 输出1900年到2023年之间所有的闰年
2. 每够10个年份,换一行
*/
int count = 0; //声明一个计数变量,记录输出闰年的次数
for (int year = 1900;year<=2023;year++){ //循环变量是年份 起始年份为1900年 直到2023年 每次循环自增1年
if((year%4==0 && year%100!=0)||year%400==0){ //条件是当年份是闰年的时候执行一次输出年份
System.out.print(year+" "); //输出一次闰年
count++;//每输出一次闰年计数自增1
if(count%10==0) { //每当输出了10次闰年则换行
System.out.println("");
}
}
}
}
}
总结
- 在需要记录循环次数的程序中可以在循环外声明一个 int 变量,然后让这个变量随着循环次数自增1;
- 需求需要剖析到最深的一层,不能只停留在最表面的一层;
思考
- 如果同一个循环中两个分支嵌套用到一样的调节,可以放在一起写吗?