Sie sind auf Seite 1von 19

Programacin en C/Texto completo

Prlogo

tencial y fueron aprendiendo a hacer cosas fantsticas con


las herramientas que tenan a mano.

El avance de la tecnologa y la concurrente entrega de


informacin, nos permite generar una edicin, variable
y alternativa en la enseanza del lenguaje de programacin que ms impacto social ha tenido en la historia de
la informtica. Este libro ha sido forjado con la incansable ayuda de informticos de habla hispana, quienes byte
a byte han colaborado por hacer de la informacin una
fuente de conocimiento global. De la misma forma, contina hoy siendo modicado en una constante bsqueda
de superacin de la calidad.

Una razn importante para otro libro de lenguaje C es


tambin que los libros existentes muestran muy poca documentacin de calidad. En Internet existe una cantidad
inmensa de informacin publicada pero est dispersa, y
mal manejada en algunos sitios. Es la intencin de este
libro crear un buen compendio de informacin, que permita a los interesados aprender a programar en C.

2 Enlaces

Esta obra est llamada a ser la piedra angular en la enseanza de la programacin, logrando abarcar todos los Nociones bsicas de programacin (generales, indepenaspectos del lenguaje en diversos niveles y de esta forma dientes del lenguaje):
ser tanto una referencia tcnica para quienes ya dominan
el lenguaje como una introduccin sencilla para quienes
Fundamentos de programacin
estn empezando a conocerlo.
Viajaremos por la historia del lenguaje, veremos su proWikilibro similar a ste en ingls
psito e indagaremos en la ciencia de la programacin.
El n es otorgar al lector una doctrina clara de la progra C Programming
macin y el lenguaje C; lo induciremos a conseguir un
manejo importante del lenguaje.
esquema de operadores y expresiones

1.1

Para quin es este libro?

Este libro est dirigido a todos los que deseen obtener conocimientos de programacin, pues el objetivo explcito
que nos ha motivado a crearlo es difundir la importancia
del lenguaje C en el mundo de la informtica. Si nos enfocamos a un grupo social especco, podremos indicar
que este libro contribuir con los estudiantes de carreras
del rea informtica, debido a que los temas convenidos,
son parte de su plan de estudios.

1.2

3 Licencia y autores
Copyright 2004 Envite
Copyright 2005 Alejandro Moreno Calvo
Copyright 2006 Andreu Correa Casablanca
Copyright 2009 zerohours

Por qu otro manual de C?

Ver el historial de cada pgina para el resto de autores.


Porque el lenguaje C es la base fundamental de la programacin. Para quienes estn en el ambiente de la informtica es crucial tener por lo menos nociones de este
lenguaje. Varios sistemas operativos, cientos de bibliote- 4 Cmo contribuir a este WikiLicas, y miles de programas estn construidos utilizando C,
bro?
al conocerlo es posible entender, colaborar y desarrollar
en este lenguaje.
Contribuir con este libro es muy simple primero deberas
Los sistemas, programas, juegos y herramientas que no- registrarte un usuario y/o entrar (esto no es necesario pesotros disfrutamos hoy fueron construidos por personas ro si muy conveniente) a Wikilibros, para que podamos
como nosotros, que empezaron con nuestro mismo po- identicar tus ediciones. Luego, si nunca has contribuido
1

9 PARA LOS MS AVANZADOS

en un proyecto de wikipedia o en otro wiki deberas leer detalles ms exactos irn apareciendo posteriormente,
el manual de uso de wikilibros.
una vez que los materiales anteriores hayan sido correctaUna vez hecho esto todo lo que tienes que hacer es agre- mente asimilados por el lector. En general, dadas dos degar el contenido que consideres necesario para el libro. niciones o datos contradictorios en este wikilibro, debe
Para editar cualquier seccin basta con hacer click al link considerarse siempre como ms exacto al segundo, haque dice editar en la pestaa en la parte superior de la pa- biendo aparecido el primero como una introduccin ms
gina, seria bueno revisar (antes de editar cualquier cosa) general al tema.
la pestaa de discusin que est ah para ser usada. Ten
en cuenta que el material que ya est fue escrito por personas que deseaban contribuir igual que t, as que trata 7 Estndar utilizado
de respetarlo. Aunque con esto no me reero a que si se
necesita alguna correccin, reorganizacin, quitar partes El lenguaje C fue creado en los aos setenta, y a lo largo
que sean ambiguas, no dejes de hacerlo. Lo mejor sera de su historia ha pasado por muchas modicaciones, tanto
que todos contribuyramos de cualquier manera al libro. con respecto a la sintaxis como con respecto al cdigo
Adems, es recomendable consultar la pgina de discu- incluido dentro de la biblioteca estndar. Es por ello que
sin del libro y la del articulo en particular que quieras se fueron desarrollando estndares, para que todos sepan
modicar, ya que de esta manera se pueden coordinar es- con qu versin del lenguaje se est trabajando.
fuerzos.
Los distintos estndares del lenguaje C han sido: el C
Recuerda que todo el contenido que aadas al libro es de Kernighan y Ritchie, un estndar no-ocial que surpublicado bajo la licencia GFDL, por lo que no uses ma- gi luego de la publicacin de su libro en 1978; el C89 o
terial que no haya sido escrito por ti o que no est ya pu- C90, el primer estndar ocial, posterior a la publicacin
blicado bajo GFDL. Recientemente wikimedia decidi de los estndares ANSI en 1989 e ISO en 1990; y el C99,
adoptar la Licencia Creative Commons Compartir-Igual publicado en 1999.
3.0 para todos los aportes, por lo que actualmente el libro En este libro se utilizar el estndar C99, si bien por cuestiene una licencia dual.
tiones de estilo y compatibilidad muchas veces se utilizar cdigo compatible con el estndar C89.

Objetivos
8 Para los principiantes

El objetivo principal de este Wikilibro es que cualquier


persona sin conocimientos previos de programacin pue- Para quien no haya programado antes, es recomendable
da ser capaz de programar en el lenguaje C.
seguir el orden del libro. Los temas estn especialmenUna vez logrado el dominio del lenguaje, es probable te organizados de manera incremental o acumulativa. Tal
que los lectores se interesen por otros temas ms com- vez, lo que se te va a hacer ms til en el camino del aprenplejos que superen a los temas bsicos. Tambin les ser dizaje es la constancia; s terco, no trastabilles, no te rinms o menos sencillo aprender cualquier otro lenguaje de das, tal vez tu pregunta sea cuntas veces tengo que intentar?, las veces necesarias para lograr tu objetivo, sera
programacin estructurada.
la respuesta.
Sin embargo, este no es un libro que apunte nicamente
a programadores principiantes. Tambin puede resultar Claro que el principal enemigo de nosotros los humanos
de inters para quienes ya tengan experiencia en el rea es el tiempo y por eso en caso de que de verdad ests
de programacin. En esta introduccin hay dos secciones trancado en algo busca ayuda de alguien que sepa ms
en las que se explica para los dos grupos principales de que t". Que no tienes a nadie a tu alrededor con esa
lectores qu camino seguir para comenzar a programar caracterstica? Tal vez no buscaste bien y tal vez quieras
usar la red de redes. Utiliza los buscadores, pregunta en
en el lenguaje C o bien perfeccionar conocimientos.
IRC, en foros de programacin, en listas de correo.
El lenguaje C es tan usado porque es un lenguaje de programacin que emplea pocas instrucciones en lenguaje
mquina para traducir elementos del cdigo. Esto reduce
9 Para los ms avanzados
los tiempos de ejecucin de los programas.
El lanzamiento queda libre por supuesto, solo t sabes
lo que necesitas. Las reglas del juego son las mismas de
siempre: primero saber lo que se quiere o necesita y atacar
Muchas de las cosas expresadas en este wikilibro, espe- por ah.
cialmente en los primeros captulos, no son completa- En este caso, te ser til acceder a los contenidos a partir
mente exactas, aunque son buenas aproximaciones. Los del ndice, eligiendo slo aquellos que te sean necesarios.

Nota sobre la exactitud

10

Requisitos

a llamarse WxDev-C++. Otro entorno libre y gratuito es


el Code::Blocks. Ambos entornos pueden utilizarse tanto
Se presupone que los lectores tienen conocimientos ele- para C como para C++.
mentales de informtica a nivel de usuario, y son capaces Tambin hay otras alternativas privativas como los comde instalar un compilador del lenguaje C en sus sistema. piladores de Borland o de Microsoft (Microsoft Visual
Los detalles sobre la instalacin se vern en la seccin C++).
Herramientas.
Con respecto al Hardware, slo ser necesario contar con
una PC con sistema operativo, donde sea posible instalar
un compilador, y en lo posible un entorno de desarrollo. Cuanto mejor sea la computadora, ms rpido ser
el proceso de compilacin y ejecucin de los programas.
Sin embargo, cualquier PC sirve para aprender con los
ejemplos de este libro.

13 GNU/Linux

