Deslocamento variavel [RESOLVIDO]

Amigos eu preciso de uma ajuda de voces, sou iniciante em java e preciso resolver um problema que o professor da minha faculdade passou e nao to conseguindo. ja tem mais de uma semana e nao consigo resolver o problema! é o seguinte:

preciso terminar um codigo de deslocamento variavel que faz o seguinte: se eu digitar a palavra: JOAO e a chave 5876.
o programa deslocar a letra J em 5 posições, a letra O em 8 posições, a letra A em 7 posições e a ultima letra, a O em 6 posIções

o professor pediu pra criar uma string da palavra e da chave e jogar em 2 vetores! ja criei as entradas de dados e fiz o codigo jogar a palvra e a chave em dois vetores com o laço for!

o problema é o seguinte: o professor pediu pra percorrer o array e deslocar cada caractere de acordo com a chave!

pediu pra gente criar um contador e de acordo com a posição do contador e apontar para a chave! exemplo: se o contador valer 1, temos que apontar pro vetor chave na posição 1!

e nisso o valor da chave 1 é a letra O, entao temos que deslocar a letra o 8 vezes de acordo com a chave!

consigo percorrer o vetor da palavar normalmento

eu só não estou conseguindo apontar o contador para o vetor chave pra poder fazer o deslocamento!

olhem o código 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 valor = chave.charAt(0);

		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;



 //percorrendo a frese para deslocar as letras
for ( i=0; i< frase.lenght(); i++ ){
	
	
aki é que nao consigo  apontar a posição do  contador pra posição chave e deslocar as letras	

}

Creio que este código vai te ajudar.

Ele inverte a orem das palavras. Por exemplo se você colcar BRASIL ele vai imprimir LISARB

Acho que o caminho é este… mais alguns ajustes e você consegue o que o seu prof pediu

[code]
public class ManipulandoString {
String [] nomes ={“Edu”,“Pedro”,“Jose”,“Jaco”,“Ultimo”};

ManipulandoString(){
   this.manipulaPalavras();
}

public void manipulaPalavras(){

    for(int i =nomes.length-1 ; i>=0 ; i--){
        for(int p=nomes[i].length()-1 ;p>=0;p--){
                System.out.print(nomes[i].charAt(p));
            }
        System.out.print(" ,");
            
    }
}


public static void main(String[] args) {
    ManipulandoString x = new ManipulandoString();
}

}[/code]

Pelo que eu entendi do seu código, não seria adequado utilizar um vetor pra armazenar a frase, porque a depender do número que vier na chave você pode extrapolar o tamanho do vetor e vai acontecer um null exception. Aconselho a voce tentar utilizar ArrayList, que além de não ter esse problema com o tamanho, permite você apontar a posição diretamente do que você quer adicionar.

Oi,

Fiz algumas alterações no seu código (se me permite) e ficou.:

[code]String
ls_frase = JOptionPane.showInputDialog(“entre com o nome”),
ls_chave = JOptionPane.showInputDialog(“entre com a chave”);

String[]
ls_vt_frase = new String[new Integer(ls_chave)],
ls_vt_chave = new String[ls_chave.length()];

int
ln_valor_chave = 0,
cont = 0;

for (int ln = 0; ln < ls_vt_chave.length; ln++) {

ln_valor_chave = Integer.parseInt(""+ls_chave.charAt(ln));
		
for (int ln_1 = 0; ln_1 < ln_valor_chave; ln_1++) {
			
	ls_vt_frase[cont++] = ""+ls_frase.charAt(ln);
}

}

for (int start = 0; start < ls_vt_frase.length && ls_vt_frase[start] != null; start++) {
System.out.println(ls_vt_frase[start]);
}[/code]

Não sei se era exatamente isso que você gostaria, mais a saida foi isso.:

[code]Nome.: lina
Chave.: 1234

l
i
i
n
n
n
a
a
a
a[/code]

Tchauzin!

oi lina, obrigado pela resposta, mas é diferente:

vamos supor que tenho uma vetor: ABCDEFGHIJKLMOPQRSTUVZ

aí eu entro com uma string: CASA e uma chave: 2538

entao o programa teria que me retornar isso: O “C” deslocava 2 casas e viraria: E
O “A” deslocaria 5 casas e viraria: F -
O “S” deslocaria 3 casas e viraria: V
e último “A” deslocaria 8 casas e viraria: I

me retornando no final do programa a palavra: EFVI

talvez agora voce possa me ajudar! obrigado

[quote=handynoturno]oi lina, obrigado pela resposta, mas é diferente:

vamos supor que tenho uma vetor: ABCDEFGHIJKLMOPQRSTUVZ

aí eu entro com uma string: CASA e uma chave: 2538

