Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - do-while

#521
¡Buenas!

Aquí te dejo otro código. Trabaja las combinaciones sobre un vector de enteros, ya que es lo único que te hace falta. Hacer combinaciones sobre un vector de cualquier cosa es hacer combinaciones sobre los indices del vector...

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

struct t_combinatoria
{
   unsigned long **lista;
   unsigned long n_elementos;
   unsigned long longitud_elemento;
};
typedef struct t_combinatoria t_combinatoria;

void inicializar_combinatoria(t_combinatoria *c)
{
   c->lista = NULL;
   c->n_elementos = 0;
   c->longitud_elemento = 0;
}

void finalizar_combinatoria(t_combinatoria *c)
{
   unsigned long i;

   for(i = 0 ; i < c->n_elementos ; i++)
       free(c->lista[i]);

   free(c->lista);

   c->lista = NULL;
   c->n_elementos = 0;
   c->longitud_elemento = 0;
}

unsigned long factorial(unsigned long n)
{
   unsigned long ret = 1;

   while(n)
       ret *= (n--);

   return ret;
}

unsigned long n_sobre_k(unsigned long n, unsigned long k)
{
   return (factorial(n) / factorial(k)) / factorial(n - k);
}

int combinaciones(t_combinatoria *datos,unsigned long elementos_conjunto, unsigned long elementos_combinacion)
{
   static unsigned long indice = 0;
   static unsigned long elementos_fijados = 0;
   static unsigned long *aux = NULL;
   unsigned long i;

   if(!elementos_combinacion)
       return 0;

   if(indice == elementos_combinacion)
   {
       memcpy(*(datos->lista + elementos_fijados), aux, elementos_combinacion * sizeof(unsigned long));

       elementos_fijados++;

       return 1;
   }

   /* si es la primera vez que llamamos a la funcion, reservamos memoria para la tabla de combinaciones */
   if(!indice)
   {
       if(!(aux = (unsigned long *) malloc(elementos_combinacion * sizeof(unsigned long))))
           return 0;

       datos->n_elementos = n_sobre_k(elementos_conjunto,elementos_combinacion);
       datos->longitud_elemento = elementos_combinacion;

       if(!(datos->lista = (unsigned long **) malloc(datos->n_elementos * sizeof(unsigned long *))))
       {
           datos->n_elementos = 0;
           datos->longitud_elemento = 0;

           return 0;
       }

       for(i = 0 ; i < datos->n_elementos ; i++)
       {
           if(!(datos->lista[i] = (unsigned long *) malloc(datos->longitud_elemento * sizeof(unsigned long))))
           {
               int j;

               for(j = 0 ; j < i ; j++)
                   free(datos->lista[i]);

               free(datos->lista);
               datos->lista = NULL;

               datos->n_elementos = 0;
               datos->longitud_elemento = 0;

               return 0;
           }
       }

       for(i = 0 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
       {
           aux[indice] = i;

           indice++;

           combinaciones(datos, elementos_conjunto, elementos_combinacion);

           indice--;
       }

       free(aux);
       aux = NULL;
       elementos_fijados = 0;
       indice = 0;
   }
   else
   {
       for(i = aux[indice - 1] + 1 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
       {
           aux[indice] = i;

           indice++;

           combinaciones(datos, elementos_conjunto, elementos_combinacion);

           indice--;
       }
   }

   return 1;
}

int main(int argc, char *argv[])
{
   unsigned long i,j,k;
   t_combinatoria comb;
   char *vocales = "aeiou";

   for(i = 1 ; i <= 5 ; i++)
   {
       inicializar_combinatoria(&comb);

       combinaciones(&comb, 5 , i);

       for(j = 0 ; j < comb.n_elementos ; j++)
       {
           for(k = 0 ; k < comb.longitud_elemento ; k++)
               printf("%c",vocales[comb.lista[j][k]]);
           printf("\n");
       }

       finalizar_combinatoria(&comb);
   }

   return 0;
}


Había visto un error que no existia...  :P

¡Saludos!
#522
Programación C/C++ / Re: IDE para C++ 11?
28 Julio 2013, 20:46 PM
¡Buenas!

Hace unos días también me descargue la ultima versión de MinGW (con threads POSIX. La versión para windows no me funcionaba...) para probar el estandar C++11, estoy dándole un repaso a todo C++ ya que lo tenía bastante aparcado.

No se como lo harás tu. Yo sustituí la carpeta MinGW que estaba en el directorio de CodeBlocks. Luego en opciones del compilador tienes que decirle donde están los compiladores de C/C++ (y el linker? no me acuerdo, no tiene misterio alguno). Si quieres compilar en stdc++11 tendrás que activar la casilla correspondiente en opciones de compilador (stdc++11 o stdc++0x), y pasarle, como bien te ha dicho amchacon el parametro -static al enlazador para que incorpore las librerías al ejecutable, sino te encontraras con que el sistema te insulta por no tener determinadas DLLs.

Cuando entres en Sourceforge para descargar MinGW, si descargas la opción con instalador, ¿podrías contarnos como te ha ido? No se si será mejor opción que hacerlo a mano o como irá el asunto. Si lo haces me gustaría saberlo para tener en cuenta otras opciones para la próxima vez.

Ya diras.

¡Saludos!

Por cierto, para dar el repaso estoy utilizando "C++ How to program" 8va edición. No se si lo habéis utilizado. ¿Como trata el tema del último estandar? ¿Sabéis de algun otro libro que lo trate bien o mejor que el que utilizo?
#523
Foro Libre / Re: Recomienda un anime
28 Julio 2013, 11:24 AM
¡Buenas!

Os habéis dejado dos clasicazos en el tintero. Tengo buen recuerdo de ellos, aunque también es cierto que hace mucho que no los veo y en estos casos ya se sabe que a veces el recuerdo traiciona a la realidad...

- Trigun
- Lupin III

A parte, ya te han mencionado otro grande del genero

- Fullmetal Alchemist
- Fullmetal Alchemist Brotherhood
- Las distintas películas que se han hecho sobre Fullmetal Alchemist (antes tienes que haber visto la serie, y haber buscado hentai sobre Winry (Tan inutil como degenerado))

El primero no se adapta de forma exacta al manga porque el autor así lo decidió y el segundo si que por lo visto es fiel al manga (si mal no recuerdo lo que leí en la Wikipedia)ç

Y si quieres alguna chorradilla para pasar el rato

- Zatch Bell

Ya he terminado con Naruto y hora estoy viendo Naruto shippuden (entretenida, pero Dragon Ball y FMA le dan mil vueltas), y para cuando acabe tengo pendiente ver algunos títulos de los que ya habéis mencionado.

¡Saludos!
#524
¡Buenas!

Muchas gracias por darme la pista sobre NetBalancer.

Ahora por lo menos puedo limitar la velocidad de los navegadores. El manejo no es evidente (para configurarlo se tiene que conocer el nombre del proceso y he tenido que recurrir al administrador de tareas), pero tampoco es complicado.

¡Saludos y gracias de nuevo!
#525
¡Buenas!

Lo que no creo que se pueda discutir, y el que no lo vea es que no tiene ojos, es que a Snowden se le puede, y debe, juzgar por traición o por lo que corresponda. Al parecer ha hecho lo siguiente:

- Entrar en equipos informáticos para los que no tenía permiso de acceso.
- Robar archivos.
- Revelar información secreta.

Y si lo ha hecho, que asuma las consecuencias de sus actos o lidie con el problema como crea conveniente (ahí no me voy a meter, es cosa suya), pero las acciones ya están hechas y son delito.

Otra cuestión bien diferente es cuestionar la moralidad de sus actos. Con respecto a esto, independiente de su legalidad, pienso que sus actos son ética y moralmente intachables. Hizo lo que debía hacer y olé sus huevos, chapeau, para quitarse el sombrero. Si señor. Y aquí queda en evidencia un gran fallo del sistema de justicia: La falta de correspondencia entre lo que es legal y lo que es ético o moralmente correcto. Me parece una lastima que por regla general imperen los intereses de un estado o una empresa sobre los intereses de los habitantes de dicho estado, o incluso como en este caso, sobre los habitantes del resto del mundo.

¡Saludos!
#526
Si los fabrican de tan buena calidad como los portátiles, a ver cuanto tardamos en tener una noticia de uno de estos aparatos ardiendo por el sobrecalentamiento.

¡Saludos!
#527
Cita de: JaNCeR en 26 Julio 2013, 10:20 AM
Usa el NetBalancer, limita la velocidad de cada aplicación.

Ok, en cuanto acabe con la descarga que tengo (13h ha 14 - 16 KB/s (dios que horror)), lo pruebo y os lo cuento.

¡Muchas gracias y saludos!
#528
¡Buenas!

Me acabo de dar cuenta de que el último valor del vector está mal. Se te ha colado un 1 entre el 3 y el 5. Te aviso por si vas a utilizar el código para otros programas, no vaya a ser que no te salgan los cálculos y te vuelvas loco buscando el origen de todo mal (a mi me ha pasado  ;D) Aquí te dejo el vector correcto.


unsigned long long Fibonaci_Cache[MAX_CACHE] = {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597
,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578};


¡Saludos!
#529
amchacon, eres un tramposo...  :xD

Deja que los niños jueguen en igualdad de condiciones, que sino se sienten discriminados...  ;D

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

#define MIN 37
#define MAX 42

typedef unsigned long long fibo_t;

unsigned long long llamadas_clasico;
unsigned long long llamadas_optimizado;

#define MAX_CACHE 33

unsigned long long Fibonaci_Cache[MAX_CACHE] = {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597
,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,31524578};

fibo_t fibo_clasico(fibo_t n)
{
   llamadas_clasico++;

   if(n < MAX_CACHE)
       return Fibonaci_Cache[n];

   return fibo_clasico(n - 1) + fibo_clasico(n - 2);
}

fibo_t fibo(fibo_t n)
{
   llamadas_optimizado++;

   if(n < MAX_CACHE)
       return Fibonaci_Cache[n];

   if(n % 2) //n impar y mayor que 2
   {
       fibo_t k1,k2;

       k1 = fibo((n + 1) / 2);
       k2 = fibo((n - 1) / 2);

       return k1 * k1 + k2 * k2;
   }

   //n par y mayor que 2
   return fibo(n / 2) * (fibo((n / 2) + 1) + fibo((n / 2) - 1));
   //si n == 2 fibo(n / 2) * fibo(n / 2 + 1) = fibo(1) * fibo(2)
   //habria recursion infinita si no se pone n == 2 como caso base
}

int main(int argc, char *argv[])
{
   fibo_t i,valor;
   time_t ini;

   printf("Fibonacci clasico:\n");

   ini = time(NULL);

   for(i = MIN ; i < MAX ; i++)
   {
       llamadas_clasico = 0;
       valor = fibo_clasico(i);

       printf("  fibo_clasico(%llu) = %llu (%llu llamadas)\n",i,valor,llamadas_clasico);
   }

   printf("%llu segundos\n",time(NULL) - ini);

   printf("\nFibonacci optimizado:\n");

   ini = time(NULL);

   for(i = MIN ; i < MAX ; i++)
   {
       llamadas_optimizado = 0;
       valor = fibo(i);

       printf("  fibo(%llu) = %llu (%llu llamadas)\n",i,valor,llamadas_optimizado);
   }

   printf("%llu segundos\n",time(NULL) - ini);

   return 0;
}


¡Saludos!

Por cierto, ¿cómo has conseguido el código en ensamblador? Supongo que será alguna opción del compilador, pero nunca me he metido mucho a jugar con el, así que no se que opción has utilizado...

¡Saludos!
#530
¡Buenas!

No me he explicado bien. Me ha faltado decir que estoy utilizando el movil como router wifi. Así que el programa, método o lo que sea que me haga falta sería para el ordenador.  :xD

¡Saludos!