Problema con llamadas entre funciones.

Iniciado por doitunkboo, 18 Diciembre 2018, 22:37 PM

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

doitunkboo

Hola, tengo que resolver un ejercicio en C, que consiste en escribir una función con el siguiente prototipo: int primoMayor(int num). La función recibe un número en la variable num y ha de devolver el mayor de los primos comprendido entre 2 y el valor de num. Esta función ha de valerse para esto de llamadas a la función esPrimo().

El programa principal debe solicitar un número mayor o igual a 2, que llame a la función primoMayor() y muestre el valor que devuelva por pantalla.

Este sería un ejemplo del programa:

Introduce un número superior a 1: 7
El mayor primo comprendido entre 2 y 7 es 7.

Esto es lo que llevo por el momento, no tengo claro como hacer el bucle que determine que número de todos los primos es el mayor, a ver si podéis ayudarme, gracias.


#include <stdio.h>
#include <math.h>

int esPrimo(int num) {
   int i;
   for (i=2; i<=sqrt(num); i++) {
       if (num%i == 0) {
           return 0;
       }
   }
   return 1;
}

int primoMayor(int num){
   int n, mayor;
   mayor=0;
   for (n=2;n<=num;n++)
   {
       if (esPrimo(n)>mayor)
           mayor=esPrimo(n);
   }

}

int main() {
   int num, n, i, mayor;

   do {
   printf("Introduce un número superior a 1: ");
   scanf("%d", &num);
   } while (num<0);

   primoMayor(num);

   if (primoMayor(num)){
       for(n=2;n<=num;n++){
           if (esPrimo(n))
               mayor=primoMayor(num);
       }
   }
   else
   printf("El número %d no es primo.\n", num);
   return 0;

   printf("El mayor primo comprendido entre 2 y %d es %d", num, mayor);
   return 0;
}

MAFUS

En la función primoMayor:
if (esPrimo(n)>mayor)
    mayor=esPrimo(n);

Esto no puede funcionar muy bien ya que esPrimo sólo devuelve 0 o 1.

doitunkboo

El problema es que debo resolver el ejercicio sin tocar esa función (esPrimo), por eso no logro hacerlo funcionar  :-(

MAFUS

La función no debes tocarla pues te sirve para saber si un número es primo o no. Pero sólo eso, sólo indica si un número es primo o no. Una vez que lo sabes debes hacer algo con ese número, no con la función.

doitunkboo

#4
Otro intento


#include <stdio.h>
#include <math.h>

int esPrimo(int num) {
   int i;
   for (i=2; i<=sqrt(num); i++) {
       if (num%i == 0) {
           return 0;
       }
   }
   return 1;
}

int primoMayor(int num){
   int n, mayor;

   for (n=2;n<=num;n++) // bucle para encontrar el número mayor
   {
       if (esPrimo(n))
           mayor=esPrimo(n);
   }
   return;
}

int main() {
   int num, n, i, mayor;

   do {
   printf("Introduce un número superior a 1: ");
   scanf("%d", &num);
   } while (num<0);

   i=num; // muevo el valor de num a i

   if (esPrimo(num)){
       primoMayor(i); // si el número introducido  es primo envío a la función primoMayor el valor
   }
   else {
   printf("El número %d no es primo.\n", num);
   return 0;
   }

   printf("El mayor primo comprendido entre 2 y %d es %d\n", num, primoMayor(num));
   return 0;
}


He hecho algunas modificaciones al código pero sigue sin funcionar correctamente, se que no hago bien alguno de los pasos, a ver si tu puedes ayudarme a entenderlo, gracias.

MAFUS

En primoMayor debes devolver un entero, pues así lo indica la firma de la función, pero no devuelves nada.

doitunkboo

Y como lo hago, con esto por ejemplo?
return mayor;

Me estoy dando cuenta que a la función primoMayor accede 2 veces y no se porqué  :-\

MAFUS

Resuelto este problema ahora tienes otro:

Llamas a la función primoMayor dos veces:
en main

una aquí
if (esPrimo(num)){
        primoMayor(i); // si el número introducido  es primo envío a la función primoMayor el valor
}


y otra aquí
printf("El mayor primo comprendido entre 2 y %d es %d\n", num, primoMayor(num));
return 0;


Deberías encontrar la forma de llamarla sólo una vez, que es cuándo te interese conseguir ese número.

doitunkboo

Gracias tio, mira para empezar estaba desarrollando mal el ejercicio, no lo terminaba de entender hasta que me he dado cuenta que no hay que comprobar si el número introducido por el usuario es primo o no, simplemente ese número marca el límite de la comprobación en la búsqueda del primo mayor, y reconozco que me ha costado  :xD

Ya lo he resuelto, el código quedaría mas o menos así, también he añadido la llamada a esPrimo() desde la función primoMayor() porque no estaba utilizando la función tal y como se pide en el ejercicio.


#include <stdio.h>
#include <math.h>

int esPrimo(int num) {
    int i;
    for (i=2; i<=sqrt(num); i++) {
        if (num%i == 0) {
            return 0;
        }
    }
    return 1;
}

int primoMayor(int num){
    int n, mayor;

    for (n=2;n<=num;n++){
        if (esPrimo(n))
            mayor=n;
    }
    return mayor;
}

int main() {
    int num, x, mayor;

    do {
    printf("Introduce un número superior a 1: ");
    scanf("%d", &num);
    } while (num<0);

    x=num;
    mayor=primoMayor(x);

    printf("El mayor primo comprendido entre 2 y %d es %d\n", num, mayor);
    return 0;
}


Saludos!

MAFUS

Muy bien.

Incluso puedes sustituir
x=num;
mayor=primoMayor(x);


Por
mayor=primoMayor(num);
Y eliminar x de la definición.