GARANTIR DESCONTO

Fórum Exercicios - Java Cifra de Cesar [RESOLVIDO] #569811

20/11/2012

0

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

Yuri Silva

Responder

Posts

20/11/2012

Tiago

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!
Responder

Gostei + 0

20/11/2012

Tiago Azevedo

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

	      
	

 
Responder

Gostei + 0

20/11/2012

Tiago

Em qual linha?
Responder

Gostei + 0

20/11/2012

Tiago Azevedo

NESTE > 65/64 if (texto.charAt(c) > 97 && texto.charAt(c) < 122 ) { Nesta também > while (chave>26){ Você testou o programa que fiz?
Responder

Gostei + 0

20/11/2012

Tiago Azevedo

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

Gostei + 0

21/11/2012

Tiago

Resolvido, então?!
Responder

Gostei + 0

22/11/2012

Tiago Azevedo

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

Responder

Gostei + 0

22/11/2012

Tiago

Opa! Dei uma melhorada na tua lógica:
     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");    
            }     
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:

   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;  
             }    
            }    
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!
Responder

Gostei + 0

22/11/2012

Tiago Azevedo

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

Gostei + 0

22/11/2012

Tiago

Ok! :)
Responder

Gostei + 0

22/11/2012

Tiago Azevedo

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!

		               
		               
		               
			}
		}}
	}
}
Responder

Gostei + 0

22/11/2012

Tiago

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

Gostei + 0

22/11/2012

Tiago Azevedo

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
Responder

Gostei + 0

22/11/2012

Tiago Azevedo

Pronto achei a resposta // Espaço if ((int) texto.charAt(i) == 32 ) { letraCifradaASCII = 32; System.out.print((char)(letraCifradaASCII)); fazendo essa estrutura!
Responder

Gostei + 0

22/11/2012

Tiago

[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! :)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar