Curso completo de programación con lenguaje C

gonya707

índice

1 - Introducción
2 - C
3 - Librerías y más funciones
4 - Bloques condicionales y mecanismos de decisión
5 - Acciones repetitivas: bucles
6 - Funciones
7 - Punteros y memoria
8 - Arrays, vectores y matrices
9 - Procesado de texto
10 - Estructuras de datos
11 - Manejo de ficheros
12 - Modularidad: tipos abstractos de datos

1 - Introducción

Cada cierto tiempo alguien entra en el foro con la curiosidad de aprender a programar y no sabe ni por donde empezar. Es algo normal, La información que brinda internet es muy grande, muy desordenada y muy caótica, y con esto añado un poco más de caos, pero esta vez procurando apuntar a las personas que no tienen ni repajolera idea, pero que tiene motivación y ganas de aprender. Espero que el hilo tenga buena acogida y haya gente que se anime a seguirlo, pretendo añadir una lección semanalmente y contar con la ayuda de la gente de /dev, cuyos conocimientos son infinitos :D. Por ser esta la primera entrega La lección viene por duplicado, asi que si teneis unas horas libres y alguna vez habéis sentido curiosidad por el tema, sed bienvenidos.

El lenguaje con el que enseñaré a programar es C. Me parece la decisión más acertada ya que es un lenguaje de propósito general con el que se puede hacer prácticamente todo (algo más dificil que con otros lenguajes, pero práacticamente todo), porque la mayoría de lenguajes modernos heredan gran parte de su sintaxis de C y porque una vez dominado, dar el paso a C++ es coser y cantar, lo cual te deja con una buena base de programación orientada a objetos y por tanto la puerta abierta a lenguajes como java o C#.

En esta primera lección explicaré una serie de conceptos básicos, en qué consiste programar y para que puede servirnos todo esto. Al terminar esta primera parte tendremos nuestro primer programa funcionando de manera que vereis que los inicios son muy sencillos y que cualquiera con ganas puede darle duro a picar código.

Máquinas y programación

Un ordenador Hace muy pocas cosas. Si nos ponemos a enumerar las cosas de las que es capaz de hacer un procesador no tendríamos una lista muy larga. Un procesador puede comparar numeros, sumar numeros y poco más. Entonces como es posible hacer tantísimas cosas siendo usuario? Hamijo, el asunto es que a pesar de hacer muy pocas cosas, el ordenador las hace a una velocidad desorbitada y eso hace posible computar grandes cantidades de datos cada segundo, dando como resultado aplicaciones poco o muy complicadas que usamos cada día.

En lo que se va a explicar a continuación no me meteré a nivel del procesador. Si alguien tiene interés en programar a ese nivel, C no es el lenguaje que buscas, sino ensamblador. C es un lenguaje de alto nivel, esto quiede decir que las operaciones que haga internamente el procesador van a ser transparentes al ojo del programador y con una sola instrucción se van a mandar en realidad cientos o miles de operaciones reales al microcontrolador.

Entonces en que va a consistir nuestra odisea? La idea es escribir como he dicho una serie de instrucciones, en un lenguaje perfectamente entendible por nosotros humanos (código fuente), y convertirlo al único lenguaje que entienden los ordenadores (código máquina). Para ello usaremos un programa llamado compilador. Nuestro compilador se encargará de analizar nuestro código, detectar si tiene errores, y en caso negativo traducir todas nuestras lineas de código fuente en datos válidos para el procesador. Asimismo el compilador construirá un empaquetado que contendrá el programa en un solo fichero ejecutable, en el caso de Windows, un .exe.

A lo largo de este curso aprenderemos casi únicamente con aplicaciones en modo consola (más adelante trastearemos un poco con ficheros). El resultado es más bien poco sorprendente, con esto no vas a hacer juegos en 5 días, pero en cambio aprenderás despacito yu con buena letra a pensar programando, lo cual te ayudará de manera gigantesca cuando tengas las ideas claras, ya sea para programar un juego, una aplicación para PC, o cualquier cosa.

Deberes - Lección 1

Quiero mantener breve esta primera lección y empezar ya con los deberes, porque sí, pondre deberes al final de cada lección :D. Por ser la primera vez tendré piedad y será algo breve. La tarea para hoy es instalar un compilador y compilar vuestro primer programa. El compilador que usaré y os recomiendo usar es el Dev C++ (sirve tanto para C como C++). La razón es sencilla: es una mierda de compilador, muy espartano, muy desactualizado y con poquisimas opciones, perfecto para comenzar. Cuando os sintais confiados podeis dar el salto a otro más completo.

Podeis descargarlo gratuitamente (faltaria mas) desde aqui: http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe

EDIT de ultima hora: El Dev C++ puede dar errores en Windows 8, por lo que si usais este sistema operativo descargaros en su lugar el Dev C++ Orwell. La funcionalidad es exactamente la misma, pero está algo más al día. Podeis descargarlo aqui: http://sourceforge.net/projects/orwelldevcpp/

Mientras se os baja e instala os haré una pregunta inquisitiva. Como llevais los comandos en consola para windows? Si no sabeis de que estoy hablando la respuesta es que mal. Pulsa inicio y escribe 'cmd'. Abre el programa, te presento a tu mejor amigo mientras tengas abierto este hilo. Antes de empezar a programar necesitais dominar al menos los comandos:

cd
dir
cls
pause

Podeis encontrar ayuda escribiendo en la misma consola 'help' seguido del comando que necesiteis, por ejemplo:

help cls

Cuando sepais manejaros fácilmente por los directorios abrid el Dev C++, abrid un nuevo archivo fuente (NO proyecto) y escribid esto:

Está puesto como una imagen deliberadamente por cierto :D. Cuando este todo tal cual guardad el archivo de texto como .c (no .cpp) y compilad el programa.

Si no ha habido problemas (no debería) esto generará un archivo ejecutable en el mismo directorio en el que teneis el .c

Ahora volved a la consola, navegad hasta ese directorio y ejecuta tu programa. Enhorabuena! ya sois programadores! (jajaja me parto)

Nos vemos en la siguiente entrega que sera dentro de 30 segundos cuando se me quite el cooldown de mensajes :)

148
gonya707

2 - C

Una vez instalado y habiendo compilado y ejecutado tu primer programa vamos a analizarlo línea a línea para entender qué hace cada cosa.

Qué es lo que ha hecho? - Si habéis ejecutado bien todo, el único resultado visible debería ser que en la consola os debe de haber aparecido una cadena de texto "Hello world!" justo después de haber enviado el comando para ejecutar el .exe. Ya está, eso es lo que hace, envía por pantalla un mensaje para que pueda ser visto por el usuario. Este programa, el hello world es una tradición para poner a punto sistemas y comprobar que nuestra máquina es capaz de respondernos.

Cómo lo ha hecho? - Para responder a esto tendremos que ver la secuencia de órdenes que se han ejecutado:

#include <stdio.h>

Esta instrucción indica que en el código se va a usar alguna de las funciones incluidas en stdio.h. stdio.h es una libreria, una library en inglés (ya, library significa biblioteca). Una librería es una colección de instrucciones que podemos añadir e usar libremente a nuestro programa. Existen muchas librerias de C y algunas de ellas se os han isntalado en los directorios del compilador. En este caso, stdio es una librería que contiene instrucciones relacionadas con la entrada estándar (el teclado) y la salida estándar (el monitor), como su propio nombre indica (stdio: standard input/output). Puesto que en este programa se va a usar la pantalla, tener a mano stdio es completamente necesario.

