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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


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

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Problema con llamadas entre funciones.
« 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;
}


« Última modificación: 18 Diciembre 2018, 22:55 pm por doitunkboo » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #1 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.


En línea

doitunkboo

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #2 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  :-(
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #3 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.
En línea

doitunkboo

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #4 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.
« Última modificación: 19 Diciembre 2018, 12:18 pm por doitunkboo » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #5 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.
En línea

doitunkboo

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #6 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é  :-\
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #7 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.
En línea

doitunkboo

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #8 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!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con llamadas entre funciones.
« Respuesta #9 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.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
perdida del ambito entre llamadas system()
PHP
tragantras 8 4,104 Último mensaje 30 Junio 2010, 01:12 am
por tragantras
Como cifrar llamadas a las funciones en programa C
Programación C/C++
gxg 6 5,684 Último mensaje 15 Abril 2011, 21:59 pm
por jaunx
PROBLEMA ENTRE ARRAY MULTIDIMENSIONAL Y FUNCIONES
Programación C/C++
BJM 2 2,756 Último mensaje 29 Septiembre 2012, 12:47 pm
por leosansan
[C] Argumentos anónimos en llamadas a funciones
Programación C/C++
MAFUS 4 2,295 Último mensaje 23 Diciembre 2015, 17:26 pm
por 0xFer
¿Código que elimine ifs o llamadas a funciones?
Programación General
Tachikomaia 0 847 Último mensaje 9 Marzo 2024, 00:48 am
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines