Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Cifrado de Cesar ayuda

Estas en el tema de Cifrado de Cesar ayuda en el foro de C/C++ en Foros del Web. buenas soy nuevo en el foro y este es mi primer post tengo este codigo de cifrado de cesar pero tengo un problema, no se ...
  #1 (permalink)  
Antiguo 28/06/2010, 05:43
 
Fecha de Ingreso: junio-2010
Mensajes: 34
Antigüedad: 13 años, 9 meses
Puntos: 0
Cifrado de Cesar ayuda

buenas soy nuevo en el foro y este es mi primer post
tengo este codigo de cifrado de cesar pero tengo un problema, no se como hace rpara que me valide la letra ñ cuando la escribo si me encripta pero si escribo una L al mandarle a mostrar el texto cifrado me muestra un simbolo de mas y menos, quisiera saber como pueod hacer para que en vez de mostrarme los simbolos me muestre la ñ
Código:
#include <cstdlib>
#include <iostream>

using namespace std;
char *alfabeto="abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
char *encriptado="defghijklmnñopqrstuvwxyzabcDEFGHIJKLMNÑOPQRSTUVWXYZABC";
char *novalido="~!@#$%^&*()_+=-}{|:;<>,./1234567890áéíóú¡²³€¼½¾×?°!?¡¿¨´";

int coninvali=0;

void menu(int &opc)
{
 	 menu:

	 cout<<"Bienvenido al encriptador\nPresione 1 para escribir texto\nPresione 2 para encriptar texto luego de haberlo escrito\nPresione 3 Desencriptar texto luego de haberlo escrito\nPresione 4 para salir\nSu Opcion:";
 	 cin>>opc;
 	 cin.seekg(0, ios::end); 
	 cin.clear(); 
}
char* encripto(char *text)
{
int i=0,j=0;
char text2[250];

   strncpy(text2, text, 250);
   text2[250] = '\0'; 

    for(j=0;j<strlen(text2);j++)
    {
      for(i=0;i<strlen(alfabeto);i++)
      {
         if(*(text2+j)==*(alfabeto+i))
         {
         *(text+j)=*(encriptado+i); 
         }
      }
			
    }
    return text;
}

char* invalido(char *text)
{
int i=0,j=0;
char text2[250];

   strncpy(text2, text, 250);
   text2[250] = '\0'; 

    for(j=0;j<strlen(text2);j++)
    {
      for(i=0;i<strlen(novalido);i++)
      {  	
	  		if(*(text2+j)==*(novalido+i))
			  {coninvali++;}
	  		
      }
    }
}

char* desencripto(char *text)
{
    int i=0,j=0;
    char text2[250];

   strncpy(text2, text, 250);
   text2[250] = '\0';
    
    for(j=0;j<strlen(text2);j++)
    {
      for(i=0;i<strlen(alfabeto);i++)
      {
         if((*(text2+j))==*(encriptado+i))
         {
         *(text+j)=*(alfabeto+i);
         }
      }
    }
    return text;
}

int main () {
	int opc=0;
	do{
	system("cls");
	char texto[251];
	char *texto2;
	menu(opc);
	topfalso:
		system("cls");
		if(opc==1){cout<<"Introduzca Texto a Encriptar\n";
		cin.getline(texto,251);
		texto2=invalido(texto);
 		if(coninvali>0){cout<<"Texto con caracteres no admitidos\n"; system("PAUSE"); coninvali=0; goto topfalso;}else
		cout<<"El Texto introducido es: "<<texto<<"\n\n";
		system("pause");system("cls");
		goto topreal;
	 		 		 }else if(opc==2){
			 	   	 cout<<"Primero escriba texto\n";
			  		system("pause");system("cls");
  					 }else if(opc==3){
					  cout<<"Primero escriba texto\n";
					  system("PAUSE");system("cls");
													}
		if(opc<1||opc>4){cout<<"Opcion Invalida\n"; opc=0; cin.seekg(0, ios::end); cin.clear();  system("pause");}
}while(opc!=4);
return 0;


	do{
 	opc=0;
	topreal:
	system("cls");
	char texto[251];
	char *texto2;
	menu(opc);
	
		system("cls");
		if(opc==1){cout<<"Introduzca Texto a Encriptar\n";
		cin.getline(texto,251); 
		texto2=invalido(texto);
 		if(coninvali>0){cout<<"Texto con caracteres no admitidos\n"; system("PAUSE"); coninvali=0; goto topreal;}else
		cout<<"El Texto introducido es: "<<texto<<"\n\n";
		system("pause");system("cls");
			  }else if(opc==2){
			  		texto2=encripto(texto);
			  		cout<<"El Texto Encriptado es: "<<texto2<<"\n";
			  		system("pause");system("cls");
 				}else if(opc==3){
					  texto2=desencripto(texto);
					  cout<<"El Texto Desencriptado es: "<<texto2<<"\n";
					  system("PAUSE");system("cls");
					  				}
 				if(opc<1||opc>4){cout<<"Opcion Invalida\n"; opc=0; cin.seekg(0, ios::end); cin.clear(); system("pause");}
					  				
}
while(opc!=4);
	
}
muchas gracias de ante mano, saludos
  #2 (permalink)  
