Skip navigation.

The Black Book Team

Ordenacion por burbuja en C#

Este método consiste en ir comparando cada par de elementos del array e ir moviendo el mayor elemento hasta la última posición, comenzando desde la posición cero. Una vez acomodado el mayor elemento, prosigue a encontrar y acomodar el segundo más grande comparando de nuevo los elementos desde el inicio de la lista, y así sigue hasta ordenar todos los elementos del arreglo. Al ser necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, hace que el ordenamiento por burbuja sea uno de los algoritmos más ineficientes que existen. Incluso entre los algoritmos de ordenamiento del mismo orden, otros como el “Ordenamiento por inserción” son considerados más eficientes. Y lo más curioso es que este procedimiento es uno de los más usados para ordenar listas en todos los lenguajes de programación.

Estos serían los pasos a seguir por este algoritmo para ordenar una lista a1, a2, a3, … an

1) Comparar a1 con a2 e intercambiarlos si a1>a2
2) Seguir hasta que se haya comparado an-1 con an
3) Repetir el proceso anterior n-1 veces
Sin más, este es el método escrito en C# que recibe como parámetro un array de números enteros. Traté de escribir el método lo más legible posible para que lo entendieran. Si tienes alguna pregunta deja un comentario.

public static void OrdenacionBurbuja(int[] arrDesordenado)
{
bool hubo_cambio;
int temp,k=0;
int pos = arrDesordenado.Length-1; //Guarda en pos la longitud del array
do
{
hubo_cambio = false;
for(int i=0; i<pos; i++)
//Comparo los valores a ver si el proximo es mayor que el
if(arrDesordenado[i]>arrDesordenado[i+1])
{
//En caso de ser mayor los intercambio
temp = arrDesordenado[i];
arrDesordenado[i] = arrDesordenado[i+1];
arrDesordenado[i+1] = temp;
hubo_cambio = true;
k=i;
}
//actualizo la posicion
pos = k;
}
while(hubo_cambio);
}

La clase Random con C#

La clase Random es la que nos permite hacer unas cuantas cosas con números aleatorios. Yo uso generalmente la uso para probar algoritmos y en alguno que otro proyecto. Luego veremos algunos ejemplos: Aclarar que esta clase no es recomendada para encriptar cosas ni mucho menos, pero si vamos a poder conseguir un número aleatorio bastante respetable. Bueno, vamos ya: En la clase Random con C# (también sirve en ASP.Net) tenemos tres métodos que nos generan un número aleatorio, pero primero de todo tenemos que crear una instancia de la clase Random:
Random r = new Random
// Creamos el objeto Random, que tiene un constructor por defecto
// O para los más exigentes, añadimos un plus de
// aleatoriedad, algo así:
Random r = new Random(DateTime.Now.Millisecond);

Y una vez tenemos el objeto, utilizaremos uno de esos tres métodos.
1.- El método Next Tiene tres sobrecargas:

int aleatorio1 = r.Next();
 
// Le imponemos un máximo
int aleatorio2 = r.Next(100);
 
// Le imponemos un rango, por ejemplo queremos
// un número de 3 cifras
int aleatorio3 = r.Next(100, 999);
 
// Queremos un número entre el 3 y el 12,
int aleatorio4 = r.Next(3, 12);

2.- El método NextDouble
// Devuelve un double entre 0 y 1
int aleatorio5 = r.NextDouble();

3.- El método NextBytes
byte[] buffer = new byte[100];
r.NextBytes(buffer);

¡¡Como ven, es super sencillo trabajar con esta clase, ahora veamos un ejemplo de como trabajar con esta clase.
1 – Crear un array de tamaño aleatorio con números aleatorios. Esto nos puede servir para probar varios métodos que usan arrays (ordenación, búsqueda, etc).

//Inicializamos la clase Random
Random r = new Random();
 
//Creamos un array que va a contener cantidad
//aleatoria de elementos menor que 50.
int [] numeros = new int [r.Next(0,50)];
 
//Recorremos el array y vamos asignando a cada
//posición un número aleatorio
for(int i=0; i&lt;numeros.Lenght; i++)
   numeros[i] = r.Next(0,50);

