Autor
|
Tema: Problema con llamadas entre funciones. (Leído 3,622 veces)
|
doitunkboo
Desconectado
Mensajes: 17
|
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; }
|
|
« Última modificación: 18 Diciembre 2018, 22:55 pm por doitunkboo »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
doitunkboo
Desconectado
Mensajes: 17
|
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
Mensajes: 1.603
|
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
Mensajes: 17
|
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.
|
|
« Última modificación: 19 Diciembre 2018, 12:18 pm por doitunkboo »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
Mensajes: 17
|
Y como lo hago, con esto por ejemplo? Me estoy dando cuenta que a la función primoMayor accede 2 veces y no se porqué
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
doitunkboo
Desconectado
Mensajes: 17
|
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 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!
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Muy bien. Incluso puedes sustituir x=num; mayor=primoMayor(x); Por Y eliminar x de la definición.
|
|
|
En línea
|
|
|
|
|
|