Exercicios - Java Cifra de Cesar [RESOLVIDO]
Galera estou com dois problema em meu cod.
Minha int chave, tem que armazenar no vetor args. Olha essa explicação mais não entendi.
" Você está invertendo a ordem, ao invés de inicializar a aplicação com o parâmetro fornecido, primeiro você inicializa ela para depois solicitar ao usuário o parâmetro, nesse caso a chave. " Como fazer isso no arguments? do Eclipse
E a segunda quando digita uma frase -- Ela tem separar Maiúscula e minuscula --- O que você digita em Maiúscula fica em Maiúscula na criptografada e com a minuscula o mesmo jeito. ( não tenho a minima ideia de como fazer isso )
Tipo assim:
TESTE teste TESTE ------ criptografando -------- UEPUE uepue UEPUE.
Podem me ajudar?
Obrigado a todos!
Uso o eclipse para fazer isso.
Código:
--------------------- Meu código como está --------------------
import java.util.Scanner;
public class CesarYuriFernando {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
String CP;
System.out.println("Digite seu texto aqui:");
String texto = entrada.nextLine();
System.out.println("Digite sua chave aqui:");
int chave = entrada.nextInt();
int i = args.length;
if ( i <= 0) {
System.out.println("Não foi informado uma chave" );
}
if (i == 1) {
CP = criptografa ( texto, chave);
System.out.printf("\nTexto criptografado:\n");
System.out.printf("%s", CP);
}
if (i > 1) {
System.out.println("Você digitou dois numeros");
}
}
public static String criptografa(String texto, int chave) {
int i, n = texto.length();
String saux = "";
for (i=0; i<n; i++) {
saux = saux + (char)(texto.charAt(i) + chave);
}
return(saux);
}
}
Yuri Silva
Curtidas 0
Respostas
Tiago
20/11/2012
Pelo o que eu entendi, a pessoa que te explicou aquilo quer que você receba o parâmetro depois de criado. Talvez você peça para o usuário digitar o valor?!
Sobre separar maiúsculas de minúsculas, usa regex pra isto. Se eu não me engano, a expressão regular para procuar só pelas maiúsculas é [A-Z]. Não lembro bem, mas tenho certeza que regex irá ser a sua solução!
Tem um artigo aqui que você pode dar uma lida pra ter uma introdução a Expressão Regulares: [url="http://javafree.uol.com.br/artigo/5090/Introducao-a-Expressoes-Regulares-com-Java.html"]Introdução a Exp. Regulares[/url]
Também te servirá: [url="http://www.regular-expressions.info/brackets.html"] Site [/url]
Qualquer dúvida, estou por aqui!
Abraço!
GOSTEI 0
Tiago Azevedo
20/11/2012
Sou novo eh um trabalho para faculdade e só temos duas semana de aulas. O Prof. já passou 1 trabalho desses.
Ele quer que façamos a separação de acordo com a table ASCII, mais não entendi muito bem.
Eu tentei fazer uma estrutura logica para isso mais acho que nao foi muito bem. Esta dando line Break, oque é isso?
import java.util.Scanner;
public class cesar {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
String CP;
int chave, i = 0;
System.out.println("Digite seu texto aqui:");
String texto = entrada.nextLine();
System.out.println("Digite sua chave aqui:");
chave = entrada.nextInt();
while (chave>26){
chave = chave - 26;
}
i = args.length;
if ( i <= 0) {
System.out.println("Não foi informado uma chave" );
}
if (i == 1) {
CP = criptografa ( texto, chave);
System.out.printf("\nTexto criptografado:\n");
System.out.printf("%s", CP);
}
if (i > 1) {
System.out.println("Você digitou dois numeros");
}
}
public static String criptografa (String texto, int chave){
StringBuilder textoCifrado = new StringBuilder();
int tamanhoTexto = texto.length();
for(int c=0; c < tamanhoTexto; c++){
int letraCifradaASCII = ((int) texto.charAt(c)) + chave;
if (texto.charAt(c) > 97 && texto.charAt(c) < 122 ) {
while (letraCifradaASCII > 122) {
letraCifradaASCII = 97; }
}
if (texto.charAt(c) > 65 && texto.charAt(c) < 60 ) {
while (letraCifradaASCII > 90) {
letraCifradaASCII = 65;
}
}
textoCifrado.append( (char)letraCifradaASCII );
}
return textoCifrado.toString();
} }
GOSTEI 0
Tiago
20/11/2012
Em qual linha?
GOSTEI 0
Tiago Azevedo
20/11/2012
NESTE > 65/64 if (texto.charAt(c) > 97 && texto.charAt(c) < 122 ) {
Nesta também > while (chave>26){
Você testou o programa que fiz?
GOSTEI 0
Tiago Azevedo
20/11/2012
Mudei a logica para... deixar = o ACSII
if (texto.charAt(i) > 97 && texto.charAt(i) < 122 ) {
while (saux + chave > 122) {
totalm = saux + chave;
menosm = totalm - 122;
saux = 96+menosm;
}
}
if (texto.charAt(i) > 65 && texto.charAt(i) < 90 ) {
while (saux + chave > 90) {
saux = 65+chave;
totalM = saux + chave;
menosM = totalM - 90;
saux = 64+menosM;GOSTEI 0
Tiago
20/11/2012
Resolvido, então?!
GOSTEI 0
Tiago Azevedo
20/11/2012
Esta compilando agora, porém quando digito uma chave maior que 3 o programa não me retorna nada.
import java.util.Scanner;
public class Yuri_CESAR {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
String CP;
int chave, i = 0;
System.out.println("Digite seu texto aqui:");
String texto = entrada.nextLine();
System.out.println("Digite sua chave aqui:");
chave = entrada.nextInt();
while (chave>26){
chave = chave - 26;
}
i = args.length;
if ( i <= 0) {
System.out.println("Não foi informado uma chave" );
}
if (i == 1) {
CP = criptografa ( texto, chave);
System.out.printf("\nTexto criptografado:\n");
System.out.printf("%s", CP);
}
if (i > 1) {
System.out.println("Você digitou dois numeros");
}
}
public static String criptografa (String texto, int chave){
StringBuilder textoCifrado = new StringBuilder();
int tamanhoTexto = texto.length();
int totalm, totalM, menosm, menosM;
for(int c=0; c < tamanhoTexto; c++){
int letraCifradaASCII = ((int) texto.charAt(c)) + chave;
if (((int) texto.charAt(c)) > 97 && ((int) texto.charAt(c)) < 122 ) {
while (((int) texto.charAt(c)) + chave > 122) {
totalm = texto.charAt(c) + chave;
menosm = totalm - 122;
letraCifradaASCII = 96+menosm;
}
}
if (((int) texto.charAt(c)) > 65 && ((int) texto.charAt(c)) < 90 ) {
while (((int) texto.charAt(c)) + chave > 90) {
totalM = texto.charAt(c) + chave;
menosM = totalM - 90;
letraCifradaASCII = 64+menosM;
}
}
textoCifrado.append( (char)letraCifradaASCII );
}
return textoCifrado.toString();
} }
GOSTEI 0
Tiago
20/11/2012
Opa!
Dei uma melhorada na tua lógica:
A não ser que você esteja rodando a classe pela linha de comando e queira pegar a chave pelo argumento... seria i = args.lentgh(). Acredito que não, né?!
Sobre os ifs, pra ele chegar alí, o usuário vai ter q digitar alguma coisa. Então, ficou melhor essa lógica q fiz. Pq a chave e o i já são inicializados com 0.. entende? Se for maior que 9 -> 2 números.
Só que, a partir do número 8 está dando um loop infinito neste while:
Coloca alguma saída nele e você vai ver que estou falando a verdade. Dá uma melhorada na lógica da tua criptografia aí..
Abraço!
i = chave;
if ( i == 0) {
System.out.println("Não foi informado uma chave" );
}
else if (i < 10) {
CP = criptografa ( texto, chave);
System.out.printf("\nTexto criptografado:\n");
System.out.printf("%s", CP);
}
else {
System.out.println("Você digitou dois numeros");
}
if (((int) texto.charAt(c)) > 97 && ((int) texto.charAt(c)) < 122 ) {
while (((int) texto.charAt(c)) + chave > 122) {
totalm = texto.charAt(c) + chave;
menosm = totalm - 122;
letraCifradaASCII = 96+menosm;
}
} GOSTEI 0
Tiago Azevedo
20/11/2012
Então hoje conversei com meu prof. e me instruiu a dar a chave pela linha de comando e a logica vou dar uma melhorada mais tarde eu posto como ficou.
GOSTEI 0
Tiago
20/11/2012
Ok! :)
GOSTEI 0
Tiago Azevedo
20/11/2012
Amigo como prometido, o programa quase 100%.
Agora estou tendo 2 problemas.
1ª Esta imprimindo em numeros ( rsrsrsrsrs )
Estou tentando tranformar o Inteiro para String sem sucesso.
Uso o System.out.print(Para imprimir sem pular linha)
2ºComo colocarei para imprimir pulando os espaços quando ouver?
Já foi uma vitória até chegar aqui :), Logica quase 100%
import java.util.Scanner;
public class T01_Cesar {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("A chave para ecriptação não informado");
} else if (args.length > 1) {
System.out.println("Foi informado mais du um argumento");
} else {
int k = Integer.parseInt(args[0]);
//Loop para chave ficar entre 0-25
while (k >= 26) {
k=k-26;
}
Scanner entrada = new Scanner(System.in);
System.out.println("Informe a mensagem a ser criptografada:");
String texto = entrada.nextLine();
int totalm, totalM, menosM, menosm, letraCifradaASCII;
for(int i = 0; i < texto.length(); i++){
// Tratamento Letras minusculas
if ((int) texto.charAt(i) >= 97 && (int) texto.charAt(i) <= 122 ) {
if ((int) (texto.charAt(i) + k) > 122) {
totalm = (texto.charAt(i) + k);
menosm = totalm - 122;
letraCifradaASCII = 96+menosm;
System.out.print(letraCifradaASCII);
} // Caso nao precisa de tratamento fazer isso
else {
letraCifradaASCII = (int) (texto.charAt(i) + k);
System.out.print(letraCifradaASCII);
}
}
// Tratamento Letras Maiusculas
if ((int) texto.charAt(i) >= 65 && (int) texto.charAt(i) <= 90 ) {
if ((int) (texto.charAt(i) + k) > 90) {
totalM = (texto.charAt(i) + k);
menosM = totalM - 90;
letraCifradaASCII = 64+menosM;
System.out.print(letraCifradaASCII);
}
// Caso nao precisa de tratamento fazer isso
else {
letraCifradaASCII = (int)(texto.charAt(i) + k);
System.out.print(letraCifradaASCII);
}
// CONSEGUIIIIIIIIIIIII depois de muito esforço!
}
}}
}
}
GOSTEI 0
Tiago
20/11/2012
Não entendi direito sobre o espaço que você falou. Se ele achar espaço no texto, pular este espaço para o próximo caracter?
Tu podes utilizar o regex para criar uma nova string sem esses espaços. É a primeira coisa que me vêm a cabeça agora.
Sobre a impressão em letras, você quer q seja impresso o texto? Se sim, imprime a variável "texto" ao invés da criptografada.
GOSTEI 0
Tiago Azevedo
20/11/2012
pronto estou conseguindo imprimir assim
System.out.print((char)(letraCifradaASCII));
mais oque ocorre.
You Criptografando
Aparacede assim!
PxcChiksheihkjd (ele não da espaço entendeu?)
OU assim
YURI FF -- ele escreve assim CyvmJJ chave 4
GOSTEI 0
Tiago Azevedo
20/11/2012
Pronto achei a resposta
// Espaço
if ((int) texto.charAt(i) == 32 ) {
letraCifradaASCII = 32;
System.out.print((char)(letraCifradaASCII));
fazendo essa estrutura!
GOSTEI 0
Tiago
20/11/2012
[quote="wkout"]Pronto achei a resposta
// Espaço
if ((int) texto.charAt(i) == 32 ) {
letraCifradaASCII = 32;
System.out.print((char)(letraCifradaASCII));
fazendo essa estrutura!
Boa garoto! :)
GOSTEI 0
Tiago Azevedo
20/11/2012
Se quiser pode fechar o topico e obrigado pela ajuda cara , vlw mesmo!
GOSTEI 0
Tiago
20/11/2012
[quote="wkout"]Se quiser pode fechar o topico e obrigado pela ajuda cara , vlw mesmo!
Disponha :) Só preciso que tu edite o teu primeiro post e coloque no título da mensagem [RESOLVIDO]. Isto vai ajudar!
Abraço e bons estudos!
GOSTEI 0