打渔晒网
题目描述如下:
中国有句俗语叫“三天打鱼两天晒网”.某人从2010年1月1日起开始“三天打鱼两天晒网".问这个人在以后的某一天中是“打鱼”还是“晒网”。
用C或C++语言/java/python实现程序解决问题。
本工程由以下几个.java文件组成.
思路:
首先使用正则表达式判断字符串是否由8个数字组成.
@sherry
String reg="\\d{8}";//\d表示数字 {8}表示重复8次
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(date);
// 字符串是否与正则表达式相匹配
boolean rs = matcher.matches();
if(!rs)
return "不是由8个数字构成";//如果不是由数字组成返回false
然后判断字符串对应的日期是否符合逻辑.
@sherry
//将字符串转化为对应的年月日
String y=date.substring(0,4);//裁剪字符串
String m=date.substring(4,6);
//substring裁剪字符串的范围[4,6)
String d=date.substring(6,8);
year=Integer.parseInt(y);//将字符串转化为int
month=Integer.parseInt(m);
day=Integer.parseInt(d);
if(year<2010)//打渔晒网从2010年开始
return "年份错误";
if(month<=0||month>12)//月份取值范围1-12
return "月份错误";
if(Isrun(year)&&(day<=0||day>run[month-1]))//闰年
return "日期错误";//根据是否为闰年和月份判断日期是否超出范围
if((!Isrun(year))&&(day<=0||day>unrun[month-1]))//非闰年
return "日期错误";
统计输入的时期是从2010年1月1日算起的第几天.
public int sum(){
int sum=0;
for(int i=2010;i<year;i++){//计算从2010年到year-1年一共经过了多少天
if(Isrun(i)){
sum++; //(a+b)%5=a%5+b%5 闰年366天故sum++非闰年365天故不加
}
}
boolean Isr=Isrun(year);
for(int i=0;i+1<month;i++){//计算从1月到month-1月一共经理了多少天
if(Isr)
sum+=run[i];
else
sum+=unrun[i];
}
sum=sum%5;//对总和除5取余
sum+=day;
return sum;
}
最后判断是打渔,晒网还是其他
@sherry
public String JudgeResult(){
String result=null;
if(JudgeDate()!=null){//判断日期的表达是否正确
result=JudgeDate();
}
else{
int sum=sum();
if(sum%5>0&&sum%5<4)
result="打渔";
else
result="晒网";
}
clean();
return result;
}
上述所有代码放在fish.java中
@sherry
package fish;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Fish {
int run[]={31,29,31,30,31,30,31,31,30,31,30,31};//存储闰年每个月份的天数
int unrun[]={31,28,31,30,31,30,31,31,30,31,30,31};//存储非闰年每个月份的天数
String date;
int year;
int month;
int day;
// public Fish(){
// run={31,29,31,30,31,30,31,31,30,31,30,31};
// unrun={31,28,31,30,31,30,31,31,30,31,30,31};
// }
public void clean(){//数据清零
date =null;
year=0;
month=0;
day=0;
}
public void setDate(String date){//为date赋值
this.date=date;
}
public String JudgeDate(){
String reg="\\d{8}";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(date);
// 字符串是否与正则表达式相匹配
boolean rs = matcher.matches();
if(!rs)
return "不是由8个数字构成";//如果不是由数字组成返回false
//将字符串转化为对应的年月日
String y=date.substring(0,4);//裁剪字符串
String m=date.substring(4,6);
String d=date.substring(6,8);
year=Integer.parseInt(y);//将字符串转化为int
month=Integer.parseInt(m);
day=Integer.parseInt(d);
if(year<2010)//打渔晒网从2010年开始
return "年份错误";
if(month<=0||month>12)//月份取值范围1-12
return "月份错误";
if(Isrun(year)&&(day<=0||day>run[month-1]))//闰年
return "日期错误";//根据是否为闰年和月份判断日期是否超出范围
if((!Isrun(year))&&(day<=0||day>unrun[month-1]))//非闰年
return "日期错误";
return null;//上述条件均符合则判断该日期符合格式或合理
}
public String JudgeResult(){
String result=null;
if(JudgeDate()!=null){//判断日期的表达是否正确
result=JudgeDate();
}
else{
int sum=sum();
if(sum%5>0&&sum%5<4)
result="打渔";
else
result="晒网";
}
clean();
return result;
}
public int sum(){
int sum=0;
for(int i=2010;i<year;i++){//计算从2010年到year-1年一共经过了多少天
if(Isrun(i)){
sum++; //(a+b)%5=a%5+b%5 闰年366天故sum++非闰年365天故不加
}
}
sum=sum%5;//防止sum溢出
boolean Isr=Isrun(year);
for(int i=0;i+1<month;i++){//计算从1月到month-1月一共经理了多少天
if(Isr)
sum+=run[i];
else
sum+=unrun[i];
}
sum=sum%5;//对总和除5取余
sum+=day;
return sum;
}
public boolean Isrun(int year){
return (year%4==0 && year%100!=0)||year%400==0;//判断year是否为闰年
}
}
mysql.java用于连接数据库
package fish;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class mySql {
Connection conn;
Statement stmt;
ResultSet rs;
public static void close(Connection conn){
try{
if(conn!=null){
conn.close();//关闭连接
}
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn=null;
try{
Class.forName("com.mysql.jdbc.Driver");
//连接mysql中fish 数据库 用户名root 密码root 编码方式为utf-8
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/fish?useUnicode=true&characterEncoding=UTF-8","root","root");
}
catch(ClassNotFoundException e){
System.out.println("注册驱动成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
DAO.java用于使用sql语言做相应的增删改查
package DAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import fish.*;
/**
* 此类就是用来完成数据库增删改查
* @author sherry
*
*/
public class DAO {
public String searchDate(int id){//从数据库中依次获取date
String date=null;
Connection conn=mySql.getConnection();//连接数据库
String sql ="select date from fishing where id=?";//从fishing表中获取字符串date
try {
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs=ps.executeQuery();
if(rs.next()){
date=rs.getString(1);//获取的字符串
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{//关闭连接
mySql.close(conn);
}
return date;//将获取的字符串返回
}
public void setResult(String date,String result){//输出date对应的结果打渔/晒网/其他
Connection conn=mySql.getConnection();//连接数据库
//修改fishing表中date对应的结果
String sql ="update fishing set result=? where date=?";
try {
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,result);
ps.setString(2,date);//通过预编译将变量插入sql语句
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
mySql.close(conn);//关闭连接
}
}
}
通过testFish.java完成交互式输入或从数据库读入
package fish;
import java.util.Scanner;
import DAO.DAO;
public class testFish {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fish f =new Fish();
String date;
Scanner sc=new Scanner(System.in);
//交互式输入
//如使用交互式输入将下列注释取消并将下面几行注释掉即可
// System.out.println("请输入一个日期.格式参照20100101");
// while(sc.hasNext()){//循环输入日期
// date=sc.next();
// f.setDate(date);
// System.out.println(f.JudgeResult());
// }
//从数据库输入
DAO dao=new DAO();
int i=1;
date=dao.searchDate(i);//从数据库中获取id号对应的字符串
while(dao.searchDate(i)!=null){
f.setDate(date);//将字符串赋值给类fish的对象f
dao.setResult(date, f.JudgeResult());//判断date为打渔或晒网或其他
date=dao.searchDate(++i);//获取下一个id号对应的字符串
}
}
}
如果闲的话后期发布Python版(估计是不会发的).