Java博客作业

Posted cmzs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java博客作业相关的知识,希望对你有一定的参考价值。

一、前言

  • 跟之前相比,这几次题目集的难度很明显上升很多,尤其是菜单迭代的题目,简直是令人绝望,也让我再一次感受到了不下功夫学是难以取得好结果的,很多东西都需要慢慢摸索
  1. 第四次题目集题量大,但总体难度中上,2-7题主要考察了字符串相关的方法以及对象数组的使用,第1题就是我们第一次接触大名鼎鼎的菜单题,十分难做
  2. 第五次题目集前四题都考察了正则表达式的使用,不算太难,但是弄清楚正则表达式的条件也废了一点功夫,后面两题就是日期的聚合,难度大
  3. 第六次题目集只有一道题,菜单题的第四次迭代,但难度极大

二、设计与分析

挑选个别题目进行分析

  • 第四次题目集

7-1 菜单计价程序-3

设计点菜计价程序,根据输入的信息,计算并输出总价格。

输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。

菜单由一条或多条菜品记录组成,每条记录一行

每条菜品记录包含:菜名、基础价格 两个信息。

订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。

桌号标识独占一行,包含两个信息:桌号、时间。

桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。

点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。

不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。

删除记录格式:序号 delete

标识删除对应序号的那条点菜记录。

如果序号不对,输出"delete error"

代点菜信息包含:桌号 序号 菜品名称 份额 分数

代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。

程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。

每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。

折扣的计算方法(注:以下时间段均按闭区间计算):

周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。

周末全价,营业时间:9:30-21:30

如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"

参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。

Dish

String name;//菜品名称

int unit_price; //单价

int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。

Menu

Dish\\[\\] dishs ;//菜品数组,保存所有菜品信息

Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。

Dish addDish(String dishName,int unit_price)//添加一道菜品信息

点菜记录类:保存订单上的一道菜品记录

Record

int orderNum;//序号\\\\

Dish d;//菜品\\\\

int portion;//份额(1/2/3代表小/中/大份)\\\\

int getPrice()//计价,计算本条记录的价格\\\\

订单类:保存用户点的所有菜的信息。

Order

Record\\[\\] records;//保存订单上每一道的记录

int getTotalPrice()//计算订单的总价

Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。

delARecordByOrderNum(int orderNum)//根据序号删除一条记录

findRecordByNum(int orderNum)//根据序号查找一条记录

### 输入格式:

桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

菜品记录格式:

菜名+英文空格+基础价格

如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

删除记录格式:序号 +英文空格+delete

代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

最后一条记录以“end”结束。

### 输出格式:

按输入顺序输出每一桌的订单记录处理信息,包括:

1、桌号,格式:table+英文空格+桌号+”:”

2、按顺序输出当前这一桌每条订单记录的处理信息,

每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\\*\\* does not exist”,\\*\\*是不能识别的菜名

如果删除记录的序号不存在,则输出“delete error”

最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

输入格式:

桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

菜品记录格式:

菜名+英文空格+基础价格

如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

删除记录格式:序号 +英文空格+delete

代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

最后一条记录以“end”结束。

输出格式:

按输入顺序输出每一桌的订单记录处理信息,包括:

1、桌号,格式:table+英文空格+桌号+“:”

2、按顺序输出当前这一桌每条订单记录的处理信息,

每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\\*\\* does not exist”,\\*\\*是不能识别的菜名

如果删除记录的序号不存在,则输出“delete error”

最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

  • 思路:首先我们可以看到这个题目真的很长,当时我看了一下之后觉得短时间内很难写出来,就去做后面的题目了,这道题直到作业截止的时候也没能做出来,我忏悔。因此菜单四也是理所当然的做不出来,所以又返回来看了看这道题,尝试着做了一下。事实上这道题的难度也是相当的大,不仅要考虑订单时间的判断,还要输入菜品的信息,订单信息的增删改等等等等,难以下手。最后是使用了循环了进行输入,并且逐条处理输入的信息,下面放出正确代码

