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

Cifrado César

Estas en el tema de Cifrado César en el foro de C/C++ en Foros del Web. Buenas, estoy programando un cifrado César con la tabla de código ASCII. Ejemplo: Si pongo desplazamiento 4 y la palabra taxi, al hacer el cifrado ...
  #1 (permalink)  
Antiguo 09/06/2014, 09:31
 
Fecha de Ingreso: marzo-2012
Mensajes: 176
Antigüedad: 7 años, 8 meses
Puntos: 2
Cifrado César

Buenas,

estoy programando un cifrado César con la tabla de código ASCII.

Ejemplo:
Si pongo desplazamiento 4 y la palabra taxi, al hacer el cifrado tendría que aparecer xebm, pero el problema es que me imprime xe|m.

Dejo el código

Código:
#include <stdio.h>
#include <string.h>

void codificarText(int, int);

int main(){
	int desplacament = 0;
	char nomfitxer[50], cadena = 0;

	printf("Desplaçament: ");
	scanf("%d", &desplacament);		
	printf("Nom fitxer: ");
	scanf("%s", nomfitxer);	
	printf("Cadena encriptar: ");
	
	codificarText(desplacament, cadena);
		
	
	return 0;
}

void codificarText(desplacament, cadena){	
	
	while ((cadena = getchar()) != '*'){
			if((cadena + desplacament > 'z') || (cadena + desplacament > 'Z')){
				//cadena = cadena + desplacament - 26;
				cadena = (cadena + desplacament % 27);
				printf("%d", cadena);
				putchar(cadena);
			}else if((cadena + desplacament > 'A' && cadena + desplacament < 'Z') || (cadena + desplacament > 'a' && cadena + desplacament < 'z')){
				cadena = cadena + desplacament;
				putchar(cadena);				
			}
			else{
				cadena = cadena;
				putchar(cadena);
			}
	}
}

Última edición por manelmanel8; 09/06/2014 a las 11:03
  #2 (permalink)  
Antiguo 09/06/2014, 12:57
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 7 años, 6 meses
Puntos: 49
Respuesta: Cifrado César

"Creo" que ahora te funcionará:

Cita:

Desplaþament: 4
Cadena encriptar:

CaSa cAsA
GeWe gEwE


TAXI taxi
XEBM xebm


xyzuvw XYZUVW
bcdyza BCDYZA


leosansan LEOSANSAN
piswerwer PISWERWER
*

Process returned 0 (0x0)
Código C++:
Ver original
  1. void codificarText(desplacament, cadena){
  2.  
  3.   while ((cadena = getchar()) != '*'){
  4.     if((cadena + desplacament > 'z') || (cadena + desplacament > 'Z'  && (cadena + desplacament) < 'a' ))
  5.       putchar(cadena + desplacament - 26);
  6.     else if((cadena + desplacament >= 'A' && cadena + desplacament <= 'Z') || (cadena + desplacament >= 'a' && cadena + desplacament <= 'z'))
  7.       putchar(cadena + desplacament);
  8.     else
  9.       putchar(cadena);
  10.   }
  11. }

¡¡¡Saluditos!!!


Última edición por leosansan; 09/06/2014 a las 14:03
  #3 (permalink)  
Antiguo 09/06/2014, 14:21
 
Fecha de Ingreso: marzo-2012
Mensajes: 176
Antigüedad: 7 años, 8 meses
Puntos: 2
Respuesta: Cifrado César

Si que funciona, pero mal... con 4 si que funciona pero si pones por ejemplo 20 o 6 o algun número mayor a 6 falla.
  #4 (permalink)  
Antiguo 09/06/2014, 15:46
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 7 años, 6 meses
Puntos: 49
Respuesta: Cifrado César

Cita:
Iniciado por manelmanel8 Ver Mensaje
Si que funciona, pero mal... con 4 si que funciona pero si pones por ejemplo 20 o 6 o algun número mayor a 6 falla.
Por algo puse "creo" en el anterior mensaje, no sé pero me daba que no, y así ha sido.

Pero a grandes males, grandes remedios:

Cita:
Desplazamiento: 4
Cadena encriptar :

abcABC
efgEFG

xyzXYZ
bcdBCD

uvwUVW
yzaYZA

Desplazamiento: 6
Cadena encriptar :

abcABC
ghiGHI

uvwxyzUVWXYZ
abcdefABCDEF

leosansan LEOSANSAN
rkuygtygt RKUYGTYGT

Desplazamiento: 20
Cadena encriptar :

leosansan LEOSANSAN
fyimuhmuh FYIMUHMUH


abcABC xyzXYZ
uvwUVW rstRST

Código C++:
Ver original
  1. void codificarText(desplacament, cadena){
  2.  
  3.   while ((cadena = getchar()) != '*'){
  4.     if((cadena + desplacament > 'z') || (cadena<='Z' && (cadena + desplacament > 'Z')) )
  5.       putchar(cadena + desplacament - 26);
  6.     else if((cadena + desplacament >= 'A' && cadena + desplacament <= 'Z') || (cadena + desplacament >= 'a' && cadena + desplacament <= 'z'))
  7.       putchar(cadena + desplacament);
  8.     else
  9.       putchar(cadena);
  10.   }
  11. }

¡¡¡Saluditos!!!



Y si aún así falla, cosa que ahora no creo, pon algo de tu parte.

Última edición por leosansan; 09/06/2014 a las 15:53
  #5 (permalink)  
Antiguo 09/06/2014, 17:04
 
Fecha de Ingreso: marzo-2012
Mensajes: 176
Antigüedad: 7 años, 8 meses
Puntos: 2
Respuesta: Cifrado César

Tienes razón funciona bien, lo que ahora intentaba era al poner números altos.

100, 200, 300...2000

Muestra símbolos raros, como podría arreglar eso?

Gracias
  #6 (permalink)  
Antiguo 09/06/2014, 17:14
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 11 años, 5 meses
Puntos: 61
Respuesta: Cifrado César

que deberia hacer con numeros altos?
'a' + 100 = ?
'a' + 2000 = ?
'z' + 100 = ?
'z' + 2000 = ?
__________________
Visita mi perfil en LinkedIn
  #7 (permalink)  
Antiguo 09/06/2014, 20:19
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 5 años, 9 meses
Puntos: 5
Respuesta: Cifrado César

una forma para lo numero no importa el tamaño seria esta oviamente nesesitarias modificarlo un poco para que no sea el mismo numero si se ingresan repetidos y sea mas fuerte el encriptado .

Código C:
Ver original
  1. if ((c>=48)&&(c<=57))
  2.                  c=((c+trans-48)%(57-48+1))+48;

solo que debes pasar numero por numero yo uso archivos pido elarchivo con el texto original y despues creo un archivo con el encriptado pero si lo quieres en consola solo usa arrays.
Bueno espero que te sirva.
Saludos.
Drewermerc.

Última edición por Drewermerc; 10/06/2014 a las 00:50
  #8 (permalink)  
Antiguo 10/06/2014, 10:34
 
Fecha de Ingreso: marzo-2012
Mensajes: 176
Antigüedad: 7 años, 8 meses
Puntos: 2
Respuesta: Cifrado César

Estoy intentando hacerlo en un archivo i el archivo contiene lo siguiente.

abc
xyz
qert

Y imprime esto:

eFS5�

Código:
#include <stdio.h>
#include <string.h>

void codificarText(int, char[]);

int main(){
	int desplacament = 0;
	char original[50];

	printf("Desplaçament: ");
	scanf("%d", &desplacament);		
	printf("Nom fitxer orignal: ");
	scanf("%s", original);	
	
	codificarText(desplacament, original);
		
	
	return 0;
}

void codificarText(int desplacament, char original[]){	
	FILE *fitxer;
	int i = 0;
	char cadena[500], ch;
	if((fitxer = fopen(original, "r"))){
		//while(fscanf(fitxer,"%c", &cadena[i])!=EOF){
		while((ch = fgetc(fitxer)) != EOF){		
			cadena[i] = ch;
			if((cadena[i] + desplacament > 'z') || (cadena[i] + desplacament > 'Z'  && (cadena[i] + desplacament) < 'a' )){
				cadena[i] = cadena[i] + desplacament - 26;
				printf("%s", cadena);
			}else if((cadena[i] + desplacament > 'A' && cadena[i] + desplacament < 'Z') || (cadena[i] + desplacament > 'a' && cadena[i] + desplacament < 'z')){
				cadena[i] = cadena[i] + desplacament;
				printf("%s", cadena);
			}
			else{
				cadena[i] = cadena[i];
				printf("%s", cadena);
			}
			i++;
			fclose(fitxer);				
		}
	}else {
		printf("Error"); 
	}

}
  #9 (permalink)  
