Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1.12
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
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
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
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
xvii
#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
xix
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
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
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
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.
xxiii
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
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
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;
...
}
1.17
La funci
on principal.
main ()
{
}
#include <stdio.h>
main ()
{
printf(hola mundo \n);
}
#include <stdio.h>
void mifunci
on()
{
printf(hola mundo desde mi funcion\n);
}
main ()
{
printf(hola mundo desde la funcion main\n);
mifunci
on();
}
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);
}
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;
xxvii
void mifuncion();
float a,b;
a=5.;
b= a + 4.5;
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
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
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)
(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
extern
float
for
sizeof
static
struct
goto
if
int
long
register
return
short
signed
switch
typedef
union
unsigned
void
volatile
while
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
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
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
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
*/
*/
*/
*/
*/
*/
*/
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.
""
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
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;
xxxiv
int i,j;
float x;
char nombre;
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
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)
float P,m,g;
//P, Peso, Newton
//m, masa, kg
//g, aceleraci
on, m/seg^2
.
.
.
P=m*g;
float Peso,masa,gravedad;
//Peso, fuerza, Newton
//masa, masa, kg
//gravedad, aceleraci
on, m/seg^2
.
.
.
Peso=masa*gravedad;
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
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;
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
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
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))
float T,a,b;
int n;
T=2000.;
a=0.1;
b=10.0;
n=50.;
float T=2000.,a=0.1,b=10.0;
int n=50;
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);
}
#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);
}
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);
}
1.21.6
Operadores Aritm
eticos
suma
substracci
on
multiplicacion
divisi
on
modulo o resto
No hay exponenciacion
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
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
1.21.8
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
xli
#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;
}
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;
xlii
1.21.9
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.
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;
}
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))
1.22.1
Definici
on de una funci
on
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
1.23
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);
(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);
xlvii
1.23.2
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);
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
1.23.5
Valores aleatorios
xlix
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.