Deslocamento variavel [RESOLVIDO]

27 respostas
H

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

}

27 Respostas

edufera10

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

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();
    }

}
J

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.

lina

Oi,

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

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]);
}

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

Nome.: lina
Chave.: 1234

l
i
i
n
n
n
a
a
a
a

Tchauzin!

H

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

Stormqueen1990
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

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

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

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

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

H

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!

Stormqueen1990

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”.

H

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!

Stormqueen1990

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.

CrOnNoS
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

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

H

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!

H

me ajuda galera!

CrOnNoS

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:

H

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!

H

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

CrOnNoS
for (int i = 0; i < casa.length(); i++) {  
  
            resultadoFinal += getCaractereLocomovido(casa.charAt(i), Integer  
                    .parseInt(String.valueOf(chave.charAt(i))));  
  
        } // for

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 ....

H

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

Polimorphism

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

Polimorphism

A saída fica:

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

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]

}

Polimorphism

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 );

H

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!

Polimorphism

=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

H

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!

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

//ficou assim

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

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!

Polimorphism

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

H

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

Polimorphism

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

Criado 19 de agosto de 2009
Ultima resposta 24 de ago. de 2009
Respostas 27
Participantes 7