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

funcion compleja

Estas en el tema de funcion compleja en el foro de C/C++ en Foros del Web. buenas a todos, soy nuevo en el foro. Tengo 15 años y llevo un tiempo aprendiendo c, y ahora me he pasado a c++, pero ...

  #1 (permalink)  
Antiguo 22/01/2012, 10:25
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
funcion compleja

buenas a todos, soy nuevo en el foro. Tengo 15 años y llevo un tiempo aprendiendo c, y ahora me he pasado a c++, pero tengo un codigo en c que tengo dudas.

Estoy haciendo un programa que muestre un verbo en español y yo lo tenga que traducir al ingles. Si esta mal, da la opcion de volver a intentarlo o ir al menu principal.

Pues bien, todos los verbos los reparto en cases, ya que el programa elige mostrar un verbo aleatoriamente. He intentado busca una funcion, pero no me sale.

Aqui dejo la funcion, a ver que tengo mal y me pueden ayudar :)



Código C:
Ver original
  1. case 1:
  2.                        verb_i = betray;
  3.                        verb_e = traicionar;                      
  4.                        system("cls");
  5.                        do{
  6.                        printf("\n Traduzca %s: ",verb_e);
  7.                        scanf(" %[^\n]s",&verbo);
  8.                        
  9.                        if(strcmp(verbo,verb_i)==0)
  10.                        {
  11.                           system("cls");
  12.                           printf("\n Muy bien.\n\n");
  13.                           do{
  14.                           printf(" 1-. Otro verbo\n");
  15.                           printf("\n 2-. Menu\n");
  16.                           printf("\n\n Que desea hacer ahora?: ");
  17.                           scanf(" %d",&opcion_verbo);
  18.                          
  19.                           switch(opcion_verbo)
  20.                           {
  21.                               case 1:
  22.                                    system("cls");
  23.                                    goto aleatorio_espanol;
  24.                                    break;
  25.                               case 2:
  26.                                    system("cls");
  27.                                    break;  
  28.                                
  29.                               default:
  30.                                    system("cls");
  31.                                    printf("\n Opcion incorrecta, intentelo de nuevo: \n\n");
  32.                                    break;                  
  33.                            }
  34.                           }while(opcion_verbo != 1 && opcion_verbo != 2);
  35.                        }
  36.                        else
  37.                        {
  38.                           system("cls");                          
  39.                           printf("\n Lo siento, traduccion incorrecta\n");
  40.                           do{
  41.                           printf("\n 1-. Volver a intentarlo\n");                          
  42.                           printf("\n 2-. Menu\n");
  43.                           scanf(" %d",&opcion_mal);
  44.                                                    
  45.                           switch(opcion_mal)
  46.                           {
  47.                               case 1:
  48.                                    system("cls");
  49.                                    break;
  50.                               case 2:
  51.                                    system("cls");
  52.                                    break;
  53.                                      
  54.                               default:
  55.                                    system("cls");
  56.                                    printf("\n Opcion no valida, intentelo de nuevo\n");
  57.                                    break;                                              
  58.                           }
  59.                           }while(opcion_mal != 1 && opcion_mal != 2);  
  60.                        }
  61.                          
  62.                          }while(opcion_mal == 1);
  #2 (permalink)  
Antiguo 22/01/2012, 14:07
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Podrias poner el programa completo, es que no comprendo bien lo que hace.
Tienes diversos verbos en diferentes cases? Pon una porcion más grande porfa.

Ara te daría unas recomendaciones para arreglar tus programas:

1. No uses goto (etiquetas) si no es absolutamente necesario, según los expertos siempre hay otra opcion, ya que si otra persona tiene que ver tu codigo, con goto es una pesadilla.

2. No uses la funcion scanf, para numeros aun no se comporta del todo "mal", pero para cadenas NUNCA hay que usarla, usa la funcion fgets.

Si tienes alguna duda pregunta :)
  #3 (permalink)  
Antiguo 22/01/2012, 15:11
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: funcion compleja

Hola!! una pregunta L3m0n xq decis "No uses la funcion scanf, para numeros aun no se comporta del todo "mal", pero para cadenas NUNCA hay que usarla, usa la funcion fgets. ", Tanto para numeros como para cadenas funciona perfectamente(hasta donde yo se) ¿Podrias ampliar? en todo caso fgets me parece mas conveniente usarla cuando se quiere leer una linea y no una palabra.
Con respecto al codigo richard_h, no entiendo bien cual es tu problema lo unico que veo mal son las lineas 2 y 3, betray y traicionar deberian estar entre comillas si es que son cadenas
Código C:
Ver original
  1. verb_i="betray";
  2. verb_e="traicionar";
Ademas coincido con L3m0n en no usar goto no es un crimen usarlo pero atenta con la forma de programacion estructurada como lo es C... Amplia el codigo x favor

Saludos
  #4 (permalink)  
Antiguo 23/01/2012, 09:13
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Scanf tiene un problema que es bastante gordo y es con el buffer de entrada, ya que esta función suele dejar mucha basura.

Ahora bien la función, leyendo cadenas tiene el mismo problema que gets, que no tiene límite de entrada.
Me explico: Tu puedes tener una cadena de ponle 10 caracteres, pero si usas gets o scanf el programa pedira hasta que haya un \n y los guardara en algun lugar de la memoria, lo cual es muy peligroso ya que puedes tener cualquier cosa en la memoria y estas funciones te lo pueden cambiar.

Si tienes alguna otra duda pregunta no dudes en hacerla, la intentaré responder lo mejor que pueda :)
  #5 (permalink)  
Antiguo 23/01/2012, 11:26
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: funcion compleja

Gracias por la aclaracion L3m0n! no me habia puesto a pensar que pasaba con los datos que se escribia demas y mucho menos sabia que podia ser tan peligroso

Saludos
  #6 (permalink)  
Antiguo 23/01/2012, 14:31
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

Vale, ahora pondre el programa completo pero solo con un case. Y si, hay muchos verbos y enc ada case hay uno. LLamo a random, y segun el numero aleatorio que salga, sera un case, y ese es el verbo que tendre que traducir.
Sobre los goto ya lo arreglo, pero ahora lo que me interesa es poner el case como una funcion, ya que cada vez que hay un verbo nuevo, tengo que copiar el mismo trozo de codigo solo que cambaido algunas variables segun el verbo que sea.

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {   //variables    
  5.     int cont=0;
  6.     int aleatorio_ingles=0, aleatorio_espanol=0, opcion_mal, opcion_verbo;
  7.        
  8.     char verbo[15];
  9.    
  10.     //pongo chars con los verbos
  11.     char betray[8]="betray";
  12.     char traicionar[15]="traicionar";
  13.    
  14.     //.......
  15.     //Ahora aqui estaria el menu principal que elegiria
  16.     //entre traducir a espanol o al ingles.
  17.     //......
  18.    
  19.     //Aqui es la opcion traducir al ingles
  20.     printf("\n\n\t ***Espanol - Ingles***\n\n");
  21.                aleatorio_espanol:
  22.                cont++;
  23.                srand(time(NULL));//random
  24.                aleatorio_espanol2:
  25.                aleatorio_espanol=152+rand()%209;//se saca un numero random
  26.                                                 // del 152 al 209
  27.                //esto una cosa rara porque algnas veces salia otro numero raro,
  28.                //jaja. Simplemente asegurar que el numero es el valido
  29.                if(aleatorio_espanol < 152 || aleatorio_espanol > 209)
  30.                    goto aleatorio_espanol2;
  31.                
  32.                switch(aleatorio_espanol)// un switch segun el numero random
  33.                
  34.                case 1://por ejemplo el case 1, que es el verbo traicionar
  35.                // esta es la parte que quiero convertir en funcion, porque
  36.                //cuando hay un verbo neuvo, copio este mismo codigo y hago otro
  37.                //case, solo que cambiando el nombre de las variables al nuevo verbo                    
  38.                        system("cls");
  39.                        do{
  40.                        printf("\n Traduzca traicionar: ");
  41.                        scanf(" %[^\n]s",&verbo);
  42.                        
  43.                        if(strcmp(verbo,betray)==0)
  44.                        {
  45.                           system("cls");
  46.                           printf("\n Muy bien.\n\n");
  47.                           do{
  48.                           printf(" 1-. Otro verbo\n");
  49.                           printf("\n 2-. Menu\n");
  50.                           printf("\n\n Que desea hacer ahora?: ");
  51.                           scanf(" %d",&opcion_verbo);
  52.                          
  53.                           switch(opcion_verbo)
  54.                           {
  55.                               case 1:
  56.                                    system("cls");
  57.                                    goto aleatorio_espanol;
  58.                                    break;
  59.                               case 2:
  60.                                    system("cls");
  61.                                    break;  
  62.                                
  63.                               default:
  64.                                    system("cls");
  65.                                    printf("\n Opcion incorrecta, intentelo de nuevo: \n\n");
  66.                                    break;                  
  67.                            }
  68.                           }while(opcion_verbo != 1 && opcion_verbo != 2);
  69.                        }
  70.                        else
  71.                        {
  72.                           system("cls");                          
  73.                           printf("\n Lo siento, traduccion incorrecta\n");
  74.                           do{
  75.                           printf("\n 1-. Volver a intentarlo\n");                          
  76.                           printf("\n 2-. Menu\n");
  77.                           scanf(" %d",&opcion_mal);
  78.                                                    
  79.                           switch(opcion_mal)
  80.                           {
  81.                               case 1:
  82.                                    system("cls");
  83.                                    break;
  84.                               case 2:
  85.                                    system("cls");
  86.                                    break;
  87.                                      
  88.                               default:
  89.                                    system("cls");
  90.                                    printf("\n Opcion no valida, intentelo de nuevo\n");
  91.                                    break;                                              
  92.                           }
  93.                           }while(opcion_mal != 1 && opcion_mal != 2);
  94.                                                  
  95.                          
  96.                        }
  97.                          
  98.                          }while(opcion_mal == 1);
  99.                        
  100.                                
  101.                        break;
  102.    
  103. return 0;    
  104. }
  #7 (permalink)  
Antiguo 23/01/2012, 14:44
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Osea que lo que quieres es crear la misma funcion para todos los verbos no?

Fácil.

Tienes que crear una funcion que reciba como parametros el verbo que el usuario ingresa y el verbo correcto en ingles. I que devuelva si es correcto o no.

Cómo se hace esto, fácil:
Código C:
Ver original
  1. int comprovar(char verbointroducido[], char verbocorrecto[]){
  2. //miras si coinciden o no, dependiendo de eso dices que devuelva una cosa o otra
  3. if(strcmp (verbointroducido,verbocorrecto)==0) return 0;
  4. else return 1;
  5. }

Ahora en la funcion main puedes ir, poner la funcion y segun si devuelve una cosa o otra pues sigues con el programa, no se si me he explicado bien.

Si algo no te ha quedado claro pregunta :)
  #8 (permalink)  
Antiguo 23/01/2012, 15:05
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

muchisimas gracias por la rapidez, es increible, y por tus conocimientos y ayuda tambn, que estas aportando :)

Pero lo que yo querria es poner TODO el case en una funcion, porque en todos los cases es el mismo codigo. Tu lo que has hecho es una funcion para saber si el verbo es igual o no. Asi solo llamo a la funcion una vez en cada verbo nuevo, no se si me explico, quiero que en la funcion este los printf y eso, con los if else, yque en el case solo este la llamada a la funcion

es eso posible? y gracias de antemano, sois de gran ayuda :))
  #9 (permalink)  
Antiguo 24/01/2012, 09:09
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Ah ya entiendo, osea que quieres hacer una funcion desde case hasta el break final.

Puedes hacer una cosa que solía y suelo hacer, una "solución rápida por llamarlo de alguna manera"

Como?

Fácil, es tan simple como crear una funcion void con todo el código.
Si no te queda claro dimelo y te escribo el codigo pero ya te digo es copiar lo que tienes en una funcion void.
  #10 (permalink)  
Antiguo 24/01/2012, 11:12
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

ya intente hacer eso, pero no me funciono. No se por que es, ya que lo copie como dijiste pero nada. La cosa es que la variable de un verbo, en este caso traicionar, habría que añadirla como variable dentro de la funcion, no? es que no se como se hace para que una funcion utilize una variable del main.

si me ayudas sera de gran utilidad.
  #11 (permalink)  
Antiguo 24/01/2012, 11:17
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Creo que tienes mal el concepto, no tienes que hacer que la funcion use una variable de main.
Lo que tienes que hacer es crear una variable global, que es eso? Pues es una variable que puede ser accedida para todas las funciones.

Como se hace?

Muy sencillo, solo tienes que hacer la declaracion fuera del main.

Antes del main declaras las variables que quieres que sean globales:

Código C:
Ver original
  1. int variable; //aqui declaras las variables globales
  2. int main(void){
  3. ...
  4. }

Si dudas en algo pregunta :)
  #12 (permalink)  
Antiguo 24/01/2012, 13:53
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

Muchas gracias, eso no lo sabia :P

Ya lo hice y me salio a la perfeccion. Pero al intentar hacer otra funcion para la parte español-ingles, al intentar probarlo me daba error. Tras hacer muchas pruebaas, decidi borrar esa funcion y probar el programa. Y cual fue mi sorpresa que dio error.

Es decir, hice la primero funcion, me salio, y despues de hacer otra funcion y borrarla, ahora la primera funcion me da error, sin apenas haberla tocado. Que esta pasando¿

me dice: "passing arg 1 of strcmp' makes pointer from integer without a cast", eso en cada variable. Muy extraño.

Os dejo el programa, haber que pasa:

Código C:
Ver original
  1. int cont=0;
  2.     int aleatorio_ingles=0,opcion,opcion_espanol,opcion_mal,opcion_verbo;
  3.     char verbo;    
  4.     int aleatorio_espanol=0,opcion_verbo2;
  5.    
  6. char *verb, *verb2, *verb3, *verb4, *verb5, *verb6, *verb7;
  7.  
  8.   void e_verbo()
  9.                   {
  10.                   system("cls");
  11.                        do{
  12.                        printf("\n Traduzca %s: ",verb2);
  13.                        scanf(" %[^\n]s",&verbo);
  14.                        
  15.                        if(strcmp(verbo,verb)==0)//el primer error me lo da aqui
  16.                        //,no se porque
  17.                        {
  18.                           system("cls");
  19.                           printf("\n Muy bien.\n\n");
  20.                           do{
  21.                           printf(" 1-. Otro verbo\n");
  22.                           printf("\n 2-. Menu\n");
  23.                           printf("\n\n Que desea hacer ahora?: ");
  24.                           scanf(" %d",&opcion_verbo);
  25.                          
  26.                           if(opcion_verbo < 1 || opcion_verbo > 2)
  27.                           {
  28.                                    system("cls");
  29.                                    printf("\n Opcion incorrecta, intentelo de nuevo: \n\n");
  30.                            }
  31.                           }while(opcion_verbo != 1 && opcion_verbo != 2);
  32.                        }
  33.                        else
  34.                        {
  35.                           system("cls");                          
  36.                           printf("\n Lo siento, traduccion incorrecta\n");
  37.                           do{
  38.                           printf("\n 1-. Volver a intentarlo\n");
  39.                           printf("\n 2-. Ver traduccion\n");                          
  40.                           printf("\n 3-. Menu\n");
  41.                           scanf(" %d",&opcion_mal);
  42.                          
  43.                          switch(opcion_mal)
  44.                          {
  45.                              case 1:
  46.                                   system("cls");
  47.                                   break;
  48.                              
  49.                              case 2:
  50.                                   system("cls");
  51.                                   if(verb3==NULL)
  52.                                   printf("\n La traduccion del verbo %s es: %s\n\n", verb, verb2);
  53.                                  
  54.                                   else
  55.                                   {
  56.                                   if(verb4==NULL)
  57.                                   printf("\n La traduccion del verbo %s es: %s, %s\n\n", verb, verb2, verb3);
  58.                                  
  59.                                   else
  60.                                   {
  61.                                   if(verb5==NULL)
  62.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s\n\n", verb, verb2, verb3, verb4);    
  63.                                  
  64.                                   else
  65.                                   {
  66.                                   if(verb6==NULL)
  67.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s, %s\n\n", verb, verb2, verb3, verb4, verb5);    
  68.                                  
  69.                                   else
  70.                                   {
  71.                                   if(verb7==NULL)
  72.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s, %s, %s\n\n", verb, verb2, verb3, verb4, verb5, verb6);    
  73.                                  
  74.                                   }}}}
  75.                                  
  76.                                   break;
  77.                                  
  78.                              case 3:
  79.                                   break;
  80.                                  
  81.                              default:
  82.                                       system("cls");
  83.                                    printf("\n Opcion no valida, intentelo de nuevo\n");
  84.                                      break;              
  85.                          }
  86.                          
  87.                        }while(opcion_mal != 1 && opcion_mal != 2 && opcion_mal != 3);
  88.                                                  
  89.                          
  90.                        }
  91.                          }while(opcion_mal == 1);
  92.                          }
  93.    
  94.     int main(){  
  95.                          
  96.   case 1:         //os paso directamente al case
  97.                         verb = betray;
  98.                         verb2 = traicionar;                        
  99.                         verb3, verb4, verb5, verb6, verb7;
  100.                        
  101.                         e_verbo();// llamo a la funcion
  102.                        
  103.                      
  104.                        break;
  105.                        
  106.                        return 0;
  107.                        }
  #13 (permalink)  
