Desenhar um calendário em java onde o usuário informar a quantidade de dias do mês e em qual dia da semana começa o primeiro dia do mês.

20/01/2020

8

Meus caros, boa noite!
Mais uma vez venho solicitar ajuda para uma atividade da faculdade.
O enunciado: Desenvolva um algoritmo que "desenhe" um calendário, como o abaixo, para um determinado mês, tendo como dados:
1. o número de dias do mês
2. qual o dia da semana correspondente ao primeiro dia do mês

Exemplo:
número de dias: 31
primeiro dia: terça-feira

---------------------------------------
D S T Q Q S S
1 2 3 4 5
.....
27 28 29 30 31
---------------------------------------
Pelo que entendi, não se trata de uma implementação de um calendário propriamente dito, com uso da Classe "Calendar", pois ainda não vimos esse tipo de assunto.
Seria algo que usaria somente condicionais/laços de repetição para, por exemplo, a partir da quantidade de dias de um mês "x" qualquer, inserir-se o dia da semana correspondente ao primeiro dia do citado mês e o programa correr a sequência dos dias da semana até o último dia do mês, mostrando o resultado na tela em forma de um desenho de calendário. Para ser honesto, embora tenha pesquisado bastante na internet e em algum material que tenho, não encontrei nada parecido.
Agradeço se alguém puder ajudar.
João Medeiros
Responder

Post mais votado

20/01/2020

Somente a título de curiosidade, a classe calendar não é mais utilizada, ela era complexa e tinha muitos bugs, então uma alternativa foi lançada no java 8, agora sobre seu problema:
Indo por partes, o que você precisa fazer?
*Armazenar a informação de quantidade de dias de cada mês
*Coletar as informações de dia, mês, ano e dia da semana
*Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo
*Descobrir se a data digitada pelo usuário é válida
*Descobrir qual o dia da semana foi o dia 1 do mês, dessa forma basta iterar até o último dia do mês para formar o calendário
*Desenhar o calendário na tela

Aqui vão exemplos de código:

Armazenar a informação de quantidade de dias de cada mês:

int[] diasDoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


Coletar as informações de dia, mês, ano e dia da semana:

                System.out.println("Digite o dia do mês: ");
		int dia = scan.nextInt();
		System.out.println("Digite o mês do ano: ");
		int mes = scan.nextInt();
		System.out.println("Digite o ano: ");
		int ano = scan.nextInt();
		System.out.println("Digite o dia da semana(considere domingo = 1 e sábado = 7): ");
		int semana = scan.nextInt();


Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo:

                if(ano % 4 == 0){ //anos bissextos são sempre divisíves por 4, 2020 por exemplo, é bissexto
		    diasDoMes[1] = 29;
		}


Descobrir se a data digitada pelo usuário é válida:

                if(mes > 12 || mes < 1){
		    System.out.println("Data inválida");
		}else if(dia > diasDoMes[mes - 1] || dia < 1){
		     System.out.println("Data inválida");
		}else if(semana > 7 || semana < 1){
		     System.out.println("Data inválida");


Descobrir qual o dia da semana foi o dia 1 do mês:

                 for(int i = dia; i > 1; i--){
		    if(semana == 1){
		        semana = 7;
		    }else{
		        semana -= 1;
		    }
		}


Desenhar o calendário na tela:

Sou péssimo em desenhar coisas na tela.



Olá, Daniel!

O problema é algo mais simples... o professor não quer um calendário em si. Apenas que seja lido pelo teclado a quantidade de dias de um mês qualquer e bem como seja lido em qual dia da semana começa o dia 1 desse mês.
Só a saída no monitor é que deve ser em forma de um calendário.
Um exemplo: escolher um mês com 30 dias. O primeiro dia desse mês começa na quarta-feira... e daí mostrar esse resultado na tela em forma de calendário.
Grato,
João Medeiros


Ok, tudo bem, basta você printar na tela os dias da semana do calendário e depois na linha de baixo printar espaços vazios até que o próximo número que você digitar seja empurrado para a posição abaixo do dia da semana correspondente ao dia 1 do mês, em seguida basta fazer uma iteração simples para printar os dias do mês na tela, e durante a iteração adicionar um algoritmo para quebrar a linha caso o dia da semana seja o último dia, lembrando de utilizar o print ao invés do println nesse caso, pois o println sempre adicionará uma nova linha, enquanto que o print irá escrever tudo numa linha só, eu fiz um exemplo de código aqui, mas como eu disse ateriormente não sei desenhar na tela direito:

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    Scanner scan = new Scanner(System.in);
		System.out.println("Em qual dia da semana começa o mês?(considere domingo = 1 e sábado = 7)");
		int dia = scan.nextInt();
		System.out.println("Quantos dias tem o mês?");
		int dias = scan.nextInt();
		System.out.println("D S T Q Q S S");
		System.out.println("-------------");
		for(int i = 1; i < dia; i++){
		    System.out.print("  ");
		}
		for(int i = 1; i <= dias; i++){
		    System.out.print("|" + i);
		    if(dia == 7){
		        dia = 1;
		        System.out.print("\\n");
		    }else{
		        dia++;
		    }
		}
	}
}

