从零开始学Java,学习笔记Day05

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();
        }
    }

}

一、方法

理解: 是一段用于执行特定任务的代码块。方法可以用来实现功能复用,提高代码的组织性和可读性。

方法的基本组成部分包括:

  1. 访问修饰符:如 publicprivateprotected,它们决定了方法的可见性。
  2. 返回类型:方法完成其操作后返回的数据类型。如果方法不返回任何值,则使用 void 关键字。
  3. 方法名:遵循Java标识符命名规则,通常建议使用有意义的名字来描述方法的功能。
  4. 参数列表:方法可能需要接收一些输入数据来完成其任务,这些数据通过参数传递给方法。每个参数都需要指定其类型和名称。
  5. 方法体:包含一系列语句,定义了方法具体要执行的操作。

示例

下面是一个简单的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 方法传递了两个整数 1020,然后接收返回的结果并打印出来。

二、静态方法

理解:特定功能的代码块

**好处:**减少代码的冗余

语法结构:

访问修饰符 static 返回值类型 方法名(参数列表){

    ...代码块...
        return 返回值;
}

分类:

  1. 无参数无返回值的方法
  2. 带参数的方法
  3. 带返回值的方法

1.无参数无返回值的方法

语法结构:

public static void 方法名(){
    ...代码块...
}

注意:

  1. void(关键字)表示无返回值
  2. 方法写在类里
  3. 方法与方法之间是平级关系
  4. 方法没有调用,就是个摆设

2.带参数的方法

语法结构:

public static void 方法名(参数列表){
    ...代码块...
}

注意:

  1. 形式参数:叫做形参,声明方法时规定的参数
  2. 形参必须设置类型
  3. 形参是该方法的局部变量,作用域就在该方法内
  4. 局部变量就是方法中声明的变量
  5. 实际参数:叫做实参,调用方法时传入的实际数据
  6. 形参和实参的类型必须兼容
  7. 形参和实参可以有多个,使用逗号分隔
  • 需求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 返回值数据;
}

注意:

  1. 带返回值的方法有没有参数,是不冲突的
  2. 方法功能单一性:一个方法的功能不要过于强大
  3. 返回值只能有一个
  4. 方法声明时规定的返回值类型必须和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. 在同一个类里
  2. 方法名相同
  3. 参数列表的个数或者类型不一致
  4. 与返回值无关

**好处:**系统会根据具体的实参类型,自动匹配到对应的方法里

  • 需求1:设计一个方法,传入两个int值,返回最大值
  • 需求2:设计一个方法,传入三个int值,返回最大值
  • 需求3:设计一个方法,传入两个double值,返回最大值
  • 需求4:设计一个方法,传入三个double值,返回最大值

编写一个方法的步骤:

  1. 考虑方法的名 – 做到见名知意
  2. .考虑参数
    • 该方法需不需要参数?
    • 需要几个参数?
    • 参数类型是什么?
  3. 考虑返回值
    • 该方法需不需要返回值?
    • 返回值类型是什么?
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);
    }
}

总结

  1. 万年历
  2. 方法
    无参数无返回值的方法
    带参数的方法(实参和形参)
    带返回值的方法
  3. 方法的重载
    理解概念
    条件
    好处
  4. 方法的递归
    思想、理解
    找规律、找出口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值