martes, 23 de febrero de 2010

Calculando las permutaciones

0

Ayer, haciendo un programa para que me haga los pesados determinantes que me mandan en la uni, me enfrente con el problema de que tenia que calcular todas las permutaciones de conjuntos de diferentes tamaños, y después de intentar hacer un programa que calculase todas, decidí buscar un poco, y la verdad es que la mayoría de los algoritmos que me encontré no me valieron de mucho, solo encontré un poco útil este, que no se si sera rápido pero la verdad es que tiene varios inconvenientes como que te da del revés las permutaciones, etc. Y por fin encontre, algo que merece la pena, facil y que me venia como anillo al dedo, se trata de un ejemplo de la web "conclase", pagina muy muy recomendada para aprender c++ y unas cuantas cosas mas.

Funcion + ejemplo

#include <iostream>
using namespace std;

/* Prototipo de función */
void Permutaciones(char *, int l=0);

int main(int argc, char *argv[]) {
   char M[] = "ABCD";

    Permutaciones(M);
    system("pause");
    return 0;
}

void Permutaciones(char * cad, int l) {
   char c;    /* variable auxiliar para intercambio */
   int i, j;  /* variables para bucles */
   int n = strlen(cad);

   for(i = 0; i  < n-l; i++) {
      if(n-l > 2) Permutaciones(cad, l+1);
      else cout  < < cad  < < "\n";
      /* Intercambio de posiciones */
      c = cad[l];
      cad[l] = cad[l+i+1];
      cad[l+i+1] = c;
      if(l+i == n-1) {
         for(j = l; j  < n; j++) cad[j] = cad[j+1];
         cad[n] = 0;
      }
   }
}

Actualizado: 3/05/2010

También existe la posibilidad de usar la función next_permutation() incluida en la librería <algorithm> de c++.

#include 
#include 
using namespace std;

int main ()
{
    int vec[3] = {3,1,2};

    cout << "permutations:" << endl;

    sort (vec,vec+3);

    do cout << vec[0] << vec[1] << vec[2] << endl;
    while ( next_permutation (vec,vec+3) );

    return 0;
}
Comparte o puntua esta publicación ▼

miércoles, 17 de febrero de 2010

Programación para procesadores multinucleo

1
Hoy en día la mayoría de las CPUs tienen varios núcleos, desde 2 hasta 8 o 16, y cada vez mas y mas.
Para que tus aplicaciones aprovechen esta característica de llevar varios procesos en paralelo usaremos "Windows Threads" o lo que seria la manera propuesta por Microsoft de usar varios hilos en sus Windows.
Os dejo un pdf de casi 50 hojas tipo presentación donde se explica muy bien como hacerlo [Windows Threads.pdf] y creo que no hace falta que ponga ejemplos, ya que vienen bastantes en el pdf. Ademas, también explica varias alternativas para solucionar los errores mas típicos en un programa de varios "threads", que suelen ser por ejemplo el intento de leer y escribir en la memoria a la vez, o lo que seria manejar la misma variable en varios procesos diferentes. Disfrutazlo.
Comparte o puntua esta publicación ▼

martes, 16 de febrero de 2010

Es potencia de 2?

1

El otro día me encontré una función muy curiosa. Se trata de una función que te dice si un numero es potencia de 2 sin tener que hacer la pesada tarea de una raíz cuadrada, que es lo que haríamos todos seguramente, ver si al hacerle la raíz cuadrada nos deja decimales o no.

bool ispow2(int x)
{
    return !((~(~0U>>1)|x)&x -1) ;
}
Comparte o puntua esta publicación ▼

Tamaño de un vector en c sin usar variables extra

1
Esta tarde, me acorde de que alguien me dijo que en pascal la primera componente de los vectores era su tamaño, no se si es cierto, pero en c, esto no ocurre y es necesario tener otra variable aparte para "recordar" cual es el tamaño de cierto vector.
Pensando un poco se me ocurrió la grandisima idea, por lo menos para mi ;) , de poder deshacernos de la variable extra sin olvidarnos del tamaño de un vector, es decir, donde antes teniamos las variables *vector y tam, ahora solo nos haría falta *vector.
No se si se le ocurrio a alguien antes, busque un poco que parece que nadie usa este metodo, asi que o lo acabo de inventar o no se usa por que realmente es muy malo, yo creo que es genial (siempre que se trabaje con numeros enteros), es 100% compatible con el método "clásico" y tiene muchísimas ventajas.

Como funciona

Muy fácil, lo que se hace con este método es guardar el tamaño del vector en el propio vector. Se reserva memoria también para el tamaño y se hace apuntar al puntero a la posición siguiente de memoria, quedando el tamaño en la posición -1, y las posiciones de 0 en adelante como un vector normal y corriente.

Ventajas

Como nos ahorramos una variable, hace mas fácil escribir y entender el código y sobretodo creo que viene muy bien en los bucles o en las funciones, donde nos ahoramos un parámetro.
Y todo esto tan solo añadiendo un par de lineas.

Inconveniente

Solo vale para vectores con números enteros (int).

Como se hace

  • Añade #define SIZE -1 al principio de tu código.
  • A la hora de reservar memoria para el vector súmale 1: int *V = new int [i+1];
  • Después de reservar la memoria añade (++V)[SIZE] = i; con esta linea lo que hacemos es que el vector apunte a la primera componente y guardar el tamaño del vector en la posicion SIZE o -1.
  • Y ya esta, ahora acuérdate de usar V[SIZE] .

Ejemplo

#include <iostream>
using namespace std;

#define SIZE -1

int main(){
  int i;

  cout << "Introduce el tamaño del vector" << endl;
  cin >> i;

  int *V = new int [i+1];

  if(!V){
    cerr << "No se puede reservar el espacio" << endl;
    return 1;
  }

  (++V)[SIZE] = i;

  cout << "Introduzce el vector" << endl;
  for(i = 0; i < V[SIZE]; i++)
      cin >> V[i];

  cout << "Mostrar el vector" << endl;
  for(i = 0; i < V[SIZE]; i++)
    cout << V[i] << " ";

  delete [] V;

  return 0;
}
Comparte o puntua esta publicación ▼

lunes, 15 de febrero de 2010

Programa que resuelve sistemas de ecuaciones

1

Hace unos meses tuve que hacer para la uni un programa que resolviera sistemas de ecuaciones usando el metodo de Gauss-Jordan.
Esto fue lo que hice, esta bastante explicado, si se te ocurre alguna mejora coméntanosla.

El programa esta incompleto y aun tiene muchos fallos, pero es un buen comienzo para uno aun mejor, funciona bien para matrices "normales" pero en cuanto lo pones a resolver matrices con muchos ceros al principio falla. lo intentare solucionar.


Comparte o puntua esta publicación ▼

miércoles, 10 de febrero de 2010

Drop Renamer

0

Descripción general

Drop Renamer es un renombrador de archivos especialmente diseñado para renombrar las fotos de manera que su nombre final sea la fecha de creación y así mantener el orden en los albunes de fotos.
Drop Renamer extrae la información exif de las fotos, y fechas de creación y modificación, y teniendo menos prioridad esta ultima, selecciona la fecha (día y hora) en la que fue tomada la foto. Drop Renamer vale para cualquier archivo.

Captura de pantalla

Download

Descargar

Modo de uso

Arrastrar las fotos o archivos hacia el botón con el texto "Renombrar"

Otras aspectos

No hace falta instalar nada, doble click y listo, pero para que se pueda abrir necesita el .net Framework 3.5.
La mayoría de las veces que da error es por que existen 2 fotos con exactamente la misma fecha, y falla al ver que no puede ponerle el mismo nombre a las 2, por lo que para poder renombrar esas fotos hay que moverlas a otro directorio diferente y volver a intentarlo, seguramente funcione. Para los vídeos, no saca ninguna información interna por lo que no creo que utilice la fecha exacta en la que se grabo el vídeo.

Por hacer

poder usarse desde la linea de comandos, habilitar la opción de deshacer el renombrado, manejar error citado antes.

Licencia

LGPL * todavía no he publicado el código fuente, lo are en la versión 1, actualmente se encuentra en estado alpha, no me responsabilizo de los problemas que genere este programa
Comparte o puntua esta publicación ▼

martes, 9 de febrero de 2010

Crear matrices dinámicas con c y c++

14

Bien, ahí va el código en c++ de como crear una matriz dinamicamente.

#include
using namespace std;

int main()
{
    int i,j,f,c;

    cout << "Introduce el numero de filas" << endl;
    cin >> f;
    cout << "Introduce el numero de columnas" << endl;
    cin >> c;

    // creamos la matriz !
    double **M = new double* [f];
    for (i = 0; i < f; i++)
        M[i] = new double[c];

    // Comprobamos
    if (!M)
    {
        cout << "No se puede reservar el espacio" << endl;
        return 1;
    }

    cout << "Introduzca la matriz" << endl;
    for (i = 0; i < f; i++)
        for (j = 0; j < c; j++)
            cin >> M[i][j];

    cout << "Mostrar la matriz" << endl;
    for (i = 0; i < f; i++)
    {
        for (j = 0; j < c; j++)
            cout << M[i][j] << " ";
        cout << endl;
    }
    delete [] M;

    return 0;
}

En C, como no existe "new" ni "delete" hay que utilizar las funciones "malloc()" y "free()", sustituyendo:

double  *a = new double;      // si solo queremos uno.
double  *b = new double[x];   // donde x es el nºde elementos que queremos
double **c = new double* [x]; // x puntero a puntero. (varios)
por
double  *a = (double*)malloc(sizeof(double));
double  *b = (double*)malloc(sizeof(double) * x);
double **c = (double**)malloc(sizeof(double*) * x);

y para el "delete", que usariamos:

delete a;
delete [] b;

lo cambiamos por:

free(a);
free(b);

En estos ejemplos he usando datos de tipo "double", pero acordaros que podria ser de cualquier tipo como por ejemplo "int", "short"...

Para no complicar las cosas solo he comprobado que se a podido reservar memoria para el vector principal (bloque de memoria de f elementos, que son punteros que "apuntaran" al primer elemento de los bloques de c elementos), y no he puesto nada para comprobar si se han podido crear los demas.

Como seguramente no hayáis entendido nada de lo ultimo que puse entre paréntesis, por lo que os lo muestro gráficamente usando de ejemplo una matriz de 3 filas y 4 columnas.


*Es posible que haya fallos, correcciones o algún tipo de errata que debiera modificar así que si ves alguna avísame. Gracias
Comparte o puntua esta publicación ▼

domingo, 7 de febrero de 2010

jProgBar

0

Overview

jProgBar is a jQuery progress bar plugin.

Demo

http://jprogbar.googlecode.com/hg/jProgBar.html

Download

http://jprogbar.googlecode.com/hg/

Usage

$('#youid').progbar(value)

To Do

Documentation, possibility to change status text.

Licensing

LGPL
Comparte o puntua esta publicación ▼

Crea tu propio juego 2D

1

Construct es un programa gratuito y open source con el que puedes crear juegos en 2D fácilmente, y la verdad es que me sorprendió bastante la facilidad y rapidez con la que puedes crear un jueguecito de tipo plataforma, y todo esto sin saber programar en absoluto, ya que todo se hace a través de la interfaz gráfica.
Y para los que sabemos algo mas, el programa te da la posibilidad de programar en python.
Soporta sonidos en formatos como mp3, ogg y seguramente algunos mas, y  para la musica, tambien puede utilizar modulos mod, xm, it, etc...
Esto y muchas cosas mas son las que puede hacer, pero como yo no e echado tanto tiempo como para conocerlas os dejo un video.


Este el el típico programa que me hubiera venido de p*** m**** cuando estaba en la "eso" y quería hacer un juego en el que aparecieran las caras de los profesores y el jugador 1 tendría que tirarles tomates o huevos.
Comparte o puntua esta publicación ▼

sábado, 6 de febrero de 2010

Resumen mensual

0

Como  veo que en algunos post ya publicados hago modificaciones, que la verdad es que creo que es poco recomendable ya que casi nadie se va a dar cuenta del cambio, para que estéis al tanto de los cambios haré un post cada mes resumiendo todos los cambios y novedades.

Actualizado: 04/05/2010

Parece ser que esto de cambiar era mas común al principio cuando fácilmente encontraba faltas, errores o mejoras en los post. Ahora ya, como mucho lo modifico 5 minutos después de si publicación, por lo que seguramente deje de hacerlos. De todas maneras si modifico algún post con alguna mejora seguramente se anuncie.

Comparte o puntua esta publicación ▼

viernes, 5 de febrero de 2010

Sobre fractales

0

