Sei sulla pagina 1di 36

El lenguaje C

1.12

Historia de C y sus autores

El lenguaje C est
a asociado al desarrollo del sistema Operativo UNIX.
1969 K. Thompson y D. Ritchie crean UNIX.
- lenguaje B de Ken Thomson (Bell labs.), BCPL.
1972 Dennis Ritchie crea el lenguaje C. Proposito programar sobre UNIX mas facil que en asembler
y dar portabilidad a los programas.
1973 El primer UNIX basado en C, (90%) corre en la PDP11
1978 Se publica el libro de Brian Kernigan y Dennis Ritchie. El C de Ritchie se conoce desde
entonces con el nombre de C de K y R.
1980 Barne Stroustrup crea C++, que agrega conceptos de programacion orientada a objetos.
1983 El American National Standard Institute define el ANSI C
1990 La International Standard Organization define su estandar para C, el ISO C.

1.13

Caractersticas del lenguaje C

En la palabras de Kernighan y Ritchie, en el prefacio de la primera edicion de su libro The C programming lenguage, [11], C es un lenguaje de programaci
on de prop
osito general con economa de
expresi
on, estructuras de datos y control de flujo modernos y un rico conjunto de operadores. C no
es un lenguaje de muy alto nivel, asi como no es grande, ni tampoco es especializado a alguna
area especial de aplicaci

on. Pero esta ausencia de restricciones y su generalidad lo hace, para muchas


tareas, m
as conveniente y efectivo que otros lenguajes supuestamente m
as poderosos.
No obstante lo dicho, originalmente C se cre
o y uso para suplantar al lenguaje ensamblador en el
desarrollo de aplicaciones portables para el sistema operativo UNIX, y luego en la programacion de
casi todo el sistema operativo Linux.
Su uso como lenguaje de programacion en ciencias es mas reciente y ha tomado importancia desde
los a
nos 80 con el desarrollo de C++ y la metodologa orientada a objetos. Se han desarroldo muchos
programas de uso cient
ofico y tecnico con C. En el campo de la Mecanica de Fluidos se destaca
OpenFOAM. En el campo de la visualizacion se destacan la librera VTK, Salome, la plataforma
integrada para simulaci
on numerica de EDF (Electricite de France), etc.
Es com
un caracterizar al lenjuage C con los siguientes adjetivos:
peque
no
de bajo nivel
peligroso

xvi
Peque
no Que significa que sea peque
no?. Significa que existen solo un n
umero relativamente
peque
no de funciones predefinidas. El Estandard de C se limita a definir las sentencias, operadores
b
asicos y sentencias de control de flujo. No define en cambio la interacci
on con perifericos, mouse,
ventanas, listados de directorio etc. etc.
Muchas de estas cosas dependen del entorno de trabajo particular, por ejemplo, del compilador, del
procesador, del SO. De manera que o se dejan libradas a la habilidad del programador, o son incluidas
en libreras de subrutinas.
Bajo nivel. Las estructuras que implementa son de un nivel bajo de abstraccion, (en este sentido no
podramos decir que tiene menos nivel de abstraccion que Fortran o Basic).
Peligroso. Con C puede hacerse lo que se quiera. No hay restricciones en lo que se puede programar.
Pueden modificarse cualquier lugar de memoria, cualquier registro, cualquier posicion en el disco duro.
Para muchos lenguajes de programacion existen, en el tiempo de compilaci
on algunas salvaguardas
que impiden que algunas sentencias se ejecuten si en ellas se direcciona lugares de memoria que no
han sido reservados para el programa. Este no es el caso de C. Cualquier sentencia sint
acticamente
correcta sera compilada, aun cuando sea peligrosa para el sistema.

1.14

El desarrollo de un programa en C

Existen varias etapas globales en el desarrollo de un program compilado, y en particular en C, estas


son:
Escritura del c
odigo fuente.
Compilaci
on.
Ejecuci
on.
Depuraci
on de errores
Estas etapas se desarrollan en un ciclo. El estudio de estos ciclos con el prop
osito de desarrollar
programas en forma eficiente se denomina ingeniera de software. El ciclo de vida de un programa
grande puede abarcar las siguientes etapas (modelo de cascada) con su costo relativo entre parentesis:
Analisis del sistema. Que debe hacer el soft y que el hard.
Analisis de requerimientos. Que debe hacer el soft.
Dise
no (60%). Como se lo llevara a cabo.
Escritura del c
odigo fuente, (15%).
Prueba y depuraci
on de errores, (25%).
Mantenimiento. Cambios por errores o cambios de los requerimientos. Puede resultar tan costoso
como el 50-70 % del costo del proyecto.

1.14.1

Edici
on del c
odigo fuente

El c
odigo fuente, o el programa fuente, o simplemente el programa es el texto con la secuencia
de instrucciones que se archiva codificado como texto com
un o c
odigo mASCII. Los archivos con
c
odigo fuente en lenguaje C se distinguen por que se nombran agregando la extenci
on .c, por ejemplo
rungek.c.
La escritura del c
odigo fuente se realiza, en el ambiente de Linux, utilizando un editor de texto
cualquiera, o si se prefiere, utilizando alg
un entorno de desarrollo como Kdevelop o Eclipse. En este
curso escribiremos nuestros programas usando alg
un editor de textos mas o menos simple pero interfaz

cursoC/curso/lenguajeC.tex -August 23, 2012

xvii

Figure 1.2: La ventana del editor gedit. OJO CAMBIAR FIGURA


grafica, tal como pueden ser Gedit, Kwrite o Kate (por supuesto, si se prefiere podra usarse los clasicos
extremos vi o emacs, u otros como pico o nano).
Por ejemplo, con Kate podemos crear un archivo, que llamamos hola.c
1
2
3
4
5
6
7

#include <stdio.h>
/* este es el programa minimo*/
main()
{
printf("Hola todos.\n");
return 0;
}

Recuerde, los n
umeros a la izquierda son solo a los efectos de la presentacion impresa del programa.
Por ejemplo, a continuacion se presenta la ventana del editor Kate con el mismo c
odigo presentado
arriba;
Kate abre dos ventanas de trabajo, la ventana superior la edici
on del texto y la ventana de abajo
para la terminal. De manera que se puede trabajar conveniente en la edici
on del texto y en la lnea
de comandos para la etapa de compilaci
on. Kate tiene algunas ventajas avanzadas presentadas en
un modo gr
afico agradable, por ejemplo, como el resaltado de sint
axis, mecanismo que marca
inteligentemente los distintos tokens del programa, utilizando colores y tipografas definidas:
Con verde las directivas al compilador.
Con gris claro y letra it
alica los comentarios
Con negro las sentencias en general.
Con rojo las cadenas de caracteres.

xviii

Figure 1.3: La ventana del editor Kdevelop

Figure 1.4: La ventana del editor Eclipse

cursoC/curso/lenguajeC.tex -August 23, 2012

xix

Con violeta los caracteres de control de impresion


Con azul los valores constante

Podra aprender mas sobre este editor en Manual del editor Kate, [1], que dispone en lnea.

1.14.2

Compilaci
on

Ahora, una vez que el programa ha sido escrito y guardado en un archivo, debe compilarse. La
compilaci
on es la etapa en la cual convertimos nuestro c
odigo fuente en lenguaje de maquina. Tienen
varias subetapas que veremos luego. Recien, luego de la compilacion podremos ejecutar un programa.
La compilaci
on se hace usando un programa (o series de programas) que por ahora llamaremos el
compilador. En UNIX el compilador de C se denomina CC y en Linux, el compilador es gcc.
Siguiendo con el ejemplo, podemos compilar el programa hola.c de la siguiente manera, la mas
cencilla, sin opciones
1
2
3
4
5

cardon@cardo:~/cursoC/curso > gcc hola.c


cardon@cardo:~/cursoC/curso > a.out
Hola todos.
cardon@cardo:~/cursoC/curso >

en la lnea 1 se compila el programa hola.c, en la lnea 2 se lo ejecuta, y en la lnea 3 se obtiene el


resultado de la ejecuci
on, el mensaje Hola todos. en la terminal.
El resultado del proceso de compilaci
on es un archivo ejecutable o binario, que por defecto se llama
a.out. Lo cual es bastante inc
omodo, ya que preferiramos denominarlo de alguna manera especfica.
Para ello se usa la opci
on -o (de output) seguida del nombre que querramos dar a nuestro programa
ejecutable. Por ejemplo, si saluda el nombre elegido para nuestro binario.
cardon@cardo:~/cursoC/curso > gcc -o saluda hola.c
cardon@cardo:~/cursoC/curso > saluda
Hola todos.
cardon@cardo:~/cursoC/curso >

1.14.3

Ejecuci
on

Una vez compilado un programa podemos ejecutarlo de la misma manera que se ejecuta cualquier otro
comando en Linux. De hecho, muchos de los comandos en Linux son programas en C. De manera que
para ejecutar un programa solo debemos invocar su nombre en la terminal y oprimir la tecla enter.
En el caso de la compilaci
on sin opciones
cardon@cardo:~/cursoC/curso > a.out
Hola todos.
cardon@cardo:~/cursoC/curso >
o en el segundo caso
cardon@cardo:~/cursoC/curso > saluda
Hola todos.
cardon@cardo:~/cursoC/curso >
En ambos casos, la salida de este programa es un mensaje por la pantalla Hola todos..

xx
Dependiendo de como este configurada nuestra variable PATH, puede ocurrir que en algunos casos el
sistema no busque en nuestro directorio de trabajo el programa que se quiere ejecutar, como en el
caso siguiente
1
2
3

cardon@cardo:~/A-cursos/cursoC/curso> hola
bash: hola: command not found
cardon@cardo:~/A-cursos/cursoC/curso>