Para quienes no tengan conocimientos bsicos de programacin, puede ser una buena idea comenzar leyendo los
En los sistemas GNU/Linux, ser necesario tener instaprimeros captulos del Wikilibro Fundamentos de proladas las herramientas gcc y make y la versin 6 de la
gramacin, ya que algunos temas explicados en ese libro
glibc con su documentacin, que son las que permitirn
se asumen ya conocidos.
compilar los programas.
Finalmente, un requisito imprescindible en todo prograPara escribir y modicar el cdigo, es posible utilizar
mador es tener sentido comn. Muchas veces se pueden
cualquier editor de texto plano (en lo posible que cuenadoptar mejores o peores soluciones ante los diversos
te con resaltado de sintaxis), como son emacs, vim, kate,
problemas, y la decisin de cul elegir pasa por la apligedit o geany.
cacin del sentido comn.
Sin embargo, para quienes son novatos en la programacin, es recomendable utilizar un entorno de desarrollo
como son el Anjuta DevStudio (para el entorno GNO11 Herramientas
ME) o KDevelop (para el entorno KDE), ya que incluyen facilidades adicionales para la ejecucin y solucin
Para programar tanto en C, como en C++, Java o cual- de problemas.
quier otro lenguaje de programacin, necesitamos contar
Los programas mencionados se incluyen dentro de la inscon aplicaciones o herramientas que nos permitan poner
talacin estndar de la mayora de las distribuciones acen funcionamiento nuestro programa.
tuales de GNU/Linux, de modo que para instalarlos slo
El lenguaje de programacin C es compilado, as que en ser necesario seguir el procedimiento usual de instalaeste caso necesitaremos un compilador, que ser el en- cin de aplicaciones para la distribucin deseada.
cargado de transformar nuestro cdigo fuente en cdigo
El lenguaje de programacin C fue creado por Dennis
que la computadora pueda ejecutar.
Ritchie entre 1969 y 1973 cuando trabajaba en Bell LaAdems, para facilitar la tarea de los programadores exis- boratories de AT&T junto con Ken Thompson en el diseten los denominados Entorno de desarrollo integrados o del sistema operativo UNIX. C fue creado para poder
(IDE). En muchos casos, estos entornos incluyen un com- escribir dicho sistema operativo en un lenguaje de alto
pilador, un depurador, y otras herramientas.
nivel, independiente del hardware donde se ejecutara.
Las herramientas a instalar dependern del sistema operativo utilizado. A continuacin se listan algunas posibilidades para el sistema operativo Windows o GNU/Linux,
no es imprescindible utilizar estas herramientas en particular, cualquier compilador puede servir.

12

Windows

Contar con un lenguaje de alto nivel permiti el avance


de los sistemas operativos, ya que el mismo cdigo poda ser utilizado en las distintas plataformas, propiciando la reutilizacin de cdigo y reduciendo los tiempos de
desarrollo. As es que los sistemas operativos basados en
UNIX, el sistema BSD, el sistema GNU/Linux y muchos
otros fueron desarrollados en C.

Adems, con el paso del tiempo se han desarrollado cientos de bibliotecas que permiten a los programadores de
Uno de los entornos de desarrollo ms conocidos en- C utilizar el cdigo desarrollado por otros para la realizatre los programadores de C sobre Windows, tanto no- cin de tareas comunes. Esto, a su vez, ha propiciado el
vatos como expertos, es el Bloodshed Dev-C++, que es desarrollo de aplicaciones en lenguaje C.
un entorno libre multiplataforma. Tal entorno de desa- Actualmente es imposible contar la cantidad de aplicarrollo fue abandonado y retomado mejorndolo pasando ciones y herramientas desarrolladas en C.

14

16 DEFINICIONES

Evolucin

caractersticas adicionales, que otros compiladores no tenan, siendo C++ la principal inuencia.

A mediados de los aos 60s, Martin Richards dise el Fue por ello que a nales de los noventa se decidi revisar
lenguaje BCPL con la nalidad de usarlo para escribir el estndar de C, lo que llev a la publicacin del estndar
C99. Este estndar incluye varias nuevas caractersticas
software de sistemas operativos y compiladores.
como son: las funciones inline; la posibilidad de declarar
En 1969, Ken Thompson escribi el Lenguaje B, en Bell variables en cualquier parte del cdigo; los comentarios
Laboratories, con el objetivo de recodicar UNIX (escrito de una sola lnea utilizando //; los tipos de datos long long
hasta ese momento en lenguaje ensamblador) usando un int, bool y complex, entre otras.
lenguaje de alto nivel ms portable y exible.
An hoy el proceso de evolucin del lenguaje sigue avanDurante los siguientes aos, Dennis Ritchie modic el zando, y desde 2007 se est trabajando en el armado de
lenguaje B, llegando a crear el lenguaje C y reescribiendo un nuevo estndar.
el sistema UNIX en dicho lenguaje; aadi caractersticas
nuevas, como son el diseo de tipos y las estructuras de
datos.

15 Ms informacin

En 1978, Dennis Ritchie y Brian Kernighan publicaron


la primera edicin del libro El lenguaje de programacin
Lenguaje de programacin BCPL
C. Este libro fue durante aos la especicacin informal
Historia del lenguaje del programacin C
del lenguaje. El lenguaje descrito en la primera edicin
de este libro, fue conocido como el C de Kernighan y
The Development of the C Language
Ritchie o simplemente K&R C. En este libro se introdujeron nuevas caractersticas al lenguaje: los tipo de
datos struct, long int y unsigned int; los operadores =+ y En este captulo veremos un resumido listado de conceptos bsicos, esta informacin puede encontrarse en forma
=- fueron sustituidos por += y -=.
ms elaborada en el WikiLibro Fundamentos de prograA mediados de los aos 80, Bjarne Stroustrup (tambin de
macin.
los laboratorios Bell), crea el lenguaje C++, un lenguaje
basado en C, con numerosas caractersticas adicionales,
siendo la principal que est orientado a objetos. Si bien
se han creado muchos lenguajes basados en C, C++ es el 16 Deniciones
que ha permanecido ms asociado a C.
Se denomina algoritmo a una secuencia de instrucEn los aos siguientes a la publicacin del C de Kernighan
ciones que permiten obtener un resultado en partiy Ritchie, se aadieron al lenguaje muchas caractersticular. No necesariamente son programas de compucas no ociales, que estaban presentes en algunos comtadora, una receta de cocina, o las instrucciones para
piladores y no en otros. Fue por ello que en 1989 ANSI
cambiar un neumtico son ejemplos de algoritmos
(American National Standards Institute) public el pride la vida real.
mer estndar ocial de C, que es conocido como ANSI
C.
Las computadoras, son maquinas sin inteligencia
En este estndar se tomaron muchas de las funcionalipropia, cuya nica nalidad es interpretar el cdigo
dades no ociales y se agregaron funcionalidades nuevas
que se les provee.
como los prototipos de funcin, y un preprocesador mejorado. Tambin se cambi la sintaxis de la declaracin
El lenguaje de mquina es el nico lenguaje que la
de parmetros de funciones, para que incluyeran el tipo
computadora entiende y es capaz de ejecutar.
junto con el nombre.
Al ao siguiente, en 1990 se public la estandarizacin
ISO del lenguaje. Este estndar es bsicamente el estndar
ANSI, con unas pocas modicaciones de formato. A este
estndar se lo conoce, entonces, como C89, o C90, y se
trata del mismo lenguaje.
Basndose en el estndar ANSI que estaba en preparacin, en 1988 Kernighan y Ritchie publicaron la segunda
edicin de su libro, que es an hoy utilizada como una de
las referencias principales del lenguaje.
Durante los siguientes aos, el lenguaje C permaneci sin
demasiados cambios. Sin embargo, como haba sucedido antes, los distintos compiladores fueron incorporando

Los lenguajes de programacin son el medio de


comunicacin entre el programador y una computadora. El programador escribe en algn lenguaje
de programacin y utiliza las herramientas provistas por ese lenguaje para transformarlo en lenguaje
de mquina.
Finalmente, denominamos programa a una secuencia de rdenes a ser ejecutadas por una computadora. Un programa debe estar escrito en algn lenguaje
de programacin, y puede incluir uno o ms algoritmos.

17

Tipos de lenguajes

Existe una gran cantidad de lenguajes de programacin,


que estn pensados para distintas nalidades, siguen distintos paradigmas, y de una u otra forma se diferencian
de los dems.

otros.
La contraparte de los lenguajes interpretados son los lenguajes compilados (como el mismo C) que se diferencian en que las rdenes son transformadas a lenguaje de
mquina que se almacena en un archivo ejecutable. Ese
archivo puede ejecutarse luego, sin recurrir al compilador.

Los lenguajes compilados tienen la ventaja de la velocidad


y la eciencia, pero los interpretados tienen la ventaja de
El esquema de programacin llamado Programacin que, generalmente, son muy portables y de ms alto nivel.
Imperativa, consiste en escribir una secuencia de instrucciones una detrs de la otra, que se ejecutarn en orden. Algunas de esas instrucciones pueden hacer que la 18 Estructura de la memoria
mquina pase a una instruccin que no sea la siguiente,
tal vez porque se cumpla una condicin que hayamos es- Parte de esta potencia de C viene de que permite acceder
tablecido.
con mucha libertad a la memoria de la mquina. Para en-

17.1

Esquemas de programacin

En los ltimos aos ha tomado fuerza otro paradigma de


computacin, llamado Programacin Orientada a Objetos , en el cual se intentan modelar los sistemas creados
como extensiones de la realidad mediante la denicin
de objetos que modelan entidades de la vida real y que
interactan entre s mediante mensajes llamadas mtodos.

tender un poco cmo es posible, debemos entender cmo


se guardan los datos en la memoria.
Imaginemos que la memoria tiene un montn de casillas,
una enorme la de casillas, cada una de las cuales contiene
un dgito binario (bit):

01010010101000010101010010100001001110101100100101010010110

El lenguaje C es un lenguaje imperativo, no orientado a Es exactamente as, pero es ms cmodo recordar que
esos bits se encuentran agrupados de ocho en ocho, forobjetos.
mando octetos (bytes):

17.2

Alto o bajo nivel

Cada octeto puede contener 28 = 256 combinaciones


distintas de ceros y unos, es decir, cualquier nmero entre
0 y 255:

Por otro lado, los lenguajes de programacin se clasican


en niveles. Un lenguaje es de ms bajo nivel cuanto ms Tambin podemos representar estos nmeros en base hecercano est al cdigo de mquina, y un lenguaje que es xadecimal:
de ms alto nivel cuanto ms lejano est de la mquina y O considerarlos caracteres, mediante alguna codicacin:
ms cercano al lenguaje humano.
Este es el tipo de dato ms elemental que nos podemos enC es un lenguaje de alto nivel aunque tiene muchas ca- contrar en C: el caracter. Un caracter ocupa exactamente
ractersticas de lenguaje de bajo nivel (como el uso que un byte (8 bits) de memoria, y puede contener un nmero
permite hacer de la memoria). Estas caractersticas ha- entre 0 y 255, o entre 128 y 127, dependiendo si quecen que C sea un lenguaje muy potente, ya que permite remos considerarlo como sin signo o con l.
optimizar al mximo los recursos de la mquina. Por ende, esto tambin hace que la dicultad y que los errores En el libro El Lenguaje de Programacin C, Kernighan
que se puedan cometer programando aumenten. As que y Ritchie introdujeron al lenguaje C utilizando un sencillo
programa que mostraba un saludo por la pantalla. Desde
a C se le considera de nivel medio.
entonces se hizo tradicin empezar con cualquier lenguaje
Lenguajes de ms alto nivel que C son aquellos en los de programacin con el ejemplo del Hola mundo.
que el programador no necesita encargarse de manipular
la memoria, como Java, C#, Python, Ruby, entre otros. En particular en C se involucran muchas partes y sintaxis
del lenguaje, por lo cual es especialmente til verlo como
el primer ejemplo de programacin en C.

17.3

Compilados o interpretados

Otra forma de clasicar a los lenguajes de programacin


que es segn la forma en que se ejecutan sus rdenes.
Existen los lenguajes que son interpretados, cuyas rdenes pasan a travs de un intrprete que se encarga de
ejecutarlas (a partir del cdigo fuente) en el mismo momento en que estn siendo ledas. Algunos de los lenguajes interpretados son Python, Perl o Tcl, entre muchos

Ejemplo: Hola mundo


/* Inclusin de archivos */ #include <stdio.h> /* Funcin
principal */ int main (int argc,char **argv) { /* Impresin por pantalla y salida del programa*/ printf(Hola
mundo\n); return 0; }
Para poder editar y ejecutar este programa ser necesario utilizar algn editor y luego un compilador, como se

20 COMPILACIN DE PROGRAMAS SEGN LA PLATAFORMA

explic en la seccin Herramientas necesarias.

En C++ de Borland: bcc hola.c

Si se tiene el compilador gcc en un entorno UNIX o


GNU/Linux, la forma sencilla de compilar y ejecutar ser:

En Visual C de Microsoft: cl hola.c

$ gcc holamundo.c $ ./a.out Hola Mundo $

El C de Zortech: ztc hola.c

Es decir que el compilador genera un archivo, en este caso llamado a.out, y la salida generada por ese archivo es
Hola mundo. A continuacin una explicacin detallada
sobre el proceso de compilacin del programa, y luego un
anlisis lnea por lnea del contenido de este ejemplo.

19

Pre-requisitos para la compilacin de programas

En GNU gcc: gcc hola.c o cc hola.c

Una vez compilado el cdigo fuente se genera un archivo


llamado archivo objeto o programa objeto que es luego
enlazado mediante el enlazador, para generar el archivo
ejecutable.
Los compiladores actuales suelen hacer dos funciones de
una vez, compilando y enlazando todo en una sola funcin, aunque es posible pedirles que no lo hagan mediante
parmetros adicionales.
Segn el compilador y la conguracin utilizada, se obtendrn dos o tres archivos:

Como ya se mencion, ser necesario tener instalado el El archivo fuente


compilador y un editor o entorno de desarrollo que permitan escribir el cdigo a compilar. Para ms informacin hola.c
ver la seccin Herramientas necesarias.
El archivo objeto
El cdigo a compilar debe guardarse con un nombre que hola.obj
represente al programa en cuestin y la extensin .c. En
El archivo ejecutable
el caso del ejemplo del Hola mundo, el archivo puede llahola.exe
marse hola.c.
En las explicaciones a continuacin, se asume que se Este ltimo es el que nos interesa, puesto a que es el ccuenta con un compilador instalado y se ha editado un digo ejecutable, el programa en s. Al ejecutarlo se proarchivo hola.c que se quiere compilar. Si tu sistema ope- ducir la salida deseada en una ventana de consola.
rativo no aparece en esta lista busca en internet, ya que
seguro que existe algn compilador para ese sistema.
20.1.2 Salida por pantalla

20
20.1

Compilacin de programas segn la plataforma


Windows

Para compilar un programa C en entornos Windows, debemos seguir una serie de pasos que varan segn el compilador de C que queramos utilizar. Antes que nada, sera bueno que se revises la documentacin del compilador
elegido para conocer los comandos exactos.

Si ejecutamos en entorno Windows el programa directamente desde el navegador de archivos, o tambin desde
algunos entornos de desarrollo, lo que suceder ser que
apenas abierta la ventana de la consola, se mostrar la cadena esperada y luego de terminada la funcin, la consola se cerrar sin tener el tiempo suciente de ver nuestro
mensaje en pantalla.
Para poder ver la salida por pantalla ser necesario ejecutar el programa desde la lnea de comandos, o modicar
la conguracin del entorno de desarrollo para que muestre la salida por pantalla al ejecutar el programa.
Una posible solucin es agregar una funcin adicional a
nuestro hola.c":

20.1.1

Compilacin del cdigo fuente

/* Inclusin de archivos */ #include <stdio.h> #include


<stdlib.h> /* Funcin principal */ int main (int argc,char
Si se utiliza un entorno de desarrollo, ser posible com- **argv) { /* Impresin por pantalla y salida del prograpilar directamente desde el entorno, mediante un botn o ma*/ printf(Hola mundo\n); system (pause); return
una combinacin de teclas.
0; }
Si se ejecuta el compilador desde la lnea de comandos, la
lnea ser distinta segn el compilador utilizado. A con- Las dos lneas agregadas permiten que utilicemos la bitinuacin algunos ejemplos de ciertos comandos segn el blioteca stdlib, que incluye la funcin system y que mecompilador:
diante esta funcin se ejecute el comando pause del siste En Turbo C de Borland es: tcc hola.c

ma, que evita que el programa siga hasta que se presione


una tecla.

7
As es posible visualizar que la salida de hola.c se complet perfectamente.

21 Diseccionando el Hola Mundo


A continuacin veremos cul es la estructura bsica de un
programa en C, para poder entender qu hace cada una
de las lneas de nuestro sencillo programa.

20.2

GNU

Es probable que lo primero que salte a la vista sea la lnea:


printf(Hola mundo\n);

Si bien existen otros compiladores, lo ms usual y ms


sencillo para compilar un programa en GNU/Linux es el
compilador gcc, ya que es el que se incluye en todas las
distribuciones.

Esta es la lnea que hace aparecer la cadena Hola Mundo


en nuestra pantalla. Notamos que en C la sentencia para
imprimir algo por pantalla es printf() y, adems, hay que
colocar parntesis alrededor de lo que queremos imprimir
De cualquier forma, es posible realizar la compilacin para utilizarla.
desde lnea de comandos o desde el entorno grco.
Esto se debe a que en C, printf es una funcin, que impriPara realizarla desde lnea de comandos, ser necesa- me su argumento (la cadena Hola Mundo\n) en la panrio contar con una terminal (xterm, konsole, gnome- talla. Se denomina invocar una funcin a la accin de
terminal, etc). No es necesario contar con permisos de utilizarla para que realice una accin.
root para crear o compilar programas. En esa terminal Podemos observar tambin que la cadena a imprimir terser necesario escribir
mina con una extraa combinacin: \n. La combinacin
\n no representa a dos caracteres independientes, sino que
gcc hola.c
representa un nico carcter no imprimible: el salto de
Si no existen errores en el cdigo, este comando nos lnea. Sin el salto de lnea, el resultado al ejecutar el procrear un archivo ejecutable, que por omisin se llama grama sera:
a.out, y que podemos ejecutar desde la lnea de coman$ ./a.out Hola Mundo$
dos de la siguiente forma:
Es decir que no hay salto de lnea entre la cadena impresa,
./a.out Hola mundo
y la siguiente entrada de la lnea de rdenes, que no es lo
Es una buena idea especicar el nombre que el archivo que esperbamos.
ejecutable tendr, pasando como parmetro al compilaLo ltimo a notar en la lnea es que termina con un punto
dor la opcin -o, de la siguiente forma:
y coma. En C, todas las sentencias terminan con un punto
gcc hola.c -o hola
y coma. Al principio puede parecer obvio dnde termina
Con lo cual, el nombre del archivo creado ser hola. Este una sentencia, pero ya veremos ms adelante que no lo es
archivo no tiene extensin ya que es la forma usual de tanto.
llamar a los archivos ejecutables en los entornos UNIX y
Observemos ahora la siguiente sentencia del programa:
GNU/Linux, sin embargo funcionara de la misma forma
return 0;
si se llamara hola.exe.
Para ejecutarlo, haremos los mismo que en el caso anteLuego de esta sentencia, termina el programa. En el caso
rior:
de la instruccin return dentro de la funcin main, el re./hola Hola mundo
sultado es que se naliza el programa, comunicndole
Existen otros parmetros que podemos especicar al al sistema operativo que el valor de retorno (un cdigo
compilador en la lnea de comandos, dependiendo del ti- numrico que el sistema utiliza para saber si el prograpo de programa, y en funcin de la complejidad del mis- ma ha funcionado bien o ha dado fallos) es 0, es decir,
mo. Por ejemplo, podemos agregar las siguientes opcio- correcto.
nes:
Las dos ltimas sentencias se encuentran encerradas entre
gcc hola.c -o hola -Wall -pedantic

llaves. De esta manera, forman un bloque, es decir, un


La opcin -Wall nos mostrar todos los avisos que pro- grupo de sentencias que se ejecutarn siempre de forma
duzca el compilador, no solamente los errores. Los avisos correlativa.
nos indican dnde y/o porqu podra surgir algn error en Y qu es esa lnea que precede (en realidad, que da nomnuestro programa.
bre) al bloque?
La opcin -pedantic nos aporta ms informacin sobre int main (int argc, char **argv)
los errores y los avisos mostrados por GCC.