源码如下:

  1 import java.util.*;
  2 public class Main 
  3     public static void main(String[] args) 
  4         Scanner input = new Scanner(System.in);
  5         Menu menu = new Menu();
  6         Table[] tables = new Table[10];
  7         int dishAmount;
  8         int orderAmount;
  9         Dish dish;
 10         int tableAmount = 0;
 11         int count;
 12         String[] temp;
 13         int a1,a2,a3,a4,a5;
 14         while (true) 
 15             String string = input.nextLine();
 16             temp = string.split(" ");
 17             if(string.equals("end"))
 18                 break;
 19             count = temp.length;
 20             if (count == 2) 
 21                 if (temp[1].equals("delete")) 
 22                         a1 = Integer.parseInt(temp[0]);
 23                         if (tablemes[tableAmount].order.delARecordByOrderNum(a1) == 0) 
 24                             System.out.println("delete error;");
 25                          else 
 26                                 int c = tablemes[tableAmount].order.delARecordByOrderNum(a1);
 27                                 tablemes[tableAmount].order.sum -= c;
 28                         
 29                  else
 30                     a2 = Integer.parseInt(temp[1]);
 31                     menu.dishs[dishAmount] = menu.addDish(temp[0], a2);
 32                     dishAmount++;
 33                 
 34             
 35             else if (count == 4) 
 36                 if (temp[0].equals("table"))
 37                     tableAmount++;
 38                     orderAmount = 0;
 39                     tablemes[tableAmount] = new Table(temp[1], temp[2], temp[3]);
 40                     tablemes[tableAmount].processTime();
 41                     tablemes[tableAmount].setDiscount();
 42                     System.out.println("table " + temp[1] + ": ");
 43                  else 
 44                         a3 = Integer.parseInt(temp[0]);
 45                         a4 = Integer.parseInt(temp[2]);
 46                         a5 = Integer.parseInt(temp[3]);
 47                         tablemes[tableAmount].order.addARecord(a3, temp[1],a4 , a5);
 48                         dish = menu.searthDish(temp[1]);
 49                         if(dish==null)
 50                             System.out.println(temp[1]+" does not exist");
 51                         
 52                         if (dish != null) 
 53                             tablemes[tableAmount].order.records[orderAmount].d = dish;
 54                             int a = tablemes[tableAmount].order.records[orderAmount].getPrice();
 55                             System.out.println(tablemes[tableAmount].order.records[orderAmount].orderNum + " " + dish.name + " " + a);
 56                             tablemes[tableAmount].order.sum += a;
 57                         
 58                         orderAmount++;
 59                 
 60             
 61             else if (count == 5)
 62                 a1 = Integer.parseInt(temp[1]);
 63                 a2 = Integer.parseInt(temp[3]);
 64                 a3 = Integer.parseInt(temp[4]);
 65                 tablemes[tableAmount].order.addARecord(a1, temp[2], a2, a3);
 66                 dish = menu.searthDish(temp[2]);
 67                 if(dish==null)
 68                     System.out.println(temp[2]+" does not exist");
 69                 
 70                 if (dish != null)
 71                     tablemes[tableAmount].order.records[orderAmount].d = dish;
 72                     int b = tablemes[tableAmount].order.records[orderAmount].getPrice();
 73                     System.out.println(temp[1] + " table " + tablemes[tableAmount].tableNum + " pay for table " + temp[0] + " " + b);
 74                     tablemes[tableAmount].order.sum += b;
 75                 
 76                 orderAmount++;
 77             
 78         
 79         for(int i = 1; i < tableAmount + 1; i++)
 80             if(tablemes[i].getDiscount()>0)
 81                 System.out.println("table " + tablemes[i].tableNum + ": "+Math.round(tablemes[i].order.getTotalPrice()*tablemes[i].getDiscount()));
 82             
 83             else System.out.println("table " + tablemes[i].tableNum + " out of opening hours");
 84         
 85     
 86 
 87 class Dish 
 88     String name;
 89     int unit_price;
 90     int getPrice(int portion) 
 91         if (portion == 1) return unit_price;
 92         else if (portion == 2) return Math.round((float) (unit_price * 1.5));
 93         else return 2*unit_price;
 94     
 95 
 96 class Menu 
 97     Dish[] dishs = new Dish[10];
 98     int dishCount = 0;
 99     Dish searthDish(String dishName)
100         for(int i=dishCount-1;i>=0;i--)
101             if(dishName.equals(dishs[i].name))
102                 return dishs[i];
103             
104         
105         return null;
106     
107     Dish addDish(String dishName,int unit_price)
108         Dish dish = new Dish();
109         dish.name = dishName;
110         dish.unit_price = unit_price;
111         dishCount++;
112         return dish;
113     
114 
115 class Record 
116     int orderNum;
117     Dish d = new Dish();
118     int num = 0;
119     int portion;
120     int getPrice()
121         return d.getPrice(portion)*num;
122     
123 
124 class Order 
125     Record[] records = new Record[10];
126     int count = 0;
127 
128     int sum;
129     void addARecord(int orderNum,String dishName,int portion,int num)
130         records[count] = new Record();
131         records[count].d.name = dishName;
132         records[count].orderNum = orderNum;
133         records[count].portion = portion;
134         records[count].num = num;
135         count++;
136     
137     int getTotalPrice()
138         return sum;
139     
140     int delARecordByOrderNum(int orderNum)
141         if(orderNum>count||orderNum<=0)
142             return 0;
143         else 
144             return records[orderNum - 1].getPrice();
145         
146     
147     Record findRecordByNum(int orderNum) 
148         for (int i = count - 1; i >= 0; i--) 
149             if (orderNum == records[i].orderNum) 
150                 return records[i];
151             
152         
153         return null;
154     
155 
156 class Table 
157     int tableNum;
158     String Date;
159     String tableTime;
160     public Table() 
161     
162 
163     public Table(String tableNum, String date, String tableTime) 
164         this.tableNum = Integer.parseInt(tableNum);
165         Date = date;
166         this.tableTime = tableTime;
167     
168     int year,month,day,week,hh,mm,ss;
169     Order order = new Order();
170     float discount = -1;
171     void processTime()
172         String[] temp1 = Date.split("/");
173         String[] temp2 = tableTime.split("/");
174 
175         year = Integer.parseInt(temp1[0]);
176         month = Integer.parseInt(temp1[1]);
177         day = Integer.parseInt(temp1[2]);
178 
179         Calendar date = Calendar.getInstance();
180         date.set(year, (month-1), day);
181         week = date.get(Calendar.DAY_OF_WEEK);
182         if(week==1)
183             week = 7;
184         else
185             week--;
186         hh = Integer.parseInt(temp2[0]);
187         mm = Integer.parseInt(temp2[1]);
188         ss = Integer.parseInt(temp2[2]);
189 
190     
191     void setDiscount()
192         if(week>=1&&week<=5)
193         
194             if(hh>=17&&hh<20)
195                 discount =0.8F;
196             else if(hh==20&&mm<30)
197                 discount =0.8F;
198             else if(hh==20&&mm==30&&ss==0)
199                 discount =0.8F;
200             else if(hh>=11&&hh<=13||hh==10&&mm>=30)
201                 discount =0.6F;
202             else if(hh==14&&mm<30)
203                 discount =0.6F;
204             else if(hh==14&&mm==30&&ss==0)
205                 discount =0.6F;
206         
207         else
208         
209             if(hh>=10&&hh<=20)
210                 discount = 1.0F;
211             else if(hh==9&&mm>=30)
212                 discount = 1.0F;
213             else if(hh==21&&mm<30||hh==21&&mm==30&&ss==0)
214                 discount = 1.0F;
215         
216     
217     float getDiscount()
218         return discount;
219     
220 

 

 