Antiguo 13/06/2014, 13:37
 
Fecha de Ingreso: marzo-2012
Mensajes: 176
Antigüedad: 7 años, 8 meses
Puntos: 2
Respuesta: Cifrado César

Buenas tengo el programa en este punto, me codifica gracias a vuestra ayuda perfectamente.

Como podría hacer para que la función decodificar lea solo la primera linea y con eso le asigno el valor a la variable?

La función decodificar me decodifica bien las minúsculas, pero las mayúsculas no me lo hace bien.

Gracias

Código:
#include <stdio.h>
#include <string.h>

void codificarText(int, char[]);
void decodificarText(char[]);
int llegirDesplacament();

int main(){
	char original[50], opcio, fitxercodificat[50];
	int desplacament = 0;
	
	do{
	printf("1)Codificar(C)\n");
	printf("2)Decodificar(D)\n");	
	printf("3)Sortir del programa(S)\n\n");
		
	printf("Tria una opció C, S: ");
	opcio = getchar();

	if(opcio !='\n') while(getchar() != '\n'); //fflush
	
	if(opcio == 'c' || opcio == 'C'){
		printf("Nom fitxer orignal: ");
		scanf("%s", original);	
		desplacament = llegirDesplacament();
		codificarText(desplacament, original);
		if(opcio !='\n') while(getchar() != '\n'); //fflush
	}else if(opcio == 'd' || opcio == 'D'){
		printf("Nom fitxer codificat: ");
		scanf("%s", fitxercodificat);	
		decodificarText(fitxercodificat);		
		if(opcio !='\n') while(getchar() != '\n'); //fflush
	}	
					
	}while(opcio != 's' && opcio != 'S');		
	
	return 0;
}

int llegirDesplacament(){
	int desplacament = 0;
	printf("Desplaçament: ");
	scanf("%d", &desplacament);	
	return desplacament;
}

void codificarText(int desplacament, char original[]){	
	FILE *fitxer;
	FILE *codificat;
	int i = 0;
	char cadena[500], *extensio;
	if((fitxer = fopen(original, "r"))){
		while(fscanf(fitxer,"%c", &cadena[i])!=EOF){
			if((cadena[i] + desplacament > 'z') || (cadena[i] + desplacament > 'Z'  && cadena[i] + desplacament < 'a')){
				cadena[i] = cadena[i] + desplacament - 26;
			}else if((cadena[i] + desplacament > 'A' && cadena[i] + desplacament < 'Z') || (cadena[i] + desplacament > 'a' && cadena[i] + desplacament < 'z')){
				cadena[i] = cadena[i] + desplacament;
			}
			else{
				cadena[i] = cadena[i];
			}
			i++;
		}
		extensio = strrchr(original, '.');
		original[extensio-original] = '\0';
		strcat(original, ".coded");
		if((codificat = fopen(original, "w"))){
			fprintf(codificat,"%d\n%s", desplacament, cadena);	
		}
			
	
		fclose(fitxer);	
		fclose(codificat);				
		printf("%s", cadena);

	}else {
		printf("Error"); 
	}

}

void decodificarText(char fitxercodificat[]){	
	FILE *codificat;
	FILE *decodificat;
	int i = 0, desplacament = 4;
	char cadena[500], *extensio;
	if((codificat = fopen(fitxercodificat, "r"))){
		while(fscanf(codificat,"%c", &cadena[i])!=EOF){
			if((cadena[i] - desplacament < 'a') || (cadena[i] - desplacament < 'A')){
				cadena[i] = (cadena[i] - desplacament) + 26;
			}else if((cadena[i] - desplacament >= 'a' && cadena[i] - desplacament <= 'z') || (cadena[i] - desplacament >= 'A' || cadena[i] - desplacament <= 'Z')){
				cadena[i] -= desplacament;
			}
			else{
				cadena[i] = cadena[i];
			}
			i++;
		}
		extensio = strrchr(fitxercodificat, '.');
		fitxercodificat[extensio-fitxercodificat] = '\0';
		strcat(fitxercodificat, ".decoded");
		if((decodificat = fopen(fitxercodificat, "w"))){
			fprintf(decodificat,"%s", cadena);			
		}
			
	
		fclose(codificat);	
		fclose(decodificat);				
		printf("%s", cadena);

	}else {
		printf("Error"); 
	}

}

Etiquetas: cifrado, int, programa, string
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 23:34.