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
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.
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
[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.
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!
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!
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!
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
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!
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 …
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;
}
}