Nuestro primer programa

domingo, 15 de noviembre de 2009 en 4:34
Ha llegado la hora de crear nuestro primer programa en C, haciendo uso de nuestro recién instalado entorno de desarrollo (IDE) y compilador.

Vamos a crear un proyecto nuevo. Los pasos a seguir son siempre los mismos y os los ilustro mediante pantallazos. Empezamos por lanzar el entorno, que se nos habrá instalado en el Menú de Inicio > Todos los Programas > Microsoft Visual C++ 2008 Express Edition > Microsoft Visual C++ 2008 Express Edition. Eso nos habrá abierto una ventana como ésta:


A continuación vamos a crear nuestro proyecto. Hacemos click en el menú Archivo > Nuevo > Proyecto, lo que nos lleva a esta otra ventana:


En Tipos de Proyectos (a la izquierda) seleccionamos Visual C++ > Win32. Es decir que vamos a crear una aplicación para Windows de 32 bits. A la derecha, en las Plantillas, elegimos Aplicación de consola Win32 pues, como ya os dije, en el curso de C todas la aplicaciones que vamos a hacer serán de consola. Escribimos abajo donde pone Nombre: el nombre que le daremos al proyecto (él entorno escribirá en Nombre de la solución: el mismo nombre y nuestro ejecutable final se llamará igual, pero con extensión .exe). Hacemos click en AceptarEso nos llevará a otra ventana:


En la que hacemos click en Siguiente > para que se abra esta otra:


En Tipo de aplicación: debería aparecer marcado Aplicación de consola. Un poco más abajo, en Opciones adicionales: marcamos Proyecto vacío y hacemos click en Finalizar. Al hacerlo se cierra la ventana y llegamos a la inicial, solo que ahora se ha creado nuestro proyecto, aunque está vacío. Haciendo click en el margen de la izquierda donde dice (en vertical) Explorador de soluciones veremos esta ventana:


Hacemos click con el botón derecho sobre Archivos de código fuente y elegimos Agregar > Nuevo elemento... para obtener esta ventana:


En ella elegimos Código a la izquierda donde dice Categorías: y a la derecha, donde dice Plantillas: escogemos  Archivo C++ (.cpp), aunque nosotros en Nombre: (abajo) vamos a ponerle main.c, en lugar de main.cpp que sería lo que pondríamos para programar en C++. Ponemos el nombre main porque es el archivo que va a incluir nuestra función main.

Finalmente llegamos a esta ventana:


Donde como vemos por el parpadeo del cursor, el entorno está esperando que empecemos a escribir nuestro código. Vamos a ello, tecleamos lo siguiente, carácter por carácter:

#include <stdio.h>

void main(void){
   printf("Mi primer programa en C");
}


El entorno irá resaltando las palabras que conoce con un color diferente (es lo que se llama resaltado de sintaxis o syntax highlighting en inglés). Eso nos ayudará a detectar errores al escribir. Por la misma razón cuando os ponga código que hay que teclear lo pondré con este formato, pero vosotros no tenéis que copiar los números de línea al código, sólo debéis copiar lo que hay a la derecha de la línea verde (obviamente sin incluir tampoco la cabecera gris de la primera línea):
#include <stdio.h>

void main(void){
   printf("Mi primer programa en C");
}
Bueno, vamos a probar a ejecutar nuestro programa, a ver si funciona. Para ello, hacemos click en el signo de reproducción verde () que hay en la barra de botones arriba, más o menos debajo de la 'm' del menú Herramientas. Al hacerlo nos saldrá esta nueva ventana:


Lo que nos dice es que hemos hecho cambios en el código pero el compilador no ha generado un ejecutable con el código nuevo y que si queremos hacerlo ahora. Marcamos la casilla No volver a mostrar este cuadro de diálogo y hacemos click en . Eso ejecutará nuestro programa, vamos allá...








... ¡ops! que ha pasado. Se ha visto una pantalla negra que se ha cerrado tan rápido que no hemos sido capaces de ver nada, ¿verdad? Lo que ha pasado es que nuestro programa de consola se ha ejecutado, mostrando en la pantalla el mensaje que le hemos pedido que muestre y luego ha terminado tan ricamente, cerrando la consola al terminar. Si queremos ver el resultado será mejor que obliguemos al programa a hacer una pausa antes de cerrarse. Para lograr eso insertamos la siguiente línea (en verde):

#include <stdio.h>

void main(void){
   printf("Mi primer programa en C");
   getchar();
}


Y ejecutamos de nuevo. Ahora sí, ¿verdad? Ahora se ha abierto la consola con nuestro mensaje en ella y al pulsar una tecla se ha cerrado, devolviéndonos a nuestro entorno de desarrollo. Lo último que vamos a ver hoy es: ¿y dónde está nuestro archivo ejecutable?

Busquémoslo en Mis Documentos\Visual Studio 2008\Projects\Lección1\Debug, ahí tendréis un archivo Lección1.exe de unos 30 Ks. Si hacéis doble click en él veréis el mismo comportamiento que al ejecutarlo desde el entorno de desarrollo. De momento no probéis a llevaros el archivo a otro ordenador y ejecutarlo allí porque podría fallar (bueno por probar no pasa nada), antes de distribuir nuestros programas tenemos que aprender un par de cosillas... pero eso será otro día.

Un saludo:
Manuel Llorens

Variables en C

sábado, 14 de noviembre de 2009 en 2:13
La memoria de los ordenadores está formada por espacios individuales de almacenamiento contiguos, cada uno de ellos de 8 bits, es decir, cada uno de ellos capaz de almacenar un valor entre 0 y 255. Cada una de esas celdas de almacenamiento tiene una dirección única secuencial. Cuando yo declaro una variable en C lo que estoy haciendo es:

  1. Reservando un determinado número de celdas de la memoria contiguas para almacenar los valores que pueda contener la variable. El compilador determina el espacio necesario a partir del tipo de variable que hayamos definido.
  2. Dando un nombre a la dirección de memoria de la primera celda del espacio de memoria reservado.

Obviamente, nuestros programas en C podrán manejar valores más allá del rango 0-255. Para ello, las variables podrán comprender más de una celda. Veamos un ejemplo de cómo se guardan en memoria tres variables:
unsigned char a;  /* Valores comprendidos entre 0 y 255 */
unsigned short b; /* Valores comprendidos entre 0 y 65535 */
unsigned int c;   /* Valores comprendidos entre 0 y 4294967295 */
Por supuesto también podremos definir variables que puedan contener valores negativos. En las tres variables de arriba la palabra unsigned le está diciendo al compilador que sólo quiero almacenar en ellas valores positivos.
En memoria, estas variables podrían quedar almacenadas más o menos así:


La variable a ocupa una celda (1*8 = 8 bits), la variable b dos celdas (2*8 = 16 bits) y la variable c cuatro celdas (4*8 = 32 bits). Según la información que vaya a almacenar definiremos cada variable con el tipo más adecuado según unos criterios que estudiaremos más adelante para lograr que nuestro programa utilice la menor cantidad de memoria y al mismo tiempo se ejecute lo más rápido posible.

Todo esto que os cuento es válido para programas de 32 bits que son los que vamos a crear (en sistemas operativos de 64 bits cambia un poco). ¿De dónde salen los valores 255, 65535 y 4294967295? Pues son respectivamente 28 ‒ 1, 216 ‒ 1 y 232 ‒ 1, es decir, que una variable definida como unsigned char puede almacenar 256 valores diferentes (28), que van desde 0 hasta 255 = 28 ‒ 1.

¿Y qué pasa si meto en una variable definida como unsigned char un valor superior o inferior al rango de valores permitido?

Por ejemplo:
unsigned char a=256;
Pues sencillamente que la variable a almacenará el valor 0. Si, por el contrario, hacemos
unsigned char a=-1;
La variable a almacenará el valor 255.

¿Sencillo verdad? Pues eso es todo por ahora.

Comentario técnico no imprescindible para seguir el curso. Introducción al sistema de numeración binario.

En informática decimos que 1 bit es la mínima unidad de información que un ordenador puede manejar. El valor de 1 bit es o un cero o un uno. Con un bit puedo almacenar un máximo de dos valores (cero o uno), porque 21 = 2, ¿verdad? (es un problema simple de combinatoria para los que sepan lo que es eso)

Con dos bits podemos representar 4 posibles valores (22 = 4) que son:
00 = 0
01 = 1
10 = 2
11 = 3
es decir, que van desde 0 hasta 22 ‒ 1 = 3. Con 3 bits tenemos:
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
Siendo 7 = 23 ‒ 1. Con 4 bits (4 bits recibe el nombre de un nibble) podemos llegar hasta 15 y así podemos seguir todo lo que queremos. En la práctica se dice que 8 bits son un byte. Dos bytes se llama un word (word es 'palabra' en inglés) y dos word un dword (double word, palabra doble).

Un saludo:
Manuel Llorens

¿Por qué C?

en 1:41
¿Por qué he decidido dar un curso de un lenguaje de programación como el C, cuando hay tantos y algunos más potentes y modernos?

Por las siguientes razones:

  • Porque C es muy estricto con la sintaxis, y eso ayuda a aprender a programar sin cometer errores.
  • Porque C es la base de lenguajes más potentes que él mismo, como C++, Java, JavaScript o C#.
  • Porque en C están desarrollados algunos productos increíbles como el sistema operativo Linux.
  • Porque el código C, si se escribe con cuidado, es fácilmente portable a otros sistemas operativos, es un lenguaje de programación universal.
  • Porque al aprender C se aprende mucho más de los entresijos de la programación que con otros lenguajes.
  • Porque los programas escritos en C son más rápidos que en casi cualquier otro lenguaje de programación.
  • Porque es el lenguaje de programación en el que más he disfrutado programando.
Yo creo que son razones suficientes y de peso, ¿no os parece? Además, estoy convencido de que cualquiera puede aprenderlo si vamos lo suficientemente despacio.

Un saludo:
Manuel Llorens

Primera lección

viernes, 13 de noviembre de 2009 en 16:19
Voy a seguir dos criterios a la hora de desarrollar el curso de C:

  1. Voy a partir absolutamente de cero. Necesito vuestros comentarios para asegurar esto. Si hay algo que no se entienda, preguntad, e iré actualizando las lecciones con los cambios.
  2. Voy a ser profundamente heterodoxo. Quiero decir con esto que no voy a seguir lo que sería un curso típico de C, sino que voy a intentar explicar las cosas del modo que creo que se van a entender mejor.

La idea es ir publicando lecciones más o menos cada semana y dejando "deberes" para los que lo sigáis. Al final de curso realizaré un pequeño concurso sólo para alumnos del Colegio, proponiendo una pequeña aplicación y reconociendo las que estén mejor resueltas (originalidad, elegancia y eficacia). También tengo la idea de entregar diplomas a todos los que participen en el concurso, certificando la participación y aprovechamiento del mismo.

Para empezar, como he dicho de un modo muy heterodoxo, voy a establecer algunos conceptos básicos.

Programar en C consiste en escribir un archivo de texto (que se guarda con la extensión .c en lugar de .txt) en el cual ponemos una serie de instrucciones describiendo al ordenador las tareas que queremos que éste realice. El resultado será una aplicación ejecutable (un .exe) que puede ser de consola (sólo texto) o con un entorno gráfico. En el curso de C realizaremos solo aplicaciones de consola y en el curso de C# que le seguirá daremos el salto los interfaces gráficos.

Una vez escrito nuestro archivo de texto con las instrucciones pedimos al compilador que lo convierta en el archivo ejecutable y lo probamos. Este procedimiento lo realizaremos varias veces conforme vayamos avanzando en la escritura del programa, de modo que podamos comprobar que vamos por el buen camino.

Nuestro programa contendrá los siguientes elementos:
  • Instrucciones y operadores para el compilador: son las distintas tareas que queremos que el ordenador ejecute.
  • Instrucciones para el preprocesador: son instrucciones que explicarán y matizarán en qué modo queremos que el compilador interprete nuestro código.
  • Variables: son valores (espacios de memoria a los que asignaremos un nombre) en los que guardaremos los datos de partida de nuestro programa, los datos intermedios y los datos finales.
  • Funciones: son conjuntos de instrucciones que realizan determinadas operaciones. En ocasiones tomarán unos datos de entrada, realizarán con ellos alguna operación y devolverán un resultado. Nosotros podemos definir nuestras propias funciones, pero también hay muchas predefinidas en el lenguaje C que iremos aprendiendo.
  • Comentarios: es texto que se ignorará a la hora de compilar, pero que nos ayudará a hacer más legible el código, añadiendo al mismo explicaciones sobre lo que queremos hacer en cada línea.
Para entenderlo mejor vamos a analizar un pequeño ejemplo, sin entrar en determinadas particularidades del lenguaje C, que estudiaremos más adelante:
#include <stdio.h>

/* Función que suma dos valores enteros */
int sumar(int i1, int i2){
   return i1+i2;
}

/* Función principal */
void main(void){
   int a=5;
   int b=6;
   int c;
   c=sumar(a,b);
   printf("%i + %i = %i\n",a,b,c);
}
En este pequeño programa encontramos:

  1. Una instrucción para el preprocesador: #include <stdio.h>, que le dice al compilador dónde encontrar la definición de la función printf, que, como veis, no aparece definida en el código.
  2. Tres funciones: sumar, main y printf. Las dos primera están definidas en nuestro código, la última en una librería de funciones que incluye el propio lenguaje C, y su definición está en el archivo stdio.h, que significa STanDard Input Output (salida y entrada estándar). La función sumar recibe como parámetros de entrada dos números enteros y devuelve otro número entero, que es la suma de los dos primeros. La función main no tiene parámetros de entrada ni de salida (void significa vacío). Todos los programas en C necesitan una función main, que es la que se ejecutará cuando lancemos el programa. La función printf se encarga de sacar en la pantalla textos, la veremos con más detalle más adelenta.
  3. Variables: en la función sumar usamos las variables i1 e i2, ambas números enteros (int). En la función main utilizamos las variables a, b y c, todas ellas enteros. A las dos primeras les asignamos un valor al declararlas (al decirle al compilador que son números enteros) y en c metemos el resultado que nos devuelva la función sumar.
  4. Instrucciones: no hay, sí hay un operador, el + que la función sumar y los = de las función main.
  5. Comentarios: las dos líneas que empiezan con /* y terminan con */ son comentarios.

Si ejecutáramos este programa obtendríamos el siguiente texto:

5 + 6 = 11

No impresiona mucho, verdad. En fin, eso es todo por hoy. Sé que empezamos despacio, pero me parece importante asentar estos conceptos antes de pasar a cosas un poco más complicadas. Espero vuestros comentarios y dudas.

Un saludo:
Manuel Llorens

Preparándonos para el curso de C

en 6:49
Lo primero que necesitamos para el curso de C es un compilador de C... bueno y un ordenador, pero si estás leyendo esto probablemente tienes acceso a uno, ¿no? Para los que empezáis totalmente de cero: un compilador es un programa que traducirá el código que nosotros escribiremos en C al código que el ordenador entiende.

Existen numerosas opciones gratuitas, pero me he decido por Microsoft Visual C++ 2008 Express con SP1, que es el compilador de C/C++ gratuito de Microsoft y que además incluye un entorno para editar el código francamente bueno.

Para descargarlo sólo tenéis que pinchar aquí, cambiar el idioma a Spanish y bajaros el instalador. Lo instaláis con las opciones por defecto y estamos listos para empezar.

Otro día analizaré otras opciones de entornos para editar código C y compiladores, y aprenderemos a compilar nuestro código en otras plataformas distintas de Windows.
#include <stdio.h>

/* Función principal */
void main(void){
   printf("Un saludo y bienvenidos a todos\n");
}
Manuel Llorens

Primera entrada

miércoles, 11 de noviembre de 2009 en 3:28
La idea de este blog es, fundamentalmente, animaros a todos a aprender a programar. Para ello vamos a desarrollar poco a poco, semana a semana, un curso básico de programación en C y, posteriormente, otro en C#.

Un saludo:
Manuel Llorens

Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com