24 ENTEROS

Pues es la denicin de una funcin, en este caso llamada main. En C (y en general en todos los lenguajes de
programacin estructurada) todo se hace a base de funciones, como main y printf.
La funcin main es especial, porque es el la que se invoca
cuando se ejecuta el programa. Todos los programas en C
comienzan su ejecucin al principio de la funcin main,
y cuando sta acaba, el programa tambin.
Veamos con ms detalle la denicin de la funcin:
int main (int argc, char **argv) { ... }
El nombre de la funcin que viene a continuacin,
entre llaves, es main.
Recibe dos argumentos: int argc y char **argv (que
representan a la cantidad de argumentos ingresados
al ejecutar el programa y a los valores de estos argumentos respectivamente).[1]
La funcin devuelve como resultado un nmero entero, int (que es el 0 de la instruccin return).[2]

C99: //. Todo lo que est despus de estos signos, hasta el nal de la lnea, se considerar un comentario y el
compilador no lo tomar en cuenta.
En el ejemplo presentado pueden verse tres lneas con
comentarios, que documentan someramente las distintas funcionalidades del cdigo. En los prximos captulos
podrn verse mejores usos de los comentarios dentro del
cdigo.
Tambin podra decirse que es una herramienta bsica
basada en compilador
[1] En un captulo posterior podr ver un ejemplo del uso de
los parmetros que recibe main.
[2] Es importante sealar que el estndar dice que main deber denirse como funcin que retorna un entero, o de
lo contrario el resultado queda indenido.

23 Historia

Finalmente, y un tanto aparte (est separada del resto por En el lenguaje C estandarizado como C89, existan cuatro
tipos de datos bsicos que son: los nmeros enteros, los
una lnea en blanco), tenemos la lnea:
nmeros reales, los caracteres, y los punteros. A partir del
#include <stdio.h>
estndar C99 se agregan: los valores lgicos (verdadero
o falso) y los nmeros complejos.
Que parece bastante distinta al resto del programa, y que, Estos tipos de datos son parte del lenguaje, y por ello se
adems, parece no tener sentido, puesto que ya hemos los considera primitivos. Ms adelante veremos que con
denido la funcin main que hace todo el trabajo.
el uso de estructuras y uniones es posible crear tipos comEfectivamente, esa lnea no es parte del programa, aun- puestos de datos a partir de estos tipos primitivos.
que sea imprescindible. La lnea es una instruccin del En este captulo veremos los enteros, los reales y los capreprocesador de C, como nos lo indica el smbolo #, y racteres. Ms adelante se vern otros tipos de datos ms
lo que hace es incluir en ese punto el contenido de otro complejos, como son los vectores, las cadenas de caracchero, antes (de ah el nombre de preprocesador) de que teres, y los punteros en general.
comience la compilacin. El chero stdio.h es el que contiene la denicin de la funcin printf(), que antes utilizamos pero que no escribimos, ya que forma parte de la
24 Enteros
biblioteca estndar de C.
Los enteros son el tipo de dato ms primitivo en C. Se
usan para representar nmeros enteros. Pero siempre se
22 Comentarios
pueden encontrar otras aplicaciones para los nmeros enteros. En general se pueden usar para representar cualUna vez escrito un cdigo, tratar de entenderlo un ao
ms tarde solo con leerlo puede ser frustrante: no hay ma- quier variable discreta.
nera de saber (si el programa es medianamente compli- Los tipos de datos enteros son: short, int, long y long long,
cado) qu es cada variable, o qu hace cada bloque de cada uno representando un nmero entero de un tamao
cdigo. Por esto, en cualquier lenguaje de programacin o capacidad determinado. Segn el compilador y la platason importantes los comentarios.
forma de hardware, cada uno de estos tipos de dato puede
Un comentario en C es todo lo que se encuentre entre los ocupar desde 1 byte hasta 8 bytes en memoria (para ms
smbolos /* y */. Hay que tener en cuenta que los comen- detalles busca en la referencia).
tarios no se pueden anidar: si dentro de un comentario Adems, el lenguaje C hace la distincin de si el entero
hay un /*, seguir siendo el primer */ el que nalice el es con signo (signed) o sin signo (unsigned). En caso de
que no se declare si es con signo o sin signo, se toma con
comentario, no se esperar al segundo.
Hay otro tipo de comentarios en C, procedentes del len- signo.
guaje C++, e incorporadas al estndar de C a partir de Algunos ejemplos de declaraciones de enteros:

9
int a; unsigned int a; signed long a; signed long long a =
10000000;
Todos los nmeros son representados en memoria mediante una cadena de bits. En el caso de los nmeros con
signo, el bit ms signicativo es el que se usa para representar el signo. La representacin de los nmeros negativos se realiza mediante el complemento a dos, que
es una tcnica que permite operar con los nmeros negativos de forma lgica.
A modo de ejemplo, la representacin en memoria del
nmero 8 en una variable de 2 bytes, entera, con signo,
sera la siguiente:
1111111111111000

25

Flotantes

Se denomina otantes a los tipos de datos que representan a los nmeros reales, ya que utilizan un sistema de representacin basado en la tcnica de coma otante, que
permite operar con nmeros reales de diversas magnitudes, mediante un nmero decimal llamado mantisa y un
exponente que indica el orden de magnitud.

3. Se mueve la coma (en la representacin binaria de


la parte entera) hasta que est a la derecha del primer uno y ste se descarta (el uno ms signicativo).
El valor del exponente ser el nmero de posiciones
que se movi la coma. El exponente usa la representacin de un entero con complemento a dos.
4. Se convierte en binario la parte decimal del nmero.
Esto usando el peso de los bits. el bit decimal ms
signicativo vale 1/2, el siguiente vale 1/4, el otro
1/8, el otro 1/16 y as hasta completar lo que falta
para los 23bits del valor.
5. Se concatena todo y ese es el valor otante representado en memoria.

26 Caracteres
Los caracteres se representan utilizando el tipo char, que
tiene slo 1 byte de tamao. Este tipo se utiliza para representar los 256 caracteres de la tabla de caracteres del
sistema. El tipo char es tambin un tipo entero, ya que
puede tomar valores de 0 a 255. Por lo tanto tambin puede ser signed o unsigned.

El tipo de dato otante en lenguaje C slo tiene dos ta- En cuanto a la forma de declarar variables de tipo char es
maos: el oat y el double, que son 4 bytes y 8 bytes res- la misma forma que con los otros tipos.
pectivamente. Se los puede utilizar tanto para representar char a; char a = 's; unsigned char a = 48;
nmeros decimales, como para representar nmeros enteros con un orden de magnitud muy grande.
Como puedes ver, se le puede asignar un nmero a una
La forma de declarar una variable otante es escribiendo variable char, ya que se trata de un tipo entero. En muchas
en una lnea uno de los tipos de datos otantes y a conti- situaciones se utiliza el tipo char para almacenar nmeros
nuacin el nombre de la variable y tal vez algn valor que pequeos, ya que ocupa en memoria slamente un byte.
se les quiera dar.
Es importante notar que con la llegada de la codicaAlgunos ejemplos:
cin UTF-8, los caracteres de los diversos idiomas pueoat a; double a = 1e23; double a = 3.1416; oat a = den ocupar 1, 2, 3 o 4 bytes, de modo que el tipo char ya
no alcanza para la representacin de todos los caracteres
4e-9; double a = 78;
posibles. Por ello, el estndar C99 introduce el tipo wchar
que puede ocupar ms de 1 byte, segn sea necesario para
Hay que tener en cuenta que aunque los valores otantes la codicacin utilizada por el sistema.
son ms convenientes para algunas aplicaciones, hay casos en los que se preeren los enteros. Esto se debe a que En este captulo veremos un poco ms sobre como interlos nmeros otantes no necesariamente tienen soporte actuar con el usuario de nuestros programas desde la conde hardware, en particular en las plataformas integradas. sola, utilizando printf() como vimos en el primer ejemUna alternativa que se utiliza en estas situaciones es in- plo Hola mundo, as como scanf() para la lectura del
terpretar los enteros como decimales de forma que 150 teclado.
se interprete como 1.5 y 2345 como 23.45.
Para el caso de los otantes de 4 bytes, se utiliza 1 bit para
el signo, 8 bits para el exponente y 23 bits para el valor 27 Imprimir por pantalla
del nmero. El procedimiento para almacenar un nmero
Como hemos visto hasta ahora en los ejemplos, hay una
en una variable otante es el siguiente:
funcin que utilizamos para sacar por pantalla textos ar1. Se convierte a binario la parte entera.
bitrarios o el resultado de alguna operacin: la funcin
2. Se coloca el signo en el bit ms signicativo de la printf().
misma manera que en los enteros (1 para el - y 0
para el +).

Si miramos (en la documentacin) su denicin, no nos


aclarar demasiado:

10

28 LECTURA DE DATOS DEL TECLADO

int printf (const char *TEMPLATE, ...)

ere a cualquier forma de inuencia del usuario sobre los