int main(void){

Esta es la estructura típica que tiene una función en C. Una función es una instrucción que recibe como entrada una serie de parámetros y devuelve como salida otros. La estructura para esto es salida nombre(entrada), por tanto aquí comienza una funcion llamada main, cuyo parámetro de salida es un numero entero/int y no posee ninguna entrada/void.

La función main siempre va a estar presente en un programa de C. Al comenzar un programa en C lo primero que se busca es dónde esta main, y ahí comienza la ejecución. El contenido de cualquier función se delimita entre llaves, y existen dos maneras de formatear esto:

salida nombre(entrada){

}

o bien

salida nombre(entrada)
{

}

Yo personalmente uso la primera.

fprintf(stdout, "Hello world!");

fprintf es una función contenida en stdio, la librería que se ha incluido en la primera línea. Esta función escribe recibe dos parámetros de entrada (los contenidos en el paréntesis), por un lado el fichero donde escribir, y por otro el texto a escribir, por lo tanto esta línea está escribiendo en la salida estándar - stdout la cadena de texto "Hello world!".

return 0;

En la definición de la función main se había especificado que su salida era un numero entero (int), por lo tanto en algún momento hay que especificar cuál es ese númuero. Eso se consigue con la palabra return, y el número devuelto es 0, pero en este caso no importa el número que se devuelva, podeis cambiarlo por 18 si os apetece, el resultado será exactamente el mismo. Después de usar una instrucción return la función siempre terminará, y puesto que es main la función que termina, el programa termina.

Si hay algo que no hayas comprendido en este punto es completamente normal. El primer programa suele venir con una gran cantidad de información y explicaciones que parecen no venir mucho al caso. De todos modos si has podido entender la idea general es suficiente por ahora. Ahora puedes juguetear con este programa y cambiar cosas. Cambia la cadena de texto por distintas frases, quita el #include <stdio> y observa que errores te devuelve el compilador, etc. En sucesivas partes de este tutorial se te empezará a iluminar la bombilla con las cosas que no hayas podido comprender ahora mismo.

Variables, asignación y operadores

Continuamos. Una vez analizado el primer programa vamos a echar luz sobre algunas de las cosas sobre las que he pasado superficialmente, y para empezar voy a hablar de variables.

Una variable es un fragmento de memoria reservada por un programa. Dentro de esa memoria podemos almacenar datos en forma de números, letras, etc. En C es necesario declarar las variables antes de usarlas simplemente especificando el tipo de variable y llamandola con algún id.

int cifra1;

Con esta inocente línea de código nuestro programa reservará el espacio necesario para almacenar un numero entero (int) cuyo nombre será cifra1. A partir de este momento podemos guardar el valor que deseemos en cifra1 y operar con él. La asignación de valores se realiza con el símbolo =.

cifra1 = 256;

Con esta acción el número 256 se almacena en la variable llamada cifra1, que habiamos definido antes como un número entero. Las asignaciones como esta siempre se leen de derecha a izquierda, es decir, la forma de leer esta línea es "El valor 256 se almacena en la variable cifra1". También es posible complicar la expresión usando operadores aritméticos, como + (suma), - (resta), * (multiplicación), / (división) y % (resto). La jerarquía de operadores es la de siempre (multiplicaciones y divisiones antes que sumas y restas), y es posible usar paréntesis en las expresiones.

int cifra1;
int cifra2;
int cifra3;
cifra1 = 128 + 12;
cifra2 = (400 / 2) - 45;
cifra3 = cifra1 + cifra2; 

En este pedazo de código las variables quedarian en este estado: cifra1 contendría el valor 140, cifra2 sería 155 y cifra3 295.

Además de números enteros con int, por el momento introduciré un nuevo tipo de variables, float, capaz de almacenar números decimales.

float cifra4;

cifra4 = 5/4;

En este caso cifra4 tiene el valor 1.25.

Hasta este punto las variables no sirven de nada. Simplemente se reserva memoria, se cambia el valor que contenga esa memoria y ya está. El objetivo es ahora saber sacar esos valores por pantalla, y la solución de nuevo es la función fprintf.

int cifra1;
int cifra2;
int cifra3;
cifra1 = 2
cifra2 = 3
cifra3 = cifra1 + cifra2;

fprintf(stdout, "%d mas %d es igual a %d", cifra1, cifra2, cifra3);

En esta ocasión la cadena de texto que recibe fprintf contiene en tres ocasiones %d. %d es una señal para que en ese hueco que ocupa se sustituya por un valor de un numero entero. Por tanto al encontrar tres veces %d hay que especificar a continuación qué tres variables quieren imprimirse por pantalla. %d corresponde a int, y en el caso de float es %f.

Leer por teclado

Sabiendo ya manejar la salida estándar, nos falta por aprender a usar la entrada estándar, el teclado. La instrucción que vamos a usar es fscanf. Su sintaxis habitual es:

int num;
fscanf(stdin, "%d", &num);

Sus parámetros de entrada (entre parentesis) son: 1- el fichero por el que se va a recibir la entrada, en este caso la stardar input, o sea, el teclado; 2- el tipo de variable a leer, "%d" un entero o "%f" un float; y la variable donde almacenar el resultado. Por que tiene la variable un & (ampersand) delante? La razón es porque el parámetro de entrada real no es la variable, sino un puntero a la variable, pero de eso no os preocupeis, se hablará más adelante.

Una llamada a fscanf paraliza el programa y espera a que el usuario introduzca algo por teclado y pulse ENTER. Al hacerlo el programa continuará su ejecución. En ocasiones suele ser un error habitual del programa el que el programa no se pause y se rellene la variable con un valor que no hemos introducido. Esto es debido a que el buffer del teclado estaba lleno y al entrar en el fscanf en vez de esperar ha cogido directamente un valor del buffer. Como esto no suele ser deseado es muy recomendable borrar el buffer siempre antes de llamar a fscanf, para ello se usa la siguiente función:

fflush(stdin);

Comentarios

Por último para terminar este capítulo voy a hablar de los comentarios. Un comentario es un fragmento de código que el compilador ignora y que se usa para complementar el código a modo de explicación para uno mismo o para los que vengan detrás a leer el código. En C hay dos maneras de insertar un comentario, por un lado una doble barra '//' comentará la linea completa a partir de su posición hacia la derecha, por otro lado, todo lo que se incluya dentro de un barra-asterisco será también un comentario, cerrando la sección con un asterisco barra.

fprintf(stdout, "Hola ");
// Esto es un comnentario y sera ignorado
fprintf(stdout, "k "); // Esto también sera ignorado
/*
	Y todo esto tambien
	blablablabla
*/
fprintf(stdout, "ase.");

Deberes - Lección 2

Para terminar deberes! Leed todo lo explicado varias veces si es necesario y preguntad todo lo que querais

  • Realizar un programa completo que pida al usuario dos números por teclado y realice las cuatro operaciones básicas con ellos. El programa debe presentar por pantalla los resultados. El resultado deberia ser algo parecido a esto: http://i.imgur.com/kTq5uLv.png

    Pista: para saltar de linea usar el caracter n.
  • Si habeis usado fprintf con una letra con tilde o la ñ habreis notado que el resultado no es el esperado por consola. Los archivos .c están codificados en UTF8 y por tanto no contempla caracteres ajenos al inglés. La tarea en esta ocasión es aprender a poner las tildes en consola. Pista: la tabla ascii es vuestra amiga.

9 1 respuesta
HeXaN

Menudo aportazo.

Evinkuruga

Aporte de los grandes, me lo guardo en favoritos para cuando tenga un rato y me lo miro mas detenidamente.

Napier

Muchísimas gracias, siempre he ido un poco a trancas y barrancas en C, espero ponerme a tope por fin.

allmy

A mi me pasa una cosa con C, aprender lo básico, el funcionamiento general del lenguaje, no me parece muy difícil, pero cuando te metes a programar cosas de verdad... con sus llamadas, etc...

1 respuesta
gonya707

#6 Hay que estar bastante zumbado hoy en dia para programar algo minimamente serio con C plano, a no ser que sean microprocesadores y hardware, sin embargo me parece el lenguaje optimo simplemente para iniciarse. Una vez sabiendo programar cambiar de lenguaje es algo sencillo.

1 1 respuesta
gAdrev

#7

¿No exageras un poco? Anda que no hay utilidades y software moderno hecho en C. Sobre todo en el mundo UNIX.

1 respuesta
gonya707

#8 recalco lo de c plano, sin librerias sofisticadas y tal xD

de todos modos compilar distros de linux y cosas similares me parece bastante de zumbados :D

gAdrev

Ah bueno, entonces de acuerdo xD. Aunque me refería más a software sin más. Por ejemplo git. No me imagino a Linus usando C++ con la tirria que le tiene xD.

Fyn4r

C en windows, estos telecos...

Pero si, muy buen curro!

HeXaN

Mejor hacer el makefile, sí.

Rethenyk

A favoritos que va, muy buen curro.

B

Manita y favoritos, amor eterno.

You the man.

DarkSoldier

gogogo! movimiento en /dev :-)

