/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Explicación del comienzo de este programa

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Drakonis



Registrado: 20 Feb 2013
Mensajes: 11
Ubicación: España

MensajePublicado: 22/02/2013 5:52 pm
Título: Explicación del comienzo de este programa

Hola Very Happy 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 Confused

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

MensajePublicado: 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. Wink

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

MensajePublicado: 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. Wink


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 - Wink
_________________
SO: Windows 7
Compilador: MinGW Developer Studio
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 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. Wink
Volver arriba
Drakonis



Registrado: 20 Feb 2013
Mensajes: 11
Ubicación: España

MensajePublicado: 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. Wink


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

MensajePublicado: 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

MensajePublicado: 23/02/2013 9:07 am
Título: Re: Explicación del comienzo de este programa

ok, muchas gracias Smile
_________________
SO: Windows 7
Compilador: MinGW Developer Studio
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com