打渔晒网

打渔晒网

题目描述如下:
   中国有句俗语叫“三天打鱼两天晒网”.某人从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&amp;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版(估计是不会发的).

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值