J3ZZ

#1 ¡Hice el primero! (putos iconos)

Deberes 1
1 3 respuestas
Lecherito

#16 Etiqueta

gonya707

#16 Evita usar system por el momento (lo iba a incluir la semana que viene de todos modos). La cosa es que corrais las aplicaciones desde la consola con comandos, no haciendo doble click

babri

que pereza controlar la memoria...xD pero lo tendre en favs

Zuki

#1 fprintf/fscanf? yo usaba cuando hacia C el comando printf/scanf, sin la f delante ¿que direfencia hay?

1 1 respuesta
gonya707

#20 con los fprintf y fscanf imprimes o escaneas al fichero que quieras, no solo a los ficheros standar. Puesto que en una lección futura me centrare en ficheros prefiero enseñar esa en vez de las habituales. Tambien por el camino seguramente explique sprintf y demases

1
sacnoth

En unos días empiezo yo también el curso Gonya101 de programación, que tengo que aprender de aquí a septiembre.

Todso

Me lo guardo en favoritos para echarle un vistazo.

Sólo he tocado algo de java y tenía ganas de mirar C.

Maaarc

envia MP cuando empieze el de java orientado a objetos ( va en serio, pls )

1 respuesta
gonya707

#24 me quedan creo que 10 lecciones para que hable de objetos asi que tienes tiempo para esperar xD

