You are on page 1of 60

Naterial elaborado a partir del Curso Avanzado de Programacin en C

de la Prof. Nariela Curiel


1


C
C
u
u
r
r
s
s
o
o
d
d
e
e
P
P
r
r
o
o
g
g
r
r
a
a
m
m
a
a
c
c
i
i

n
n
e
e
n
n
C
C

C Co on nt te en ni id do o d de el l C Cu ur rs so o
- - C Co on nc ce ep pt to os s B Ba as si ic co os s
- - E Es st tr ru uc ct tu ur ra as s d de e C Co on nt tr ro ol l
- - A Ar rr re eg gl lo os s
- - O Ot tr ro os s t ti ip po os s d de e d da at to os s d de er ri iv va ad do os s
- - F Fu un nc ci io on ne es s
- - A Ap pu un nt ta ad do or re es s
- - A As si ig gn na ac ci i n n d de e m me em mo or ri ia a d di in na am mi ic ca a y y e es st tr ru uc ct tu ur ra as s d de e d da at to os s
- - T T p pi ic co os s a av va an nz za ad do os s e en n a ap pu un nt ta ad do or re es s
- - E En nt tr ra ad da af fS Sa al li id da a
- - E El l P Pr re e- -p pr ro oc ce es sa ad do or r d de e C C
- - D De es sa ar rr ro ol ll lo o d de e p pr ro og gr ra am ma as s c co on n v va ar ri io os s m m d du ul lo os s

C Co on nc ce ep pt to os s B Ba as si ic co os s ( (d de el l l le en ng gu ua aj je e C C) )
- Es un lenguaje pequeno. Tiene menos palabras reservadas
que PASCAL, pero es aun mucho mas poderoso.
- C es portable.
- Tiene un conjunto muy poderoso de operadores.
- E Es s m mo od du ul la ar r. .

E Es st tr ru uc ct tu ur ra a d de e u un n p pr ro og gr ra am ma a e en n C C
- Los programas C consisten de mdulos o piezas que se
denominan funciones.
- Los programadores aprovechan una gran recopilacin de
funciones existentes, que se conoce como Libreria Estandar de
C.
- - Una funcin llamada main es el punto donde comienza la
ejecucin del programa. .


Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
2


Estructura de un Programa
Este es un progrma simple en C que imprime por pantala un mensaje.
#include <stdio.h>

main()
{
printf("This is a C program\n");
}
Tipos de Archivos
.c -> Cdigo de las funciones de la libreria o programa principal.
.h -> Encabezados de funciones que seran utilizadas desde otros archivos o
modulos. Definicin de estructuras y variables globales utilizadas por otros
modulos.
Un archivo debe incluir todas las librerias externas que utilice, sean estas nativas
del sistema o creadas por el usuario.
Para incluir una libreria del sistema (ubicadas en fusrfincludef)
#include <stdlib.h>;
Para incluir una libreria propia
#include "xxx.h";
Estructura de xxx.h
#ifndef xxx_h
#define xxx_h
#include <...>;
#include "...";
/* definicin de estructuras */
/* declaracin de variables globales */
/* definicin de funciones*/
#endif
Funciones
return_value function(data_type var_name, ...)
La funcin main es la funcin principal del programa y debe aparecer slo en el
archivo .c principal, el encabezado del main es el siguiente:
main (int argc, char *argv[])
donde argc representa el numero de parametros con que fue invocada la funcion
desde la linea de comandos, y argv representa un arreglo de apuntadores a
cadenas de caracteres, que son cada uno de los parametros.



Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
3



v va ar ri ia ab bl le es s, , C Co on ns st ta an nt te es s, , D De ec cl la ar ra ac ci io on ne es s e en n C C
- v va ar ri ia ab bl le es s
-Dan nombres unicos a varios objetos dentro del programa.
-Sus nombres pueden estar formados por letras, digitos y _
(underscores), pero no pueden comenzar con digitos. Segun el
estandar ANS! slo se reconoceran los primeros 31 caracteres.
-Las variables deben declararse antes de utilizarse con un nombre
y un tipo de datos.
-En una misma linea se pueden declarar varias variables del mismo
tipo.
-C es case-sensitive.
-Las declaraciones sirven para dos propsitos:
-le dicen al compilador qu cantidad de espacio debe reservar.
-le permiten al compilador instruir a la maquina para efectuar las
instrucciones correctamente.

main() {
int integer1 = 2, integer2, sum; /* declaracin */
integer2 = 20;
sum = integer1 + integer2;
printf(La suma de %d y %d es %d, integer1, integer2, sum );
return 0; /* indica que el programa termin con xito */
}

T Ti ip po os s d de e D Da at to os s F Fu un nd da am me en nt ta al le es s
- - L Lo os s t ti ip po os s b ba as se e s se e d di iv vi id de en n e en n t tr re es s g gr ra an nd de es s c cl la as se es s: :
- -L Lo os s e en nt te er ro os s ( (p pa al la ab br ra a c cl la av ve e i in nt t) ): : 3 3, , - -1 15 5, , e et tc c
- -N Nu um me er ro os s d de e c co om ma a f fl lo ot ta an nt te e ( (f fl lo oa at t o o d do ou ub bl le e) ): : 3 3. .1 1+ +, , 3 3. .0 0E E- -2 2
- -C Ca ar ra ac ct te er re es s ( (c ch ha ar r) ): : c c, , d d, , e e






Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
4



T Ti ip po os s d de e D Da at to os s F Fu un nd da am me en nt ta al le es s
- - T Ti ip po os s e en nt te er ro os s
- -E En n b bo or rl la an nd d C C l lo os s t ti ip po os s i in nt t y y s sh ho or rt t s so on n i id d n nt ti ic co os s. .
- -s si ig gn ne ed d: : e el l b bi it t m ma as s s si ig gn ni if fi ic ca at ti iv vo o s se e u ut ti il li iz za a p pa ar ra a r re ep pr re es se en nt ta ar r e el l s si ig gn no o y y e el l
v va al lo or r a ab bs so ol lu ut to o d de el l n nu um me er ro o s se e c co od di if fi ic ca a e en n l lo os s b bi it ts s r re es st ta an nt te es s ( (1 15 5 o o 3 31 1) ). .
- -u un ns si ig gn ne ed d: : s s l lo o s se e r re ep pr re es se en nt ta an n n nu um me er ro os s p po os si it ti iv vo os s o o ( (n nu ul lo os s) ), , u ut ti il li iz za an nd do o
t to od do os s l lo os s b bi it ts s d di is sp po on ni ib bl le es s. .
- - T Ti ip po os s c co om ma a f fl lo ot ta an nt te e
L La a z zo on na a u ut ti il li iz za ad da a p pa ar ra a e el l n nu um me er ro o s se e d de es sc co om mp po on ne e e en n t tr re es s p pa ar rt te es s: :
- -u un n b bi it t r re es se er rv va ad do o p pa ar ra a e el l s si ig gn no o
- -u un n e es sp pa ac ci io o p pa ar ra a e el l e ex xp po on ne en nt te e: : 8 8 b bi it ts s e en n e el l f fl lo oa at t, , 1 11 1 b bi it ts s e en n e el l d do ou ub bl le e, ,
1 1+ + e en n e el l l lo on ng g d do ou ub bl le e. .
- -e el l r re es st to o p pa ar ra a l la a m ma an nt ti is sa a: : 2 23 3 b bi it ts s e en n e el l f fl lo oa at t, , 5 52 2 b bi it ts s e en n e el l d do ou ub bl le e, , 6 6+ + e en n
e el l l lo on ng g d do ou ub bl le e. .