entao o programa teria que me retornar isso: O “C” deslocava 2 casas e viraria: E
O “A” deslocaria 5 casas e viraria: F -
O “S” deslocaria 3 casas e viraria: V
e último “A” deslocaria 8 casas e viraria: I

me retornando no final do programa a palavra: EFVI

talvez agora voce possa me ajudar! obrigado[/quote]

Vc poderia usar uma cast para transformar o char em int, somar o deslocamento e transformar ele novamente em char.

[code]int x;
char[] frase;
int[] chave;

for(int i=0;i<char.length;i++)
{
x = (int) frase[i] + chave[i];
frase[i] = (char) x;
}
[/code]

Não testei pra verificar se funciona, mas a idéia básica seria essa.

Stormqueen1990 obrigado, mas a chave tambem esta no vetor o professor quer que eu crie um contardor cuja sua posicação aponte para posição da chave! de uma olhada no posta acima!

Sim, eu li essa parte.
Mas a chave e a frase estão em vetores diferentes, não?

Não entendi muito bem o q vc quis dizer com “um contador cujo valor aponta para a posição onde está a chave”.

stormqueen1990

deixa eu ver se entende! ao percorrer o vetor frase: CASA para deslocar as letras de acordo com a chave, o meu professor me pediu para criar um contador e por exemplo: na hora que o contador valer 1, apontar para o valor que esta na posição 1 da chave. ex: a chave é: 435 a posição 1 da chave tem valor 3, entao na hora que o contador valer 1 ele deve apontar para a posição 1 da chave que esta com valor 3! e aí vai pegar a letra da frase e somar mais 3 posições

entendeu? não sei se soube explicar direito! mas se puder me ajudar agradeço!

ele quer que faça com esse contador!

resumindo: ele nao quer que percorremos o vetor chave, ele quer que percorremos o vetor frase com o laço for, e criamos um contador dentro de laço para apontar o valor do contador para a chave: contador = 1 valor da chave na posição 1 - contador = 2 valor da chave na posição 2 e assim sucessivamente!

dá uma olhada no codigo, só falta fazer essa parte!

obrigado!

Então a chave é fixa, é isso? Um valor randômico ou especificado pelo usuário?

Nesse caso, a idéia básica é a mesma, mas aí vc troca o índice do vetor chave[] de i para x, que seria a variável fixa.

[code]package testesComFile;

/**

  • @author CrOnNoS
    */

public class Testes {

private static String stringSequencia = "ABCDEFGHIJKLMNOPQRSTUVXZ";
private static char sequencia[] = stringSequencia.toCharArray();

public static void main(String[] args) {

	// String que deveria ser lida
	String casa = "CASA";

	// Chave que deveria ser lida
	String chave = "2598";

	String resultadoFinal = "";

	// Esse for anda por cada caractere de "casa" e "chave" e envia cada
	// char ao método que devolverá o respectivo caractere após andar o
	// tanto de casas especificadas como o segundo parâmetro.
	// Cada caracter devolvido será concatenado na String resultadoFinal.
	for (int i = 0; i < casa.length(); i++) {

		resultadoFinal += getCaractereLocomovido(casa.charAt(i), Integer
				.parseInt(String.valueOf(chave.charAt(i))));

	} // for

	System.out.println(resultadoFinal);

}

private static char getCaractereLocomovido(char charactereAtual,
		int numCasasPular) {

	int i = 0;

	// Esse while iniciado em 0 vai comparar os caracteres da "sequencia"
	// com o caracter enviado pelo parâmetro, para o 'i' apontar para a
	// posição onde está o charactereAtual
	while (charactereAtual != sequencia[i])
		i++;

	// Essa soma posiciona o 'i' na "posição do charactereAtual + número de
	// casas a frente onde está o caractere que você quer
	i += numCasasPular;

	// Esse if garante que se o 'i' estiver apontando para uma posição fora
	// do range de 'sequencia', ele deverá voltar ao início. Ou seja, se o
	// vetor sequencia que guarda os char's tiver tamanho 10, e 'i' estiver
	// apontando para 11 (lembrando que um vetor de tamanho 10 vai de 0 a
	// 9),o 'i' passara a apontar para 11 - 10 = 1 que corresponde ao
	// segundo caractere.
	// PS: Repare que nesse exemplo anterior, se 'i' chegar como 25: 25 - 10
	// = 15 e vai dar erro de indexOutOfBound.
	if (i >= sequencia.length)
		i -= sequencia.length;

	return sequencia[i];

} // getCaractereLocomovido

} // class
[/code]

Forma bem simples que pensei aqui levando em consideração seu exemplo.
EDIT: tava meio apressado na hora … comentei agora explicando

stormqueen1990, o usuário entra com os dados frase e chave e os mesmos são colocados em vetores diferentes!
será que voce poderia fazer a parte do codigo onde os indices da frase soma com a chave?

