viernes, 30 de mayo de 2014

IDE para crear aplicaciones visuales.

Según avanzamos, dentro de no mucho habría que empezar a hacer cosillas visuales (típico programa interactivo con botones, vamos, lo que usamos normalmente) y dejar lo antes posible la pantallita negra estilo MS-DOS. Como para pasar a las aplicaciones de pantalla fue todo muy precipitado, este post lo quería colocar con más tiempo.

Sólo he utilizado dos aplicaciones para crear este tipo de programas, el Microsoft Visual Studio y el Qt Creator. El Qt Creator me gustaría dejarlo para más adelante, algo así como una evolución desde C++ a Qt, así que por el momento, creo que voy a utilizar la versión gratuita del Visual Studio (versión Express) que se puede descargar desde aquí:
                    
                           Microsoft Visual Studio Express

Si alguien tiene alguna otra proposición, podemos verlo. También cotillearé un poco por ahí cuando tenga un ratillo por si hubiese alguna otra opción interesante.

jueves, 29 de mayo de 2014

El juego de las siete y media. Parte III.


MODIFICACIÓN: Mostrar el podio con los tres ganadores de la partida.

Vamos a ver primero un ejemplo de código de cómo hacerlo y luego las cosas interesantes que hemos añadido:


Este es el resultado de una partida cualquiera:


Se puede ver cómo se han cogido los tres jugadores con puntuaciones más altas y se han colocado en el podio.

Ahora vamos a ver detalladamente el código. Lo más llamativo es algo que no había comentado antes, en realidad, son dos cosas en una: el uso de la memoria estática y los arrays de varias dimensiones. Suena muy técnico, pero no es tan complicado.

La memoria estática se da cuando el valor de un array es siempre fijo, se puede construir desde el primer momento, no es necesario hacerlo más tarde con la palabra new. Un array normal en memoria estática se declararía así:    
     
                                                  double podio[3];

Así se montaría una "estantería" de tres pisos desde el primer momento y con tamaño fijo (la ventaja de la memoria dinámica es que se puede modificar el tamaño).

Los arrays (matrices o como le hemos llamado aquí "estanterías") pueden ser de varias dimensiones, ¿y qué significa esto? Pues imaginemos nuestra estantería, en un array simple de, supongamos 4 estantes, tenemos un sólo mueble de 4 estantes. Ahora imaginemos que en vez de un mueble, montamos 2, tendríamos dos estanterías de 4 estantes cada una. Y así indefinidamente.

Si vemos el código, vemos que tenemos
          
                                                  double podio[3][2]

si seguimos con la metáfora de las estanterías, esto se correspondería a 3 estanterías, con dos estantes cada una. Concretamente, tenemos las tres posiciones del podio, cada una con dos espacios para guardar números, en el primer espacio almacenamos el resultado de la jugada y en el segundo el número que identifica al jugador.

Cuando el programa encuentra un valor que es mejor que el primer valor (el oro), modifica todo el podio bajando una posición al primero y al segundo y coloca en primer lugar el nuevo valor. Si el nuevo valor es sólo mejor que el segundo (pero no el primero), se baja una posición el segundo clasificado (pasando a tercer lugar) y se coloca en segundo lugar el nuevo valor. Si es sólo mejor que el tercero, directamente se intercambia el valor del tercer clasificado con el nuevo valor.

Todo termina mostrando el mensaje con el podio.

Para la próxima modificación, una un poco más sencilla, vamos a mostrar el valor de cada carta.

lunes, 26 de mayo de 2014

El juego de las siete y media. Parte II.

Y aquí tenemos un ejemplo de cómo codificar el juego.



Suponiendo que le decimos al programa que van a jugar 3 jugadores, un resultado podría ser éste:




Bueno, cosillas interesantes del código. Por ejemplo, se puede ver que se ha utilizado un bucle 'for' para  dar turno a cada jugador y a su vez dentro hemos colocado un bucle 'do-while' para que cada jugador pueda sacar las cartas que quiera o hasta que pierda.

Si el resultado es mayor que 7,5 o igual, se da un aviso y se utiliza una sentencia 'break' (romper en inglés), esto lo que hace es romper el bucle más interior que se está ejecutando en ese momento, en estos dos casos, bucle que dejaría de repetirse es el do-while para así pasar directamente al siguiente jugador.

Para que un jugador pueda decidir si quiere otra carta o no, utilizamos un carácter (Y/N), que sería YES (si) o NO (no). Mientras se introduzca la Y, se darán más cartas al jugador, si no, al introducir N, el bucle deja de repetirse para pasar al siguiente jugador.

Como hemos ido guardando todos los resultados en un array, al final podemos sacarlos para mostrar la tabla de resultados.

¡Modificaciones!
La primera modificación que se me ocurre, es que al final, después de mostrar la tabla de resultados, que muestre también el ranking con los tres jugadores que mejores puestos han obtenidos, es decir, un podio.

Otra modificación, es que no sólo nos dé el valor obtenido al sacar una carta, sino que también nos diga qué carta es (del 1 al 7 y sota, caballo y rey) y el palo (bastos, oros, copas y espadas).

Una vez que hemos hecho la modificación anterior, ¿por qué no hacer que cada carta pueda salir sólo 1 vez? Si se terminase la baraja, daría un aviso y se cogería una nueva baraja (o se reutilizaría la anterior al completo).

A ver quién es el valiente.

Para todo tipo de dudas, sugerencias, otras modificaciones, otras ideas para mejorar el código, tenéis a vuestra disposición los comentarios.

domingo, 25 de mayo de 2014

El juego de las siete y media. Parte I.



Vamos a empezar con el primer programa más complicado y entretenido: El juego de las siete y media.
Lo primero es conocer el juego. Es un antiguo juego de cartas (a mí me lo enseñó mi abuela) en el que cada jugador va sacando cartas hasta acercarse lo máximo posible al valor 7 y medio, pero sin pasarse. El que quede más cerca del valor, es el ganador.

Las cartas tienen su valor del 1 al 7 y las tres cartas más altas (sota 8, caballo 9 y rey 10) tendrán el valor de medio punto.

A la hora de desarrollar una idea, hay que ir dividiendo el "problema" o idea en bloques más pequeños que sean más asequibles. La forma de abordar esto es totalmente personal y se puede realizar de todas las formas imaginables, habrá muchas formas de hacerlo y todas válidas, aunque unas pueden ser más eficientes que otras (en otro post hablaremos de la eficiencia y su importancia), ahora mismo, con que funcione, podemos estar contentos.

Por ejemplo, uno de los primeros problemas que podemos diferenciar es cómo simular que se obtienen cartas aleatorias de la baraja. Para simular esto, vamos a crear números aleatorios del 1 al 10, para eso se utiliza la función 'rand()'. Esta función se utiliza de la siguiente forma:
                                                              int carta = rand() % 10 + 1;
Así indicamos que nos devuelva un número aleatorio del 1 al 10 (por eso se le suma 1 al final, para que empiece desde 1 y no sea de 0 a 9);

Otro de los bloques a resolver sería cómo conocer el número de jugadores y hacer que todos jueguen. Para resolver esto, podemos preguntar al principio cuántos jugadores van a jugar y a través de un bucle, controlar que cada uno juegue su ronda.

Para guardar los resultados, se me ha ocurrido utilizar un array (una matriz). Una matriz es algo parecido a una estantería, en cada estante va una caja (variable). Como hasta que el usuario no nos lo indique no sabremos cuántos jugadores hay, utilizaremos lo que se conoce como memoria dinámica, es decir, que no crearemos la estantería hasta saber cuántos estantes tendrá. Es un concepto un poco abstracto, pero quizá se vea más claro en el ejemplo.
                             double *resultados;
                             resultados = new double[jugadores];
                             for ( int i=0; i<jugadores; i++)
                             {
                                        resultados[i] =0;

La primera línea crea la base de la estantería, una vez que conocemos el valor de la variable 'jugadores' es cuando creamos los pisos de la estantería con la palabra 'new'. Para acceder a las diferentes posiciones, se utiliza lo que sería el número de estante (empezando desde cero).

Al final del programa, podemos rescatar todos los resultados y mostrar el marcador con todos los jugadores y su puntuación.

El próximo post veremos el código (una posibilidad), el resultado y propondremos algunas mejoras para los valientes.

sábado, 24 de mayo de 2014

Interactuando con el programa y el bucle 'for'

Lo primero ahora es instalar un entorno de trabajo. Yo he elegido CodeBlocks para poder trabajar con mi viejo portátil (ya pocos programas puedo instalar). Se puede descargar de: www.codeblocks.org/ .

Lo primero es crear un nuevo proyecto del tipo "Console Application" o "Aplicación de Consola" en castellano. Se le da el nombre que queramos y se abre el fichero main. Ahora, a trabajar.

Vamos a "hablar" con nuestro programa y por primera vez a darle órdenes para que se comporte como queremos.

Vamos a incluir un bucle 'for'. Es uno de los bucles más utilizados y a la vez el más complejo. La sintaxis es la siguiente:

for(variable con valor inicial ; expresión de repetición ; aumento/disminución de la variable de control)
{
        .......
}

Es decir, se inicia una variable con un valor (en la primera posición). Se comprueba que se cumpla la expresión de la segunda posición. Por último, se modifica la variable que hará que finalice el bucle. Pero mejor verlo en el código, añadiré comentarios para que quede más claro.


La salida es la siguiente:


Ahora ya sabemos cómo dar órdenes a nuestros programitas.

viernes, 23 de mayo de 2014

Primera condición (if-else) y primer bucle (while).



Esto va a empezar a ponerse interesante. Vamos a empezar con las condiciones y los bucles, con lo que ya podremos hacer cosas más complicadas.

Lo primero es la condición 'if-else' ('si-sino' en inglés), la idea es que el programa tenga opción de seguir varios itinerarios según la condición del 'if'. Un ejemplo gráfico:

Si tengo 2 manzanas, las comparto con mi amigo, sino (si sólo tengo una), me la como yo.

Esta condición se comprueba con los operadores de comparación y para eso hay que conocer los valores 'true' (verdadero) y 'false' (falso).

==   --> Igualdad. Devuelve 'true' si son iguales y 'false' si no lo son.
!=    --> Desigualdad. Devuelve 'true' si son diferentes y 'false' si no lo son.
<     --> Menor que. Devuelve 'true' si el valor de la izquierda es menor que el de la derecha. Fácil de recordar si os fijáis en los picos de la flecha.
<=   --> Menor o igual que. Devuelve 'true' si el valor de la izquierda es menor o igual que el de la derecha.

>     --> Mayor que. Devuelve 'true' si el valor de la izquierda es mayor que el de la derecha. 
>=   --> Mayor o igual que. Devuelve 'true' si el valor de la izquierda es mayor o igual que el de la derecha.

Ahora vamos al grano y a practicar. Este va a ser el primer código:


Esta es la salida si ponemos a 'true' la variable 'tengoManzanas':

Si ponemos a 'false' esa variable:

Probad todas las combinaciones que se os ocurran y comentad cualquier duda que pueda surgir.

Vamos a añadir otro concepto nuevo, los bucles, en concreto el bucle while (mientras). Básicamente es la repetición de un trozo de código las veces que nos interese. Se me ha ocurrido un ejemplo en el que tengo 8 libros esparcidos por el salón y tengo que recogerlos en la estantería: 

Mientras haya libros en el salón:
     Recogo el libro y lo llevo a la estantería. Ahora hay un libro menos sin recoger.
Repito hasta que no queden libros por el salón.

Al igual que el if, se controla con una expresión que hace que el bucle se repita mientras esa expresión sea cierta.

Nota: Cuando trabajamos con bucles, es importante asegurarse de que termina, si es un bucle infinito, se ejecutará siempre (hasta que lo detengamos de mala manera cerrando el programa).

Vamos a ver cómo sería el código para recoger el salón:


La salida sería la siguiente:


Se puede ver perfectamente cómo se ha repetido hasta recoger todos los libros.

Mi objetivo es empezar a hacer jueguecitos lo antes posible (es bastante más ameno y productivo) pero antes hay que conocer estas cosillas básicas aunque sea aburrido.

Para la próxima, algunos bucles más y a por la instalación de un Entorno de desarrollo en condiciones que nos deje libertad total.

miércoles, 21 de mayo de 2014

Compilador C++ a utilizar.

Aunque prefería evitar instalaciones tan pronto, la verdad es que vale la pena poder ver cómo es el programa que estás creando, comprobar que has creado algo. Además, es divertido la parte de entrada de datos, no sólo ejecutar tu programita, sino interactura con él y darle órdenes para que se comporte de una forma u otra.

Así que entramos en el eterno debate, ¿qué programa gratuito utilizar para generar nuestros programas? Hay muchos, unos los he utilizado y otros no y algunos serán más potentes que otros, pero como al principio sólo haremos aplicaciones de consola sencillas, no vamos a ser muy exigentes. Como no quiero decidir de manera unilateral, voy a dar la opción de votar a los que esteis interesados y por eso he colocado este post tan pronto, para dar tiempo a que si alguien quiere expresar sus preferencias, lo haga.

Si nadie se animase, elegiría yo uno y más adelante si alguien quiere que veamos otras opciones, pues las vemos. Es mi primer tutorial y me gustaría adaptar el contenido a quien lo quiera seguir y sus intereses, por eso son muy importantes las sugerencias y la colaboración.

Los entornos que he encontrado a simple vista son:
                  * Microsft Visual C++ Express Edition  (versión gratuita y limitada del famoso Visual Studio de Microsoft de pago).
                  * Dev C++.
                  * Code::Blocks.
                  * Eclipse C++.

Si alguien conoce alguno más, lo añadimos a la lista. En cuanto vea que empieza a ser necesario el entorno de desarrollo, según los comentarios (si los hay), tomaré una decisión y prepararé un post sobre cómo instalarlo.

lunes, 19 de mayo de 2014

Variables y pequeñas operaciones.


La base de la programación son las variables. Son algo parecido a cajas, aunque sean cajas para guardar información. Cada tipo de caja tiene una forma y tamaño y dentro se pueden guardar sólo objetos de una forma correspondiente y de un tamaño no mayor que la caja.

Las variables más comunes son las que guardan valores numéricos y cadenas de caracteres (es decir, pequeños textos).

Para simplificar, por ahora sólo utilizaremos 3 tipos de variables:
- int : para guardar números enteros, es decir, sin decimales.
- double: para guardar números parte decimal.
- string: para guardar cadenas de caracteres.

En el holaMundo ya vimos cómo mostrar directamente una cadena de caracteres o mensaje fijos, pero puede ser que nos interese que ese mensaje esté personalizado, por ejemplo, podemos pedir su nombre al usuario y saludarle apropiadamente. Las opciones son tantas como nos proporcione nuestra imaginación.

Ahora vamos a jugar con los números. Aquí tenéis un código en el que se utilizan valores del tipo "int" y se muestran por pantalla:


La salida sería algo así como:


Puede parecer tonto, pero hay que aprenderlo y probar, es la base, todo tiene que ser de lo más natural.

Quería hacer algo con entrada y salida de datos, pero me he topado con que codepad no admite entrada de datos.... mi gozo en un pozo. Habrá que dejarlo para más adelante, cuando elijamos (y hablo en plural porque me gustaría elegir algo entre todos) un compilador "serio" que sea gratis.

Me gustaría que probaseis por vuestra cuenta a hacer algo parecido con los números double (con decimles) y con cadenas de texto para ver cómo los muestra vuestro programilla.

Ejemplos de declaraciones para estos tipos serían:


A darle caña, y para cualquier duda... comentarios!!

domingo, 18 de mayo de 2014

¡Empezando a enredar!

La teoría es aburrida, así que vamos a pasar directamente a hacer cositas básicas.

Hay miles de compiladores (el programa que convierte lo que escribimos en un programa que funciona), unos de pago y otros gratis, pero como al final todos funcionan igual, he elegido uno gratis y online, para evitar instalaciones engorrosas y todo eso, pero el código funcionará igual en todos.

Si entráis en esta web:   http://codepad.org/   aparecerá la siguiente pantalla:


Para compilar en C++ sólo hay que marcar la opción bajo la palabra "Language" y escribir el código en el cuadro central.

Una vez que nuestro código está listo, al pulsar el botón "Submit" la web comprueba si hay errores y si todo está correcto, nos mostrará el resultado de nuestro programita.

Si hay algún error, nos indicará qué error es y la línea en la que se encuentra.

Ahora vamos a empezar con el clásico de todos los lenguajes de programación, el primer programa con el que todos hemos empezado, el "¡Hola Mundo!". Para ello, escribimos el siguiente código:


La primera línea es para incluir la biblioteca que contiene la función que muestra por pantalla el mensaje.

La tercera línea es el inicio de la función "main", es el bloque principal y es lo primero que se lee, es decir, donde empieza y termina todo. Su contenido siempre irá entre llaves {}.

En la tercera línea es dónde enviamos nuestro mensaje para que lo pinte por pantalla. Es imprescindible terminar estas órdenes individuales con un ";".


Al pulsar el botón "submit" este es el resultado:

Arriba aparece el código que se ha ejecutado y abajo aparece la salida "Output" con nuestro mensaje. Parece un poco tonto, pero es el primer paso y probar varios mensajes puede ser interesante para familiarizarse con el entorno.

Para cualquier duda o sugerencia, ya sabéis, ahí tenéis los comentarios.

Para la próxima entrada, variables y primeras operaciones aritméticas.

Introducción.

Aprendí a programar hace casi 13 años y es en lo que trabajo actualmente.

La sociedad española ha cambiado mucho en el terreno laboral, antes se aprendía un oficio y era común trabajar en el mismo sitio toda la vida. Ahora la población está mucho más formada y hay muchísimo movimiento, lo que supone la necesidad de seguir formándose constantemente e incluso reciclarse para acceder a otro sector.

El desarrollo de aplicaciones está en auge, la tecnología inunda nuestras vidas y detrás de todo lo que la hace funcionar están los desarrolladores de software.

Aplicaciones de móvil, videojuegos, podemos hacer todo lo que podamos imaginar, todo es cuestión de esfuerzo y tiempo (a veces, mucho de ambos), pero todo está a nuestro alcance.