Android应用-闰年计算(流程图、代码)

1 要求


1.编写一个在安卓下运行的闰年计算类,当输入1-4位年份时输出是否为闰年,同时输出前后各5个闰年。
2.当输入大于5位年份时,将其视为天数,并转换为对应Date类型的年份,然后按要求1进行输出。
3.输入的年份可以使用Java的读取数据方法或者使用EditText控件。
4.输出结果显示在TextView控件中。
5.当输入5位数字串,取前两位并在数字前加上20,如输入“23456”,自动取2023作为输入年份并完成以上输出闰年操作。
6.当输入非法字符或年份时提示:xx,你输入的年份错误。
7.要能实现连续多次年份输入和结果输出。
8.计算结果要准确。


2 流程图:

图片

3 Android程序代码

  1)activity_main.xml(布局文件)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/editText_year"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入年份"
        android:textSize="23sp"
        android:textColor="@color/editText_color"
        android:inputType=""
        app:layout_constraintBottom_toTopOf="@+id/button_calculate"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />
    <Button
        android:id="@+id/button_calculate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/button_color"
        android:text="计算"
        android:textSize="35sp"
        app:layout_constraintBottom_toTopOf="@+id/textView_result"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />
    <TextView
        android:id="@+id/textView_result"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="18sp"
        android:textColor="@color/my_text_color"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.551"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_calculate" />
</androidx.constraintlayout.widget.ConstraintLayout>

  2)LeapYearCalculator.java

package com.cg;
import java.util.List;
/**
 * 闰年计算器类,用于判断给定的年份是否为闰年
 */
public class LeapYearCalculator {
    private int year;// 保存年份的变量
    /**
     * 构造函数,接受一个参数作为年份,并将其赋值给year变量
     * @param year 年份
     */
    public LeapYearCalculator(int year) {
        this.year = year;// 构造函数,接受一个参数作为年份,并将其赋值给year变量
    }
    /**
     * 判断给定的年份是否为闰年
     * @return 如果是闰年则返回true,否则返回false
     */
    public boolean isLeapYear() {
        if (year % 4 == 0) {// 如果年份能被4整除
            if (year % 100 != 0 || year % 400 == 0) { // 如果年份不能被100整除或者能被400整除
                return true;// 是闰年,返回true
            }
        }
        return false;// 不是闰年,返回false
    }
    /**
     * 获取给定年份之前的5个闰年
     * @return 5个闰年的列表
     */
    public List<Integer> getPreviousLeapYears() {
        List<Integer> previousYears = new ArrayList<>();// 保存前5个闰年的列表
        int count = 0;// 计数,记录已找到的闰年个数
        int currentYear = year - 1;// 从给定年份的前一年开始向前搜索
        while (count < 5) {// 当计数小于5时继续搜索
            if (new LeapYearCalculator(currentYear).isLeapYear()) {     // 如果当前年份是闰年
                previousYears.add(0, currentYear);// 将当前年份添加到列表的开头
                count++;// 计数+1
            }
            currentYear--;// 当前年份减1
        }
        return previousYears; // 返回前5个闰年的列表
    }
    /**
     * 获取给定年份之后的5个闰年
     * @return 5个闰年的列表
     */
    public List<Integer> getNextLeapYears() {
        List<Integer> nextYears = new ArrayList<>();// 保存后5个闰年的列表
        int count = 0;// 计数,记录已找到的闰年个数
        int currentYear = year + 1;// 从给定年份的后一年开始向后搜索
        while (count < 5) {// 当计数器小于5时继续搜索
            if (new LeapYearCalculator(currentYear).isLeapYear()) {     // 如果当前年份是闰年
                nextYears.add(currentYear);// 将当前年份添加到列表的末尾
                count++; // 计数加1
            }
            currentYear++;// 当前年份加1
        }
        return nextYears; // 返回后5个闰年的列表
    }
}

  3)MainActivity.java

package com.cg;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.time.LocalDate;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    private EditText inputYear;// 输入年份的文本框
    private Button buttonCalculate;// 计算按钮
    private TextView resultTextView;// 显示结果的文本框
    /**
     * 创建活动时调用的函数
     * @param savedInstanceState 保存的实例状态
     */
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);// 设置布局文件为activity_main.xml
        setTitle("12345671 林天");// 设置标题栏的标题为学号和姓名
        inputYear = findViewById(R.id.editText_year);// 在布局中找到ID为editText_year的文本框并赋值给inputYear
        inputYear.setTextColor(getResources().getColor(R.color.editText_color));//将editText_color的字体颜色设置为紫色
        buttonCalculate = findViewById(R.id.button_calculate);// 在布局中找到ID为button_calculate的按钮并赋值给buttonCalculate
        buttonCalculate.setTextColor(getResources().getColor(R.color.button_color));//将button_color的上的计算颜色设蓝色
        resultTextView = findViewById(R.id.textView_result); // 在布局中找到ID为textView_result的文本框并赋值给resultTextView
        resultTextView.setTextColor(getResources().getColor(R.color.my_text_color));//将my_text_color的上的输出结果颜色设粉红色
        buttonCalculate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String input = inputYear.getText().toString();// 获取输入框中的年份
                if (input.length() >= 1 && input.length() <= 4) {// 如果输入年份的长度在1到4之间
                    try {
                        int year = Integer.parseInt(input);// 将年份转换为整数
                        LeapYearCalculator calculator = new LeapYearCalculator(year);// 创建一个LeapYearCalculator对象,传入年份作为参数
                        boolean isLeapYear = calculator.isLeapYear(); // 判断该年份是否为闰年
                        List<Integer> previousLeapYears = calculator.getPreviousLeapYears();// 获取该年份之前的5个闰年
                        List<Integer> nextLeapYears = calculator.getNextLeapYears();// 获取该年份之后的5个闰年
                        StringBuilder result = new StringBuilder();// 创建一个StringBuilder对象,用于存储结果
                        if (isLeapYear) {  // 如果该年份是闰年
                            result.append(year).append("年是闰年");// 在结果中添加该年份是闰年的信息
                        } else {    // 如果该年份不是闰年
                            result.append(year).append("年不是闰年");// 在结果中添加该年份不是闰年的信息
                        }
                        result.append("\n前5个闰年: ");// 在结果中添加前5个闰年的信息
                        for (int previousYear : previousLeapYears) {// 遍历前5个闰年
                            result.append(previousYear).append("  "); // 将每个闰年添加到结果中,用空格隔开
                        }
                        result.append("\n后5个闰年: ");// 在结果中添加后5个闰年的信息
                        for (int nextYear : nextLeapYears) {// 遍历后5个闰年
                            result.append(nextYear).append("  ");// 将每个闰年添加到结果中,用空格隔开
                        }
                        resultTextView.setText(result.toString());// 将结果显示在textView文本框中
                    } catch (NumberFormatException e) {  // 如果输入的年份无法转换为整数
                        showToast("输入的年份错误");// 显示错误信息
                    }
                }else if(input.length() == 5){// 如果输入年份的长度是否5
                    try{
                        int year = Integer.parseInt(input);// 将年份转换为整数
                        year =(int)( 2000 + (year) / 1000);//通过取20作为前两位和输入年份前两位重组新的年份
                        year= Integer.parseInt(String.valueOf(year));// 将年数转换为整型传入
                        LeapYearCalculator calculator = new LeapYearCalculator(year);// 创建一个LeapYearCalculator对象,传入年份作为参数
                        boolean isLeapYear = calculator.isLeapYear();// 判断该年份是否为闰年
                        List<Integer> previousLeapYears = calculator.getPreviousLeapYears();// 获取该年份之前的5个闰年
                        List<Integer> nextLeapYears = calculator.getNextLeapYears();// 获取该年份之后的5个闰年
                        StringBuilder result = new StringBuilder();// 创建一个StringBuilder对象,用于存储结果
                        if (isLeapYear) {  // 如果该年份是闰年
                            result.append(year).append("年是闰年");// 在结果中添加该年份是闰年的信息
                        } else {  // 如果该年份不是闰年
                            result.append(year).append("年不是闰年");// 在结果中添加该年份不是闰年的信息
                        }
                        result.append("\n前5个闰年: ");// 在结果中添加前5个闰年的信息
                        for (int previousYear : previousLeapYears) {// 遍历前5个闰年
                            result.append(previousYear).append("  ");// 将每个闰年添加到结果中,用空格隔开
                        }
                        result.append("\n后5个闰年: ");// 在结果中添加后5个闰年的信息
                        for (int nextYear : nextLeapYears) {// 遍历后5个闰年
                            result.append(nextYear).append("  ");// 将每个闰年添加到结果中,用空格隔开
                        }
                        resultTextView.setText(result.toString());;// 将结果显示在textView文本框中
                    } catch (NumberFormatException e) {// 如果输入的年份无法转换为整数
                        showToast("输入的年份错误");// 显示错误信息
                    }
                } else if (input.length() > 5) {// 如果输入年份的长度大于5
                    try {
                        long days = Long.parseLong(input);// 将输入的字符串转换为长整型表示的天数
                        LocalDate startDate = LocalDate.of(2023, 9, 26);  // 假设起始日期为 2023-9-26
                        // 将天数加到起始日期上得到目标日期
                        LocalDate targetDate = startDate.plusDays(days);
                        // 计算目标日期与起始日期之间的年数差
                        int year = targetDate.getYear() - startDate.getYear();
                        //int year=(int)(days/365);
                        year= Integer.parseInt(String.valueOf(year));// 将年数转换为整型
                        LeapYearCalculator calculator = new LeapYearCalculator(year);// 创建一个LeapYearCalculator对象,传入年份作为参数
                        boolean isLeapYear = calculator.isLeapYear();// 判断该年份是否为闰年
                        List<Integer> previousLeapYears = calculator.getPreviousLeapYears();// 获取该年份之前的5个闰年
                        List<Integer> nextLeapYears = calculator.getNextLeapYears();// 获取该年份之后的5个闰年
                        StringBuilder result = new StringBuilder();// 创建一个StringBuilder对象,用于存储结果
                        if (isLeapYear) {  // 如果该年份是闰年
                            result.append(year).append("年是闰年");// 在结果中添加该年份是闰年的信息
                        } else {  // 如果该年份不是闰年
                            result.append(year).append("年不是闰年");// 在结果中添加该年份不是闰年的信息
                        }
                        result.append("\n前5个闰年: ");// 在结果中添加前5个闰年的信息
                        for (int previousYear : previousLeapYears) {// 遍历前5个闰年
                            result.append(previousYear).append("  ");// 将每个闰年添加到结果中,用空格隔开
                        }
                        result.append("\n后5个闰年: ");// 在结果中添加后5个闰年的信息
                        for (int nextYear : nextLeapYears) {// 遍历后5个闰年
                            result.append(nextYear).append("  ");// 将每个闰年添加到结果中,用空格隔开
                        }
                        resultTextView.setText(result.toString());;// 将结果显示在textView文本框中
                    } catch (NumberFormatException e) {// 如果输入的年份无法转换为整数
                        showToast("输入的年份错误");// 显示错误信息
                    }
                } else {
                    showToast("输入的年份错误");// 不合法输入,显示错误信息
                }
            }
        });
    }
    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