la shell bash enva entonces el mensaje de la lnea 2, diciendo que no ha encontrado el comando. Si
este fuera el caso (configuraci
on por defecto de la shell bash), se puede instruir a la shell que buesque
el binario del comando a ejecutar en el directorio corriente, lo que se hace anteponiendo al comando
el smbolo ./
cardon@cardo:~/cursoC/curso > ./saluda
Hola todos.
cardon@cardo:~/cursoC/curso >

1.14.4

Depuraci
on de errores

Una vez que podemos ejecutar el programa tendremos que ocuparnos de la depuracion de errores,
que generalmente es un etapa mucho mas larga que la de desarrollo del programa. Luego veremos
herramientas que nos pueden ayudar con la tarea.
Como recomendacion a los principiantes, y a los que no los son, no debe escribir un programa de
muchas lneas para luego compilar todo el conjunto. Usualmente quedara apabullado por la multitud
de errores. Compile de pocas lneas por vez, y ay
udese con los mensajes de error para depurar su
c
odigo, luego continue con la edici
on. Para esto es sumamente u
til trabajar con dos ventanas, una
para la edici
on y otra para la complilacion y ejecuacion.
Le doy dos consejos. El primero

Avance sobre seguro!


avance de a poco.
y compile y corrija sus errores sint
acticos mientras est
a trabajando en el mismo c
odigo que los produce.
El segundo, para cuando ya sea un mas avezado programador, es un viejo dicho, o principio, que data
de los a
nos 60. Mant
engalo Est
upidamente Simple!. En su versi
on original en ingles, el dicho
se conoce como el principio KISS, Keep it Stupid Simple o en su versi
on mas agresiva, sin animo
de ofender, Keep it Simple, Stupid!. Volveremos mas sobre este principio cuando hablemos de
funciones.

cursoC/curso/lenguajeC.tex -August 23, 2012

1.15

xxi

Un programa b
asico

Un programa en C consiste en una o mas funciones. Por lo menos debe existir una funci
on, la
funci
on principal que se denomina main. La funci
on main contiene las sentencias o instrucciones que
ejecutaran las tareas encomendadas a nuestro programa. Las sentencias son a su vez combinaciones
de constantes numericas o alfanumericas, variables y operadores que expresan las instrucciones que se
necesita ejecutar para llevar adelante la marcha de un algoritmo.
Si el prop
osito es llevar al estudiate a una rapida idea del lenguaje y como se puede escribir programas
con el y realizar tareas dentro de su dominio de aplicacion, resultara tedioso y poco instructivo
describir en mucho detalle las partes constituyentes del lenguaje, terminos tales como funciones,
variables, operadores, tipos de datos, etc. Por ello, al estilo de K&R supondre que el estudiante tiene
un conocimiento general de todos estos terminos y su significado, para pasar a mostrar inmediatamente
c
omo es un programa en C. Luego podremos ir a los detalles.
La funci
on principal, ademas de su encabezamiento y cuerpo, se escribe introduciendo sentencias o
instrucciones, que son las unidades b
asicas del mismo. Cuando el programa se ejecuta, estas sentencias
se ejecutan una por una en forma secuencial
Existen dos clases de sentencias
Sentencias de expresi
on.
Sentencias de control de flujo.
La sentencias correspondientes a la primera categora se utilizan para asignar valores a una variable,
para declarar variables, evaluar expresiones, llamar a funciones, etc.. Se distinguen sint
acticamente
por que terminan con un caracter especial, el terminador, que en C es el signo de punto y coma,;.
Algunos ejemplos son los siguientes
i=0;
i=i*1;
j= i++;
x = sqrt(a*a + b*b);
printf("Hola\n");
Una sentencia de expresion puede usarse para calcular expresiones matematicas simples o complejas,
pero siempre queda definida por la existencia del terminador.
Las sentencias de control de flujo no tienen como prop
osito llevar a cabo alguna operaci
on, como
las anteriores, sino controlar el flujo de programa, es decir el orden, y la cantidad de veces o la
condicionalidad con que otras sentencias del programa se ejecutaran.
Algunos autores distinguen una categora adicional, las sentencias combinadas. Estas son todas
aquellas que constituyen un bloque encerrado por un par de llaves.
El siguiente es el c
odigo fuente de un programa sencillo en C, cuyo objetivo es asignar sucesivamente
un valor creciente a una variable i e imprimir ese valor en la terminal
1
2
3
4
5
6
7
8
9

#include <stdio.h>
/* imprime una lista de numeros */
main ()
{
int i;
for (i=0; i<10; i=i+1)
printf("i es %d\n",i);
return 0;
}

Las partes de este programa son, en la lnea 1 una directiva al preprocesador. En la lnea 2 un letrero
con el nombre del programa. En la lnea 3 la llamada a la funci
on main, funci
on de mayor jerarqua

xxii
de todo programa C. La definicion de la funci
on main ocupa todo el resto del programa, desde la
lnea 3 hasta la lnea 9. Las llaves que se abren en la lnea 3 y se cierran en 9 constituye un bloque
de sentencias, que en este caso son el cuerpo de la funci
on main. En la lnea 5 se declara la variable
i. La declaraci
on de una variable origina que se reserve memoria para ella y se asocia el nombre de
la variable al contenido de esa memoria. En la lnea 6 comienza un sentencia de control de flujo, la
sentencia for que permite hacer una repetici
on controlada de la sentencia que est
a inmediatamente
debajo de ella. En la lnea 7 se llama a una funci
on, la funci
on printf de la librera de entrada y
salida stdio.a cuyos prototipos se encuentran en el archivo stdio.h, que sera incluido en el texto del
programa por el preprocesador a instancias de la directiva de la lnea 1. Finalmente, en la sentencia
8 se devuelve el control a la shell.
Una vez escrito el programa debe ser compilado para que pueda ejecutarse.
cardon@cardo:~/cursoC/curso > gcc -o cuenta cuenta.c
y finalmente puede ejecutar el programa. En el listado siguiente se muestra la invocacion del programa
y su salida en la terminal
cardon@cardo:~/cursoC/curso > cuenta
i es 0
i es 1
i es 2
i es 3
i es 4
i es 5
i es 6
i es 7
i es 8
i es 9
cardon@cardo:~/cursoC/curso >

1.15.1

Mensajes del compilador

Es sumamente frecuente que al programar se cometan errores de sintaxis. Al contrario de lo que ocurre
con los lenguajes de programacion interpretados, como por ejemplo QBasic, en el que el entorno de
desarrollo y el editor detecta inmediatamente un error de sintaxis, y como en nuestro caso se trabaja
con un editor de texto com
un, este no puede detectar los errores de sintaxis cometidos. Estos errores, si
los hubiera, son detectados en la etapa de compilaci
on y son listados por el compilador en la terminal.
Para mostrar un ejemplo, si se suprime el terminador en la sentencia de declaracion en la lnea 5 de
programa anterior, la compilaci
on dar
a el siguiente mensaje de error
ardon@cardo:~/A-cursos/cursoC/curso/programas> gcc -o cuenta cuenta.c
cuenta.c: En la funci
on main:
cuenta.c:6: error: error sint
actico before "for"
cuenta.c:6: error: i undeclared (first use in this function)
cuenta.c:6: error: (Each undeclared identifier is reported only once
cuenta.c:6: error: for each function it appears in.)
cuenta.c:6: error: error de decodificaci
on before ) token
cardon@cardo:~/A-cursos/cursoC/curso/programas>
El mensaje da cuenta de que en el c
odigo cuenta.c, en la lnea 6 de la funci
on main, existe un error
sint
actico. Que el error se ha cometido antes de for. Avisa tambien que la variable i no ha sido
declarada. Observe que en este caso el error no est
a en la lnea 6, sino en la lnea anterior, pero como
no hay nada antes de for usted puede suponer que el error est
a en la lnea previa. Corregido el error,
si la compilaci
on es exitosa, no da ning
un mensaje de ning
un tipo.
Cometamos otro tipo de error frecuente. Omitamos la declaracion de la variable i.

cursoC/curso/lenguajeC.tex -August 23, 2012

xxiii

cardon@cardo:~/A-cursos/cursoC/curso/programas> gcc -o cuenta cuenta.c


cuenta.c: En la funci
on main:
cuenta.c:6: error: i undeclared (first use in this function)
cuenta.c:6: error: (Each undeclared identifier is reported only once
cuenta.c:6: error: for each function it appears in.)
cardon@cardo:~/A-cursos/cursoC/curso/programas>
Nuevamente, el mensaje avisa que en el programa cuenta.c en la lnea 6 la variable i, usada por
primera vez aqui, no est
a declarada (undeclared). Luego el mensaje le advierte que cada variable no
declarada (undeclared identifier) sera reportada solo una vez, por cada funci
on en la que aparezca.
Otro error com
un, al menos para quienes programa en otros lenguajes, es cambiar los separadores
dentro de la sentencia de control del for. Por ejemplo, si en la lnea 6 escribimos
for (i=0; i<10,i=i+1)

// error: note que se ha substitudi ; por ,

cardon@cardo:~/A-cursos/cursoC/curso/programas> gcc -o cuenta cuenta.c


cuenta.c: En la funci
on main:
cuenta.c:6: error: error de decodificaci
on before ) token
cardon@cardo:~/A-cursos/cursoC/curso/programas>
En esta caso, el mensaje avisa que el error se cometio antes del signo ).

1.16

Partes de un programa en C

Un programa fuente en C se divide en dos partes completamente distintas, no obstante ambas coexisten
en el mismo archivo con el c
odigo fuente:
La secci
on de directivas al precompilador
La secci
on del c
odigo fuente propiamente dicho
Cada una de estas partes tiene prop
ositos diferentes y seran procesadas por programas diferentes.
Como ya habamos anunciado, la compilaci
on se realiza en varias etapas. Todas ellas son lanzadas
una a continuacion de otra cuando se usa el comando gcc como en los ejemplos precedentes. No
obstante, en cada una de estas etapas se realizan tareas distintas y estas son realizadas por programas
distintos.
La primera de estas tareas es justamente la de preprocesamiento. La segunda es la tarea de
compilaci
on. En realidad esta segunda etapa abarca varias fases que veremos en seguida. Tiene por
objeto construir un programa ejecutable.

