题目:
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
解题思路:
先是进行判断输入的日期是否正确,分别从年份,月份,日进行判断格式,然后验证字符串形式的日期格式后。根据5天一个周期循环,并根据余数,1 ,2,3为打渔,其他情况均为晒网。随后判断是否为闰年,并根据每年,每月各自不同的天数来计算出距离2010的总天数来进行以上循环。
拿到题目,由于基础不好就去百度了解学习了此程序的基本功能。然后经过请教同学并学习,尽力完成了以下程序。
源代码:
package fish;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;
public class Homework {
public static void main(String[] args){
read();
}
//判断输入的日期格式是否正确
static boolean checkDate(int year, int month, int day){
//判断年份格式
if (year < 2010) {//年份在2010年以前
return false;
}
//判断月份格式
if (month > 12|| month <= 0) { //月份大于12或小于等于0
return false;
}
//判断日格式
if (day > getDays(year, month)|| getDays(year, month) < 0) {//日是否满足每个月的天数
return false;
}
return true;
}
//验证字符串形式的日期格式
static boolean checkDate(String date) {
if (!date.matches("\\d{8}")) { //输入日期共八位
return false;
}
int year = Integer.parseInt(date.substring(0, 4));//年份占4位
int month = Integer.parseInt(date.substring(4, 6));//月份占2位
int day = Integer.parseInt(date.substring(6, 8));//日占两位
return checkDate(year, month, day);
}
//判断打鱼还是晒网
public static int judge(int days) {
if (days == 0) {
return 0;
}
//五天为一个周期
int x=days%5;
if(x==1||x==2||x==3){
return 1; //表示打鱼
}else {
return 2; //表示晒网
}
}
//判断是否是闰年
public static boolean RunNian( int year) {
if((year%4==0&&year%100!=0)||year%400==0){
return true;
} else {
return false;
}
}
//计算距离输入日期多少天
public static int getAllDays(int year, int month, int day) {
if (!checkDate(year, month, day)) {
// System.out.println("日期错误");
return 0;
}
int sum = 0;
//计算2010-(year-1)之同有多少天
for(int i=2010;i<year;i++){
if ( RunNian(i)) {
sum += 366;//闰年天数加366
}else{
sum+=365;//平年天数加365
}
}
//计算一年内有多少天
sum += getPreviousDays(year, month, day);//天数求和
return sum;
}
public static int getAllDays(String date) {
if (!checkDate(date)) {
// System.out.println("日期错误");
return 0;
} else {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(4, 6));
int day = Integer.parseInt(date.substring(6, 8));
return getAllDays(year, month, day);
}
}
//判断每月有几天
public static int getDays(int year, int month) {
int days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31; //1,3,5,7,8,10,12为大月,大月天数为31
break;
case 4:
case 6:
case 9:
case 11:
days = 30;//4,6,,9,11为小月,小月天数为30
break;
case 2:
if (RunNian(year)) {
days = 29;//闰年2月29天
}else {
days = 28;//平年2月28天
}
break;
}
return days;
}
//计算本年内该日期之前共有多少天
public static int getPreviousDays(int year, int month, int day) {
int sum =0;
for (int i= 1; i < month; i++) {
sum += getDays(year, i);
}
return sum + day;
}
public static void read() {
String path = "E:\\我的程序设计\\text.txt";//目标文件路径
String dest = "E:\\我的程序设计\\out.txt";//结果文件路径
File inFile = new File(path);
File outFile = new File(dest);
String out = null;
String line = "";
try {
BufferedReader is = new BufferedReader(new FileReader(inFile));//读文件
BufferedWriter os = new BufferedWriter(new FileWriter(outFile));//写文件
// 每次读一行,并将这一行数据进行判断,将结果写入文件
while((line = is.readLine()) != null) {
switch (judge(getAllDays(line))) {
case 0:
os.write("日期错误\r\n");
os.flush();
break;
case 1:
os.write("他在打鱼\r\n");
os.flush();
break;
case 2:
os.write("他在晒网\r\n");
os.flush();
break;
default:
break;
}
}
is.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试结果:
程序流程图: