2013-07-05 3 views
1

У меня есть это задание в конце месяца, и я уже сделан на полпути. Мы должны были использовать конгруэнцию Целлера, чтобы рассчитать день недели, когда 1-й приземлился. С этого момента (и учитывая високосные годы) вы должны распечатать календарь соответствующего года с использованием циклов. Учитель сказал, что это должна быть очень короткая программа, и мы не должны пытаться переборщить логику программы (в основном, не используйте кучу if else и loops за каждый месяц). У меня уже есть математические расчеты и високосный год часть вниз, но я не могу обернуть мою голову вокруг, как сделать это для работы петли по многим причинам:Java Использование цикла for для печати календаря (логическая справка)

  • Как бы я идти о факторинге в непечатаемых за каждый месяц? Как и сколько вложенных циклов мне понадобится?
  • Должен ли я писать разные циклы для Високосных лет, месяцев с 31 днями и месяцами с 30 днями и т. Д. Или все это можно обрабатывать с помощью 1 гигантской вложенной петли?

Например, я только начал писать от для цикла просто чтобы посмотреть, смогу ли я распечатать типичный календарь 31 дня без специального форматирования (непечатаемых, названия месяца, дня и т.д.). Здесь был мой первый тест при использовании для цикла:

for(int i = 1; i < 31; i++) 
    { 
     for(int j = 0; j < 7; j++) 
     { 


      System.out.print(i + "\t"); 
      i++; 
      if(j == 6){ 
       i--;} 

      if(i > 31) 
      { 
       break; 
      } 

     } 
     System.out.print("\n"); 
    } 

Что логику, используя его для нескольких месяцев и непечатаемых. Я приветствую всю помощь, но, пожалуйста, НЕ ДАЙТЕ МНЕ ИСТОЧНИК КОД. Я хочу, чтобы это было сделано с кодом, который я написал, и, как я уже сказал, это тоже задание, и я не буду учиться копированию и вставке кода. Просто бросьте мне кость о логике, которую мне нужно использовать. Я могу работать во всех других условностях для особых случаев. Спасибо, парни.

+0

+1 для поиска помощи и подсказок и желаний удовлетворения в желании завершить его самостоятельно! – MadProgrammer

ответ

0

Хорошо, вам нужно управлять чем-то, что варьируется между фиксированным набором значений, поэтому вам в основном нужен способ доступа к этим переменным данным из цикла.

Лучшим инструментом для полной проверки этой проблемы является, вероятно, массив .

Если вы храните внутри массива, например, продолжительность месяцев, вы сможете получить доступ к ним простым способом (через индекс), чтобы вам не понадобилась условная цепочка, вам просто понадобится индекс текущего месяца, например monthDurations[i] == 31.

Если вы хотите, чтобы структурировать все лучше, вы можете определить свой собственный класс Month или Day класс или что-то, что вам нужно следить за вопросами полиграфических (например, пробелы или имена), так что все будет легко инкапсулированные и обслуживаемой.

+0

Это похоже на то, что я думал (используя массив). Я просто не хотел его переутомлять, потому что мы еще не покрывали массивы. Я способен использовать их, мы просто не покрыли их еще в классе. Теперь, сказав это, мне нравится ваша идея использовать массив для продолжительности месяца. Позвольте мне поиграть с этим в течение нескольких минут, и я вернусь сюда и обновить вас, ребята. –

+0

У меня есть цикл for loop now to point, где он отпечатывает соответствующее количество дней для каждого месяца. Я еще не добавил названия месяца и дни недели, но теперь это будет легко добавить, когда у меня есть понимание. Теперь последнее, что мне нужно сделать, это найти алгоритм для вычисления пробелов и заставить его работать. То, как у меня настроено настроение, цикл запустит счетчик в 1, но начнет новую строку каждый раз, когда n% 7 = 0, но я уверен, что это не сработает с более практичными приложениями, где говорят, что неделя начинается с среда. Если это так, линия остановится на 4 (не 7). –

0

Я хотел бы написать функцию, чтобы отобразить один месяц с параметрами: DAYOFWEEK, NumberOfDays, [имя, firstDayOfWeek]

  • день недели - в какой день недели первый день месяца
  • NumberOfDays - количество дней в этом месяце

необязательные параметры Вы можете осуществить, если Вам нравится

  • имя - название месяца
  • firstDayOfWeek - некоторые календари используют воскресенья другое использование понедельника как первый день, если вам нравится иметь эту гибкость. Вы также можете реализовать это.

И логика проста. Вы можете сделать только один цикл, который будет итерации numberOfDays + dayOfWeek-1 раз. Внутри Вам просто нужно проверить на конец недели, чтобы сделать новые строки и отображать пустые пространства dayOfWeek-1 раз в первую неделю.

+0

Правильно, я не думал о том, чтобы на следующий месяц подобрать подходящий день. Позвольте мне немного поиграть, используя методы, которые вы предложили, и я скоро обновлю вас. Спасибо за ответ. –

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