Beruflich Dokumente
Kultur Dokumente
Prlogo
2 Enlaces
Esta obra est llamada a ser la piedra angular en la enseanza de la programacin, logrando abarcar todos los Nociones bsicas de programacin (generales, indepenaspectos del lenguaje en diversos niveles y de esta forma dientes del lenguaje):
ser tanto una referencia tcnica para quienes ya dominan
el lenguaje como una introduccin sencilla para quienes
Fundamentos de programacin
estn empezando a conocerlo.
Viajaremos por la historia del lenguaje, veremos su proWikilibro similar a ste en ingls
psito e indagaremos en la ciencia de la programacin.
El n es otorgar al lector una doctrina clara de la progra C Programming
macin y el lenguaje C; lo induciremos a conseguir un
manejo importante del lenguaje.
esquema de operadores y expresiones
1.1
Este libro est dirigido a todos los que deseen obtener conocimientos de programacin, pues el objetivo explcito
que nos ha motivado a crearlo es difundir la importancia
del lenguaje C en el mundo de la informtica. Si nos enfocamos a un grupo social especco, podremos indicar
que este libro contribuir con los estudiantes de carreras
del rea informtica, debido a que los temas convenidos,
son parte de su plan de estudios.
1.2
3 Licencia y autores
Copyright 2004 Envite
Copyright 2005 Alejandro Moreno Calvo
Copyright 2006 Andreu Correa Casablanca
Copyright 2009 zerohours
en un proyecto de wikipedia o en otro wiki deberas leer detalles ms exactos irn apareciendo posteriormente,
el manual de uso de wikilibros.
una vez que los materiales anteriores hayan sido correctaUna vez hecho esto todo lo que tienes que hacer es agre- mente asimilados por el lector. En general, dadas dos degar el contenido que consideres necesario para el libro. niciones o datos contradictorios en este wikilibro, debe
Para editar cualquier seccin basta con hacer click al link considerarse siempre como ms exacto al segundo, haque dice editar en la pestaa en la parte superior de la pa- biendo aparecido el primero como una introduccin ms
gina, seria bueno revisar (antes de editar cualquier cosa) general al tema.
la pestaa de discusin que est ah para ser usada. Ten
en cuenta que el material que ya est fue escrito por personas que deseaban contribuir igual que t, as que trata 7 Estndar utilizado
de respetarlo. Aunque con esto no me reero a que si se
necesita alguna correccin, reorganizacin, quitar partes El lenguaje C fue creado en los aos setenta, y a lo largo
que sean ambiguas, no dejes de hacerlo. Lo mejor sera de su historia ha pasado por muchas modicaciones, tanto
que todos contribuyramos de cualquier manera al libro. con respecto a la sintaxis como con respecto al cdigo
Adems, es recomendable consultar la pgina de discu- incluido dentro de la biblioteca estndar. Es por ello que
sin del libro y la del articulo en particular que quieras se fueron desarrollando estndares, para que todos sepan
modicar, ya que de esta manera se pueden coordinar es- con qu versin del lenguaje se est trabajando.
fuerzos.
Los distintos estndares del lenguaje C han sido: el C
Recuerda que todo el contenido que aadas al libro es de Kernighan y Ritchie, un estndar no-ocial que surpublicado bajo la licencia GFDL, por lo que no uses ma- gi luego de la publicacin de su libro en 1978; el C89 o
terial que no haya sido escrito por ti o que no est ya pu- C90, el primer estndar ocial, posterior a la publicacin
blicado bajo GFDL. Recientemente wikimedia decidi de los estndares ANSI en 1989 e ISO en 1990; y el C99,
adoptar la Licencia Creative Commons Compartir-Igual publicado en 1999.
3.0 para todos los aportes, por lo que actualmente el libro En este libro se utilizar el estndar C99, si bien por cuestiene una licencia dual.
tiones de estilo y compatibilidad muchas veces se utilizar cdigo compatible con el estndar C89.
Objetivos
8 Para los principiantes
10
Requisitos
13 GNU/Linux
Para quienes no tengan conocimientos bsicos de programacin, puede ser una buena idea comenzar leyendo los
En los sistemas GNU/Linux, ser necesario tener instaprimeros captulos del Wikilibro Fundamentos de proladas las herramientas gcc y make y la versin 6 de la
gramacin, ya que algunos temas explicados en ese libro
glibc con su documentacin, que son las que permitirn
se asumen ya conocidos.
compilar los programas.
Finalmente, un requisito imprescindible en todo prograPara escribir y modicar el cdigo, es posible utilizar
mador es tener sentido comn. Muchas veces se pueden
cualquier editor de texto plano (en lo posible que cuenadoptar mejores o peores soluciones ante los diversos
te con resaltado de sintaxis), como son emacs, vim, kate,
problemas, y la decisin de cul elegir pasa por la apligedit o geany.
cacin del sentido comn.
Sin embargo, para quienes son novatos en la programacin, es recomendable utilizar un entorno de desarrollo
como son el Anjuta DevStudio (para el entorno GNO11 Herramientas
ME) o KDevelop (para el entorno KDE), ya que incluyen facilidades adicionales para la ejecucin y solucin
Para programar tanto en C, como en C++, Java o cual- de problemas.
quier otro lenguaje de programacin, necesitamos contar
Los programas mencionados se incluyen dentro de la inscon aplicaciones o herramientas que nos permitan poner
talacin estndar de la mayora de las distribuciones acen funcionamiento nuestro programa.
tuales de GNU/Linux, de modo que para instalarlos slo
El lenguaje de programacin C es compilado, as que en ser necesario seguir el procedimiento usual de instalaeste caso necesitaremos un compilador, que ser el en- cin de aplicaciones para la distribucin deseada.
cargado de transformar nuestro cdigo fuente en cdigo
El lenguaje de programacin C fue creado por Dennis
que la computadora pueda ejecutar.
Ritchie entre 1969 y 1973 cuando trabajaba en Bell LaAdems, para facilitar la tarea de los programadores exis- boratories de AT&T junto con Ken Thompson en el diseten los denominados Entorno de desarrollo integrados o del sistema operativo UNIX. C fue creado para poder
(IDE). En muchos casos, estos entornos incluyen un com- escribir dicho sistema operativo en un lenguaje de alto
pilador, un depurador, y otras herramientas.
nivel, independiente del hardware donde se ejecutara.
Las herramientas a instalar dependern del sistema operativo utilizado. A continuacin se listan algunas posibilidades para el sistema operativo Windows o GNU/Linux,
no es imprescindible utilizar estas herramientas en particular, cualquier compilador puede servir.
12
Windows
Adems, con el paso del tiempo se han desarrollado cientos de bibliotecas que permiten a los programadores de
Uno de los entornos de desarrollo ms conocidos en- C utilizar el cdigo desarrollado por otros para la realizatre los programadores de C sobre Windows, tanto no- cin de tareas comunes. Esto, a su vez, ha propiciado el
vatos como expertos, es el Bloodshed Dev-C++, que es desarrollo de aplicaciones en lenguaje C.
un entorno libre multiplataforma. Tal entorno de desa- Actualmente es imposible contar la cantidad de aplicarrollo fue abandonado y retomado mejorndolo pasando ciones y herramientas desarrolladas en C.
14
16 DEFINICIONES
Evolucin
caractersticas adicionales, que otros compiladores no tenan, siendo C++ la principal inuencia.
A mediados de los aos 60s, Martin Richards dise el Fue por ello que a nales de los noventa se decidi revisar
lenguaje BCPL con la nalidad de usarlo para escribir el estndar de C, lo que llev a la publicacin del estndar
C99. Este estndar incluye varias nuevas caractersticas
software de sistemas operativos y compiladores.
como son: las funciones inline; la posibilidad de declarar
En 1969, Ken Thompson escribi el Lenguaje B, en Bell variables en cualquier parte del cdigo; los comentarios
Laboratories, con el objetivo de recodicar UNIX (escrito de una sola lnea utilizando //; los tipos de datos long long
hasta ese momento en lenguaje ensamblador) usando un int, bool y complex, entre otras.
lenguaje de alto nivel ms portable y exible.
An hoy el proceso de evolucin del lenguaje sigue avanDurante los siguientes aos, Dennis Ritchie modic el zando, y desde 2007 se est trabajando en el armado de
lenguaje B, llegando a crear el lenguaje C y reescribiendo un nuevo estndar.
el sistema UNIX en dicho lenguaje; aadi caractersticas
nuevas, como son el diseo de tipos y las estructuras de
datos.
15 Ms informacin
17
Tipos de lenguajes
otros.
La contraparte de los lenguajes interpretados son los lenguajes compilados (como el mismo C) que se diferencian en que las rdenes son transformadas a lenguaje de
mquina que se almacena en un archivo ejecutable. Ese
archivo puede ejecutarse luego, sin recurrir al compilador.
17.1
Esquemas de programacin
01010010101000010101010010100001001110101100100101010010110
El lenguaje C es un lenguaje imperativo, no orientado a Es exactamente as, pero es ms cmodo recordar que
esos bits se encuentran agrupados de ocho en ocho, forobjetos.
mando octetos (bytes):
17.2
17.3
Compilados o interpretados
Es decir que el compilador genera un archivo, en este caso llamado a.out, y la salida generada por ese archivo es
Hola mundo. A continuacin una explicacin detallada
sobre el proceso de compilacin del programa, y luego un
anlisis lnea por lnea del contenido de este ejemplo.
19
20
20.1
Para compilar un programa C en entornos Windows, debemos seguir una serie de pasos que varan segn el compilador de C que queramos utilizar. Antes que nada, sera bueno que se revises la documentacin del compilador
elegido para conocer los comandos exactos.
Si ejecutamos en entorno Windows el programa directamente desde el navegador de archivos, o tambin desde
algunos entornos de desarrollo, lo que suceder ser que
apenas abierta la ventana de la consola, se mostrar la cadena esperada y luego de terminada la funcin, la consola se cerrar sin tener el tiempo suciente de ver nuestro
mensaje en pantalla.
Para poder ver la salida por pantalla ser necesario ejecutar el programa desde la lnea de comandos, o modicar
la conguracin del entorno de desarrollo para que muestre la salida por pantalla al ejecutar el programa.
Una posible solucin es agregar una funcin adicional a
nuestro hola.c":
20.1.1
7
As es posible visualizar que la salida de hola.c se complet perfectamente.
20.2
GNU
24 ENTEROS
Pues es la denicin de una funcin, en este caso llamada main. En C (y en general en todos los lenguajes de
programacin estructurada) todo se hace a base de funciones, como main y printf.
La funcin main es especial, porque es el la que se invoca
cuando se ejecuta el programa. Todos los programas en C
comienzan su ejecucin al principio de la funcin main,
y cuando sta acaba, el programa tambin.
Veamos con ms detalle la denicin de la funcin:
int main (int argc, char **argv) { ... }
El nombre de la funcin que viene a continuacin,
entre llaves, es main.
Recibe dos argumentos: int argc y char **argv (que
representan a la cantidad de argumentos ingresados
al ejecutar el programa y a los valores de estos argumentos respectivamente).[1]
La funcin devuelve como resultado un nmero entero, int (que es el 0 de la instruccin return).[2]
C99: //. Todo lo que est despus de estos signos, hasta el nal de la lnea, se considerar un comentario y el
compilador no lo tomar en cuenta.
En el ejemplo presentado pueden verse tres lneas con
comentarios, que documentan someramente las distintas funcionalidades del cdigo. En los prximos captulos
podrn verse mejores usos de los comentarios dentro del
cdigo.
Tambin podra decirse que es una herramienta bsica
basada en compilador
[1] En un captulo posterior podr ver un ejemplo del uso de
los parmetros que recibe main.
[2] Es importante sealar que el estndar dice que main deber denirse como funcin que retorna un entero, o de
lo contrario el resultado queda indenido.
23 Historia
Finalmente, y un tanto aparte (est separada del resto por En el lenguaje C estandarizado como C89, existan cuatro
tipos de datos bsicos que son: los nmeros enteros, los
una lnea en blanco), tenemos la lnea:
nmeros reales, los caracteres, y los punteros. A partir del
#include <stdio.h>
estndar C99 se agregan: los valores lgicos (verdadero
o falso) y los nmeros complejos.
Que parece bastante distinta al resto del programa, y que, Estos tipos de datos son parte del lenguaje, y por ello se
adems, parece no tener sentido, puesto que ya hemos los considera primitivos. Ms adelante veremos que con
denido la funcin main que hace todo el trabajo.
el uso de estructuras y uniones es posible crear tipos comEfectivamente, esa lnea no es parte del programa, aun- puestos de datos a partir de estos tipos primitivos.
que sea imprescindible. La lnea es una instruccin del En este captulo veremos los enteros, los reales y los capreprocesador de C, como nos lo indica el smbolo #, y racteres. Ms adelante se vern otros tipos de datos ms
lo que hace es incluir en ese punto el contenido de otro complejos, como son los vectores, las cadenas de caracchero, antes (de ah el nombre de preprocesador) de que teres, y los punteros en general.
comience la compilacin. El chero stdio.h es el que contiene la denicin de la funcin printf(), que antes utilizamos pero que no escribimos, ya que forma parte de la
24 Enteros
biblioteca estndar de C.
Los enteros son el tipo de dato ms primitivo en C. Se
usan para representar nmeros enteros. Pero siempre se
22 Comentarios
pueden encontrar otras aplicaciones para los nmeros enteros. En general se pueden usar para representar cualUna vez escrito un cdigo, tratar de entenderlo un ao
ms tarde solo con leerlo puede ser frustrante: no hay ma- quier variable discreta.
nera de saber (si el programa es medianamente compli- Los tipos de datos enteros son: short, int, long y long long,
cado) qu es cada variable, o qu hace cada bloque de cada uno representando un nmero entero de un tamao
cdigo. Por esto, en cualquier lenguaje de programacin o capacidad determinado. Segn el compilador y la platason importantes los comentarios.
forma de hardware, cada uno de estos tipos de dato puede
Un comentario en C es todo lo que se encuentre entre los ocupar desde 1 byte hasta 8 bytes en memoria (para ms
smbolos /* y */. Hay que tener en cuenta que los comen- detalles busca en la referencia).
tarios no se pueden anidar: si dentro de un comentario Adems, el lenguaje C hace la distincin de si el entero
hay un /*, seguir siendo el primer */ el que nalice el es con signo (signed) o sin signo (unsigned). En caso de
que no se declare si es con signo o sin signo, se toma con
comentario, no se esperar al segundo.
Hay otro tipo de comentarios en C, procedentes del len- signo.
guaje C++, e incorporadas al estndar de C a partir de Algunos ejemplos de declaraciones de enteros:
9
int a; unsigned int a; signed long a; signed long long a =
10000000;
Todos los nmeros son representados en memoria mediante una cadena de bits. En el caso de los nmeros con
signo, el bit ms signicativo es el que se usa para representar el signo. La representacin de los nmeros negativos se realiza mediante el complemento a dos, que
es una tcnica que permite operar con los nmeros negativos de forma lgica.
A modo de ejemplo, la representacin en memoria del
nmero 8 en una variable de 2 bytes, entera, con signo,
sera la siguiente:
1111111111111000
25
Flotantes
Se denomina otantes a los tipos de datos que representan a los nmeros reales, ya que utilizan un sistema de representacin basado en la tcnica de coma otante, que
permite operar con nmeros reales de diversas magnitudes, mediante un nmero decimal llamado mantisa y un
exponente que indica el orden de magnitud.
26 Caracteres
Los caracteres se representan utilizando el tipo char, que
tiene slo 1 byte de tamao. Este tipo se utiliza para representar los 256 caracteres de la tabla de caracteres del
sistema. El tipo char es tambin un tipo entero, ya que
puede tomar valores de 0 a 255. Por lo tanto tambin puede ser signed o unsigned.
El tipo de dato otante en lenguaje C slo tiene dos ta- En cuanto a la forma de declarar variables de tipo char es
maos: el oat y el double, que son 4 bytes y 8 bytes res- la misma forma que con los otros tipos.
pectivamente. Se los puede utilizar tanto para representar char a; char a = 's; unsigned char a = 48;
nmeros decimales, como para representar nmeros enteros con un orden de magnitud muy grande.
Como puedes ver, se le puede asignar un nmero a una
La forma de declarar una variable otante es escribiendo variable char, ya que se trata de un tipo entero. En muchas
en una lnea uno de los tipos de datos otantes y a conti- situaciones se utiliza el tipo char para almacenar nmeros
nuacin el nombre de la variable y tal vez algn valor que pequeos, ya que ocupa en memoria slamente un byte.
se les quiera dar.
Es importante notar que con la llegada de la codicaAlgunos ejemplos:
cin UTF-8, los caracteres de los diversos idiomas pueoat a; double a = 1e23; double a = 3.1416; oat a = den ocupar 1, 2, 3 o 4 bytes, de modo que el tipo char ya
no alcanza para la representacin de todos los caracteres
4e-9; double a = 78;
posibles. Por ello, el estndar C99 introduce el tipo wchar
que puede ocupar ms de 1 byte, segn sea necesario para
Hay que tener en cuenta que aunque los valores otantes la codicacin utilizada por el sistema.
son ms convenientes para algunas aplicaciones, hay casos en los que se preeren los enteros. Esto se debe a que En este captulo veremos un poco ms sobre como interlos nmeros otantes no necesariamente tienen soporte actuar con el usuario de nuestros programas desde la conde hardware, en particular en las plataformas integradas. sola, utilizando printf() como vimos en el primer ejemUna alternativa que se utiliza en estas situaciones es in- plo Hola mundo, as como scanf() para la lectura del
terpretar los enteros como decimales de forma que 150 teclado.
se interprete como 1.5 y 2345 como 23.45.
Para el caso de los otantes de 4 bytes, se utiliza 1 bit para
el signo, 8 bits para el exponente y 23 bits para el valor 27 Imprimir por pantalla
del nmero. El procedimiento para almacenar un nmero
Como hemos visto hasta ahora en los ejemplos, hay una
en una variable otante es el siguiente:
funcin que utilizamos para sacar por pantalla textos ar1. Se convierte a binario la parte entera.
bitrarios o el resultado de alguna operacin: la funcin
2. Se coloca el signo en el bit ms signicativo de la printf().
misma manera que en los enteros (1 para el - y 0
para el +).
10
int numero;
#include <stdio.h> int main() { int a,b; printf (innumero=3;
troduzca dos valores con el formato \"a,b\" :");
printf(El doble de %i es %i y su cuadrado es scanf("%i,%i,&a,&b); printf (el primer valor :
%i\n,numero,numero*2,numero*numero);
%i\n,a); printf (el segundo valor : %i\n,b); return 0; }
Aqu hemos introducido una nueva variable en el cdigo.
La cadena de formato, "%i,%i especica que el usuario
ingresar un nmero, seguido de una coma, y luego otro
La entrada de datos se puede hacer de muchas maneras nmero. El primer %i ser capturado por la variable a y
y entre ellas estn desde el uso de dispositivos especiales el segundo por b.
hasta nuestro simple teclado. La entrada de datos se re- Vamos a tratar ahora de que el ordenador haga un poco
28
11
de matemticas para nosotros. Por ejemplo, que realice Pero, como = tambin es un operador, cmo sabe el orunas pocas sumas, restas multiplicaciones y divisiones.
denador qu operador debe ejecutar primero? Y si es un
#include <stdio.h> int main(void) { int resulta- operador, por qu no da un resultado? No crea una exdo; resultado=5+2; printf(Resultado de la suma: presin?
%i\n,resultado); resultado=5-2; printf(Resultado de la
resta: %i\n,resultado); resultado=5*2; printf(Resultado
de la multiplicacin: %i\n,resultado); resultado=5/2;
printf(Resultado de la divisin: %i\n,resultado); return(0); }
Despus de grabarlo (por ejemplo, con el nombre ejemplo.c), lo compilamos y ejecutamos, con (respectivamente):
$ gcc ejemplo.c $ ./a.out Resultado de la suma: 7 Resultado de la resta: 3 Resultado de la multiplicacin: 10
Resultado de la divisin: 2 $
La funcin printf() no slo sabe imprimir cadenas simples, como Hola Mundo\n, sino tambin imprimir variables. Para ello, en el lugar de la cadena donde queremos
que aparezca el valor de la variable, introducimos lo que
se llama una cadena de conversin de printf(). Estas cadenas siempre empiezan por %, siendo %i la cadena para
imprimir un entero, como es en nuestro caso int resultado. Finalmente, printf() debe saber qu valor escribir,
por eso le damos otro argumento (u otros), usando , como separador, que contienen las variables cuyos valores
queremos mostrar.
12
29
es bastante simple:
En este caso, se utiliza el operador mdulo (%), que obA continuacin, un ejemplo con una funcin, que devuel- tiene el resto de la divisin entera de un nmero por otro.
ve el mayor de dos nmeros:
Cuando un nmero es divisible por otro, el resto de su
int mayor(int a, int b) { if (b > a) { return b; }// No posee divisin entera ser cero. Siendo que cero es equivalente
especicacin de la parte else, ya que no es necesaria. a falso, y cualquier valor distinto de cero es equivalente a
return a; // Finaliza la funcin retornando el valor de a. } verdadero, podemos usar el operador % para vericar si
el nmero es mltiplo de 4, de 100 o de 400.
29.1
Operadores de comparacin
El smbolo > visto en el ltimo ejemplo es un operador, La evaluacin en corto circuito es una caracterstica del
que en este caso compara dos nmeros enteros y devuelve lenguaje C que se utiliza para optimizar la ejecucin de
verdadero si el primero es mayor, falso en caso contrario. programas. Consiste en que el programa puede vericar si
una expresin es verdadera o falsa antes de haber evaluado
A continuacin un listado de los posibles operadores de
toda condicin.
comparacin en C y su signicado.
Por ejemplo, si se tiene una condicin como la siguiente:
Teniendo en cuenta que en C se toma como falso el valor 0, y como verdadero cualquier otro valor, una prctica if ((a > 2) || (b < 4)) { ... }
comn es expresar condiciones sin utilizar ningn operador:
Al ejecutarse el programa, se evaluar primero si a > 2.
oat division(int dividendo, int divisor) { if (divisor) { En el caso en que sea verdadero, no continuar con la
return dividendo / divisor; } else { printf (No se puede siguiente condicin, ya que el resultado ser de cualquier
modo verdadero.
dividir por cero\n); return 0; } }
De la misma forma, si la condicin fuera:
En este caso, la expresin (divisor) es equivalente a (di- if ((a > 2) && (b < 4)) { ... }
visor != 0).
29.2
Operadores lgicos
Los operadores && (y), || (o) y ! (no) son opera- Esta caracterstica no tiene demasiada importancia al codores lgicos. Permiten operar con expresiones lgicas menzar a programar, pero facilitar ciertas operaciones y
para generar expresiones ms complejas.
optimizaciones en programas avanzados.
13
30
La estructura condicional
abierta y cerrada switch ...
case
32 El bucle for
El bucle for es un bucle muy exible y a la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma ms tradicional es la siguiente:
for (/* inicializacin */; /* condicin */; /* incremento
*/) { /* cdigo a ejecutar */ }
La estructura anterior, de realizarse con sentencias if, necesitara cuatro de ellas, resultando un enorme bloque
muy difcil de leer. En la mayora de los casos, adems, la
sentencia switch proporciona una ganancia en velocidad
del cdigo, pues permite al compilador trabajar en base
a que se trata de una decisin mltiple para una nica variable, cosa que con sentencias if el compilador no tiene
por qu detectar.
Inicializacin: en esta parte se inicia la variable que controla el bucle y es la primera sentencia que ejecuta el bucle. Slo se ejecuta una vez ya que solo se necesita al principio del bucle.
Incremento: es una sentencia que ejecuta al nal de cada iteracin del bucle. Por lo general, se utiliza para incrementar la variable con que se inicio el ciclo. Luego
de ejecutar el incremento, el bucle revisa nuevamente la
condicin, si es verdadera tiene lugar una ejecucin ms
del cuerpo del ciclo, si es falsa se termina el ciclo y as.
Las sentencias break son muy importantes, ya que el comportamiento normal de un bloque switch es ejecutarlo todo desde la etiqueta case que corresponda hasta el nal.
Por ello, si no queremos que se nos ejecute ms de un bloque, pondremos sentencias break al nal de cada bloque
excepto el ltimo.
33 El bucle do...while
31
El bucle do...while es un bucle que, por lo menos, se ejecuta una vez. Do signica literalmente hacer, y while
signica mientras
El bucle while
Su forma es esta:
El bucle while sirve para ejecutar cdigo reiteradas veces. do { /* CODIGO */ } while (/* Condicin de ejecucin
while (/*condicion*/) { /* Cdigo */ }
del bucle */)
14
35 FUNCIONES
34
La sentencia goto
35.1 La sentencia return
La sentencia goto sirve para indicar al programa que continue ejecutndose desde la lnea de cdigo indicada. Su La sentencia return puede utilizarse dentro de una funcin
sintaxis es ms o menos as:
para terminar su ejecucin.
/* Cdigo */ ETIQUETA: /* Cdigo */ goto ETIQUE- En el ejemplo anterior, la funcin holamundo fue declaTA; /* Cdigo */
rada con valor de retorno de tipo void (es decir, valor de
retorno nulo). En ese caso, la sentencia return no lleva
As, cuando se ejecute la sentencia goto, el programa sal- ningn parmetro adicional, ya que la funcin no debe
tar" y continuar su ejecucin a partir de la etiqueta mar- devolver ningn valor a la funcin que la llama.
cada.
En cambio, la funcin main tiene un valor de retorno de
Como se puede observar se puede usar para crear un bucle, o para ir a una parte del cdigo u otra si se combina con una sentencia if...else. Pero por lo general puede
obtenerse el mismo efecto utilizando los bucles anteriormente vistos.
tipo int, por lo que return debe ir seguido de un valor entero (0 en el ejemplo). El valor 0 se utiliza para indicar
que el programa ha llegado a un punto en el que todo se
ha desarrollado correctamente y se utiliza cualquier otro
valor para indicar que ha habido algn tipo de error.
Por eso, la sentencia goto es poco aceptada por la comunidad de programadores, pues puede provocar que se hagan
programas un poco sucios y confusos. Slo en ocasiones muy excepcionales ser recomendado el uso del goto
al crear iteraciones muy complejas. Sin embargo, con el
pasar de los aos este comando ya ha quedado prcticamente descartado del lenguaje de los programadores.
35
Funciones
Como vimos anteriormente C tiene como bloque bsico la funcin main() , tambin hemos visto la sentencia
printf() que es otra funcin, y de igual forma hay muchas ms funciones predenidas, pero nosotros mismos
tambin podemos denir nuestras propias funciones. De
hecho, es fundamental hacerlo.
35.2 Argumentos
Las funciones tambin pueden recibir argumentos o parmetros, para modicar su comportamiento. Por ejemplo,
la denicin de una funcin para sumar dos nmeros sera
de la siguiente manera:
#include <stdio.h> int main(void) { int suma = sumar(5, 3); /* ERROR, sumar no ha sido declarada an
*/ printf(La suma es: %d ", suma); return 0; } int
sumar(int numero1, int numero2) { return numero1 +
/* Inclusin de archivos */ #include <stdio.h> void numero2; }
holamundo(void) /* Funcin donde se ejecuta la lgica del programa */ { printf(Hola Mundo\n); /* En este caso el programa es errneo y no compila, ya que
imprime la cadena */ return; /* sale de la funcin */ en la lnea donde se llama a la funcin sumar, el compiPodemos denir una funcin cualquiera de la misma manera en que denimos la funcin main(). Basta con poner
su tipo, su nombre, sus argumentos entre parntesis y luego, entre llaves, su cdigo:
35.5
15
lador an no conoce ninguna funcin con ese nombre, y del Dominio Pblico */ #include <stdio.h> void sucules son sus argumentos y valor de retorno.
mar_referencia(int *numero); /* prototipo de la funcin
Una posible solucin es declarar el prototipo de la fun- */ int main(void) { int numero = 57; /* denimos
cin al principio, para informar al compilador que existe, numero con valor de 57*/ sumar_referencia(&numero);
y luego denir el cuerpo de la misma en cualquier lugar /* enviamos numero a la funcin */ printf("\nValor de
numero dentro de main() es: %d ", numero); /* podemos
del programa:
notar que el valor de numero se modica * y que ahora
#include <stdio.h> /* Declaracin */ int sumar(int dentro de main() tambin se ha modicado * aunque la
numero1, int numero2); int main(void) { int suma = funcin no haya retornado ningn valor. */ return 0; }
sumar(5, 3); printf(La suma es: %d ", suma); return 0; void sumar_referencia(int *numero) { *numero += 1; /*
} /* Denicin */ int sumar(int numero1, int numero2) le sumamos 1 al numero */ /* el valor de numero recibido
{ return numero1 + numero2; }
se aumenta en 1 * y se modica dentro de la funcin */
printf("\nValor de numero dentro sumar_referencia() es:
%d, *numero); return; }
35.4
Paso de Parmetros
Las funciones pueden recibir datos como lo hemos observado, pero existen dos formas de enviar los datos hacia
una funcin por valor y por referencia, las cuales modican en diferente forma el comportamiento de el programa.
Adems de pasar valores a una funcin, tambin se pueden declarar tipos de datos dentro de las funciones, estos
tipos de datos declarados dentro de una funcin solo son
accesibles dentro de esta misma funcin y se les conocen
como variables locales, as pues podemos denir los mis35.4.1 Por Valor
mos nombres de variables en diferentes funciones, ya que
estas variables solo son accesibles dentro de esas funcioEl paso por valor enva una copia de los parmetros a nes. Ejemplo:
la funcin por lo tanto los cambios que se hagan en ella
/* * locales.c * * Julio Csar Brizuela <brizuelaalno son tomados en cuenta dentro de la funcin main().
varado@gmail.com> 2009 * * para el wikilibro
Ejemplo:
Programacin en C * bajo licencia FDL, adaptado del
/* * por_valor.c * * Julio Csar Brizuela <brizue- Dominio Pblico */ #include <stdio.h> void funcion1()
laalvarado@gmail.com> 2009 * * para el wikilibro { int dato = 53; /* denimos dato en 53*/ char num1 =
Programacin en C * bajo licencia FDL, adaptado 'a'; /* num1 vale a */ /* imprimimos */ printf(Funcion1,
del Dominio Pblico */ #include <stdio.h> void su- dato=%d, num1=%c\n, dato, num1); return; } void
mar_valor(int numero); /* prototipo de la funcin */ funcion2() { int dato = 25; /* denimos dato en 25*/
int main(void) { int numero = 57; /* denimos numero char num2 = 'z'; /* num2 vale z*/ /* imprimimos */
con valor de 57*/ sumar_valor(numero); /* enviamos printf(Funcion2, dato=%d, num2=%c\n, dato, num2);
numero a la funcin */ printf(Valor de numero dentro return; } int main(void) { funcion1(); /* llamamos a
de main() es: %d\n, numero); /* podemos notar que funcion1() */ funcion2(); /* llamamos a funcion2() */
el valor de numero se modica * slo dentro de la return 0; }
funcin sumar_valor pero en la principal * nmero sigue
valiendo 57 */ return 0; } void sumar_valor(int numero)
En este caso la variable dato, esta denida dentro de ca{ numero++; /* le sumamos 1 al numero */ /* el valor de
da una de las funciones y son totalmente distinta una de
nmero recibido se aumenta en 1 * y se modica dentro
otra y no se puede utilizar fuera de esta, as pues num2
de la funcin sumar_valor() */ printf(Valor de numero
no puede ser utilizada por la funcion1() y num1 tampoco
dentro sumar_valor() es: %d\n, numero); return; }
puede ser utilizada por funcion2().
Existen pues variables que se denen fuera de la funcin
principal main() y fuera de cualquier otra funcin creada
35.4.2 Por Referencia
por nosotros, estas variables se les conoce con el nombre
de Variables Globales ya que se pueden utilizar dentro de
El paso por referencia se hace utilizando apuntadores. Se main() y dentro de cualquier funcin creada por nosotros.
enva la direccin de memoria de la variable, por lo tanto Ejemplo:
los cambios que haga la funcin si afectan el valor de la /* * global.c * * Julio Csar Brizuela <brizuelaalvaravariable. Ejemplo:
do@gmail.com> 2009 * * para el wikilibro Programa/* * por_referencia.c * * Julio Csar Brizuela <bri- cin en C * bajo licencia FDL, adaptado del Dominio
zuelaalvarado@gmail.com> 2009 * * para el wikilibro Pblico */ #include <stdio.h> int variable_global = 99;
Programacin en C * bajo licencia FDL, adaptado /* inicializamos la variable global */ void funcion(); int
16
36 FUNCIONES RECURSIVAS
36
Funciones Recursivas
As pues 7 3 es:
n! =
n N
k=1
1
n(n 1)!
Si n = 0
Si n > 0
n N.
Tambin existen otros tipos de funciones recursivas como Tanto la iteracin como la recursin se basan en estructulo es el producto de dos nmeros. El producto de a b, ra de control: la iteracin utiliza una estructura repetitiva
y la recursin una estructura de seleccin. La iteracin
donde a y b son nmeros enteros positivos seria:
36.2
17
Ejemplo Iterativo
36.2.2
Ejemplo Recursivo
En C la cantidad de elementos que podr contener un vecEn el ejemplo anterior usamos los vectores de C para retor es jo, y en principio se dene cuando se declara el
presentar vectores matemticos y calcular el producto esvector. Los vectores se pueden declarar de la siguiente
18
calar entre ellos. Una peculiaridad que se puede notar es
que al recibir un arreglo en una funcin no se especica
el largo, volveremos a esto en un captulo posterior.
Otra funcin clsica es la bsqueda de un mximo o mnimo, que podemos escribirla de la siguiente manera:
int buscar_maximo(double valores[], int num_valores) {
int maximo_pos = 0; for (int i = 1; i < num_valores; i++)
{ if (valores[i] > valores[maximo_pos]) { maximo_pos
= i; } } return maximo_pos; }
Otro ejemplo sencillo, calcular el promedio de los valores.
double promedio(double valores[], int largo) { double
suma=0; for (int i=0;i<largo;i++) { suma+=valores[i]; }
return suma/largo; }
Cuando una funcin recibe un vector por parmetro y
cambia su contenido y el cambio es permanente (se ve an
fuera de la funcin). Esto puede parecer extrao despus
del nfasis que pusimos en resaltar que todos los parmetros de una funcin se reciben por valor, pero se aclarar
en el siguiente capitulo.
Mientras tanto usemos esto para denir una funcin que
le aplique otra funcin que recibe por parmetro a cada
elemento del vector, guardando el resultado en el mismo
vector y una llamada de ejemplo a esta.
void cuadrados(double vector[], int largo) { for (int
i=0;i<largo;i++) { vector[i]=cuadrado(vector[i]); } } ...
double cuadrado(double valor) { return valor*valor; } ...
cuadrados(elementos,num_elem); ...
De la misma forma que venimos usando vectores de tipos bsicos, podemos tener vectores de vectores, estos se
declaran de la siguiente forma:
int matriz[3][7]; int tabla[3][4]={ { 1, 2, 3, 4}, { 5, 6,
7, 8}, /* los espacios y saltos de lneas no son tomados
en cuenta */ { 9,10,11,12} }; double v[2][2][2]; ...
printf(tabla[0][1]: %i\n, tabla[0][3]); // Imprime 4
printf(tabla[2][0]: %i\n, tabla[2][0]); // Imprime 9 ...
En este ejemplo tabla es un vector de longitud 3, cuyos
elementos son vectores de longitud 4 de elementos de tipo
int.
En resumen, suponiendo que v[n] es un vector de cualquier tipo de dato con n cantidad de posiciones, al vector
v se le aplican las siguientes reglas:
1. La primera posicin siempre ser v[0]
2. La ltima posicin es v[n-1]
3. En versiones previas a C99 n es una constante denida antes de la declaracin de v[n]
36 FUNCIONES RECURSIVAS
19
37
37.1
37.2
Images
37.3
Content license