Y hasta aquí, ya veremos después como es por dentro esta clase…

Estructuras de C#. Pila (Stack)

, ,

Esta estructura es bastante usada para simular métodos recursivos y resolver algunos tipos de problemas. Esto viene simulando como un montón de objetos que se van apilando (uno encima de otro). La filosofía de una pila (stack) es “El último que entra es el primero que sale”. Pueden ver un poco más de que se trata en la figura. Es importante también señalar que esta clase implementa la interfaz IEnumerable.
Una pila tiene un constructor con tres sobre cargas:
Contructor por defecto que crea una pila vacía
Stack s = new Stack();

Podemos indicar la cantidad inicial de elementos que tendrá la pila
Stack s = new Stack(int initialCapacity);

Podemos también pasarle una colección de elementos (List, Quee, ArrayList). Este constructor copiará todos estos elementos a la pila iniciará
Stack s = new Stack(ICollection col);

10 cosas que todavia no comprendemos sobre los humanos

1 Rubor. Incluso Darwin luchó por encontrar una explicación para la aparición de una respuesta que permite a los demás saber que hemos hecho trampas o engañado.

2 Risa. El descubrimiento de que la risa es producida más a menudo por comentarios banales que por chistes hace que nos preguntemos ¿por qué surgió?

3 Vello púbico. ¿Irradiar aromas, suministrar calor o proteger contra roces? La respuesta al por qué los humanos poseen franjas de pelo en sus partes pudendas sigue estando abierta a debate.

4 Adolescencia. Incluso nuestros parientes más próximos, los grandes simios, se mueven sin problemas desde su fase juvenil a la adulta… así que ¿por qué los humanos empleamos casi una década atroz llevando sudaderas con capucha y pantalones muy por debajo de los calzoncillos?

5 Sueños. Hoy en día la mayoría de las investigaciones niegan la creencia freudiana de que los sueños sean expresiones de nuestros deseos inconscientes, pero si no es así ¿entonces qué son?

6 Altruismo. Las personas siguen debatiendo si los humanos somos genuinamente altruistas por naturaleza. Pero si lo somos, la mayoría de los científicos creen que no tiene sentido desde el punto de vista evolutivo.

7 Arte. ¿Exhibición sexual, aprendizaje de herramientas, o una forma de cohexión social? El arte sigue negándonos su sentido.

8 Superstición. La mayor parte de los humanos tienen supersticiones – hábitos extraños y tranquilizadores que no tienen sentido racional – pero podría haber una razón subyacente para dicho comportamiento.

9 Besos. La necesidad de besar no aparece en nuestros genes, de modo que ¿por qué encontramos tanto placer en compartir saliva?

10 Hurgarse la nariz. La mayoría lo hace aunque no existe recompensa nutricional en el hecho de comer mocos. ¿Podría haber alguna razón para este desagradable hábito?

Ahora lo que opino de esto


Algunos puntos son verdaderamente interesantes, el arte por ejemplo, tardé mucho tiempo articulando la forma de presentar algo sobre ella, pero me resulto imposible expresarme de forma satisfactoria, sencillamente es un misterio.

El altruismo es otro aspecto que capturó mi atención, me pregunto si viene de alguna forma de instinto o es simplemente fruto de la vida en sociedad, en todo caso, el nivel de altruismo de algunas personas es tan fuerte que al analizarlo de manera profunda es fascinante.

Mientras que la adolescencia y la superstición no me sorprenden nada, pues pienso que son simples desajustes del cerebro provocados por la combinación de conciencia y los químicos que alteran nuestro comportamiento, es la risa la que ocupa mas tiempo en mi pensamiento. Es fantástico ¿porqué reímos? ¿Porqué algunos comentarios, situaciones o acciones nos parecen graciosos? ¿De donde viene? ¿Es evolutivo o psicológico? Por más que discierno no logro mas que maravillarme mas y mas sobre este fenómeno.

¿Qué opinan los lectores de estos puntos?

Combinaciones posibles. Recursividad C#

Muchas veces para resolver algunos problemas, necesitamos saber cuantas formas posibles hay de escribir un número, una palabra. A través de los algoritmos de combinaciones podemos resolver muchos problemas, que no podemos hacer facilmente con una calculadora, o con la mente. Por ejemplo, de cuantas formas posibles se puede descomponer un número en sumandos? De cuantas formas posibles podemos combinar ciertas letras? Este tipo de problemas son los que trataremos en este post.
Primero veremos y comentaremos el algoritmo que nos permite saber cuantas combinaciones posibles se pueden hacer con ciertas letras.
Veamos el código:

public static void Combina(string s)
{
        //Iniciamos este array auxiliar para
        //marcar los caracteres que ya combinamos
bool []marcas = new bool[s.Length];
        //Llamamos al método recursivo
Combina(s, "", marcas);
}
 
static void Combina(string original, string combinado, bool[]marcas)
{
        //Imprimimos la combinación si ya cambiamos
        //todas las letras una vez
if(original.Length == combinado.Length)
Console.WriteLine(combinado);
 
for(int i = 0; i &lt; marcas.Length; i++)
{
           //Vemos si está marcada para no volverla a combinar
   if(!marcas[i])
   {
                //Marcamos el caracter que vamos a combinar
marcas[i] = true;
                //Invocamos al metodo recursivo añadiendo
                //un caracter al string que combinamos
Combina(original, combinado + original[i], marcas);
                //Desmarcamos el caracter para poder usarlo
                //en otras combinaciones
marcas[i] = false;
   }
}
}


Como ven es un algoritmo muy sencillo, y no tan largo, donde usamos la técnica de backtracking, o vuelta atrás, que vimos hace un tiempo en este post. Espero les halla servido de ayuda este problemita, con esto podrá por ejemplo, saber de cuantas formas posibles se pueden combinar las letras a, n y c.
Si hacemos algo así:

Combina("abc");
Console.ReadLine();

esto es lo que devolvería el programa:

abc
acb
bac
bca
cab
cba

Ya se encargarán ustedes de buscarle las aplicaciones que lleva, también pueden tratar de hacer este algoritmo un poco más eficientes, piensen un poco en el como…

Tres formas de Invertir un String

Estos son algunos ejemplos para que vean que en la programación hay muchas formas de hacer las cosas, aunque siempre hay una que es la más eficiente, aunque casi nunca es muy evidente.
Veamos como invertir un string de tres formas distintas. Por ejemplo, si tenemos el string “puntopeek”, el método devolvería “keepotnup”.
Veamos el primer ejemplo, es el que casi todos conocemos, y es muy fácil de implementar, vamos recorriendo la palabra desde el ultimo caracter hasta el primero y vamos guardando cada letra en un nuevo string, que es el que devolverá el método. El código sería algo así:
public string Invertir(string s)
{
string aux = "";
 
//Recorremos el string en orden inverso
for (int i = s.Length - 1; i &gt;= 0; i--)
aux += s[i];
 
//retornamos la nueva cadena
return aux;
}

Otra opción (pero hay que conocer que es una pila), es ir guardando cada letra en una pila (stack), y luego cuando esten todas las letras las sacamos de la pila. Noten que en esta estructura, el primer elemento que entra, es el último en salir, por eso nos sirve también para invertir un string. El código sería este:
public string Invertir2(string s)
{
//Declaramos una pila usando genericidad.
//Esto se puede hacer con el framework 2.0
Stack stack = new Stack();
 
//Recorremos el string y vamos metiendo en la pila
//cada caracter
for (int i = 0; i &lt; s.Length; i++)
stack.Push(s[i]);
 
string aux = "";
 
//Vamos sacando de la pila los caracteres y los
//ponemos uno a uno en un nuevo string
for (int i = 0; i &lt; s.Length; i++)
aux += stack.Pop();
 
return aux;
}