1.16.1

Directivas al preprocesador

Los programas en C requieren por lo general la inclusi


on de c
odigo estandar, previamente escrito,
relacionado a las funciones provistas en libreras, y que sera sumamente tedioso tener que incluir
manualmente en cada caso. Este es un ejemplo tpico de trabajo que puede realizar el preprocesador.
Un ejemplo de directiva al compilador se vi
o en la lnea 1 del programa anterior, en donde la directiva
#include instruye al preprocesador la inclusi
on del archivo stdio.h.
El programa preprocesador, llamado cpp, distingue las directivas que van destinadas a el por el smbolo
# que las precede. El programa cpp es lanzado autom
aticamente por el programa compilador por lo
que, por lo general, no debemos preocuparnos por el.
Las directivas comienzan con el smbolo # y tienen una sintaxis de lnea, lo que significa que la
directiva termina al final de la lnea. Todo lo que no este precedido por el smbolo # sera procesado
por el compilador.

xxiv
Como en el ejemplo presentado como motivaci
on, una de las tareas principales del preprocesador es
hacer substituciones textuales, es decir, cambiar en el c
odigo las directivas por texto, que el procesador
buscar
a en lugares predeterminados. Existen otras tareas del preprocesador, como hacer compilaciones
condicionales.
Inclusi
on de archivos
Una de las directivas mas comunes, como digimos, es la de substitucion de archivos, la directiva
include.
Para poder hacer uso de ciertas funciones de librera, muy comunes, C requiere que los llamados
prototipos (ya veremos luego que son) de esas funciones esten precentes al comenzar el c
odigo fuente.
Como sera muy tedioso tener que escribirlas cada vez, estos prototipos se hallan disponibles en los
llamados archivos de encabezado. Los archivos de encabezados son archivos est
andares que acompa
nan
a cada librera de subrutinas, y se los identifica con la extensi
on h, (del ingles header, encabezados).
Los archivos de encabezados est
an escritos, por supuesto, en C.
Las dos directivas siguientes hacen que el contenido de los archivos de encabezados, encabezado.h,
sean incluido en el archivo con el resto del programa
#include <encabezado.h>
#include "encabezado.h"
N
otese la diferencia de sintaxis en una y otra directiva. En una el nombre del archivo est
a encerrado
entre los smbolos de menor y mayor, < >, en la otra entre comillas, " ". Ambas causan que el contenido del archivo encabezado.h sea leido e incuido en el lugar del programa donde se encuentra la
directiva include. En la primera versi
on de la directiva, en la que se uso < encabezado.h>, el preprocesador busca el archivo en el directorio estandar, que en el sistema SUSE LINUX es /usr/include
o alguno de sus subdirectorios
En la segunda, el archivo encabezado.h se busca en el directorio de trabajo corriente. La primera se
usa para las subrutinas est
andares de C, mientras que la segunda se usa para subrutinas de nuestro
propio desarrollo que no hayamos puesto todava en una ubicacion estandar.
El ejemplo tpico es el de la directiva
#include <stdio.h>
que tenemos que poner en casi cualquier programa de C.
Bajo el control de esta directiva el preprocesador subtituye la directiva por el contenido del archivo
stdio.h, (standar input output), entradas y salidas est
andares, un archivo de declaraciones que corresponde a la librera de funciones de entrada y salida de C.
Terminado el preprocesamiento, el archivo resultante que contiene solo c
odigo C, es pasado al compilador.
Existen tres clases de substituciones textuales
inclusi
on de archivos
substituci
on de macros
compilaci
on condicional
Veremos las dos u
ltimas mas adelante.
Definici
on de macros
La directiva define es otra muy usada. Con ella se pueden dar un nombres a constantes de uso
frecuente. En el programa podemos usar ahora el nombre otorgado en vez de la cosntante. Antes de

cursoC/curso/lenguajeC.tex -August 23, 2012

xxv

la compilaci
on, el preprocesador reemplazara la ocurrencia del nombre (substitucion textual) por el
valor de la constante.
Por ejemplo
1
2
3
4
5
6
7
8

#include <stdio.h>
#define PI 3.141592653589793
main ()
{
...
theta_gardos=theta_rad* 180 / PI;
...
}

Dejaremos para mas adelante el desarrollo de macros mediante esta directiva.

1.17

La funci
on principal.

Un programa C consiste en una o mas funciones o modulos. La funci


on es la unidad estructural mas
grande de un programa C. La funci
on principal, la funci
on main siempre debe estar presente.
Por ejemplo, el siguiente c
odigo fuente representa el esqueleto de la funci
on main
1
2
3

main ()
{
}

Las llaves delimitan el cuerpo o bloque definitorio de la funci


on. Entre ellas se escriben las sentencias
que realizar
an la tarea de la funci
on. En este caso, el cuerpo de la funci
on est
a vaco. Aunque el
c
odigo mostrado no hace nada, es una funci
on principal valida, y sera correctamente compilada. El
binario resultante podra ser ejecutado por el sistema operativo.
Apenas mas realista, el programa hola.c ya visto
1
2
3
4
5

#include <stdio.h>
main ()
{
printf(hola mundo \n);
}

Ahora el cuerpo de la funci


on principal contiene una sentencia que imprimira nuestro saludo.
Decamos que un programa C consiste en una o mas funciones. Para ejemplificar que significa esto
considere el siguiente c
odigo
1
2
3
4
5
6
7
8
9
10

#include <stdio.h>
void mifunci
on()
{
printf(hola mundo desde mi funcion\n);
}
main ()
{
printf(hola mundo desde la funcion main\n);
mifunci
on();
}

las lneas 2 a 5 definen la funci


on mifuncion, mientras que las lneas 6 a 10, definen la funci
on main.

xxvi
El orden en que se han dispuesto las dos funciones se debe a que el compilador requiere saber de las
funciones que posiblemente seran llamadas a ejecutarse antes de que estas sean llamadas en el c
odigo
que las llama.
Es posible avisar al compilador que usaremos la funci
on mifuncion y como se usa, escribiendo el
prototipo de la misma antes de la funci
on main, luego podemosescribir la definicion de la funcion en
cualquier sitio. Personalmente prefiero esta u
ltima forma de trabajar.
1
2
3
4
5
6
7
8
9
10
11

#include <stdio.h>
void mifunci
on();
// prototipo de la funcion mifuncion
main ()
{
printf(hola mundo desde la funcion main\n);
mifunci
on();
}
void mifunci
on()
{
printf(hola mundo desde mi funcion\n);
}

La lnea 2 es el prototipo de la funci


on mifuncion. Indica el nombre y los par
ametros que usa. Indica
tambien que tipo de valor devuelve la funci
on, en este caso la devoluci
on es vaca. El prototipo de una
funci
on es una sentencia de declaracion y por lo tanto lleva el smbolo de terminaci
on. Por el lugar
de la declaraci
on de funci
on, antes de la funci
on main el ambito de la funci
on declarada es gobal es
decir se puede usar en todo el programa y podra ser llamada por cualquier otra funci
on del programa.
Ampliaremos mucho mas este tema en el captulo 5.
La tarea que debe realizar la funci
on debe definirse en el cuerpo de la funci
on. En los ejemplos
precedentes la tarea fue imprimir un mensaje (en el caso de mifuncion) e imprimir un mensaje y
llamar a otra funci
on en el caso de main.

1.18

Sentencias o instrucciones

La sentencia o instrucci
on ([? ]) es la unidad mnima que hace que la computadora ejecute alguna
accion.
Las sentencias son combinaciones de variables, constantes y operadores (veremos ahora los de asignacion y aritmeticos) y expresiones en general. No hemos definido todava estos terminos, por lo que
usaremos el concepto preexistente de ellos, hasta que podamos hacerlo correctamente. Mientras tanto
baste el siguiente ejemplo
1
2
3

float a,b;
a=5.;
b= a + 4.5;

en a lnea 1 se declara el uso de dos variables, a y b. La declaracion obligar


a al compilador a reservar
lugar en la memoria para alojar valores de tipo de punto flotante es decir, n
umeros reales. En este
caso, nos se asigna en esta sentencia ning
un valor a las variables. En la lnea 2, en cabio, se asigna el
valor 5. a la variable a. El valor 5. es una constante. Esta constante tambien es de tipo de punto
flotante. En lo sucesivo, en el programa, se podra hacer referencia a al valor almacenado invocando
el nombre de las variables. En la lnea 3 se utiliza un operador, el operador adici
on, para sumar al
valor de la variable a el valor de la constante 4.5. El resultado de la expresion a + 4.5 se asignar
aa
la variable b.
Las sentencias de invocacion o llamada a otras funciones como las ya vistas son tambien sentencias:
1
2

printf(hola mundo desde la funcion main\n);


mifunci
on();

cursoC/curso/lenguajeC.tex -August 23, 2012

xxvii

Las sentencias pueden clasificarse8 en tres clases:


simples
compuestas
de control de flujo.
Sentencias simples
Todas las sentencias simples se terminan con el smbolo de terminaci
on, con un punto y
coma.
La gran mayora de sentencias simples son sentencias de asignacion o llamado a funciones. Las
sentencias de asignacion son aquellas que se utilizan para asignar un valor a una variable. En cambio,
los llamados a funciones son sentencias por los cuales se llama a un procedimiento para que realice la
accion programada en el mismo.
Las sentencias simples pueden ser de dos tipos:
sentencias de declaraci
on
sentencias de asignacion (instrucciones propiamente dichas).
Las sentencias de declaraci
on son aquellas en las que se declaran e inicializan variables o funciones.
Vimos ya los ejemplos
1
2

void mifuncion();
float a,b;

en el primero se declara el uso de la funci


on mifuncion y en el segundo el uso de las variables a y b.
En C, como en Pascal, todas las variables, antes de poder usarlas, deben ser declaradas, o presentadas.
Con esta accion el compilador guarda un lugar en la memoria para ellas, acorde al tipo de variable de
que se trate y reserva el nombre de la variable, que ya no puede usarse en otra declaracion dentro del
mismo rango de visibilidad.
Las sentencias de asignaci
on o sentencias de instrucci
on son aquellas por las cuales se instruye
al compilador a efectuar alguna accion, por ejemplo, una asignacion, el c
alculo de una expresion, la
llamada a una funci
on, etc.
1
2

a=5.;
b= a + 4.5;

Las llamadas a una funci


on son tambien sentencias simples, aunque no entran en la categora de
asignacion.
1
2

printf(hola mundo desde la funcion main\n);


mifunci
on();

Sentencias compuestas
Las sentencias compuestas son grupos de sentencias simples o de otro tipo que se encierran entre
llaves. Al final de la llave no se requiere el smbolo de terminaci
on. A tal grupo le denominanmos
tambien un bloque de sentencias. Tomemos por ejemplo la siguiente funci
on matematica
A = (1 0.1|P e|)5
que puede programarse de la siguiente manera:
8 La

definici
on de sentencia simple es mia.

(1.6)

xxviii
1
2
3
4
5
6
7

float A,pe;
...
{ float pe; // pe es una variable auxiliar, solo tiene existencia dentro del bloque
p=fabs(Pe);
pe=(1.-0.1*pe);
A=pow(pe,5.);
}

cada una de las lneas, de 3 a 7, son sentencias simples. La primera es una sentencia de declaracion
de la variable auxiliar pe. Como la variable pe est
a declarada dentro del las llaves, su existencia y
visibilidad de la misma esta restringida al entorno demarcado por ellas, es decir al bloque de sentencias.
Sentencias de control de flujo
Las caractersticas de los lenguajes de programacion tales como C, Fortran, Basic, Pascal, etc, hacen
que la mayora de las sentencias simples se vayan ejecutando una despues de otra de manera secuencial. No obstante, se puede requerir que algunas sentencias se realicen repetidas veces y que otras se
realicen en forma condicional. Para ellos existen las sentencias de control de flujo.
Una sentencia de control de flujo tpica es la sentencia for que vimos ya en nuestro ejemplo inicial
1
2
3
4

...
for (i=0; i<10; i=i+1)
printf("i es %d\n",i);
...

o la sentencia if. La sintaxis de las sentencias de control de flujo es mas complicada que la de la
sentencias simples y la estudiaremos a fondo en el captulo 3.

1.18.1

Expresiones

Una expresion es una combinaci


on de variables constantes y operadores. Por ejemplo
45.0
a+b
R* pow(a,b)
i++
i+1
A
las expresiones se usan de diversas maneras en la construcci
on de sentencias simples, o de control de
flujo.

1.18.2

Sentencias de asignaci
on

En C se utiliza el operador igual para asignar un valor a una variable, de la misma manera que se
hizo en la inicializacion de variables.
Los siguientes son ejemplos de sentencias de asignacion
a=1.0;
b=1.0 + c;
area =pi * R*R;
char=A
en estos casos la sintaxis es

cursoC/curso/lenguajeC.tex -August 23, 2012

xxix

variable = expresi
on ;
Aunque usamos el operador = para representar la asignacion, su sentido es distinto al que el mismo
signo tiene en matematica. Una expresion matematica como la siguiente
a=b

(1.7)

significa que la variables a y b son iguales. En cambio la asignacion


a=b;
es una orden que indica al SO que copie el contenido de la memoria asociada con la variable b a la
memoria asociada con la variable a. Antes de la sentencia los valores de a y b pueden diferir, luego
de la sentencia ambos tienen el mismo valor.
Una expresion como la siguiente
a=a+1

(1.8)

no tiene sentido matematico, es siempre falsa. Cualquiera sean los valores de a, nunca puede ser que
a sea igual a si misma mas uno. En cambio la sentencia
a=a+1;
si tiene sentido como asignacion. Esta ordena que se sume uno al valor de a y luego se asigne el
resultado a la variable a.

1.19

Elementos l
exicos

Todo lenguaje (incluidos los de programacion) tienen elementos l


exicos, es decir, nombres o palabras
con un significado predefinido. Estas palabras solo pueden usarse para el prop
osito predeterminado,
por ello se denominan tambien palabras reservadas. Las palabras reservadas de C son las siguientes:
auto
break
case
char
const
continue
default
do
double
else
enum

extern
float
for

sizeof
static
struct

goto
if
int
long
register
return
short
signed

switch
typedef
union
unsigned
void
volatile
while

Por ejemplo, auto o for son palabras reservadas. S


olo se puede usar para el prop
osito que fue dise
nada.
No la podremos usar entonces como nombre de una variable definida por el usuario ni de ninguna otra
manera.
Si estuvieramos trabajando con una base de datos relacionada con autom
oviles, tendramos que tener
cuidad con la palabra auto. Podramos usar variables que se denominen automovil, o vehiculo o la
que se nos ocurra. Tampoco, no podramos usar la palabra for como variable. Estara bien usar For
que es una palabra distinta.

1.20

Tipo de datos b
asicos y operadores

Un programa se usa en general para manipular y procesar datos de diversos tipos. Por ejemplo
nombres de personas son datos de tipo alfaum
ericos mientras que la edad de las personas es un dato
de tipo num
erico. Estas dos son las dos grandes categoras de datos que puede manejar C.

xxx
Se define como tipo a la carcaterstica que define la clase de datos se puede representar con una
determinada constante o variable. Las constantes y variables de C deben tener un tipo predeterminado.
El tipo de una variable determina que clase de valores puede tomar y las operadores que pueden
efecturase sobre ella.
Pongamos por ejemplo un dato numerico. Este podra ser un n
umero entero o real, podra ser un
n
umero grande o peque
no. La representacion de n
umeros enteros en una computadora es econ
omica
y las operaciones con ellos son rapidas y exactas. En cambio la representacion de n
umeros reales requiere mas memoria y tiene una organizaci
on mas complicada. En algunos lenguajes de programacion
(Mathematica por ejemplo) se puede representar n
umeros de cualquier tama
no con cualquier n
umero
de cifras significativas. En cambio, para la mayora de los lenguajes de uso com
un como C (Fortran,
Basic, Pascal, Java) esto no es as. Existen varios tipos de datos reales, pero cada uno de ellos tiene
un tama
no maximo predefinido y ademas tiene un n
umero predeterminado de cifras significativas que
puede almacenar. Las operaciones con estos n
umeros no son exactas y son mas costosas (en tiempo
de procesador) cuanta mas precisi
on se requiere.
Usamos las constantes de C para representar valores inalterables en el desarrolo de nuestro programa, en muchos casos representan datos fsicos (u de otro tipo) que tampoco cambian en la realidad
representada por el programa. Por ejemplo el n
umero o el n
umero e, el n
umero 2 o cualquier otro,
un valor de la conductividad termica de un material en particuar, etc.
Usamos la variables para representar datos que cambiaran en el desarrollo de nuestro programa. El
siguinete jemplo muestra el uso de ambas
1
2
3
4
5
6
7
8
9

#include <stdio.h>
main ()
{
float theta_grados=0, theta_rad=0;
scanf(Entre theta_rad;&heta_rad);
...
theta_grados=theta_rad* 180 / 3.141592653589793;
...
}

podemos identificar dos constantes, 180, de tipo entera y la constante 3.141592653589793 de tipo
real. Diferenciamos un tipo del otro por la presencia o ausencia del punto. Por otro lado usamos las
variables theta_grados y theta_rad para valores que eventualmente podran cambiar en el desarrollo
del programa. De hecho la sentencia de la lnea 4 cambia el valor de la variable theta_rad y en la
lnea 6 lo hace con el de theta_grados.

1.20.1

Tipos de datos

Los tipos de datos mas importantes y su identificador son


entero, int.
punto flotante, float
caracter, char
Los datos de tipo entero y de punto flotantes sirven para representar valores numericos enteros y reales
respectivamente. Mientras que los datos de tipo caracter sirven para representar los caracteres del
c
odigo ASCII.
Cada uno de estos tipos principales tiene sus variantes, por ejemplo, los enteros, tienen las siguientes
variantes: cortos (short), enteros sin signo (unsigned int) y enteros largos (long int). Usamos
distintos tipos de variables para guardar distintos tipos de valores, por ejemplo, si uso una variable
como un contador, sera suficiente que use un entero o un entero largo, siempre y cuando los objetos
que se cuentan no excedan los valores lmites para la variable en cuestion. Usar la variable adecuada
a su funci
on har
a nuestro programa mas peque
no y eficiente.

cursoC/curso/lenguajeC.tex -August 23, 2012


Tipo
char
short
int
unsigned int
long int
float
double
long double
enum

Tama
no en bytes
1
2
2
2
4
4
8
10

Nombre
caracter
entero corto
entero
entero s/signo
entero largo
punto flotante
doble precisi
on
doble precisi
on

xxxi
lmites garantidos
0...255
-128 ...127
-32768...+32767
0...65535
-2147.483.64...+2147.483.647
3.4 1038 ...3.4 1038
1.7 10308
1.7 10308

Table 1.1: Tipos de datos.