7-2 有重复的数据

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

  • 思路:一开始觉得这个题目似曾相识,本来是用双重循环来做这个题目,在eclipse里面完全没问题,但是在pta上就说运行超时,行吧,那我们换个方法。查阅资料之后发现用hashset方法可以直接简单轻松地做出来,也为后面的题目打下了基础

源码如下:

import java.util.*;
public class Main  
    public static void main(String[] args)  
        Scanner input = new Scanner(System.in); 
        int n = input.nextInt(); 
        Set<Integer> set = new HashSet<>(); 
        for (int i = 0; i < n; i++) 
         
            int num = input.nextInt();
            if (set.contains(num)) 
             
                System.out.println("YES"); 
                return; 
             
            set.add(num); 
         
        System.out.println("NO"); 
     

 

7-4 单词统计与排序

从键盘录入一段英文文本(句子之间的标点符号只包括“,”或“.”,单词之间、单词与标点之间都以" "分割。

要求:按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。

输入格式:

一段英文文本。

输出格式:

按照题目要求输出的各个单词(每个单词一行)。

  • 思路:这道题一开始卡了我很久,别的还好,主要是按照长度从高到低排序,同时还要判断长度相同时字母的先后顺序有点麻烦。后面用replace方法把输入语句中的 "," 和 "." 去掉之后,将得到的字符串按不同的单词分开存储为一个数组,再使用hashset和arraylist的方法做了出来

源码如下:

import java.util.*;

public class Main
  public static void main(String[] args) 
      Scanner input = new Scanner(System.in);
      String a = input.nextLine();
      String b = a.replace(",", "");
      String f = b.replace(".", "");
      String c[] = f.split(" ");

        Set<String> d = new HashSet<>(Arrays.asList(c));  
        List<String> e = new ArrayList<>(d);
        Collections.sort(e, new Comparator<String>()   
            public int compare(String s1, String s2) 
                if (s1.length() != s2.length()) 
                    return s2.length() - s1.length();  
                 else 
                    return s1.compareToIgnoreCase(s2);  
                
            
        );

        for (String word : e) 
            System.out.println(word);
        
    

 

7-5 面向对象编程(封装性) 

Student类具体要求如下:
私有成员变量:学号(sid,String类型),姓名(name,String类型),年龄(age,int类型),专业(major,String类型) 。
提供无参构造和有参构造方法。(注意:有参构造方法中需要对年龄大小进行判定)
普通成员方法:print(),输出格式为“学号:6020203100,姓名:王宝强,年龄:21,专业:计算机科学与技术”。
普通成员方法:提供setXxx和getXxx方法。(注意:setAge()方法中需要对年龄进行判定)
注意:
年龄age不大于0,则不进行赋值。
print()中的“:”和“,”为均为中文冒号和逗号。

public class Main
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        //调用无参构造方法,并通过setter方法进行设值
        String sid1 = sc.next();
        String name1 = sc.next();
        int age1 = sc.nextInt();
        String major1 = sc.next();
        Student student1 = new Student();
        student1.setSid(sid1);
        student1.setName(name1);
        student1.setAge(age1);
        student1.setMajor(major1);
        //调用有参构造方法
        String sid2 = sc.next();
        String name2 = sc.next();
        int age2 = sc.nextInt();
        String major2 = sc.next();
        Student student2 = new Student(sid2, name2, age2, major2);
        //对学生student1和学生student2进行输出
        student1.print();
        student2.print();
    


/* 请在这里填写答案 */

输入格式:

输出格式:

学号:6020203110,姓名:王宝强,年龄:21,专业:计算机科学与技术
学号:6020203119,姓名:张三丰,年龄:23,专业:软件工程

输入样例:

在这里给出一组输入。例如:

6020203110 王宝强 21 计算机科学与技术
6020203119 张三丰 23 软件工程

输出样例:

在这里给出相应的输出。例如:

学号:6020203110,姓名:王宝强,年龄:21,专业:计算机科学与技术
学号:6020203119,姓名:张三丰,年龄:23,专业:软件工程
  • 思路:就是创建对象数组,根据给出的代码可以较快做出

源码如下:

import java.util.*;
public class Main
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        //调用无参构造方法,并通过setter方法进行设值
        String sid1 = sc.next();
        String name1 = sc.next();
        int age1 = sc.nextInt();
        String major1 = sc.next();
        Student student1 = new Student();
        student1.setSid(sid1);
        student1.setName(name1);
        student1.setAge(age1);
        student1.setMajor(major1);
        //调用有参构造方法
        String sid2 = sc.next();
        String name2 = sc.next();
        int age2 = sc.nextInt();
        String major2 = sc.next();
        Student student2 = new Student(sid2, name2, age2, major2);
        //对学生student1和学生student2进行输出
        student1.print();
        student2.print();
    


class Student
    private String sid;
    private String name;
    private int age;
    private String major;
    Student()
        
    
    Student(String sid,String name,int age,String major)
        
        this.sid = sid;
        this.name = name;
            if(age < 0)
        
            System.exit(0);
        
        this.age = age;
        this.major = major;
    
    
    public String getSid() 
        return sid;
    
    public void setSid(String sid) 
        this.sid = sid;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public int getAge() 
        return age;
    
    public void setAge(int age) 
        if(age < 0)
        
            System.exit(0);
        
        this.age = age;
    
    public String getMajor() 
        return major;
    
    public void setMajor(String major) 
        this.major = major;
    
    public void print() 
        System.out.println("学号:"+getSid()+","+"姓名:"+this.name+","+"年龄:"+this.age+","+"专业:"+this.major);
    

 

7-7 判断两个日期的先后,计算间隔天数、周数

从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。

预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

输入格式:

输入两行,每行输入一个日期,日期格式如:2022-06-18

输出格式:

第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周

  • 思路:还是熟悉的日期,但是这次是为了让我们熟悉java中自带的日期和时间类及他们的方法的使用,难度不大。就是要用split方法把输入的日期分开然后一个个进行判断就好了

源码如下:

import java.util.Scanner;
import java.time.LocalDate;
import java.time.*; 
import java.time.temporal.ChronoUnit;
import java.time.temporal.*;
import java.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;
public class Main

    public static void main(String[] args)
    
        int flag=0;
       Scanner scan =new Scanner(System.in);
       String a= scan.nextLine();
       String b= scan.nextLine();
       String []s1=a.split("-");
       String []s2=b.split("-");
       int year1=Integer.parseInt(s1[0], 10);
       int month1=Integer.parseInt(s1[1], 10);
       int day1=Integer.parseInt(s1[2], 10);
       int year2=Integer.parseInt(s2[0], 10);
       int month2=Integer.parseInt(s2[1], 10);
       int day2=Integer.parseInt(s2[2], 10);
       LocalDate l1=LocalDate.of(year1,month1,day1);
       LocalDate l2=LocalDate.of(year2,month2,day2);
       boolean status = l1.isAfter(l2);
       if(status)
       
           
           System.out.println("第一个日期比第二个日期更晚");
       
       else
       
           flag=1;
           System.out.println("第一个日期比第二个日期更早");
       
      
       long days = l1.until(l2, ChronoUnit.DAYS);
       long weeks=days/7;
        if(flag==1)
        
            System.out.println("两个日期间隔"+days+"天");
            System.out.println("两个日期间隔"+weeks+"周");
        
       else
       
           days=days*-1;
           weeks=weeks*-1;
           System.out.println("两个日期间隔"+days+"天");
            System.out.println("两个日期间隔"+weeks+"周");
       
       
    
  • 第五次题目集

7-1 正则表达式训练-QQ号校验

校验键盘输入的 QQ 号是否合格,判定合格的条件如下:

    • 要求必须是 5-15 位;
    • 0 不能开头;
    • 必须都是数字;

输入格式:

在一行中输入一个字符串。

输出格式:

    • 如果合格,输出:“你输入的QQ号验证成功”;
    • 否则,输出:“你输入的QQ号验证失败”。
  • 思路:就是让我们学会如何使用正则表达式,难度不大

源码如下:

import java.util.Scanner;
public class Main 
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        String a = input.nextLine();
        if(a.matches("^[1-9][0-9]4,14$"))
        
            System.out.print("你输入的QQ号验证成功");
        
        else
        
            System.out.print("你输入的QQ号验证失败");
        
 
    

 

7-5 日期问题面向对象设计(聚合一)

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:

 

  • 思路:做这道题需要先看清楚题目要求,而且需要搞清类与类之间的关系,根据题目里给出的类图来写代码。其实核心逻辑和第四次题目集的7-7相差不大,只是不能用日期类的方法,需要自己写,但是需要使用聚合,事实上这里的代码我没有使用聚合,只有关联关系,在7-6里才做出了改进

源码如下(太长了折叠一下):

  1 import java.util.Scanner;
  2 
  3 public class Main 
  4     public static void main(String[] args) 
  5         Scanner input = new Scanner(System.in);
  6         int year = 0;
  7         int month = 0;
  8         int day = 0;
  9 
 10         int choice = input.nextInt();
 11 
 12         if (choice == 1)  // test getNextNDays method
 13             int m = 0;
 14             year = Integer.parseInt(input.next());
 15             month = Integer.parseInt(input.next());
 16             day = Integer.parseInt(input.next());
 17 
 18             DateUtil date = new DateUtil(day, month, year);
 19 
 20             if (!date.checkInputValidity()) 
 21                 System.out.println("Wrong Format");
 22                 System.exit(0);
 23             
 24 
 25             m = input.nextInt();
 26 
 27             if (m < 0) 
 28                 System.out.println("Wrong Format");
 29                 System.exit(0);
 30             
 31 
 32             System.out.println(date.getNextNDays(m).showDate());
 33          else if (choice == 2)  // test getPreviousNDays method
 34             int n = 0;
 35             year = Integer.parseInt(input.next());
 36             month = Integer.parseInt(input.next());
 37             day = Integer.parseInt(input.next());
 38 
 39             DateUtil date = new DateUtil(day, month, year);
 40 
 41             if (!date.checkInputValidity()) 
 42                 System.out.println("Wrong Format");
 43                 System.exit(0);
 44             
 45 
 46             n = input.nextInt();
 47 
 48             if (n < 0) 
 49                 System.out.println("Wrong Format");
 50                 System.exit(0);
 51             
 52 
 53             System.out.println(date.getPreviousNDays(n).showDate());
 54          else if (choice == 3)     //test getDaysofDates method
 55             year = Integer.parseInt(input.next());
 56             month = Integer.parseInt(input.next());
 57             day = Integer.parseInt(input.next());
 58 
 59             int anotherYear = Integer.parseInt(input.next());
 60             int anotherMonth = Integer.parseInt(input.next());
 61             int anotherDay = Integer.parseInt(input.next());
 62 
 63             DateUtil fromDate = new DateUtil(day, month, year);
 64             DateUtil toDate = new DateUtil(anotherDay, anotherMonth, anotherYear);
 65 
 66             if (fromDate.checkInputValidity() && toDate.checkInputValidity()) 
 67                 System.out.println(fromDate.getDaysofDates(toDate));
 68              else 
 69                 System.out.println("Wrong Format");
 70                 System.exit(0);
 71             
 72         
 73         else
 74             System.out.println("Wrong Format");
 75             System.exit(0);
 76         
 77     
 78 
 79 class DateUtil 
 80     private Day day = new Day();
 81 
 82     DateUtil() 
 83 
 84     
 85 
 86     DateUtil(int d, int m, int y) 
 87         day.setValue(d);
 88         day.getMonth().setValue(m);
 89         day.getMonth().getYear().setValue(y);
 90     
 91 
 92     Day getDay() 
 93         return day;
 94     
 95 
 96     void setDay(Day d) 
 97         day = d;
 98     
 99 
100     public boolean checkInputValidity() 
101         if (day.getMonth().getYear().validate()) 
102             if (day.getMonth().validate()) 
103                 if (day.validate()) 
104                     return true;
105                  else return false;
106              else return false;
107          else return false;
108     
109 
110     public DateUtil getNextNDays(int m) 
111         int i;
112         long sum = 0;
113         long sum1 = 0;
114         long sum2 = 0;
115         long sum3 = 0;
116         long sum4 = 0;
117         long n = (long) m;
118         DateUtil date1 = new DateUtil();
119         if (day.getMonth().getYear().isLeapYear()) 
120             day.mon_maxnum[1] = 29;
121             for (i = 0; i < day.getMonth().getValue() - 1; i++) 
122                 sum1 += day.mon_maxnum[i];
123             
124             sum = sum1 + day.getValue();
125             i = 0;
126             if (sum + n <= 366) 
127                 while (sum2 + day.mon_maxnum[i] < sum + n) 
128                     sum2 += day.mon_maxnum[i];
129                     i++;
130                 
131                 date1.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
132                 date1.day.getMonth().setValue(i + 1);
133                 date1.day.setValue((int) (sum + n - sum2));
134              else 
135                 while (sum4 < sum + n) 
136                     if (day.getMonth().getYear().isLeapYear()) 
137                         sum3 += 366;
138                         day.getMonth().getYear().yearIncrement();
139                         if (day.getMonth().getYear().isLeapYear()) 
140                             sum4 = sum3 + 366;
141                          else sum4 = sum3 + 365;
142                         day.getMonth().getYear().yearReduction();
143                      else 
144                         sum3 += 365;
145                         day.getMonth().getYear().yearIncrement();
146                         if (day.getMonth().getYear().isLeapYear()) 
147                             sum4 = sum3 + 366;
148                          else sum4 = sum3 + 365;
149                         day.getMonth().getYear().yearReduction();
150                     
151                     day.getMonth().getYear().yearIncrement();
152                 
153                 i = 0;
154                 sum2 = 0;
155                 if (day.getMonth().getYear().isLeapYear()) day.mon_maxnum[2] = 29;
156                 else day.mon_maxnum[2] = 28;
157                 while ((sum2 + day.mon_maxnum[i]) < (sum + n - sum3)) 
158                     sum2 += day.mon_maxnum[i];
159                     i++;
160                 
161                 date1.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
162                 date1.day.getMonth().setValue(i + 1);
163                 date1.day.setValue((int) (sum + n - sum3 - sum2));
164             
165          else 
166             for (i = 0; i < day.getMonth().getValue() - 1; i++) 
167                 sum1 += day.mon_maxnum[i];
168             
169             sum = sum1 + day.getValue();
170             i = 0;
171             if (sum + n <= 365) 
172                 while (sum2 + day.mon_maxnum[i] < sum + n) 
173                     sum2 += day.mon_maxnum[i];
174                     i++;
175                 
176                 date1.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
177                 date1.day.getMonth().setValue(i + 1);
178                 date1.day.setValue((int) (sum + n - sum2));
179              else 
180                 while (sum4 < sum + n) 
181                     if (day.getMonth().getYear().isLeapYear()) 
182                         sum3 += 366;
183                         day.getMonth().getYear().yearIncrement();
184                         if (day.getMonth().getYear().isLeapYear()) 
185                             sum4 = sum3 + 366;
186                          else sum4 = sum3 + 365;
187                         day.getMonth().getYear().yearReduction();
188                      else 
189                         sum3 += 365;
190                         day.getMonth().getYear().yearIncrement();
191                         if (day.getMonth().getYear().isLeapYear()) 
192                             sum4 = sum3 + 366;
193                          else sum4 = sum3 + 365;
194                         day.getMonth().getYear().yearReduction();
195                     
196                     day.getMonth().getYear().yearIncrement();
197                 
198                 i = 0;
199                 sum2 = 0;
200                 if (day.getMonth().getYear().isLeapYear()) day.mon_maxnum[1] = 29;
201                 else day.mon_maxnum[1] = 28;
202                 while ((sum2 + day.mon_maxnum[i]) < (sum + n - sum3)) 
203                     sum2 += day.mon_maxnum[i];
204                     i++;
205                 
206                 date1.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
207                 date1.day.getMonth().setValue(i + 1);
208                 date1.day.setValue((int) (sum + n - sum3 - sum2));
209             
210         
211         return date1;
212     
213 
214     public DateUtil getPreviousNDays(int m) 
215         int i;
216         long sum = 0;
217         long sum1 = 0;
218         long sum2 = 0;
219         long sum3 = 0;
220         long n = (long) m;
221         DateUtil date2 = new DateUtil();
222         if (day.getMonth().getYear().isLeapYear())
223             day.mon_maxnum[1] = 29;
224         else day.mon_maxnum[1] = 28;
225             for (i = 0; i < day.getMonth().getValue() - 1; i++) 
226                 sum1 += day.mon_maxnum[i];
227             
228             sum = sum1 + day.getValue();
229             i = 0;
230             if (n < sum) 
231                 while ((sum2 + day.mon_maxnum[i]) < (sum - n)) 
232                     sum2 += day.mon_maxnum[i];
233                     i++;
234                 
235                 date2.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
236                 date2.day.getMonth().setValue(i + 1);
237                 date2.day.setValue((int) (sum - n - sum2));
238             
239             else 
240                 while (sum3 <= (n - sum)) 
241                     day.getMonth().getYear().yearReduction();
242                     if (day.getMonth().getYear().isLeapYear()) sum3 += 366;
243                     else sum3 += 365;
244                 
245                 i = 0;
246                 sum2 = 0;
247                 if (day.getMonth().getYear().isLeapYear()) day.mon_maxnum[1] = 29;
248                 else day.mon_maxnum[1] = 28;
249                 while ((sum2 + day.mon_maxnum[i]) < (sum3 - n + sum)) 
250                     sum2 += day.mon_maxnum[i];
251                     i++;
252                 
253                 date2.day.getMonth().getYear().setValue(day.getMonth().getYear().getValue());
254                 date2.day.getMonth().setValue(i + 1);
255                 date2.day.setValue((int) (sum3 - n + sum - sum2));
256             
257             return date2;
258         
259 
260     public int getDaysofDates(DateUtil date) 
261         int i, j, k;
262         int sum0 = 0;
263         int sum = 0;
264         int sum1 = 0;
265         int sum2 = 0;
266         int sum3 = 0;
267         int sum4 = 0;
268         if (day.getMonth().getYear().isLeapYear())
269             day.mon_maxnum[1] = 29;
270         else day.mon_maxnum[1]=28;
271             for (i = 0; i < day.getMonth().getValue() - 1; i++) 
272                 sum1 += day.mon_maxnum[i];
273             
274             sum0 = sum1 + day.getValue();
275             if (date.getDay().getMonth().getYear().isLeapYear()) date.getDay().mon_maxnum[1] = 29;
276             else date.getDay().mon_maxnum[1] = 28;
277             for (j = 0; j < date.getDay().getMonth().getValue() - 1; j++) 
278                 sum2 += date.getDay().mon_maxnum[j];
279             
280             sum = sum2 + date.getDay().getValue();
281             if (equalTwoDates(date)) return 0;
282             else 
283                 Day day1 = new Day();
284                 if (compareDates(date)) 
285                     if (day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) return (sum - sum0);
286                     else 
287                         for (k = (day.getMonth().getYear().getValue() + 1); k < date.getDay().getMonth().getYear().getValue(); k++) 
288                             day1.getMonth().getYear().setValue(k);
289                             if (day1.getMonth().getYear().isLeapYear()) sum3 += 366;
290                             else sum3 += 365;
291                         
292                         if (day.getMonth().getYear().isLeapYear()) return (sum3 + 366 - sum0 + sum);
293                         else return (sum3 + 365 - sum0 + sum);
294                     
295                  else 
296                     if (day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) return (sum0 - sum);
297                     else 
298                         for (k = (date.getDay().getMonth().getYear().getValue() + 1); k < day.getMonth().getYear().getValue(); k++) 
299                             day1.getMonth().getYear().setValue(k);
300                             if (day1.getMonth().getYear().isLeapYear()) sum4 += 366;
301                             else sum4 += 365;
302                         
303                         if (date.getDay().getMonth().getYear().isLeapYear()) return (sum4 + 366 - sum + sum0);
304                         else return (sum4 + 365 - sum + sum0);
305                     
306                 
307             
308         
309 
310      public boolean compareDates(DateUtil date)
311             if(day.getMonth().getYear().getValue()<date.getDay().getMonth().getYear().getValue()) return true;
312             else if(day.getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue())
313                 if(day.getMonth().getValue()<date.getDay().getMonth().getValue()) return true;
314                 else if(day.getMonth().getValue()==date.getDay().getMonth().getValue())
315                     if(day.getValue()<date.getDay().getValue()) return true;
316                     return false;
317                 
318                 return false;
319             
320             return false;
321         
322         public boolean equalTwoDates(DateUtil date)
323             if(day.getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&day.getMonth().getValue()==date.getDay().getMonth().getValue()&&day.getValue()==date.getDay().getValue()) return true;
324             else return false;
325         
326 
327             public String showDate () 
328                 String s = day.getMonth().getYear().getValue() + "-" + day.getMonth().getValue() + "-" + day.getValue();
329                 return s;
330             
331 
332 class Day
333     private int value;
334     private Month month = new Month();
335     int[] mon_maxnum=31,28,31,30,31,30,31,31,30,31,30,31;
336     Day()
337 
338     
339 
340     Day(int yearValue,int monthValue,int dayValue)
341         month.setValue(monthValue);
342         month.getYear().setValue(yearValue);
343     
344 
345     int getValue()
346         return value;
347     
348 
349     void setValue(int value)
350         this.value=value;
351     
352 
353     Month getMonth()
354         return month;
355     
356 
357     void setMonth(Month value)
358         month=value;
359     
360 
361     void resetMin()
362         value=1;
363     
364 
365     void resetMax()
366         if(month.getYear().isLeapYear())
367             mon_maxnum[1]=29;
368         
369         value=mon_maxnum[value-1];
370     
371 
372     boolean validate()
373         if(month.getYear().isLeapYear())
374             mon_maxnum[1]=29;
375         
376         if(value>=1&&value<=mon_maxnum[month.getValue()-1])
377             return true;
378         
379         else return false;
380     
381 
382     void dayIncrement()
383         value+=1;
384     
385 
386     void dayReduction()
387         value-=1;
388     
389 
390 
391 class Month
392     private int value;
393     private Year year = new Year();
394 
395     Month()
396 
397     
398 
399     Month(int yearValue,int monthValue)
400         value = monthValue;
401         year.setValue(yearValue);
402     
403 
404     int getValue()
405         return value;
406     
407 
408     void setValue(int value)
409         this.value=value;
410     
411 
412     Year getYear()
413         return year;
414     
415 
416     void setYear(Year year)
417         this.year=year;
418     
419 
420     void resetMin()
421         value=1;
422     
423 
424     void resetMax()
425         value=12;
426     
427 
428     boolean validate()
429         if(value>=1&&value<=12)
430             return true;
431         
432         else return false;
433     
434 
435     void monthIncrement()
436         value+=1;
437     
438 
439     void monthReduction()
440         value-=1;
441     
442 
443 
444 class Year
445     private int value;
446 
447     Year()
448 
449     
450 
451     Year(int value)
452         this.value=value;
453     
454 
455     int getValue()
456         return value;
457     
458 
459     void setValue(int value)
460         this.value=value;
461     
462 
463     boolean isLeapYear()
464         if

团队作业6——展示博客(alpha阶段)

1· 团队成员的简介和个人博客地址,团队的源码仓库地址。

  • 苏叶潇(队长) 201521123114

    • 与众不同,擅长软件测试,对编程望而却步。
  • 李晓冬 201521123113

    • 沉稳,会一点java,c,对编程兴趣不大。
  • 龚厦彬 201521123115

    • 天马行空,擅长沟通,编程兴趣开发中。
  • 郭余晟 201521123116

    • 爱笑爱思考,对产品测试和市场推广都浓厚兴趣。
  • 王妍 201521123100

    • 性格开朗,各个阶段的测试也是考验细心。
  • 柏清晔 201521123101

    • 性格开朗,界面设计的过程很有趣。
  • 博客地址

2· 团队各成员贡献

Name Contribute
李晓冬 24%
苏叶潇 19%
龚厦彬 19%
郭余晟 10%
王妍 14%
柏清晔 14%

3· 团队8天 Alpha 冲刺站立会议博客链接汇总(集合贴)

4· 团队可以做一个 MVP 版本, 只要核心的功能 (例如用户注册,找回密码这些非核心功能可以不用做)。也可以允许团队把快速原型的方案演示给潜在用户看, 让他们提反馈意见。

主界面:

账单界面:

记账界面:

充值界面:

5· 我们要做软件工程,那就要有一点工程的样子:

  • (1)· 团队项目的目标,预期的典型用户,预期的功能描述,预期的用户数量在哪里?

    • 我们所预期的客户主要是高校的在读生,在微信小程序上建立一个宿舍账号,宿舍成员加入账号,舍长作为主要管理人员,在小程序登记舍费收支情况以及舍费开销明细,实时账单发送消息于每个成员。我们可以在开学初期学生使用高峰时段,设置记账提醒,简单的几次点击就能完成记账的全部操作。在用户使用的同时,我们也会采集用户消费的对象,对于高频率消费对象,用户不用反复输入。预期用户数量大约在30~40人。
  • (2)· 团队的产品如何满足了用户的需求?

    • 通过微信这个平台,用户无需下载软件,在微信小程序记录舍费收支情况以及舍费开销明细,随后生成宿舍流水。以此作为宿舍的电子账单,界面简洁一目了然。
  • (3)· 团队在Alpha阶段已完成了哪些目标?

    • 基础记账功能、成员添加、宿舍成员名单
  • (4)· 团队的成员如何分工协作的?有什么经验教训?

Name Work Experience
苏叶潇 前端开发、测试 码农三号,开发过程也是一个修炼过程,换个角度想想,下一行代码就出来了
李晓冬 后端开发 码农一号,过程不简单,微信小程序一步步的构建很带劲,有问题就马上讨论、解决,晚了就拖出事
龚厦彬 后端开发 码农二号,开发的过程是学习的过程这一点百分百真实,每完成一个小的模块就回头看看,指不定有新发现
郭余晟 测试 测试员一号,在测试的过程就是看到太阳升起,暖暖的。测试中,思考还可不可以更加便捷化
王妍 PM 博客园写手一号,记录团队、团结团队,作为各个成员的辅助,扎扎实实的完成每个任务
柏清晔 PM 博客园写手二号,在博客园的时间已经远超过我刷微博的时间,统筹规划团队,把任务细化存档
  • (5)· 团队是如何进行项目管理的?

  • (6)· 团队如何平衡 时间/质量/资源 争取如期完成任务的?

    • 首先我们做到各有所长、各有所职,任务合理分配。其中不免也会出现无法按时完成的情况,在不影响大体的基础上,这时候我们细化未完成任务,再次全组分配,团队效益和个人效益紧紧挂钩。

6· 团队项目的实际进展,发布的功能。说明在项目管理中,scrum的燃尽图是如何真实反映项目的状态的?或者燃尽图美化了燃尽态?

  • 我们前期比较缓慢坡度较小,大家处于懵懵懂懂都处在摸索阶段,有较多学习时间,功能实现上的进度较为缓慢。后期我们慢慢找到了状态,但由于各种原因耽误了项目的进度,因为我们前期有所耽误所以我们还是要赶进度,坡度也是迅速加大。故我们的燃尽图较为真实,反应团队的进展。

7· 在Beta阶段需要改进哪些方面?请给出下一阶段的展望。

在这一阶段,我们完成了记账的基础功能,界面较为简单,但账单的计算和舍费充值还未结合在一起,以及数据存储的一些问题还未解决;
下一阶段,希望能实现完善舍费记账的计算显示功能,以及存储方式的改善,修改账单的权限等,向更合理化的方向开发。

以上是关于Java博客作业的主要内容,如果未能解决你的问题,请参考以下文章

团队作业8--展示博客

团队作业6——展示博客(Alpha版本)

第三次博客作业

团队作业6——展示博客(alpha阶段)

团队作业6——展示博客(Alpha版本)

❤️响应式性感美女模特博客网站模板❤️(HTML+CSS+JavaScript-前端大作业)