zoukankan      html  css  js  c++  java
  • 使用表驱动编程设计打印万年历

    表驱动编程设计不属于设计模式,只是编程的一个技巧,对于复杂的决策,可以将其包装为决策表,然后使用驱动编程的方法解决。这样可以使程序变得清晰简洁,又提高了代码的可修改性。

    这是一道软件工程的课后习题。

    我的决策表设计如下

    条件和行动

    规则

    月份类型

    大月

    小月

    平月(2月)

    年份类型

    无限制

    无限制

    平年

    闰年

    月份天数

    31

    30

    28

    29

    年份天数

    365

    366

    打印月份天数为31

     

     

     

    打印月份天数为30

     

     

     

    打印月份天数为29

     

     

     

    打印月份天数为28

     

     

     

    设计代码如下

    package test;
    
    import java.util.Scanner;
    
    public class Test {
    
        // 决策表,无限制单元格补上任意符号,保持数组大小为4
        private static String[] monthType = { "big", "small", "flat", "flat" };
        private static String[] yearType = { "any", "any", "flat", "leap" };
        private static int[] monthDay = { 31, 30, 28, 29 };
        private static int[] yearDay = { 365, 365, 365, 366 };
    
        // 获取相应的月份天数和年份天数,字符串表示,"_"隔开
        // 按照决策,年份的判断依据2月判断,所以下面计算总天数时传2月
        public static String getYearAndMonthDay(int year, int month) {
            for (int i = 0; i < 4; i++) {
                if (monthType[i].equals(judgeMonthType(month))
                        && (yearType[i].equals("any") || yearType[i]
                                .equals(judgeYearType(year)))) {
                    return yearDay[i] + "_" + monthDay[i];
                }
            }
            return null;
        }
    
        public static void printDate(int y, int m) {
            int monthDay = 0;
            int yearDay_sum = 0;
            // 计算从1900年到当前年份的总天数,用于计算星期几
            for (int i = 1900; i < y; i++) {
                //一定要传2月才能得到正确的当年天数
                yearDay_sum += Integer
                        .parseInt(getYearAndMonthDay(i, 2).split("_")[0]);
            }
            for (int i = 1; i < m; i++) {
                yearDay_sum += Integer
                        .parseInt(getYearAndMonthDay(y, i).split("_")[1]);
            }
            yearDay_sum = yearDay_sum + 1;
            monthDay = Integer.parseInt(getYearAndMonthDay(y, m).split("_")[1]);
    
            System.out.println("日	一	二	三	四	五	六");
    
            // 除以7便是从那天开始
            int length = yearDay_sum % 7;
            // 之前用空格 打印
            for (int i = 0; i <= length - 1; i++) {
                System.out.print(" 	");
            }
            // 遍历月份 取出多加的monthDay
            for (int i = 1; i <= monthDay; i++) {
                if (yearDay_sum % 7 == 6) {
                    System.out.print(i + "
    ");
                } else {
                    System.out.print(i + "	");
                }
                // 总天数自增
                yearDay_sum++;
            }
        }
        
        // 判断平年闰年的方法
            public static String judgeYearType(int year) {
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                    return "leap";
                }
                return "flat";
            }
    
            // 判断月份类型
            public static String judgeMonthType(int month) {
                if (month == 4 || month == 6 || month == 9 || month == 11) {
                    return "small";
                } else if (month == 2) {
                    return "flat";
                }
                return "big";
            }
    
        public static void main(String[] args) {
    
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入年份:");
            // int year = sc.nextInt();
            System.out.println("请输入月份:");
            // int month = sc.nextInt();
            printDate(2017, 10);
        }
    }
  • 相关阅读:
    NoSQL、memcached介绍、安装memcached、查看memcached状态
    报警系统配置文件
    shell中的函数、数组、报警系统脚本
    for循环、while循环、break、continue、exit
    Shell脚本中的逻辑判断、文件目录属性判断、if的特殊用法、case判断
    Shell脚本、Shell脚本结构、date命令的用法、变量
    zabbix的自动发现、自定义添加监控项目、配置邮件告警
    rabbitMQ中的Vhost理解、创建和使用
    charset编码问题:YAMLException: java.nio.charset.MalformedInputException
    java jna 报错:Unable to load library
  • 原文地址:https://www.cnblogs.com/pokid/p/7652664.html
Copyright © 2011-2022 走看看