Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: doitunkboo en 18 Diciembre 2018, 22:37 pm



Título: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 18 Diciembre 2018, 22:37 pm
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.

Código:
#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;
}


Título: Re: Problema con llamadas entre funciones.
Publicado por: MAFUS en 18 Diciembre 2018, 23:27 pm
En la función primoMayor:
Código:
if (esPrimo(n)>mayor)
    mayor=esPrimo(n);
Esto no puede funcionar muy bien ya que esPrimo sólo devuelve 0 o 1.


Título: Re: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 19 Diciembre 2018, 11:31 am
El problema es que debo resolver el ejercicio sin tocar esa función (esPrimo), por eso no logro hacerlo funcionar  :-(


Título: Re: Problema con llamadas entre funciones.
Publicado por: MAFUS en 19 Diciembre 2018, 12:03 pm
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.


Título: Re: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 19 Diciembre 2018, 12:14 pm
Otro intento

Código:
#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.


Título: Re: Problema con llamadas entre funciones.
Publicado por: MAFUS en 19 Diciembre 2018, 12:21 pm
En primoMayor debes devolver un entero, pues así lo indica la firma de la función, pero no devuelves nada.


Título: Re: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 19 Diciembre 2018, 12:58 pm
Y como lo hago, con esto por ejemplo?
Código:
return mayor;

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


Título: Re: Problema con llamadas entre funciones.
Publicado por: MAFUS en 19 Diciembre 2018, 13:56 pm
Resuelto este problema ahora tienes otro:

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

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

y otra aquí
Código:
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.


Título: Re: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 19 Diciembre 2018, 16:54 pm
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.

Código:
#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!


Título: Re: Problema con llamadas entre funciones.
Publicado por: MAFUS en 19 Diciembre 2018, 17:02 pm
Muy bien.

Incluso puedes sustituir
Código:
x=num;
mayor=primoMayor(x);

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


Título: Re: Problema con llamadas entre funciones.
Publicado por: doitunkboo en 19 Diciembre 2018, 21:48 pm
Genial, me lo apunto para la próxima.  ;-)