Deslocamento variavel [RESOLVIDO]

galera obrigado pela ajuda, mas sou iniciante e não entendo direito o codigo de vcs, e eu tenho que levar o que o professor fez em sala, que só falta uma parte que ele mandou a gente completar! tem que ser nesse codigo abaixo. ele só falta a parte de trocar as letras! deem uma olhada abaixo:

String frase = JOptionPane.showInputDialog(“entre com o nome”);
String chave = JOptionPane.showInputDialog(“entre com a chave”);
char [] prepchave = new char [chave.length()];
char [] prepfrase = new char [frase.length()];

int i;

//jogando a frase no vetor
for ( i=0; i< frase.length(); i++ ){
prepfrase[i] = frase.charAt(i);
}

//jogando a chave no vetor
for ( i =0; i< chave.length();i++){
prepchave[i] = chave.charAt(i);
}

// contador para apontar para a posição da chave
int x =0;

falta terminar essa parte abaixo:

//percorrendo a frese para deslocar as letras
for ( i=0; i< frase.lenght(); i++ ){

[u]aki é que falta completar o programa nao consigo apontar a posição do contador pra posição chave e deslocar
as letras

[/u][b]

}

Você acima de tudo prescisa de outra string, ou outro char[], que é o alfabeto. O computador não tem como saber que A + 2 é C, A não ser que tenha um vetor que tenha ‘a’ na posição 0, ‘c’ na posição 2. Então você pode mandar o pc procurar no alfabeto ‘a’ e guardar o local, que e ‘0’. Então ele vai saber que 0 + 2 é 2, vai procurar na posição 2 e vai achar ‘c’.

Para esse vetor utilizei o alfabeto, que eu acho que é o que você quer.
Além de com "abcdefghijklmnopqrstuvwxyz".toCharArray(), que utilizei, você pode usar:

String alfabeto = "abcdefghijklmnopqrstuvwxyz";
Char[] prepalfabeto;
for ( int a = 0 ; a < alfabeto.length() ; ++a )
{
  prepalfabeto[a] = alfabeto.charAt(a);
}

que pelo que vi você está mais acostumado a usar.

Quando você tiver esse char[] com o alfabeto, você pode criar um método como esse:

public static int procurar( char c, char[] alfabeto )
{
  for ( int contador = 0 ; a < alfabeto.length ; a++ )
  {
    if ( c == alfabeto[ contador ] ) // Se o char c for iqual a posição [ contador ] do alfabeto.
      return contador; // Retornar o contador, que encerra o método sem retornar -1;
  }
  return -1; // Retorna -1, caso o metodo não achou o char no alfabeto.
}

Então dentro deste loop:

//percorrendo a frase para deslocar as letras 
for ( i=0; i< prepfrase.lenght; i++ ) // IMPORTANTE, Aqui, Utilize o prepfrase, não frase.
{
  char antigo = prepfrase[i];
  int index; // O local no alfabeto onde o char está. Exemplo, B seria 1, C seria 2, A seria 0.
  
  index = procurar( antigo, alfabeto );
  
  int codigoAtual = Integer.parseInt( prepcodigo[i] ); // Armazena o codigo como um int, usando a classe Integer
  
  int novoLocal = index + codigoAtual; // Local do alfabeto em que a nova letra vai estar
  char novo = alfabeto[ novoLocal ];
  
  /* Exemplo: Palavra = casa
   * Codigo: 3682
   * Você quer que o 'c' se torne 'f', Certo? o método procurar armazena 2 em index, que é a posição de c no alfabeto.
   * A prepcodigo armazena '3' no [0], que é a posição do c na palavra ( Primeira letra, usa primeiro numero do codigo );
   * codigo atual armazena 3 no lugar de '3', usando Integer.parseInt( prepcodigo[i] )
   * index ( que é dois ) + codigoAtual( que  é 3 ) fica 5
   * novoLocal sera então 5.
   * Então, o novo char será a posição 5 do alfabeto, que é 'f'.
   * prepfrase[i] = novo( 'f' ); */
  
   prepfrase [i] = novo;
   
   /* Isso funcionaria bem até o primeiro 'a', mais no 's', causaria um erro, ja que S, que está na posição 18 do alfabeto + 8, ficaria na posição 26.
    * O alfabeto só vai até a posição 25, que é 'z'.  Para resolver esse problema...
    * Substitua:
    * int novoLocal = index + codigoAtual
    * por :
    * int novoLocal = ( index + codigoAtual ) % alfabeto.length; Que pega o resto da divisão de index + codigoAtual pelo tamanho do alfabeto.
    * Se index + codigoAtual for menor que o tamanho do alfabeto, o resultado será o mesmo.
    * Caso não seja, o resultado sera o resto. No caso do 's' + 8, o resultado seria 0, já que 26 é o tamanho do alfabeto.
    * char novo será então 'a' */

    // prepfrase será então : fgac
}

Boa sorte, espero que ajude. Um contador para apontar a posição da chave não é necessario. ( Acredito eu );