cronos valew pela dica! mas o meu professo é um chato, ele quer que percorremos o vetor “frase” com um laço for e o contador tem que estar dentro deste laço para já ir deslocando de acordo com o valor da chave!

obrigado!

me ajuda galera!

Não entendi exatamente esse “for interno”, no exemplo que fiz, não corresponderia simplismente a colocar o método getCaractereLocomovido internamente no for ao invés de separar em um método separado ?
Se não for isso peço por um help pra me ajudar a entender o que exatamente precisa ser feito ~~ acabei de re-ler o post inteiro e devo estar dexando passar algum ponto importante :confused:

cronos de uma olhada no meu codigo lá em cima e veja essa parte:

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

aki onde o laço percorre a frase pra trocar as letras, o professor quer que coloque um contador que seu indice aponte par o indice da chave! exemplo: contador = 2 aponta para chave indice 2, e se o indice 2 da chave valer 4, aí a letra no qual o indice da frase estar, é somada + 4 e trasnformada em outra letra!

exemplo:

usuário entra:

frase: A B M:

chave: 7 8 4

letra a muda 7 poições => nesse caso o contador valeria 0 que é o primeiro indice da chave!
letra b muda 8 posições
letra m muda 4 posições

é como se fosse uma codificação!

o problema é que eu tenho que fazer nesse código meu! não posso mudar! não posso usar o seu! e os dois tanto a chave como a frase dentro de um vetor ( mas essa parte ja fiz)

e o professor quer que seja com um contador

não sei se eu soube explicar direito anteriormente!

se nao entendeu, me fale que eu vou colocar um codigoo aí acho que vai entender! pq esse aí em cima, é uma modificação do que nós fizemos de um outro codigo que pega uma chave só de um indice!

obrigado!

só pra corrigir uma coisa que disse no post anterior, a chave esta em um vetor e a frase em outra! mas essa parte já esta correta! obrigado

[code]for (int i = 0; i < casa.length(); i++) {

        resultadoFinal += getCaractereLocomovido(casa.charAt(i), Integer  
                .parseInt(String.valueOf(chave.charAt(i))));  

    } // for [/code]

Mas esse ‘i’ não é exatamente esse contador ? afinal ele tá referindo a qual posição do vetor da palavra (casa nesse exemplo) e da chave (chave mesmo) que devem ser lidos.
Com sorte alguém entende antes de mim =P
Mas se der para passar o código que você comentou …

cronos vou dar uma verificada no seu codigo, vou ver se pego algumas ideias e coloco no meu! e depois respondo se deu certo!

Vê se isso te ajuda a fazer o código

public class Codigo
{
  public static void main( String args[] )
  {
    char alfabeto[] = "abcdefghijklmnopqrstuvwxyz".toCharArray(); // Transforma a string do alfabeto em um array de chars
    char palavra[] = "casa".toCharArray(); // Transforma a string digitada pelo usuario "Casa" em um array de chars
    int codigo[] = separar( 9999 );// Transformar int para array de int // Tranforma o codigo em int em um array usando o metodo separar do fim da classe
    
    char novaPalavra[] = new char[ palavra.length ]; // cria o novo array usando o tamanho do array antigo
    
    String ap = new String( palavra ); // cria uma string para imprimir na tela a palavra antiga
    System.out.printf( "%s%n", ap );

    for ( int i = 0 ; i < palavra.length ; i++ ) // Iteração pela palavra
    {
      char current = palavra[i]; // armazena caractere atual
      int index = -1; // inicializa index com valor de erro
      
      for ( int z = 0 ; z < alfabeto.length ; z++ ) // procura index no alfabeto, armazena index com o valor encontrado
      {
        if ( alfabeto[z] == current )
        {
          index = z;
          break;
        }
      }
      
      if ( index + codigo[i] >= alfabeto.length )// Se o index + o codigo for maior que o tamanho do alfabeto ( Exemplo "Z" com codigo 1 )
        novaPalavra[i] = alfabeto[ ( index + codigo[i] ) - alfabeto.length ];
      else
        novaPalavra[i] = alfabeto[ index + codigo[i] ];
      
      System.out.printf( "%s >> %s%n", current, novaPalavra[i] );// Imprime a modificação
    }
    
    String np = new String( novaPalavra );// Cria string para exibição
    System.out.printf( "%s%n", np );
  }
  
  private static int[] separar ( int n )
  {
    String s = String.format( "%d", n );   // Transforma em String
    int[] sp = new int[ s.length() ];   // Cria array de ints
    for ( int a = 0 ; a < s.length() ; ++a )
      sp[a] = Integer.parseInt( s.substring( a, a + 1 ) ); // Passa para int os valores de s usando o metodo substring, da classe java.lang.String
    return sp;
  }
}

abraços[]`s

A saída fica:

casa
c >> l
a >> j
s >> b
a >> j
ljbj