Antiguo 28/06/2010, 19:40
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Cifrado de Cesar ayuda

En primer lugar no deberias utilizar los goto, no son propios de la programacion estructurada.
En segundo si tu codigo corre y funciona perfecto, yo lo trate de correr en mi maquina y tuve algunos problemas que logre resolver.

Por otro lado para resolver tu duda es muy sencillo utiliza secuencias de escape en este caso
utilza \244 para la ñ y \255 para la Ñ.
te quedaria asi
char *alfabeto="abcdefghijklmn\244opqrstuvwxyzABCDEFGHI JKLMN\245OPQRSTUVWXYZ ";
como puedes observar despues de la n aparece \244 el cual al tiempo de mostrar en pantalla se mostrara como ñ, debes tomar en cuenta que si debugeas es posible que aparasca como otro caracter, pero en pantalla siempre apararecera como ñ.

En cuanto a tu codigo te sugiero la siguiente estrategia para encriptar

Código C++:
Ver original
  1. //Debes declara esto despues de los include's
  2. #define _FACTOR_ENCRIPTACION_ 3
  3. ...
  4. char* encripto(char *text)
  5. {
  6.     int i=0,j=0;
  7.     char text2[251];
  8.     int longAlfabeto = strlen(alfabeto);
  9.  
  10.     text2[250] = '\0';
  11.  
  12.     for(j=0; j<strlen(text); j++)
  13.     {
  14.         char *posCar = strchr(alfabeto, text[j]);
  15.         int pos = posCar-alfabeto+_FACTOR_ENCRIPTACION_;
  16.         if(pos >= longAlfabeto)
  17.             pos=pos-longAlfabeto;
  18.         text2[j]=alfabeto[pos];
  19.     }
  20.     text2[j]='\0';
  21.     return text2;
  22. }
  23. ...
  24.         }else if(opc==2){
  25.                                        char textoEncriptado[251];
  26.                     strcpy(textoEncriptado,encripto(texto));
  27.                     cout<<"El Texto Encriptado es: "<<textoEncriptado<<"\n";
  28.                     system("pause");system("cls");
  29.                 }else if(opc==3){
  30. ...
esto no kita los muchos detalles que tienes en cuanto al manejo de punteros. Ademas debes de tomar encuenta que la longitud de una cadena siempre será tamaño+1.
Te sugiero k lo revises bien tu codigo, y tomando en cuenta no solo tus errores, tambien tus warnings o advertencias.
  #3 (permalink)  
Antiguo 29/06/2010, 05:58
 
Fecha de Ingreso: junio-2010
Mensajes: 34
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Cifrado de Cesar ayuda

muchas gracias amigo nunca habia visto punteros por eso es q tendre muchos detalles pero poco a poco ire arreglando mi manera de programar y los goto los uso solo para q vuelva a sitios cortos y no se me vuelve un spagetti q es lo q intento.
  #4 (permalink)  
Antiguo 29/06/2010, 21:52
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Cifrado de Cesar ayuda

mas bien el uso de goto es programacion espagetti, el uso de las estructuras tales como while, do-while, for, if, pertenecen a la programacion estructurada. Su uso se remonta al lenguaje esamblador. y paso por su uso extendido en las primeras versiones de basic, fortran, entre otros. Asi k acostubrate a no usarlo.

Etiquetas: cifrado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:53.