Si no sabes lo que representa la imagen de arriba seguramente no sabes lo que es un fractal. La imagen de arriba es del fractal de Mandelbrot y si quieres saber mas ... mejor léelo de la wikipedia.
Ayer navegando por la web me encontre en la página dmitrybrant.com el codigo fuente en c# de un programa que dibuja el fractal de Mandelbrot, el programa cumple con su funcion, pero como esta hecho en c# no es tan rápido como se desea para este tipo de programas de calculo intensivo, por lo que me puse manos a la obra y lo reescribí en c++, con .net, vamos con el visual c++. En cuanto pueda publicare el codigo y el binario para que la veais. en cuanto al codigo fuente, para los entendido, quizas este horrible, y no lo se por que es la primera vez que programo c++ con .net.

La versión que se ofrece aquí para descargar no es la ultima.

Ver / Descargar

Comparte o puntua esta publicación ▼

jueves, 4 de febrero de 2010

Anunciate en Davidxl

0
Aprovecha ahora que hay huecos libres para comprar un bloque de aproximadamente 100x100 pixels donde podrás poner el anuncio de tu web, o lo que quieras,siempre que sea dentro de el bloque correspondiente, lo normal e que sea una imagen jpq o gif.
Para comprar un bloque o informarse sobre precios u otras cosas mandadme un email los interesados a la dirección davidgg666@gmail.com con buestras preguntas o el precio que estaríais dispuestos a pagar por vuestra publicidad en mi web/blog.
Comparte o puntua esta publicación ▼

miércoles, 3 de febrero de 2010

Novedades

0
Dos días después de crearme el blog, Google Analytics me muestra 6 visitas en total, y creo que todas son mías. Estos días a habido mucho movimiento por aquí, e estado personalizando el tema, que todavía me queda bastante, e estado creando los repositorios para mis plugins de jquery, y ahora estoy con la documentación de estos.
Esperare tener un blog mas estable antes de marzo, y con esto me refiero a no mas cambios en el tema, pruebas, etc...
Comparte o puntua esta publicación ▼

jStars

0

Overview

jStars is a jQuery star rating plugin

Demo

http://jstars-xl.googlecode.com/hg/jStars.html

Download

http://jstars-xl.googlecode.com/hg/

Usage

$('#youid').stars({
  rated:false,          // already rated
  stars: 5,             // n of stars
  step:1,               // step
  val:0,                // initial value
  starwidth:28,
  starimg:"jStars.png",
  onchange: function(v){},
  onrating: function(v){}
})

To Do

Documentation, rerating option

Licensing

LGPL
Comparte o puntua esta publicación ▼

jSlider

0

El proyecto se encuentra desactualizado

Overview

jSlider is a jQuery slider plugin.

Demo

http://jslid.googlecode.com/hg/jSlider.html

Download

http://jslid.googlecode.com/hg/jSlider.js

Usage

$('#yousliderid').slider({
    min:0,    //minimum value
    max:100,  //maximum value
    val:50,   //initial value
    onchange:function(v) {    }
})

To Do

Step option, more demos ...

Licensing

LGPL

Comparte o puntua esta publicación ▼

martes, 2 de febrero de 2010

Compatibilidades y demás

0
 

Este es el aspecto del blog visto desde el Internet Explorer 6, navegador que esta totalmente obsoleto y que no hace mas que dar problemas, por lo que no le voy a dar soporte. Ya sabéis, hay que actualizarse o cambiar a mejores alternativas como "Chrome", "Firefox", ...

También deciros que todos los códigos que publique aquí seguramente funcionen con el "Chrome", que es el navegador que uso normalmente, y creo que también funcione todo bien con "Safari" y "Firefox" la mayoría de las veces, de todas maneras estaré agradecido de los comentarios que me pongáis sobre el buen o mal funcionamiento en otro navegador junto con una posible solución.

Quizás a veces me explico mal y no me entendéis, seguramente sea por que nunca escribí ningún blog ni nada parecido, espero mejorar ese aspecto con el tiempo y acordaros de preguntarme.

Comparte o puntua esta publicación ▼

lunes, 1 de febrero de 2010

El primer post

3

Bienvenidos todos a mi blog, mi primer blog.

El principal motivo de su creación es exponer mis proyectos, tambien iré publicando algunos articulos interesantes de temas reclacionados con la programación y electrónica principalmente.

Intentare actualizarlo a diario con nuevos contenidos
Comparte o puntua esta publicación ▼