Morse - ¿donde está mal?

Iniciado por andie13, 7 Noviembre 2016, 01:16 AM

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

andie13

Hola, estaba intentando crear un programa sencillito para traducir un texto a morse. El caso es que no sé que está mal. El código es el siguiente:
(Por curiosidad, ¿cómo podría conseguir realizar el mismo algorirmo sin la biblitoecastring.h)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void cifrarmorse (char frase[], int a){    
   char letra;
   
   switch (letra){
       case 'a':
       case 'A': printf("·- ");
           break;
       case 'b':
       case 'B': printf("-··· ");
           break;
       case 'c':
       case 'C': printf("-·-·" );
           break;
       case 'd':
       case 'D': printf("-·· ");
           break;
       case 'e':
       case 'E': printf("· ");
           break;
       case 'f':
       case 'F': printf("··-· ");
           break;
       case 'g':
       case 'G': printf("--· ");
           break;
       case 'h':
       case 'H': printf("···· ");
           break;
       case 'i':
       case 'I': printf("·· ");
           break;
       case 'j':
       case 'J': printf("·--- ");
           break;
       case 'k':
       case 'K': printf("-·- ");
           break;
       case 'l':
       case 'L': printf("·-·· ");
           break;
       case 'm':
       case 'M': printf("-- ");
           break;
       case 'n':
       case 'N': printf("-· ");
           break;
       case 'o':
       case 'O': printf("--- ");
           break;
       case 'p':
       case 'P': printf("·--· ");
           break;
       case 'q':
       case 'Q': printf("--·- ");
           break;
       case 'r':
       case 'R': printf("·-· ");
           break;
       case 's':
       case 'S': printf("··· ");
           break;
       case 't':
       case 'T': printf("- ");
           break;
       case 'u':
       case 'U': printf("··- ");
           break;
       case 'v':
       case 'V': printf("···- ");
           break;
       case 'w':
       case 'W': printf("·-- ");
           break;
       case 'x':
       case 'X': printf("-··- ");
           break;
       case 'y':
       case 'Y': printf("-·-- ");
           break;
       case 'z':
       case 'Z': printf("--·· ");
           break;
       case '0': printf("----- ");
           break;
       case '1': printf("·---- ");
           break;
       case '2': printf("··--- ");
           break;
       case '3': printf("···-- ");
           break;
       case '4': printf("····- ");
           break;
       case '5': printf("····· ");
           break;
       case '6': printf("-···· ");
           break;
       case '7': printf("--··· ");
           break;
       case '8': printf("---·· ");
           break;
       case '9': printf("----· ");
           break;
       case '.': printf("·-·-·- ");
           break;
       case ',': printf("--··-- ");
           break;
       case '?': printf("··--·· ");
           break;
       case '"': printf("·-··-· ");
           break;
       case ' ': printf("   ");
           break;
   }        
}

int main(int argc, char** argv){
   int a;
   char frase[95];
   printf("Introduzca una frase:\n");
   gets(frase);
   a=strlen(frase);
   cifrarmorse(frase,a);
   
   return 0;
}


engel lex

No le asignas ningún valor a letra, en algún momento tienes que asignar un valo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

GGZ

#2
¿Esto es lo que estás buscando?
Fijate, ahí hice algunos arreglos, y funciona.

Gets se dejó de usar hace tiempo, mejor usa scanf.
EDITO: scanf lee la entrada hasta el primer espacio, entonces no deberías usar scanf tampoco. Creo que fgets o alguna función de esas, eso te dejo que lo investigues vos.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void cifrarmorse (char frase){

   switch (frase){
       case 'a':
       case 'A': printf("·- ");
           break;
       case 'b':
       case 'B': printf("-··· ");
           break;
       case 'c':
       case 'C': printf("-·-·" );
           break;
       case 'd':
       case 'D': printf("-·· ");
           break;
       case 'e':
       case 'E': printf("· ");
           break;
       case 'f':
       case 'F': printf("··-· ");
           break;
       case 'g':
       case 'G': printf("--· ");
           break;
       case 'h':
       case 'H': printf("···· ");
           break;
       case 'i':
       case 'I': printf("·· ");
           break;
       case 'j':
       case 'J': printf("·--- ");
           break;
       case 'k':
       case 'K': printf("-·- ");
           break;
       case 'l':
       case 'L': printf("·-·· ");
           break;
       case 'm':
       case 'M': printf("-- ");
           break;
       case 'n':
       case 'N': printf("-· ");
           break;
       case 'o':
       case 'O': printf("--- ");
           break;
       case 'p':
       case 'P': printf("·--· ");
           break;
       case 'q':
       case 'Q': printf("--·- ");
           break;
       case 'r':
       case 'R': printf("·-· ");
           break;
       case 's':
       case 'S': printf("··· ");
           break;
       case 't':
       case 'T': printf("- ");
           break;
       case 'u':
       case 'U': printf("··- ");
           break;
       case 'v':
       case 'V': printf("···- ");
           break;
       case 'w':
       case 'W': printf("·-- ");
           break;
       case 'x':
       case 'X': printf("-··- ");
           break;
       case 'y':
       case 'Y': printf("-·-- ");
           break;
       case 'z':
       case 'Z': printf("--·· ");
           break;
       case '0': printf("----- ");
           break;
       case '1': printf("·---- ");
           break;
       case '2': printf("··--- ");
           break;
       case '3': printf("···-- ");
           break;
       case '4': printf("····- ");
           break;
       case '5': printf("····· ");
           break;
       case '6': printf("-···· ");
           break;
       case '7': printf("--··· ");
           break;
       case '8': printf("---·· ");
           break;
       case '9': printf("----· ");
           break;
       case '.': printf("·-·-·- ");
           break;
       case ',': printf("--··-- ");
           break;
       case '?': printf("··--·· ");
           break;
       case '"': printf("·-··-· ");
           break;
       case ' ': printf("   ");
           break;
   }        
}

int main(int argc, char** argv){
   int a;
   char frase[95];
   printf("Introduzca una frase:\n");
   scanf ("%s",frase);
   a=strlen(frase);

   int i;

   for (i=0; i<a; i++)
   cifrarmorse(frase[i]);


   // Agregamos salto de linea al final.
   printf ("\n");

   return 0;
}


OUTPUT:
Introduzca una frase:
HOLA      
···· --- ·-·· ·-


Usá fgets te dejo como:    fgets (frase,sizeof(frase),stdin);
Deberías cambiarlo en el código que te pasé porque como te dije arriba scanf solo toma hasta el primer espacio.

Si pones "Hola" o "Hola Mundo" el programa con scanf solo toma Hola.


¡Saludos!
LET'S DO STUFF!!

MAFUS

Para el problema de scanf:
scanf("%95[^\n]", frase);

andie13

Muchas gracias a todos por responder  :D.
Aún estoy empezando a programar y me cuesta un poquito pulir los conceptos. He seguido vuestros consejos y funcionan todos correctamente, así que muchísimas gracias por vuestro tiempo.

¡Hasta otra!