En general las operaciones con punto flotante son mucho mas costosas que las operaciones con enteros.
Por lo que debemos preferir estas u
ltimas en ocasiones en donde esto sea posible y represente un ahorro
de tiempo de computacion. Un caso muy com
un ocurre en las expresiones de control en sentencias de
control de flujo donde se usa con frecuencia operaciones sencillas como i=i+1 o i=i*5 pero que deben
repetirse muchas veces. En este tipo de operaciones se prefiere siempre que sea posible variables de
control enteras.
La tabla 1.20.1 muestra los tipos de variables que dispone el Lenguaje C. La u
ltima columna da el
rango de valores que puede aceptar una variable. Este rango es el mnimo que debe garantizar una
implementacion de C para cumplir con el estandar. Cabe notar que C no tiene datos de tipos logicos.
El tipo de las constantes depende de como se las escriba. En general, para el caso de las constantes
numericas, la asusencia de punto indica una constante entera y su presencia una constante flotante.
Veremos en seguida como forzar el tipo de constantes en los casos particulares.
El tipo de una variable se estable en la declaracion de las variables. Las variables en C deben ser
declaradas. la declaraci
on es una sentencias especial por la cual se ordena al compilador que reserve
el nombre y la cantidad de memoria requerida por el tipo de variable delarada. Veremso los detalles
mas adelante con el estudio particular de las variables.

Enteros (int)
Los enteros son el tipo de dato numerico mas peque
no. Su uso mas com
un es como contadores en
lazos y como ndices de arreglos o formaciones (vectores y matrices), y como punteros (si se quiere una
variaci
on de los ndices, caracterstica propia de C) El ejemplo siguiente se muestra el uso de varios
enteros.

1
2
3
4
5
6
7
8
9

#include <stdio.h>
/* imprime una lista de numeros */
main ()
{
int i;
for (i=0; i<10; i=i+1)
printf("i es %d\n",i);
return 0;
}

En la lnea 6, se usa en el lazo for las constantes enteras 0, 10 y 1. En al lnea 5 se declara la variable
entera i, mientras que se la usa en las tres expresiones de control del for, en la lnea 6, y se imprime
su valor en a lnea 7. El smbolo %d es un control de formato para la impresion de variables enteras.

xxxii
char
int
short int
long int
unsingned int
float
double
long double

no requiere
L
U
no requiere
por defecto
L

Table 1.2: Tipo de constantes.

1.20.2

Constantes

Una constante es un valor inmediato, absoluto que puede encontarse en una expresion. Las constantes
tambien responden a la tipificacion anterior, de manera que tendremos constantes de tipo entero,
caracter, flotante, etc.
El tipo de una constante queda definido por un smbolo agregado al final del n
umero, en el caso de
las constantes numericas
pi=3.1416;
a= 7.0 * b;
Aqu las constantes son 3.1416 y 7.0. Las constantes pueden ser de cualquier tipo: escribiremos 7
como constante en todos los tipos posibles:
a=
a=
a=
a=
a=
a=
a=

7;
7L;
7.;
1e4;
7UL;
07;
0X7;

/*
/*
/*
/*
/*
/*
/*

constante de
constante de
constante de
constante de
constante de
octal
exadecimal

tipo
tipo
tipo
tipo
tipo

integer
long integer
float
float
unsigned long

*/
*/
*/
*/
*/
*/
*/

Caracteres y cadenas constantes


Una constante de caracter es cualquier caracter del c
odigo ASCII entre comillas simples, as en el
ejemplo siguiente se asignan distintos caracteres del c
odigo ASCII a la variable a
char a
a=a /* la variable a contiene el caracter a, octal */
a=A
a=9
a=/
La tabla completa con el c
odigo ASCII se da en el apendice ??.
Pueden tambien asignarse valores del c
odigo ASCII extendido...

1.20.3

Cadenas de caracteres

Una cadena de caracteres es un conjunto de caracteres alfanumericos encerrado entre comillas dobles.
Una constante de cadena se define encerrando entre comillas (dobles) cero, uno o mas caracteres.
""

cursoC/curso/lenguajeC.tex -August 23, 2012


\a
\b
\f
\n
\r
\t
\v
\\
\?
*
\

xxxiii

alarma sonora
retoceso de espacio
avance de p
agina
retorno de carro y nueva lnea
control de carro
tabulacdor
tabulador vertical
barra inclinada (backslash)
signo de pregunta (cierre)
apostrofe
comilla doble

Table 1.3: Caracteres de control


"A"
"Hola"
"Esto es Todo"
A los caracteres alfanumericos delimitados por las comillas, el compilador egrega al final el caracter
nulo del c
odigo ASCII. De esta manera, una cadena de caracteres siempre tiene al menos un elemento,
como en le caso de la primera lnea del ejemplo anterior.
El caracter nulo es el terminador de la cadena de caracteres.
Cuando se habla de longitud de una cadena nos referimos al n
umero total de caracteres sin tener
en cuenta al caracter terminador nulo.
Para introducir caracteres de difcil tipeado (secuencias o caracteres de escape) se usa la barra \
Debe tenerse en claro la diferencia entre cadenas y caracteres:
caracter. Se refiere a un caracter, se delimita con comillas simples.
cadena. Se refiere a un agrupamiento, secuencia o arreglo de caracteres que puede tener cero o mas
elementos, se delimitan con comillas dobles.

1.21

Variables

Las variables nombres que asociamos a lugares en la memoria en donde guardaremos alg
un dato, sea
este numerico o alfanumerico. Requieren un nombre o identificador y deben declararse de alguno
de los tipos vistos previamente.
En C no se puede usar ninguna variable que no haya sido declarada anteriormente.

1.21.1

Declaraciones

En la etapa de compilaci
on la declaracion le anuncia al compilador que se usara una variable con tipo
y nombre determinado y el compilador asigna un lugar de memoria para ella.
La sintaxis de una sentencia de declaracion de una variable es la siguiente
tipo identificador_v1,...identificador_vn;
donde identificador_v1 es el identificador o nombre de la priemra variable y asi.
Los siguientes son ejemplos de declaraciones
int i;

/* se declara la variable i de tipo entero */

xxxiv
int i,j;
float x;
char nombre;

/* se declaran las variables enteras i y j


/* se declara la variable x de tipo flotante */
/* se declara la variable nombre de tipo caracter */

