Jump to content

Dúvida de Java


Diogo Mata

Recommended Posts

Boa tarde,

Tenho uma duvida neste codigo pois foi me pedido para tirar dados de um array com 365 dados sendo que cada dado corresponde a um dia.

Gostava de por quando imprime o pior dia e o melhor dia o dia do mês nao o dia do ano por exemplo:

janeiro vai de 1 a 31

E fevereiro vai de 1 a 28 porem no programa vai de 32 a 59: 

int meses[] = { 31, 28, 31, 30, 31, 30, 31, 31 ,30 ,31 ,30 ,31};
         int dadosAnuais[] = { 44, 188,  -1,  8, 41, 41, 3, 31,  4, 88, 8, 81, 84, 88, 38, 46, 66, -1, 66, 63, 44, 44, 68, 44, 14, 38, 61, 84, 41, 81, 46, 38, 83, 63, 84, 83, 13, 43, 11, 44, 64, 44, 84,  8, 84, 81, 43,  4, 68, 84, 86, 11, 18,  4, 48, 84, 46, 41, 64, 44, 44, 44, 46,  8, 44, 81, 61, 43, 44, 14, 41, 46, 16, 81, 84, 13, 66, 48, 18, 88, 31, 36,  6,  8, 68, 46, 34, 46, 68, 46, 11, 36, 33, 36, 44, 64, 34, 44, 61, -1, 88, 38, 46, 36, 44, 48, 14, 46, 44, 44, 46, 64, 41, 84, 43,  4,  4, -3, 64, 66, 34, 61, 18, 86, 14, 43, 33, 68, 44,  1, 84, 83, 63, 14, -3, 68, 31, 41, 86, 64, 61, 41, 84, 84, 68, 81, 88, 46, 44, 81, 41, 43, 48, 64, 46, -1, 88, 14, -2, 34, 48, 86, 11, 88, 31, -3, 43, 31, 44,  6, 88, -3, 46, 11, 48, 86, 41, 63, 34, 84, 66, 61, 34, 48, 84, -1, 88, 44, 34, 63, 66, 46, 41, 48, 41, 36,  8, 81, 38, 64, 68, 43, 64, 66, 43, 46, 31, 66,  6, 81, 81, 34, 81,  8, 64, 14, 61, 41, 61, 64, 34, 86, 41, 68, 66, 38, 84, 38, -2,  6,  4, 64, 81, 31, 86, 14, 48, 44,  -1, 34, 46, 44, 18, 48, 81, 81, 44, 46, 84, 86, 46, 41, 33, 84, 41, 68, 18, 44, 64, 48, 44, -3, 64, 86, 44, -2, 44, 43, 16, 64, 46, 31, 84, 88, 86, 48, 86, 48, 88, 11, 16, 64, -1,  6, 31, 46, 11, 83,  4, -3, 48, 48, 11, 48, 41, 81, 44, 41, 43, 81, 16, 64, 34, 66, 44, 61, 64, 88, 48, 88, 46, 64, 86, 84, 81, 41, 88, 81, 66, -1, 48, 34, 68, 46,111, 16, 63, -2, 64, -3, 46, 68, 18, 44, 68, 88, 44,  -1, 38, 48, 34,  6, 11, 44, 84, 34, 44, 46, 64, 86, 11, 38, 64, 61, 44, 46, 83, 41, 83, 81, 66, 43, 14, 66, 64 };   Scanner teclado = new Scanner(System.in);
           //Cabeçalho apresentado + opção para escolher
         System.out.print("Ver estatisticas de que mês?\n"
                    + "    ________________________________________________ \n"
                    + "    | 1-Janeiro           2-Fevereiro               |\n"
                    + "    | 3-Março             4-Abril                   |\n"
                    + "    | 5-Maio              6-Junho                   |\n"
                    + "    | 7-Julho             8-Agosto                  |\n"
                    + "    | 9-Setembro          10-Outubro                |\n"
                    + "    |11-Novembro         12-Dezembro                |\n"
                    + "    |Digite -5 para observar as estatísticas anuais.|\n"
                    + "    |Digite -4 para terminar a execução do programa.|\n"
                    + "    |_______________________________________________|\n");
            int opcao=teclado.nextInt();
        //Para ano com 366 dias ou 365 dias em que muda o nº de dias de Fevereiro 
            if(dadosAnuais.length==365) {
              meses[1]=28;
          }else {
              meses[1]=29;
          }