Ahora veremos la versión recursiva del problema. Si lo analizan paso a paso, verán que hace practicamente lo mismo que Invertir2. Como verán, este método no necesita almacenar ningun caracter, ni copiar, la recursividad se encarga de todo. En realidad la recursividad funciona como una pila (Invertir2) pero no hay que declarar variables ni nada de eso. A veces algunos métodos recursivos parecen mágicos, pero una vez dominemos esta técnica dominaremos el arte de programar. Al menos lo esencial. Veamos el código:
public string Invertir3 (string s, int lenght)
//El parametro lenght es el tamaño del string s
{
//Condicion de parada
if (lenght == 1)
return s;
else
//Llamado recursivo
return Invertir3 (s.Substring(1, s.Length - 1), lenght - 1)
+ s[0].ToString();
}

Para que se den cuenta de lo que hace el método, es necesario que le hagan un debug paso a paso, y vayan viendo como se transforman las variables locales. Si tienen alguna otra solución de como Invertir un string pueden ponerla en los comentarios. Y hasta aquí este post, espero escribir un poco más seguido, pero estoy con muchos proyectos en la universidad y mucho trabajo.

Percepción de la realidad


Vivimos en un mundo en el que hay cosas que duran mas que otras, cosas que cambian de estado y otras que dejan de existir. Un Universo cuyo componente principal es la materia y su motor es la energía, una sociedad en la que todos quieren lo mejor para si mismos, algunos quieren lo mejor para todos y unos pocos quieren lo mejor para otros. El tiempo nos parece una linea recta, un camino de un solo sentido una sola dirección, la vida es un viaje que se acaba cuando nuestro organismo falla, porque todos los organismos fallan, nada dura para siempre, ni siquiera el Sol, esa enorme bola de gas que da calor a nuestro planeta.

Todo lo anterior corresponde a una descripción de la realidad ¿O no? No, es solo una percepción de la realidad, mi percepción de la realidad, para otras personas, la vida en Tierra es un estado y la muerte una metamorfosis a otra vida. Para otras personas, materia y energía no son tan diferentes y para otros la realidad es tan distinta que el que las cosas se transformen es considerado una ilusión y el tiempo no es algo en lo que nos encontremos atrapados, sino que corresponde a otra dimensión de existencia.
Todos tenemos una percepción de la realidad, algunos la llaman Cosmovisión, y se va formando desde nuestros primeros pasos. La percepción de la realidad de una persona es como un edificio, hay elementos que conforman la base y cimiento del edificio y hay otros que le dan forma y sentido. Por ejemplo, hay gente que cree que la vida tiene un sentido, y todas las cosas también poseen uno y hasta llegan a altos niveles de depresión si sienten que sus vidas carecen de ese sentido. Hay personas que creen que todo gira en torno a si mismos y cuando cualquier cosa pasa fue para favorecer o empeorar la situación de uno, sin tener en cuenta las causas reales de los acontecimientos que los rodean.

La razón de esos modelos de realidad tan diversos es compleja, como mencioné, desde pequeño se van formando estas ideas y depende de como “se alimente” el cerebro del niño y a que tiempo lleguen los datos, así, por ejemplo, podría desechar cierta información por considerarla errónea en contraste con una idea ya arraigada o entenderla de forma diferente.
Toda esta construcción que hacemos no corresponde con la realidad, es un mini-universo formado por pedazos de información adquiridos con el tiempo que existe en nuestro cerebro. Cuando la construcción esta avanzada, los nuevos conocimientos se adhieren al edificio solo si la estructura es compatible. Es por ello que cuando intentamos describir la realidad en realidad nos referimos a la idea subjetiva que entendemos por realidad.

Para terminar, cabe mencionar que la mayoría de la información con la que nos alimentan proviene de fuentes de sabiduría externa, pero el origen primario de cierta información son los sentidos, a partir de allí, nuestro cerebro interpreta los datos y crea una percepción del objeto y crea una idea. En resumidas cuentas, estamos limitados a interpretar la realidad y suponer como funcionan las cosas. Para conocerla nos falta mucho y posiblemente sea mucho mas compleja de lo que podamos imaginar.

“Yo solo sé que no sé nada”

Sócrates

Y contando...

Ubuntu: For Desktops, Servers, Netbooks and in the cloud



Ilusión óptica

Realmente me sorprendió esta imágen.
Solo mira fijamente el punto rojo por
unos segundos y la circunferencia verde
desaparecerá.

Cultura corporativa

, ,