...claro que por algo tiene una seccin completa de la do- datos que posee el sistema.
cumentacin para ella sola.
Con el n de mostrar una forma de entrada simple para el
Vemosla poco a poco. Se trata de una funcin de la bi- aprendizaje vamos a hablar de la funcin scanf() que se
encuentra denida en <stdio.h> y que se usa para capturar
blioteca estndar, lo que quiere decir que para utilizarla
tenemos que incluir previamente su denicin. La encon- diferentes tipos de datos.
traremos en <stdio.h>.
Lo primero que vemos en la denicin es que es una fun28.1 La funcin scanf()
cin de tipo int, lo que quiere decir que devuelve un entero. Ese entero es el nmero de caracteres impresos en
scanf() es una de las funciones ms usadas por los princila pantalla, o un nmero negativo en caso de que se propiantes para hacer entrada de datos en el lenguaje C. Tieduzca algn error.
ne una sintaxis muy parecida a printf: recibe una cadena
Lo siguiente a notar es su primer argumento: const char con el formato de los datos y luego se ponen las variables
*TEMPLATE. Se trata de una cadena de caracteres (char en orden que correspondan a ese tipo de datos. Es decir,
*) que no ser modicada por la funcin (const), con lo as como en printf se pueden mostrar por pantalla los daque puede ser una constante de cadena o una variable que tos de varias variables en una misma sentencia, en scanf
contenga una cadena, pero siempre debe acabar con el se pueden capturar varios datos en una sola sentencia.
carcter nulo \0.
#include <stdio.h> int main() { int a; printf (diga un
Y luego vienen esos extraos puntos suspensivos. Esa valor para a:"); scanf("%i,&a); printf (el valor es:
elipsis nos indica que como argumentos adicionales de %i\n,a); return 0; }
printf() podemos poner una serie ilimitada de otros argumentos, que se supone que la funcin sabr qu hacer
Por ahora no nos interesan las dems sentencias, slo la
con ellos. Y eso es justamente lo que hace tan fabulosa y
que contiene scanf. En el cdigo se ve lo siguiente:
til a printf().
scanf("%i,&a);
Como hemos visto, el uso ms simple de printf() es imprimir una cadena de texto simple y corriente. Como ya
Se observa que la funcion printf dej en pantalla una pevimos:
ticin para que el usuario introdujera un valor. Entonces,
printf(Hola Mundo\n); /*imprime la cadena*/
scanf recibe como argumento una cadena del formato en
Y tambin hemos visto printf() tambin puede, con un que se van a capturar los datos y la lista de variables que
argumento extra y una sintaxis especial, imprimir un n- van a recibir valores y que deben coincidir con los del
mero entero que hayamos almacenado en una variable:
formato.
char resultado;
resultado=5+2;
printf(Resultado de la suma: %i\n,resultado);

En este caso la cadena de formato, "%i, especica que


el usuario ingresar un nmero entero. Luego se designa
a la variable a para contener a ese nmero. El smbolo
(&) que precede a a es para especicar que lo que se est enviando como argumento no es el valor que posee la
variable a sino la direccin de memoria en que se encuentra. En este momento eso no tiene mucha relevancia, slo
hay que recordar que se debe usar el smbolo & dentro
del scanf. En el momento en que hablemos de punteros
veremos ms detalles de esto.

Aqu el punto de insercin es la secuencia %i. printf()


siempre trata las secuencias que comiencen por % como
secuencias de control que le dicen que debe imprimir algo que le proporcionamos en los otros argumentos. As,
podemos imprimir varios enteros distintos en los sitios
que queramos de la cadena, insertando varias de estas secuencias %i:
Otro ejemplo del uso de scanf:

int numero;
#include <stdio.h> int main() { int a,b; printf (innumero=3;
troduzca dos valores con el formato \"a,b\" :");
printf(El doble de %i es %i y su cuadrado es scanf("%i,%i,&a,&b); printf (el primer valor :
%i\n,numero,numero*2,numero*numero);
%i\n,a); printf (el segundo valor : %i\n,b); return 0; }
Aqu hemos introducido una nueva variable en el cdigo.
La cadena de formato, "%i,%i especica que el usuario
ingresar un nmero, seguido de una coma, y luego otro
La entrada de datos se puede hacer de muchas maneras nmero. El primer %i ser capturado por la variable a y
y entre ellas estn desde el uso de dispositivos especiales el segundo por b.
hasta nuestro simple teclado. La entrada de datos se re- Vamos a tratar ahora de que el ordenador haga un poco

28

Lectura de datos del teclado

11
de matemticas para nosotros. Por ejemplo, que realice Pero, como = tambin es un operador, cmo sabe el orunas pocas sumas, restas multiplicaciones y divisiones.
denador qu operador debe ejecutar primero? Y si es un
#include <stdio.h> int main(void) { int resulta- operador, por qu no da un resultado? No crea una exdo; resultado=5+2; printf(Resultado de la suma: presin?
%i\n,resultado); resultado=5-2; printf(Resultado de la
resta: %i\n,resultado); resultado=5*2; printf(Resultado
de la multiplicacin: %i\n,resultado); resultado=5/2;
printf(Resultado de la divisin: %i\n,resultado); return(0); }
Despus de grabarlo (por ejemplo, con el nombre ejemplo.c), lo compilamos y ejecutamos, con (respectivamente):
$ gcc ejemplo.c $ ./a.out Resultado de la suma: 7 Resultado de la resta: 3 Resultado de la multiplicacin: 10
Resultado de la divisin: 2 $

Empezando por las ltimas preguntas, el operador de


asignacin s crea una expresin, como los operadores
de suma, resta, multiplicacin y divisin, y esa expresin
tiene un resultado, que es el valor que obtiene el lado izquierdo al realizar la operacin. En cuanto a saber qu
se debe ejecutar primero, el ordenador tiene una lista de
precedencia, segn la cual siempre ejecuta primero las
multiplicaciones y divisiones, de izquierda a derecha, a
continuacin las sumas y restas, de izquierda a derecha,
y a continuacin las asignaciones, de derecha a izquierda.
Para ms detalles acerca de la precedencia de los operadores ver el anexo de los operadores.

En cuanto a los caracteres de punto y coma, notamos aqu


que una expresin tambin puede ser una sentencia por s
misma, sin necesidad de que haya ninguna funcin. De
int resultado;
hecho, una sentencia puede no tener siquiera una expresin. La lnea: ; es una sentencia perfectamente vlida, la
Esta lnea lo que hace es reservar un trozo de memoria, sentencia vaca, que sera til en puntos donde el lenguaje
del tamao de un int (normalmente 4 bytes), y asignarle requiera una sentencia pero no sea necesaria para nuestro
el nombre resultado, para poder despus referirnos a l. programa.
A partir de este momento, podemos considerar que en
nuestro programa existe una variable, que no tiene valor Como ya se ha mencionado, C es un ejemplo de
denido, pero a la que le podremos dar valor posterior- programacin estructurada. En este tipo de programacin, es necesario contar con ciertas estructuras que permente.
mitan controlar el ujo del programa, es decir, tomar deLas lneas con printf() ya las conocemos, pero hay algo cisiones y repetir acciones.
en ellas que no habamos visto antes. Esos %i y la parte
de resultado son nuevas para nosotros.
Fijmonos en la lnea del principio de la funcin main:

La funcin printf() no slo sabe imprimir cadenas simples, como Hola Mundo\n, sino tambin imprimir variables. Para ello, en el lugar de la cadena donde queremos
que aparezca el valor de la variable, introducimos lo que
se llama una cadena de conversin de printf(). Estas cadenas siempre empiezan por %, siendo %i la cadena para
imprimir un entero, como es en nuestro caso int resultado. Finalmente, printf() debe saber qu valor escribir,
por eso le damos otro argumento (u otros), usando , como separador, que contienen las variables cuyos valores
queremos mostrar.

29 La estructura condicional if ...


else
En la gran mayora de los programas ser necesario tomar decisiones sobre qu acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algn error o de cualquier otra
cosa.

La estructura condicional if ... else es la que nos permite


tomar ese tipo de decisiones. Traducida literalmente del
En el resto del programa hemos visto cmo decirle al or- ingls, se la podra llamar la estructura si...si no, es dedenador que ejecute una suma, una resta, una multiplica- cir, si se cumple la condicin, haz esto, y si no, haz esto
cin y una divisin entera, con los operadores +, -, * y /. otro.
Es de notar que el resultado de una operacin como estas
Un ejemplo sencillo sera el siguiente (no se trata de un
entre nmeros enteros ser siempre otro entero, como se
programa completo, sino tan slo una porcin de cdigo):
puede observar en la divisin, en la que no obtenemos un
bonito decimal, sino un resultado entero. Adems, hemos if (edad < 18) printf(No puedes acceder.\n); else
visto que el resultado de esas operaciones, que llamamos printf(Bienvenido.\n);
expresiones, puede ser asignado a una variable:
Este cdigo de ejemplo dice que si el valor de la variable edad es menor que 18 se imprimir No puedes acceder.\n, mientras que en caso contrario se imprimir
Esa asignacin se hace mediante el operador de asignaBienvenido.\n.
cin: =. Con l, ya conocemos cinco operadores.
Como se ve en el ejemplo, la estructura de un condicional
resultado = 7;

12

29

LA ESTRUCTURA CONDICIONAL IF ... ELSE

es bastante simple:

Por ejemplo: determinar si un ao es bisiesto o no. Los


if (condicin) { sentencias_si_verdadero; } else { aos son bisiestos si son divisibles por 4, pero no si son
divisibles por 100, a menos que tambin sean divisibles
sentencias_si_falso; }
por 400.
La condicin, encerrada entre parntesis, es una expresin que puede dar como resultado 0 (interpretado como
falso) o cualquier valor distinto de 0 (interpretado como
verdadero). Cuando la condicin sea verdadera, se ejecutarn las sentencias dentro del primer bloque de cdigo,
cuando la condicin sea falsa, se ejecutarn las sentencias
del segundo bloque de cdigo. Las expresiones y valores
de tipo verdadero/falso son tambin llamados valores lgicos o booleanos.
La indentacin o sangra (los espacios al comienzo de las
lneas) no es necesaria, pero ayuda a la claridad del cdigo. La utilizacin de las llaves {...} es obligatoria cuando
se quiere utilizar ms de una instruccin por bloque, y
optativa cuando slo se quiere escribir una instruccin.
Por claridad, sin embargo, es recomendable utilizarlas
an cuando slo vaya a haber una instruccin.
El bloque del else es opcional. Si no se lo encuentra, slo
se realizar la accin correspondiente al bloque if.

