[Curso] Introducción a la programación en C (XIII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

No pasa nada, cada uno saca tiempo cuando puede.

Primero y segundo: el prototipo de la función debe ser int num_maximo(int vec[]), sin más ;)

Tercero:

Código: Seleccionar todo

//Funcion para calcular la potencia de un numero de forma recursiva
int potencia(int base, int expo)
{
      int result = 1;
     
      //Si el exponente es 0 resgresa uno
      if(expo==0)
      {
            return 1;
      }
      else
      {       //se va reduciendo el exponente en uno
            result= potencia(base,expo-1) * base;
      }
     
     
      return result;
}

Muy buena la idea, pero mejor así:

Código: Seleccionar todo

//Funcion para calcular la potencia de un numero de forma recursiva
int potencia(int base, int expo)
{
      int result = 1;
     
      //Si el exponente es 0 regresa uno
      if (expo != 0)
      {       //se va reduciendo el exponente en uno
            result= potencia(base,expo-1) * base;
      }
     
      return result;
}

Por supuesto esto sólo vale para potencias positivas, así que mejor indicarlo:

Código: Seleccionar todo

//Funcion para calcular la potencia de un numero de forma recursiva
int potencia(int base, unsigned int expo)
{
      int result = 1;
     
      //Si el exponente es 0 regresa uno
      if (expo > 0)
      {       //se va reduciendo el exponente en uno
            result= potencia(base,expo-1) * base;
      }
     
      return result;
}

;)

Cuarto: el prototipo de la función debe ser int sumar_array(int vec[]). A las funciones que crees intenta darles el mínimo número de parámetros necesarios, esto te permitirá reutilizarlas en otros programas (creando librerías por ejemplo). En este caso, una función que sume los elementos del vector sólo necesita saber el vector y devolver la suma. Los otros parmámetros que tienes son dependientes de la implementación, y por tanto deberían ser transparentes al programador. Ya desde sumar_array() puedes llamar a sumar_array_recursivo() ya con los parámetros que quieras. Piensa en sumar_array() como un "envoltorio" para sumar_array_recursivo(). Esto aplica igualmente para los demás problemas (incluída la agenda :mrgreen: ).

Sexto: creo que no me entendiste. Tienes que devolver toda la serie de números de Fibonacci hasta un máximo. Por ejemplo, yo digo 5, y entonces el programa debe mostrar 0 1 1 2 3 5.

~Rdavid~ escribió:Por cierto te falto un 1 adelante en la secuencia de Fibonacci :tongue:

Y un 0 :lol: Debería ser

m0skit0 escribió:La secuencia de números de Fibonacci es 0, 1, 1, 2, 3, 5, 8, 13, 21


Último:

Código: Seleccionar todo

//Funcion que imprime las id accesadas y regresa la id escogida
int seleccionar_id(int id, int escog)

¿Quién ha dicho que haya que imprimir todas las IDs accedidas? Y encima al revés :D :adora:

Y añado una parte a este ejercicio: implementar una función de búsqueda (exacta) de número y/o nombre :canuto:

De todas formas veo que has pillado el concepto y ya te sale del alma :lol: Muy bueno :oki: ¿Verdad que no es tan complicado como parece en un primer momento :) ?
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

m0skit0 escribió:No pasa nada, cada uno saca tiempo cuando puede.

Primero y segundo: el prototipo de la función debe ser int num_maximo(int vec[]), sin más ;)


Estas seguro de que se puede hacer de esa manera, porque le e estado dando vueltas y si lo hago así tendría que definir i dentro de la función no? por ejemplo

Código: Seleccionar todo

int num_maximo(int i, int mayor, int vec[])
{
      [b]int i=0;[/b]
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
           
            i++;
           
      }
      else
      {
            return mayor;
      }
     
      //Lo reutilizamos de forma recursiva
      mayor = num_maximo(i,mayor, vec);
     
}


Por lo que cada vez que la función de vuelve a iniciar eso le va a dar el valor de 0 a i borrando el valor que tenía antes, lo mismo pasa con mayor


m0skit0 escribió:Tercero:

.....


Tienes razón :lol:

