Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: pinalo en 12 de Octubre 2014, 18:25
-
Hola que tal, un saludo, tengo un pequeño atasco, este es un proyecto de cifrado de Vigenere, el cual cifra y descifra, pero mi profesor quiere que también lea y escriba desde .txt, no se como podría incoorporarlo, me comento que con BufferReader y BufferWriter lo hacia, y al parecer en mi código con el import.java.io* importe ya todo, pero no se como hacerle para que leea un archivo TXT, alguien podría ayudarme,
Grracias :)
Este es el codigo completo !
/**
* @author Luis Enrique Piña Juárez
*/
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Vigenere {
char [][]matriz=new char [26][26];
String criptograma=null;
/**
* Metodo constructor
* entrada:ninguna
* salida:ninguna
* descripcion:inicializa una matriz cuadrada de n X n donde n es la cantidad de letras
* que estemos ocupando para nuestro alfabeto
*/
public Vigenere()
{
int codigo=65;//valor de la A mayuscula
int interno=0;
//empezamos a llenar por renglones
for(int i=0;i<26;i++)
{
//con interno llenaremos los renglones y con codigo las columnas
interno=codigo;
//Nuestro alfabeto tendra 26 letras
for(int j=0;j<26;j++)
{
matriz[i][j]=(char)interno;
interno++;
//preguntamos si llegamos a la Z
if(interno>90)
{
//SI es asi regresa y comienza de nuevo con A
interno=65;
}
}
codigo++;
//Preguntamos si llegamos a la Z
if(codigo>90)
{
//SI es asi regresa y comienza con la A
codigo=65;
}
}
}
/**
*Funcion quitaEspacios
*entrada:una cadena de texto
*salida:una cadena de texto
*descripcion:Funcion que nos quita los espacios en blanco,se ingresa una cadena problema
*que contiene espacios en blanco y devuelve una cadena problema sin espacios en blanco
*/
String quitaEspacios(String problema)
{
char []auxiliar=problema.toCharArray();
problema="";
for(int i=0;i<auxiliar.length;i++)
{
if(auxiliar[i]!=' ')
{
problema+=auxiliar[i];
}
}
return problema;
}
/**
* Funcion completa
*/
public String completa(String faltante,int tamano)
{
int diferencia=0,indice=0;
if(faltante.length()!=tamano)
{
//preguntamos si es menor la clave al mensaje
if(faltante.length()<tamano)
{
//Tenemos que acompletar
//obtenemos la diferencia
diferencia=tamano-faltante.length();
while(diferencia!=0)
{
faltante+=faltante.charAt(indice);
//preguntamos si es el final de la cadena
if(indice==(faltante.length()-1))
{
indice=-1;
}
indice++;
diferencia--;
}
}
else
{
//Tenemos que acortar
//obtenemos lo que nos sobra
diferencia=faltante.length()-tamano;
//cortamos la cadena
faltante=faltante.substring(0, faltante.length()-diferencia);
}
}
return faltante;
}
/**
* Funcion getCaracter
* entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
* conforma el mensaje,el segundo representa la k-esima que conforma al clave
* salida:un argumento de tipo char,que representa la interseccion entre las columnas
* del mensaje y de la clave
* descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
* los renglones el argumento clave y obtiene su posicion en base a eso identfica
* el caracter y lo retorna
*/
char getCaracter(char mensaje,char clave)
{
//variables auxiliares
int posicionMensaje=0,posicionClave=0,indice=0;
boolean encontrado=false;
//buscamos el caracter del mensaje en la columna del criptograma
while(indice<26 && encontrado==false)
{
if(matriz[0][indice]==mensaje)
{
encontrado=true;
posicionMensaje=indice;
}
indice++;
}
encontrado=false;
indice=0;
//buscamos el caracter en el renglon de las claves
while(indice<26 && encontrado==false)
{
if (matriz[indice][0]==clave)
{
encontrado=true;
posicionClave=indice;
}
indice++;
}
//Nos aseguramos que hayamos obtenido algun resultado
return matriz[posicionClave][posicionMensaje];
}
/**
* Metodo cifra
* entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
* segundo la clave que se usara
* salida:una cadena que representa el criptograma
* descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
*/
public String cifra(String mensaje,String clave)
{
criptograma=" ";
//Quitamos espacios en blanco de la clave y del mensaje
mensaje=quitaEspacios(mensaje);
clave=quitaEspacios(clave);
//Convertimos a mayusculas el mensaje y la clave
mensaje=mensaje.toUpperCase();
clave=clave.toUpperCase();
//Completamos el tamano de la clave al tamano del mensaje
clave=completa(clave,mensaje.length());
//aplicamos el algoritmo de Vigenere
for(int i=0;i<mensaje.length();i++)
{
//Obtenemos el caracter segun la matriz de vigenere
//que es la interseccion de la columna del mensaje y la columna
//de las claves y la concatenamos con el criptograma
criptograma+=getCaracter(mensaje.charAt(i),clave.charAt(i));
}
return criptograma;
}//fin del metodo cifra
/**
* Funcion getCaracter
* entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
* conforma el mensaje,elsegundo representa la k-esima que conforma la clave
* salida:un argumento de tipo char,que representa la interseccion entre las columnas
* del mensaje y de la clave
* descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
* los renglones el argumento clave y obtiene su posicion en base a eso identfica
* el caracter y lo retorna
*/
char getCaracterDescifrado(char cripto,char clave)
{
//variables auxiliares
int posicionMensaje=0,posicionClave=0,indice=0;
boolean encontrado=false;
//buscamos el caracter del mensaje en la columna del criptograma
while(indice<26 && encontrado==false)
{
if(matriz[0][indice]==clave)
{
encontrado=true;
posicionClave=indice;
}
indice++;
}
encontrado=false;
indice=0;
//buscamos el caracter en el renglon de las claves
while(indice<26 && encontrado==false)
{
if (matriz[indice][posicionClave]==cripto)
{
encontrado=true;
posicionMensaje=indice;
}
indice++;
}
//Nos aseguramos que hayamos obtenido algun resultado
return matriz[0][posicionMensaje];
}
/**
* Metodo descifra
* entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
* segundo la clave que se usara
* salida:una cadena que representa el criptograma
* descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
*/
public String descifra(String mensaje,String clave){
criptograma=" ";
//Quitamos espacios en blanco de la clave y del mensaje
mensaje=quitaEspacios(mensaje);
clave=quitaEspacios(clave);
//Convertimos a mayusculas el mensaje y la clave
mensaje=mensaje.toUpperCase();
clave=clave.toUpperCase();
//Completamos el tamano de la clave al tamano del mensaje
clave=completa(clave,mensaje.length());
//aplicamos el algoritmo de Vigenere
for(int i=0;i<mensaje.length();i++)
{
//Obtenemos el caracter segun la matriz de vigenere
//que es la interseccion de la columna del mensaje y la columna
//de las claves y la concatenamos con el criptograma
criptograma+=getCaracterDescifrado(mensaje.charAt(i),clave.charAt(i));
}
return criptograma;
}//fin del metodo cifra
/****************************************************/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//try{
int op;
do{
InputStreamReader teclado=new InputStreamReader(System.in);
BufferedReader buffer=new BufferedReader(teclado);
/**
* Variables auxiliares para interactuar con el usuario
**/
String mensaje_claro;
String clave;
System.out.println("Elige una opcion");
System.out.println("1:-cifrar");
System.out.println("2:-descifrar");
op=Integer.parseInt(buffer.readLine());
switch(op){
case(1):
System.out.println("Introduzca el mensaje a cifrar: ");
mensaje_claro=buffer.readLine();
mensaje_claro=mensaje_claro.trim();
System.out.println("Introduzca la llave: ");
clave=buffer.readLine();
Vigenere metodo=new Vigenere();
System.out.println("criptograma:"+metodo.cifra(mensaje_claro,clave));
break;
case 2:
System.out.println("Introduzca el criptograma");
mensaje_claro=buffer.readLine();
mensaje_claro=mensaje_claro.trim();
System.out.println("Introduzca la llave");
clave=buffer.readLine();
// Instanciacion de la clase
Vigenere metodo1=new Vigenere ();
System.out.println("Mcla:"+metodo1.descifra(mensaje_claro,clave));
break;
default:
System.out.print("Seleccion incorrecta" );
}
}while(op !=2);
}
}
-
Hola, el uso de lectura y escritura desde archivos txt con Java no es demasiado complicado, aunque si es la primera vez que se hace sí puede resultar un poco lío ::)
Pienso que viendo este ejemplo puedas incorporar el tratamiento con archivos sin demasiadas complicaciones:
https://www.aprenderaprogramar.com/foros/index.php?topic=712
Si además de este quieres ver otra explicación que también es buena tienes esta:
https://www.aprenderaprogramar.com/foros/index.php?topic=1154
Creo que con esto puedes intentarlo, si escribiendo el código hay algo que no te salga pega el código y trataremos de revisarlo para decirte dónde está el problema.
Saludos
-
Según Yo me quedo así :(
Pero me da una excepción,
y lo peor es que es para hoy D:
/**
* @author Luis Enrique Piña Juárez
*/
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
public class Vigenere {
char [][]matriz=new char [26][26];
String criptograma=null;
/**
* Metodo constructor
* entrada:ninguna
* salida:ninguna
* descripcion:inicializa una matriz cuadrada de n X n donde n es la cantidad de letras
* que estemos ocupando para nuestro alfabeto
*/
public Vigenere(){
int codigo=65;//valor de la A mayuscula
int interno=0;
//empezamos a llenar por renglones
for(int i=0;i<26;i++){
//con interno llenaremos los renglones y con codigo las columnas
interno=codigo;
//Nuestro alfabeto tendra 26 letras
for(int j=0;j<26;j++){
matriz[i][j]=(char)interno;
interno++;
//preguntamos si llegamos a la Z
if(interno>90){
//SI es asi regresa y comienza de nuevo con A
interno=65;
}
}
codigo++;
//Preguntamos si llegamos a la Z
if(codigo>90){
//SI es asi regresa y comienza con la A
codigo=65;
}
}
}
/**
*Funcion quitaEspacios
*entrada:una cadena de texto
*salida:una cadena de texto
*descripcion:Funcion que nos quita los espacios en blanco,se ingresa una cadena problema
*que contiene espacios en blanco y devuelve una cadena problema sin espacios en blanco
*/
String quitaEspacios(String problema){
char []auxiliar=problema.toCharArray();
problema="";
for(int i=0;i<auxiliar.length;i++){
if(auxiliar[i]!=' '){
problema+=auxiliar[i];
}
}
return problema;
}
/**
* Funcion completa
*/
public String completa(String faltante,int tamano){
int diferencia=0,indice=0;
if(faltante.length()!=tamano){
//preguntamos si es menor la clave al mensaje
if(faltante.length()<tamano){
//Tenemos que acompletar
//obtenemos la diferencia
diferencia=tamano-faltante.length();
while(diferencia!=0){
faltante+=faltante.charAt(indice);
//preguntamos si es el final de la cadena
if(indice==(faltante.length()-1)){
indice=-1;
}
indice++;
diferencia--;
}
}
else{
//Tenemos que acortar
//obtenemos lo que nos sobra
diferencia=faltante.length()-tamano;
//cortamos la cadena
faltante=faltante.substring(0, faltante.length()-diferencia);
}
}
return faltante;
}
/**
* Funcion getCaracter
* entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
* conforma el mensaje,el segundo representa la k-esima que conforma al clave
* salida:un argumento de tipo char,que representa la interseccion entre las columnas
* del mensaje y de la clave
* descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
* los renglones el argumento clave y obtiene su posicion en base a eso identfica
* el caracter y lo retorna
*/
char getCaracter(char mensaje,char clave){
//variables auxiliares
int posicionMensaje=0,posicionClave=0,indice=0;
boolean encontrado=false;
//buscamos el caracter del mensaje en la columna del criptograma
while(indice<26 && encontrado==false){
if(matriz[0][indice]==mensaje){
encontrado=true;
posicionMensaje=indice;
}
indice++;
}
encontrado=false;
indice=0;
//buscamos el caracter en el renglon de las claves
while(indice<26 && encontrado==false){
if (matriz[indice][0]==clave){
encontrado=true;
posicionClave=indice;
}
indice++;
}
//Nos aseguramos que hayamos obtenido algun resultado
return matriz[posicionClave][posicionMensaje];
}
/**
* Metodo cifra
* entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
* segundo la clave que se usara
* salida:una cadena que representa el criptograma
* descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
*/
public String cifra(String mensaje,String clave){
criptograma=" ";
//Quitamos espacios en blanco de la clave y del mensaje
mensaje=quitaEspacios(mensaje);
clave=quitaEspacios(clave);
//Convertimos a mayusculas el mensaje y la clave
mensaje=mensaje.toUpperCase();
clave=clave.toUpperCase();
//Completamos el tamano de la clave al tamano del mensaje
clave=completa(clave,mensaje.length());
//aplicamos el algoritmo de Vigenere
for(int i=0;i<mensaje.length();i++){
//Obtenemos el caracter segun la matriz de vigenere
//que es la interseccion de la columna del mensaje y la columna
//de las claves y la concatenamos con el criptograma
criptograma+=getCaracter(mensaje.charAt(i),clave.charAt(i));
}
return criptograma;
}//fin del metodo cifra
/**
* Funcion getCaracter
* entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
* conforma el mensaje,elsegundo representa la k-esima que conforma la clave
* salida:un argumento de tipo char,que representa la interseccion entre las columnas
* del mensaje y de la clave
* descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
* los renglones el argumento clave y obtiene su posicion en base a eso identfica
* el caracter y lo retorna
*/
char getCaracterDescifrado(char cripto,char clave){
//variables auxiliares
int posicionMensaje=0,posicionClave=0,indice=0;
boolean encontrado=false;
//buscamos el caracter del mensaje en la columna del criptograma
while(indice<26 && encontrado==false){
if(matriz[0][indice]==clave){
encontrado=true;
posicionClave=indice;
}
indice++;
}
encontrado=false;
indice=0;
//buscamos el caracter en el renglon de las claves
while(indice<26 && encontrado==false){
if (matriz[indice][posicionClave]==cripto){
encontrado=true;
posicionMensaje=indice;
}
indice++;
}
//Nos aseguramos que hayamos obtenido algun resultado
return matriz[0][posicionMensaje];
}
/**
* Metodo descifra
* entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
* segundo la clave que se usara
* salida:una cadena que representa el criptograma
* descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
*/
public String descifra(String mensaje,String clave){
criptograma=" ";
//Quitamos espacios en blanco de la clave y del mensaje
mensaje=quitaEspacios(mensaje);
clave=quitaEspacios(clave);
//Convertimos a mayusculas el mensaje y la clave
mensaje=mensaje.toUpperCase();
clave=clave.toUpperCase();
//Completamos el tamano de la clave al tamano del mensaje
clave=completa(clave,mensaje.length());
//aplicamos el algoritmo de Vigenere
for(int i=0;i<mensaje.length();i++){
//Obtenemos el caracter segun la matriz de vigenere
//que es la interseccion de la columna del mensaje y la columna
//de las claves y la concatenamos con el criptograma
criptograma+=getCaracterDescifrado(mensaje.charAt(i),clave.charAt(i));
}
return criptograma;
}//fin del metodo cifra
/****************************************************/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//try{
int op;
do{
InputStreamReader teclado=new InputStreamReader(System.in);
BufferedReader buffer=new BufferedReader(teclado);
/**
* Variables auxiliares para interactuar con el usuario
**/
String otro;
String clave;
BufferedReader lector= null;
PrintWriter escritor= null;
System.out.println("Elige una opcion");
System.out.println("1:-cifrar");
System.out.println("2:-descifrar");
op=Integer.parseInt(buffer.readLine());
switch(op){
case 1:
System.out.println("Introduzca el nombre del archico que contenga el mensaje a cifrar: ");
try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
while ((otro= lector.readLine ())!=null){
escritor.println (otro);
}
}
finally{
if(lector!=null){
lector.close();
}
if(escritor!=null){
escritor.close();
}
}
/*mensaje_claro=buffer.readLine();
mensaje_claro=mensaje_claro.trim();*/
System.out.println("Introduzca la llave: ");
clave=buffer.readLine();
Vigenere metodo=new Vigenere();
System.out.println("Criptograma:"+metodo.cifra(otro,clave));
break;
case 2:
System.out.println("Introduzca el nombre del archivo que contine el criptograma");
try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
while ((otro= lector.readLine ())!=null){
escritor.println (otro);
}
}
finally{
if(lector!=null){
lector.close();
}
if(escritor!=null){
escritor.close();
}
}
/*mensaje_claro=buffer.readLine();
mensaje_claro=mensaje_claro.trim();*/
System.out.println("Introduzca la llave");
clave=buffer.readLine();
// Instanciacion de la clase
Vigenere metodo1=new Vigenere ();
System.out.println("Mensaje claro:"+metodo1.descifra(otro,clave));
break;
default:
System.out.print("Seleccion incorrecta" );
}
}while(op !=2);
}
}
-
Hola, el error que me ha saltado al ejecutar es: java.lang.ArrayIndexOutOfBoundsException: 0 at Vigenere.main(Vigenere.java:280)
Eso corresponde a esta parte del código:
switch(op){
case 1:
System.out.println("Introduzca el nombre del archico que contenga el mensaje a cifrar: ");
try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
Lo que me extraña aquí es lo siguiente: args[0] y args[1] son parámetros que se le pasan al método main a la hora de invocar la ejecución del programa, es decir, que cuando el programa empieza a ejecutarse ya existen esos datos.
Sin embargo tú estás indicando "Introduzca el nombre del archico que contenga el mensaje a cifrar: "
Si el nombre de archivo lo quieres pasar como parámetro de ejecución del programa no tendrías que pedirlo después, o si lo quieres pedir para que se introduzca por teclado no tendría sentido usar args[0] ni args[1]
Si quieres que se introduzca por teclado el nombre de archivo, tienes que tener en cuenta que si el usuario introduce "datos.txt", ese archivo deberá estar en la misma carpeta donde tienes el código del programa. Si no es así tendrías que poner la ruta completa, por ejemplo C:/Users/Jose/Desktop/datos.txt
Para que sea el usuario quien introduzca el nombre del archivo puedes usar la clase Scanner, aquí tienes un ejemplo de cómo se usa: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=627:pensar-en-objetos-una-entrada-de-teclado-o-consola-en-java-como-objeto-con-campos-y-metodos-cu00661b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188
Aunque antes de introducir eso yo haría una prueba sencilla: usa un código del tipo FileReader fr = new FileReader("datos.txt"); para crear el FileReader y lo mismo para el FileWriter, prueba el programa así, y si te funciona todo bien luego introduce la entrada de la ruta del fichero a través del teclado.
Saludos