Печать календаря 3х4 на Java

Буду признателен за любые советы или рекомендации. Я должен напечатать Календарь лет на Яве, учитывая год и день, на который приходится 1 января. Я могу напечатать календарь, но проблема в том, что календарь должен быть в формате 3x4 (январь. Февраль март бок о бок, затем в следующей "строке" апрель, май июнь и т. Д. Это мой код на момент, который печатает календарь сверху вниз. Я просто не знаю, с чего начать. Я могу использовать только структуры выбора, циклы и методы.

import javax.swing.JOptionPane;
public class Assignment4DONOTCHANGE 
{
  //get headers set up to be printed in main
  public static void printHeader(int month)
  {
    switch (month) 
    {
      case 1: 
        System.out.println("                  January"); break;
      case 2: 
        System.out.println("                  February"); break;
      case 3: 
        System.out.println("                  March"); break;
      case 4: 
        System.out.println("                  April"); break;
      case 5: 
        System.out.println("                  May"); break;
      case 6: 
        System.out.println("                  June"); break;
      case 7: 
        System.out.println("                  July"); break;
      case 8: 
        System.out.println("                  August"); break;
      case 9: 
        System.out.println("                  September"); break;
      case 10: 
        System.out.println("                  October"); break;
      case 11: 
        System.out.println("                  November"); break;
      case 12: 
        System.out.println("                  December"); break;
    }
    // Display header and days of the week 
    System.out.println("---------------------------------------------");
    System.out.println(" Su     M      Tu     W      Th     F      S");
    System.out.println();
   }
   //compute last day of each month
   public static int lastDayM(int month, int year)
  {
    //reset each iteration
    int lastDay = 0;
    if ( month == 1 || month == 3  || month == 5 || month == 7 || month == 8 || month == 10 ||month == 12)
  lastDay = lastDay + 31;
else 
{
  if (month == 4 || month == 6 || month == 9 || month == 11)
    lastDay = lastDay + 30;
  else 
  { // Test for leap year
    if (year % 4 == 0)
      lastDay = lastDay + 29;
    else
      lastDay = lastDay + 28;
  }
}
  return lastDay;
  }
  public static void main(String args[]) 
  {
//declaration
String yearstr, daystr;
int year, day, lastDay;

// Prompt the user to enter the year and first day of the year
yearstr = JOptionPane.showInputDialog("Enter a year: ");
year = Integer.parseInt(yearstr);
daystr = JOptionPane.showInputDialog("Enter a day for Jan.1: 0-S, 1-M, 2-Tu, etc.");
day = Integer.parseInt(daystr);

System.out.println("                   "+year);
int month;
for (month = 1; month <= 12; month++)
{
  printHeader(month);

  // Compute beginning day of the week
  day = day % 7;
  for (int b = 1; b <= day * 7; b++) 
  {
    System.out.print(" ");
  }

  // Compute last day of present month
  lastDay = lastDayM(month, year);

  // Display calender for current month
  int d;
  for (d = 1; d <= lastDay; d++) 
  {
    // Add a black space before numbers less than 10
    if (d < 10) 
      System.out.print(" ");
    // Start new line after satuarday
    if (day % 7 == 6)
    {
      System.out.print(d+" ");
      System.out.println();
      System.out.println();
    }

    else 
    {
      System.out.print(d + "     ");

      // After last day of the month go to new line
      if (d == lastDay) 
        System.out.println();
    }
    day = day + 1; 
  }
  System.out.println();
}
System.exit(0);
  }
} 

2 ответа

Решение

Подумайте о том, что означает ваше ограничение (печать в сетке 3х4, без помощи формата причудливой строки): вы должны печатать по одной строке за раз. Это означает, что вы собираетесь напечатать первые три месяца, затем их строки заголовков и дни недели (для всех трех в одном ряду), а затем 4-5 строк пронумерованных дней, где каждая строка содержит одну неделю каждого из три месяца.

Учитывая вышесказанное, это действительно проблема разработки программы и разделения логики. Например, было бы неплохо, если бы функция могла принимать номер года, месяца и недели и возвращать строку, которую нужно напечатать за эту неделю. Например, в течение года, начиная с понедельника, вы бы хотели foo("January", 1, 20xx) возвращать " 1 2 3 4 5 6" а также foo("January", 2, 20xx) возвращать " 7 8 9 10 11 12 13" а такжеfoo("January", 5, 20xx) возвращать "28 29 30 31 "

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

Здесь важно тщательно продумать, что нужно разделить на отдельные функции. В этом случае вам нужна гибкость для получения одной "строки" (недели) дней из одного месяца, поэтому вам нужно включить ее в свою функцию.

Я думаю, что ключевым моментом является ваш случай переключения: он должен выглядеть так:

switch (month) 
    {
      case 1: 
        System.out.print("                  January"); break;
      case 2: 
        System.out.print("                  February"); break;
      case 3: 
        System.out.println("                  March"); break;
      case 4: 
        System.out.print("                  April"); break;
      case 5: 
        System.out.print("                  May"); break;
      case 6: 
        System.out.println("                  June"); break;
      case 7: 
        System.out.print("                  July"); break;
      case 8: 
        System.out.print("                  August"); break;
      case 9: 
        System.out.println("                  September"); break;
      case 10: 
        System.out.print("                  October"); break;
      case 11: 
        System.out.print("                  November"); break;
      case 12: 
        System.out.println("                  December"); break;
    }
Другие вопросы по тегам