segunda-feira, 22 de maio de 2017

#2: Desafios de Lógica: Ordenação de nomes

Olá novamente, continuando com a série de Estrutura de Dados, hoje vou falar sobre ordenação.

Problema: Precisa-se que ordene um array de 20 nomes em ordem alfabética.

Resolução:
 Primeiro temos que criar um array de 20 posições para
resolução do problema:

 String nomes[] = new String [20];

Após isso, vamos solicitar ao usuário que informe os 20 nomes.
Como já expliquei essa parte de solicitar ao usuário utilizando a classe Scanner,  não vou entrar em mais detalhes nela. (Caso você queira entender um pouco melhor,  tem no meu post sobre Conversão de minutos para horas e minutos  (https://goo.gl/nQ0QEX)

Scanner sc = new Scanner(System.in);
for(int i=0;i<nomes.length;i++){
   System.out.println("Digite o nome");
   nomes[i] = sc.next();
}
//Somente para mostrar, que foi salvo os nomes
for(String valores:nomes){
  System.out.println(valores);
}

//Agora, independente da ordem que o usuário informou precisamos ordenar,
//e utilizaremos o algoritmo BubbleSort (ou conhecido também como:  Algoritmo Bolha)

* for (int i = 0; i < nomes.length - 1; i++) 
                for (int j = i + 1; j < nomes.length; j++) 
                    if (nomes[i].compareTo(nomes[j]) > 0) { 
                        String temporario = nomes[i]; 
                        nomes[i] = nomes[j]; 
                        nomes[j] = temporario; 
                    }

for(String nomesOrdenados:nome){
     System.out.println(nomesOrdenados);
}

* O algoritmo bolha, irá verificar de dois em dois se os elementos são maiores  ou menores entre eles, caso o primeiro elemento seja maior que o segundo  (o método compareTo irá retornar um número positivo (maior que 0(zero))).

Para a comparação entre os dois elementos, eu utilizo dois for's encadeados,  sendo que o segundo, irá iteirar + 1 com o índice do primeiro for, para que  consiga ler o próximo elemento.

nomes.lenght-1 - É para que o índice da variável j não passe do maior número  do array, e não lance uma exceção ArrayIndexOutOfBoundsException.

Assim independente da ordem que o usuário for passar os nomes, o algoritmo irá  verificar caractere por caractere e ordenando de forma alfabética.

Este código e outros estão disponíveis no meu github, caso queira analisar, basta clicar no link abaixo:

Projeto Ordenação - Bolha

Até + ;)
devhiranneri.eti.br

quarta-feira, 3 de maio de 2017

#1: Lógica - Conversão de minutos para hora e minutos

Olá novamente, durante esse tempo estava planejando alguns assuntos para postar aqui no meu blog que estarei estudando e transmitindo conhecimento:
A partir desse post vou falar sobre lógica de programação, resolvendo alguns problemas comuns do dia a dia do desenvolvimento. Para esta postagem vou falar sobre Conversão de minutos para horas e minutos.

O problema: (Conversão de minutos para horas e minutos)

O usuário irá digitar seja no console ou em alguma interface, o valor em minutos e o sistema deverá retornar o valor em horas e minutos.

Resolução:
Vamos pensar...















A principio teremos que criar três variáveis (horas,minutos,valorEmMinutosInformado):

int horas = 0,minutos=0,valorEmMinutosInformado=0; 
//Em JAVA, existe a possibilidade da declaração 
de variáveis em uma linha, caso as mesmas sejam 
do mesmo tipo, int.
E uma variável do tipo boolean para controlar a futura iterações, 
caso o usuário informe um valor incorreto.
boolean statusDoValor=true; 
Após a criação das variáveis iremos instanciar um objeto da classe Scanner para 
obtermos o valor passado pelo usuário.
Scanner sc = new Scanner(System.in); //No construtor da classe Scanner, existe um parâmetro que "obriga" para quem for instanciar o objeto deverá passar uma instância de InputStream,
ou outras como: Readable, File e etc. Você pode conferir na própria
documentação em:
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#constructor.detail
Essa linha serve para avisar ao usuário que já é possível informar o valor.
System.out.println("Digite o valor em minutos"); 
A estrutura de repetição do while servirá para no caso do usuário informar qualquer valor diferente de um número válido (e.x: número por extenso), irá ser lançado uma exceção, e a execução será abortada, e para que o usuário não necessite executar o código novamente, colocamos o código dentro do try..catch (Tratador de exceções).
 
while(statusDoValor){
try{

Essa linha abaixo irá ler o valor passado e atribuir a váriável 
valorEmMinutosInformado.

  valorEmMinutosInformado = sc.nextInt();

Vou precisar fazer uma "cópia" do valor em valorEmMinutosInformado para a variável minutos, para que no final eu consiga informar o tempo que o usuário passou via console.

  minutos=valorEmMinutosInformado;

A cada 60 minutos que equivale a 1 hora, a variável horas é incrementada e a variável minutos é reduzida de 60 em 60, até o valor dela ser menor que 60, ou seja, menor que 1 hora.


while(minutos>=60){
  horas++;
  minutos-=60;
}
  statusDoValor=false;
}catch(InputMismatchException e){
     System.out.println("Valor informado está incorreto. Digite novamente");
    valorErrado=true;
sc.next();

 
 }
}

System.out.println(valorEmMinutosInformado+" minutos equivale a "
+horas+" horas e "+minutos+"minutos");
 
}

Obs: Não se esqueçam dos imports para não apresentar erro de compilação.
" import java.util.Scanner;
import java.util.InputMismatchException; "
Esse foi um de uma série de 5 posts sobre lógica de programação. Em breve vou postar o segundo. Caso você queira contribuir com esse código ou outros, tenho ele no meu github. É só clicar no link abaixo: Projeto de Lógica de programação

Até mais...