Day05
万年历
需求:输入年和月,打印当月的日历
线索:1900年1月1日是星期一
分析:
问题:每个月的第一天是星期几
解决:
计算出1900.1.1到输入年.输入月的第一天的总天数
总天数%7,就可以得到当月第一天是星期几
public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("请输入年:"); int year = scan.nextInt();//2024 System.out.println("请输入月:"); int month = scan.nextInt();//11 //获取年的总天数 -- 1900~2023 int allDayOfYear = 0; for(int i = 1900;i<year;i++){ if(i%4==0 && i%100!=0 || i%400==0){ allDayOfYear += 366; }else{ allDayOfYear += 365; } } //获取月的总天数 -- 1~10 int allDayOfMonth = 0; for(int i = 1;i<month;i++){ switch(i){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: allDayOfMonth += 31; break; case 4:case 6:case 9:case 11: allDayOfMonth += 30; break; case 2: if(year%4==0 && year%100!=0 || year%400==0){ allDayOfMonth += 29; }else{ allDayOfMonth += 28; } break; } } //计算总天数 int allDay = allDayOfYear + allDayOfMonth + 1; //计算星期 int week = allDay%7;//0~6 if(week == 0){ week = 7; } //获取当月的天数 int day = 0; switch(month){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: day = 31; break; case 4:case 6:case 9:case 11: day = 30; break; case 2: if(year%4==0 && year%100!=0 || year%400==0){ day = 29; }else{ day = 28; } break; } //打印日历 System.out.println(year + "年" + month + "月"); System.out.println("一\t二\t三\t四\t五\t六\t日"); int count = 0; for(int i = 1;i<week;i++){ System.out.print("\t"); count++; } for(int i = 1;i<=day;i++){ System.out.print(i + "\t"); count++; if(count % 7 == 0){ System.out.println(); } } }
一、方法
理解: 是一段用于执行特定任务的代码块。方法可以用来实现功能复用,提高代码的组织性和可读性。
方法的基本组成部分包括:
- 访问修饰符:如
public
、private
、protected
,它们决定了方法的可见性。- 返回类型:方法完成其操作后返回的数据类型。如果方法不返回任何值,则使用
void
关键字。- 方法名:遵循Java标识符命名规则,通常建议使用有意义的名字来描述方法的功能。
- 参数列表:方法可能需要接收一些输入数据来完成其任务,这些数据通过参数传递给方法。每个参数都需要指定其类型和名称。
- 方法体:包含一系列语句,定义了方法具体要执行的操作。
示例
下面是一个简单的Java方法示例,该方法计算两个整数的和并返回结果:
public int addNumbers(int num1, int num2) { return num1 + num2; }
- 访问修饰符:
public
表示这个方法可以被其他类中的对象调用。- 返回类型:
int
表示此方法将返回一个整数值。- 方法名:
addNumbers
是方法的名称,描述了它的功能。- 参数列表:
int num1, int num2
表示方法接受两个整数作为参数。
- 方法体:
return num1 + num2;
计算两个数字的和,并将结果返回给调用者。
方法调用
要调用上述方法,可以这样做:
int result = addNumbers(10, 20); System.out.println("The sum is: " + result); // 输出: The sum is: 30
这里,我们向
addNumbers
方法传递了两个整数10
和20
,然后接收返回的结果并打印出来。
二、静态方法
理解:特定功能的代码块
**好处:**减少代码的冗余
语法结构:
访问修饰符 static 返回值类型 方法名(参数列表){ ...代码块... return 返回值; }
分类:
- 无参数无返回值的方法
- 带参数的方法
- 带返回值的方法
1.无参数无返回值的方法
语法结构:
public static void 方法名(){ ...代码块... }
注意:
- void(关键字)表示无返回值
- 方法写在类里
- 方法与方法之间是平级关系
- 方法没有调用,就是个摆设
2.带参数的方法
语法结构:
public static void 方法名(参数列表){ ...代码块... }
注意:
- 形式参数:叫做形参,声明方法时规定的参数
- 形参必须设置类型
- 形参是该方法的局部变量,作用域就在该方法内
- 局部变量就是方法中声明的变量
- 实际参数:叫做实参,调用方法时传入的实际数据
- 形参和实参的类型必须兼容
- 形参和实参可以有多个,使用逗号分隔
需求1:编写打印三角型的方法,三角形的行数由调用方指定
需求迭代:编写打印三角型的方法,三角形的行数和内容由调用方指定
需求2:设计一个方法,传入两个int值,判断最大值
public static void main(String[] args){ printStar(3,"*"); printStar(5,"$"); printStar('A',"#"); getMax(10,20); } public static void getMax(int a,int b){ int max = (a>b)?a:b; System.out.println("最大值为:" + max); } public static void printStar(int num,String str){ for(int i = 0;i<num;i++){ for(int j = 0;j<=i;j++){ System.out.print(str); } System.out.println(); } }
3.带返回值的方法
语法结构:
public static 返回值类型 方法名([参数列表]){ ...代码块... return 返回值数据; }
注意:
- 带返回值的方法有没有参数,是不冲突的
- 方法功能单一性:一个方法的功能不要过于强大
- 返回值只能有一个
- 方法声明时规定的返回值类型必须和return后的返回值实际数据兼容
需求:设计一个方法,传入两个int值,判断最大值
需求迭代:在控制台输入三个int值,判断最大值
public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("请输入第一个数字:"); int a = scan.nextInt(); System.out.println("请输入第二个数字:"); int b = scan.nextInt(); System.out.println("请输入第三个数字:"); int c = scan.nextInt(); int max = getMax(a,b); max = getMax(max,c); System.out.println("最大值为:" + max); } public static int getMax(int a,int b){ int max = (a>b)?a:b; return max; }
三、方法的重载
理解:方法与方法之间的关系
条件:
- 在同一个类里
- 方法名相同
- 参数列表的个数或者类型不一致
- 与返回值无关
**好处:**系统会根据具体的实参类型,自动匹配到对应的方法里
- 需求1:设计一个方法,传入两个int值,返回最大值
- 需求2:设计一个方法,传入三个int值,返回最大值
- 需求3:设计一个方法,传入两个double值,返回最大值
- 需求4:设计一个方法,传入三个double值,返回最大值
编写一个方法的步骤:
- 考虑方法的名 – 做到见名知意
- .考虑参数
- 该方法需不需要参数?
- 需要几个参数?
- 参数类型是什么?
- 考虑返回值
- 该方法需不需要返回值?
- 返回值类型是什么?
public static void main(String[] args){ //注意:打印getMax(),实际上是打印该方法的返回值,如果该方法没有返回值就会报错 System.out.println(getMax(10,20,30)); } public static int getMax(int a,int b){ return (a>b)?a:b; } public static int getMax(int a,int b,int c){ int max = (a>b)?a:b; max = (max>c)?max:c; return max; } public static double getMax(double a,double b){ return (a>b)?a:b; } public static double getMax(double a,double b,double c){ double max = (a>b)?a:b; max = (max>c)?max:c; return max; } //错误示范:重载不考虑参数名是否一致,只看参数的个数或者类型 //public static void method(String str,int i){} //public static void method(String s,int num){}
四、方法的递归
理解:方法调用方法自身
public static void main(String[] args){ //错误示范: //StackOverflowError - 栈内存溢出的错误 //前言:调用方法,就会在栈内存中开辟空间,用于存放该方法的局部变量,方法执行完毕,该空间会立刻回收 //错误出现原因:死循环的调用方法,栈内存就满载并溢出了 method(); } public static void method(){ method(); }
经验:
- 找规律 - 方法何时调用方法自身
- 找出口 - 方法何时结束
需求:设计一个方法,传入int类型的数据,求阶乘
分析: 5! = 1*2*3*4*5 -> 5! = 4! * 5 4! = 1*2*3*4 -> 4! = 3! * 4 3! = 1*2*3 -> 3! = 2! * 3 2! = 1*2 -> 2! = 1! * 2 1! = 1 -> 1! = 1 找规律:n! = (n-1)! * n 找出口:1! = 1
public static void main(String[] args){ int num = method(5); System.out.println(num); } public static int method(int n){ if(n != 1){ return method(n-1)*n; }else{ return 1; } }
需求:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月的兔子对数为多少对?
分析:1、1、2、3、5、8、13、21
注意:不死神兔的数据也叫所斐波拉切数列(黄金分割数列)
找规律:除了第一个月和第二个月,其余月兔子的对数是上个月+上上个月
找出口:第一个月和第二个月兔子的对数都是1对
public static void main(String[] args){ int num = getRabbit(9); System.out.println(num); } public static int getRabbit(int month){ if(month== 1 || month==2){ return 1; }else{ return getRabbit(month-1) + getRabbit(month-2); } }
总结
- 万年历
- 方法
无参数无返回值的方法
带参数的方法(实参和形参)
带返回值的方法- 方法的重载
理解概念
条件
好处- 方法的递归
思想、理解
找规律、找出口