Kk

22 respostas
programação
Wellington_Gomes1

nn

22 Respostas

K

Bom Dia.

Eu faria desse modo:

Faria um programa que receberia a mensagem e transformaria ela em um array de char, criaria um for para percorrer esse array, em toda posição to array chamaria um método para fazer a mudança.

O método que faz a mudança seria um método que receberia um char e retornaria um char, ele pegaria o char que recebeu transformaria no seu numero ASCII correspondente,somaria 1 e transformaria novamente em char e retornaria o char mudado.

Caso você não saiba transformar em ASCII tem essa pergunta no grupo que tem bastantes exemplos.

wldomiciano

Esta é uma possibilidade:

import java.util.stream.Collectors;

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        String inverso = texto.chars()
                .mapToObj(i ->  Character.toString((char) (i + 1)))
                .collect(Collectors.joining(""));

        System.out.println(inverso);
    }
}
Wellington_Gomes1

Muito obrigado!!

Wellington_Gomes1

Não entendi oq vc disse! sou um pouco noob, esou começando java agora! me ajude

wldomiciano

O código funciona pra qualquer palavra.

Usei uma String comum no exemplo porque achei que seu problema fosse apenas com a inversão.

Em Java, pra poder permitir que o usuário entre com a String, vc vai ter que usar a classe Scanner.

Ficaria algo mais ou menos assim:

/* ... */
String texto = new Scanner(System.in).nextLine();
/* ... */
Wellington_Gomes1

Mestre deu certinho agora vou estudar oq vc usou aq!
muito foda vc!
poderia me explicar seu codigo? tipo tem algumas coisas ali q numca vir!
como falei estou começando agora!

Olha o jeito q ficou

String texto = new Scanner(System.in).nextLine();
    String inverso = texto.chars()
            .mapToObj(i ->  Character.toString((char) (i + 1)))
            .collect(Collectors.joining(""));
      System.out.println("A palavra cripitografada e " +inverso);
Wellington_Gomes1

Explica cada linha please

String inverso = texto.chars() ->EXPLICA?
.mapToObj(i -> Character.toString((char) (i + 1)))->EXPLICA?
.collect(Collectors.joining(""))->EXPLICA?

wldomiciano

Para este código eu usei um recurso disponível a partir da versão 8 do Java que são as Streams e o método chars() que está disponível a partir da versão 9.

Primeiro eu usei o código abaixo para transformar a String em uma Stream de inteiros.

texto.chars()

Uma stream é uma sequencia de valores, é quase como um array se vc for pensar que as duas estruturas organizam seus elementos sequencialmente.

Contudo, Streams são mais versáteis e permitem que nós as manipulemos de formas que não é possível ou que seria mais trabalhso usando arrays comuns.

Por exemplo: O próximo passo, destacado no trecho abaixo, eu transformei a sequencia/stream de inteiros em uma sequencia de Strings.

Eu peguei cada item da sequencia (representado pela variável i e somei com + 1 para avançar a letra (‘a’ vira ‘b’, ‘b’ vira ‘c’ e assim por diante).

E com a ajuda do método Character.toString() eu transformei a letra resultante em string.

.mapToObj(i ->  Character.toString((char) (i + 1)))

Por último eu usei o trecho abaixo para pegar/coletar cada item da sequencia e juntar tudo numa String só.

.collect(Collectors.joining(""));

Se eu quisesse juntar tudo, mas inserindo uma virgula entre cada letra, eu poderia fazer assim:

.collect(Collectors.joining(", "));

Um exemplo de outra coisa legal que é possível de fazer é o seguinte: digamos que a gente queira excluir as vogais antes de fazer a criptografia, ficaria assim:

String inverso = texto.chars()
	.filter(i -> "AEIOUaeiou".indexOf(i) == -1)
        .mapToObj(i ->  Character.toString((char) (i + 1)))
        .collect(Collectors.joining(""));

Uma forma mais simples de fazer, sem Streams, seria assim:

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        char[] array = texto.toCharArray();
        String inverso = "";

        for(int i = 0; i < texto.length(); i++) {
            inverso += (char) (array[i] + 1);
        }

        System.out.println(inverso);
    }
}

O problema da forma acima é que ela cria uma nova String a cada iteração do loop. O mais correto (e não tão simples) seria usar o StringBuilder.

class Main {
    public static void main(String[] args) {
        String texto = "casa";

        char[] array = texto.toCharArray();
        StringBuilder builder = new StringBuilder();

        for(int i = 0; i < texto.length(); i++) {
            builder.append((char) (array[i] + 1));
        }

        String inverso = builder.toString();

        System.out.println(inverso);
    }
}

A idéia é que em Java, String são imutáveis e, por isso, quando vc soma uma String com outra String, vc não está modificando-a, vc está criando uma String completamente nova com o valor somado das outras.

O StringBuilder nos ajuda a compor String de forma mais performática. Ele tem mecanismos que evitam a criação de tantas Strings desnecessárias.

Wellington_Gomes1

sensacional sua explicação valeu!! qualquer duvida te chamo!

Wellington_Gomes1

Voçê sabe outro jeito de fazer usando um (for) e criando um (vetor) com o alfabeto?

wldomiciano

Eu mostrei como é possível fazer com o for, só não sei onde esse vetor com o alfabeto se encaixa na história.

Wellington_Gomes1

Pois e acho q estou pensando errado!

Wellington_Gomes1

vir aq com o for!!

Wellington_Gomes1

e como descriptografar? deixando do mesmo jeito q o usuário digitou?

wldomiciano

