| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Drakonis
Registrado: 20 Feb 2013 Mensajes: 11 Ubicación: España
| Publicado: 22/02/2013 5:52 pm | | | Título: Explicación del comienzo de este programa |
| Hola He estado un libro sobre c y una de las funciones que aparece es esta, sirve para calcular factoriales de un nº:
| Código: | /*---------------------------*/ /* Ejemplo en C nº 70: */ /* c070.c */ /* */ /* Funciones recursivas: */ /* factorial */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*---------------------------*/ #include <stdio.h> long fact(int n) { if (n==1) /* Aseguramos que termine */ return 1; return n * fact (n-1); /* Si no es 1, sigue la recursión */ Fundamentos de programación en C, por Nacho Cabanes Revisión 0.90– Página 122 } main() { int num; printf("Introduzca un número entero: "); scanf("%d", &num); printf("Su factorial es: %ld\n", fact(num)); } |
pues bien, lo que no entiendo en concreto es esto:
| Código: | long fact(int n) { if (n==1){ /* Aseguramos que termine */ return 1; return n * fact (n-1); /* Si no es 1, sigue la recursión */ Fundamentos de programación en C, por Nacho Cabanes Revisión 0.90– Página 122 } | a ver si alguien me lo puede explicar por favor xdd, lo unico que entiendo es el uso del if del resto nada de nada 
EDIT1: habría alguna forma de unir el int y la primera parte desde el long para que no quede dividido en 2 bloques ? EDIT2:Perdon por los 2 mensajes de abajo, iba a editar este y no se que ha pasado xdd
Ultima edición por Drakonis el 22/02/2013 7:13 pm; editado 3 veces |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 23/02/2013 4:46 am | | | Título: Re: Explicación del comienzo de este programa |
| | Cita: | pues bien, lo que no entiendo en concreto es esto: [code]long fact(int n) { if (n==1){ /* Aseguramos que termine */ return 1; return n * fact (n-1); /* Si no es 1, sigue la recursión */
|
¿Ya vas por ahí?. Me parece que has ido muy rápido. 
Se trata de una función recursiva, es decir, una función que se llama a sí misma hasta que se cumple una condición, que en este caso es que valga 1 "if (n==1) return 1;"
Por ejemplo, si entras 6 ocurrirá esto: [code] fact(6) función: 6*fact(5) función: 5*fact(4) función: 4*fact(3) función: 3*fact(2) función: 2*fact(1) 1 return
resumiendo:6*fact(5)=6*5*fact4=6*5*4*fact3=6*5*4*3*fact2==6*5*4*3*2*fact1=6*5*4*3*2*1 que es el valor global de retorno [/code]
De todas formas, insisto, creo que te has precipitado, llevas mucho leído del libro. Por ejemplo, la otra cuestión hace referencia a "long fact(int n) { " que es una función, donde long se refiere al tipo de valor devuelto por dicha función y int al tipo de valor que recibe la función. Esto se hace así en este caso porque se supone que se va a calcular factoriales de números no muy grandes- 6, 8, 12,....- pero aún así, los factoriales crecen mucho y para poder asegurar su cálculo y, por tanto, su devolución por parte de la función, se declara del tipo long ya que este admite más cifras que el int.
Esta última pregunta pone de manifiesto que el tema de funciones o no lo has visto o has pasado de puntillas por él. No seas tan ansioso, vete despacio leyendo todo que es un buen manual de introducción. Ya luego te pasa a los libros que suelen profundizar más.
Saluditos!.
P.D:No sé que pasa con las etiquetas Code que no funcionan.
Ultima edición por leosan el 24/02/2013 12:28 am; editado 2 veces |
| | Volver arriba | |  | Drakonis
Registrado: 20 Feb 2013 Mensajes: 11 Ubicación: España
| Publicado: 23/02/2013 6:19 am | | | Título: Re: Explicación del comienzo de este programa |
| [quote="leosan"]| Cita: | ¿Ya vas por ahí?. Me parece que has ido muy rápido. 
|
En realidad voy por la página 20 todavia jaja, es que me han mandado hacer un programa que calcule los factoriales y mirando por el libro vi ese, pero claro, no era plan hacer un copia y pega sin entenderlo. Al final me ha quedado así(es practicamente lo mismo pero con un par de cosillas añadidas xd):
| Código: | #include <stdio.h> #include <math.h> #include <stdlib.h>
long fact(int n) { if (n==1) return 1; return n * fact (n-1);}
int main() { int num,i,c; printf("Bienvenido.Este programa obtendrá el factorial de un numero entero dado por el usuario."); while(c!=0){ printf("\n\nIntroduzca el numero de veces que desea reproducir el programa: "); scanf("%d",&c); if(c==0) break; system("cls");
for (i=0;i<c;i++){ printf("\nIntroduzca un numero entero: "); scanf("%d", &num); printf("\nSu factorial es: %ld\n", fact(num)); }break;} return 0; }//fin del programa |
También encontré este en una web, que me parecía mas fácil y entendible que el anterior, pero daba 2 errores que no conseguía corregir xdd:
| Código: | #include <stdio.h> void main(){ int i,num,fact=1; printf("Bienvenido al programa para calcular factoriales.\n"); printf("\nEscriba un numero entero: "); scanf("%d",&num); for(i=num;i>1; i--){ fact=fact*i; } printf("\nEl factorial de %d es %d\n",num,fact); } |
PD: Gracias por la explicacion jaja , ya lo he entendido + o -  _________________ SO: Windows 7 Compilador: MinGW Developer Studio |
| | Volver arriba | |  | | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 23/02/2013 8:00 am | | | Título: Re: Explicación del comienzo de este programa |
| Te aconsejo "entregar" el segundo, porque el primero usa funciones y sería un "cante", vamos que pillan que lo has copiado.
Saluditos!.
P.D: No se trata sólo de copiar, sino de que entiendas lo que hace el código.  |
| | Volver arriba | |  | Drakonis
Registrado: 20 Feb 2013 Mensajes: 11 Ubicación: España
| Publicado: 23/02/2013 8:31 am | | | Título: Re: Explicación del comienzo de este programa |
| | leosan escribió: | Te aconsejo "entregar" el segundo, porque el primero usa funciones y sería un "cante", vamos que pillan que lo has copiado.
Saluditos!.
P.D: No se trata sólo de copiar, sino de que entiendas lo que hace el código.  |
Ok jaja haré lo que dices.He estado metiendo los loops en ese segundo pero me falla en el del for. El programa al compilar y construir no da errores, el problema entra al ejecutar, que si le pides que ejecute el programa x numero de veces solo lo hace 1 alguna idea del error ?
| Código: | #include <stdio.h> #include <math.h> #include <stdlib.h> main(void){ //comienzo programa int i,num,fact=1,c; printf("Bienvenido. Este programa le ayudara a calcular el factorial de un numero.\n"); while(c!=0){ printf("\n\nIntroduzca el numero de veces que desea reproducir el programa: "); scanf("%d",&c); if(c==0) break; else { for (i=0;i<c;i++) {//comienzo for(1) system("cls"); printf("\nIntroduzca un numero entero: "); scanf("%d",&num); for(i=num;i>1; i--)fact=fact*i; printf("\nEl factorial de %d es %d\n",num,fact);}/*cierre de for(1)*/}/*cierre de else*/break;}//cierre de while }//fin programa |
_________________ SO: Windows 7 Compilador: MinGW Developer Studio |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 23/02/2013 9:01 am | | | Título: Re: Explicación del comienzo de este programa |
| Lo principal es que te sobra el while, ya que con el primer for controlas el número de veces que se repite el bucle.
Además tienes que inicializar a 1 la variable fact, ya que si no arrastra el valor anterior.
Por razón similar debes cambiar el nombre de la variable del segundo for, si no se "mezclan" los valores con el del primer for.
Te sigue sobrando la librería math, ya que no haces uso de ninguna de sus funciones.
En resumen, más o menos esto:
| Código: | #include <stdio.h>
int main(void){ int i,j,num,fact=1,c; printf("Bienvenido. Este programa le ayudara a calcular el factorial de un numero.\n"); printf("\n\nIntroduzca el numero de veces que desea reproducir el programa: "); scanf("%d",&c); for (i=0;i<c;i++) { fact=1; printf("\nIntroduzca un numero entero: "); scanf("%d",&num); for(j=num;j>1;j--)fact=fact*j; printf("\nEl factorial de %d es %d\n",num,fact); } return 0; }
|
Saluditos!. |
| | Volver arriba | |  | | Drakonis
Registrado: 20 Feb 2013 Mensajes: 11 Ubicación: España
| Publicado: 23/02/2013 9:07 am | | | Título: Re: Explicación del comienzo de este programa |
| ok, muchas gracias  _________________ SO: Windows 7 Compilador: MinGW Developer Studio |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |