Archivo de la categoría: C y C++

50% de descuento para Campus Party 2014!

cover2

Uno de los eventos más importantes de Tecnología y ambiente tecnológico del mundo se celebrará en nuestro país en Zapopan, hablamos de CPMX5 y hoy te mostraremos la oportunidad de como obtener tus entradas con el 50 de descuento.

  • Deben registrarse como campusero en www.campus-party.com.mx.
  • Si ya tienes usuario solo debes hacer login.
  • Una vez hecho login en el panel de usuario deben seleccionar la opción «Comprar entrada». (http://www.campus-party.com.mx/webapp/fichaUsuario/pago)
  • Elegir la opción «Comprar con descuento».
  • En el proceso deben usar el siguiente código de descuento: CD501ihw35hi (copia y pega).
  • Una vez elegido el tipo de entrada se procede al pago de la cantidad vía PayPal.

¡Y listo! solo faltaría esperar a que llegue el día de comienzo de #CPMX5 para disfrutar de una semana de contenidos para los fans de la tecnología y lo que esto implica.

@Chopapp para compartir código fuente

Después de un largo descanso …. Chop es una curiosa herramienta desarrollada por ZURB que te permite compartir snippets (trozos de código fuente) y recibir retro alimentación, si quieren saber por que esta app es bastante interesante les recomiendo seguir leyendo :).

chop

La idea es bastante simple y divertida, en el caso de querer mostrar nuestro codigo a alguna otra persona (similar a otros servicios como copypastecode o pastebin) y recibir algun tipo de retroalimentación tan solo tenemos que copiarlo en el formulario, elegir el lenguaje de programación adecuado y usar el botón de Chop It!, ejemplo:

chop_example1

Una vez hecho esto la aplicación nos pedirá un nombre de usuario y a continuación nos dará un link con el cual nuestros amigos podrán ver y opinar sobre nuestro código :), lo mas interesante de esta aplicación a diferencia de muchas otras que existen en el mercado es que nos permite realizar comentarios sobre el código línea por línea y no un comentario general, desde mi punto de vista es una forma bastante interesante de innovar y mejorar respecto a servicios ya existentes. El resultado final es algo como esto:

chop_example_2

Si quieren mantenerse informados sobre el desarrollo de esta aplicación pueden seguir a @chopapp

Lista de ganadores de entradas para Campus Party 2013

Muchas gracias a todos los que participaron el sorteo de 3 entradas gratis para asistir a Campus Party México 2013, las personas listadas a continuación ganaron una entrada con puesto en sala para el evento :), muchas felicidades.

  • Braicot Espinoza
  • Rocio Barragan
  • Jose Vazquez Quezada

Si no resultaste ganador no te desanimes, todavía puedes conseguir tu entrada con un 20% de descuento :)!

¿Como? Muy fácil, tan solo pídela utilizando nuestra sección de contacto y con mucho gusto te enviare un código promocional para que puedas adquirir tu entrada!.

Ya falta poco, nos vemos en Campus Party México 2013

salu2

Juego 4 en raya hecho en C++

Revisando entre mis curiosidades me encontré un código que hice hace varios años (de la prepa creo), se trata del juego 4 en línea o 4 en raya hecho en C++, he decidido subirlo al blog ya que no me gustaría que se perdiera en el final de los tiempos xD.

Pueden descargar el código fuente aca:

Juego 4 en raya hecho en C++

#include <iostream>

using namespace std;

const int n=6;
const int m=8;

bool sobranEspaciosLibres(int tablero[n][m])
{
    for(int i = 0; i < 6; i++)
    {
        for(int j = 0; j < 8; j++)
        {
            if(tablero[i][j] == 0)
            {
                //Sobran espacios donde colocar fechas
                //cout<<"Hay espacios"<<endl;
                return true;
            }
        }
    }

    //No sobran mas espacios donde colocar fichas, juego empatado
    cout<<"No hay mas espacios: empate"<<endl;
    return false;
}

void ImprimirTablero(int tablero[n][m])
{
    for(int i = 0; i < 6; i++)
    {
        for(int j = 0; j < 8; j++)
        {
            if(tablero[i][j] == 1)
            {
                cout<<" O ";
            }
            else if(tablero[i][j] == 2)
            {
                cout<<" X ";
            }
            else
            {
                cout<<" . ";
            }

        }
        cout<<endl;
    }
}

int ColocarFichaEn(int tablero[n][m], int columna)
{
    for(int i = 0; i < 6; i++)
    {
        if(!(i+1 > 5))
        {
            if(tablero[i][columna] == 0 && tablero[i+1][columna] != 0 )
            {
                return i;
            }
        }
        else
        {
            //Alcanzo la base del tablero
            if(tablero[i][columna] == 0)
            {
                return i;
            }
        }
    }

    return -1;
}

bool columnaATope(int tablero[n][m], int columna)
{
    if(tablero[0][columna] != 0)
    {
        cout<<"No hay espacio para colocar la ficha ahi"<<endl;
        return true;
    }
    return false;
}

bool ganador(int tablero[n][m], int fila, int columna, int jugador)
{
    //Vertical
    bool encontrado = false;
    int total = 0;

    for(int i = 0; i < n; i++)
    {
        //cout<<"i: "<<i<<endl;
        if(encontrado)
        {
            if(tablero[i][columna] == jugador)
            {
                total++;
            }
            else
            {
                encontrado = false;
                total = 0;
            }
        }
        if(tablero[i][columna] == jugador && !encontrado)
        {
            encontrado = true;
            total++;
        }

        //cout<<"total: "<<total<<endl;
        if(total == 4)
        {
            cout<<"El jugador "<<jugador<<" gana!"<<endl;
            return true;
        }
    }

    //Horizontal
    encontrado = false;
    total = 0;

    for(int i = 0; i < m; i++)
    {
        //cout<<"i: "<<i<<endl;
        if(encontrado)
        {
            if(tablero[fila][i] == jugador)
            {
                total++;
            }
            else
            {
                encontrado = false;
                total = 0;
            }
        }
        if(tablero[fila][i] == jugador && !encontrado)
        {
            encontrado = true;
            total++;
        }

        //cout<<"total: "<<total<<endl;
        if(total == 4)
        {
            cout<<"El jugador "<<jugador<<" gana!"<<endl;
            return true;
        }
    }

    //Diagonal \
    //Obtener Coordenadas donde inicia la diagonal en base a fila - columna
    int nuevaFila = fila;
    int nuevaColumna = columna;
    encontrado = false;
    total = 0;

    //cout<<"Fila: "<<fila<<" Columna: "<<columna<<endl;

    while((nuevaFila != 0 || nuevaColumna != 0))
    {
        nuevaFila--;
        nuevaColumna--;

        //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;
        if(nuevaFila == 0 || nuevaColumna == 0)
        break;
    }

    //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;

    do
    {
        if(nuevaFila >= n)
        break;

        //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;
        if(encontrado)
        {
            if(tablero[nuevaFila][nuevaColumna] == jugador)
            {
                total++;
            }
            else
            {
                encontrado = false;
                total = 0;
            }
        }
        if(tablero[nuevaFila][nuevaColumna] == jugador && !encontrado)
        {
            encontrado = true;
            total++;
        }

        //cout<<"total: "<<total<<endl;
        if(total == 4)
        {
            cout<<"El jugador "<<jugador<<" gana!"<<endl;
            return true;
        }

        nuevaFila++;
        nuevaColumna++;

    }while(nuevaFila < n);



    //Diagonal /
    nuevaFila = fila;
    nuevaColumna = columna;
    encontrado = false;
    total = 0;

    //cout<<"Fila: "<<fila<<" Columna: "<<columna<<endl;

    while((nuevaFila != 0 || nuevaColumna != m))
    {
        nuevaFila--;
        nuevaColumna++;

        //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;
        if(nuevaFila == 0 || nuevaColumna == m)
        break;
    }

    //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;

    do
    {
        //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;
        if(nuevaFila >= n)
        break;

        //cout<<"nueva Fila: "<<nuevaFila<<" nueva Columna: "<<nuevaColumna<<endl;
        if(encontrado)
        {
            if(tablero[nuevaFila][nuevaColumna] == jugador)
            {
                total++;
            }
            else
            {
                encontrado = false;
                total = 0;
            }
        }
        if(tablero[nuevaFila][nuevaColumna] == jugador && !encontrado)
        {
            encontrado = true;
            total++;
        }

        //cout<<"total: "<<total<<endl;
        if(total == 4)
        {
            cout<<"El jugador "<<jugador<<" gana!"<<endl;
            return true;
        }

        nuevaFila++;
        nuevaColumna--;

    }while(nuevaFila < n);

    return false;
}

int main()
{
    int matriz[n][m];

    //Preparamos el tablero del juego rellenandolo con 0's
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            matriz[i][j] = 0;
            //cout<<matriz[i][j]<<" ";
        }
        //cout<<" "<<endl;
    }

    //Logica
    int jugador = 0;
    int ultimo = 0;
    do
    {
        int colocarColumna = -1;
        bool columnaTope = true;

        if(ultimo == 1)
        {
            jugador = 2;
        }
        else
        {
            jugador = 1;
        }

        do
        {
            cout<<"Turno del jugador "<<jugador<<" - Elije un numero del 1 al 8: "; cin>>colocarColumna; cout<<endl;
            colocarColumna--;
            columnaTope = columnaATope(matriz,colocarColumna);
        }
        while((colocarColumna < 0 || colocarColumna > 7) || columnaTope);

        int colocarFila = ColocarFichaEn(matriz,colocarColumna);
        matriz[colocarFila][colocarColumna] = jugador;
        ImprimirTablero(matriz);

        //Revisar si hay un 4 en raya
        if(ganador(matriz,colocarFila,colocarColumna,jugador))
        {
            break;
        }

        ultimo = jugador;
        jugador++;
    }
    while(sobranEspaciosLibres(matriz));

    return 0;
}

PD

No tiene nada de inteligencia artificial ni algoritmos minimax, es el código del juego simplemente, muy sencillo y algo feo también :p.

Los 5 errores mas comunes cuando se programa en C

He hecho una recopilación de algunos de los errores mas comunes que la gente comete a la hora de programar en C, el lenguaje C aunque es muy poderoso es bastante inflexible a diferencia de otros lenguajes de tipado sencillo como PHP por ejemplo :), sin embargo son obvias las ventajas que nos aporta C frente a los demás lenguajes, podemos comenzar diciendo que C ha sido el padre de varios lenguajes :)!.

1.- Sintaxis de comentarios incompletos

a = b; /* el comentario no termina
c = d; /* c = d se incluye en el comentario */

Por lo tanto c = d no se ejecutara

2.- Declaraciones accidentales / declarar booleanos accidentalmente

f(a = b) c; /* a tomara el valor de b, en lugar de ser comparado */

El valor de b sera asignado a “a”, en lugar de ser comparado, debido a que a != 0 entonces c se ejecutara. Otro caso similar podría ser también

 if( a =! b) c; /* esto es compilado como (a = !b) */

En lugar de (a != b) o (a == !b).

3.- Hacer mal uso de las macros en C

#define assign(a,b) a=(char)b
assign(x,y>>8)

/* Lo anterior es compilado como */ 
x = (char) y >> 8    /* Probablemente no es lo que queríamos */

4.- Archivos de cabecera que no coinciden

Supongamos que tenemos un archivo foo.h que contiene las siguientes instrucciones

struct foo { BOOL a};

Además tenemos otros 2 archivos f1.c y f2.c donde hacemos un include a ese archivo de cabecera.

/* F1.c  contiene*/
#define BOOL char
#include "foo.h"

/* F2.c contiene*/
#define BOOL int
#include "foo.h"

f1.c y f2.c difieren acerca del atributo principal de la estructura foo.

5.- Valores de retorno fantasma

Suponemos que tenemos el siguiente código:

 int foo (a)
 { 
    if (a) return(1); 
 } 
/* Esta mal, ya que en algunos casos no retornara ningún valor */

Este es el típico caso donde no conceptualizamos todos los posibles casos y nos hace falta implementar valores de retorno.

Finalmente no esta de mas decir que con las nuevas arquitecturas de 64 bits, hay nuevas formas de cometer errores cuando programamos en C, especialmente cuando se trabaja con matrices que se acercan o superan los 2 ^ 31 elementos (aunque es bastante raro).

Existen muchos mas errores que podemos cometer, algunos son verdaderamente difíciles de ocasionar pero pueden llegar a suceder, sobre todo los que tienen que ver con el compilador xD.
Para una lista mas detallada de errores pueden visitar el siguiente sitio The Top 10 Ways to get screwed by the “C” programming language