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位数字串,都能得到正确的闰年判断结果以及相应的前后闰年列表。