2015-08-14 3 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

Ну, например, ваш код не делает то, что вы указали. Во всяком случае, короткий ответ заключается в использовании объекта .

Если вы хотите, чтобы подсчитать количество пятницу 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. В этом вопросе нет ничего, чтобы сказать, что он не должен использовать Календарь. Код ужасно написан; Календарь - именно то, что он должен изучать. Исследования и организация. – duffymo

+1

@duffymo код ужасно написан, поэтому он должен научиться использовать массивы и методы, а не объекты высокого уровня. Какая странная логика у вас есть. В своей следующей программе он, вероятно, не будет иметь магическую библиотеку-класс-делать-точно-что-он-хочет, и он не будет знать, как писать прекрасный код ** сам по себе **. Написание кода с библиотеками может быть проще, но он зарезервирован для опытных программистов – Dici

Смежные вопросы