Antiguo 24/01/2012, 14:21
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: funcion compleja

Es xq a la variable verbo la declaraste como char (linea 3) y no como char *, x eso la funcion strcmp te tira error

Saludos
  #14 (permalink)  
Antiguo 24/01/2012, 14:38
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

NO es eso, por favor, no digas cosas sin saber. En los otros he puesto * porque se va a asignar a otro char, pero verbo es solo para comparar. Sin mala intencion :)
  #15 (permalink)  
Antiguo 24/01/2012, 14:43
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 4 meses
Puntos: 25
Respuesta: funcion compleja

proba cambiando la linea 15 por lo siguiente:

Código C:
Ver original
  1. if(strcmp(&verbo,verb)==0)

solamente agregue el &
  #16 (permalink)  
Antiguo 24/01/2012, 14:49
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: funcion compleja

Sabes el uso de la funcion strcmp?? sabes la diferencia entre un char y una cadena??? si declaras char verbo; xq en el scanf pones %s (linea 13)?? no deberia ser %c???
El strcmp recibe dos char * como argumentos, ES UN ERROR PASERLE UN CHAR! al menos pasale la direccion de verbo para que funcione
  #17 (permalink)  
Antiguo 24/01/2012, 15:14
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

a ver, cuando el char es de una letra, por ejemplo 'a', se pone %c
pero cuando el char tiene mas de un caracter se convierte en CADENA por lo que se pone %s.
  #18 (permalink)  
Antiguo 24/01/2012, 15:31
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: funcion compleja

A si!! ahora el tipo de dato char, definido como char verbo; se puede usar como una cadena?? Decime en que lenguaje estamos hablando xq eso no es C?? sabias que con char solo podes almacenar un byte osea un solo caracter?? como haces con un char para almacenar una cadena, me gustaria saberlo

Bueno no voy a discutir mas con vos, este foro esta para ayudar y se ve que vos no queres aprender, yo solo me fije en tu codigo y respondi segun a eso. pero que vos digas "NO es eso, por favor, no digas cosas sin saber" esta muy mal toda respuesta se agradece
  #19 (permalink)  
Antiguo 24/01/2012, 15:53
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

ok perdoname por favor por haber ofendido, simplemente es que me estoy frusrando demasiado, lo siento :S

A ver si tengo esto bien o estoy equivocado. a un char si quieres poner por ejemplo la palabra alvaro, haces:
Código C:
Ver original
  1. char[7] = "alvaro"
". Asi es una cadena, no?

Perdon otra vez por la tonta discusion :)
  #20 (permalink)  
Antiguo 24/01/2012, 15:59
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

y starfix, con eso que dijiste de ñadir el & me funciona ya bien, lo malo es que ahora me manda un mensaje porque tengo que añadirselo a los otros verbos, que son mas de 200 :/

pero lo extraño es que antes no hacia falta poner eso, y tras hacer una funcion aparte y borrarla y dejar el programa como estaba, me da error, no lo entiendo
  #21 (permalink)  
Antiguo 24/01/2012, 16:44
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 4 meses
Puntos: 25
Respuesta: funcion compleja

Cita:
Iniciado por richard_h Ver Mensaje
y starfix, con eso que dijiste de ñadir el & me funciona ya bien, lo malo es que ahora me manda un mensaje porque tengo que añadirselo a los otros verbos, que son mas de 200 :/
cuales son los otros 200?, son los que pondras mas adelante en los cases dentro de main?
  #22 (permalink)  
Antiguo 25/01/2012, 11:31
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

starfix: no, ya los tengo puestos. LA opcion que os he enseñado, el verbo traicionar, era el case numero 209, asi que......

Pero es que lo EXTRAÑO es que antes no necesitaba ese & y funcionaba perfectamente, y ahora no se que he hecho que me da error. Además he añadido una nueva opcion que es mostrar la traduccion del verbo, y es muy extraño porque a al principio me sale bien, le doy a menu y al inentarlo no me va, despues si, y asi bastantes veces, no se que pasa.

Os paso el codigo con el case del verbo traicionar.
(por cierto ya se que hay algunos goto, pero por ahora mi problema es que funcione la funcion, mas adelante rematare eso :).

Código C:
Ver original
  1. int cont=0;
  2.     int aleatorio_ingles=0,opcion,opcion_espanol,opcion_mal,opcion_verbo;
  3.     char verbo[];
  4.     char *verb, *verb2, *verb3, *verb4, *verb5, *verb6, *verb7;
  5.    
  6.     int aleatorio_espanol=0,opcion_verbo2;
  7.    
  8.    
  9.     char traicionar[15]="traicionar", betray[8]="betray";
  10.    
  11.    
  12.     void e_verbo()
  13.                   {
  14.                   system("cls");
  15.                        do{
  16.                        printf("\n Traduzca %s: ",verb2);
  17.                        scanf(" %[^\n]s",&verbo);
  18.                        if(strcmp(verbo,verb)==0)
  19.                        {
  20.                           system("cls");
  21.                           printf("\n Muy bien.\n\n");
  22.                           do{
  23.                           printf(" 1-. Otro verbo\n");
  24.                           printf("\n 2-. Menu\n");
  25.                           printf("\n\n Que desea hacer ahora?: ");
  26.                           scanf(" %d",&opcion_verbo);
  27.                          
  28.                           if(opcion_verbo < 1 || opcion_verbo > 2)
  29.                           {
  30.                                    system("cls");
  31.                                    printf("\n Opcion incorrecta, intentelo de nuevo: \n\n");
  32.                            }
  33.                           }while(opcion_verbo != 1 && opcion_verbo != 2);
  34.                        }
  35.                        else
  36.                        {
  37.                           system("cls");                          
  38.                           printf("\n Lo siento, traduccion incorrecta\n");
  39.                           do{
  40.                           printf("\n 1-. Volver a intentarlo\n");
  41.                           printf("\n 2-. Ver traduccion\n");                          
  42.                           printf("\n 3-. Menu\n");
  43.                           scanf(" %d",&opcion_mal);
  44.                          
  45.                          switch(opcion_mal)
  46.                          {
  47.                              case 1:
  48.                                   system("cls");
  49.                                   break;
  50.                              
  51.                              case 2:
  52.                                   system("cls");
  53.                                   if(verb3==NULL)
  54.                                   printf("\n La traduccion del verbo %s es: %s\n\n", verb2, verb);
  55.                                  
  56.                                   else
  57.                                   {
  58.                                   if(verb4==NULL)
  59.                                   printf("\n La traduccion del verbo %s es: %s, %s\n\n", verb2, verb, verb3);
  60.                                  
  61.                                   else
  62.                                   {
  63.                                   if(verb5==NULL)
  64.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s\n\n", verb2, verb, verb3, verb4);    
  65.                                  
  66.                                   else
  67.                                   {
  68.                                   if(verb6==NULL)
  69.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s, %s\n\n", verb2, verb, verb3, verb4, verb5);    
  70.                                  
  71.                                   else
  72.                                   {
  73.                                   if(verb7==NULL)
  74.                                   printf("\n La traduccion del verbo %s es: %s, %s, %s, %s, %s\n\n", verb2, verb, verb3, verb4, verb5, verb6);    
  75.                                  
  76.                                   }}}}
  77.                                  
  78.                                   break;
  79.                                  
  80.                              case 3:
  81.                                   break;
  82.                                  
  83.                              default:
  84.                                       system("cls");
  85.                                    printf("\n Opcion no valida, intentelo de nuevo\n");
  86.                                      break;              
  87.                          }
  88.                          
  89.                        }while(opcion_mal != 1 && opcion_mal != 2 && opcion_mal != 3);
  90.                                                  
  91.                          
  92.                        }
  93.                          }while(opcion_mal == 1);
  94.     }
  95.  
  96.   int main(){  
  97.                          
  98.   case 210://paso directamente al case:
  99.                         verb = rattle;
  100.                         verb2 = sonar;                        
  101.                         verb3 = vibrar, verb4, verb5, verb6, verb7;
  102.                        
  103.                         e_verbo();
  104.                        
  105.                         if (opcion_verbo == 1){  
  106.                         system("cls");                        
  107.                         goto aleatorio_espanol;}
  108.                                                
  109.                         if(opcion_verbo == 2 || opcion_mal == 3){system("cls");}
  110.                        
  111.                         if(opcion_mal == 2) goto menu;
  112.                                    
  113.                                                      
  114.                        break;
  #23 (permalink)  
Antiguo 25/01/2012, 14:15
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Pon comillas cuando asignas cadenas a variables.
Código C:
Ver original
  1. verb = "rattle";
  2. verb2 = "sonar";

Ahora dime una cosa, el compilador te da algun problema o el problema sucede cuando el programa ya esta en marcha?
  #24 (permalink)  
Antiguo 25/01/2012, 14:38
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

Cita:
Pon comillas cuando asignas cadenas a variables.
Pero estoy asignando una variable a puntero(verb), no una cadena. Por eso sale * de puntero que apunta a la memoria de un verbo.

Pero no se si eso esta bien, hasta ahora me ha funcionado. Acabo de cambiar eso por entre comillas y no me funciona. Podrias pegar el codigo como tu aconsegas?

gracias :)
  #25 (permalink)  
Antiguo 25/01/2012, 14:45
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Ah, ya entiendo, tienes rattle declarado como cadena anteriormente no? Es que en el codigo que has puesto no se ve bueno supongo que será así. De todos modos lo de hacerlo con punteros me parece un poco extraño, nose cada programador piensa como quiere, ahora bien recuerda inicializar los punteros.
Código C:
Ver original
  1. char *puntero = NULL;
Así el compilador entiende que ese puntero no apunta a ninguna parte, si los declaras sinn inicializar, estos punteros pueden apuntar a cualquier lado, cosa que no es muy recomendable.
  #26 (permalink)  
Antiguo 25/01/2012, 15:32
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

ah, perdona, se me olvido ponerlo en el codigo :P

yo soy novato en esto, asi que quiero seguir tu consejo, me he liado demasiado con los punteros.

Lo que tu dices seria hacer verb = "rattle", no? pero entonces a verb habria que quitarle el * de puntero, no?

Si es eso, lo he intentado y al poner la traduccion y darle al enter, el programa no responde no se por que.

Ademas en TODOS los cases, que son unos cuantos, me poner error con el strcmp: passing arg 1 of strcmp makes pointer from integer without a cast.

Que hago? ayudaaa ;)
  #27 (permalink)  
Antiguo 26/01/2012, 13:25
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Yo creo que te complicas mucho, yo de ti haria el mismo programa de otra manera:

Creas una variable global verbo de ponle 20 caracteres, que no creo que haya muchos verbos mas grandes que eso.
Código C:
Ver original
  1. char verbo[20];

Y ahora para cada case asignas a la variable una cadena, me explico:

Código C:
Ver original
  1. case 1: verbo = "run";
  2.                 ...
  3. case 2: verbo= "start";
  4.                ...

Y asi en todos los cases. Lo de los punteros no lo encuentro muy util nose. Lo has hecho por alguna razon en concreto?
  #28 (permalink)  
Antiguo 26/01/2012, 15:40
 
Fecha de Ingreso: enero-2012
Mensajes: 17
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: funcion compleja

estoy desesperado, no se que le pasa al codigo. Hice lo que me dijiste pero me dice incopatyble type in assignment, cuando pongo el [20] y le quito el *.

Y sobre la variable verbo, hay tres tipos. Uno es verbo, que guarda el verbo que escribo, y los otros dos dos son verb y verb2, que son los verbos en ingles y español para compararlos con el que he ingresado.

Ademas he visto que no se puede hacer
Código C:
Ver original
  1. verbo="run";
porque da error. habria que hacerlo caracter por caracter.
Código C:
Ver original
  1. verbo[0]='r';
  2.     verbo[1]='u';
  3.     verbo[2]='n';
  4.     verbo[3]='\0';

Asi que, que hago?

gracias :)

Última edición por richard_h; 26/01/2012 a las 16:01
  #29 (permalink)  
Antiguo 27/01/2012, 01:10
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: funcion compleja

En C no puedes asignar directamente un valor a una cadena de caracteres. Utiliza

Código C:
Ver original
  1. strcpy(verbo, "run");
  #30 (permalink)  
Antiguo 27/01/2012, 09:12
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: funcion compleja

Cita:
Iniciado por Fw190 Ver Mensaje
En C no puedes asignar directamente un valor a una cadena de caracteres. Utiliza

Código C:
Ver original
  1. strcpy(verbo, "run");
Cierto, es que estaba programando con python y a veces se me cuelan xD

Mea culpa.

Etiquetas: funcion
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:25.