流程控制指:顺序/分支/循环
一、分支
if-else
switch (变量){ //这个变量只允许6种数据类型:byte、short、int、char、enum(jdk5.0新增)、String(jdk7.0新增)
case 常量1://常量不能是表达式,因为表达式结果是Boolean类型,switch不支持boolean类型
//break;
case 常量2:
//break;
default://default可以写在任意位置,因为程序会先执行完所有case最后default,放在其他位置记得加break,不过一般放末尾,不要太无聊。
}
//当几种情况操作一致时可以合并
例题:输入年月日,输出当前年月日的总天数
方法:倒着写
import java.util.Scanner;
class CountDay{
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter the year:");
int year = scanner.nextInt();
System.out.println("Please enter the month:");
int month = scanner.nextInt();
System.out.println("Please enter the day:");
int day = scanner.nextInt();
int sum = 0;
switch(month){
case 12: sum+=30;
case 11: sum+=31;
case 10: sum+=30;
case 9: sum+=31;
case 8: sum+=31;
case 7: sum+=30;
case 6: sum+=31;
case 5: sum+=30;
case 4: sum+=31;
case 3:
if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)){
sum += 29;
}else{
sum += 28;
}
case 2: sum+=31;
case 1:
sum += day;
break;
default:
System.out.println("You enter is wrong!");
}
System.out.println(sum);
}
}
判断闰年:整百年被400整除或不整百年被4整除
原因:在公历(格里历)纪年中,有闰日的年份叫闰年,一般年份365天,闰年为366天。由于地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年,公历把一年定为365天。所余下的时间约为四年累计一天(0.24219*4=0.96876天),加在二月里,所以平常年份每年365天,二月为28天,闰年为366天,二月为29天。但是这个时间并不准确,经过四百年就会多算出大约3天来(400/4*(1-0.96876)=3.124天),因此,每四百年中要减少三个闰年,在400年中只有97个闰年,闰年在2月末增加一天,闰年366天。如果还要准确点,每400年多出0.124天,那么大约每3226年又会多出一天(3225 1/0.124*400=3225.8064516年),那么这一年也是闰年。
那为什么要有闰年呢?目前的公历称为格里历,在这之前使用的是儒略历:一年365天,每四年加一闰日,即平均一年365.25日。这样一年的平均长度为365.25天,比地球绕日旋转的回归年365.2422天多0.0078天,到了公元1582年,积累的差值达到了10天左右——也就是说这时日历上的6月22日,与地球真正的夏至日差了十天,再往后积累,也许会出现夏至日下雪的情况了。为消除这个差数(罗马教皇格里高利十三世进行历法改革),把1582年10月4日的下一日定为10月15日,并采用400年制97个闰日的法则,整百年只有被400除尽的才为闰年,称为格里高利历。这样历年的平均长度为365.2425日,误差为0.0003天,要大约三千多年才与回归年长度差一天。
二、循环
for(;;)
while
do-while
区别:
1.for的初始条件和while的初始条件作用域和生命周期不一样。
2.do-while至少执行一次do
3.while(true) = for(;;),可以用break来跳出
例题:求最小公倍数和最大公约数
import java.util.Scanner;
class DivisorAndMultiple{
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the first number:");
int num1 = scanner.nextInt();
System.out.println("Enter the Second number:");
int num2 = scanner.nextInt();
int maxDivisor = 1;
for(int i = num1>num2? num2:num1;i>0;i--){
if(num1 % i == 0 && num2 % i == 0){
maxDivisor = i;
break;
}
}
int minMultiple = num1*num2;;
int multiple = num1*num2;
for(int i = num1>num2? num1:num2;i<multiple;i++){
if(i % num1 == 0 && i % num2 == 0){
minMultiple = i;
break;
}
}
System.out.println(maxDivisor + " " + minMultiple);
}
}
三、一些类的使用
1.Scanner
第一步:导包
import java.util.Scanner;
第二步:实例化
Scanner scanner = new Scanner(System.in);
第三步:使用方法
int i = scanner.nexInt();
String str = scanner.next();
因为这个类没有返回char值,所以要获取char值可以使用:
String str = scanner.next();
char c = str.charAt(0);
2.随机数的产生
Math.random()的使用--->>[0.0,1.0)
Math.random()*90--->>[0.0,90.0)
Math.random()*90+10--->>[10.0,100.0)
(int)(Math.random()*90+10)--->>[10,99]
有个公式:
要获取[a,b]
可以Math.random*(b-a+1)+a 这个也可以自己推
四、关于质数的输出最终优化版方法
质数也叫素数,只能被1和本身整除,2是最小的质数。
class PrimeNum{
public static void main(String args[]){
label:for(int i = 2;i<100;i++){
for(int j=2;j<=Math.sqrt(i);j++){ //因为相乘等于i,两个乘数都在1-i内,所以只用判断其中一个乘数, 根据对称性,判断到开方就可以了
if(i % j == 0){
continue label; //直接跳出外层此次循环
}
}
System.out.println(i);
}
}
}