m0skit0 escribió:Cuarto: el prototipo de la función debe ser int sumar_array(int vec[]). A las funciones que crees intenta darles el mínimo número de parámetros necesarios, esto te permitirá reutilizarlas en otros programas (creando librerías por ejemplo). En este caso, una función que sume los elementos del vector sólo necesita saber el vector y devolver la suma. Los otros parmámetros que tienes son dependientes de la implementación, y por tanto deberían ser transparentes al programador. Ya desde sumar_array() puedes llamar a sumar_array_recursivo() ya con los parámetros que quieras. Piensa en sumar_array() como un "envoltorio" para sumar_array_recursivo(). Esto aplica igualmente para los demás problemas (incluída la agenda :mrgreen: ).


Yo entiendo lo de que menos argumentos es mejor pero sin los que puse es imposible para mi hacer que la función sirva, pasa lo mismo que te dije en el primer ejemplo.

m0skit0 escribió: Ya desde sumar_array() puedes llamar a sumar_array_recursivo() ya con los parámetros que quieras. Piensa en sumar_array() como un "envoltorio" para sumar_array_recursivo(). Esto aplica igualmente para los demás problemas (incluída la agenda :mrgreen: )


Esto la verdad no lo entiendo muy bien, tengo que hacer una función con los parámetros extra? pero después si intento usarlos en la otra funcion voy a tener que incluirlos en los argumentos o no?

m0skit0 escribió:Sexto: creo que no me entendiste. Tienes que devolver toda la [u]serie de números de Fibonacci hasta un máximo. Por ejemplo, yo digo 5, y entonces el programa debe mostrar 0 1 1 2 3 5.

Ahhh xD , ya decía yo xD, entonces voy a volver a hacer el ejercicio xD

m0skit0 escribió:Último:

Código: Seleccionar todo

//Funcion que imprime las id accesadas y regresa la id escogida
int seleccionar_id(int id, int escog)

¿Quién ha dicho que haya que imprimir todas las IDs accedidas? Y encima al revés :D :adora:

Y añado una parte a este ejercicio: implementar una función de búsqueda (exacta) de número y/o nombre :canuto:


Eso pasa cuando te quedas haciendolo hasta muy de noche :lol: :lol:
Voy a volver a hacerlo con lo que pides y corrijo ese comentario xD

m0skit0 escribió:De todas formas veo que has pillado el concepto y ya te sale del alma :lol: Muy bueno :oki: ¿Verdad que no es tan complicado como parece en un primer momento :) ?
[/quote]

No, claro que no :D , al principio si era dificil pero después vasta con imaginarse que es un simple bucle con su inicio, condición y su aumento :mrgreen:
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

A ver la duda que te corroe :lol: Es una tonterida :D

Código: Seleccionar todo

int sumar_array_recursivo(int i, int result,int vec[],int max)
{     
      //Para que se dentenga cuando llegue a max
      if(i != max)
      {
            if(vec[i]%2==0)
            {
                  result = result + vec[i];
            }     
            i++;
            result = sumar_array(i,result,vec,max);
      }
     
      return result;
}

int sumar_array(int vec[])
{
      return sumar_array_recursivo();
}

Y por cierto, que no lo había visto:

~Rdavid~ escribió:scanf("%d", &max);
int vec[max];

No es recomendable hacer esto, debido a que de esta manera estamos reservando el espacio en la pila. Es mejor hacer

Código: Seleccionar todo

int* vec = malloc(max * sizeof(int));

Y así lo reservamos como buffer mejor.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Ah ok ya voy entendiendo xD, entonces voy a hacerlo de esa manera, al rato pongo los ejercicios corregidos :oki:

Edit

m0skit0 he intentado hacerlo como me dices con el primer ejercicio pero me sale un error en la linea de return num_maximo_recursivo(); me dice que tengo muy pocos argumentos, ¿Qué estoy haciendo mal?

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Funcion para calcular el numero maximo
int num_maximo_recursivo(int i, int mayor, int vec[])
{
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            if(vec[i]>mayor)
            {
                  mayor = vec[i];
            }
           
            i++;
           
      }
      else
      {
            return mayor;
      }
     
      //Lo reutilizamos de forma recursiva
      mayor = num_maximo(i,mayor, vec);
     
}

int num_maximo(int vec[])
{
      return num_maximo_recursivo();
}

