Hola, a ver si me pueden corregir este programa en C jeje
Programa que pedirá un número entero y hace una función int f2x3 con:
1) Si "n" es 1 escribirá "n" por pantalla y devolverá un 1.
2) Si "n" no es 1 y si es múltiplo de 2 y es múltiplo de 3 escribirá "n" por pantalla y
llamará a f2x3 con el valor n+5.
3) Si "n" no es 1 y es múltiplo de 2 pero no es múltiplo de 3 escribirá "n" por
pantalla y llamará a f2x3 con el valor n/2.
4) Si "n" no es 1 y es múltiplo de 3 pero no es múltiplo de 2 escribirá "n" por
pantalla y llamará a f2x3 con el valor n+2.
5) Si "n" no es 1 y no es múltiplo de 2 ni múltiplo de 3 escribirá "n" por pantalla
y llamará a f2x3 con el valor n-1.
Ejemplo: Si introducimos un 18
Escribirá por pantalla: 18,23,22,11,10,5,4,2,1 Total: 9 llamadas
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
/* Declaracion de las funciones */
unsigned int f2x3 (int);
/* Menu principal */
int main(void){
unsigned int n; // Variable "n" donde se guarda el numero y que utilizará la funcion
printf("Escribe un numero: ");
fflush(stdin);
scanf("%d", &n); // guardamos el numero introducido
printf("\nTotal de llamadas: %d \n", f2x3(n)); // Mostramos el total de llamadas de la funcion
getch();
return 0;
} // Fin main
/* Funcion */
unsigned int f2x3 (int n) {
printf("%i ", n); // Listamos los numeros que va llamando la funcion
if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
if ((n != 1) && (n % 2 == 0) && (n % 3 == 0)) return f2x3(n+5); // Caso II
if ((n != 1) && (n % 2 == 0) && (n % 3 != 0)) return f2x3(n/2); // Caso III
if ((n != 1) && (n % 2 != 0) && (n % 3 == 0)) return f2x3(n+2); // Caso IV
if ((n != 1) && (n % 2 != 0) && (n % 3 != 0)) return f2x3(n-1); // Caso V
} // Fin de la funcion
Gracias y un saludo
Pides corregir.. En qué te falla?
Saludos;)
PD: Yo usaría mas que muchos if una estructura switch.
En el ejemplo que he dado si pongo 18 me dice que el total de llamadas es "1" cuando en verdad son 9.
Saludos
Ah vale. Eso ya no lo sabía xD
Es fácil. Crea al principio un int numLlamadas = 0; y en cada if abres llave y pones numLlamadas++; y el return correspondiente
Saludos ;)
EDITO: Y que después imprima ese numLlamadas.
EDITO2: Aquí tienes el código como lo modificaría yo:
EI: no hace falta dar el codigo, gracias.
Muchas gracias!
Tenía ya la variable "n" para el total de llamadas.
Pero la usabas para dos cosas distintas por lo que no te funcionaría.
Salud.
Me esta dando un error y llevo un rato intentando ver que es y no lo encuentro.
En esta parte:
if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
else { //CAMBIADO
(n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
(n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
(n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
(n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO
} //CAMBIADO
numLlamadas++; //CAMBIADO
Error: syntax error before "i"
@EternalIdol, solo di el código modificado en vez de enumerar uno a uno los cambios. Es mas, el código era el suyo, por lo que creo que no rompí las normas. -.-
@sora no puedo responderte puesto que no veo el codigo que puse -.-
Salud
Cita de: NikNitro! en 7 Abril 2014, 23:31 PM@EternalIdol, solo di el código modificado en vez de enumerar uno a uno los cambios. Es mas, el código era el suyo, por lo que creo que no rompí las normas. -.-
Si podias explicar los cambios necesarios para solucionar el problema y no publicar el codigo arreglado quiere decir que era innecesario.
Y qué diferencia hay? Además, lo del else era una forma diferente de hacerlo... Bueno no discuto más. Sora, si quieres ejercicios resueltos, tengo mi blog en la firma ;)
Salud
Cita de: NikNitro! en 8 Abril 2014, 00:44 AM
Y qué diferencia hay? Además, lo del else era una forma diferente de hacerlo... Bueno no discuto más. Sora, si quieres ejercicios resueltos, tengo mi blog en la firma ;)
Salud
Que hagan algo mas que copiar y pegar, es lo minimo, sino estamos haciendo tareas ajenas directamente.
Gracias por la ayuda "NikNitro!", te lo agradezco!
El código lo llevo así:
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
int numLlamadas = 0; //CAMBIADO
/* Declaracion de las funciones */
unsigned int f2x3 (int);
/* Menu principal */
int main(void){
unsigned int n; // Variable "n" donde se guarda el numero y que utilizará la funcion
printf("Escribe un numero: ");
fflush(stdin);
scanf("%d", &n); // guardamos el numero introducido
printf("\nTotal de llamadas: %d \n", numLlamadas); // Mostramos el total de llamadas de la funcion //CAMBIADO
getch();
return 0;
} // Fin main
/* Funcion */
unsigned int f2x3 (int n) {
int i = 0; //El siguiente número que usaremos //CAMBIADO
printf("%i ", n); // Listamos los numeros que va llamando la funcion
if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
else { //CAMBIADO
(n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
(n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
(n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
(n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO
} //CAMBIADO
numLlamadas++; //CAMBIADO
return f2x3(i); //CAMBIADO
} // Fin de la funcion
El error que me da es el siguiente:
In function `f2x3':
syntax error before "i"
Bueno el error te da por este codigo (n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
(n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
(n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
(n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO
Intentas hacer ifs pero no estas poniendo ningun if... aun asi yo lo sustituiria por ifs anidados y de esta forma evitamos comprobaciones innecesarias.
if (n == 1)
return 1;
else
{
if (n % 2 == 0)
if (n % 3 == 0)
i=n+5;
else
i=n/2;
else
if (n % 3 == 0)
i=n+2;
else
i=n-1;
}
Saludos
Lo he podido compilar, pero la versión que me ha hecho "NikNitro" no me hace nada! :-X
(http://oi62.tinypic.com/dhbtqf.jpg)
¿Es correcto lo que me hiciste? Con mi anterior versión me listaba los números.
Saludos
Hecho de prisa y corriendo, creo que esta es la salida correcta:Citar
Escribe un numero: 18
18 23 22 11 10 5 4 2 1
Total de llamadas: 9
Process returned 0 (0x0)
Unos pequeños ajustes menores en la declaración de la función:void f2x3 (int n,int i) ;
Lo de la variable i es para ir guardando las llamadas a la función. Y en main:scanf("%d", &n);
f2x3(n,i);
Y para terminar en la función, a lo bruto:void f2x3 (int n,int i) {
if (n == 1){
printf ("%d ",n);
printf("\nTotal de llamadas: %d \n", ++i);
}
else
{
if (n % 2 == 0 && n % 3 == 0){
printf ("%d ",n);
f2x3 (n+5,i+1);
}
else if (n % 2 == 0 && n % 3 != 0){
printf ("%d ",n);
f2x3 (n/2,i+1);
}
else if (n % 3 == 0 && n % 2 != 0){
printf ("%d ",n);
f2x3 (n+2,i+1);
}
else if (n % 2 != 0 && n % 3 != 0){
printf ("%d ",n);
f2x3 (n-1,i+1);
}
}
}
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
No estas llamando a la funcion en el main... normal que no te funcione.
Porcierto numllamadas++ tiene que estar antes de los ifs y no justo antes del ultimo return porque sino hay una llamada que no se contaria....
A mi si que me funciona
Saludos