Duda llamar funciones

Iniciado por samsums91, 9 Enero 2013, 21:27 PM

0 Miembros y 3 Visitantes están viendo este tema.

samsums91

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.

avesudra

#1
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:
#include<stdio.h>
int factorial(int n);
//<------------------------------------ El prototipo de menu va aquí..
int main (void)
{
   void menu();//<-------------------- cuando se llama a una función no se pone el valor de retorno!!!!!
   //<-------------------------------- necesitas especificar el valor de retorno del main...
}

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");

   scanf("%d",&opcion);



   switch (opcion)
   {
   case 1:

       int numero, resultado;//<---------------------- No puedes declarar las variables aquí a menos que uses llaves dentro del case.
       printf("Introduzca el número");
       scanf("%d", &n);//<---------------------------- n no está declarada
       resultado = factorial(n);
       printf("El factorial de %d es %d", numero, resultado);
       return 0;//<------------------ una función void no retorna nada...
       break;
   default:
       printf("Válido\n");
   }
}
int factorial(int n)
{
   if(n > 1)
       return n * factorial(n-1);
   //<---------------------------------- Aquí va un else...
   return 1;
}

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!
Regístrate en

durasno

#2
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:
int main() {
 menu();
 /* ...... */
 switch(opcion) {
    case 1:
         funcion1(); /* llamo a funcion */
    /* ........*/
   case 2:
        funcion2();
  /* ......... */
 }

return 0;
}


Saludos

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
Ahorrate una pregunta, lee el man

samsums91

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:

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.

durasno

#4
Citarse 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.

CitarLa 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

CitarAgradeceria un ejemplo practico para verlo mas claro y poder extrapolarlo a mis funciones
Solo ordene un poco lo que tenias:
#include <stdio.h>

void menu(void);
int factorial(int n);
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 */

int main() {
 
 int numero,opcion, resultado;
 menu();
 
 scanf("%d",&opcion);

 switch (opcion)
  {
  case 1:

      printf("Introduzca el número");
      scanf("%d", &numero);
      resultado = factorial(numero);
      printf("El factorial de %d es %d", numero, resultado);
      break;
  case 2:
      printf("Introduzca el número");
      scanf("%d", &numero);
      resultado=primo(numero);

     if(resultado==1)
        printf("EL numero es primo\n");
     else
        printf("EL numero no es primo \n");
     break;
  } /* fin del switch */

return 0;
} /* fin del main */

/* .................. Aca van todas las funciones */  



Saludos

PD: el error nose que es
Ahorrate una pregunta, lee el man

samsums91

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¿?
#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;
}
}
}


leosansan

Cita de: samsums91 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¿?

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 (cpp) [Seleccionar]
#include <stdio.h>
#include<locale.h>
void menu(void);
int factorial(int n);
int primo(int n);
int main() {
    int numero,opcion, resultado;
    setlocale(LC_ALL, "Spanish");
    while (1){
        menu();
        scanf("%d",&opcion);
        switch (opcion){
           case 0: return 2;
           case 1:
               printf("Introduzca el número: ");
               scanf("%d", &numero);
               resultado = factorial(numero);
               printf("El factorial de %d es %d\n\n\n", numero, resultado);
               break;
           case 2:
                printf("Introduzca el número: ");
                scanf("%d", &numero);
                resultado=primo(numero);
                if(resultado==1)
                    printf("EL número %d es primo\n\n\n",numero);
                else
                    printf("EL número %d no es primo \n\n\n",numero);
                break;
           }
    }
return 0;
}
/******************* MENU **********************/
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");

}
/****************** FACTORIAL ******************/
int factorial(int n)
{
    if(n > 1)
        return n * factorial(n-1);
    else
        return 1;
}
/***************** PRIMO ***********************/
int primo(int n){
    int x=2;
    while(x<n){
        if (n%x==0)
            return 0;
          x=x++;
    }
    return 1;
}
/*********************************************/

Saluditos!.

samsums91

Muchisimas gracias a todos!!! Todo solucionado!!