//Do-While para definir q o q está dentro disto irá acontecer até que seja introduzido o -4          
do {
    /*Inicialização das variavéis
     * Dentro do ciclo pois cada vez que este voltar
     *  ao ínicio as variáveis voltam a ser = 0*/
      int soma=0,diaInicial=0, diaFinal=0,piorDia=0, melhorDia=0, dia=0, total=0;
      int situacao1=0, situacao2=0, situacao3=0;
     //Para estísticas anuais : Vai ser o comprimento todo do array dadosAnuais[]
      if (opcao==-5 ) {
                diaInicial=0;
                diaFinal=dadosAnuais.length;
      // Definir quais as opcões corretas para poder entrar dentro do ciclo
         } if (opcao>=1 && opcao<=12 || opcao==-5) {
             //Calcular o diaInicial e o diaFinal
                for(int d=0;d < opcao; d++) {
                    diaFinal += meses[d];
                    diaInicial = diaFinal - meses[opcao-1];
                }
               /*Calcular a soma dos valores + pior dia do mês
                * + melhor dia do mês + situação(#1,#2 e #3)
                * + soma das situações */

              for (  dia=diaInicial; dia < diaFinal; dia++) {
                        total+=dadosAnuais[dia];
                  if (dadosAnuais[dia] < dadosAnuais[piorDia] && dadosAnuais[dia]>=0) {
                      piorDia = dia;
                 }if(dadosAnuais[dia] > dadosAnuais[melhorDia]) {
                     melhorDia = dia;
                    }if(dadosAnuais[dia]==-1) {
                       situacao1++;
                    }if(dadosAnuais[dia]==-2) {
                       situacao2++;
                    }if(dadosAnuais[dia]==-3) {
                       situacao3++;
                    }soma=situacao1 + situacao2 + situacao3;
                }          
                System.out.println("Total de recolhas de dados: "+total );  
                System.out.println("Pior dia: " + (piorDia+1) +" com " +dadosAnuais[piorDia] );
                System.out.println("Melhor dia: " + (melhorDia+1) + " com " + dadosAnuais[melhorDia]);
                System.out.println("Total de dias que ocorreu a situação #1: "+ situacao1);
                System.out.println("Total de dias que ocorreu a situação #2: "+ situacao2);
                System.out.println("Total de dias que ocorreu a situação #3: "+ situacao3);
                System.out.println("Total de dias sem recolhas de dados: "+ soma);    
                //Para poder escolher outra vez outra opção
                System.out.print("Ver estatisticas de que mês? (-5=Anuais -4=Fim) \n");
                opcao=teclado.nextInt();
                //Caso escolha a opção errada
          }else {
                  System.out.println("Opção errada. Tente novamente: \n"
                          + "    ________________________________________________ \n"
                        + "    | 1-Janeiro           2-Fevereiro               |\n"
                        + "    | 3-Março             4-Abril                   |\n"
                        + "    | 5-Maio              6-Junho                   |\n"
                        + "    | 7-Julho             8-Agosto                  |\n"
                        + "    | 9-Setembro          10-Outubro                |\n"
                        + "    |11-Novembro         12-Dezembro                |\n"
                        + "    |Digite -5 para observar as estatísticas anuais.|\n"
                        + "    |Digite -4 para terminar a execução do programa.|\n"
                        + "    |_______________________________________________|\n");
                  opcao=teclado.nextInt();
              }
         //Este ciclo repete-se enquanto não for intoduzido o -4
}while (opcao!=-4); 
       System.out.print("FIM");
         
     teclado.close();
Link to comment
Share on other sites

  • 3 months later...

Ola

Experimente o java 8 java.time api.
Tem aulas de data adequadas, etc.
abaixo eu usei o Localdate e um Stream para obter os resultados.
 

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

  public static void main(String[] args)  {
      int dadosAnuais[] = { 44, 188,  -1,  8, 41, 41, 3, 31,  4, 88,
                              8, 81, 84, 88, 38, 46, 66, -1, 66, 63,
                              44, 44, 68, 44, 14, 38, 61, 84, 41, 81, 46,
                              38, 83, 63, 84, 83, 13, 43, 11, 44, 64,       // fevereiro
                              44, 84,  8, 84, 81, 43,  4, 68, 84, 86,
                              11, 18,  4, 48, 84, 46, 41, 64,                //fevereiro
              44, 44, 44, 46,  8, 44, 81, 61, 43, 44, 14, 41, 46, 16, 81, 84, 13, 66, 48, 18, 88,
              31, 36,  6,  8, 68, 46, 34, 46, 68, 46, 11, 36, 33, 36, 44, 64, 34, 44, 61, -1, 88,
              38, 46, 36, 44, 48, 14, 46, 44, 44, 46, 64, 41, 84, 43,  4,  4, -3, 64, 66, 34, 61,
              18, 86, 14, 43, 33, 68, 44,  1, 84, 83, 63, 14, -3, 68, 31, 41, 86, 64, 61, 41, 84,
              84, 68, 81, 88, 46, 44, 81, 41, 43, 48, 64, 46, -1, 88, 14, -2, 34, 48, 86, 11, 88,
              31, -3, 43, 31, 44,  6, 88, -3, 46, 11, 48, 86, 41, 63, 34, 84, 66, 61, 34, 48, 84,
              -1, 88, 44, 34, 63, 66, 46, 41, 48, 41, 36,  8, 81, 38, 64, 68, 43, 64, 66, 43, 46,
              31, 66,  6, 81, 81, 34, 81,  8, 64, 14, 61, 41, 61, 64, 34, 86, 41, 68, 66, 38, 84,
              38, -2,  6,  4, 64, 81, 31, 86, 14, 48, 44,  -1, 34, 46, 44, 18, 48, 81, 81, 44, 46,
              84, 86, 46, 41, 33, 84, 41, 68, 18, 44, 64, 48, 44, -3, 64, 86, 44, -2, 44, 43, 16,
              64, 46, 31, 84, 88, 86, 48, 86, 48, 88, 11, 16, 64, -1,  6, 31, 46, 11, 83,  4, -3,
              48, 48, 11, 48, 41, 81, 44, 41, 43, 81, 16, 64, 34, 66, 44, 61, 64, 88, 48, 88, 46,
              64, 86, 84, 81, 41, 88, 81, 66, -1, 48, 34, 68, 46,111, 16, 63, -2, 64, -3, 46, 68,
              18, 44, 68, 88, 44,  -1, 38, 48, 34,  6, 11, 44, 84, 34, 44, 46, 64, 86, 11, 38, 64,
              61, 44, 46, 83, 41, 83, 81, 66, 43, 14, 66, 64 };
      
      int ano = 2021;
      int dataDeInicio = LocalDate.of(ano,02,01).getDayOfYear();
      int dataFinal = LocalDate.of(ano,02,28).getDayOfYear();
      
      System.out.println("Dia de inicio = " + dataDeInicio + " dia final = " + dataFinal);
      List<Integer> valores = Arrays.stream(dadosAnuais).skip(dataDeInicio-1).limit(28).mapToObj(i -> i).collect(Collectors.toList());
       
      System.out.println(valores);
      int minimo =      Arrays.stream(dadosAnuais).skip(dataDeInicio-1).limit(28).min().getAsInt();// array começa com zero
      int maximo =      Arrays.stream(dadosAnuais).skip(dataDeInicio-1).limit(28).max().getAsInt();// array começa com zero
     
     LocalDate piorDia = LocalDate.of(ano,02,valores.indexOf((Integer)minimo)+1);
     LocalDate melhorDia = LocalDate.of(ano,02,valores.indexOf((Integer)maximo)+1);
      
      System.out.format("O pior dia foi %s com o valor de %d\n e o melhor dia foi %s com o valor de %d ",
                         piorDia,minimo,melhorDia,maximo );
      
  }
 
}

outputs

Dia de inicio = 32 dia final = 59
[38, 83, 63, 84, 83, 13, 43, 11, 44, 64, 44, 84, 8, 84, 81, 43, 4, 68, 84, 86, 11, 18, 4, 48, 84, 46, 41, 64]
O pior dia foi 2021-02-17 com o valor de 4
 e o melhor dia foi 2021-02-20 com o valor de 86
 
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.