d de ec cl la ar ra ac ci io on ne es s d de e C Co on ns st ta an nt te es s
- C manipula varias clases de valores enteros (29, 123+, etc), reales (3.1+,
1.0e-5) que son ejemplos de constantes.
- a', b', etc, son constantes tipo caracter.
- Una secuencia de 0 o mas caracteres encerrados entre comillas (Yo estoy
aqui") es una constante de cadena o cadena literal.

Las lineas:
#define S!ZE 10
#define P! 3.1+159
definen constantes simblicas. Una constante simblica es un
identificador que es reemplazado por el prepocesador, antes que el
programa sea compilado.

- El uso de constantes hace el programa mas comprensible.
- Si una constante se ha definido a travs de #define y se usa en
todo el programa, es mas facil cambiar su valor posteriormente.
- - E Es s p po os si ib bl le e d de ec cl la ar ra ar r q qu ue e e el l v va al lo or r d de e u un na a v va ar ri ia ab bl le e n no o c ca am mb bi ie e a a l lo o l la ar rg go o
d de e l la a e ej je ec cu uc ci i n n d de e u un n p pr ro og gr ra am ma a: :
c co on ns s i in nt t n n = = 2 20 0; ;

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
5


C Co on nc ce ep pt to os s B Ba as si ic co os s ( (C Co on ns st ta an nt te es s) )
- - E Es sc cr ri it tu ur ra a d de e c co on ns st ta an nt te es s e en nt te er ra as s
+ +5 53 33 3 + +8 8 - -2 27 73 3
U Un n 0 0 ( (c ce er ro o) ) a al l c co om mi ie en nz zo o d de e u un na a c co on ns st ta an nt te e e en nt te er ra a i in nd di ic ca a q qu ue e e es s u un n o oc ct ta al l y y
0 0x x 0 0X X q qu ue e e es s h he ex xa ad de ec ci im ma al l. .
3 31 1 d de ec ci im ma al l = = 0 03 37 7 ( (o oc ct ta al l) ) = = 0 0x x1 1f f ( (h he ex xa a) )

- - E Es sc cr ri it tu ur ra a d de e c co on ns st ta an nt te es s e en n c co om ma a f fl lo ot ta an nt te e
- -D De ec ci im ma al l: : 1 12 2. .4 43 3 - -0 0. .3 38 8 - -. .3 38 8 4 4. .
- -E Ex xp po on ne en nc ci ia al l: : 4 4. .2 24 4E E4 4 4 48 8e e1 13 3 5 54 42 2. .7 7E E- -3 33 3
- -3 3e e1 13 3
P Po or r d de ef fe ec ct to o, , t to od da as s l la as s c co on ns st ta an nt te es s d de e c co om ma a f fl lo ot ta an nt te e s so on n c cr re ea ad da as s p po or r e el l
c co om mp pi il la ad do or r d de el l t ti ip po o d do ou ub bl le e. . S Si in n e em mb ba ar rg go o e es s p po os si ib bl le e i im mp po on ne er rl le e e el l t ti ip po o: :
1 1. .2 25 5E E0 03 3f f ( (f fl lo oa at t) )
1 1. .0 0L L ( (l lo on ng g d do ou ub bl le e) )

- - E Es sc cr ri it tu ur ra a d de e c co on ns st ta an nt te es s t ti ip po o c ca ar ra ac ct te er r: :
- - L Lo os s c ca ar ra ac ct te er re es s i im mp pr ri im mi ib bl le es s s se e e es sc cr ri ib be en n e en nt tr re e a ap p s st tr ro of fe es s: :a', y' c' $'. .
- - L Lo os s n no o i im mp pr ri im mi ib bl le es s s se e i im mp pr ri im me en n u us sa an nd do o e el l c ca ar ra ac ct te er r " ". . E Ej je em mp pl lo os s: :
n n L LF F ( (L Li in ne e F Fe ee ed d) ) S Sa al lt to o d de e L Li in ne ea a
t t H HT T ( (H Ho or ri iz zo on nt ta al l T Ta ab b) ) T Ta ab bu ul la ac ci i n n H Ho or ri iz zo on nt ta al l
v v v vT T ( (v ve er rt ti ic cl la a T Ta ab b) ) T Ta ab bu ul la ac ci i n n v ve er rt ti ic ca al l

f f F FF F ( (F Fo or rm m F Fe ee ed d) ) S Sa al lt to o d de e P Pa ag gi in na a

( (O Op pe er ra ad do or re es s a ar ri it tm m t ti ic co os s, , r re el la ac ci io on na al le es s, , e et tc c. .) )
- - L Lo os s o op pe er ra ad do or re es s a ar ri it tm m t ti ic co os s s so on n: : + +, , - -, , * *, , f f, , ( (m m d du ul lo o) )
- - S So on n t to od do os s o op pe er ra ad do or re es s b bi in na ar ri io os s. .
- - E En n B Bo or rl la an nd d C C, , p p q q s se e d de ef fi in ne e p pa ar ra a p p y y q q d de e c cu ua al lq qu ui ie er r s si ig gn no o c co om mo o t te en ni ie en nd do o u un n
v va al lo or r a ab bs so ol lu ut to o i ig gu ua al l a a: : { {p p{ { { {q q{ { y y e el l s si ig gn no o d de e p p. .
- - E El l c co oc ci ie en nt te e e en nt tr re e 2 2 e en nt te er ro os s d de ev vu ue el lv ve e u un n e en nt te er ro o, , p pe er ro o e el l c co oc ci ie en nt te e d de e d do os s
n nu um me er ro os s e en n c co om ma a f fl lo ot ta an nt te e e es s u un n n nu um me er ro o e en n c co om ma a f fl lo ot ta an nt te e. .
5 5f f2 2 = = 2 2, , p pe er ro o 5 5. .f f2 2. . = = 2 2. .5 5
- - R Re eg gl la as s d de e p pr re ec ce ed de en nc ci ia a
() || -~
sizeoI (tipo) & * - -- ~ !
* /
-
~~
&

`
,
&&
,,
?:
- * / & ` , ~~
,
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
6


E Ej je em mp pl lo os s: :
m m = = a a + + b b + + c c + + d d + + e e ( (a al lg ge eb br ra a) )
5 5
m m = = ( (a a + + b b + + c c + + e e) )/ /5 5 ( (C C) )


S Si i s se e o om mi it te en n l lo os s p pa ar r n nt te es si is s, , l la a e ex xp pr re es si i n n s se e c ca al lc cu ul la a c co om mo o: :
m m = = a a + + b b + + c c + + e e/ /5 5

E EX XP PR RE ES S! !O ON NE ES S, , ! !N NS ST TR RU UC CC C! !O ON NE ES S Y Y A AS S! !G GN NA AC C! !O ON N
- - L La as s e ex xp pr re es si io on ne es s s so on n c co om mb bi in na ac ci io on ne es s d de e c co on ns st ta an nt te es s, , v va ar ri ia ab bl le es s, , o op pe er ra ad do or re es s y y
l ll la am ma ad da as s a a f fu un nc ci io on ne es s. . E Ej jm m: :
a a + + b b
3 3. .0 0 * * x x - - 9 9. .6 66 65 55 53 3
3 3+ + s su um m( (x x, ,y y) )
- - L La a m ma ay yo or ri ia a d de e l la as s e ex xp pr re es si io on ne es s t ti ie en ne en n u un n v va al lo or r. .
- - S Si i a al l f fi in na al l d de e u un na a e ex xp pr re es si i n n s se e c co ol lo oc ca a u un n ; ; l la a e ex xp pr re es si i n n s se e c co on nv vi ie er rt te e e en n u un na a
p pr ro op po os si ic ci i n n: :
! ! = = 7 7; ;
z z = = 3 3+ + s su um m( (x x, ,y y) ); ;
L La as s { { ) ) s se e e em mp pl le ea an n p pa ar ra a a ag gr ru up pa ar r d de ec cl la ar ra ac ci io on ne es s o o
p pr ro op po os si ic ci io on ne es s e en n u un na a d de ec cl la ar ra ac ci i n n c co om mp pu ue es st ta a o o b bl lo oq qu ue e. .
w wh hi il le e ( (x x = == = 1 1) ) { { . .. .. .. .) )
E El l o op pe er ra ad do or r d de e a as si ig gn na ac ci i n n e es s e el l s si ig gn no o = =
! ! = = 7 7; ; l la a e ex xp pr re es si i n n c co om mo o u un n t to od do o t to om ma a e el l v va al lo or r 7 7

E El l o op pe er ra ad do or r = = s se e a as so oc ci ia a d de e d de er re ec ch ha a a a i iz zq qu ui ie er rd da a, ,
d de e m mo od do o q qu ue e: :
x x = = y y = = z z = = 0 0 s se e r re es su ue el lv ve e c co om mo o x x = = ( (y y = = ( (z z = = 0 0) )) ); ;
a a = = b b; ;
i if f ( (a a = = 1 1) ) { {
. .. .. .. .
) )

a a= = b b; ;
i if f ( (a a = == = 1 1) ) { {
. .. .. .. .
) )


O Op pe er ra ad do or re es s a ar ri it tm m t ti ic co os s, , r re el la ac ci io on na al le es s, , e et tc c. .
- Operadores de !ncremento y Decremento
- Son operadores unarios.
- Pueden aplicarse a variables, pero no a constantes o
expresiones.
- Pueden usarse como
-prefijos: ++a (preincremento), --a (predecremento)
-sufijos: a++ (postincremento), a-- (postdecremento).
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
7



i in nt t n n = = 5 5; ;
x x = = n n+ ++ +; ; f f* * a as si ig gn na a 5 5 a a x x
y y e el l v va al lo or r f fi in na al l d de e
n n = = 6 6 * *f f

i in nt t n n = = 5 5; ;
x x = = + ++ +n n; ; f f* * a as si ig gn na a 6 6 a a x x
n n = = 6 6 * *f f


Operadores RELAC!ONALES y de !GUALDAD
- Los operadores relacionales permiten tomar decisiones en base
a comparaciones.
- Son operadores binarios. Toman dos expresiones como
operandos y producen el valor entero 0 1.
- Los operadores relacionales tienen el mismo nivel de precedencia y
se asocian de izquierda a derecha.
- Los operadores de igualdad tienen un nivel de precedencia menor
que los operadores relacionales. Tambin se asocian de izquierda a
derecha.
a < b == c < d se interpreta como:
(a < b) == (c < d)

O Op pe er ra ad do or re es s a ar ri it tm m t ti ic co os s, , r re el la ac ci io on na al le es s, , e et tc c. .
- Precedencia de operadores aritmticos y relacionales
x + y < a + 2
es equivalente a:
(x+y) < (a + 2)

Operadores Lgicos
- 88 {{ y !: cuando se aplican a las expresiones producen los valores
enteros 0 1.
- La negacin lgica puede aplicarse a una expresin arbitraria.
- Si una expresin tiene el valor 0 o 0.0, su negacin producira el
valor entero 1. Si la expresin tiene un valor distinto de 0 su
negacin producira el valor entero 0.
Ejemplo
!(2*(x+a)-3 - 'z')
- Las tablas de la verdad para los operadores 88 (and) y {{ (or) son
los mismos del and y or lgicos.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
8


- En la evaluacin de las expresiones que contienen 88 y {{, el
proceso de la evaluacin termina tan pronto se conoce el valor de la
expresin
Ejemplo:
while (a < b && c > 0)
f* hacer algo *f
- Reglas de precedencia (NA).
a < b && c < d
equivale a
(a < b) && (c < d)

Operador de asignacin ampliada
c = c + 3
puede abreviarse utilizando el operador
de asignacin ampliada, como:
c += 3
En general, cualquier enunciado de la forma
variable = variable operador (expresion)
puede escribirse de la forma:
variable operador = expresion

k *= 3 + x
Es equivalente a:
k = k * (3 + x)
y no a:
k = k * 3 + x














Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
9


E Es st tr ru uc ct tu ur ra as s d de e C Co on nt tr ro ol l ( (C Co on nd di ic ci io on na al le es s) )
- La estructura de seleccin if.
Ejecuta la accin indicada slo cuando la condicin es
verdadera, de lo contrario la accin es pasada por alto.
if (nota >= 10) {
printf (Aprobo el curso);
aprobados++;
}
- La estructura de seleccin if/else permite que el
programador especifique acciones distintas cuando la condicin
es verdadera o falsa.
if (nota >= 10) {
printf (Aprobo el curso);
aprobados++;
} else
reprobados++;

if (nota >= 85)
nota_5 = 5;
else
if (nota >= 70)
nota_5 = 4;
else
if (nota >= 50)
nota_5 = 3;
else
nota_5 = 2;

if (nota >= 85);
nota_5 = 5;
else if (nota >= 70)
nota_5 = 4:
else if (nota >= 50)
nota_5 = 3;
else nota_5 = 2;


- El operador condicional ?" es el unico operador ternario
nota ~ 50 ? printI('aprobado): printI('reprobado)
operando1 operando2 operando3

- La estructura de seleccin multiple switch
switch(expresion) /* expresion entera */
{
case constante_1: [serie de instr.1] /* exp. Const. entera */
case constante_2: [serie de instr.2]
....
case constante_n: [serie de instr. n]
default: [serie de instr.]
}
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
10



main() {
int n;
printf (introduzca un
entero);
scanf(%d, &n);
switch(n) {
case 0: printf(nul\n);
break;
case 1:
case 2:
printf(pequeo);
case 3:
case 4:
case 5: printf(mediano);
break;
default:
printf(grande);
}
1
pequeo
mediano

4
mediano

25
grande


E Es st tr ru uc ct tu ur ra as s d de e C Co on nt tr ro ol l ( (C Ci ic cl lo os s) )
- - La estructura de repeticin WH!LE
-Permite al programador especificar que se repita una accin, en tanto
cierta condicin se mantenga verdadera.
-La instruccin puede ejecutarse cero o mas veces.
total = 0;
counter = 1;
while (counter <= 10) {
printf(Enter grade: );
scanf(%d, &grade);
total = total + grade;
counter = counter + 1;
}
average = total /10;
printf(class average is %d\n, average);

- La estructura de repeticin FOR: : Naneja de forma automatica los
detalles de la repeticin controlada por un contador.

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
11




- La estructura de repeticin do-while:
d do o
p pr ro op po os si ic ci i n n
w wh hi il le e ( (e ex xp pr re es si i n n) ); ;

m ma ai in n( () ) { {
i in nt t c co ou un nt te er r = = 1 1; ;
d do o { {
p pr ri in nt tf f( ( % %d d , , c co ou un nt te er r ) ); ;
} } w wh hi il le e( (+ ++ +c co ou un nt te er r < <= = 1 10 0) ); ;
r re et tu ur rn n 0 0; ;
} }


- - b br re ea ak k: :
-Sirve para interrumpir el desarrollo de un bucle.
-En el caso de bucles anidados, break sale del bucle mas interno.
i in nt t x x; ;
f fo or r ( (x x= =1 1; ; x x < <= = 1 10 0; ; x x+ ++ +) ){ {
i if f ( (x x = == = 5 5) )
b br re ea ak k; ;
p pr ri in nt tf f( ( % %d d\ \n n , , x x) ); ;
} }

I Im mp pr ri im me e: :
1 1 2 2 3 3 4 4



- - c co on nt ti in nu ue e: :
-Permite pasar prematuramente a la siguiente iteracin del bucle
i in nt t x x; ;
f fo or r ( (x x= =1 1; ; x x < <= = 1 10 0; ; x x+ ++ +) ){ {
i if f ( (x x = == = 5 5) )
c co on nt ti in nu ue e; ;
p pr ri in nt tf f( ( % %d d\ \n n , , x x) ); ;
} }

I Im mp pr ri im me e: :
1 1 2 2 3 3 4 4 6 6 7 7 8 8 9 9 1 10 0



for (counter = 1; counter <= 10; counter++)

variable de
control
valor final
de la v. de
control
valor inicial de
la variable
!ncremento de
la v. de control
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
12


A Ar rr re eg gl lo os s
- Un arreglo es un grupo de posiciones de memoria
relacionadas entre si: todas tienen el mismo nombre y son
del mismo tipo.
- Declaracin:
tipo nombre[num_elementos]


- Un indice puede tomar la forma de cualquier expresin
aritmtica de tipo entero: t[n-3|, t[3*p-2*k|
- La dimensin de un arreglo slo puede ser una constante o una
expresin constante
#define N 50
int t[N];
float h[2*N-1];
- La declaracin de un arreglo se realiza segun la siguiente
sintaxis :
tipo_variable nombre[numero_elementos];
ejemplo :
int var1[10];
char nombre[50];
float numeros[200];
long double cantidades[25];
int c 12; f* Reserva espacio para 12 elementos del tipo int *f

+
5
- 15
78
c[0|

c[1|

c[2|




c[11|
nombre
Posicin
o indice
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
13



- La inicializacin de un arreglo local, puede realizarse en su
declaracin:
int numero[8] = {4,7,0,0,0,9,8,7};
- Otra posibilidad , slo valida cuando se inicializan todos los
elementos del arreglo, es:
int numero[]={0,1,2,3,4,5,6,7,8,9};
- Tambin se pueden inicializar parcialmente:
int numero[10] = {1,1,1};

E Ej je em mp pl lo o
# define N 10
main{
int i, array[N];
int total = 0;
for(i = 0; i < N; i++)
total += array[i];
}

C CO ON NJ JU UN NT TO O O OR RD DE EN NA AD DO O D DE E C CA AR RA AC CT TE ER RE ES S ( (S ST TR R! !N NG GS S) )
- Los strings son arreglos de caracteres que culminan con el
caracter NULL ( ASC!! == 0 , simbolizado por la secuencia de
escape 0 ) .
- Se puede generar un string , declarando :
char car_str[] = {'A','B','C','D',0};
char car_str[] = {'A','B','C','D','\0'};
- Hay una forma mas compacta de declararlos :
char car_str[] = "ABCD";
char car_str[5] = "ABCD";

- C no posee facilidades para el manejo de strings", de modo que las
siguientes instrucciones son ilegales:
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
14



char firstname[50],lastname[50];

firstname = "Arnold"; /* Ilegal */
lastname = "Schwarznegger"; /* Ilegal */

char firstname[] = Arnold; /* Ok */

- Para imprimir un string se usa printf con el caracter de control %s :
printf(%s,name);

- Para copier los caracteres de un string a otro usa strcpy :
char firstname[50],lastname[50];
char tempname[50];
strcpy(tempname, firstname);

Otras funciones para el manejo de strings son:
strlen(), strcmp(), strcat(), etc.

A Ar rr re eg gl lo os s N Nu ul lt ti id di im me en ns si io on na al le es s
- Los arreglos pueden tener mas de una dimensin, por ejemplo :
int matriz[num_fil][num_col];
- En C, un arreglo de dos dimensiones es en realidad un arreglo
unidimensional, cada uno de cuyos elementos es un arreglo.
- L Lo os s e el le em me en nt to os s s se e a al lm ma ac ce en na an n p po or r f fi il la as s. .
!nicializacin:
char dia_de_la_semana[7][8] = {
"lunes","martes","miercoles" ,
"jueves","viernes","sbado",
"domingo"
};
El elemento [0|[0| sera la "l" de lunes , el [2|[3| la "r" de miercoles , etc.
Los elementos [0|[5| , [1|[6| ,etc estan inicializados con NULL; y [0|[6| y
[0|[7|, etc no han sido inicializados.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
15


D De ef fi in ni ic ci i n n d de e N Nu ue ev vo os s T Ti ip po os s

- C proporciona un facilidad llamada typedef para crear nuevos
tipos de datos.
Tipo base Nuevo Nombre

typedef int Longitud;
Longitud len, maxlen;
typedef int vector[3];
int a[3],b[3];
vector a, b; Son equivalents

T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (E Es st tr ru uc ct tu ur ra as s) )
- Existe en C un tipo de variable compuesta, llamada
ESTRUCTURA que puede contener variables de distinto tipo.
Ejemplo :
struct empleado {
int edad;
char nombre[50];
float sueldo;
};
struct empleado vendedores, profesionales;

T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (E Es st tr ru uc ct tu ur ra as s) )
- Las dos instrucciones pueden combinarse en una sola:
struct empleado {
int edad;
char nombre[50];
float sueldo;
} vendedor , programador;
- Si no fueran a realizarse mas declaraciones de variables de ste
tipo, podria obviarse el nombre de la estructura (empleado).

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
16


T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (E Es st tr ru uc ct tu ur ra as s) )
REGLAS PARA EL USO DE ESTRUCTURAS
- Para dirigirnos a un miembro particular de una estructura existe un
operador que relaciona al nombre de ella con el de cada miembro;
es el operador ( . ).
nombre_estructura.nombre_del_miembro

struct posicion_de {
float eje_x;
float eje_y;
float eje_z;
}fin_recta,inicio_recta = {1.0,2.0,3.0};
fin_recta.eje_x = 10.0;
fin_recta.eje_y = 50.0;
fin_recta.eje_z = 90.0;
if(fin_recta.eje_x == inicio_recta.eje_x)

- Dos estructuras, aunque sean del mismo tipo, no pueden ser
asignadas o comparadas en forma directa, sino asignando o
comparandolas miembro a miembro.
fin_recta = inicio_recta; /* ERROR */
fin_recta.eje_x = inicio_recta.eje_x;
fin_recta.eje_y = inicio_recta.eje_y;
fin_recta.eje_z = inicio_recta.eje_z;

- Las estructuras pueden anidarse.
- Las estructuras tambin pueden ser pasadas a las funciones
como parametros, y ser retornadas por stas, como
resultado.

Las estructuras se pueden agrupar de forma ordenada como
elementos de un arreglo.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
17


typedef struct {
char material[50];
int existencia;
double costo_unitario;
}item;
item almacen[100];
almacen[50].existencia =1000;
costo_tornillo = almacen[0].costo_unitario;

T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (E Es st tr ru uc ct tu ur ra as s) )
Los arreglos de estructuras pueden inicializarse de la forma
habitual:
item almacen1[100] = {
"tornillos" , 120 , .15 ,
"tuercas" , 200 , .09 ,
clavos" , 90 , .01
} ;

item almacen2[] = {
{ 'i','t','e','m','1','\0' }10,1.5,
{ 'i','t','e','m','2','\0'},20,1.0,
{ 'i','t','e','m','3','\0'},60,2.5,
{ 'i','t','e','m','4','\0'},40,4.6,
{ 'i','t','e','m','5','\0'},10,1.2,
} ;


T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (E Es st tr ru uc ct tu ur ra as s) )
- Se puede aplicar el operador sizeof, de la siguiente forma:
tam_base_datos = sizeof(almacen1);
tam_de_item = sizeof(item) ;
num_datos = sizeof(almacen1)/sizeof(item);

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
18


T Ti ip po os s d de e D Da at to os s D De er ri iv va ad do os s ( (U Un ni io on ne es s) )
- Una union" es una variable que puede almacenar (en momentos
diferentes) objetos de diferentes tamanos y tipos.
- Para este tipo de variables se usa la instruccin union:
union numero {
short tiposhort;
long tipolong;
double tipofloat;
} minumero
printf("%f",minumero.tipofloat);

- Una union" es una variable que puede almacenar (en momentos
diferente) objetos de diferentes tamanos y tipos.
- C usa la instruccin union para uniones:
union numero {
short tiposhort;
long tipolong;
double tipofloat;
} minumero
printf("%f",minumero.tipofloat);


struct {
char *name;
int flags;
int utype;
union {
int ival;
float fval;
char *sval;
}u;
} symtab[NSYM];
if (symtab[i].utype == INT)
printf(%d\n,
symtab[i].u.ival);)



Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
19


C Ca as st ti in ng g
C es uno de los pocos lenguajes que permite forzar una variable de
uno tipo para que sea de otro tipo (coercion). Esto se logra a travs
del operador cast ( ).

int num_entero;
float num_real=9.87;
num_entero=(int)num_real; /* asigna 9
a num_entero */
int num_entero=10;
float floatnumber;
floatnumber=(float)num_entero; /*floatnumber = 10.0. */

- Puede usarse con cualquiera de los tipos de datos simples:
int num_entero;
char letra='A';
num_entero=(int)letra; /* asigna 65 (El cdigo ASCII de
`A') a num_entero*/

- Algunas veces se realiza en forma automatica.
- Una buena regla es: si tiene duda, coloque el cast.

Otro uso del cast es cuando se quiere estar seguro de que la divisin
retorna el resultado que se desea:

int num_entero, otro_entero;
....
num_real =
(float) num_entero / (float) otro_entero;
/* Asegura que el resultado es real */





Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
20



T Ti ip po os s d de e d da at to os s e en nu um me er ra ad do os s
Los tipos de datos enumerados contienen una lista de constantes
que pueden ser direccionadas como valores enteros.
enum dias {lunes, martes, ..., domingo} semana;
enum dias semana1, semana2;

- Se pueden definir otros valores:
enum escapes { bell = `a',backspace = `b', tab = `t',
newline = `n', vtab = `v',
return = `r'};
- ... O forzar que el valor inicial no sea el 0 :
enum meses {ene = 1, feb, mar, ..., dic};
Esta implicito que feb = 2 etc.
Ejemplo:
enum day {dom, lun, mar, mier, jue, vier, sab} d1, d2;
d1 = vier;
....
if (d1 == d2) ....











Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
21


F Fu un nc ci io on ne es s
- C ofrece, como la mayoria de los lenguajes el concepto de
funciones.
- A diferencia de otros lenguajes como Pascal, C no tiene
procedimientos.
t ti ip po or re et to or rn no o n no om mb br re e_ _f fu un nc c( (p pa ar rd de ef f1 1, , p pa ar rd de ef f2 2, ,. .. .. .) ){ {
v va ar ri ia ab bl le es s l lo oc ca al le es s

c c d di ig go o d de e l la a f fu un nc ci i n n
} }
Ejemplo: calcular el promedio de dos enteros
f fl lo oa at t p pr ro om me ed di io o( (f fl lo oa at t a a, , f fl lo oa at t b b) ){ {
f fl lo oa at t p pr ro om m; ;
p pr ro om m= =( (a a+ +b b) )/ /2 2; ;
r re et tu ur rn n( (p pr ro om m) ); ;
} }

La llamada es:

m ma ai in n( () ){ {
f fl lo oa at t a a= =5 5, ,b b= =1 15 5, ,r re es su ul lt t; ;

r re es su ul lt t= =p pr ro om me ed di io o( (a a, ,b b) ); ;
p pr ri in nt tf f( ( p pr ro om me ed di io o= =% %f f" ", ,r re es su ul lt t) ); ;
} }



F Fu un nc ci io on ne es s ( (P Pa as sa aj je e d de e P Pa ar ra am me et tr ro os s) )
- Los argumentos que se les pasan a las funciones son los
vALORES de las variables y NO las variables mismas
v vo oi id d s sw wa ap p( (i in nt t i i, ,i in nt t j j) ){ {
i in nt t t te em mp p; ;
t te em mp p = = i i; ;
i i = = j j; ;
j j = = t te em mp p; ;
} }
i in nt t x x= =3 3, , y y= =+ +; ;
. .. .. .
s sw wa ap p( (x x, ,y y) ); ;
f f* * x x e es s 3 3 y y e es s + + * *f f


F Fu un nc ci io on ne es s v vO O! !D D
- La funcin void ofrece una forma de imitar los
Procedimientos de PASCAL.
- -Si no se desea retornar un valor se debe usar como tipo de
retorno el void y omitir de la funcin la instruccin
return.

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
22


F Fu un nc ci io on ne es s v vO O! !D D
void cuadrados(){
int ciclo;
for(ciclo=1;ciclo<10;ciclo++);
printf("%d\n",ciclo*ciclo);
}
main() {
cuadrados();
}


F Fu un nc ci io on ne es s y y A Ar rr re eg gl lo os s
L Lo os s a ar rr re eg gl lo os s d de e u un na a d di im me en ns si i n n p pu ue ed de en n p pa as sa ar rs se e a a l la as s f fu un nc ci io on ne es s c co om mo o
p pa ar ra am me et tr ro os s: :
float promedio(int size,float list[])
{
int i;
float suma=0.0;
for (i=0;i<size;i++)
suma+=list[i];
return(sum/size);
}
La declaracin float list[| le dice a C que list es un vector de
reales.

Arreglos Nulti-dimensionales:
void printtable(int xsize,int ysize,
float tabla[][5]){ int x,y;

for (x=0;x<xsize;x++){
for (y=0;y<ysize;y++)
printf("t%f",table[x][y]);
printf("n");
}
}
float tabla[|[5| le dice a C que la tabla es un arreglo de dimensin Nx5.




Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
23



F Fu un nc ci io on ne es s ( (T Ti ip po os s d de e v va ar ri ia ab bl le es s) )
vAR!ABLES GLOBALES
- Estan definidas AFUERA de cualquier funcin (incluyendo main() )
- Existiran todo el tiempo que est ejecutandose el programa.
- Se inicializan automaticamente en CERO cuando el programa
comienza a ejecutarse.
- Son accesibles desde todas las funciones.
# #i in nc cl lu ud de e < <s st td di io o. .h h> >
d do ou ub bl le e u un na a_ _f fu un nc ci io on n( (v vo oi id d) ); ;
d do ou ub bl le e v va ar ri ia ab bl le e_ _g gl lo ob ba al l; ;

m ma ai in n( () ){ {
d do ou ub bl le e i i ; ;
p pr ri in nt tf f( (" "% %f f" ", , v va ar ri ia ab bl le e_ _g gl lo ob ba al l ) ); ; / /* * 0 0 * */ /
i i = = u un na a_ _f fu un nc ci io on n( () ) ; ;
p pr ri in nt tf f( (" "% %f f" ", , i i ) ); ; / /* * 1 1 * */ /
p pr ri in nt tf f( (" "% %f f" ", , v va ar ri ia ab bl le e_ _g gl lo ob ba al l ) ); ; / /* * 1 1 * */ /
v va ar ri ia ab bl le e_ _g gl lo ob ba al l + += = 1 1 ; ;
p pr ri in nt tf f( (" "% %f f" ", , v va ar ri ia ab bl le e_ _g gl lo ob ba al l ) ); ; / /* * 2 2 * */ /
r re et tu ur rn n 0 0 ; ;
} }
d do ou ub bl le e u un na a_ _f fu un nc ci io on n( (v vo oi id d) ){ {
r re et tu ur rn n( (v va ar ri ia ab bl le e_ _g gl lo ob ba al l + += = 1 1) ) ; ;
} }

vAR!ABLES LOCALES
- Las variables definidas DENTRO de una funcin, se denominan
vAR!ABLES LOCALES o AUTONAT!CAS.
- Se crean y destruyen automaticamente por la llamada y el
retorno de una funcin respectivamente.
- - Se ubican en la pila dinamica (stack) de memoria.
- Su visibilidad esta limitada a la funcin donde son declaradas.
No guardan relacin con variables globales del mismo nombre.
- No se les pueda inicializar previamente, en consecuencia su
valor inicial sera indeterminado (basura).
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
24




d do ou ub bl le e p po ot te en nc ci ia a( (d do ou ub bl le e v va al l, , u un ns si ig gn ne ed d e ex xp p) ){ {
d do ou ub bl le e r re et t_ _v va al l = = 1 1. .0 0; ;
i in nt t i i; ;
f fo or r( (i i = = 0 0; ; i i < < e ex xp p; ; i i+ ++ +) ) r re et t_ _v va al l * *= = v va al l; ;
r re et tu ur rn n( (r re et t_ _v va al l) ); ;
} }
f fl lo oa at t f fl lo oa at t p pr ro om me ed di io o( (i in nt t s si iz ze e, ,f fl lo oa at t l li is st t[ [] ]) )
{ {
i in nt t i i; ;
f fl lo oa at t s su um ma a= =0 0. .0 0; ;
f fo or r ( (i i= =0 0; ;i i< <s si iz ze e; ;i i+ ++ +) ) s su um ma a+ += =l li is st t[ [i i] ]; ;
r re et tu ur rn n( (s su um m/ /s si iz ze e) ); ;
} }

vAR!ABLES LOCALES ESTAT!CAS
- Son variables que mantienen su valor, entre una y otra
llamada a la funcin sin por ello perder su ambito de
existencia.
- Se declaran con la palabra clave static.
m ma ai in n( () ) { {
v vo oi id d f fu un nc c( (v vo oi id d) ); ;
i in nt t n n; ;
f fo or r( (n n= =1 1; ;n n< <= =4 4; ;n n+ ++ +) )
f fu un nc c( () ); ;
} }
v vo oi id d f fu un nc c( (v vo oi id d) ){ {
s st ta at ti ic c i in nt t i i= =0 0; ;
i i+ ++ +; ;
p pr ri in nt tf f( ( l ll la am ma ad da a N Nr ro o. . % %d d , , i i) )
} }

L Ll la am ma ad da a N Nr ro o. . 1 1
L Ll la am ma ad da a N Nr ro o. . 2 2
L Ll la am ma ad da a N Nr ro o. . 3 3
L Ll la am ma ad da a N Nr ro o. . + +

vAR!ABLES GLOBALES ESTAT!CAS
- Son variables inaccesibles al exterior del archivo fuente donde
se encuentran definidas.
static int a;
main(){
}



Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
25



vAR!ABLES DE REG!STRO
- Son variables que se almacenan en los registros internos del
CPU.
- Se suelen usar registros para almacenar los contadores de los
bucles (FOR, WH!LE, etc).
register int x;
register char c;

vAR!ABLES EXTERNAS
- Son variables globales definidas en otro archivo.
- Para usarlas bastara con que se la DECLARE especificando que
es EXTERNA a dicho mdulo.
A Ar rc ch hi iv vo o 1 1
e ex xt te er rn n i in nt t s sp p; ;
e ex xt te er rn n d do ou ub bl le e v va al l[ [] ]; ;
v vo oi id d p pu us sh h( (d do ou ub bl le e f f) ) { { . .. .. . } }

d do ou ub bl le e p po op p( (v vo oi id d) ){ { . .. .. .} }

A Ar rc ch hi iv vo o 2 2

i in nt t s sp p; ;
d do ou ub bl le e v va al l[ [M MA AX X] ]



( (T Ti ip po os s d de e v va ar ri ia ab bl le es s) )
- Declaracin: expone las
propiedades de una variable
(principalmente su tipo)
extern int sp;
extern double val[];

- Definicin: aparte de exponer
propiedades de una variable,
tambin provoca que se le
reserve:
int sp;
double val[MAX]







Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
26


A Ap pu un nt ta ad do or re es s
Los apuntadores en el Lenguaje C, son variables que poseen la
direccin de la ubicacin en memoria de otras variables.

Declaracin de un apuntador:
tipo de variable apuntada *nombre_apunt;
int *pint ;
double *pfloat ;
char *letra , *codigo , *caracter ;

int x; /* se crea en memoria una variable entera */
int *p; /* se declara un apuntador que contendr la
direccin de una variable entera */
p = &x; /* al apuntador se le asigna la direccin de
la variable entera (x) */

- IMPORTANTE: Cuando se declara un apuntador no apunta a
ningun lugar. Es necesario inicializarlo antes de usarlo.
int *p;
*p = 100; /* error */
El uso correcto es:
int *p, x;
p = &x;
*p = 100;


0
+
8
1
2
1
2
0
2
c
int c,
...;
int *p;


c = 63;
p = 8c;

6
p
+
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
27



A Ap pu un nt ta ad do or re es s

- - I IM MP PO OR RT TA AN NT TE E: : C Cu ua an nd do o s se e d de ec cl la ar ra a u un n a ap pu un nt ta ad do or r n no o a ap pu un nt ta a a a
n ni in ng gu un n l lu ug ga ar r. . E Es s n ne ec ce es sa ar ri io o i in ni ic ci ia al li iz za ar rl lo o a an nt te es s d de e u us sa ar rl lo o. .
i in nt t * *p p; ;
* *p p = = 1 10 00 0; ; / /* * e er rr ro or r * */ /
E El l u us so o c co or rr re ec ct to o e es s: :
i in nt t * *p p, , x x; ;
p p = = & &x x; ;
* *p p = = 1 10 00 0; ;

- El simbolo 8 , se puede aplicar a variables, funciones , etc ,
pero no a constantes o expresiones.
- Para hallar el valor apuntado se utiliza el operador (*). Asi, son
equivalentes:
y = x ;
y = *p ;
printf("%d" , x ) ;
printf("%d" , *p) ;

O Op pe er ra ac ci io on ne es s s so ob br re e A Ap pu un nt ta ad do or re es s
- !ncremento de apuntadores
int *dir;
....
dir + 1; /* Ok */
dir += 10; /* incrementa dir para apuntar 10
elmtos. mas adelante */
- Cuando se incrementa un apuntador se incrementa en un
bloque de memoria (depende del tipo). Ejem: p++;
-Un apuntador a caracter sumara un byte a la direccin.
-Un apuntador a entero o float sumara + bytes a la
direccin
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
28


- Comparacin de apuntadores
Solo sc odran conarar auniadorcs dcl nisno iio.
int t[10];
int *p;
for (p=t; p < t+10;p++)
*p = 1;
- Resta de apuntadores: la diferencia proporciona el numero
de elementos del tipo en cuestin, situados entre las dos
direcciones.
int strlen(char *s){
char *p=s;
while (*p != `\0')
p++;
return p - s;
}
- Asignaciones y el apuntador NULL
int *p, *t, a[10];
p = a:
t = p;
n = NULL;
- Apuntadores genricos
void ceros(void *dir, int n) {
int i;
char *pch = dir;
for(i=0;i < n; i++, pch++) *pch = 0;
}
...
int t[0];
double z;
ceros(t, 10*sizeof(int));
ceros(&z, sizeof(z));
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
29


A Ap pu un nt ta ad do or re es s y y A Ar rr re eg gl lo os s
El nombre de un arreglo , para el compilador C , es un
APUNTADOR inicializado con la direccin del primer elemento
del arreglo.
float var,conjunto[]={8.0,7.0,6.0,5.0);
float *pf;
pf = conjunto; /* equivale a hacer
pf = &conjunto[0]*/
var1 = *pf;
*pf = 25.1;

- Recuperar un elemento de un arreglo usando apuntadores:
int *pa, a[10];
pa = a; /* equivale a pa = &a[0]*/
tambin ....
x = *(pa + i) equivale a x = a[i]

A Ap pu un nt ta ad do or re es s y y A Ar rr re eg gl lo os s
- Un arreglo como apuntador:
a[i] puede escribirse como *(a + i).
i.e. &a[i] = a + i.
- El apuntador lo podemos tratar como arreglo:
pa[i] en lugar de *(pa + i).

- Sin embargo los apuntadores y arreglos son diferentes:
-Un apuntador es una variable. Nosotros podemos hacer:
pa = a y pa++
-Un arreglo no es una variable. Las instrucciones
a = pa y a++ SON !LEGALES.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
30


AS!GNAC!ONES ERRONEAS
int conjunto[3], lista[] = {5,6,7};
int *apuntador ;
apuntador = lista ; /* correcto */
conjunto = apuntador; /* ERROR */
lista = conjunto ; /* ERROR */
apuntador = &conjunto /* ERROR no se puede aplicar el
operador & a una constante */

A Ar rr re eg gl lo os s d de e A Ap pu un nt ta ad do or re es s
- char *flecha; define un apuntador a un caracter.
- char *car[5|; define un arreglo de 5 apuntadores a caracteres.
- Los arreglos de apuntadores pueden inicializarse de la misma
forma que un arreglo comun:
char *months = {``no month'', ``jan'', ``feb,
...};

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
31


A Ap pu un nt ta ad do or re es s a a E Es st tr ru uc ct tu ur ra as s
- Los apuntadores pueden servir para el manejo de
estructuras, y su alojamiento dinamico.
- - Tienen ademas la propiedad de poder direccionar a los
miembros de las mismas utilizando el operador (->) .
s st tr ru uc ct t c co on nj ju un nt to o { {
i in nt t a a ; ;
d do ou ub bl le e b b ; ;
c ch ha ar r c c[ [5 5] ] ; ;
} } s st tc co on nj j ; ;
s st tc co on nj j. .a a = = 1 10 0 ; ;
s st tc co on nj j. .b b = = 1 1. .1 15 5 ; ;
s st tc co on nj j. .c c[ [0 0] ] = = ' 'A A' ' ; ;
C Co on n a ap pu un nt ta ad do or re es s: :
s st tr ru uc ct t c co on nj ju un nt to o * *p pc co on nj j ; ;
p pc co on nj j = = ( (s st tr ru uc ct t c co on nj ju un nt to o * *) )m ma al ll lo oc c( ( s si iz ze eo of f( ( s st tr ru uc ct t c co on nj ju un nt to o ) )) )
; ;
p pc co on nj j- -> >a a = = 1 10 0 ; ;
p pc co on nj j- -> >b b = = 1 1. .1 15 5 ; ;
p pc co on nj j- -> >c c[ [0 0] ] = = ' 'A A' ' ; ;

APUNTADORES CONO PARANETROS DE FUNC!ONES
Una estructura, se puede pasar a una funcin como argumento:
struct conjunto {
int a ;
double b ;
char c[5] ;
} datos ;
void funcion( struct conjunto d);
. . .
funcion(datos);







Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
32


Otra forma equivalente es utilizar un apuntador a la estructura
struct conjunto {
int a ;
double b ;
char c[5] ;
} a;
void una_funcion( struct conjunto *p);
una_funcion(&a);

APUNTADORES CONO RESULTADO DE UNA FUNC!ON
Podemos declarar funciones que devuelven apuntadores a un tipo
de datos:
char *funcion1(char * var1 ) ;
double *funcion2(int i, double j, char *k ) ;
struct item *funcion3( struct stock *puntst ) ;

APUNTADORES CONO RESULTADO DE UNA FUNC!ON
- El retorno de las mismas puede inicializar apuntadores del
mismo tipo al que se devuelve o de un tipo distinto.

void *malloc(int tamao) ;
p = (double *)malloc( 64 ) ;








Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
33


A Ap pu un nt ta ad do or re es s y y F Fu un nc ci io on ne es s
- Cuando en el lenguaje C se pasan argumentos a las funciones,
el pasaje de parametros es por valor.
- Los apuntadores se utilizan para realizar el pasaje de
parametros por referencia.
int a,b;
swap(a, b) /* NO FUNCIONA */.
- Es necesario pasar como parametro la direccin de las variables
para que stas puedan ser modificadas por la funcin
swap(&a, &b) /* Llamada */
. . .
void swap(int *px, int *py){
int temp;
temp = *px /* contents of pointer*/
*px = *py;
*py = temp;
}
typedef struct {float x,y,z;} COORD;

main() {
COORD p1, *coord_fn(); /* declara coord_fn
para que retorne
un apuntador a
COORD */
....
p1 = *coord_fn(...); /* asigna a p1 el
contenido de la
direccion retornada.*/
....
}
COORD *coord_fn(...){
COORD p;
.....
P.x = ....; /* asigna valores a la
estructura */
return &p; /* retorna la direccion de p */
}
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
34


A Ar rr re eg gl lo os s y y A Ap pu un nt ta ad do or re es s
Cuando un arreglo se pasa a una funcin como parametro lo que
realmente se esta pasando es la ubicacin en memoria de su primer
elemento:
strlen(s) equivale strlen(&s[0])
La declaracin de la funcin es:
int strlen(char s[]);
Y una declaracin equivalente es :
int strlen(char *s);
porque char s[| es similar a char *s.
strlen() es una funcin de la libreria estandar que retorna la longitud
de un string:
int strlen(char *s) {
char *p = s;
while (*p != `\0');
p++;
return p-s;
}

A Ar rr re eg gl lo os s N Nu ul lt ti id di im me en ns si io on na al le es s y y A Ap pu un nt ta ad do or re es s
- Un arreglo de dos dimensiones es realmente un arreglo de una
dimensin donde cada elemento es en si mismo un arreglo. De
ahi la notacin: a[n][m].
- Los elementos del arreglo se almacenan por filas.
- Cuando se pasa un arreglo de dos dimensiones a una funcin,
se pasa el numero de columnas, -- el numero de filas es
irrelevante.
Considere la siguiente matriz:
int a[5][35]
Para pasarla como argumento a una funcin, sta se declara
como:
f(int a[5][35]) {.....}
f(int a[][35]) {.....}
o incluso:
f(int (*a)[35]) {.....}
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
35



A Ar rr re eg gl lo os s N Nu ul lt ti id di im me en ns si io on na al le es s y y A Ap pu un nt ta ad do or re es s
-int (*a)[35]; declara un apuntador a un
arreglo de 35 enteros.
-int *a[35]; declara un arreglo de 35
apuntadores a enteros.

char *name[10];
char Aname[10][20];
Las instrucciones
name[3][4] y Aname[3][4] son correctas en C.
Sin embargo
Aname is un arreglo de 2D de 200 elementos.
name tiene 10 elementos que son apuntadores no
inicilizados.La ventaja es que los vectores de
cada fila pueden ser de longitudes diferentes.

Errores comunes en el manejo de apuntadores
- No asignar una direccin de memoria al apuntador antes
de usarlo:
int *x;
*x = 100;
Se necesita una direccin de memoria:
int y;
x = &y;
*x = 100;
NOTA: el compilador no detecta el error.








Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
36


- Indireccin Ilegal
Suponga que usamos la funcin malloc() para asignar memoria
dinamicamente a un apuntador.
char *malloc() --
Y tenemos un apuntador: char *p;
Es correcta la instruccin?:
*p = (char *) malloc(100);
*p = `y';
La instruccin correcta seria:
p = (char *) malloc(100);
- Confundir un char* con un arreglo de caracteres.
char *c, ca[10];
ca[0]= `a';
c = `a'; /* Incorrecto */

N Ne em mo or ri ia a D Di in na am mi ic ca a
- La Funccin malloc se usa para obtener una porcin contigua
de memoria.
void *malloc(size_t number_of_bytes)
- Retorna un apuntador del tipo void * .Si la memoria no se
puede asignar retorna NULL
- El tipo del argumento (size_t) esta definido en stdlib.h y es
un tipo unsigned.

char *cp;
cp = malloc(100);
- Solicita al sistema operativo 100 bytes consecutivos y asigna la
direccin de comienzo de este bloque a cp.
- Es comun usar la funcin sizeof() para especificar el numero
de bytes.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
37


int *ip;
ip = (int *) malloc(100*sizeof(int));

La funcin sizeof puede usarse para encontrar el tamano de
cualquier tipo de datos, variable o estructura.
int i;
struct COORD {float x,y,z};
typedef struct COORD PT;

sizeof(int), sizeof(i),
sizeof(struct COORD) y
sizeof(PT) son todos validos

ip = (int *)malloc(100*sizeof(int));
- Aqui se hace uso de la relacin entre apuntadores y arreglos y
se trata la memoria reservada como un arreglo.
ip[0] = 100;
o
for(i=0;i<100;++i) printf("%d",ip[i]);

- Cuando se termina de usar una porcin de memoria se debe
liberar usando la funcin free().
- -free() toma un apuntador como argumento y libera la
memoria direccionada por el apuntador.

- Calloc and Realloc
void *calloc(size_t num_elements, size_t
element_size=;
calloc inicializa la memoria con ceros a diferencia de malloc.
int *ip;
ip = (int *)calloc(100,sizeof(int));
/*asigna 100 elementos inicializados a cero */
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
38


- Calloc and Realloc
- realloc es una funcin que intenta cambiar el tamano de un
bloque de memoria que fue adquirido previamente. El nuevo
bloque puede ser mas grande o mas pequeno.
void *realloc( void *ptr, size_t new_size);

- Para cambiar el tamano de la memoria que se le asign al
apuntador *ip a un bloque de 50 enteros simplemente
hacemos:
ip = (int *) calloc(ip, 50);


E Es st tr ru uc ct tu ur ra as s a au ut to or re ef fe er re en nc ci ia ad da as s
struct list{
int data;
struct list *next;
};
struct list a, b, c;
a.data = 1;
b.data = 2;
c.data = 3;
a.next = b.next = c.next =
NULL;


E Es st tr ru uc ct tu ur ra as s a au ut to or re ef fe er re en nc ci ia ad da as s
a.next = &b;
b.next = &c;





a.next -> data es 2
a.next -> next -> data es 3





a
b
c
1
2
3
NULL
NULL
NULL
a
b
c
1
2
3
NULL
NULL
NULL
a
b c
1
2 3
NULL
a
b c
1
2 3
NULL
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
39


E Es st tr ru uc ct tu ur ra as s a au ut to or re ef fe er re en nc ci ia ad da as s

#define NULL 0
typedef char DATA;
struct linked_list{
DATA d;
struct linked_list *next;
};
typedef struct linked_list ELEMENT;
typedef ELEMENT *LINK;

#include list.h
LINK s_to_l (char s[]) {
LINK head = NULL, tail;
int i;
if (s[0] != `\0') {
head = (LINK) malloc(sizeof(ELEMENT));
head -> d = s[0];
tail = head;
for (i = 1; s[i] != `\0', ++i) {
tail ->next = (LINK) malloc(sizeof(ELEMENT));
tail = tail->next;
tail -> d = s[i];
}
tail ->next = NULL;
return(head);
}

















Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
40


E Es st tr ru uc ct tu ur ra as s a au ut to or re ef fe er re en nc ci ia ad da as s




A Ap pu un nt ta ad do or re es s a a A Ap pu un nt ta ad do or re es s
- Se puede tener un apuntador a un apuntador de cualquier tipo.
-char ch; /* un caracter*/
-char *pch; /* un apuntador a un caracter */
-char **ppch; /* un apuntador a un apuntador a
caracter */





!nsercin del string AB"
A
head
tail
?
A
head
tail
?
head
tail
A
B ?
head
tail
A
B
NULL
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
41


A Ap pu un nt ta ad do or re es s a a F Fu un nc ci io on ne es s
Estos apuntadores son utiles cuando se tienen funciones
alternativas para ejecutar tareas similares sobre los datos.
int (*pf) ();
declara un apuntador (*pf) a funcin, la cual retorna un entero
(int).

A Ap pu un nt ta ad do or re es s a a F Fu un nc ci io on ne es s
- Si tenemos una funcion int f(), podemos escribir:
pf = &f;
- Es mejor especificar los prototipos completos de la funcin y del
apuntador a funcin:
int f(int);
int (*pf) (int) = &f;
Si f() retorna un int y toma un int como
parmetro.
- Se pueden hacer cosas como:
int ans;
ans = f(5);
ans = pf(5);
- La funcion qsort ordena un arreglo de cualquier tipo
utilizando una clave. El prototipo es:
void qsort(void *base, size_t num_elements, size_t
element_size,
int (*compare)(void const *, void const *));
- El ultimo argumento (compare) es un apuntador a una funcin.
- La funcin compare debe retornar ciertos valores de acuerdo
al resultado de la comparacin:
- < 0: si el primer valor es menor que el segundo.
- 0: si el primer valor es igual al segundo.
- > 0: si el primer valor es mas grande que el segundo.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
42


A Ap pu un nt ta ad do or re es s a a F Fu un nc ci io on ne es s
typedef struct {
int key;
struct other_data;
} Record;
int rec_compare(void const *a,void const *a)
{
return (((Record *)a)->key -((Record *)b)->key );
}

L La a l ll la am ma ad da a a a q qs so or rt t s se er ri ia a: :
qsort(array, arraylength, sizeof(Record), rec_compare);


Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
43


L Li in ne ea a d de e C Co om ma an nd do os s
Copiar_arch arch_r arch_w
- Para poder tener acceso a los argumentos de la linea de
comandos el main se debe definir de la siguiente forma:
main(int argc, char **argv)
argc es el numero total de argumentos incluyendo el nombre de
programa.
argv es un arreglo de strings. Cada posicin del arreglo contiene un
argumento.

# #i in nc cl lu ud de e< <s st td di io o. .h h> >
m ma ai in n ( (i in nt t a ar rg gc c, , c ch ha ar r * ** *a ar rg gv v) ) { {
/ /* * p pr ro og gr ra am ma a q qu ue e i im mp pr ri im me e l lo os s a ar rg gu um me en nt to os s d de e l la a l l n ne ea a d de e
c co om ma an nd do os s * */ /
i in nt t i i; ;
p pr ri in nt tf f( (` `` `a ar rg gc c = = % %d d\ \n n' '' ', ,a ar rg gc c) ); ;
f fo or r ( (i i= =0 0; ;i i< <a ar rg gc c; ;+ ++ +i i) )
p pr ri in nt tf f( (` `` `a ar rg gv v[ [% %d d] ]: :% %s s\ \n n' '' ', ,i i, ,a ar rg gv v[ [i i] ]) ); ;
} }

Si se invoca el programa (argum) con los siguientes argumentos:
argum f1 f2 f3 4 stop!
La salida sera:
argc = 6
argv[0] = argum
argv[1] = f1
argv[2] = f2
argv[3] = f3
argv[4] = 4
argv[5] = stop!
- -Los caracteres se ignoran.




Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
44


E En nt tr ra ad da af fS Sa al li id da a
EJS Bsica
Existen tres canales streams predefinidos, a los que se llama
como archivos estandar de EntradafSalida (standard !fO files):
Nombre Canal Stream Dispositivo fd
stdin standard input teclado (keyboard) 0
stdout standard output pantalla (screen) 1
stderror standard error pantalla (screen) 2

Hay un par de funciones que permiten realizar EfS basica:
getchar() y putchar().
int getchar(void) -- lee un carcter de la
entrada estndar.
int putchar(char ch) -- escribe un carcter a
la salida estndar y retorna el carcter
escrito.

int ch;
ch = getchar();
(void) putchar((char) ch);
Funciones Relacionadas:
int getc(FILE *stream)
int putc(char ch,FILE *stream)

EJS formateada
- Printf
La funcin se define asi:
int printf(char *format, arg list ...) --
!mprime la lista de argumentos de acuerdo a un formato
epecifico. Retorna el numero de caracteres impresos.


Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
45


Entre el y el formato se puede colocar:
- - {signo menos): justificacin a la izquierda.
- .m.d:
m = ancho del campo,
d = precisin del numero despus del punto decimal o numero de
caracteres de un string.

E En nt tr ra ad da af fS Sa al li id da a E Ej je em mp pl lo os s: :

printf("%3d\n",n);
n = 20 ^20
printf(%-3d, n);
n = 20 20^
printf(%10f, x);
x = 12.345 ^12.345000
printf(10.3f,x);
x = 1.2345 ^^^^^1.235
printf(%e,x)
x = 1.2345 1.2345e+000

- scanf
int scanf(char *format, args....) --
Lee de la entrada estandar y coloca lo que recibe en las variables
de la lista de argumentos. Retorna el numero de caracteres
leidos.
Note: scanf necesita las direcciones de las variables o un
apuntador. scanf(``%d'',&i);
- Tambin se puede colocar el nombre de un arreglo o string, ya
que el nombre de un arreglo es la direccin de comienzo de
este tipo de variables.
char string[80];
scanf(``%s'',string);





Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
46


Archivos
La primera operacin sobre un archivo antes de usarlo es abrirlo:
FILE *fopen(char *name, char *mode)
Los modos de apertura incluyen:
r -- lectura,
w -- escritura y
a -- insertar al final append.

- Para abrir un archivo se debe declarar un (file pointer) que
apunta a una estructura del tipo FILE.
FILE *stream, *fopen();
if ((stream = fopen(``myfile.dat'',``r'')) == NULL)
{
printf(``Can't open%s\n'',``myfile.dat'');
exit(1);
}

- Leer y escribir archivos
Las funciones fprintf y fscanf se usan para acceder a los
archivos.

int fprintf(FILE *stream, char *format, args..)
int fscanf(FILE *stream, char *format, args..)

- El apuntador del tipo F!LE se incrementa automaticamente con
las funciones de lectura y escritura.
char *string[80]
FILE *stream, *fopen();

if ( (stream = fopen(...)) != NULL)
fscanf(stream,``%s'', string);




Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
47


- Otras funciones para acceder archivos:
int getc(FILE *stream)
int fgetc(FILE *stream)
int putc(char ch, FILE *s)
int fputc(char ch, FILE *s)





- sprintf and sscanf
Son similares a fprintf y fscanf excepto que leenfescriben
defa un string.
int sprintf(char *string, char *format, args..)
int sscanf(char *string, char *format, args..)

float full_tank = 47.0; /*litros */
float millas = 300;
char millas_por_litro[80];

sprintf(millas_por_litro,
Millas por litro = %2.3f, millas/full_tank);

- Funciones para preguntar por el status de las
operaciones

int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
int fileno(FILE *stream);



Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
48


feof{): retorna true si se ha llegado a fin de archivo.
while ( !feof(fp) )
fscanf(fp,"%s",line);

ferror{): retorna true si ha ocurrido un error en la operacin
clearerr{): re-inicializa la indicacin de error actual.
fileno{): retorna el descriptor de archivo asociado al FILE *.
fread {) y fwrite{): permiten la lectura y escritura de bloques
de cualquier tipo de datos.

fread(void *buffer, size_t numbytes, size_t cuantos,
FILE *fp);
/* devuelve el nmero de elementos ledos */
fwrite (void *buffer, size_t numbytes, size_t cuantos,
FILE *fp);
/* devuelve el nmero de elementos escritos */
v vo oi id d m ma ai in n( () ) { {
F FI IL LE E * *f fp p; ;
d do ou ub bl le e d d = = 1 12 2. .2 23 3; ;
i in nt t i i = = 1 10 01 1; ;
l lo on ng g l l = =1 12 23 30 02 23 3L L; ;

i if f ( (f fp p = = f fo op pe en n( ( p pr ru ue eb b , ,
W WB B+ + ) )) ) = == = N Nu ul ll l) ) { {
p pr ri in nt tf f( ( e er rr ro or r ) ); ;
e ex xi it t( (1 1) ); ;
} }

f fw wr ri it te e( (& &d d, , s si iz ze eo of f( (d do ou ub bl le e) ), ,1 1, , f fp p) ); ;
f fw wr ri it te e( (& &i i, , s si iz ze eo of f( (i in nt t) ), ,1 1, , f fp p) ); ;
f fw wr ri it te e( (& &l l, , s si iz ze eo of f( (l lo on ng g) ), ,1 1, , f fp p) ); ;

r re ew wi in nd d( (f fp p) ); ;
f fr re ea ad d( (& &d d, , s si iz ze eo of f( (d do ou ub bl le e) ), ,1 1, , f fp p) ); ;
f fr re ea ad d( (& &i i, , s si iz ze eo of f( (i in nt t) ), ,1 1, , f fp p) ); ;
f fr re ea ad d( (& &l l, , s si iz ze eo of f( (l lo on ng g) ), ,1 1, , f fp p) ); ;

s st tr ru uc ct t t ti ip po o_ _s st tr ru uc ct t { {
f fl lo oa at t b ba al la an nc ce e; ;
c ch ha ar r n no om mb br re e[ [8 80 0] ]; ;
} } c cl li ie en nt te e; ;

L La a s si ig gu ui ie en nt te e p pr ro op po os si ic ci i n n e es sc cr ri ib be e e el l c co on nt te en ni id do o d de e c cl li ie en nt te e e en n u un n a ar rc ch hi iv vo o
a ap pu un nt ta ad do o p po or r f fp p: :

f fw wr ri it te e( (& &c cl li ie en nt te e, , s si iz ze eo of f( (s st tr ru uc ct t t ti ip po o_ _s st tr ru uc ct t) ), , 1 1, , f fp p) ); ;




Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
49


EJS de bajo nivel
- Esta forma de EfS no es a travs de buffers.
- No hay facilidades para formatear la entrada o la salida.
- Se trabaja con archivos en forma binaria no en modo texto.
- Se usan descriptores de archivo en lugar de F!LE *.
int open(char *filename, int flag, int perms) --
retorna un descriptor de archivo o -1 si falla.
flag controla el tipo de acceso al archivo y
algunos de sus valores son:
O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_WRONLY
-creat(char *filename, int perms)
-int close(int handle)
-int read(int handle, char *buffer,
unsigned length)
-int write(int handle, char *buffer, unsigned
length)

# #i in nc cl lu ud de e< <s st td di io o. .h h> >
# #i in nc cl lu ud de e< <f fc cn nt tl l. .h h> >
f fl lo oa at t b bi ig gb bu uf ff f[ [1 10 00 00 0] ]; ;
m ma ai in n( (i in nt t a ar rg gc c, , c ch ha ar r * ** *a ar rg gv v) ) { {
i in nt t f fd d, , b by yt te es s_ _r re ea ad d, , f fi il le e_ _l le en ng gt th h; ;
i if f ( (( (f fd d = = o op pe en n( (a ar rg gv v[ [1 1] ], ,O O_ _R RD DO ON NL LY Y) )) ) = = - -1 1) ) { {
/ /* * e er rr ro or r * */ /
} }
i if f ( (( (b by yt te es s_ _r re ea ad d = = r re ea ad d( (f fd d, ,& &f fi il le e_ _l le en ng gt th h, , s si iz ze eo of f( (i in nt t) )) )) ) = == = - -
1 1) ) { {
/ /* * e er rr ro or r r re ea ad di in ng g f fi il le e * */ /
} }
i if f ( (( (b by yt te es s_ _r re ea ad d = = r re ea ad d( (f fd d, ,b bi ig gb bu uf ff f, ,
f fi il le e_ _l le en ng gt th h* *s si iz ze eo of f( (f fl lo oa at t) )) )) ) = == = - -1 1) ) { {
/ /* * e er rr ro or r r re ea ad di in ng g o op pe en n * */ /
} }
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
50


E
E
l
l
P
P
r
r
e
e
-
-
p
p
r
r
o
o
c
c
e
e
s
s
a
a
d
d
o
o
r
r
d
d
e
e
C
C
- El preprocesamiento es el primer paso durante el ciclo de
compilacin de un programa en C.
- Las directivas comienzan con un #.
- Entre las ventajas del preprocesamiento se encuentran:
Los programas son mas faciles de desarrollar.
Nas faciles de leer y modificar
El cdigo C es mas portable.

Nos permite adaptar el lenguaje a nuestras necesidades. Por
ejemplo, podemos reemplazar las { ... ) por los delimitadores
PASCAL begin ... end

#define begin {
#define end }

#define
Se usa para definir constantes o NACROS.
#define <macro> <replacement name>

Por ejemplo:

#define FALSE 0
#define TRUE !FALSE

NACROS
#define max(A,B) ( (A) > (B) ? (A):(B))
Si en nuestro programa colocamos:
x = max(q+r,s+t);
despus del preprocesamiento quedara:
x = ((q+r)>(r+s)?(q+r):(s+t));
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
51



- #undef : elimina la definicin previamente realizada del
nombre de la macro que le sigue.
#undef nombre_de_macro
Ejemplo:
#define LONG 100
#define ANCHO 100
char array[LONG][ANCHO]
#undef LONG
#undef ANCHO

- #include: permite incluir un archivo en el cdigo. Son validas
dos formas:

#include <file>: le dice al compilador que busque en
determinado directorio del sistema operativo.

#include ``file'': el archivo esta en el directorio actual

#if -- inclusion condicional
-#if evalua una expresin entera constante.
- Siempre se necesita #endif para delimitar el final de la
instruccin.
- Podemos tambin usar else, #else y #elif -- else if.

- Otro uso comun de #if es con:
-#ifdef
--- Si esta definido
-#ifndef
--- Si no esta definido
Es util para chequear si ciertas NACROS han sido ya definidas.
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
52




- Por ejemplo para asignar el tamano de un entero en un
programa que debe ser portable entre borland C y UN!X u otro
OS.
#ifdef TURBOC
#define INT_SIZE 16
#else
#define INT_SIZE 32
#endif

- Otro ejemplo: si vamos a correr un programa en NSDOS se
debe incluir el archivo msdos.h, de lo contrario se incluye el
archivo default.h.

#if SYSTEM == MSDOS
#include <msdos.h>
#else
#include ``default.h''
#endif

- Como las directivas del preprocesador pueden escribirse en
cualquier lugar dentro del programa, se pueden filtrar algunas
instrucciones.
x = y *3;
#ifdef DEBUG
print("Debugging: Variables (%d,%d) =
\n",x,y);
#endif
-#error: genera un mensaje de error y fuerza al compilador a
detener la compilacin.
#ifdef OS_MSDOS
#include <msdos.h>
#elifdef OS_UNIX
#include ``default.h''
#else
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
53


#error Wrong OS!!
#endif

- # line: hace que las lineas del cdigo fuente subsecuentes se
renumeren, iniciandose con el valor entero constante
especificado.
#line 100 f* inicia la numeracin de lineas a partir de 100,
empezando con la siguiente linea de cdigo fuente *f

- En la directiva #line puede incluirse el nombre del archivo.
#line 100 file1.c
indica que las lineas estan numeradas a partir de 100, empezando
desde la siguiente linea de cdigo y el nombre del archivo es
file1.c

#include <stdio.h>
#line 100 /* reinicializa el contador de lneas
*/
void main(void) { /* linea 100 */
printf(%d\n, __LINE__); /* 101 */
}

- El operador #: convierte el argumento al que precede en una
cadena entrecomillada. Ejemplo:
#include <stdio.h>
#define hazcad(s) # s
void main(void) {
printf(hazcad(Me gusta C));
}


void main(void) {
printf(hazcad(Me gusta C));
}
El pre-procesador de C convierte la lnea:
printf(hazcad(Me gusta C));
en:
printf(Me gusta C);

Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
54




D De es sa ar rr ro ol ll lo o e en n v va ar ri io os s A Ar rc ch hi iv vo os s ( (v ve en nt ta aj ja as s) )
- varios programadores pueden trabajar sobre varios mdulos de
un mismo programa.
- S Se e p pu ue ed de e u us sa ar r u un n e es st ti il lo o o or ri ie en nt ta ad do o p po or r o ob bj je et to os s: : C Ca ad da a a ar rc ch hi iv vo o
d de ef fi in ne e u un n t ti ip po o d de e d da at to os s p pa ar rt ti ic cu ul la ar r y y s su us s o op pe er ra ac ci io on ne es s. . L La a
i im mp pl le em me en nt ta ac ci i n n d de el l o ob bj je et to o s se e m ma an nt ti ie en ne e p pr ri iv va ad da a p pa ar ra a e el l r re es st to o. .
- - Los objetos bien implementados pueden usarse en otros
programas reduciendo asi el tiempo de desarrollo.

( (C C m mo o h ha ac ce er r l la a d di iv vi is si i n n) )
- De todos los archivos, uno solo contendra el main, y los otros
contendran funciones auxiliares que seran tratadas como
funciones de libreria.
- Si los objetos se implementan con estructuras, es recomendable
mantener todas las funciones que acceden al objeto dentro del
mismo archivo. Las ventajas son:
el objeto se puede reusar facilmente en otros programas.
Todas las funciones relacionadas estan juntas.
Si hay cambios a la estructura, slo un archivo se modifica.
- Los prototipos de las funciones que queremos que sean visibles
a otros programas se escriben en un archivo de encabezado
(.h).
- Cada vez que un programa desea usar una funcin de nuestro
archivo .C debe incluir el encabezado donde estan definidos los
prototipos. (#include del .h).






Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
55


D De es sa ar rr ro ol ll lo o e en n v va ar ri io os s A Ar rc ch hi iv vo os s
Cada archivo se organiza tipicamente de la siguiente forma:
- Un preambulo que consiste en constantes (#define), archivos
de encabezado, y definiciones de tipos importantes.
- Declaracin de variables globales y externas.
- Una o mas funciones.
- El orden de los items es importante: cada objeto debe definirse
antes de declararse. Las funciones que retornan valores tambin
deben definirse antes de su llamada. La definicin se hace de una
de las siguiente forma:
Si Io funcion es definido y usodo en eI mismo orchivo, uno
decIorocion compIefo de Io mismo se coIoco onfes de usorIo.
Si Io funcion es invocodo en un orchivo donde no esfo definido, eI
profofipo debe oporecer onfes de Io IIomodo o Io funcion.

Una funcin definida como:
float find_max(float a, float b, float c)
{ /* etc ... ... */
Tiene el siguiente prototipo:

float find_max(float, float, float);


Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
56


C C m mo o h ha ac ce er r u un n N Na ak ke ef fi il le e
Compilar un programa en C:
Despus de crear un programa en C (con emacs, vi o cat), ste debe compilarse
para luego ejecutarlo.
void main()
{
printf(``Hello Word\n'');
}
cc myprogram.c
En este caso genera el ejecutable en a.out
Para ejecutar el programa:
$ a.out
Otra forma de compilacin: cc myprogram.c -o myprogram
En este caso el ejecutable es myprogram.
Para ejecutar el programa solo se coloca el nombre del mismo:
$ myprogram
Compilacin para programas multimdulos
Cuando un programa esta formado por varios mdulos separados es necesario
compilar cada mdulo, enlazarlos y crear el ejecutable.
Estos mdulos independientes pueden ser reusables en otros programas.
Por ejemplo si tenemos los siguientes archivos:
/* reverse.h */

void reverse (char *before, char *after);

/* reverse.c */

#include <stdio.h>
#include ``reverse.h''

void reverse (char * before, char *after)
{
/* codigo de la funcion */
}
/* main1.c */

#include <stdio.h>
#include reverse.h

main ( )
{
char str[100];
reverse(cat,str);
reverse(ylayaly,str);
}

Se compilaria:
cc -c reverse.c
cc -c main1.c
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
57


Alternativamente:
cc -c reverse.c main1.c
En ambos casos la compilacin genera reverse.o y main1.o. Luego para
enlazarlos en un ejecutable main1" se ejecuta:
cc reverse.o main1.o -o main1
Para ejecutarlo: $ main1
Programacin de funciones reusables:
Para crear una funcin reusable se debe crear un mdulo con el cdigo fuente
que contiene el cdigo de la funcin (con extensin .c), ademas se debe crear
su correspondiente ``header'' que contiene el prototipo de la funcin (con
extensin .h).
Como otro ejemplo, supongamos que ahora tenemos los siguientes
archivos:
/* reverse.h */

void reverse (char *before, char *after);

/* reverse.c */

#include <stdio.h>
#include ``reverse.h''

void reverse (char * before, char *after)
{
/* codigo de la funcion */
}

/* palindrome.h */

int palindrome (char *str);

/* palindrome.c */

#include <stdio.h>
#include ``palindrome.h''
#include ``reverse.h''

int palindrome (char *str);

{
/* codigo de la funcion */
}

/* main2.c */

#include <stdio.h>
#include ``palindrome.h''

main ( )
{
char str[100];

palindrome(``cat'');
palindrome(``ylayaly'');
}


Para su compilacin tendriamos:
cc -c palindrome.c reverse.c main2.c
cc reverse.o palindrome.o main2.o -o main2
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
58


Para evitar tener que hacer manualmente todos estos pasos cada vez que se
modifica alguna de las funciones, Unix provee una facilidad llamada make.
make -f makefile
make es una utilidad que actualiza un archivo basado en una serie de reglas de
dependencia almacenadas en un formato especial ``make file''. La opcin -f
permite especificar un nombre de archivo, si no se especifica se asume el nombre
``makefile''.
Nake files:
Es un archivo que contiene las interdependencias que existen entre los archivos
que son usados para generar un ejecutable. Las reglas del ``make files'' son de la
forma:
targetList dependencyList

commandList
Donde:
targetList es el nombre del archivo al cual se le estan definiendo las dependencias
dependencyList lista de los archivos del cual targetList depende.
commandList es una lista de cero o mas comandos, separados por ``newline'', que
reconstruyen el targetList a partir de las dependencias.
El orden cmo se definen las reglas es muy importante, debe crearse siguiendo un
arbol de interdependencias.
Los arboles de interdependencias de los ejemplos anteriores son los siguientes:



A continuacion las makefiles correspondientes:
main1: main1.o reverse.o
cc main1.o reverse.o -o main1

main1.o: main1.c reverse.h
cc -c main1.c

reverse.o: reverse.c reverse.h
cc -c reverse.c

main1
reverse.o main1.o
reverse.c reverse.h main.c reverse.h
main2
reverse.o palindrome.o
reverse.c reverse.h palindrome.c
reverse.h
main1.o
main.c reverse.h palindrome.c
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
59


Una vez que se haya creado el ``make file'', para ejecutarlo se ejecuta:
make -f main1.make
Otro ejemplo:




main2: main2.o reverse.o palindrome.o
cc main1.o reverse.o palindrome.o -o main2

main2.o: main2.c palindrome.h
cc -c main2.c

reverse.o: reverse.c reverse.h
cc -c reverse.c

palindrome.o: palindrome.c palindrome.h reverse.h
cc -c palindrome.c
Si los programas han sido compilados con anterioridad make slo compila
los programas que posean modificaciones posteriores a la ultima
compilacin.













main1
reverse.o main1.o
reverse.c reverse.h main.c reverse.h
main2
reverse.o palindrome.o
reverse.c reverse.h palindrome.c
reverse.h
main1.o
main.c reverse.h palindrome.c
Naterial elaborado a partir del Curso Avanzado de Programacin en C
de la Prof. Nariela Curiel
60


Bibliografia Empleada

Brian W. Kernighan. Dennos N. Ritchie. El lenguaje de programacin C".
Prentice Hall. Segunda edicin. 1991.

G Gr ru up po o S SP PD D. . N Na at te er ri ia al l d de e a ap po oy yo o d de el l c cu ur rs so o d de e o op pe er ra at ti iv vo os s1 1" "
h ht tt tp p: :f ff fw ww ww w. .l ld dc c. .u us sb b. .v ve ef f 7 7E Es sp pd df fD Do oc ce en nc ci ia af fc ci i- -3 38 88 81 1f fc cl la as se es sf fi in nd de ex x. .h ht tm ml l

Nariela Curiel. Curso Avanzado de programacin en C". Universidad Simn
Bolivar. 2001.

R Ra al lf f K Ka ai is se er r C C P Pr ro og gr ra am mm mi in ng g u un nd de er r L Li in nu ux x" "
h ht tt tp p: :f ff fw ww ww w. .p ph hy ys si ic cs s. .g gl la a. .a ac c. .u uk kf fp p2 2t tf fc c- -l le ec ct tu ur re e- -0 08 8. .p pd df f . .2 20 00 05 5

S St te ev ve e C Co ol lm me es s C C P Pr ro og gr ra am mm mi in ng g" " h ht tt tp p: :f ff fw ww ww w. .i it ts s. .s st tr ra at th h. .a ac c. .u uk kf fc co ou ur rs se es sf fc cf f


T Tu ut to or ri ia al l d de e G GC CC C
http://www.network-theory.co.uk/articles/gccintro.html

You might also like