Do mesmo jeito, só que fazendo -1 ao invés de +1. Exemplo:

Com Streams:

inverso.chars()
       .mapToObj(i ->  Character.toString((char) (i - 1)))
       .collect(Collectors.joining(""));
Wellington_Gomes1

valeu

Wellington_Gomes1

Mestre !pra quem ta começando agora o ideal seria estudar bastante vetor e matriz e saber bem como usar? Se eu souber usar bem consigo resolver muitos algoritmos?

wldomiciano

Vetores (ou arrays) são bastante úteis em várias situações e vc tem sim que entender bem.

O ideal seria vc escolher um curso ou um livro ou algum tutorial, que apresenta uma estrutura de aprendizado, e fosse seguindo no seu tempo, aprendendo progressivamente.

Mas que parte do uso dos arrays vc não entende?

Wellington_Gomes1

Posso fazer um Array de qualquer coisa? tipo int e String?
E como faço pra chamar ele tipo deixando ele livre para o usuario digitar!
Um livro bom que voçê pode me indicar, para pro seguir passo a passo.

wldomiciano

Vc pode criar arrays de qualquer coisa, desde os tipos primitivos até os tipos referência (que são os tipos representados pelas classes).

A sintaxe para criar um array é a mesma pra qualquer tipo.

int[] arrayDeInteiros;
char[] arrayDeCaracteres;

// Digamos que vc esteja criando um jogo com naves inimigas
Nave[] navesInimigas;

Uma coisa pra ficar atento é que há diferença entre declarar um array e criar um array.

No trecho acima eu apenas declarei aqueles arrays. Para criar de verdade eu preciso user o new, assim:

int[] arrayDeInteiros = new int[10];
char[] arrayDeCaracteres = new char[10];
Nave[] navesInimigas = new Nave[10];

Notou o 10 entre colchetes? Ele especifica qual a capacidade do array, ou seja, a quantidade de elementos máxima que o array pode conter.

No exemplo eu criei arrays com capacidade para 10 elementos.

Depois da criação dos arrays vc precisa adicionar os elementos. Adicionamos elementos da seguinte forma:

arrayDeInteiros[0] = 1;
arrayDeInteiros[1] = 2;
arrayDeInteiros[2] = 3;
arrayDeInteiros[3] = 4;
arrayDeInteiros[4] = 5;
arrayDeInteiros[5] = 6;
arrayDeInteiros[6] = 7;
arrayDeInteiros[7] = 8;
arrayDeInteiros[8] = 9;
arrayDeInteiros[9] = 10;

navesInimigas[0] = new Nave();
navesInimigas[1] = new Nave();
navesInimigas[2] = new Nave();
/* e assim por diante... */

Os indices (os números entre colchetes) sempre começam em 0, o 0 representa a posição do primeiro elemento do array. No caso do meu array com capacidade para 10 elementos, a última posição é representada pelo indice 9.

Dependendo do caso, pode ser útil usar um loop pra fazer a inicialização.

for(int i = 0; i < navesInimigas.length; i++) {
    navesInimigas[i] = new Nave();
}

Pra encher o array com dados vindos do usuário, vc faria algo como:

Scanner scan = new Scanner(System.in);
int[] numerosDaSorte = new int[3];

System.out.println("Entre com o primeiro número da sorte: ");
numerosDaSorte[0] = Integer.parseInt(scan.nextLine());

System.out.println("Entre com o segundo número da sorte: ");
numerosDaSorte[0] = Integer.parseInt(scan.nextLine());

System.out.println("Entre com o terceiro número da sorte: ");
numerosDaSorte[0] = Integer.parseInt(scan.nextLine());

Ou pra facilitar:

Scanner scan = new Scanner(System.in);
int[] numerosDaSorte = new int[3];

for(int i = 0; i < numerosDaSorte.length; i++) {
    System.out.println("Entre com o " + (i + 1) + "° número da sorte: ");
    numerosDaSorte[i] = Integer.parseInt(scan.nextLine());
}

System.out.println("Seus números são: ");
for (int i = 0; i < numerosDaSorte.length; i++) {
    System.out.print(numerosDaSorte[i] + " ");
}

Arrays em Java tem tamanho fixo e isso quer dizer que se vc declara um array com capacidade para 10 elementos, vc nunca vai conseguir acrescentar mais elementos do que isso e, se tentar, uma exceção será lançada.

Se tentar algo como:

numerosDaSorte[3] = 123;

A exceção IndexOutOfBoundsException será lançada. É bom ficar atento com isso porque já vi gente no fórum perguntando o que é esse “erro do Java”.

Este tipo de erro não é do Java, mas sim do próprio programador e significa puramente que vc informou que queria um array de tamanho x, mas está usando como se tive tamanho x + 1.

Fique atento às mensagens no console.

Acho que é isso o básico.

Não conheço livros pra indicar.

staroski

Exemplo:

import java.util.Scanner;

public class Exemplo {

    public static void main(String[] args) {
        Exemplo programa = new Exemplo();
        programa.executar();
    }

    private static final Scanner entrada = new Scanner(System.in);

    public void executar() {
        System.out.print("Digite uma palavra: ");
        String palavra = entrada.nextLine();
        System.out.print("A palavra encriptada é: ");
        char[] letras = palavra.toCharArray();
        for (char letra : letras) {
            letra++;
            System.out.print(letra);
        }
    }
}
Wellington_Gomes1

Valeu mestre!! :pray::raised_hands:

Criado 13 de abril de 2019
Ultima resposta 15 de abr. de 2019
Respostas 22
Participantes 4