4 实验结果图

图片

图片

5 实验结果分析

  • 实验中,首先创建一个Android应用,使用EditText控件供用户输入年份。当用户输入1-4位年份时,程序会根据闰年的计算规则(能被4整除但不能被100整除,或者能被400整除的年份为闰年)判断是否为闰年,并同时输出该年份前后各5个闰年。
  • 当用户输入大于5位数时,程序将这个数值视为天数,利用Java 8中的java.time包或Calendar类将天数转换成对应的Date类型年份,然后再按照闰年的规则进行判断和输出。
  • 输入部分通过监听EditText控件的文本变化事件或者点击按钮触发事件来读取数据。
  • 输出结果显示在TextView控件中,每次计算完成后更新TextView的内容。
  • 对于5位数字串的情况,程序会自动截取前两位并添加“20”作为年份进行处理,例如输入“23456”,则处理为年份“2023”。
  • 若用户输入非法字符或不合理的年份,程序会通过Toast提示用户输入错误,保证用户体验和程序健壮性。
  • 为了实现连续多次输入与结果输出,只需保持UI交互逻辑的持续响应,即每次完成一次计算后,EditText仍可继续接收新的输入,并在接收到新输入后再次执行计算及结果显示流程。
  • 计算闰年的算法准确无误,确保了无论用户输入的是正常年份还是经过特殊处理后的5位数字串,都能得到正确的闰年判断结果以及相应的前后闰年列表。
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天林望海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值