obrigado polimorphism, mas quando eu estava falando da string “abcd…” era apenas um exemplo pro pessoal entender, pq na verdade esse programa esta usando a tabela utf ou ascii se não me engano! faz o seguinte vou te passar o codigo em que so rola chave de uma posição( todas as letras pulam a mesma posição) ex: se for chave 195, cada letra pula 195 posições! foi depois que fizemos esse codigo, que o professor mandou a gente fazer o codigo do deslocamento variavel, em que cada letra pula uma posição de acordo com a posição do indice da chave! como eu ja expliquei anteriormente! veja o deslocamento simples abaixo:

import javax.swing.*;
public class Deslocamento {
public static void main(String[] args) {

String frase = JOptionPane.showInputDialog(“entre com o nome”);
String chave = JOptionPane.showInputDialog(“entre com a chave”);

char [] prepfrase = new char [frase.length()];

int valor = chave.charAt(0);

int i;

for ( i=0; i< frase.length(); i++ ){
prepfrase[i] = frase.charAt(i);
}

for ( i=0; i< frase.length(); i++ ){

int temporario = prepfrase[i];
temporario += valor;
prepfrase[i] = (char) temporario;

}

for (i=0; i <frase.length();i++){
System.out.print(prepfrase[i]);
}
}
}

a única diferença desse pro outro que passei, é que a chave desse não está num vetor, e esse tambem nao tem o contador que o professor pediu, pois todas as letras mudam a mesma posição! o outro a chave está em um vetor, cujo o valor do contador que ele pediu pra crir, aponta pro indice da chave! e esse professor insiste em querer o codigo desse jeito! mandou a gente pesquisar! ja tentei fazer de todo jeito e nao consigo apontar esse contador para o indice da chave e somar com o caractere atual pra fazer um novo caractere! se voce puder rodar esse codigo acima pra poder me ajudar! obrigado!

=D… Ok, acho que isso resolve.

import javax.swing.*; 
public class Deslocamento
{ 
  public static void main(String[] args) 
  {
    String frase = JOptionPane.showInputDialog("entre com o nome"); 
    String chave = JOptionPane.showInputDialog("entre com a chave"); 

    char [] prepfrase = new char [frase.length()]; 

    int valores[] = new int[ chave.length() ];

    for ( int a = 0 ; a < chave.length() ; ++a )
    {
      valores[a] = chave.charAt(a);
    }

    for ( int i=0; i< frase.length(); ++i )
    { 
      prepfrase[i] = frase.charAt(i); 
    } 


    for ( int i=0; i< frase.length(); ++i )
    { 
      int temporario = prepfrase[i];
      temporario += valores[ ( i % valores.length ) ]; // Usei o operando de resto, para o caso de o usuario digitar uma chave menor que a palavra 
      prepfrase[i] = (char) temporario; 
    } 

    for ( int i = 0; i < frase.length();i++)
    {
      System.out.print(prepfrase[i]); 
    }
  } 
}

O programa tava quase todo pronto, so tranformei o int valor em um array.
=D Boa sorte

valew Polimorphism com esse seu codigo consegui terminar! engraçado sabe o que percebi no seu codigo e no primeiro que o professor fez?, é que ele nao ta somando com o valor da chave e sim com o valor char ascii da chave. exemplo: posição chave 2 vale 7: ele teria que somar o valor da indice da frase + o indice 2 da chave que vale 7 correto? só que ele ta somando o valor char de 7 que vale 55!! rsrsrs! mas tudo bem!

[code]temporario += valores[( i % valores.length )];[code]
//essa parte aí tive que modificar

//ficou assim

x = x % valores.length;
temporario += valores[x];
x++;[/code]

como no codigo se o tamanho da frase ultrapassasse o da chave, o contador teria que voltar e apontar para o inicio da chave e com o i nao estava fazendo isso!

o modulo de i, estava ultrapassando o tamanho da chave! pois se a palavra fosse maior que a chave i tambem mesmo modulando iria passar o tamanho da chave! e desse jeito que eu fiz, ele sempre volta para o inicio quando o tamanho da frase ultrapassa da chave!

não sei se estou certo! se ver um erro aí me diga!

obrigado!

Fiz isso porque achei que o código seria uma palavra =D


temporario += valores[ ( i % valores.length ) ];

x = x%valores.length;
temporario += valores[x];
x++;

O código me pareceu fazer a mesma coisa. Aqui funciona perfeitamente. Ambos somam temporario a valores[ i % valores.length ];
No seu código a unica diferença é que o valor do contador x retorna a 0 quando alcança o o fim do array, no meu codigo não, apenas o valor passado como index diminui, podendo reutilizar a variavel i para prepfrase[i] = ( char ) temporario.
Porém os resultados deveriam ser sempre iguais.
Se ocorrer qualquer exceção, poste a exceção aqui =D

Polimorphism o código ficou bom! valew mesmo! obrigado cara. eu li os post de como iniciantes devem postar, e não achei como coloca [resolvido]. só falta isso agora rsrsr. to te devendo uma! isso é, quando eu aprender neh? rsrsrs

kkk
Edita o título ( assunto ) do post original que você fez.
Qualquer duvida só perguntar aí =D