#16 Bien hecho, funciona todo pero unos pequeños detalles:

1 - el fflush borra el buffer, y es algo que tienes que hacer justo antes de escanear, no despues
2- aqui iba a decirte que no necesitabas la variable r y podrias poner en el fprintf n1+n2 directamente, pero olvidalo, supongo que asi es mas didactico xD

1 1 respuesta
allmy

#25 Estoy deseoso que llegues a punteros. Creo que los tengo claros, pero me gustaría aclararme más. A eso y a todo el tema de buffers.

1 respuesta
gonya707

#26 punteros creo que leccion 7 xD

bazoo

#1 A ver si siendo un curso en directo y mediavidero me pongo de una vez por todas a aprender a programar, que siempre me quedo a mitad si lo hago por mi cuenta.

Deberes

Para los carácteres ASCII he usado Google. Me he topado con esto

ASCII en C

El problema es que salen en mayus, o al menos esa impresi\xe0n que me da.

Bastante lioso en comparación con otros lenguajes...

1 1 respuesta
Ranthas

Grandísimo aporte, si señor.

Espero que consigas un buen puño de alumnos, y que no huyan al llegar a punteros xD.

Los que estén con el curso, ánimo y a por todas, como bien ha dicho #1, C es la base, sabiéndose manejar ahí, a Java sólo hay un paso.

KooPad

Demasiado bueno! :qq:

Usuarios habituales

  • gonya707
  • R1kz
  • willy_chaos
  • herre
  • bornex
  • Leos
  • wiFlY