Cifra de Cesar

Estou encontrando dificuldades em implementar o stringbuffer na cifra de cesar. Se alguem puder me ajudar fico grato…

poe o codigo e diz qual a parte que vc está com duvida… é em java ou entender a cifra de césar?

Tenho esse material em anexo tb que pode ajudar explicando com detalhes a cifra de cesar… e use a StringBuilder… ao inves da StringBuffer!

Minha dificuldade é que preciso receber uma string e um valor para deslocar as letras da string. Pelo que eu li na net e no material que tenho, não consigo implemetar…
Se puder me ajudar fico muito grato…e o material que você mandou é otimo, mas não é o que preciso… :smiley:

[quote]charAt(3) Retorna o caracter localizado no índice especificado
concat() Anexa uma String ao final de outra (?+? também funciona)
equalsIgnoreCase() Determina a igualdade de duas Strings, ignorando a caixa, true ? false
length() Retorna o numero de caracteres de uma string
replace(?x?,?Z?) Substitui as ocorrências de um caracteres por um outro caracter
substring(begin,end) Retorna uma parte de uma string
toLowerCase() Retorna uma String com os caracteres em minusculo.(caixa baixa)
toString() Retorna o valor de uma String ou método.
toUpperCase() Retorna uma String com os caracteres em maiúsculo(caixa alta).
trim() Remove os espaços em branco no inicio ate o fim de Strings[/quote]

sao os metodos da class String veja se agora vc ja consegue! implementar algo hehe… A questao que quero guia-lo para que aprenda hehe, eu poderia postar um codigo que fiz semana passada para um trabalho na faculdade… usei a cifra de julio cesar, mais veja se agora ja consegue implementar algo… e se tiver duvida vai postando o codigo hehe

Beleza, valew mesmo, Continuarei tentando…Estou a uma semana nesta etapa e nao consigo fazer rodar, e hoje é o prazo, por isso postei minha duvida…
Obrigado pela atenção…Abraços

public class Cesare {
public class StringBuffer {

    public static void main(String[] args) {            
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < sb.length; i++) {
		char caracter = sb1.charAt(i);
	}
      
    }
}

}

basicamente foi nisso q consegui pensar,se puder me ajudar mais…agradeço

so uma pergunta por que usar StringBuffer? implemente veja se os dados estao sendo criptografo segundo a cifra!! hehe o caminho usando StringXXX é esse…

Sim,sim, como te disse, estou a uma semana tentando,heheh, sem sucesso, nao sou muito bom em ser auto didata,mas to tentando…Mas preciso pra hoje ate a noite…Por isso q postei,por nao encontrar uma solução…Aloha :oops:

Como te disse, estou fazendo a cifra de cesar, e preciso receber como parametro uma string e um deslocamento, para mudar os char…valew

uma maneira tradicional vc recebe a string coloca em um array e dai vc pode mudar apenas as posicoes e criar um novo array cifrado… e se vc transportar o dado… quando ele chegar ao lugar de destino vc desofra e tem o resultado… existe varias maneira de implementa… essa mesmo do array, dar para implementar praticamente em todas as linguagens!

Com a ajuda de um amigo, ele fez este,mas no z retorna z,se puder me ajudar…

import java.lang.String;
public class Cesar {
int num;

    public String decifrando(String palavra, int deslocamento){
        int j;
        int i;
        
        StringBuffer alfabeto= new StringBuffer("abcdefghijklmnopqrstuvwxyz");
        StringBuffer aux= new StringBuffer(palavra);
        
        for( j=0; j < palavra.length()-1; j++){
            for( i=0;i<alfabeto.length()-1; i++){
                if ((palavra.charAt(j))==(alfabeto.charAt(i))){
                    aux.setCharAt(j, alfabeto.charAt(i+deslocamento));
                }
            }
        }return aux.toString();
    }
}

>

hummm… se bem entendo a cifra de cesar apenas consiste em deslocar o alfabeto por um deslocamento k escolhido. Depois ha que substituir a letra da palavra original pela letra a que ela corresponde no alfabeto deslocado. Ha necessidade de uma analise da letra que não estão sendo feita.


public String cifrar (String original, int k){
String alfabeto = "abcdefghijklmnopqrstuvwxyz";
// deslocar de k
String deslocado = alfabeto.subString(k) + alfabeto.subString(0,k);

// cifrar
StringBuilder cifra = new StringBuilder ();
for (int i =0; i < original.length ; i++){
       cifra.append(deslocado.getChatAt( original.getCharAt(i) - 'a'));
}

return cifra.toString();
}

original.getCharAt(i) - ‘a’ significa : obtém o caracter no indice i e subtrar o valor de a. Portanto, se era ‘a’ o resultado é zero. E o novo caracter será o primeiro da string deslocada. Se era ‘b’ será 1 e o caracter escolhido será o segundo da string deslocada , etc…

String deslocado = alfabeto.subString(k) + alfabeto.subString(0,k);

a substring é o meu aux?

nao entendi,falta fazer isto ou esteé so um exemplo?

[quote=kidboladao] String deslocado = alfabeto.subString(k) + alfabeto.subString(0,k);

a substring é o meu aux?
[/quote]

Não. O seu aux seria a variável cifra.
O codigo que eu escrevi deveria funcionar tal como está (mas eu não testei ).
O ponto é que o seu codigo não testa se a letra é a, b, c, d , … e isso precisa ser feito em algum ponto.

[quote=sergiotaborda][quote=kidboladao] String deslocado = alfabeto.subString(k) + alfabeto.subString(0,k);

a substring é o meu aux?
[/quote]

Não. O seu aux seria a variável cifra.
O codigo que eu escrevi deveria funcionar tal como está (mas eu não testei ).
O ponto é que o seu codigo não testa se a letra é a, b, c, d , … e isso precisa ser feito em algum ponto.[/quote]

Obrigado pela sua atenção…O seu nao compílo mas me ajudou muito…Valeu mesmo
Irei aprimorar o meu,aloha

Pra mim compilou, desculpa aii, já faz um tempo esse tópico, mas é que estava com uma dúvida!

E pra descompilar na mesma classe, como eu faria?

public class Caesar {
    public static String cifrar(String original, int k) {        
        String alfabeto = "abcdefghijklmnopqrstuvwxyz";
                   
        // deslocar de k  
        StringBuilder resultado = new StringBuilder();
        for (char ch : original.toLowerCase().toCharArray())
        {
            if (ch == ' ') {
                resultado.append(' ');
                continue;
            }
            
            int chr = ch - alfabeto.charAt(0);
            chr = (chr + k) % alfabeto.length();
            if (chr < 0)
                chr += alfabeto.length();
            chr += alfabeto.charAt(0);
            resultado.append((char)chr);
        }
        return resultado.toString();
    }
    
    public static void main(String [] args)
    {
        String texto = "a vaca foi a vila de zimbros";
        //Imprime o texto que será cifrado
        System.out.println(texto);
        //Cifra
        String resultado = cifrar(texto, 3);        
        System.out.println(resultado);
        
        //Desfaz o processo.
        System.out.println(cifrar(resultado, -3));
    }
}

Quando li ontem pensei na mesma linha de raciocínio do vini. Mas não tinha pensado em tratar os espaços.
Aí vão duas alternativas à solução dele, uma usando a string alfabeto e outra passando os valores diretamente.

[code]public class Caesar {
public static String cifrar(String original, int k) {
String alfabeto = “abcdefghijklmnopqrstuvwxyz”;
StringBuilder cifra = new StringBuilder();
for (char c : original.toLowerCase().toCharArray()) {
if (c == ’ ‘) {
cifra.append(’ ');
continue;
}
int ci = (c + 7 + k) % alfabeto.length() + alfabeto.charAt(0);
cifra.append((char) ci);
}
return cifra.toString();
}

public static String cifrar2(String original, int k) {
StringBuilder cifra = new StringBuilder();
for (char c : original.toLowerCase().toCharArray()) {
if (c == ’ ‘) {
cifra.append(’ ');
continue;
}
int ci = (c + 7 + k) % 26 + ‘a’;
cifra.append((char) ci);
}
return cifra.toString();
}

public static void main(String[] args) {
String texto = “a vaca foi a vila de zimbros”;
// Imprime o texto que será cifrado
System.out.println(texto);
// Cifra
String resultado = cifrar2(texto, 3);
System.out.println(resultado);

  // Desfaz o processo.
  System.out.println(cifrar2(resultado, -3));

}
}[/code]

Não sei, mas ainda gosto mais da solução do Sérgio.

Pergunta e se eu quiser imprimir em Uppercase os caracteres digitados em caixa alta?