if ( (!(a % 4) && (a % 100)) || !(a % 400) ) { printf(es


un ao bisiesto.\n); } else { printf(no es un ao
bisiesto.\n); }
En realidad, teniendo en cuenta la prioridad de los operadores utilizados, podemos simplicar la expresin anterior del siguiente modo:
if ( !(a % 4) && (a % 100) || !(a % 400) ) { printf(es
un ao bisiesto.\n); } else { printf(no es un ao
bisiesto.\n); }
Adems, como a cada rama del if le sigue una nica instruccin, podemos expresar la expresin anterior del siguiente modo:
if ( !(a % 4) && (a % 100) || !(a % 400) ) printf(es un
ao bisiesto.\n); else printf(no es un ao bisiesto.\n);

En este caso, se utiliza el operador mdulo (%), que obA continuacin, un ejemplo con una funcin, que devuel- tiene el resto de la divisin entera de un nmero por otro.
ve el mayor de dos nmeros:
Cuando un nmero es divisible por otro, el resto de su
int mayor(int a, int b) { if (b > a) { return b; }// No posee divisin entera ser cero. Siendo que cero es equivalente
especicacin de la parte else, ya que no es necesaria. a falso, y cualquier valor distinto de cero es equivalente a
return a; // Finaliza la funcin retornando el valor de a. } verdadero, podemos usar el operador % para vericar si
el nmero es mltiplo de 4, de 100 o de 400.

29.1

Operadores de comparacin

29.3 Evaluacin de cortocircuito

El smbolo > visto en el ltimo ejemplo es un operador, La evaluacin en corto circuito es una caracterstica del
que en este caso compara dos nmeros enteros y devuelve lenguaje C que se utiliza para optimizar la ejecucin de
verdadero si el primero es mayor, falso en caso contrario. programas. Consiste en que el programa puede vericar si
una expresin es verdadera o falsa antes de haber evaluado
A continuacin un listado de los posibles operadores de
toda condicin.
comparacin en C y su signicado.
Por ejemplo, si se tiene una condicin como la siguiente:
Teniendo en cuenta que en C se toma como falso el valor 0, y como verdadero cualquier otro valor, una prctica if ((a > 2) || (b < 4)) { ... }
comn es expresar condiciones sin utilizar ningn operador:
Al ejecutarse el programa, se evaluar primero si a > 2.
oat division(int dividendo, int divisor) { if (divisor) { En el caso en que sea verdadero, no continuar con la
return dividendo / divisor; } else { printf (No se puede siguiente condicin, ya que el resultado ser de cualquier
modo verdadero.
dividir por cero\n); return 0; } }
De la misma forma, si la condicin fuera:
En este caso, la expresin (divisor) es equivalente a (di- if ((a > 2) && (b < 4)) { ... }
visor != 0).

29.2

Operadores lgicos

En este caso, si no se cumple que a > 2, no se evaluar


la siguiente condicin, ya que el resultado ser falso de
todos modos.

Los operadores && (y), || (o) y ! (no) son opera- Esta caracterstica no tiene demasiada importancia al codores lgicos. Permiten operar con expresiones lgicas menzar a programar, pero facilitar ciertas operaciones y
para generar expresiones ms complejas.
optimizaciones en programas avanzados.

13

30

La estructura condicional
abierta y cerrada switch ...
case

La condicin debe de ser una expresin lgica, similar a


la de la sentencia if. Primero se evala la condicin. Si
el resultado es verdadero, se ejecuta el bloque de cdigo.
Luego se vuelve a evaluar la condicin, y en caso de dar
La estructura condicional switch ... case se utiliza cuando verdadero se vuelve a ejecutar el bloque. El bucle se corta
queremos evitarnos las llamadas escaleras de decisiones. cuando la condicin da falso.
La estructura if nos puede proporcionar, nicamente, dos
Ejemplo: imprimir los nmeros de 0 a 99:
resultados, uno para verdadero y otro para falso. Una estructura switch ... case, por su parte, nos permite elegir int i = 0; while (i < 100) { printf("%d\n, i); i = i + 1; }
entre muchas opciones. Ejemplo:
#include <stdio.h> #include <stdlib.h> int main(void) {
int dia; printf(que nmero de da de la semana es?");
scanf("%d,&dia); switch(dia) { case 1 : printf(Lun,
Lunes); break; case 2 : printf(Mar, Martes); break;
case 3 : printf(Mier, Miercoles); break; case 4 :
printf(Jue, Jueves); break; case 5 : printf(Vie, Viernes); break; case 6 : printf(Sab, Sabado); break; case
7 : printf(Dom, Domingo); break; default : printf(No
existe); } return 0; }

32 El bucle for
El bucle for es un bucle muy exible y a la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma ms tradicional es la siguiente:
for (/* inicializacin */; /* condicin */; /* incremento
*/) { /* cdigo a ejecutar */ }

La estructura anterior, de realizarse con sentencias if, necesitara cuatro de ellas, resultando un enorme bloque
muy difcil de leer. En la mayora de los casos, adems, la
sentencia switch proporciona una ganancia en velocidad
del cdigo, pues permite al compilador trabajar en base
a que se trata de una decisin mltiple para una nica variable, cosa que con sentencias if el compilador no tiene
por qu detectar.

Inicializacin: en esta parte se inicia la variable que controla el bucle y es la primera sentencia que ejecuta el bucle. Slo se ejecuta una vez ya que solo se necesita al principio del bucle.

Como vemos, para cada valor de la variable se ejecuta


un bloque de sentencias distinto, en el que no necesitamos llaves. Hay un caso especial, default, que se ejecuta
si ningn otro corresponde, y que no es necesario poner.
Es, en todo, equivalente al bloque else de una sentencia
if.

Incremento: es una sentencia que ejecuta al nal de cada iteracin del bucle. Por lo general, se utiliza para incrementar la variable con que se inicio el ciclo. Luego
de ejecutar el incremento, el bucle revisa nuevamente la
condicin, si es verdadera tiene lugar una ejecucin ms
del cuerpo del ciclo, si es falsa se termina el ciclo y as.

Las sentencias break son muy importantes, ya que el comportamiento normal de un bloque switch es ejecutarlo todo desde la etiqueta case que corresponda hasta el nal.
Por ello, si no queremos que se nos ejecute ms de un bloque, pondremos sentencias break al nal de cada bloque
excepto el ltimo.

Aqu se muestra el mismo ejemplo visto para el bucle


while, pero implementado con un bucle for:

A la ausencia de sentencias break se le llama, en ocasiones, dejar caer la cascada switch.

33 El bucle do...while

31

El bucle do...while es un bucle que, por lo menos, se ejecuta una vez. Do signica literalmente hacer, y while
signica mientras

Expresin condicional: al igual que en el bucle while, esta


expresin determina si el bucle continuar ejecutndose
o no.

int i; for (i=0; i < 100; i = i + 1) { printf("%d\n, i); }

Nota: En C, la sentencia i = i + 1 puede escribirse en


forma ms reducida como i++. Esta forma se utiliza ms
Es decir, las etiquetas case son puntos de entrada de la comnmente en el bucle for:
ejecucin, y no implican que al acabarse el bloque case
la ejecucin salte al nal del bloque switch. Las etiquetas int i; for (i=0; i < 100; i++) { printf("%d\n, i); }
case siguientes a la que hemos utilizado para entrar son,
sencillamente, ignoradas.

El bucle while

Su forma es esta:
El bucle while sirve para ejecutar cdigo reiteradas veces. do { /* CODIGO */ } while (/* Condicin de ejecucin
while (/*condicion*/) { /* Cdigo */ }
del bucle */)

14

35 FUNCIONES

Os muestro un ejemplo sencillo de uso:


int aleatorio; do { aleatorio = rand(); } while (aleatorio
!= 25);
La verdad es que este ejemplo puede resultar un poco absurdo, pero es bastante intuitivo. El cdigo del bucle asigna un valor aleatorio a la variable denida anteriormente,
y mientras esa variable no tenga el valor 25, el bucle sigue
ejecutndose.

34

} int main(void) /* Funcin principal del programa */


{ holamundo(); /* llamada a la funcin holamundo */
return 0; /* sale del programa con cdigo 0 (correcto) */ }
Este cdigo es en todo equivalente al Hola Mundo original, slo que nos muestra cmo escribir y cmo utilizar
una funcin. Y adems nos muestra un principio de buena
programacin: meter las sentencias que hacen el trabajo en otras funciones especcas para sacarlas de main(),
dejando en sta tan slo un guin general de lo que hace
el programa, no las rdenes especcas. De esta manera se facilita la comprensin del programa, y por tanto el
futuro trabajo de modicarlo.

La sentencia goto
35.1 La sentencia return

La sentencia goto sirve para indicar al programa que continue ejecutndose desde la lnea de cdigo indicada. Su La sentencia return puede utilizarse dentro de una funcin
sintaxis es ms o menos as:
para terminar su ejecucin.
/* Cdigo */ ETIQUETA: /* Cdigo */ goto ETIQUE- En el ejemplo anterior, la funcin holamundo fue declaTA; /* Cdigo */
rada con valor de retorno de tipo void (es decir, valor de
retorno nulo). En ese caso, la sentencia return no lleva
As, cuando se ejecute la sentencia goto, el programa sal- ningn parmetro adicional, ya que la funcin no debe
tar" y continuar su ejecucin a partir de la etiqueta mar- devolver ningn valor a la funcin que la llama.
cada.
En cambio, la funcin main tiene un valor de retorno de
Como se puede observar se puede usar para crear un bucle, o para ir a una parte del cdigo u otra si se combina con una sentencia if...else. Pero por lo general puede
obtenerse el mismo efecto utilizando los bucles anteriormente vistos.

tipo int, por lo que return debe ir seguido de un valor entero (0 en el ejemplo). El valor 0 se utiliza para indicar
que el programa ha llegado a un punto en el que todo se
ha desarrollado correctamente y se utiliza cualquier otro
valor para indicar que ha habido algn tipo de error.

Por eso, la sentencia goto es poco aceptada por la comunidad de programadores, pues puede provocar que se hagan
programas un poco sucios y confusos. Slo en ocasiones muy excepcionales ser recomendado el uso del goto
al crear iteraciones muy complejas. Sin embargo, con el
pasar de los aos este comando ya ha quedado prcticamente descartado del lenguaje de los programadores.

La instruccin return no es una funcin, se trata de una


sentencia que lo que hace es retornar como valor de la
funcin el valor que se le proporciona como argumento.

35

Funciones

Como vimos anteriormente C tiene como bloque bsico la funcin main() , tambin hemos visto la sentencia
printf() que es otra funcin, y de igual forma hay muchas ms funciones predenidas, pero nosotros mismos
tambin podemos denir nuestras propias funciones. De
hecho, es fundamental hacerlo.

35.2 Argumentos
Las funciones tambin pueden recibir argumentos o parmetros, para modicar su comportamiento. Por ejemplo,
la denicin de una funcin para sumar dos nmeros sera
de la siguiente manera:

35.3 Declaracin y denicin


En el ejemplo anterior podemos notar que la funcin sumar gura en el cdigo antes que main. Qu pasara si
las escribiramos en distinto orden?

#include <stdio.h> int main(void) { int suma = sumar(5, 3); /* ERROR, sumar no ha sido declarada an
*/ printf(La suma es: %d ", suma); return 0; } int
sumar(int numero1, int numero2) { return numero1 +
/* Inclusin de archivos */ #include <stdio.h> void numero2; }
holamundo(void) /* Funcin donde se ejecuta la lgica del programa */ { printf(Hola Mundo\n); /* En este caso el programa es errneo y no compila, ya que
imprime la cadena */ return; /* sale de la funcin */ en la lnea donde se llama a la funcin sumar, el compiPodemos denir una funcin cualquiera de la misma manera en que denimos la funcin main(). Basta con poner
su tipo, su nombre, sus argumentos entre parntesis y luego, entre llaves, su cdigo:

35.5

Variables Locales y Globales

15

lador an no conoce ninguna funcin con ese nombre, y del Dominio Pblico */ #include <stdio.h> void sucules son sus argumentos y valor de retorno.
mar_referencia(int *numero); /* prototipo de la funcin
Una posible solucin es declarar el prototipo de la fun- */ int main(void) { int numero = 57; /* denimos
cin al principio, para informar al compilador que existe, numero con valor de 57*/ sumar_referencia(&numero);
y luego denir el cuerpo de la misma en cualquier lugar /* enviamos numero a la funcin */ printf("\nValor de
numero dentro de main() es: %d ", numero); /* podemos
del programa:
notar que el valor de numero se modica * y que ahora
#include <stdio.h> /* Declaracin */ int sumar(int dentro de main() tambin se ha modicado * aunque la
numero1, int numero2); int main(void) { int suma = funcin no haya retornado ningn valor. */ return 0; }
sumar(5, 3); printf(La suma es: %d ", suma); return 0; void sumar_referencia(int *numero) { *numero += 1; /*
} /* Denicin */ int sumar(int numero1, int numero2) le sumamos 1 al numero */ /* el valor de numero recibido
{ return numero1 + numero2; }
se aumenta en 1 * y se modica dentro de la funcin */
printf("\nValor de numero dentro sumar_referencia() es:
%d, *numero); return; }

35.4

Paso de Parmetros

Las funciones pueden recibir datos como lo hemos observado, pero existen dos formas de enviar los datos hacia
una funcin por valor y por referencia, las cuales modican en diferente forma el comportamiento de el programa.

35.5 Variables Locales y Globales

Adems de pasar valores a una funcin, tambin se pueden declarar tipos de datos dentro de las funciones, estos
tipos de datos declarados dentro de una funcin solo son
accesibles dentro de esta misma funcin y se les conocen
como variables locales, as pues podemos denir los mis35.4.1 Por Valor
mos nombres de variables en diferentes funciones, ya que
estas variables solo son accesibles dentro de esas funcioEl paso por valor enva una copia de los parmetros a nes. Ejemplo:
la funcin por lo tanto los cambios que se hagan en ella
/* * locales.c * * Julio Csar Brizuela <brizuelaalno son tomados en cuenta dentro de la funcin main().
varado@gmail.com> 2009 * * para el wikilibro
Ejemplo:
Programacin en C * bajo licencia FDL, adaptado del
/* * por_valor.c * * Julio Csar Brizuela <brizue- Dominio Pblico */ #include <stdio.h> void funcion1()
laalvarado@gmail.com> 2009 * * para el wikilibro { int dato = 53; /* denimos dato en 53*/ char num1 =
Programacin en C * bajo licencia FDL, adaptado 'a'; /* num1 vale a */ /* imprimimos */ printf(Funcion1,
del Dominio Pblico */ #include <stdio.h> void su- dato=%d, num1=%c\n, dato, num1); return; } void
mar_valor(int numero); /* prototipo de la funcin */ funcion2() { int dato = 25; /* denimos dato en 25*/
int main(void) { int numero = 57; /* denimos numero char num2 = 'z'; /* num2 vale z*/ /* imprimimos */
con valor de 57*/ sumar_valor(numero); /* enviamos printf(Funcion2, dato=%d, num2=%c\n, dato, num2);
numero a la funcin */ printf(Valor de numero dentro return; } int main(void) { funcion1(); /* llamamos a
de main() es: %d\n, numero); /* podemos notar que funcion1() */ funcion2(); /* llamamos a funcion2() */
el valor de numero se modica * slo dentro de la return 0; }
funcin sumar_valor pero en la principal * nmero sigue
valiendo 57 */ return 0; } void sumar_valor(int numero)
En este caso la variable dato, esta denida dentro de ca{ numero++; /* le sumamos 1 al numero */ /* el valor de
da una de las funciones y son totalmente distinta una de
nmero recibido se aumenta en 1 * y se modica dentro
otra y no se puede utilizar fuera de esta, as pues num2
de la funcin sumar_valor() */ printf(Valor de numero
no puede ser utilizada por la funcion1() y num1 tampoco
dentro sumar_valor() es: %d\n, numero); return; }
puede ser utilizada por funcion2().
Existen pues variables que se denen fuera de la funcin
principal main() y fuera de cualquier otra funcin creada
35.4.2 Por Referencia
por nosotros, estas variables se les conoce con el nombre
de Variables Globales ya que se pueden utilizar dentro de
El paso por referencia se hace utilizando apuntadores. Se main() y dentro de cualquier funcin creada por nosotros.
enva la direccin de memoria de la variable, por lo tanto Ejemplo:
los cambios que haga la funcin si afectan el valor de la /* * global.c * * Julio Csar Brizuela <brizuelaalvaravariable. Ejemplo:
do@gmail.com> 2009 * * para el wikilibro Programa/* * por_referencia.c * * Julio Csar Brizuela <bri- cin en C * bajo licencia FDL, adaptado del Dominio
zuelaalvarado@gmail.com> 2009 * * para el wikilibro Pblico */ #include <stdio.h> int variable_global = 99;
Programacin en C * bajo licencia FDL, adaptado /* inicializamos la variable global */ void funcion(); int

16

36 FUNCIONES RECURSIVAS

main(void) { /* imprimimos el valor*/ printf(main(), Solucin iterativa:


acceso a variable_global %d\n, variable_global); /*
a + a + + a b
{z
}=
llamamos a la funcin */ funcion(); return 0; } void a b = |
i=1 a
b
veces
funcion() { /* imprimimos el valor*/ printf(funcion(),
acceso a variable_global %d\n, variable_global); return; Solucin recursiva:
{
}
0
Si b = 0
ab=
a + a (b 1) Si b > 0

36

Funciones Recursivas

As pues 7 3 es:

La recursividad (recursin) es la propiedad por la cual una 7 3 = 7 + 7 2 = 7 + 7 + 7 1 = 7 + 7 + 7 + 0 = 21


funcin se llama a s misma directa o indirectamente.
Podemos ver que la multiplicacin de dos nmeros a, b se
La recursin indirecta implica utilizar ms de una funpuede transformar en otro problema ms pequeo multicin.
plicar a por (b-1), el caso base se produce cuando b = 0
Se puede considerar la recursividad como una alternativa y el producto es 0. Ejemplo:
a la iteracin. La recursin permite especicar soluciones
/* * producto.c * * Julio Csar Brizuela <brizuenaturales, sencillas, que seran, en caso contrario, difcilaalvarado@gmail.com> 2009 * * para el wikilibro
les de resolver. Toda funcin recursiva debe contemplar
Programacin en C * bajo licencia FDL, adaptado del
un caso base o condicin de salida, para terminar, o la
Dominio Pblico */ #include <stdio.h> int producto(int
recursividad no podr terminar nunca.
a, int b) { if (b == 0) /* caso base */ return 0; /* como
Una funcin recursiva podra denirse as:
b = 0, se retorna 0*/ else return a + producto (a, b funcion_recursiva( /* parmetros recibidos por la fun- 1); /* llamada a esta misma funcin */ } int main(void)
cin */ ) { /* Cdigo */ funcion_recursiva( ); /* llamada { /* en este caso se llama a la funcin y se imprime
directamente*/ printf("%i ", producto( 7, 3)); return 0; }
a la funcin misma */ /* Cdigo */ }
Uno de los ejemplos ms representativos en la recursividad es el factorial de un numero ( n! ):
36.1

n! =

n N

k=1

la denicin de recursividad del factorial es:


{
n! =

1
n(n 1)!

Si n = 0
Si n > 0

n N.

En esta denicin, n = 0, es nuestro caso base, que le da


n a la recursividad.
Entonces nuestro programa que calcula el factorial es:
/* *factorial.c * * Julio Csar Brizuela <brizuelaalvarado@gmail.com> 2009 * * para el wikilibro
Programacin en C * bajo licencia FDL, adaptado del
Dominio Pblico */ #include <stdio.h> long factorial(int
n) { if (n == 0) /* caso base */ return 1; /* como 0! = 1,
se retorna 1*/ else return n * factorial (n - 1); /* llamada
a esta misma funcin */ } int main(void) { /* en este
caso se llama a la funcin y se imprime directamente*/
printf("%ld ", factorial(5)); return 0; }

Recursividad indirecta o recursin


mutua

Esta se produce cuando una funcin llama a otra, que esta


a su vez terminar llamando de nuevo a la primera funcin. El siguiente programa visualiza el alfabeto utilizando recursin indirecta o mutua:
/* * elalfabeto.c * * Julio Csar Brizuela <brizuelaalvarado@gmail.com> 2009 * * para el wikilibro
Programacin en C * bajo licencia FDL, adaptado
del Dominio Pblico */ #include <stdio.h> void funcionA(char c); /* se declara el prototipo de la funcin
para que el llamado */ void funcionB(char c); /* a la
misma en la funcin no sea implcita */ int main(void)
{ funcionA('z'); /* llamado a funcionA */ return 0; }
void funcionA(char c) { if (c > 'a') /* caso base mientras
c no sea menor que A */ funcionB(c); /* llamado a la
funcionB */ printf("%c ", c); /* imprimimos el valor
de c */ *la variable es un parametro no utilizado para
este proceso } void funcionB(char c) { funcionA(--c); /*
llamado a la funcionA decrementando el valor de 'z' */ }

36.2 Recursin versus Iteracin

Tambin existen otros tipos de funciones recursivas como Tanto la iteracin como la recursin se basan en estructulo es el producto de dos nmeros. El producto de a b, ra de control: la iteracin utiliza una estructura repetitiva
y la recursin una estructura de seleccin. La iteracin
donde a y b son nmeros enteros positivos seria:

36.2

Recursin versus Iteracin

17

utiliza explcitamente una estructura repetitiva mientras forma:


que la recursin consigue la repeticin mediante llamadas tipo_elemento nombre[largo];
repetitivas a funciones.
La iteracin termina si la condicin del bucle no se cum- Esto declara la variable nombre como un vector de tiple, mientras que la recursin termina cuando se reconoce
po_elementos que podr contener largo cantidad de eleun caso base.
mentos, y cada uno de estos elemento podr contener un
La recursin puede presentar desventajas ante la iteracin valor de tipo tipo_elemento.
ya que se invoca repetidas veces al mecanismo de llamada Por ejemplo:
de funciones y se necesita un tiempo mayor para realizar
double valores[128];
cada llamada.
La razn por la cual se puede elegir u optar por usar recursividad es que existen muchos problemas complejos En este ejemplo declaramos un vector de 128 elementos
que poseen naturaleza recursiva y, en consecuencia, son del tipo double, los ndices de los elementos iran entre 0
(para el primer elemento y 127 para el ltimo).
mas fciles de implementar.
36.2.1

Ejemplo Iterativo

/* * iterativo.c * * Julio Csar Brizuela <brizuelaalvarado@gmail.com> 2009 * * para el wikilibro


Programacin en C * bajo licencia FDL, adaptado del
Dominio Pblico */ #include <stdio.h> long factorial(int
numero); int main(int argc, char** argv) { int contador
= 0; /* calcula el factorial de 0 a 10 */ for ( contador =
0; contador <= 10; contador++ ) printf("%d! = %ld\n,
contador, factorial( contador )); return 0; } /* funcion
factorial iterativa */ long factorial( int numero ) { long
resultado = 1; int i = 0; /* declaracion de la funcin
factorial iterativa */ for ( i = numero; i >= 1; i-- )
resultado *= i; return resultado; }

De la misma forma que con las otras declaraciones de


variables que hemos visto se le puede asignar un valor
iniciar a los elementos.
O tambin se pueden declarar:
tipo_elemento nombre[largo]={valor_0, valor_1, valor_2};
En caso estamos asignadole valores a los primeros 3 elementos del vector nombre. Notar que largo debe ser mayor o igual a la cantidad de valores que le estamos asignando al vector, en el caso de ser la misma cantidad no
aporta informacin, por lo que el lenguaje nos permite
escribir:
tipo_elemento nombre[]={valor_0, valor_1, valor_2};
Que declarar nombre como el vector de largo 3.

36.2.2

Ejemplo Recursivo

/* * recursivo.c * * Julio Csar Brizuela <brizuelaalvarado@gmail.com> 2009 * * para el wikilibro


Programacin en C * bajo licencia FDL, adaptado del
Dominio Pblico */ #include <stdio.h> long factorial(int
numero); int main(int argc, char** argv) { int contador
= 0; /* calcula el factorial de 0 a 10 */ for ( contador =
0; contador <= 10; contador++ ) printf("%d! = %ld\n,
contador, factorial( contador )); return 0; } /* funcin
factorial recursiva */ long factorial( int numero ) { if (
numero <= 0 ) /* caso base */ return 1; /* casos bases:
0! = 1 y 1! = 1 */ else /* llamada recursiva */ return
numero * factorial( numero - 1 ); /* llamada a la funcin
factorial */ }
Los vectores son una forma de almacenar datos que permiten contener una serie de valores del mismo tipo, cada
uno de los valores contenidos tiene una posicin asociada
que se usar para accederlos. Est posicin o ndice ser
siempre un nmero entero positivo.

Para acceder a un elemento accederemos a travs de su


posicin. Es decir:
tipo_elemento elemento; ... elemento = nombre[2];
Asumiendo que tenemos el vector anterior denido estaramos guardando valor_2 en elemento.
Veamos algunos ejemplos:
/* * Ejemplo : El producto escalar de dos vectores */
#include <stdio.h> double producto_escalar(double v1[],
double v2[], int d); int main() { const int largo = 3; double
vector_1[] = {5,1,0}; double vector_2[] = {1,5,3};
double resultado = producto_escalar(vector_1, vector_2,
largo); // imprime el resultado printf("(%f, %f, %f)
. (%f, %f, %f) = %f\n, vector_1[0], vector_1[1],
vector_1[2], vector_2[0], vector_2[1], vector_2[2],
resultado); return 0; } /* producto escalar entre dos
vectores */ double producto_escalar(double v1[], double v2[], int d) { double resultado = 0; int i; for (i=0; i
< d; i++) { resultado += v1[i] * v2[i]; } return resultado; }

En C la cantidad de elementos que podr contener un vecEn el ejemplo anterior usamos los vectores de C para retor es jo, y en principio se dene cuando se declara el
presentar vectores matemticos y calcular el producto esvector. Los vectores se pueden declarar de la siguiente

18
calar entre ellos. Una peculiaridad que se puede notar es
que al recibir un arreglo en una funcin no se especica
el largo, volveremos a esto en un captulo posterior.
Otra funcin clsica es la bsqueda de un mximo o mnimo, que podemos escribirla de la siguiente manera:
int buscar_maximo(double valores[], int num_valores) {
int maximo_pos = 0; for (int i = 1; i < num_valores; i++)
{ if (valores[i] > valores[maximo_pos]) { maximo_pos
= i; } } return maximo_pos; }
Otro ejemplo sencillo, calcular el promedio de los valores.
double promedio(double valores[], int largo) { double
suma=0; for (int i=0;i<largo;i++) { suma+=valores[i]; }
return suma/largo; }
Cuando una funcin recibe un vector por parmetro y
cambia su contenido y el cambio es permanente (se ve an
fuera de la funcin). Esto puede parecer extrao despus
del nfasis que pusimos en resaltar que todos los parmetros de una funcin se reciben por valor, pero se aclarar
en el siguiente capitulo.
Mientras tanto usemos esto para denir una funcin que
le aplique otra funcin que recibe por parmetro a cada
elemento del vector, guardando el resultado en el mismo
vector y una llamada de ejemplo a esta.
void cuadrados(double vector[], int largo) { for (int
i=0;i<largo;i++) { vector[i]=cuadrado(vector[i]); } } ...
double cuadrado(double valor) { return valor*valor; } ...
cuadrados(elementos,num_elem); ...
De la misma forma que venimos usando vectores de tipos bsicos, podemos tener vectores de vectores, estos se
declaran de la siguiente forma:
int matriz[3][7]; int tabla[3][4]={ { 1, 2, 3, 4}, { 5, 6,
7, 8}, /* los espacios y saltos de lneas no son tomados
en cuenta */ { 9,10,11,12} }; double v[2][2][2]; ...
printf(tabla[0][1]: %i\n, tabla[0][3]); // Imprime 4
printf(tabla[2][0]: %i\n, tabla[2][0]); // Imprime 9 ...
En este ejemplo tabla es un vector de longitud 3, cuyos
elementos son vectores de longitud 4 de elementos de tipo
int.
En resumen, suponiendo que v[n] es un vector de cualquier tipo de dato con n cantidad de posiciones, al vector
v se le aplican las siguientes reglas:
1. La primera posicin siempre ser v[0]
2. La ltima posicin es v[n-1]
3. En versiones previas a C99 n es una constante denida antes de la declaracin de v[n]

36 FUNCIONES RECURSIVAS

19

37
37.1

Text and image sources, contributors, and licenses


Text

Programacin en C/Texto completo Fuente: http://es.wikibooks.org/wiki/Programaci%C3%B3n%20en%20C/Texto%20completo?


oldid=171299 Colaboradores: Maxy y Drinibot

37.2

Images

37.3

Content license

Creative Commons Attribution-Share Alike 3.0

Das könnte Ihnen auch gefallen