Tipos de variables
La variables se declaran de distinto tipo seg
un el tipo de valor que querramos almacenar en ella.
El lugar de la declaraci
on es significativo. El lugar donde se declara define la visibilidad y la vida u
til
de la variable (veremos esto con mas detalle en la secci
on 5.7. Puede hacerse
al comienzo de una funci
on.
al comienzo de un bloque (cualquier parte del c
odigo encerrada entre parentesis).
fuera de cualquier funci
on.
El lugar en donde se declara una variable controla la visibilidad y la vida u
til de una variable. Veremos
estos conceptos en el captulo correspondiente a funciones.
Las variables deben declararse por que:
Facilita las cosas la compilador
Disciplina al programador
El compilador protestar
a si no se declara, impidiendo la concreci
on de un programa ejecutable.
El siguiente es un ejemplo en el que se muestra los mensajes del compilador al intentar compilar un
programa en el cual se ha omitido declarar la variable nota,
if.c: In function main:
if.c:8: nota undeclared (first use in this function)
if.c:8: (Each undeclared identifier is reported only once
if.c:8: for each function it appears in.)
Todas las lneas de error comienzan con if.c, el n
ombre del archivo donde reside el c
odigo fuente
compilado. La primera lnea indica que el error se produce en la funci
on main. La segunda lnea nos
dice que la variable nota no fue declarada, y que se usa por primera vez en esta funci
on. Las otras dos
lneas nos anuncia que cada identificador no declarado (como nota en este caso), solo sera reportado
una vez en esta funci
on.

1.21.2

Nombre de las variables

Los nombres de las variables se denominan tecnicamente identificadores. Pueden ser


Letras, n
umeros, raya de subrayado
Deben comenzar con letras
Pueden ser largos, pero el compilador no est
a obligado a registar nombres largos en su totalidad
La capitalizaci
on es significativa, como en Unix/Linux
No se pueden usar las palabras reservadas del lenguaje

cursoC/curso/lenguajeC.tex -August 23, 2012

xxxv

Como regla general, los nombres de las variables que se utilizan en un programa, deben estar relacionados con el nombre de la cantidad que representan. Consideremos las siguiente relacion
P = mg

(1.9)

la variables que intervienen en la relacion son P , m, g. Esta formula, en el contexto de la mecanica da


el peso P de una masa m en un campo gravitatorio cuya aceleraci
on es g. El c
alculo del peso podra
escribirse en las siguientes sentencias de C
1
2
3
4
5
6
7
8
9

float P,m,g;
//P, Peso, Newton
//m, masa, kg
//g, aceleraci
on, m/seg^2
.
.
.
P=m*g;

esta sentencia debera ser f


acil de leer e interpretar por cualquier estudiante de fsica que sepa que el
problema que est
a resolviendo y programando es un problema de mecanica. Si se quisieera ser mas
claro, podra escribirse
1
2
3
4
5
6
7
8
9

float Peso,masa,gravedad;
//Peso, fuerza, Newton
//masa, masa, kg
//gravedad, aceleraci
on, m/seg^2
.
.
.
Peso=masa*gravedad;

Consideremos otro ejemplo. En la siguiente relacion


Nu =

hD
k

(1.10)

las variables de nuestro problema son N u, h, D, k. En el contexto fsico de donde proviene, el estudio
la transferencia de calor, N u, es el n
umero de Nusselt, h es el coeficiente de transferencia de calor,
D es una longitud caracterstica, y a deducir de la notaci
on es probablemente el diametro, k es la
conductividad termica.
Probablemente, la interpretaci
on en C mas adecuada, concisa, directa es
1
2
3

float Nu,D,h,k;
...
Nu=h*D/k;

esta utiliza para las variables los mismos nombres que se utilizan comunmente para las cantidades
fsicas. La sentencia sera entendida inmediatamente por cualquier persona que conozca el problema
fsico que se quiere resolver.
Se podra a
nadir, para ayuda del lector menos experto, algunos comentarios con las definiciones de
las variables
1
2
3
4

float Nu,D,h,k;
// Nu numero de Nusselt, adimensional
// D diametro, m

xxxvi
5
6
7
8
9
10

// h coeficiente convectivo, W/m^2 K


// k conductividad t
ermica, W/m K
.
.
.
Nu=h*D/k;

A
un, a expensas de hacer nuestro programas mas verborragico, podemos elegir nombres para nuestras
variables mas explcitos o autoreferentes
1
2
3

float Nusselt,Diametro,coeficiente_convectivo,kconductividad;
Nusselt=coeficiente_convectivo*Diametro/conductividad;

Estos nombres dar


an origen a sentencias mas largas, lo que dificultara la lectura.
Por u
ltimo, debemos evitar utilizar nombres abstractos, sin relacion con el contexto del problema, por
ejemplo,
1
2
3
4
5
6
7
8
9
10

float u,v,w, x;
// u numero de Nusselt, adimensional
// v diametro, m
// w coeficiente convectivo, W/m^2 K
// x conductividad t
ermica, W/m K
.
.
.
u=w*v/x;

este peque
no c
odigo, si bien realiza el mismo c
alculo que los anteriores, es una receta para el desastre.
Salvo que usted tenga una memoria privilegida (a la que seguramente encontrara mejores usos),
necesitar
a llevar tablas de significado de las variables todo a lo largo de su programa y no podra leer
y pensar sus sentencias en terminos fsicos, que es de la manera que se supone piensa o pensar
a usted
muy pronto.

1.21.3

Inicializaci
on de variables

Al declarar una variable puede inicilizarse con alg


un valor determinado. La sintaxis de declaracion
inicializacion es la siguiente.
tipo identificador_v1=constante1,...identificador_vN=conatanteN;
donde constante1 es el valor con que se inicilaiza la variable, y que debe ser del mismo tipo que
aquella. Por ejemplo
int i=0;
int i=1,j=1;
float x=1.5;
char respuesta=S;
Es posible inicializar con una expresion en vez de una constante. La expresion eval
ua el valor con que
se quiere inicializar. La sintaxis es entonces
tipo identificador_v1=expresion,...identificador_vn=expresi
on;
Un ejemplo

cursoC/curso/lenguajeC.tex -August 23, 2012

xxxvii

float R=5.;
float pi=3.151416;
float area=pi*R*R;
aqu la variable area se calcula con la expresion pi*R*R .

1.21.4

Cuando y por que inicializar

necesidad, logica del programa


conveniencia, legibilidad
de fondo, manejo de memoria
Cabe la pregunta de cuando y por que inicializar las variables.
Hay algunas situaciones en donde es evidente la necesidad de la inicializacion de variables
Cuando la variable es un acumulador

1
2
3
4
5
6

float h,x;
float sum=0;
.
.
for (h=0;h<100;h=h+1).
sum=sum + 0.5* h*(fon(x) +fon(x+h))

En otras situaciones no es tan claro, y es una cuestion de preferencia. Considere el siguiente c


odigo
1
2
3
4
5
6

float T,a,b;
int n;
T=2000.;
a=0.1;
b=10.0;
n=50.;

mientras que podemos hacer lo mismo escribiendo


1
2

float T=2000.,a=0.1,b=10.0;
int n=50;

finalmente decida usted cual es mas legible.

1.21.5

Conversi
on entre tipos de datos.

Es usual que el dato contenido en una variable declarada de un determinado tipo deba asignarse a
otra variable declarada de un tipo diferente.

El programador debe tener cuidado al hacer estas operaciones. Un caso comprobado en el que un error
de conversi
on causo perdidas cuantiosas fue la explosion de cohete Ariane 5 en su vuelo de 1996. En este
caso, la lectura de un valor que fue mayor del esperado, origino al ser ser asignado a una variable que no
poda contenerlo, una condicion de error, que al no ser resuelta adecuadamente por el programa, origino
la cada del cohete. Todo el sistema de referencia inercial se desactivo y la nave quedo fuera de control
hasta que se desintegro. (http://www.rvs.uni-bielefeld.de/publications/Incidents/DOCS/ComAndRep/Ariane/Esa/ari
Que ocurre cuando asignamos una constante de un tipo a una variable de otro tipo? En algunos casos
C puede hacer una conversi
on de tipo autom
atica llamada casting. Considere el siguiente ejemplo

xxxviii
float a;
int b=5;
a=b;
C convertira automaticamente el valor entero 5 para asignar el valor de punto flotante 5. a la variable
b. Esto se puede hacer sin problemas por que la variable que recibe la conversi
on es mayor que el dato
convertido. Esta es una conversi
on implcita, ya que no hace falta ning
un operador para realizarla.
No ocurre lo mismo cuando asignamos un flotante a un entero.
1
2
3
4
5
6
7

#include <stdio.h>
main()
{
float a=5.79;
int b=a;
printf("b en main %d\n",b);
}

la salida de este programa es la siguiente


cardon@linux-pijg:~/A-cursos/cursoC/curso/programas> ./cas
b en main 5
cardon@linux-pijg:~/A-cursos/cursoC/curso/programas>
se observa que se perdieron los decimales en la conversi
on.
Otro caso que ocurre con frecuencia es el demostrado en el siguiente programa
1
2
3
4
5
6
7

#include <stdio.h>
main()
{
float a;
a= (1/2) *600.;
printf("a en main %f\n",a);
}

cuya salida es
cardon@linux-pijg:~/A-cursos/cursoC/curso/programas> ./cas2
a en main 0.000000
cardon@linux-pijg:~/A-cursos/cursoC/curso/programas>
evidentemente no se esperaba un cero como salida. El error es facil de explicar. La divisi
on de
enteros entrega como resultado un entero, de manera que no puede alojar un n
umero fraccionario. Al
intentarlo se pierden los decimales.
La solucion es muy simple. Utilice sus constantes num
ericas del tipo adecuado, en este caso
utilice punto flotante en el menos una de las constantes, o mejor a
un en las dos.
Otra forma de forzar un cambio de tipo es especificar el tipo de resultado que se espera anteponiendo
entre parentesis el tipo de constante a converir.
1
2
3
4
5
6
7

#include <stdio.h>
main()
{
float a;
a= (float) 1/2;
printf("a en main %f\n",a);
}

cursoC/curso/lenguajeC.tex -August 23, 2012

xxxix

esto dar
a el resultado esperado. Igualmente
1
2
3
4
5
6
7
8
9

#include <stdio.h>
main()
{
float a;
int b=9,c=5;
a= (float) b/ (float) c;
printf("a en main %f\n",a);
}

No obtante lo dicho, en los ejemplos precedentes no hay ninguna raz


on para no emplear las contantes
y variables del tipo adecuado.

1.21.6

Operadores Aritm
eticos

Utilizamos operadores aritmeticos en la construcci


on de expresiones matematicas. C tiene los operadores tpicos que cabe esperar, para la suma, substracci
on, multiplicacion y divisi
on. No tiene en
cambio el operador de potenciacion.9
Existen tambien los operadores modulo o resto. La tabla siguiente muestra los operadores y sus
smbolos
+
*
/
%

suma
substracci
on
multiplicacion
divisi
on
modulo o resto
No hay exponenciacion

Table 1.4: Operadores aritmeticos

Precedencia y asociatividad
Supongase la expresion siguiente
a + b / c;
surge la pregunta de cual es el orden en que se realizan las operaciones, se suma a y b primero y
luego se divide por c? o primero se devide b por c y se suma a a?. Es inmediato ver que los resutados
seran distintos. Todos los lenguajes de programacion tienen un conjunto de reglas de precedencia
que dirimen la cuestion. Para C la regla es las siguientes
El producto y la divisi
on tiene prioridad frente a la suma o la resta
Que ocure cuando en cambio tenemos solo operadores de igual jerarqua como en el siguiente caso
w=x - y + z;
Suponga que x = 10, y = 5 y z = 4. Si resta y de x, y luego se suma z, el resultado es 9, mientras
que si se suma y a z y se substrae de x, el resultado es 1. Que operaci
on es la que se efect
ua? La
regla de asociatividad determina en que orden se agrupan los terminos y se ejecutan las operaciones.
Estas reglas se dan en la tabla siguiente
9 Debe

llamarse a la funci
on pow para eso.

xl
Prioridad
+,-,unarios
*, /, %
+, .

asociatividad
izquierda a deracha
izquierda a derecha
izquierda a derecha

Table 1.5: Prioridad y precedencia de los operadores aritmeticos.


operador
=
*=
/=
%=
+=
-=

ejemplo
a=b
a*=b
a/=b
a%=b
a+=b
a-=b

descripcion
asigna el valor de b a a
a=a*b
a=a/b
a=a%b
a=a+b
a=a-b

Table 1.6:
En nuestro ejemplo, la precedencia, de izquierda a derecha, indica que el resutado sera 9.
El uso de parentesis, por otro lado, permite forzar la precedencia. As la sentencia
x=10;
y=5;
z=4;
w=x- (y +z);
tendra como resultado 1. El uso del parentesis es sumamente conveniente en expresiones largas y
complicadas y si usted tiene cualquier tipo de dudas.

1.21.7

Operadores de asignaci
on

El operador de asignacion es el smbolo = equivalente al smbolo := de Pascal.


Las siguientes son expresiones de asignacion:
x=1;
a=b;
i=i+1;
El operador asignacion agrupa de derecha a izquierda:
c=a=b

1.21.8

/* se interpreta como a=b y luego c=(a=b) */

Otros operadores de asignaci


on

C permite utilizar el operador de asignacion en conjunto con los operadores aritmeticos para abreviar
expresiones de uso frecuente, por ejemplo a = a + b se puede escribir a+ = b. Los cinco operadores
de este tipo son:
Operadores de incremento y decremento
La expresion i = i + 1 se usa con tanta frecuencia como contador que en C existe una forma especial
de escribirla. Se puede reeplazar por la expresion i + + tan tpica de C. El operador ++ y el operador

cursoC/curso/lenguajeC.tex -August 23, 2012

xli

- - se denominan operadores de incremento. Son operadores unarios es decir se aplican a una


u
nica variable y tiene por objeto incrementar (o decrementar) la variable en 1.
Nuestro programa b
asico inicial podra escribirse de la siguiente manera
1
2
3
4
5
6
7
8
9

#include <stdio.h>
/* imprime una lista de numeros */
main ()
{
int i;
for (i=0; i<10; i++)
printf("i es %d\n",i);
return 0;
}

Cuando un variable afectada del operador ++ o -- se encuentra como u


nica componente de la expresion,
por ejemplo, como en la lnea 6 del ejemplo anterior, o en la lnea siguiente
6

for (i=0; i<10; ++i)

ambas formas del incremento o decremento son equivalentes. En los ejemplos citados, i++ o ++i aparecen como u
nica expresion de control incremental en el lazo for y ambas sentencias son equivalentes.
Cuando i++ o ++i se encuentran en una sentencia de asignacion, la posicion del operador ++ define el
orden en que se har
a la asigancion y el incremento. Las sentencias
1
2

m=i++;
m=++i;

// asigna i a m y luego incrementa i en 1


// incrementa i en 1 luego signa el valor incrementado a m

tienen resultados diferentes. En la lnea 1 asigna i a m y luego incrementa i en 1, mientras que en la


lnea 2 incrementa i en 1 luego signa el valor incrementado a m.
Usualmente se utiliza las expresiones i++ o i-- como expresion de incremento o decremento en lazos
de control de flujo. En este caso el orden del signo es irrelevante.
Orden de precedencia inpredecible
Si bien estas abreviaciones que permite hacer C son interesantes, a mi parecer, obscurecen para el
lector no entrenado la legibilidad del programa.
En algunos casos, no es posible predeterminar el orden de precedencia de la operaciones, como por
ejemplo en el ejemplo siguiente
a=++i * --i;
aqui no hay manera de determinar que operaci
on se realiza primero, si ++i o --i. El programador
debe evitar este tipo de problemas. De nuevo, vale aqu el principio KISS.

xlii

1.21.9

Expresiones y operadores relacionales

Las expresiones relacionales son aquellas con las que dos enunciados se comparan entre si para
determinar su valor o tama
no relativo. Es decir, permiten determinar si una expresion es es igual,
distinta, mayor o menor que otra. Veremos en el proximo captulo los distintos operadores relacionales
disponibles y su uso en relaci
on a las sentencias de control de flujo. Aqu haremos solo una introduccion
al tema.
La sintaxis de una expresion relacional es la siguiente
expresion_1

operador_relacional

expresion_2

Los operadores relacionales son los smbolos que se utilizan para preguntar por una determinada
relacion. Por ejemplo, para preguntar si de dos expresiones, una es mayor que la otra, se utiliza, como
era de esperar, el operador >. La expresion relacional sera exp_1 > exp_2.
Como no existen variables de tipo logico (aquellas que toman como valores verdadero o falso), C
eval
ua las expresiones relacionales asign
andoles un valor distinto de cero o cero seg
un la expresion sea
verdadera o falsa respectivamente.
Ya hicimos, en nuestro programa b
asico, uso de expresiones relacionalas. En efecto, la segunda
expresion de control del lazo for es una expresion relacional
1
2
3
4
5
6
7
8
9

#include <stdio.h>
/* imprime una lista de numeros */
main ()
{
int i;
for (i=0; i<10; i=i+1)
printf("i es %d\n",i);
return 0;
}

El lazo se ejecutara mientras sea verdadero que i sea menor que 10.
Nos extenderemos mas sobre las expresiones relacionales y sus operadores en la secci
on 3.2.1.

1.21.10

Expresiones y operadores l
ogicos

Nuevamente, daremos aqu solo una rapida presentacion de las expresiones y operadores logicos. Dadas
dos expresiones, una expresion logica es aquella que las relaciona de manera logica y da como resultado
un valor u
nico de verdad, verdadero o falso.
Por ejemplo sean las expresiones
b < a
y
c < a
Podemos construir una expresion logica para preguntar si ambas son ciertas de la siguiente manera
b < a && c < a
si ambas expresiones relacionales son ciertas, la expresion logica dar
a un valor verdadero, devolvera
un n
umero distinto de cero.
Completaremos este tema mas adelante en la secci
on 3.2.2.

cursoC/curso/lenguajeC.tex -August 23, 2012

1.22

xliii

Funciones

Casi todos los lenguajes de programacion modernos permiten la definicion y uso de las llamadas funciones (C, Basic, Fortran), subrutinas (Fortran), procedimientos (Pascal). Estas estructuras son las
que permiten programar en forma estructurada, paradigma de programacion dominante en los u
ltimos
40 a
nos. La descripci
on de las caractersticas y posibilidades de las funciones merecen, para cualquier
lenguaje de programacion, su propio captulo. Por lo que deremos aqu un breve pantallazo para que
el estudiante pueda usarlas desde muy temprano en su formaci
on como programador cientfico.
Una funci
on en un peque
no programa dentro de otro, que hace alguna tarea muy especfica, muy bien
definida. El prop
osito de escribir una tarea as en una subrutina es compartamentalizar o modularizar
el programa. El lema divide y venceras es aplicable aqu a la perfeccion.
Para introducir las funciones debemos tener en cuenta dos aspectos de ellas
Por una lado, el uso o llamado a ejecuci
on de la funci
on. Veremos dos formas de uso para ellas.
La definicion de la funci
on
Llamado a ejecuci
on de una funci
on
Supondremos por ahora que las funciones de las que hablaremos est
an disponibles listas para su uso.
Veremos ahora como usarlas. Hacer uso de una funci
on o ejecutar una funci
on se denomina el llamado
a ejecuci
on de una funci
on o se dice invocar a invocar funci
on o referenciar a la funci
on
Para ejemplificar podemos usar las funciones de librera provistas por C. Para que una funci
on o
subprograma pueda ejecutarse debera ser llamado por otra funci
on. En el nivel maximo de jeraqua
debera ser llamada por el programa principal, la funci
on main. Este llamado se hace con solo invocar
el nombre de la funci
on. En nuestro ejemplo b
asico
1
2
3
4
5
6
7
8
9

#include <stdio.h>
/* imprime una lista de numeros */
main ()
{
int i;
for (i=0; i<10; i=i+1)
printf("i es %d\n",i); // se invoca la funci
on de impresion
return 0;
}

tal llamado se efect


ua en la lnea 7 al invocar o referenciar el nombre de la funci
on printf que
hace la tarea especfica de imprimir algo en la pantalla.
La funci
on podra (o no) recibir datos del programa que la invoca. Estos datos se pasan como una
lista de par
ametros agrupados entre parentesis y separados por coma, a continuacion del nombre
de la funci
on.
Observe que las sentencia de llamada a la funci
on, debe, como cualquier otra sentencia, finalizar con
el smbolo de terminaci
on.
En el caso de la funci
on printf del ejemplo, los par
ametros pasados son dos, la cadena de caracteres
"i es %d\n" y la variables i, cuyo valor se modifica en cada ciclo del lazo. Los dos par
ametros
pasados son los datos suficientes que necesita la funci
on para imprimir lneas como las siguiente
...
i es 3
i es 4
i es 5
...

xliv
En el ejemplo precedente, se llam
o a la funci
on printf a que ejecute la tarea de imprimir, una tarea
de entrada y salida de datos. Finalizada la tarea (aparentemente) no hubo10 ninguna otra devoluci
on
de la funci
on hacia el programa. Para otras funciones, el resultado de la tarea efectuada debe ser
usado por el programa que las llama. Por ejemplo, cuando estas relizan un c
alculo, se obtiene un dato
del sistema, como la hora, o cuando se lee un dato de la terminal o de otro dipositivo de entrada o
salida, etc.. En estos casos la funci
on debe retornar un valor al programa principal. Puede ocurir
tambien que se requiera saber si una tarea, como la de imprimir, fue realizada correctamente, en tal
caso la funci
on puede retornar un aviso del estado en que se complet
o la tarea.
El valor de retorno de la funci
on substituye al texto de la llamada a la funci
on. Las funciones
matematicas representan un ejemplo tpico de uso por retorno. M
as facil que explicarlo es mostrarlo
en un ejemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
main ()
{
float altura, hipotenusa, base, angulo;
hipotenusa=1.;
angulo 45.;
//grados
angulo=angulo* 180 / PI; //radiantes
base =hipotenusa/cos(angulo);
altura=hipotenusa/sin(angulo);
printf("base %f y altura %f \n",base,altura);
return 0;
}

En las lneas 9 y 10 se llama a las funciones matematicas cos y sin, cuyos argumentos son, respectivamente, un
angulo expresado en radianes. El resultado del c
alculo de la funci
on matematica
seno y coseno efectuado por estas funciones sera retornado en lugar de las expresiones de llamada
cos(angulo) y sin(angulo). De esta manera el uso de las funciones es intuitivo y condice con
nuestra forma matematica de expresarnos.
El lugar de donde se llama a la funci
on puede ser cualquiera. Podra haberse programado de la
siguiente manera
6
7
8
9

hipotenusa=1.;
angulo=45.;
//grados
angulo=angulo* 180 / PI; //radiantes
printf("base %f y altura %f \n",hipotenusa/cos(angulo),altura,hipotenusa/cos(angulo))

En este caso, se llama al c


alculo del seno y coseno al evaluar el par
ametro pasado a la funci
on printf.
Los par
ametros pasados a las funciones deben coincidir en el tipo de datos requeridos por ellas,
tanto en un sentido logico como en su tipologa. En el ejemplo anterior es evidente que las funciones
trigonometricas requieren (requisito impuesto por la logica del calculo interno de la funci
on) un angulo
en radiantes, mientras que el tipo de datos requerido es un float o double.

1.22.1

Definici
on de una funci
on

En general, las funciones deben ser definidas, es decir el c


odigo de definicion debe ser escrito por un
programador y estar accesible al programa que llamar
a las subrutinas en la etapa de compilaci
on.
Las funciones usadas en los ejemplos precedentes est
an definidas en las libreras correspondientes
stdio y math. Usualmente no necesitamos acceder al c
odigo de definicion, aunque podramos hacerlo.
10 Aparentemente,

por simplicidad de la explicaci


on. En realidad si hubo pero no se us
o el retorno de printf.

cursoC/curso/lenguajeC.tex -August 23, 2012

xlv

La funci
on main es por supuesto una funci
on. En general, las funciones tienen un nombre, una lista
de argumentos y un cuerpo de definicion. En el caso de main, la lista de argumentos est
a vaca. Su
cuerpo es el bloque de sentencias por debajo de la primera lnea de definicion.
Las funciones como las variabes deben declararse. En el caso de main la declaracion y la definicion de
la funci
on es la misma. Para cualquier otra funci
on, si se la define antes que el main, la declaracion y
la definicion de la funci
on tambien coinciden.
El siguiente es un prototipo o esquema de una funci
on de la definici
on de una funci
on
tipo nombre(tipo arg1, tipo arg2,...)
{
sentencia 1
.
.
.
ultima sentencia
return nombre=algun valor;
}
Como vemos, esta funci
on difiere en dos aspectos de la funci
on main. Por un lado existe una lista de
argumentos. Por otro, se ha antepuesto un tipo al nombre de la funci
on.
El nombre de la funci
on sigue las mismas reglas que los nombres para variables.

1.22.2

La lista de argumentos

Volveremos al tema de funciones en el captulo 5.

1.23

Funciones de la librera math.h

Varias de las funciones matematicas que en otros lenguajes (por ejemplo Fortran) se denominan
funciones matematicas intrnsecas est
an programadas como funciones de librera.
La tabla 1.7 lista las funciones matematicas disponibles en la librera math.
La funciones aceptan argumentos de tipo double y float o int.
Par usar las funciones de la librera matematica debe incluir la directiva
#include <math.h>
y debe compilar de la siguiente manera
gcc -o prog prog.c -lm
observe que se ha incluido la opci
on -lm.

1.23.1

Funciones trigonom
etricas

La lista siguiente muestra los prototipos de las funciones trigonometricas de la librera matematica:
double tan(double x);
double cos(double x);
double sin(double x);

xlvi
retorno
int
double
double
double
double
double
double
double
double
double
long double
double
double
double
double
double
long int
double
long double
double
double
int
double
double
double
double
double
double
double
int
int
void

nombre y argumentos
abs (int x);
acos(double x);
asin(double x);
atan(double x);
atan2(double x);
ceil(double);
cos(double x);
cosh(double x);
exp(double x);
fabs(double x);
fabsl(long double x);
floor(double x);
fmod(double x, double y);
frexp(double x, int *exp);
frexpl(long double x, int *exp);
hypot(double x, double y);
labs(long int n);
ldesp(double x, int exp);
ldexpl(long double x, int exp);
log(double x);
log10(double x);
matherr(struc exception *e);
modf(double x, double *partent);
poly(double x, int n, double c[] );
sin(double x);
sinh(double x);
sqrt(double x);
tan(double x);
tanh(double x);
rand(void);
random(int x);
randomize(void);

Table 1.7: Funciones matematicas de la librera math


double acos(double x);
double asin(double x);
double atan(double x);
double hypot(double x, double y);

La funciones aceptan argumentos de tipo double y float o int.


Las funciones trigonometricas requieren el argumento angular en radianes. Angulos en grados deben
convertirse a radianes

(1.11)
=
180
Se usan de las siguiente manera
float a, angulo_grados=45., pi=3.1415;
angulo_radianes = 45.* pi/180.;
a= sin(angulo_radianes);
Las funciones trigonometricas inversas de la librera math son
double acos(double x);

cursoC/curso/lenguajeC.tex -August 23, 2012

xlvii

double asin(double x);


double atan(double x);

1.23.2

Funciones raiz cuadrada, potenciaci


on y exponenciaci
on.

Las funciones relacionadas con la potenciacion y exponenciacion son las siguientes


double exp(double x);
double frexp(double x, int *exp);
double frexpl(long double x, int *exp);
double ldesp(double x, int exp);
long double ldexpl(long double x, int exp);
double sqrt(double x);
double pow(double x,double y)
Table 1.8: Funciones potenciacion y exponenciacion de la librera math
Las mas comunes no requieren mayor explicaci
on y son
double exp(double x);
double sqrt(double x);
double pow(double x,double y);
Considere al expresion de la Ley de Planck para la potencia emisiva monocrom
atica
Eb, =

c1
1
5 (e(c2 /T ) 1)

(1.12)

Esta funci
on requiere el c
alculo de la quinta potencia de y el c
alculo de la exponencial de (c2 /T ).
que se pueden calcular de la siguiente manera
float lambda,float c2, float T;
float, aux1,aux2,aux3;
.
.
.
aux1=pow(lambda,5.);
aux2=c2/(lambda*T);
aux3=exp(au2x);

La raiz cuadrada se obtiene con la funci


on sqrt, se usa como en el ejemplo siguiente
x0=1./sqrt(f);

1.23.3

Funciones logartmicas

La librera math.h dispone de funciones para calcular los logaritmos naturales o neperianos y los
logaritmos en base diez. Considere la siguiente funci
on matematica, la ecuaci
on de Colebrook (es
double log(double x);
double log10(double x);
Table 1.9: Funciones logartmicas de la librera math
una relaci
on experimental que relaciona el factor de friccion f con los par
ametros de la tubera (el
diametro y la rugosidad) y el n
umero de Reynolds):.

xlviii



1
2.51
/D

= 2.0log10
+
3.7
f
Re f
p
El c
alculo de la raiz inversa de f , 1/ (f ), se puede expresar
float raiz_i_f;
float esD, Re;
// Datos
...
raiz_i_f= -2.0 *log10( esD/3.7 + 2.51*raiz-i_f/Re);
...

1.23.4

(1.13)

// requiere un c
aculo iterativo

Valor absoluto y funciones de redondeo.

C dispone de numerosas funciones relacionadas al redondeo y valor absoluto de n


umeros enteros y
reales. La tabla muestra algunas de ellas
int abs (int x);
double ceil(double);
double fabs(double x);
long double fabsl(long double x);
double floor(double x);
double fmod(double x, double y);
long int labs(long int n);
double ldesp(double x, int exp);
double modf(double x, double *partent);
double poly(double x, int n, double c[] );
Table 1.10: Funciones de redondeo y valor absoluto de la librera math

1.23.5

Valores aleatorios

En fsica computacional es frecuente el u


so de n
umero aleatorios. Para ello la librera stdlib posee
varias funciones relacionadas.
int random(int x);
void randomize(void);
void srand(unsigned x);
Table 1.11: Funciones aleatorias de la librera stdlib
El prop
osito de estas funciones es generar secuencias de n
umeros aleatorios.
Las secuencia se inicia con una semilla, es decir un valor inicial. Este puede ser a su vez aleatoria o
predefinida. Esta u
ltima opci
on se requiere para generar secuencias repetibles de n
umeros aleatorios,
de manera que los c
alculos efectuados con ella tienen repetibilidad, lo que facilita la programacion y
la correccion de errores.
Se disponen dos funciones para iniciar una secuencia de n
umeros aleatorios srand y randomize.
La funci
on srand(unsigned x) inicializa el generador de n
umeros aleatorios con una semilla predeterminada x. Si x = 1 el generador se reinicializa. Cualquier otro valor fija el generador de n
umeros
aleatorios en un punto inicial aleatorio.
La sentencia randomize inicializa o genera la semilla para el generador de n
umeros aleatorios. Esta
semilla es funci
on de la hora actual del sistema. Esta funci
on impide que las secuencias aleatorias se
repitan.
Existen dos funciones para generar n
umeros aleatorios, random(n) y rand(). La primera genera
n
umeros aleatorios entre 0 y (n1). La segunda genera n
umeros aleatorio en el rango 0RAN DM AX,

cursoC/curso/lenguajeC.tex -August 23, 2012

xlix

donde RAND_MAX es una variable predefinida en el archivo de encabezados stdlib.h. Su valor es


21 5 1..

Bibliography
[1] rothberg.
[2] The american heritage science dictionary. Aug 2010.
[3] Dictionary of algorithms and data structures. Aug 2010.
[4] Dictionary.com unabridged. Aug 2010.
[5] Merriam-webster dictionary. Aug 2010.
[6] P. Chaudhuri. Parallel Algorithms. Design and An
alisis. Prentice Hall, 1992.
[7] Dijtstra.
[8] R. W. Hamming. Numerical Methods for Scientists and Engineers. Dover, second edition, 1973.
[9] K. Hirose. Earths missing ingredient. Scientific American, june 2010.
[10] S.L.S Jacoby and J.S. Kowalik. Mathematical modeling with computers. Prentice-hall, Inc., 1980.
[11] Kernighan and Ritchie.
[12] H. L. Langhaar. Dimensional Analysis amd Theory of Models. John Wiley and Sons, 1951.
[13] C. Pursell. The machine in America. A social history of Technology. Johns Hopkins University
Press, 1995.
[14] B. Winston. Media Technology and Society. A History: From the Telegraph to the Internet.
Routledge, London, 1998.

Potrebbero piacerti anche