Ir ao conteúdo
  • Cadastre-se
Visitante

Calendário usando apenas for e if

Recommended Posts

Visitante

Salve galera.

 

Preciso de ajuda rpara completar um programa que mostra o calendário anual.

Estou tend problemas para colocar 3 meses por linha e alinhas os dias do mês no correto dia da semana.

Segue o codigo que tenho até agora...

 

 

public class Calendar {
    int year;
    String month;
    int days;
    
    public Calendar(){
        this.year = year;
    }
    public void isLeapYear(int y){
        year = y;
        if (y %4 ==0){
            if(y%100 == 0 && y%400 != 0){
                System.out.println(y+ " is not a Leap Year");
            }else{
                System.out.println(y+ " is a Leap Year");                             
            }          
        }else{
            System.out.println(y+ " is not a Leap Year");
        }
    }
    public void displayCalendar(int y){
        year = y;
         for (int i=1; i<=12; i++){
            if (i ==1){
                month = "January";
            }else if (i==2){
                month = "February";
            }else if (i==3){
                month = "March";
            }else if (i==4){
                month = "April";
            } else if (i==5){
                month = "May";
            }else if (i==6){
                month = "June";
            }else if (i==7){
                month = "July";
            }else if (i==8){
                month = "August";
            }else if (i==9){
                month = "September";
            }else if (i==10){
                month = "October";
            }else if (i==11){
                month = "November";
            }else if (i==12){
                month = "December";
            }
         
            System.out.println("");
            System.out.println("");
            System.out.println("       " + month);
            System.out.println("Su Mo Tu We Th Fr Sa");
            
            if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
                days = 31;
            }else if (i == 2){
                if (y %4 ==0){
                    if(y%100 == 0 && y%400 != 0){
                        days = 28;
                }else{
                    days = 29;                             
                }          
                }else{
                days = 28;
                }
            }else{
                days = 30;
            }
                 
                     
            int count = 0;
            for (int j = 1; j <= days; j++){
                if (j <=9){
                    System.out.print(" "+j+ " ");
                }else{
                    System.out.print(j+ " ");
                }
                count++;
                if (count == 7){
                    System.out.println("");
                    count = 0;
                }
            }
         }
         System.out.println("");
    }
   
    
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha ... geralmente eu não faço isso ... mas caraca, que desafio legal de se fazer esse ... kkkkkkk ... lembra-me das Olimpiadas de Programação .... pois bem ... eu alterei BASTANTE o código, mas se prestar atenção, seu código está bem presente ainda ...

 

public class Calendar {

	private static final int TOTAL_POR_LINHA = 3;
	private final String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
	
	//Não é necessário construtor, pois o ano é passado sempre como parâmetro

	//Se o método apenas checa se o ano é Bissexto, não há necessidade de setar o atributo
	//por ser um método de verificação, o ideal é que ele retorne um booleano
	public boolean isLeapYear(int y) {
		if (y % 4 == 0) {
			if (y % 100 == 0 && y % 400 != 0) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	}

	
	public void displayCalendar(int year) {
		String[][] calendar = new String[12][7];
		//monta uma matriz com as informações
		for (int month = 0; month < 12; month ++) {
			calendar[month] = getCalendar(month, year);
		}
		//Faz o laço de repetição com saltos de acordo com o total de meses por linha
		for (int i=0; i<12; i=i+TOTAL_POR_LINHA) {
			//Imprime os nomes de acordo com a quantidade por linha 
			for (int j=0; j<TOTAL_POR_LINHA; j++) {
				//Executa apenas se o resultado de i+j < 12;
				if (i+j < 12) {
					System.out.print(calendar[i+j][0] + "\t");
				}
			}
			System.out.println("");
			//Imprime todas as outras linhas do calendario 
			for (int j=1; j<7; j++) {
				//Imprime de acordo com a quantidade por linha
				for (int k=0; k<TOTAL_POR_LINHA; k++) {
					//Executa apenas se o resultado de i+j < 12;
					if (i+k < 12) {
						System.out.print(calendar[i+k][j] + "\t");
					}
				}
				System.out.println("");
			}
			System.out.println("");
		}
		System.out.println("");
	}

	private String[] getCalendar(int month, int year) {
		String[] lines = new String[8];
		lines[0] = "       " + months[month];
		lines[1] = "Su Mo Tu We Th Fr Sa";
		int days = 0;
		int position = getDayOfWeek(1, month, year); 
		//Alterado para ficar de acordo com o array
		if (month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11) {
			days = 31;
		} else if (month == 1) {
			//Já existia um método que calculava isso
			//Alterei apenas para reutilizálo
			if (isLeapYear(year)) {
				days = 28;
			} else {
				days = 29;
			}
		} else {
			days = 30;
		}

		int line = 2;
		lines[line] = "";
		for (int i = 1; i <= days; i++) {
			//Deixa os espaços em branco no começo do mes
			if (i == 1){
				for (int k = 0; k < position; k++) {
					lines[line] += "   ";
				}
			}
			if (i <= 9) {
				lines[line] += " " + i + " ";
			} else {
				lines[line] += i + " ";
			}
			position++;
			if (position == 7) {
				position = 0;
				//faz o salto de linha e inicializa o objeto
				if (line < 7) {
					lines[++line] = "";
				}
			}
		}
		//Completa com espaços o nome do mes
		for (int i = lines[0].length(); i<20; i++) {
			lines[0] += " ";
		}
		//Completa com espaços caso o mes termine antes de sábado
		for (int i = lines[line].length(); i<20; i++) {
			lines[line] += " ";
		}

		return lines;
	}
	
	//Recupera o dia da semana de acordo com dia, mes e ano
	//fonte: http://pt.wikihow.com/Calcular-o-Dia-da-Semana-de-uma-Data-Qualquer
	private int getDayOfWeek(int day, int month, int year) {
		int[] month_table = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
		int[] year_table = {0, 5, 3, 1};
		int[] week_table = {6, 0, 1, 2, 3, 4, 5};
		int numberDay = day + month_table[month];
		numberDay = numberDay % 7;
		int yearTwoDigits = year % 100;
		int numberYear = yearTwoDigits % 28;
		numberYear += (int) yearTwoDigits / 4;
		int i = 0;
		if (year >= 1700 && year < 1800) {
			i = 5;
		}else if (year >= 1800 && year < 1900) {
			i = 3;
		}else if (year >= 1900 && year < 2000) {
			i = 1;
		}
		numberYear += year_table[i];
		if (month < 2 && isLeapYear(year)) {
			numberYear--;
		}
		int result = (numberDay + numberYear) % 7;
		return week_table[result];
	}
}

Esse não era um trabalho muito fácil não ... mas o importante ... Tente remontar esse código mais pra frente usando a biblioteca do Java Calendar ... apenas pra ver se entendeu a lógica ... 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×