2015-08-14 65 views
-6

我最近编写了一个程序,计算1900年后第十三个星期五的数量。代码非常好,它的工作原理;然而,有些部分是非常冗余的。无论如何,我可以简化它。如何简化我的代码?

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 

public class friday { 

    public static void main(String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new FileReader("friday.in")); 
     PrintWriter pw= new PrintWriter(new FileWriter("friday.out")); 
     int years = Integer.parseInt(br.readLine()); 
     int saturday = 0; 
     int sunday = 0; 
     int monday = 0; 
     int tuesday = 0; 
     int wedensday = 0; 
     int thursday = 0; 
     int friday = 0; 
     int month = 1; 
     int day = 1; 
     int months = 12*years; 
     int test = 0; 
     int year = 1900; 

     for(int i = 0; i < months; i++) 
     { 
      if ((year % 4 == 0) && year % 100 != 0) 
      { 
       test = 1; 
      } 
      else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 
      { 
       test = 1; 
      } 
      else 
      { 
       test = 0; 
      } 

     if(month == 1) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 2) 
     { 
      if(test == 1) 
      { 
       if(day == 1) 
       { 
        saturday++; 
       } 
       if(day == 2) 
       { 
        sunday++; 
       } 
       if(day == 3) 
       { 
        monday++; 
       } 
       if(day == 4) 
       { 
        tuesday++; 
       } 
       if(day == 5) 
       { 
        wedensday++; 
       } 
       if(day == 6) 
       { 
        thursday++; 
       } 
       if(day == 0) 
       { 
        friday++; 
       } 
       //leapyear = 1; 
       day = (day + 1) % 7; 
      } 
      else 
      { 
       if(day == 1) 
       { 
        saturday++; 
       } 
       if(day == 2) 
       { 
        sunday++; 
       } 
       if(day == 3) 
       { 
        monday++; 
       } 
       if(day == 4) 
       { 
        tuesday++; 
       } 
       if(day == 5) 
       { 
        wedensday++; 
       } 
       if(day == 6) 
       { 
        thursday++; 
       } 
       if(day == 0) 
       { 
        friday++; 
       } 
       day = (day + 0) % 7; 
       //leapyear++; 
      } 
     } 
     if(month == 3) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 4) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 2) % 7; 
     } 
     if(month == 5) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 6) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 2) % 7; 
     } 
     if(month == 7) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 8) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 9) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 2) % 7; 
     } 
     if(month == 10) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
     } 
     if(month == 11) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 2) % 7; 
     } 
     if(month == 0) 
     { 
      if(day == 1) 
      { 
       saturday++; 
      } 
      if(day == 2) 
      { 
       sunday++; 
      } 
      if(day == 3) 
      { 
       monday++; 
      } 
      if(day == 4) 
      { 
       tuesday++; 
      } 
      if(day == 5) 
      { 
       wedensday++; 
      } 
      if(day == 6) 
      { 
       thursday++; 
      } 
      if(day == 0) 
      { 
       friday++; 
      } 
      day = (day + 3) % 7; 
      year++; 
     } 

     month = (month + 1) % 12; 


    } 
     pw.println(saturday + " " + sunday + " " + monday + " " + tuesday + " " + wedensday+ " " + thursday + " " + friday); 
     pw.close(); 
     //System.out.println(saturday + " " + sunday + " " + monday + " " + tuesday + " " + wedensday+ " " + thursday + " " + friday); 
    } 
} 
+5

如果您有功能代码,http://www.codereview.stackexchange.com是更适合此问题的地方。 – CubeJockey

+0

你知道数组吗?有些东西告诉我它可能会有用。或枚举 – Dici

+0

**来自Parttimereaper的评论:** 那么我可能会使用switch语句来提高可读性,或者使用localdate对象并在每个月将它设置为13之后继续滚动,然后检查它是否为星期五 – Dici

回答

1

,极大地提高你的代码的最简单方法是使用数组。此外,您必须了解您的if语句的逻辑能够压缩它们。为了便于阅读,请不要使用7当你想说days in a week,不要说12当你想说years in a month用清晰的名称创建常量,并在需要它们的任何地方使用它们。

以下是重构第一步的开始。检查这个简化的代码仍然有效,并使用它来进一步改进(更好的名称,更明确的逻辑incrementForMonth ...)。

public class friday { 
    private static final int DAYS_IN_WEEK = 7; 
    private static final int MONTHS_IN_YEAR = 12; 

    private static void updateDays(int[] days, int day) { 
     checkIsInRange(0, year, DAYS_IN_WEEK); 
     days[(day + 4) % DAYS_IN_WEEK]++; 
    } 

    private static boolean isLeapYear(int year) { 
     checkIsInRange(0, year, MONTHS_IN_YEAR); 
     return (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0); 
    } 

    private static void checkIsInRange(int inclusiveLowerBound, int toTest, int exclusiveUpperBound) { 
     if (toTest < inclusiveLowerBound || exclusiveUpperBound <= toTest) throw new IllegalArgumentException(toTest + " not in [" + inclusiveLowerBound + ", " + exclusiveUpperBound + "]");     
    } 

    public static void main(String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new FileReader("friday.in")); 
     PrintWriter pw= new PrintWriter(new FileWriter("friday.out")); 
     int years = Integer.parseInt(br.readLine()); 

     int month = 1; 
     int day = 1; 
     int months = MONTHS_IN_YEAR*years; 
     int test = 0; 
     int year = 1900; 

     int days = int[DAYS_IN_WEEK]; 
     int[] incrementForMonth = { 3, 3, 1, 3, 2, 3, 2, 3, 3, 2, 3, 2 }; 

     for(int i = 0; i < months; i++) { 
      test = isLeapYear(year) ? 1 : 0; 

      updateDays(days, day); 
      if (month != 2 || test == 1) { 
       day = (day + incrementForMonth[month]) % DAYS_IN_WEEK; 
      } 
      if (month == 0) { 
       year++; 
      } 
     } 

     month = (month + 1) % MONTHS_IN_YEAR; 
    } 
    pw.println(saturday + " " + sunday + " " + monday + " " + tuesday + " " + wedensday+ " " + thursday + " " + friday); 
    pw.close(); 
} 
+0

非常感谢!我非常感谢它:) –

0

呃,就其中之一而言,你的代码并没有达到你所说的目标。无论如何,简短的答案是使用Calendar对象。

如果您只想计算周五,你说13号的数量,这里是代码:

public static int countFriday13(int years) { 
    Calendar cal = Calendar.getInstance(); 
    cal.clear(); 
    cal.set(1900, Calendar.JANUARY, 13); 
    int count = 0; 
    for (int i = 0; i < years * 12; i++) { 
     if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) 
      count++; 
     cal.add(Calendar.MONTH, 1); 
    } 
    return count; 
} 
+1

我认为这类代码的重点是要自己做事情,而不是使用你没有写的强大类。他需要学习许多很好的做法,这比使用库代码更重要 – Dici

+0

@Dici在问题中没有什么可以说他不应该使用Calendar。代码是非常写的;日历正是他应该学习的内容。研究和编排。 – duffymo

+1

@duffymo代码是非常可写的,所以他应该学习如何使用数组和方法,而不是高级对象。你们有多奇怪的逻辑。在他的下一个节目中,他可能不会有一个魔术 - 图书馆 - 做 - 完全是他想要的,他不会知道如何自己编写一个精美的代码**。使用库编写代码可能会更容易,但它仅供有经验的程序员使用 – Dici