Responder

Mais Posts

20/01/2020

João Medeiros

Meus caros, boa noite!
Mais uma vez venho solicitar ajuda para uma atividade da faculdade.
O enunciado: Desenvolva um algoritmo que "desenhe" um calendário, como o abaixo, para um determinado mês, tendo como dados:
1. o número de dias do mês
2. qual o dia da semana correspondente ao primeiro dia do mês

Exemplo:
número de dias: 31
primeiro dia: terça-feira

---------------------------------------
D S T Q Q S S
1 2 3 4 5
.....
27 28 29 30 31
---------------------------------------
Pelo que entendi, não se trata de uma implementação de um calendário propriamente dito, com uso da Classe "Calendar", pois ainda não vimos esse tipo de assunto.
Seria algo que usaria somente condicionais/laços de repetição para, por exemplo, a partir da quantidade de dias de um mês "x" qualquer, inserir-se o dia da semana correspondente ao primeiro dia do citado mês e o programa correr a sequência dos dias da semana até o último dia do mês, mostrando o resultado na tela em forma de um desenho de calendário. Para ser honesto, embora tenha pesquisado bastante na internet e em algum material que tenho, não encontrei nada parecido.
Agradeço se alguém puder ajudar.
João Medeiros


Eu comecei algo assim, mas sei que falta ajustar muita coisa:
import java.util.Scanner;

public class Tema6_2 {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);

int totalDias;
int diaUm;

System.out.println("Informe a quantidade de dias do mês: ");
totalDias = entrada.nextInt();

System.out.println("Informe o dia da semana correspondente ao primeiro dia do mês: ");
diaUm = entrada.nextInt();

int Dom = 0;
int Seg = 0;
int Ter = 0;
int Qua = 0;
int Qui = 0;
int Sex = 0;
int Sab = 0;

switch (diaUm) {
case 1:
diaUm = Dom;
break;
case 2:
diaUm = Seg;
break;
case 3:
diaUm = Ter;
break;
case 4:
diaUm = Qua;
break;
case 5:
diaUm = Qui;
break;
case 6:
diaUm = Sex;
break;
case 7:
diaUm = Sab;
break;
}

System.out.println("Dom Seg Ter Qua Qui Sex Sab");

int i = 0;
for (i = 1; i < totalDias; i++) {
System.out.println(Dom + Seg + Ter + Qua + Qui + Sex + Sab);
}
entrada.close();
}

}
Responder

20/01/2020

João Medeiros

Meus caros, boa noite!
Mais uma vez venho solicitar ajuda para uma atividade da faculdade.
O enunciado: Desenvolva um algoritmo que "desenhe" um calendário, como o abaixo, para um determinado mês, tendo como dados:
1. o número de dias do mês
2. qual o dia da semana correspondente ao primeiro dia do mês

Exemplo:
número de dias: 31
primeiro dia: terça-feira

---------------------------------------
D S T Q Q S S
1 2 3 4 5
.....
27 28 29 30 31
---------------------------------------
Pelo que entendi, não se trata de uma implementação de um calendário propriamente dito, com uso da Classe "Calendar", pois ainda não vimos esse tipo de assunto.
Seria algo que usaria somente condicionais/laços de repetição para, por exemplo, a partir da quantidade de dias de um mês "x" qualquer, inserir-se o dia da semana correspondente ao primeiro dia do citado mês e o programa correr a sequência dos dias da semana até o último dia do mês, mostrando o resultado na tela em forma de um desenho de calendário. Para ser honesto, embora tenha pesquisado bastante na internet e em algum material que tenho, não encontrei nada parecido.
Agradeço se alguém puder ajudar.
João Medeiros


Eu comecei algo assim, mas sei que falta ajustar muita coisa:
import java.util.Scanner;