//Funcion para rellenar el vector
void rellenar_vector(int i, int vec[])
{
      //Para que se detenga cuando i llegue a 20
      if(i!=20)
      {
            printf("Numero %d: ",i+1);
            scanf("%d", &vec[i]);
           
            i++;
           
            //Lo reutilizamos de forma recursiva
            rellenar_vector(i,vec);
      }
     
     
}
     
     
//Funcion principal
int main(int argc, char *argv[])
{
      int mayor=0, i=0, vec_mayor;
      int vec[20];
     
      printf("Escribe 20 numeros\n");
   
      rellenar_vector(i,vec);
      vec_mayor = num_maximo(vec);
     
      //imprimimos el resultado
      printf("El numero mayor del array es %d\n",vec_mayor);   
     
      return 0;
}
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

Lo mío era sólo un ejemplo para que entiendas el concepto. Tienes que pasarle los argumentos a num_maximo_recursivo, que son int i, int mayor, int vec[] ;) tal y como hacías antes, pero dentro de num_maximo :mrgreen: Las funciones siempre se les tiene que pasar todos los argumentos, sino no compila.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Estoy algo confundido en esto xD

Osea que tengo que ponerle los argumentos a return sumar_array_recursivo

Código: Seleccionar todo

int sumar_array(int vec[])
{
      return sumar_array_recursivo(i,mayor,vec);
}


Pero como era de esperar me dice que i y mayor no están declarados :?
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

~Rdavid~ escribió:printf("La suma de los elementos pares del array es: %d\n",sumar_array(i,result,vec,max));


Y antes me he equivocado, quería decir sumar_array, no num_maximo :oops: :canuto:
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

m0skit0 escribió:
~Rdavid~ escribió:printf("La suma de los elementos pares del array es: %d\n",sumar_array(i,result,vec,max));


Y antes me he equivocado, quería decir sumar_array, no num_maximo :oops: :canuto:


No te preocupes, fui yo el que me equivoque y te confundí pero creo que ya entendí como es la cosa :oki:

EDIT

Ok, sigo con problemas con esto :lol:

Veamos, m0skit0, ¿Cómo harías tu el ejercicio 1 de esa forma?, es que creo que si no veo un ejemplo no voy a entender :lol: , todo lo que yo pruebo me tira errores de compilación :tiro:
Imagen

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por m0skit0 »

A ver, yo lo haría tal que así (no tengo compilador de C/C++ en el curro, así que voy vendido :lol: )

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void aleatorizar_vector(int vec[], unsigned int tam)
{   
   if (tam != 0)
   {
      vec[--tam] = (rand()%100)+1;
      aleatorizar_vector(vec, tam);
   }
}

int sumar_vector(int vec[], unsigned int tam)
{
   if (tam != 0)
   {
      return (vec[--tam] + sumar_vector(vec, tam));
   }
}

int main()
{
   unsigned int tamanio;
   printf("Especifique el tamaño del vector: ");
   scanf("%d", &tamanio);
   
   int vector[] = malloc(tamanio * sizeof(int));
   srand(time(NULL));
   aleatorizar_vector(vector, tamanio);
   
   int suma = sumar_vector(vector, tamanio);
   printf("La suma de los elementos del array es: %d\n", suma);
   
   return 0;
}

Si da algún error me lo comentas, que como digo no puedo probarlo, pero la idea es esa.

Un saludo.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XIII)

Mensaje por ~Rdavid~ »

Pues el ejemplo esta muy bien echo :mrgreen: , te has ahorrado algunas variables, aunque solo da un error de compilación en la linea de int vector[] = malloc(tamanio * sizeof(int)); :

Código: Seleccionar todo

XIII-4.c: In function ‘main’:
XIII-4.c:28: error: invalid initializer


Peero el punto que no entiendo es que tu me dijiste que el prototipo de la función para sumar el vector (que es en tu ejemplo int sumar_vector(int vec[], unsigned int tam)) debería ser int sumar_vector(int vec[]) sin más, por lo que yo te pregunte después como hacerlo así sin utilizar int i (que sería en tú prototipo unsigned int tam), entonces tu me dijiste que tenía que hacer otra función o algo así:

m0skit0 escribió:

Código: Seleccionar todo

int sumar_array_recursivo(int i, int result,int vec[],int max)
{     
      //Para que se dentenga cuando llegue a max
      if(i != max)
      {
            if(vec[i]%2==0)
            {
                  result = result + vec[i];
            }     
            i++;
            result = sumar_array(i,result,vec,max);
      }
     
      return result;
}

int sumar_array(int vec[])
{
      return sumar_array_recursivo();
}


Pero no veo que tú hayas hecho algo de eso :lol:, supongo que algo debo de haber entendido mal :?
Imagen

Responder