cifrado cesar en c

Iniciado por kikian94, 26 Octubre 2013, 11:18 AM

0 Miembros y 1 Visitante están viendo este tema.

kikian94

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");
fflush(stdout);
printf("cifrar--> 0\n");
fflush(stdout);
printf("descifrar -->1\n");
fflush(stdout);
scanf("%d",&respuesta);

do{
printf("Introduce la clave de cifrado\n");
fflush(stdout);
scanf("%d",&desplazamiento);


if(desplazamiento<0){
printf("Introduce un valor valido\n");
fflush(stdout);
}
}while(desplazamiento<0);

if(respuesta==0){

printf("Introduce el texto a cifrar:");
fflush(stdout);

do{

fflush(stdin);
scanf("%c",&caracter);

caracterConvertido = cifrar(desplazamiento,caracter);
printf("%c",caracterConvertido);
fflush(stdout);
if((caracter<='A')||(caracter>='Z')){
printf("Error en los caracteres introducidos");
fflush(stdout);
}
}while(((caracter>='A')&&(caracter<='Z'))||(caracter !='\n'));

printf("*** El texto cifrado es (entre flechas): -->");
fflush(stdout);

printf("<-- ***\n");
fflush(stdout);

printf("Fin del programa");
fflush(stdout);

}
if(respuesta==1){
//descifrar();
}
return 0;
}
char cifrar(int desplazamiento, char caracter){

char caracterConvertido;

caracterConvertido=caracter + desplazamiento;

return caracterConvertido;
}

rir3760

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

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

se puede realizar sin arrays? se supone que el ejercicio se tiene que hacer sin arrays, habia pensado que se podia realizar

rir3760

Cita de: kikian94 en 26 Octubre 2013, 17:22 PMse 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
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

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");
fflush(stdout);
printf("cifrar--> 0\n");
fflush(stdout);
printf("descifrar -->1\n");
fflush(stdout);
scanf("%d",&respuesta);

do{
printf("Introduce la clave de cifrado\n");
fflush(stdout);
scanf("%d",&desplazamiento);


if(desplazamiento<0){
printf("Introduce un valor valido\n");
fflush(stdout);
}
}while(desplazamiento<0);

if(respuesta==0){

printf("Introduce el texto a cifrar:");
fflush(stdout);

do{

if((caracter<'A')||(caracter>'Z')){
printf("Error en los caracteres introducidos\n");
}

scanf("%c",&caracter);

caracterConvertido = cifrar(desplazamiento,caracter);
cadena[j]= caracterConvertido;
j++;



}while(((caracter>='A')&&(caracter<='Z'))||(caracter !='\n'));

printf("*** El texto cifrado es (entre flechas): -->");
fflush(stdout);

for(i=0;i<100;i++){
printf("%c", cadena[i]);
}

printf("<-- ***\n");
fflush(stdout);

printf("Fin del programa");
fflush(stdout);

}
if(respuesta==1){
//descifrar();
}
return 0;
}
char cifrar(int desplazamiento, char caracter){

char caracterConvertido;

caracterConvertido=caracter + desplazamiento;

return caracterConvertido;
}

rir3760

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:");
fflush(stdout);

while (1){
   scanf("%c", &caracter);
   
   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++)
   printf("%c", cadena[i]);


Con las modificaciones el programa funciona correctamente.

Un saludo
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

muchas gracias, ya lo estuve mirando y lo consegui hacer funcionar  :D