public class Tema6_2 {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);

int totalDias;
int diaUm;

System.out.println("Informe a quantidade de dias do mês: ");
totalDias = entrada.nextInt();

System.out.println("Informe o dia da semana correspondente ao primeiro dia do mês: ");
diaUm = entrada.nextInt();

int Dom = 0;
int Seg = 0;
int Ter = 0;
int Qua = 0;
int Qui = 0;
int Sex = 0;
int Sab = 0;

switch (diaUm) {
case 1:
diaUm = Dom;
break;
case 2:
diaUm = Seg;
break;
case 3:
diaUm = Ter;
break;
case 4:
diaUm = Qua;
break;
case 5:
diaUm = Qui;
break;
case 6:
diaUm = Sex;
break;
case 7:
diaUm = Sab;
break;
}

System.out.println("Dom Seg Ter Qua Qui Sex Sab");

int i = 0;
for (i = 1; i < totalDias; i++) {
System.out.println(Dom + Seg + Ter + Qua + Qui + Sex + Sab);
}
entrada.close();
}

}


Um pouco mais incrementado, mas cheio de erros, ainda:
public class Tema6_2 {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);

int totalDias, diaUm, dom = 0, seg = 0, ter = 0, qua = 0, qui = 0, sex = 0, sab = 0;


System.out.println("Informe a quantidade de dias do mês: ");
totalDias = entrada.nextInt();

System.out.println("Informe o dia da semana correspondente ao primeiro dia do mês: ");
diaUm = entrada.nextInt();


switch (diaUm) {
case 1:
diaUm = dom;
break;
case 2:
diaUm = seg;
break;
case 3:
diaUm = ter;
break;
case 4:
diaUm = qua;
break;
case 5:
diaUm = qui;
break;
case 6:
diaUm = sex;
break;
case 7:
diaUm = sab;
break;
}

System.out.println("Dom Seg Ter Qua Qui Sex Sab");

int i = 0;
for (i = 1; i <= totalDias; i++) {

System.out.println(dom(i) + " " + seg(i) + " " + ter(i) + " " + qua(i) + " "
+ qui(i) + " " +sex(i) + " " + sab(i));
}
entrada.close();
}

private static int sab(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int sex(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int qui(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int qua(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int ter(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int seg(int i) {
// TODO Auto-generated method stub
return i++;
}

private static int dom(int i) {
// TODO Auto-generated method stub
return i++;
}

}
Responder

20/01/2020

Daniel Melo

Somente a título de curiosidade, a classe calendar não é mais utilizada, ela era complexa e tinha muitos bugs, então uma alternativa foi lançada no java 8, agora sobre seu problema:
Indo por partes, o que você precisa fazer?
*Armazenar a informação de quantidade de dias de cada mês
*Coletar as informações de dia, mês, ano e dia da semana
*Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo
*Descobrir se a data digitada pelo usuário é válida
*Descobrir qual o dia da semana foi o dia 1 do mês, dessa forma basta iterar até o último dia do mês para formar o calendário
*Desenhar o calendário na tela

Aqui vão exemplos de código:

Armazenar a informação de quantidade de dias de cada mês:

int[] diasDoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


Coletar as informações de dia, mês, ano e dia da semana:

                System.out.println("Digite o dia do mês: ");
		int dia = scan.nextInt();
		System.out.println("Digite o mês do ano: ");
		int mes = scan.nextInt();
		System.out.println("Digite o ano: ");
		int ano = scan.nextInt();
		System.out.println("Digite o dia da semana(considere domingo = 1 e sábado = 7): ");
		int semana = scan.nextInt();


Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo:

                if(ano % 4 == 0){ //anos bissextos são sempre divisíves por 4, 2020 por exemplo, é bissexto
		    diasDoMes[1] = 29;
		}


Descobrir se a data digitada pelo usuário é válida:

                if(mes > 12 || mes < 1){
		    System.out.println("Data inválida");
		}else if(dia > diasDoMes[mes - 1] || dia < 1){
		     System.out.println("Data inválida");
		}else if(semana > 7 || semana < 1){
		     System.out.println("Data inválida");


Descobrir qual o dia da semana foi o dia 1 do mês:

                 for(int i = dia; i > 1; i--){
		    if(semana == 1){
		        semana = 7;
		    }else{
		        semana -= 1;
		    }
		}


Desenhar o calendário na tela:

Sou péssimo em desenhar coisas na tela.
Responder

20/01/2020

João Medeiros

Somente a título de curiosidade, a classe calendar não é mais utilizada, ela era complexa e tinha muitos bugs, então uma alternativa foi lançada no java 8, agora sobre seu problema:
Indo por partes, o que você precisa fazer?
*Armazenar a informação de quantidade de dias de cada mês
*Coletar as informações de dia, mês, ano e dia da semana
*Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo
*Descobrir se a data digitada pelo usuário é válida
*Descobrir qual o dia da semana foi o dia 1 do mês, dessa forma basta iterar até o último dia do mês para formar o calendário
*Desenhar o calendário na tela

Aqui vão exemplos de código:

Armazenar a informação de quantidade de dias de cada mês:

int[] diasDoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


Coletar as informações de dia, mês, ano e dia da semana:

                System.out.println("Digite o dia do mês: ");
		int dia = scan.nextInt();
		System.out.println("Digite o mês do ano: ");
		int mes = scan.nextInt();
		System.out.println("Digite o ano: ");
		int ano = scan.nextInt();
		System.out.println("Digite o dia da semana(considere domingo = 1 e sábado = 7): ");
		int semana = scan.nextInt();


Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo:

                if(ano % 4 == 0){ //anos bissextos são sempre divisíves por 4, 2020 por exemplo, é bissexto
		    diasDoMes[1] = 29;
		}


Descobrir se a data digitada pelo usuário é válida:

                if(mes > 12 || mes < 1){
		    System.out.println("Data inválida");
		}else if(dia > diasDoMes[mes - 1] || dia < 1){
		     System.out.println("Data inválida");
		}else if(semana > 7 || semana < 1){
		     System.out.println("Data inválida");


Descobrir qual o dia da semana foi o dia 1 do mês:

                 for(int i = dia; i > 1; i--){
		    if(semana == 1){
		        semana = 7;
		    }else{
		        semana -= 1;
		    }
		}


Desenhar o calendário na tela:

Sou péssimo em desenhar coisas na tela.
Responder

20/01/2020

João Medeiros

Somente a título de curiosidade, a classe calendar não é mais utilizada, ela era complexa e tinha muitos bugs, então uma alternativa foi lançada no java 8, agora sobre seu problema:
Indo por partes, o que você precisa fazer?
*Armazenar a informação de quantidade de dias de cada mês
*Coletar as informações de dia, mês, ano e dia da semana
*Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo
*Descobrir se a data digitada pelo usuário é válida
*Descobrir qual o dia da semana foi o dia 1 do mês, dessa forma basta iterar até o último dia do mês para formar o calendário
*Desenhar o calendário na tela

Aqui vão exemplos de código:

Armazenar a informação de quantidade de dias de cada mês:

int[] diasDoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


Coletar as informações de dia, mês, ano e dia da semana:

                System.out.println("Digite o dia do mês: ");
		int dia = scan.nextInt();
		System.out.println("Digite o mês do ano: ");
		int mes = scan.nextInt();
		System.out.println("Digite o ano: ");
		int ano = scan.nextInt();
		System.out.println("Digite o dia da semana(considere domingo = 1 e sábado = 7): ");
		int semana = scan.nextInt();


Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo:

                if(ano % 4 == 0){ //anos bissextos são sempre divisíves por 4, 2020 por exemplo, é bissexto
		    diasDoMes[1] = 29;
		}


Descobrir se a data digitada pelo usuário é válida:

                if(mes > 12 || mes < 1){
		    System.out.println("Data inválida");
		}else if(dia > diasDoMes[mes - 1] || dia < 1){
		     System.out.println("Data inválida");
		}else if(semana > 7 || semana < 1){
		     System.out.println("Data inválida");


Descobrir qual o dia da semana foi o dia 1 do mês:

                 for(int i = dia; i > 1; i--){
		    if(semana == 1){
		        semana = 7;
		    }else{
		        semana -= 1;
		    }
		}


Desenhar o calendário na tela:

Sou péssimo em desenhar coisas na tela.



Olá, Daniel!

O problema é algo mais simples... o professor não quer um calendário em si. Apenas que seja lido pelo teclado a quantidade de dias de um mês qualquer e bem como seja lido em qual dia da semana começa o dia 1 desse mês.
Só a saída no monitor é que deve ser em forma de um calendário.
Um exemplo: escolher um mês com 30 dias. O primeiro dia desse mês começa na quarta-feira... e daí mostrar esse resultado na tela em forma de calendário.
Grato,
João Medeiros
Responder

20/01/2020

João Medeiros

Somente a título de curiosidade, a classe calendar não é mais utilizada, ela era complexa e tinha muitos bugs, então uma alternativa foi lançada no java 8, agora sobre seu problema:
Indo por partes, o que você precisa fazer?
*Armazenar a informação de quantidade de dias de cada mês
*Coletar as informações de dia, mês, ano e dia da semana
*Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo
*Descobrir se a data digitada pelo usuário é válida
*Descobrir qual o dia da semana foi o dia 1 do mês, dessa forma basta iterar até o último dia do mês para formar o calendário
*Desenhar o calendário na tela

Aqui vão exemplos de código:

Armazenar a informação de quantidade de dias de cada mês:

int[] diasDoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


Coletar as informações de dia, mês, ano e dia da semana:

                System.out.println("Digite o dia do mês: ");
		int dia = scan.nextInt();
		System.out.println("Digite o mês do ano: ");
		int mes = scan.nextInt();
		System.out.println("Digite o ano: ");
		int ano = scan.nextInt();
		System.out.println("Digite o dia da semana(considere domingo = 1 e sábado = 7): ");
		int semana = scan.nextInt();


Descobrir se o ano é bissexto, e fazer fevereiro ficar com 29 dias em caso afirmativo:

                if(ano % 4 == 0){ //anos bissextos são sempre divisíves por 4, 2020 por exemplo, é bissexto
		    diasDoMes[1] = 29;
		}


Descobrir se a data digitada pelo usuário é válida:

                if(mes > 12 || mes < 1){
		    System.out.println("Data inválida");
		}else if(dia > diasDoMes[mes - 1] || dia < 1){
		     System.out.println("Data inválida");
		}else if(semana > 7 || semana < 1){
		     System.out.println("Data inválida");


Descobrir qual o dia da semana foi o dia 1 do mês:

                 for(int i = dia; i > 1; i--){
		    if(semana == 1){
		        semana = 7;
		    }else{
		        semana -= 1;
		    }
		}


Desenhar o calendário na tela:

Sou péssimo em desenhar coisas na tela.



Olá, Daniel!

O problema é algo mais simples... o professor não quer um calendário em si. Apenas que seja lido pelo teclado a quantidade de dias de um mês qualquer e bem como seja lido em qual dia da semana começa o dia 1 desse mês.
Só a saída no monitor é que deve ser em forma de um calendário.
Um exemplo: escolher um mês com 30 dias. O primeiro dia desse mês começa na quarta-feira... e daí mostrar esse resultado na tela em forma de calendário.
Grato,
João Medeiros


Ok, tudo bem, basta você printar na tela os dias da semana do calendário e depois na linha de baixo printar espaços vazios até que o próximo número que você digitar seja empurrado para a posição abaixo do dia da semana correspondente ao dia 1 do mês, em seguida basta fazer uma iteração simples para printar os dias do mês na tela, e durante a iteração adicionar um algoritmo para quebrar a linha caso o dia da semana seja o último dia, lembrando de utilizar o print ao invés do println nesse caso, pois o println sempre adicionará uma nova linha, enquanto que o print irá escrever tudo numa linha só, eu fiz um exemplo de código aqui, mas como eu disse ateriormente não sei desenhar na tela direito:

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) {
	    Scanner scan = new Scanner(System.in);
		System.out.println("Em qual dia da semana começa o mês?(considere domingo = 1 e sábado = 7)");
		int dia = scan.nextInt();
		System.out.println("Quantos dias tem o mês?");
		int dias = scan.nextInt();
		System.out.println("D S T Q Q S S");
		System.out.println("-------------");
		for(int i = 1; i < dia; i++){
		    System.out.print("  ");
		}
		for(int i = 1; i <= dias; i++){
		    System.out.print("|" + i);
		    if(dia == 7){
		        dia = 1;
		        System.out.print("\\\\n");
		    }else{
		        dia++;
		    }
		}
	}
}



Olá, Daniel!

O teu código realmente funciona e está bem conciso.
Para não demonstrar acomodação, eu fiz um código que também funcionou, mas foi coisa de amador, com umas 240 linhas de código... rsrsrs
Não há espaço para copiá-lo aqui, mas fiz um for, semelhante ao que você fez e fui fazendo if/else para cada condição: dia começa com 1 => 31 dias; dia começa com 1 => 30 dias; ... dia começa com 3 => 30 dias; .... dia começa com 7 => 28 dias... funcionou, mas ficou muito feio.
Muito grato,
João Medeiros
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar