Autor
|
Tema: cifrado cesar en c (Leído 11,007 veces)
|
kikian94
Desconectado
Mensajes: 66
|
Hola buenos dias, tengo que hacer un programa que encripte y desencripte una secuencia de caracteres en mayuscula mediante el cifrado cesar, pero no logro que arranque se me queda pillado el programa y no se como resolverlo: el problema lo tengo en el scanf del do que no entra e imprime directamente el mensaje de salida diciendo que ha habido un error con el caracter introducido char cifrar(int desplazamiento, char caracter); char descifrar(); int main(void){ int respuesta; char caracter; int desplazamiento; char caracterConvertido; printf("¿Desea cifrar o descifrar?\n"); do{ printf("Introduce la clave de cifrado\n"); scanf("%d",&desplazamiento ); if(desplazamiento<0){ printf("Introduce un valor valido\n"); } }while(desplazamiento<0); if(respuesta==0){ printf("Introduce el texto a cifrar:"); do{ caracterConvertido = cifrar(desplazamiento,caracter); printf("%c",caracterConvertido ); if((caracter<='A')||(caracter>='Z')){ printf("Error en los caracteres introducidos"); } }while(((caracter>='A')&&(caracter<='Z'))||(caracter !='\n')); printf("*** El texto cifrado es (entre flechas): -->"); } if(respuesta==1){ //descifrar(); } return 0; } char cifrar(int desplazamiento, char caracter){ char caracterConvertido; caracterConvertido=caracter + desplazamiento; return caracterConvertido; }
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Problemas con el programa hay varios. El primero es el uso de fflush(stdin) en el bucle que mencionas, aquí hay dos escenarios: A) La función no tiene efecto, si eso sucede el primer carácter a procesar sera el avance de linea de (valga la redundancia) la linea anterior (introducción de la clave de cifrado), ese carácter se procesa y causa la salida del bucle. B) La función tiene efecto, ello resulta en que la linea completa (salvo el primer carácter) que se debe cifrar se pierde. Lo que debes hacer es eliminar esa llamada a función y en su lugar verificar que el resto de la linea (por lo menos el '\n') al introducir la clave de cifrado se descarte. Opciones y mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|. Otro se encuentra en la validación dentro del bucle: if ((caracter <= 'A') || (caracter>='Z')){ printf("Error en los caracteres introducidos"); }
Con ello se indica que tanto 'A' como 'Z' no son caracteres validos, ahí debes utilizar los operadores '>' y '<'. También debes eliminar los paréntesis y la llamada a fflush ya que no son necesarios. El ultimo problema a corregir en el programa es uno de diseño: para poder imprimir el texto cifrado o descifrado en medio del texto "*** El texto cifrado es ..." debes almacenar la linea en un array. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
kikian94
Desconectado
Mensajes: 66
|
se puede realizar sin arrays? se supone que el ejercicio se tiene que hacer sin arrays, habia pensado que se podia realizar
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
se puede realizar sin arrays? Si (por un momento pensé que se trataba de cifrar/descifrar varias lineas, mea culpa). Pero, en mi opinión, es mas fácil declarar un array, leer una linea con fgets y después procesarla: char linea[100]; int i; /* ... */ puts("Texto a procesar:"); fgets(linea , 100, stdin ); /* ... */ /* Procesamos cada uno de los caracteres */ for (i = 0; linea[i] != '\0' && linea[i] != '\n'; i++){ /* Procesamos el caracter linea[i] */ }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
kikian94
Desconectado
Mensajes: 66
|
lo he estado mirando pero sigo sin ser capaz de que funcione #include<stdio.h> char cifrar(int desplazamiento, char caracter); char descifrar(int desplazamiento, char caracter); int main(void){ int respuesta; char caracter; int desplazamiento; char caracterConvertido; char cadena[100]; int i=0; int j=0; printf("¿Desea cifrar o descifrar?\n"); do{ printf("Introduce la clave de cifrado\n"); scanf("%d",&desplazamiento ); if(desplazamiento<0){ printf("Introduce un valor valido\n"); } }while(desplazamiento<0); if(respuesta==0){ printf("Introduce el texto a cifrar:"); do{ if((caracter<'A')||(caracter>'Z')){ printf("Error en los caracteres introducidos\n"); } caracterConvertido = cifrar(desplazamiento,caracter); cadena[j]= caracterConvertido; j++; }while(((caracter>='A')&&(caracter<='Z'))||(caracter !='\n')); printf("*** El texto cifrado es (entre flechas): -->"); for(i=0;i<100;i++){ } } if(respuesta==1){ //descifrar(); } return 0; } char cifrar(int desplazamiento, char caracter){ char caracterConvertido; caracterConvertido=caracter + desplazamiento; return caracterConvertido; }
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Para que el programa genere la salida esperada se necesitan tres cambios. 1) Eliminar el resto de la linea justo después de pedir el desplazamiento y antes de pedir el texto a cifrar. Esto lo puedes realizar con un bucle: { int ch; while ((ch = getchar()) != EOF && ch != '\n') ; }
2) Debes cifrar solo los caracteres en mayúsculas. En tu bucle cifras el carácter sin importar cual es y solo entonces verificas si es valido. El bucle se debe cambiar a (se puede acortar mas utilizando las funciones getchar e isupper): printf("Introduce el texto a cifrar:"); while (1){ if (caracter >= 'A' && caracter <= 'Z') cadena[j++] = cifrar (desplazamiento, caracter); else break; }
3) Por ultimo imprimes de forma indiscriminada cien caracteres cuando debes imprimir solo los caracteres introducidos por el usuario (hasta el primer carácter invalido), hay que cambiar ese bucle a: for (i = 0; i < j; i++)
Con las modificaciones el programa funciona correctamente. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
kikian94
Desconectado
Mensajes: 66
|
muchas gracias, ya lo estuve mirando y lo consegui hacer funcionar
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Cifrado César en Python
Scripting
|
.:WindHack:.
|
3
|
7,708
|
7 Junio 2010, 02:10 am
por Novlucker
|
|
|
Qué preferis: Cifrado cesar o Ensalada cesar?
Foro Libre
|
Castg!
|
6
|
4,946
|
1 Agosto 2011, 22:45 pm
por scr21
|
|
|
[+] mCesar - Cifrado Cesar
Programación Visual Basic
|
|SMT|
|
1
|
2,310
|
8 Septiembre 2013, 16:09 pm
por noele1995
|
|
|
[Perl] Ejemplo de Cifrado Cesar
Scripting
|
BigBear
|
0
|
2,126
|
28 Noviembre 2014, 17:48 pm
por BigBear
|
|
|
[pseint] Ayuda - Cifrado César
Programación General
|
shadowzgz
|
4
|
12,121
|
24 Diciembre 2014, 01:32 am
por Eleкtro
|
|