elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda llamar funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda llamar funciones  (Leído 3,140 veces)
samsums91

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Duda llamar funciones
« en: 9 Enero 2013, 21:27 pm »

Hola, lo primero saludarles por primera vez ya que me acabo de registrar. Lo segundo decidles que procurare no cagarla con las normas del foro.

Bueno pues al lio: estoy haciendo una practica en la que me obligan a hacer un menu mediante un switch e invocar distintas funciones que he tenido que crear yo mismo. Tras largo tiempo tiempo pensando he decidio preguntar por aqui cua es mi error (errores mas bien) en este codigo:

#include<stdio.h>
int factorial(int n);

int main (void){

void menu();

}



void menu(){

int opcion;

printf( "Marque la opción que prefiera\n");
printf( "0 Salir del programa\n");
printf( "1 Calcular el factorial de una número\n");
printf( "2 Comprobar si un número es primo\n");
printf( "3 Calcular el mínimo común múltiplo\n");
printf( "4 Calcular el máximo común divisor\n");
printf( "5 Determinar si un año es bisiesto\n");
printf( "6 Mostrar los años bisiestos\n");
printf( "7 Mostrar número de dias de un mes y año\n");
printf( "8 Calcular números combinatorios\n");
printf( "9 Operar números racionales\n");
printf( "10 Jugar al doble o nada\n");
***(solo les pido ayuda la opcion 1 porque las demas son de igual manera)
scanf("%d",&opcion);



switch (opcion){

   

   case 1:
       
     int numero, resultado;
       printf("Introduzca el número");
        scanf("%d", &n);
        resultado = factorial(n);
      printf(“El factorial de %d es %d”, numero, resultado);
       
       return 0;

      break;



     default:
       printf("Válido\n");

}




int factorial(int n){
if(n > 1)
return n * factorial(n-1);
return 1;

}


No hace falta decir que esta mal, pero no consigo ver y resolver el problema, se que no gacen tarea de los demas pero si me guian sobre esta las otras nueve invocaciones seran mas sencillas dado que son del mismo tipo y dificultad.

Por cierto pra matar dos pajaros de un tiro: ¿como puedo invocar una funcion dentro de otra funcion para despues invocarla en main?

MUchas gracias y espero haberme explicado medianamente bien, saludos y gracias de ante mano.


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Duda llamar funciones
« Respuesta #1 en: 9 Enero 2013, 21:52 pm »

Hola samsums91, tus errores son:
  • No llamas bien a la función menu en el main.
  • No puedes poner dos return's seguidos sin indicar que es un else ( función factorial)
  • Tienes que declarar la variable n en la función menu.
  • No se pueden declarar variables dentro de un case , a menos que utilices las llaves.
  • La variable número no contiene nada cuando se muestra.
  • Tienes que especificar el valor de retorno en el main.
Te dejo tu código con los errores indicados:
Código
  1. #include<stdio.h>
  2. int factorial(int n);
  3. //<------------------------------------ El prototipo de menu va aquí..
  4. int main (void)
  5. {
  6.    void menu();//<-------------------- cuando se llama a una función no se pone el valor de retorno!!!!!
  7.    //<-------------------------------- necesitas especificar el valor de retorno del main...
  8. }
  9.  
  10. void menu()
  11. {
  12.    int opcion;
  13.  
  14.    printf( "Marque la opción que prefiera\n");
  15.    printf( "0 Salir del programa\n");
  16.    printf( "1 Calcular el factorial de una número\n");
  17.    printf( "2 Comprobar si un número es primo\n");
  18.    printf( "3 Calcular el mínimo común múltiplo\n");
  19.    printf( "4 Calcular el máximo común divisor\n");
  20.    printf( "5 Determinar si un año es bisiesto\n");
  21.    printf( "6 Mostrar los años bisiestos\n");
  22.    printf( "7 Mostrar número de dias de un mes y año\n");
  23.    printf( "8 Calcular números combinatorios\n");
  24.    printf( "9 Operar números racionales\n");
  25.    printf( "10 Jugar al doble o nada\n");
  26.  
  27.    scanf("%d",&opcion);
  28.  
  29.  
  30.  
  31.    switch (opcion)
  32.    {
  33.    case 1:
  34.  
  35.        int numero, resultado;//<---------------------- No puedes declarar las variables aquí a menos que uses llaves dentro del case.
  36.        printf("Introduzca el número");
  37.        scanf("%d", &n);//<---------------------------- n no está declarada
  38.        resultado = factorial(n);
  39.        printf("El factorial de %d es %d", numero, resultado);
  40.        return 0;//<------------------ una función void no retorna nada...
  41.        break;
  42.    default:
  43.        printf("Válido\n");
  44.    }
  45. }
  46. int factorial(int n)
  47. {
  48.    if(n > 1)
  49.        return n * factorial(n-1);
  50.    //<---------------------------------- Aquí va un else...
  51.    return 1;
  52. }
  53.  
No entiendo esta pregunta:
Citar
¿como puedo invocar una funcion dentro de otra funcion para despues invocarla en main?
PD: Estos son los que veo yo así rápido , si algún usuario quiere concretar o corregirme que lo haga , que últimamente no doy una  :laugh: ¡Un saludo!


« Última modificación: 9 Enero 2013, 21:58 pm por avesudra » En línea

Regístrate en
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Duda llamar funciones
« Respuesta #2 en: 9 Enero 2013, 21:58 pm »

Hola! primero los errores:

- En el swtich, usas la variable n para el scanf pero esa variable nunca la declaras

- El return 0 en menu esta demas, primero porque menu no retorna nada, es void, y segundo porque no hace falta que obligues a que la funcion termine desde ese punto(o cualquier otro)


Para una mejor estructuracion y generalizacion de funciones, te doy algunos consejos: si la funcion se llama menu, lo que deberia hacer esta funcion es solo mostrar las opciones(los printf) y nada mas. Luego seria conveniente poner el switch dentro del main y finalmente en cada case haces las llamadas a las distintas funciones; ejemplo:
Código
  1. int main() {
  2.  menu();
  3.  /* ...... */
  4.  switch(opcion) {
  5.     case 1:
  6.          funcion1(); /* llamo a funcion */
  7.     /* ........*/
  8.    case 2:
  9.         funcion2();
  10.   /* ......... */
  11.  }
  12.  
  13. return 0;
  14. }

Saludos

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
« Última modificación: 9 Enero 2013, 22:00 pm por durasno » En línea

Ahorrate una pregunta, lee el man
samsums91

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda llamar funciones
« Respuesta #3 en: 9 Enero 2013, 23:57 pm »

Muchas gracias por las respuestas, pero sigo sin verlo, se que comento errores de bulto y trabajo para corregirlos, y perdonad por ser asi de malo xd.

No consigo corregirlo y no termino de entender los errores, he leido esto, he releido los apuntes, internet... y no consigo dar ese pasito para sacarlo uff.

Reformulo la pregunta para ver si asi me entero yo:

Código:
int main() {
  menu();
  /* ...... */
  switch(opcion) {
     case 1:
          funcion1(); /* llamo a funcion */
     /* ........*/
    case 2:
         funcion2();
   /* ......... */
  }
 
return 0;
}

Esa estructura es me gusta y viéndolo desde tu razonamiento tienes toda la razon. Pero sigo sin ver un par de cosas. Yo creo un funcion cualquiera para después, según el numero marcado y mediente el switch, esta se ejecute pero que me pida valores de una/s variables. La verdad es que me pierdo porque no se si esas variables, a las que el usuario debe de dar un valor, deben de ser declaradas dentro del cada caso del switch o en cada función, no se si me explico.

Y al compilar hay un error que no se a que se refiere a ver si vosotros lo comprendeis:  una etiqueta sólo puede ser parte de una declaración y una declaración no es un enunciado.

Vuelvo a decir que sera por incompetencia mia, no lo dudo, pero sigo sin verlo, tengo hechas todas las funciones, mi unico problema esque no se llamarlas adecuadamente en el switch, haciendo asi un menu opciones, y donde tengo que declarar las variables a las cuales el usuario de debe dar valor.

Muchas gracias de antemano! Agradeceria un ejemplo practico para verlo mas claro y poder extrapolarlo a mis funciones. Por supuesto, ni mucho digo que tenga q ser mi codigo, con que sea que te pida dos numero para sumar me basta me sobra y me doy con un canto en los dientes.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Duda llamar funciones
« Respuesta #4 en: 10 Enero 2013, 02:32 am »

Citar
se que comento errores de bulto y trabajo para corregirlos, y perdonad por ser asi de malo xd.
trabquilo todo es cuestion de tiempo y practica.

Citar
La verdad es que me pierdo porque no se si esas variables, a las que el usuario debe de dar un valor, deben de ser declaradas dentro del cada caso del switch o en cada función,
creo q eso depende de cada uno, si declaras las variables en el main esta bien y si lo haces en las funciones tambien. Solo que si haces todo en la funcion entonces la funcion no recibiria ningun parametro y no retornaria nada(lo cual no me gusta mucho xD)
Nota: segun lo que dijo avesudra no se pueden declarar variables en el case, pero por lo que tengo entendido,segun el C99, se puede hacer en cualquier parte. Igual solo es cuestion de probar y listo

Citar
Agradeceria un ejemplo practico para verlo mas claro y poder extrapolarlo a mis funciones
Solo ordene un poco lo que tenias:
Código
  1. #include <stdio.h>
  2.  
  3. void menu(void);
  4. int factorial(int n);
  5. int primo(int n); /* nose como hiciste esta funcion, pero podrias hacer que si el numero ingresado es primo entonces retorne 1, de lo contrario retorne 0 */
  6.  
  7. int main() {
  8.  
  9.  int numero,opcion, resultado;
  10.  menu();
  11.  
  12.  scanf("%d",&opcion);
  13.  
  14.  switch (opcion)
  15.   {
  16.   case 1:
  17.  
  18.       printf("Introduzca el número");
  19.       scanf("%d", &numero);
  20.       resultado = factorial(numero);
  21.       printf("El factorial de %d es %d", numero, resultado);
  22.       break;
  23.   case 2:
  24.       printf("Introduzca el número");
  25.       scanf("%d", &numero);
  26.       resultado=primo(numero);
  27.  
  28.      if(resultado==1)
  29.         printf("EL numero es primo\n");
  30.      else
  31.         printf("EL numero no es primo \n");
  32.      break;
  33.   } /* fin del switch */
  34.  
  35. return 0;
  36. } /* fin del main */
  37.  
  38. /* .................. Aca van todas las funciones */  


Saludos

PD: el error nose que es
« Última modificación: 10 Enero 2013, 02:35 am por durasno » En línea

Ahorrate una pregunta, lee el man
samsums91

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda llamar funciones
« Respuesta #5 en: 10 Enero 2013, 18:04 pm »

Uffff me habeis salvado!! Muchisimas gracias ya mas o menos veo que me anda todo!  Pero no me termina de andar esto, son errores de funcione y me suena a mi que esta en los return que estan mal colocados que pensais¿?
Código:
#include <stdio.h>
 
void menu(void);
int factorial(int n);
int primo(int n);
int main() {
 
  int numero,opcion, resultado;
  menu();
 
  scanf("%d",&opcion);
 
  switch (opcion){
   
   case 1:
       printf("Introduzca el número\n");
       scanf("%d", &numero);
       resultado = factorial(numero);
       printf("El factorial de %d es %d\n", numero, resultado);
       break;

   case 2:
       printf("Introduzca el número\n");
       scanf("%d", &numero);

       resultado=primo(numero);
 
      if(resultado==1){
         printf("EL numero es primo\n");
}
      else{
         printf("EL numero no es primo \n");
}
      break;
   }
return 0;
}



void menu(){

printf( "Marque la opción que prefiera\n");
printf( "0 Salir del programa\n");
printf( "1 Calcular el factorial de una número\n");
printf( "2 Comprobar si un número es primo\n");
printf( "3 Calcular el mínimo común múltiplo\n");
printf( "4 Calcular el máximo común divisor\n");
printf( "5 Determinar si un año es bisiesto\n");
printf( "6 Mostrar los años bisiestos\n");
printf( "7 Mostrar número de dias de un mes y año\n");
printf( "8 Calcular números combinatorios\n");
printf( "9 Operar números racionales\n");
printf( "10 Jugar al doble o nada\n");

}




int factorial (int n){

int fact, x;

x=1;
fact=1;

while(x<=n){

fact = fact*x++;

}
return fact;
}



int primo(int n){

int x=2;
       
while(x<n){

   while(n%x!=0){

          x=x++;

    if(n==x)                         
     
      return 1;

    else
     
      return 0;
}
}
}

En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda llamar funciones
« Respuesta #6 en: 10 Enero 2013, 18:54 pm »

Uffff me habeis salvado!! Muchisimas gracias ya mas o menos veo que me anda todo!  Pero no me termina de andar esto, son errores de funcione y me suena a mi que esta en los return que estan mal colocados que pensais¿?

La función primo no estaba bien implementada y la que tenías de factorial inicialmente era mejor.
Te he incluido la librería "#include<locale.h>" con la instrucción en el main de "setlocale(LC_ALL, "Spanish");", lo que permite que se vean los acentos y no símbolos extraños.:

Código
  1. #include <stdio.h>
  2. #include<locale.h>
  3. void menu(void);
  4. int factorial(int n);
  5. int primo(int n);
  6. int main() {
  7.    int numero,opcion, resultado;
  8.    setlocale(LC_ALL, "Spanish");
  9.    while (1){
  10.        menu();
  11.        scanf("%d",&opcion);
  12.        switch (opcion){
  13.           case 0: return 2;
  14.           case 1:
  15.               printf("Introduzca el número: ");
  16.               scanf("%d", &numero);
  17.               resultado = factorial(numero);
  18.               printf("El factorial de %d es %d\n\n\n", numero, resultado);
  19.               break;
  20.           case 2:
  21.                printf("Introduzca el número: ");
  22.                scanf("%d", &numero);
  23.                resultado=primo(numero);
  24.                if(resultado==1)
  25.                    printf("EL número %d es primo\n\n\n",numero);
  26.                else
  27.                    printf("EL número %d no es primo \n\n\n",numero);
  28.                break;
  29.           }
  30.    }
  31. return 0;
  32. }
  33. /******************* MENU **********************/
  34. void menu(){
  35.  
  36.    printf( "Marque la opción que prefiera\n");
  37.    printf( "0 Salir del programa\n");
  38.    printf( "1 Calcular el factorial de una número\n");
  39.    printf( "2 Comprobar si un número es primo\n");
  40.    printf( "3 Calcular el mínimo común múltiplo\n");
  41.    printf( "4 Calcular el máximo común divisor\n");
  42.    printf( "5 Determinar si un año es bisiesto\n");
  43.    printf( "6 Mostrar los años bisiestos\n");
  44.    printf( "7 Mostrar número de dias de un mes y año\n");
  45.    printf( "8 Calcular números combinatorios\n");
  46.    printf( "9 Operar números racionales\n");
  47.    printf( "10 Jugar al doble o nada\n");
  48.  
  49. }
  50. /****************** FACTORIAL ******************/
  51. int factorial(int n)
  52. {
  53.    if(n > 1)
  54.        return n * factorial(n-1);
  55.    else
  56.        return 1;
  57. }
  58. /***************** PRIMO ***********************/
  59. int primo(int n){
  60.    int x=2;
  61.    while(x<n){
  62.        if (n%x==0)
  63.            return 0;
  64.          x=x++;
  65.    }
  66.    return 1;
  67. }
  68. /*********************************************/
  69.  
Saluditos!.
En línea

samsums91

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda llamar funciones
« Respuesta #7 en: 10 Enero 2013, 18:58 pm »

Muchisimas gracias a todos!!! Todo solucionado!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como llamar automaticamente funciones AJAX ??
PHP
Diabliyo 3 7,622 Último mensaje 28 Agosto 2008, 15:53 pm
por Ragnarok
[DUDA] Cargar Dll de VB y Llamar las funciones de la misma!!!!!
Programación C/C++
m[a]rkus 0 3,230 Último mensaje 9 Agosto 2010, 18:29 pm
por m[a]rkus
Llamar dos funciones AJAX en onChange
Desarrollo Web
KateLibby 7 12,698 Último mensaje 26 Octubre 2011, 11:29 am
por KateLibby
Es posible llamar funciones en un bucle?
Programación C/C++
muymuyperdido 2 2,590 Último mensaje 25 Diciembre 2012, 20:16 pm
por lucaslopez0000
[Ayuda] ¿Por que no puedo llamar funciones en C?
Programación C/C++
Proxmond 4 2,295 Último mensaje 3 Junio 2014, 05:40 am
por Proxmond
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines