Académique Documents
Professionnel Documents
Culture Documents
<lddldFusFve>
inero PHHU
ndice
1. Antecedentes
IFIF hesrg e instlin IFIFIF indows F F F F IFIFPF vinux F F F F F IFPF iditores F F F F F F F F IFPFIF indows F F F F IFPFPF vinux F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
3
S S S T T T
7
W IH IP IR IR IR IS IS IT IU
4. Estructuras de Datos
RFIF RFPF RFQF RFRF RFSF
F F F F F
F F F F F
18
IV IW PI PR PT
5. Entrada/Salida
SFIF wnejo de lid y intrd de exto E rintf y nf F F F F F PV SFPF wnejo de erhivos F F F F F F F F F F F F F F F F F F F F F F F F QH SFQF puniones wiselnes F F F F F F F F F F F F F F F F F F F F F F QR TFIF u es un puntdorc F F F F F F F TFPF epuntdores y estruturs de dtos TFPFIF erreglos F F F F F F F F F F F TFPFPF vist enlzd F F F F F F F F P F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QU RH RH RR
27
6. Apuntadores
37
48 53
SQ SV SW TH TH TP TP TP TQ
9. Herramientas
65
10.Ejercicios
70
1.
Introduccin
g es un lenguje de progrmin redo en IWTW por uen hompson y hennis wF ithie en los vortorios fell omo evoluin del lenguje fD su vez sdo en fgvF el igul que fD es un lenguje orientdo l implementin de istems ypertivosD onretmente nixF g es preido por l e(ieni del digo que produe y es el lenguje de progrmin ms populr pr rer softwre de sistemsD unque tmin se utiliz pr rer pliionesF il desrrollo iniil de g se llev o en los vortorios fell de e8 entre IWTW y IWUQY segn ithieD el perodo ms retivo tuvo lugr entre IWTW y IWUQ y en IWUPF v prinipl estndrizin del lenguje g es l onoid omo exs gD on el estndr QFISWEIWVWF osteriormenteD en IWWHD ste fue rti(E do omo estndr sy @syGsig WVWWXIWWHAF v dopin de este estndr es muy mpliD por lo que los progrms que lo siguen orren sore un grn vriedd de pltformsF in l prtiD los progrmdores suelen usr elementos no portles dependientes del ompildor o del sistem opertivoF in IWUQD el lenguje g se h vuelto tn poderoso que l myor prte del nleo del sistem opertivo nixD originlmente esrito en el lenguje ensmldor hEIIGPHD fue reesrit en gF ste fue uno de los primeros nleos de sistem opertivo implementdos en un lenguje distinto l enE smldorY lgunos sos nteriores son el sistem wultisD esrito en vGsD y wster gontrol rogrm pr el fSHHH de furroughsD esrito en elgol en IWTIF in IWUVD ithie y frin uernighn puliron l primer ediin de il venguje de progrmin gF ste liro fue durnte os l espei(in informl del lengujeF il lenguje desrito en este liro reie hitulmente el nomre de el g de uernighn y ithie o simplemente u8 gF v segund ediin del liro ure el estndr exs gF il g de uernighn y ithie es el suonjunto ms sio del lenguE je que un ompildor dee de soportrF hurnte muhos osD inluso trs l introduin del exs gD fue onsiderdo el mnimo omn denominE dor en el que los progrmdores den progrmr undo desen que sus progrms fuern portlesD pues no todos los ompildores soportn ompletmente exsD y el digo rzonlemente ien esrito en u8 g es tmin digo exs g vlidoF e (nles de l dd de IWUHD g empez sustituir fesg omo el lenguje de progrmin de miroomputdores predominnteF hurnte l dd de IWVH se empezron usr los sfw gD lo que inrement su populridd signi(tivmenteF el mismo tiempoD fjrne troustrup empez trjr on lgunos omperos de fell vs pr dir funionliddes R
de progrmin orientd ojetos gF il lenguje que reronD llmdo gCCD es hoy en d el lenguje de progrmin de pliiones ms omn en el sistem opertivo wirosoft indowsY g sigue siendo ms populr en el entorno nixF in IWVQD el snstituto xionl istdounidense de istndres @exsD por sus sigls en inglsA orgniz un omitD QjIID pr estleer un espei(E in estndr de gF rs un proeso de trjo lrgo y rduoD se omplet el estndr en IWVW y se rti( omo el venguje de rogrmin g exs QF ISWEIWVWF ist versin del lenguje se onoe menudo omo exs gD o vees omo gVW @pr distinguirl de gWWAF in IWWHD el estndr exs @on lguns modi(iones menoresA fue doptdo por l yrgnizin snternionl pr l istndrizin @syA en el estndr syGsig WVWWXIWWHF ist versin se onoe vees omo gWHF xo ostnteD gVW y gWH se re(eren en eseni el mismo lengujeF no de los ojetivos del proeso de estndrizin del exs g fue proE duir un extensin l g de uernighn y ithieD inorporndo muhs funE ionliddes no o(iles y tmin nuevsF exs g est soportdo hoy en d por si l totlidd de los ompilE dores de gF v myor del digo g que se esrie tulmente est sdo en exs gF gulquier progrm esrito slo en g estndr sin digo que depend de un hrdwre determindo funion orretmente en ulquier pltform que dispong de un implementin de g omptileF in emrE goD muhos progrms hn sido esritos de form que slo pueden ompilrse en un iert pltformD o on un ompildor onretoD deido l utilizE in de lireris no estndrD omo interfes gr(s de usurioF edemsD lgunos ompildores no umplenD en el modo por defetoD ls espei(ioE nes del estndr exs g o su suesorF or ltimoD ourre freuentemente que el digo est esrito on dependeni de un tmo determindo de iertos tipos de dtosD o de un determindo orden de los its en l memori prinipl de l pltformF
2.
he mner resumidD podemos deir que ls vriles y ls onstntes son los ontenedores de dtos sios que se mnipuln en un progrmF v sein de delrin de un progrm de(ne ls vriles que se vn utilizrD su tipo yD opionlmenteD sus vlores iniilesF il tipo de un ojeto determin el onjunto de vlores que puede lmenr y ls operiones que se pueden relizr sore lF minD vos operdores espei(n lo que se hr on ls vriles y ls expresiones ominn vriles y onstntes pr produir nuevos vloresF
il tmo en its de d tipo depende de l rquitetur y el tipo de softwre que orre sore l mquin en que ejeutmos un progrmF n form fil de onoer el tmo de d tipo en un mquin dd es ompilr y ejeutr sore ell un progrm omo el siguienteF ste he uso del operdor sizeofD que nos d el nmero de ytes que oup un tipo ddoF
#include `s t d i o F hb int
min @ A { p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno de de de de de de hr X 7 dn4 D sizeof @ char A A Y short X 7 dn4 D sizeof @ short A A Y int X 7 dn4 D sizeof @ int A A Y long X 7 dn4 D sizeof @ long A A Y flot X 7 dn4 D sizeof @ float A A Y doule X 7 dn4 D sizeof @ double A A Y
odemos espei(r modicadores pr los tipos l momento de delrr un vrileF stos pueden lterr el tmo del tipo o su omportmientoF or ejemploD l plr unsigned en relidd es un modi(dor plile ulquier tipo enteroD unque por s sol se re(ere l tipo intF u efeto es quitrle el signo l nmeroD lo que nos d un myor rngo de nmeros positivos representlesF ry ierts reliones que podemos sumir entre los tipos de gD indeE pendientemente de l pltform sore l que estmos trjndoF il tipo long tiene l menos QP its y short nun es myor que intD el ul su vez nun es myor que longF vos li(dores signed y unsigned pueden plirse un char y ulquier enteroF vos nmeros unsigned son siempre no negtivos y oedeen ls leyes de l ritmti mdulo PnD donde n es el nmero de its en el tipoF vs vriles son de(nids utilizndo un identi(dor de tipo seguido del nomre de l vrileF emos el siguiente progrmX
#include
min @ A {
`s t d i o F hb
float
gdigo PX gonversin de tempertur de grdos phrenheit gelsius equ podemos ver que se de(nen dos vriles )otD se sign un vlor l primer y se lul l segund medinte un expresin ritmtiF in gD ls signiones tmin son expresiones y se pueden utilizr omo prte de otr expresinY sin emrgoD prtis de este tipo no son muy reomendles y que reduen l legiilidd del progrmF in l instruin printfD el especicador 7f indi que se quiere imprimir un nmero on om )otnteF edems de todo esto hy un tipo muy importnte llmdo voidD que represent lgo vo y tiene uso l esriir funiones @undo sts no devuelven un vlorA y l utilizr puntdores @undo se quiere tener un puntdor un vrile de tipo desonoidoAF emos usos sern desritos en ls seiones de funiones y puntdores respetivmenteF
#include #include
min @ A {
`s t d i o F hb `mth F hb
int int
iste progrm lul l rz udrd de un nmero enteroD previ onE versin tipo doubleF v onversion es relizd olondo entre prntesis V
el nomre del tipo requerido justo ntes del vlorF in este soD (double)D el resultdo de sqrt( (double) i); es tmin un doleD pero es onvertido utomtimente entero en l signin l vrile rootF ytro ejemplo se present ontinuinX
`s t d i o F hb `mth F hb
min @ A {
float Y int Y
y un signin l vezD omo Ca y 8aF in l evluin de expresiones lgisD los ompildores normlmente utilizn tnis de evluin rpidF r deidir si un expresin lgi es iert o fls muhs vees no es neesrio evlurl ompletmenteF or ejemploD dd un expresin omo <exp1> || <exp2>D el ompildor evl primero <exp1> yD si es iertD no evl <exp2>F or ello se deen evitr onsE truiones en ls que se modi(quen vlores de dtos en l propi expresinX su omportmiento puede depender de l implementin del ompildor o de l optimizin utilizd en un ompilin o en otrF istos son errores que se pueden ometer filmente en g y que un signin es tmin un expresinF heemos evitr instruiones omo
<e> ?
<x> : <y>
ist operin d omo resultdo <x> si <e> es ierto e <y> si noF e ontinuinD un ejemplo de su usoX
#include
{
`mth F hb
int
min @ A
IH
2.4.1. Sentencia if
v senteni de ontrol de deisin si es if (<e>) then <s> else <t>F ivl un expresin oolen yD si se umpleD ejeut l senteni sF in so ontrrioD ejeut l senteni tF v segund prte de senteni !else <t>!D es opionlF
void
if
eordemos que g onsider vlores diferentes de ero omo verdderos y el ero omo flsoF
switch
gundo se enuentr un senteni se que onuerd on el vlor del swith se ejeutn ls sentenis que le siguen y tods ls dems prtir II
de hD hst onseguir l primer instruin breakF v entrd default es opionlY se tiv undo ningn otro so de omprin result iertoF veropion @
char
A {
en4 A Y fn4 A Y
g o hn4 A Y cn4 A Y
gdigo VX ijemplo de
switch
vlor A {
w h i l e @ r r `a v l o r A rCCY return r Y
sX do <s> while { <e> }F st ejeut el onjunto de instruiones ddo l menos un vezF is deirD slo evl l expresin ondiionl en l segund repetiinF IP
vlor A {
return
for
se omiene un nuev iterinD sltndose ls instruiones restntes de l repetiin y evlundo l expresin de ontrolF emos el siguiente ejemploX
2.4.5. Break y Continue vs instruiones break y continue son utilizds dentro de sentenis de repetiin pr lterr el )ujo de ontrol dentro de ls mismsF break provo que se termine l ejeuin de un iterinF continue provo que
IQ
if @
s t t u s @ A aa exsxq A rek Y
if @
} { }
else
p r i n t f @ 4exsxq o n d i t i o n r e e i v e d F n4 A Y p r i n t f @ 4gount h e l d t 7 dn4 D ount A Y
break
IR
3.
Estructuras de Datos
n estrutur es un olein de un o ms vrilesD posilemente de diferentes tiposD grupds jo un nomre que permite her refereni stsF vs estruturs yudn orgnizr dtos omplidosD prtiulrmente en progrms lrgosD y que permite reunir un grupo de vriles relionds pr que sen trtds omo un unidd en lugr de distnts entiddesF n ejemplo trdiionl es l nmin de un empledoD un empledo se puede desriir on un nomreD direinD nmero de seguro soilD dul de identiddD slrioD etF snluso lguno de stos podrn ser entruturs su vezF sgulmenteD se puede onsiderr un punto en el eje de oordends omo un estruturD l igul que un retngulo es un onjunto de puntosD y s suesivmenteF
struct{...} x, y, x; isto es sinttimente nlogo X int x, y, z; in el sentido que d delrin estlee ests vriles omo del tipo espei(doD struct e int y el espio orrespondiente es sgindo pr ellsF n delrin que no es seguid de un list de vriles no reserv esE pio en memoriD y solo desrie un plntill de un estuturX struct x;F in emrgoD en el so struct point pt; se de(ne un vrile pt que es un estrutur de tipo struct pointF n estrutur puede ser iniilizd espei(ndo un list de expreE siones onstntes pr d miemroD struct maxpt = {320,200};F sgulE menteD un estrutur puede iniilizrse por signin o por l llmd de un funin que devuelve el tipo orretoF
IS
vos miemros de un estrutur se eden por un onstruin de l form nombre-estructura.nombre-miembroF il punto F onet el nomre de l estrutur on el nomre del miemroF or ejemplo pr imprimir ls oordends se utiliz l instruin printf(''%d,%d'', pt.x, pt.y);F vs estruturs pueden ser niddsD por ejemploX
/* makepoint: construye un punto de las componente x e y */ struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; };
ist funin puede ser usd pr iniilizr ulquier estrutur dinE mimenteD o pr proveer rgumentos pr un funinX
struct rect screen; struct point middle; struct point makepoint(int, int); screen.pt1 = makepoint(0,0); screen.pt2 = makepoint(XMAX, YMAX); middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);
il prximo pso es her un funin que plique ritmti entre dos puntosX
IT
/* addpoints: add two points */ struct addpoint(struct point p1, struct point p2) { p1.x += p2.x; p1.y += p2.y; return p1; }
equ tnto los rgumentos omo el vlor de retorno son estrutursF e inrementn los omponentes en p1 en lugr de usr un vrile temporl on el (n de enftizr que ls estruturs son psds omo prmetros omo ulquier otro vlorF i un estrutur grnde se quiere psr un funinD generlmente es ms e(iente psr un puntdor que opir tod l estruturF epuntdoE res estruturs son omo un puntdor ulquier tipo de vrilesF v delrin se d ontinuinX
struct point *pp; sndi que pp es un puntdor un estrutur de tipo struct pointF i pp punt un estrutur pointD Bpp es l estruturD y (*pp).x y (*pp).y son los miemrosF r usr ppD se puede esriirX
printf(''origen es (%d, %d)\n'', pp->x, pp->y); intonesD ls siguientes expresiones son equivlentesX
IU
char *word; int cout; struct key { char *word; int count; } keytab[NKEYS];
y tminX
struct key { char *word; int count; } keytab[] = { "auto", 0, "break", 0, "case", 0, "char", 0, "const", 0, "continue", 0,
IV
};
is equivlente enerrr entre llves d elemento del rreglo undo son tipos siosX
int A Y
min @ A {
int n Y char word weyh Y while @ getword @ word D weyhA 3a i f @ i s l p h @ word H A A i f @ @ n a i n s e r h @ word D keyt D for @ n a H Y n ` xuiY nCCA i f @ keyt n F ount b H A
p r i n t f @ 4 7Rd 7 s n4 D keyt n F ount D keyt n F ountCCY
iypA xuiA A ba H A
IW
}
/
return
HY
keyt n F word A Y
int
b i n s e a r c h :
i n s e r h @ char word D
f i n d
word
in
struct
tab [ 0 ] . . . tab [ n
1]
key t D
int
nA
ond Y low D high D mid Y low a H Y high a n I Y while @ low `a h i g h A { mid a @ lowCh i g h A G P Y i f @ @ ond a strmp @ word D t mid F word A A ` H A h i g h a mid I Y else i f @ ond b H A low a mid C I Y }
int int
else return
mid Y
}
/
return IY
getword : get next word or c h a r a c t e r from input
int
int
lim A
if
} w a 9 H 9 Y return word H Y
ungeth @ wA Y break Y
gdigo IPX ueyword gount il tmo de este rreglo se puede otener trvs de l multipliin de l ntidd de entrds por el tmo de d unF v ntidd de elementos es onoid por el progrmdor en este soD y el tmo de d elemento puede ser ddo por l funin sizeof (type name)F ist funin retorn el tmo de un tipo en ytesF v mro #define NKEYS (sizeof keytab / sizeof(keytab[0])) pueE de ser usd pr drle un vlor NKEYSF sulmenteD l funin sizeof no puede ser usd en un mro #if lineD y que el preproesdor no prE se tiposF in emrgoD ls expresiones en #define no son evluds por el preproesdorD s que el digo es legl en este puntoF
#include `s t d i o F hb #include ` t y p e F hb #include `s t r i n g F hb #define weyh IHH int getword @ char D int A Y struct key i n s e r h @ char D struct
/ count C keywords ; p o i n t e r v e r s i o n
key D
/
int A Y
min @ A {
weyhA 3a iypA PI
}
/
@ i s l p h @ word H A A @ @ pa i n s e r h @ word D keyt D xuiA A 3a xvvA pbountCCY for @ p a keyt Y p ` keyt C xuiY pCCA i f @ pbount b H A p r i n t f @ 4 7Rd 7 s n4 D pbount D pbword A Y return H Y
if
if
struct
{ nA
b i n s e a r c h :
f i n d
word
in
tab [ 0 ] . . . tab [ n
1]
int
int ond Y struct key low a 8t H Y struct key h i g h a 8t n Y struct key mid Y while @ low ` h i g h A
mid a low C @ high low A G P Y i f @ @ ond a strmp @ word D midbword A A ` H A h i g h a mid Y else i f @ ond b H A low a mid C I Y
} }
else return
mid Y
return
ixisten vrios spetos que vle l pen resltrF rimeroD l delrion de l funin binsearch dee indir que retorn un puntdor un estruE tur en lugr de un enteroY i est funin enuentr l plrD retorn el puntdor stY si no l enuentrD retorn NULLF in segundo lugrD los elementos de keytab deen ser edidos por punE tdoresF v iniilizin pr low y high son hor puntdores l omienzo y ltim posiin de l tlF il mio ms importnte es justr el lgoE ritmo pr segurrse que no genere un puntdor ilegl o intente eder un elemento fuer del rregloF pinlmenteD en el main se enuentr l instruinX PP
for (p = keytab; p < keytab + NKEYS; p++)D i p es un puntdor un estruturD l ritmti sore p tom en uent el tmo de l estruturD s que pCC inrement p l ntidd orret pr moverse l prximo elemento trvs del espio de direiones de memoriF in emrgoD no se dee sumir que el tmo de l estrutur es l sum de sus miemros y que en osiones se requiere un linemiento de los ojetosF
3.5. Typedef
g provee un filidd llmd typedef pr rer nuevos nomres pr tipos de dtosF or ejemploD l delrinX
typedef int length; re que el nomre length se un sinnimo pr intF osteriormenteD este puede ser usdo pr otrs delrionesF ytros ejemplos sonX
declarations and casts: String p, lineptr[MAXLINES], alloc(int); int strcmp(String, String); p = (String) malloc(100);
e dee notr que el tipo delrdo en typedef pree en l posiin del nomre de l vrileD no despus de l plr typedefF
PQ
4.
Entrada/Salida
v entrd y slid de un sistem opertivo se re(ere l interin de ste on un tereroF st es posile medinte l entrd y slid de den de rteres hi y desde el sistemF vos perferios de l omputdor omo el teldo y l pntll son los dispositivos por defeto pr est treF il tem trtdo en este ptulo no es relmente prte del lenguje gD sin emrgo existe l neesidd de her enfsisF il estndr de g ensi de(ne este onjunto de lireris preismente pr que en ulquier sistem donde exist g pued her interinF e hr hinpi en ls lireris <stdio.h>D <string.h> y <ctype.h>F ists lireris implementn un modelo simple pr her entrd y slid de textoF n )ujo de texto onsiste de un seueni de lnesY d lne termin on el rter de nuev lne nF il menismo ms simple de letur de un rter por vez de l entrd estndrD normlmente desde el teldoD es on l funin int getchar(void)F st retorn el prximo rter leido d vez que es llmdoD o EOF si enuentr el (nl del rhivoF il smolo onstnte iyp @ind of pileA est de(nido en <stdio.h>F gontrrimenteD l funin int putchar(int) es usd pr olor el entero indido omo prmetro en l slid estndrD que por defeto en l pntllF st funin retorn el rter esritoD o iyp si un error ourreF gomo se mostr en otros ejemplos l funin printf reliz el mismo trjo pero on un string omo prmetroF r usr ests funiones se dee mostrr en el enezdo l instruinX #include <stdio.h>F or ejemploD onsidere el progrm siguiente que onE vierte l entrd en letrs minsulsX
#include #include
min @ A {
/
`s t d i o F hb ` t y p e F hb
lower : c o n v e r t input to lower case
@ @ a g e t h r @ A A 3a iypA puthr @ tolower @ A A Y return H Y gdigo IRX vower v funin tolower est de(nid en <ctype.h>Y onvierte un string de PR
int while
mysul minsulF
:%s: :hello, world: :%10s: :hello, world: :%.10s: :hello, wor: :%-10s: :hello, world: :%.15s: :hello, world: :%-15s: :hello, world : :%15.10s: : hello, wor: :%-15.10s: :hello, wor :
v funin sprintf reliz l mism onversin de printfD pero gurd l slid en un stringX
int sprintf(char *string, char *format, arg1, arg2, ...); ist funin revis los rgumentos en rgI D rgPD etFD de uerdo l formto explido previmenteD pero olo el resultdo en string en lugr de l slid estndrF n uen ejemplo es mostrdo ontinuinD que muestr un versin mnim de printfD que proes un list de longitud vrile de rgumentosX
#include
/ l i s t
`s t d r g F hb
minimal p r i n t f with v a r i a b l e argument
m i n p r i n t f :
void
m i n p r i n t f @ char fmt D F F F A
to each unnamed arg in turn
make
ap
p oi n t
to
1 st
unnamed
for
{ } {
arg
if
int A Y
PT
break Y case 9 f 9 X
printf @4 7 d4 D i v l A Y
} } vend @ p A Y
d v l a vrg @ p D double A Y printf @4 7 f 4 D dvl A Y break Y case 9 s 9 X for @ s v l a vrg @ p D char A Y s v l Y s v l CCA puthr @ s v l A Y break Y default X puthr @pA Y break Y
c l e a n
up
when
done
gdigo ISX ersin wnim de printf gontrrimenteD l funin scanf que es nlog printfD int scanf(char *format, ...)D lee rteres de l entrd estndrD los interpret de uerdo l formto espei(do en formatD y gurd el resultdo en los suesivos
rgumentosY el resto de los rgumentosD dee ser un puntdor que indi donde el orrespondiente string dee ser lmendoF ixiste un funin similrD sscanf que lee de un string en lugr de l entrE d estndrD int sscanf(char *string, char *format, arg1, arg2, ...)F evis el string de uerdo l formto en formt y gurd el resultdo en los suesivos rgumentosD stos deen ser puntdoresF v espei(in de los formtos viene dd por l tl mostrd preE vimenteF
PU
smprime el ontenido de los rhivos xF y yF en l slid estndrF il sunto es mo implementr stoD es deirD mo rreglr los rhivos de mner que d nomre de rhivo se psdo omo rgumento y se ledoF equ se mostrr mo leer los dtos de rhivos externosF v regls son senillsD ntes de que un rhivo se ledo o esritoD dee ser ser ierto por l funin fopen de l lireri <stdio.h>F st funin tom un nomre omo xF o yFD reliz un trnsin on el sistem opertivo y retorn un puntdor que ser usdo pr ls posteriores leturs y esritursF iste puntdor llmdo apuntador a un archivoD punt un estrutur de(nid omo FILE que ontiene informin sore el rhivo omo l uiE in de un u'erD l posiin l rter tul en el u'erD si el rhivo est siendo ledo o esritoD y si h ourrido un error o iypF in emrgoD los usurios no neesitn ser estos detllesF r delrr un puntdor de este tipo se utiliz por ejemploX FILE *fp;D esto die que fp es un puntdor un rhivoF v llmd pr rir un rhivo en un progrm esX
fp = fopen(name, mode); il primer rgumento de fopen es un string que ontiene el nomre del rhivD el segundo es el modo de pertur del rhivoX letur @rAD esritur @wA y gregr @AF i un rhivo que no existe es ierto pr esritur o pr dirD es redo si es posileF erir rhivos existente pr esritur us que el viejo ontenido se desehdoD mientrs que se indi el modo ppend preserv el ontenidoF il rir un rhivo que no existe pr letur indir un errorF ytrs uss de error son trtr de leer un rhivo undo no tiene los permisos propidosF i existe lgn errorD fopen retornr xvvF ixisten un pr de funiones tiles que permitirn l esritur y letur de un rhivoD un vez iertoF getc retorn el prximo rter de un rhivo ser ledoD iyp si enuentr (nl de rhivo o errorX int getc(FILE *fp) or otro ldoD putc es un funin pr esriir en un rhivoX int putc(int c, FILE *fp) putc esrie el rter c l rhivi fp y retorn el rter esritoD o iyp si un error ourriF gundo un progrm en g se ejeutD el sistem opertivo es responsle de rir tres rhivos y provee puntdores pr stosF istos rhivos son l entrd estndrD l slid estndr y el error estndrY los puntdores orrespondientes son denomindos stdinD stdoutD y stderrD y son delrdos en <stdio.h>F xormlmenteD stdin est soido l teldoD y stdout y stE derr estn soidos l pntllF in emrgoD stdin y stdout pueden ser redirigidos otros rhivosF edemsD est lireri ofree ls funiones fscanf y fprintf pr esritur
PV
y letur de un rhivoF sts son idntis scanf y printfD exepto que el primer rgumento es un puntdor rhivo que espei( el rhivo ser ledo y esritoF
int fscanf(FILE *fp, char *format, ...) int fprintf(FILE *fp, char *format, ...)
gon este onoimentoD estmos en l pidd de interpretr un progrE m similr l cat de xs que us ls funiones explids previmente
#include
/ cat :
`s t d i o F hb
c o n c a t e n a a r c h i v o s
min @ int rg D char rgv A { psvi f p Y void f i l e o p y @ psvi D psvi A i f @ r g aa I A / n o a r g s ; p i d e f i l e o p y @ stdin D stdout A Y
de
s t d i n
4 r 4 A A aa xvvA
} else { f i l e o p y @ fp D s t d o u t A Y f l o s e @ fp A Y } return HY
G f i l e o p y X o p i r h i v o i f p o f p G v o i d f i l e o p y @ psvi i f p D psvi o f p A { int Y w h i l e @ @ a g e t @ i f p A A 3a iypA put @ D o f p A Y } gdigo ITX ersin propi de cat PW
vos puntdores stdin y stdout son ojetos de tipo FILE *F stos son onstntesD por esto no es posile signrles lgoF pinlmenteD l funin fclose reliz lo inverso de fopenD ierr l onexin entre el puntdor l rhivo y el propio rhivoF or lgunos prmetros que se estleen en el sistem opertivoD es uen ide ejeutr est operin siempre que se re un rhivoF
#include
/ cat :
min @ int rg D char rgv A { psvi f p Y void f i l e o p y @ psvi D psvi A Y char prog a rgv H Y / n o m b r e
del
programa
para
if
e r r o r e s
/
; c o p i a de s t d i n
@ r g aa I A / n o a r g s f i l e o p y @ stdin D stdout A Y
4 r 4 A A aa xvvA
} { } {
else
f i l e o p y @ fp D s t d o u t A Y f l o s e @ fp A Y @ f e r r o r @ stdout A A f p r i n t f @ stderr D 4 7 s X e r r o r w r i t i n g s t d o u t n4 D prog A Y exit @PA Y
if
} exit @HA Y
QH
gdigo IUX ersin ms segur de cat in este ejemplo se puede ilustrr el uso del puntdor stderr iste progrm heque errores de dos mnersF rimeroD l slid de dignstio produid por fprintf se redirige stderrF egundoD el progrm us l funin exitD que termin l ejeuin del progrm undo es llmdoF il rgumento de est funin es el que se retorn ulquier que llme l funinD puede indir esttus de xito o errorF he form onvenionlD un vlor de retorno ero indi que no ourri lgn errorD y distinto de ero indi un situin de fll del progrmF ist es similir utilizr return exprF v funin ferror retorn distinto ero si un error ourri en el rhivo puntdo por fpF
strrhr@sDA retorn un puntdor l ltimo rter en sD o xvv si no est presenteF elguns funiones omunes de l lireri <ctype.h> que relizn onverE siones y veri(in de rteresF islph@A distinto de ero si es un rter del lfetoD H si noF isupper@A distinto de ero si est en mysulD H si noF islower@A distinto de ero si est en minsulD H si noF isdigit@A distinto de ero si es un dgitoD H si noF islnum@A distinto de ero si islph@A o isdigit@AD H si no isspe@A distinto de ero si es un espio en lnoD tuldorD nuev lneD entre otrosF toupper@A retorn onvertid mysulF tolower@A retorn onvertido minsulF is importnte onoer lguns funiones de uso vnzdo omoX r ejeuin de omndos l funin system(char *s) ejeut el omndo ontenido en el string sF or ejemploD system@dteAF r reserv de espio de memori pr estrutursD ls funiones mllo y llo otienen los loques de memori dinmimenteD los prototipos sonX void *malloc(size_t n)D que retorn un puntdos n ytes de lmenmientoD o xvv si l petiin no se puede umE plirY void *calloc(size_t n, size_t size)D retorn un puntdor su(iente espio de memori pr un rreglo de n ojetos del tipo espei(doD o xvv si no se puede umplir l petiinF or ejemploX
free@pAD lier el espio seldo por el puntdor en pF v mner ms segur de lierr espio esX
/* CORRECTO */
q = p->next; free(p);
elguns funiones mtemtis se enuentrn disponiles en <math.h> sin@xA sine of xD x in rdins os@xA osine of xD x in rdins tnP@yDxA rtngent of yGxD in rdins exp@xA exponentil funtion ex log@xA nturl @se eA logrithm of x @xbHA logIH@xA ommon @se IHA logrithm of x @xbHA pow@xDyA xy sqrt@xA squre root of x @xbHA fs@xA solute vlue of x
5.
Funciones
vs funiones dividen grndes tres de mputo en vris ms pequesD y permiten l posiilidd de onstruir sore lo que otros y hn hehoD es deirD permite l reutilizin de digoF vs funiones propids oultn los detlles de operin de ls prtes de un progrmD s dn lridd l totlidd y filitn l penos tre de her el mismo mio numeross veesF iste lenguje se dise pr her que ls funiones fuern e(ientes y files de usrY los progrms esritos en g se omponen de muhs funiones peques en lugr de slo lguns grndesF n progrm puede estr omE puesto de uno o ms rhivos de digoF sto es posile y que ls fuentes o rhivos de digo pueden ser ompildos seprdmente pr ser posteriorE mente enlzdos entre ellos e inluso on lireris ompilds previmente del sistemF n funin en g dee ser delrd y de(nidD en el primer soD se le onoe omo prototipo de l funin donde se indi el tipo de retornoD el nomre y los rgumentos de l funinF osteriormenteD un funin es de(nid indindo l informin del prototipo nuevmente y el uerpo de l funinD es deirD ls lnes de digo que ejeutF n ejemplo lsioD es un funin que le d lne de l entrd estnE dr o un rhivo y verique que onteng un ptrn prtiulrF uede oservr en su terminl de omndos de nixD que umple l mism funionlidd del omndo grepF v form ptim de desrollr este progrm es esriir tres funiones que distriuyn l treD sin emrgoD siempre se pueden esriir tods ls instruiones en l funin prinipl sin el uso de surutins uxiliresF ist funin posee el nomre predetermindo de main y es l que represent el onjunto de instruiones priniples que se ejeutn por defetoF il digo se present ontinuinX
l o n g i t u d
maxima
de
la
l i n e s
f u n c i o n e s
char
/
Funcin
QR
min @ A { char l i n e wevsxi Y int found a H Y while @ g e t l i n e @ l i n e D wevsxiA b H A i f @ s t r i n d e x @ l i n e D p t t e r n A ba H A { printf @4 7 s4 D line A Y foundCCY } return found Y }
/ y g e t l i n e : r e t o r n a la guarda la l i n e a en la v a r i a b l e s
l o n g i t u d
s D
int
lim A {
}
/
b H 88 @ ag e t h r @ A A 3a iyp 88 3a 9 n 9 A s i CC a Y i f @ aa 9 n 9 A s i CC a Y s i a 9 H 9 Y return i Y
s t r i n d e x : no
r e t o r n a
e l
i n d i c e
de
en
s ,
s i
return
@ k b H 88 t k aa 9 H 9 A iY
return IY
gdigo IVX qrep propio il pseudodigo muy lto nivel pr myor lridd esX QS
while (no existen mas lineas) if (la linea contiene el patron) imprimir la linea
v funin que otiene ls lnes y su vezD veri( que existn ms lnesD es getlineF v funin pr imprimir l lineD es l onoid printf ontenid en l lireri stdio.h inluid en el enezdo del rhivoF v que revis si el ptron se enuentr en l den de rteres es strindex(s,t)D st retorn l posiin o ndie del primer rter t que onsigue de izquierd dereh en el string sF il vlor negtivo de retorno indi que no se enuentr el rter en l lne espei(dF he mner generlD l de(niin de un funin posee l siguiente estruE turX
gcc main.c getline.c strindex.c isto ompilr los tres rhivosD generndo un rhivo on el digo oE jeto o mquin on extensin Fo soido d unoX main.oD getline.o y strindex.oF vuegoD sern rgdos en un rhivo ejeutle a.outF in so de errores de ompilinD sern indidos en l slid estndrF n pr de ejemplos de funiones que retornn tipos ms omplejos que vo @voidA o nmeros enteros @intA se presentn ontinuinX
#include
/ en a t o f : un
` t y p e F hb
c o n v i e r t e un s t r i n g de s doble f l o t a n t e p r e c i s i n
punto
QT
blanco
Y s i g n a @ s i aa 9 9 A c I X I Y i f @ s i aa 9C 9 | | s i aa 9 9 A i CCY for @ v l a H F H Y i s d i g i t @ s i A Y i CCA vl a IHFH vl C @ s i 9H 9 A Y i f @ s i aa 9 F 9 A i CCY for @ power a I F H Y i s d i g i t @ s i A Y i CCA { vl a IHFH vl C @ s i 9H 9 A Y power a I H Y } return s i g n v l G power Y gdigo IWX tof propio
@ i a H Y i s s p e @ s i A Y i CCA
n funin similr se enuentr en un lireri estndr del pquete de instlion del ompildor de gD llmd stdlib.hF gomo se not en l delrin de l funinD st retorn un vlor de tipo doubleF gulquier progrm que l utilie dee onoer que retorn un vlor distinto un enteroF n progrm que puede her uso de l rutin atof es el de un lulE dor rudimentriX
mxA Y
} gdigo PHX gluldor rudimentri v delrin double sum, atof(char []); indi que l vrile sum es de tipo double y que l funin atof(char []) tom un rgumento de tipo char[] y retorn un rgumento de tipo doubleF st ltim dee ser delrd y de(nid onsistentementeF isto esD si en el prototipo de l funin se indi que retorn o tom prmetros de lgn tipo en prtiulrD l de(niin de l funin dee indir lo mismoD si no dr un error nivel de ompilinF v delrin y de(niin puede preer redundteD pero este es un esE tndr utilizdo por todos los progrmdores de este lengujeF isto permite reutilizin e inlusin e(iente de funionesF in so de no delrr un prototipoD se sume que l primer priin de l funin es el prototipoF hd l funin atof orretmente delrdD se puede de(nir ls atoi de l siguiente mnerX
in generlD un progrm onst de un ierto nmero de funiones y un funin minF is usul que ests funiones sen grupds de uerdo un speto en omnD y s mismo distriuids entre distintos rhivos fuenE te identi(dos on un nomre nemnio que permit sumir que tipo de funiones se pueden enontrr llF he l mism mnerD es un estndr que d fuente teng un rhivo extensin Fh y F soidoF honde en el primer soD se inluyen l delE rin de vrilesD estruturs y funiones glolesF in el segundo soD se olo el digo soido d funin glol y otrs vriles o funiones loles neesrisF min es omn en el so de que pliqueD se teng un QV
while (existan operadores u operandos) if(numero) empilar; else if(operador) desempilar operandos aplicar operacion empilar resultado else if(nueva linea) desempilar tope de la pila e imprimir else error
QW
v uestin es deidir omo mnejr l pilF n posiilidd es delrrl en el minD y psrl omo prmetro ls funiones de empildo @pushA y desempildo @popA junto on l posiin tul del ltimo elemento edidoF ero min no neesit ser sore ls vriles que ontroln l pilD s que es mejor que sts sen vriles externs esiles por ls funiones pop y pushF il digo en g se muestr ontinuinX
#include #include
/ un tamao
`s t d i o F hb ` s t d l i F hb
mximo u de
para
a t o f ()
#define
/
operando
o pe ra do r
wey IHH
de que un fue e n c o n t r a d o
s e a l
#define
numero
xwfi 9 H 9
min @ A {
g e t o p @ s A A 3a iypA
switch case
@ type A
xwfiX push @ t o f @ s A A Y break Y case 9C 9 X push @ pop @ A C pop @ A A Y break Y case 9 9 X push @ pop @ A pop @ A A Y break Y case 9 9 X RH
opP a pop @ A Y push @ pop @ A opP A Y break Y case 9 G 9 X opP a pop @ A Y i f @ opP 3a H F H A push @ pop @ A G opP A Y
else
break Y case 9 n 9 X
p r i n t f @ 4 e r r o r X z e r o d i v i s o r n4 A Y
} }
p r i n t f @ 4 t 7FVg n4 D pop @ A A Y break Y default X p r i n t f @ 4 e r r o r X unknown ommnd 7 s n4 D s A Y break Y HY gdigo PIX gluldor ol evers
return
is importnte destr que en el so de los operdores de rest y diE visin el orden dee ser distinguidoD es deirD es inorret l operin push(pop() - pop()) por esto se utiliz un vrile temporlF vs opeE riones de pil se de(nen ontinuinX
#define
/ v a l o r
weev IHH
maximo de p r o f u n d i d a d de la p i l a
a HY / p r o x i m a v l weev Y /
empila f
p o s i c i o n p i l a
l i b r e
de
la
p i l a
push :
push @ double f A
else
}
RI
double
{
pop :
pop @ void A
d e s e m p i l a
r e t o r n a
e l
v a l o r
del
top
{ }
return else
if
@ sp b H A v l sp Y
p r i n t f @ 4 e r r o r X s t k emptyn4 A Y return H F H Y
gdigo PPX impildo y hesempildo he l mism mnerD l funin getop otiene el prximo operdor u operndoF v tre es filD solo dee ignorr los espios en lno y de tulinF edemsD si el rter no es un dgitoD retornrloF por otro ldoD oleionr un den de dgitos y retornr xwfiD l sel de que un nmero h sido enontrdoF
#include
` t y p e F hb
int
g e t o p @ char s A
int i D Y while @ @ s H
l i b r e
en
buf
{ }
g e t h @ void A
un
c a r a c t e r
return
c o l o c a
@ ufp b H A c uf ufp X g e t h r @ A Y
un c a r a c t e r en e l input
void if
ungeth @ int A
else
}
#define
xwfi 9 H 9 RQ
void push @ double A Y double pop @ void A Y int g e t o p @ char A Y int g e t h @ void A Y void ungeth @ int A Y
gdigo PSX vetur de rteres n vistzo generl de l estrutur del digo serX
r este progrm se pens ddo su tmo que solo er neesrio un rhivo de enezdoD sin emrgoD pr progrms ms extensos se onsej tener tntos rhivos de enezdo omo lo requier l estruturin del digoF
RR
6.4. Inicializacin
v iniilizin onsiste en drle un primer vlor un vrileD en l useni de un iniilizin explitD ls vriles externs y esttis se le d un vlor de ero por defetoF vs vriles eslres pueden ser iniilizds l ser de(nidsD seguid de un signo de iguldd y un expresinX
int x = 1; char squota = '\''; long day = 1000L * 60L * 60L * 24L; int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
6.5. Recursin
n funin reursiv posee en su uerpo llmds direts o indirets s mismF n lsio ejemplo de reursin es el lgoritmo de Quicksort desrrolldo por gFeFF rore en IWTPF RS
hdo un rregloD un elemento es elegido y el resto es prtiiondo en dos suonjuntosD en quellos menores y myores que el elemento pivoteF il mismo proeso es luego plido reursivmente los dos suonjuntosF gundo uno de los suonjuntos tiene menos de dos elementosD y no requiere ordenmiento y se detiene l reursinF v versin de uiksort que se present no es l ms rpidD pero es l ms simpleD y que se us el elemento medio pr her el prtiionmientoF
void
q s o r t :
q s o r t @ int v D
s o r t
v [ l e f t
int
] . . . v [ r i g h t ]
left D iD
int
en
orden
c r e c i e n t e
right A
v D
int
de
int
jAY
@ l e f t ba r i g h t A return Y / m e n o s
dos
e l e m e n t o s
}
/
p a r t i c i n
void
swap :
swp @ int v D
i n t e r c a m b i a
int
v [ i ]
iD
int
v [ j ]
jA
int
v lireri estndr de g inluye un versin qsort que orden ojetos de ulquier tipoF il digo reursivo es ms ompto pero omo mntiene un pil neesit ms memori pr su ejeuinF
RT
6.6. El preprocesador de C
iste es el primer pso de l ompilinD ontiene un lenguje peulir distinto l usdo en un progrm en g regulrmenteD d expresin es denoE mind macroF elguns rterstis tiles son presentds en est seinF
i se exmin el mroD se puede notr que ms expresiones son evE luds dos veesD por ejemplo l llmd max(i++, j++) es errne y esto inrementr l vrile i e j en el doleF he mner ontrriD los nomres pueden ser inde(nidos undo se reE querido on l diretiv #undef
#if SYSTEM == SYSV #define HDR "sysv.h" #elif SYSTEM == BSD #define HDR "bsd.h" #elif SYSTEM == MSDOS #define HDR "msdos.h" #else #define HDR "default.h"
RV
RW
7.
Apuntadores
7.1. Qu es un apuntador?
il lenguje de progrmin g est repleto de puntdoresF is relmente imposile dominr este lenguje sin entender ompletmente qu son los puntdoresF il prolem de los puntdores es que l myor de l gente que proE grm no tiene un onoimiento sio de mo se mnejn ls vriles en el lenguje gF n vrile es simente un ontenedor delrd de un tipo @intD shortD longD etA dnde se puede lmenr informinD que es vE rile en el tiempoF isto se d porque el lenguje g funion en un mundo intermedioD entre l progrmin de lto nivel y el mundo de los itsF gundo se delr un vrile en gD se le sign un tipo y un nomreF or dejo el ompilr reserv un espio en memori del tmo de l vrile desed @ver gdigo PD pgin WA F i no se le sign un vlor l vrile inmeditmenteD el espio sigue reservdo @n rzn muy fuerte pr no delrr vriles que no se usnAF n vez signdo un vlorD el espio en memori mntiene est informin en el formto y on los lmites neesriosF i se onsider un vrile regulr de gD que tiene un espio en meE mori donde se gurd el ontenido y un direin de memori que indi dnde est l informinD un puntdor es un tipo de vrile que ontiene un direin de memori pr llegr un ontenidoF odos los tipos de g tienen puntdores y existen diverss forms de delrr ests vrilesD tods reonoids por el ompildor de gX
int *ptr;
in gD ls vriles delrds sin signin inmedit son iniilizds por el ompildor un vlor predetermindoF r los tipos nmerios @intD )otD douleA el vlor es l representin del HF r tods ls vriles tipo puntdor este vlor es NULLF n vez delrd un vrile de tipo puntdor no es neesrio usr * pr l signinD y que despus de l signin ptr es siempre un SH
vrile tipo apuntador a algoF i se us * ntes de un vrile esto tiene un signi(do ompletmente diferenteD que se desriir ms delnteF ixisten dos operdores unrios importntes l hlr de puntdoresF no es & y el otro es l mism * usd pr delrr vriles de tipo puntdorF hemos diho que tod vrile en g tiene reservdo un pedzo de l memori existenteF omndo eso en uent tiene que her un form de otener l direin de l memori donde est lmendo un informinF il operdor & he justmente estoF nido un vrile ulquierD usndo este operdorD se otiene l direin de memori donde est l informinF n ejemplo es l siguiente line de digoX
IP IQ IR IS IT IU IV IW PH PI PP }
k a mY p r i n t f @ 4 n4 A Y p r i n t f @ 4 j t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D j D @ void A8j A Y p r i n t f @ 4k t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D k D @ void A8k A Y p r i n t f @ 4m t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D m D @ void A8 mA Y p r i n t f @ 4 p t r t i e n e e l v l o r 7 p y e s t lmendo en 7 pn4 D ptr D @ void A8p t r A Y p r i n t f @ 4 il v l o r d e l e n t e r o puntdo por p t r e s 7 d n4 D p t r A Y
return
in este ejemplo tenemos ls delriones de ls vriles jD k y mF in ls lines U y V del digo IW tenemos que se le sign jD k y m on ID P y Q repetivmenteF in l line Q se delr un tipo nuevo de vrile del tipo int *F isto se denomin un vrile puntdorF v * signi( que l vrile es de tipo puntdorD el nomre soidoD en este so intD muestr que tipo de informin punt l vrileF vuego se le sign ptr l direin de k en l line IHF isto es seguido por un signion de m kF vo que sigue es l impresin en l pntll de los vlores que rroj orrer este progrmF r poder nlizrlo y trtr de entender por ompleto l teori de puntdoresD mostrmos l slid joX
[hola@maquina]$ ./apuntador j tiene el valor 1 k tiene el valor 3 m tiene el valor 3 ptr tiene el valor El valor del entero y esta almacenado en 0x8049744 y esta almacenado en 0x804974c y esta almacenado en 0x8049750 0x804974c y esta almacenado en 0x8049748 apuntado por ptr es 3
gomo pueden preirD los vlores que resultn de l orrid del progrm son los desedosF vo importnte notr es l difereni entre l signin heh ptr en l line IH y l posterior signin de k mF isto refuerz SP
l ide de que un vrile tipo puntdor slo tiene l informin sore dnde est el ontenido de lgo y que de l primer signin de P kD ste se onvierte en Q y mi el ontenido l que punt tmin ptrF isto se puede ver en l lne de slid nmero R donde l direin en memori es igul l direin de l vrile kF in el digo IW tmin se muestrn los usos de & y * en l line IQ hst l IVF v ide de puntdores no es fil de entender y slo on l prti se puede reforzr este oneptoF mese un tiempo pr digerir l informin de est sein ntes de psr ms delnteF
7.2.1. Arreglos
il rreglo es l estrutur de dtos ms si en omputinF v ide de un rreglo es senillF smgnese los vgones de un trenD d uno on un nmeroD siendo H el primer vgnF in d vgon se puede meter lgun ontenidoD pero todos los ontenidos del tren tienen que ser del mismo tipoF e difereni de otros lengujes de progrmin los rreglos en g dee ser iniilizdos siendo su tmo mximoF n ejemplo esX
int miarreglo[10];
in este ejemplo se re un rreglo de enteros on IH sillsD del H l WF ytro ejemplo esX
estryndonos l nivel de gD se puede deir que un rreglo de tmo xD dee reservr x espios de memori de un tmo desedoF ree lgio que estos espios de memori se reservsen de form ontinuF in efeto esto es lo que ps en gF r poder ver omo entr en juego los puntdores mostrmos el ejemplo de omo iterr por ls sills de un rregloF
int for
iY
p r i n t f @ 4 nn4 A Y @ i a H Y i ` T Y i CCA { p r i n t f @ 4 m i r r e g l o 7d a 7 dn4 D i D m i r r e g l o i A Y } return H Y gdigo PVX sterin de un rreglo medinte sills
in este ejemploD se us l teori de sills pr iterr por el rregloF il for es simple y imprime en l pntll el vlor de miarreglo[x] donde x tom un vlor del H l S @por lo tnto son T vloresAF eroD si l informin en memori est puest seuenilmenteD no hE r un form de usr puntdoresc in g todo es posileF i se reuerdnD en l sein nteriorD se hl sore los tmos de ls vriles y sore su reservin en memori l momento de delrrls @iniilizds o noAF i se delr un rreglo de enteros @intA miarreglo de T sillsD esto signi( que el ompilr est reservndo TBsizeof@intA @ver digo PD pgin WA espio en memoriF gon un poo de ritmti simple nos dmos uent que d sill del rreglo tom sizeof@intA y que si hemos 8mirregloHD nos dr l direin en memori de l primer sill3 i nos queremos entusismr ms podemos pensr que si tenemos l diE rein de 8mirregloH y summos un sizeof@intAD nos dr l direin de l segund sill del rreglo3 in efeto es sF i nos ponemos pensrD esto ser un poo tedioso pr herD y que impli un ritmti en hexdeE iml @es l form en l que se lsi(n los espios de memoriA por lo que SR
no es intuitivo inluso pr el progrmdor ms experimentdoF gundo uno re un tipo puntdor en gD prte de delrr que l vrile es de tipo puntdor on * se le sign un tipo de vrile @intD )otD hrD etAF isto se he no solo por l legiilidd del digo sino tmin pr poder usr los puntdores en ontextos ms vridosD omo pr iterr dentro de un rregloF gomo el puntdor tiene signdo un tipo y tods ls vriles en g pueden prtiipr en operiones ritmtisD es posile lo que se muestr joX I #include `s t d i o F hb P Q int m i r r e g l o a { I D P Q D I U D R D S D I H H } Y R int p t r Y S T int min @ void A { U V int i Y W p t r a 8m i r r e g l o H Y IH II p r i n t f @ 4 nn4 A Y IP for @ i a H Y i ` T Y i CCA { IQ p r i n t f @ 4 ptr C 7 d a 7 dn4 D i D @ p t r C i A A Y IR } IS return H Y IT } gdigo PWX sterin de un rreglo medinte puntdor uxilir vo interesnte de este digo es que tenemos lgo equivlente l digo previoD pero de un form ompletmente nuevF vo importnte de este diE go es l line IRF hentro del printf hy un expresin summente onit que die *(ptr + i)F i nos reordmos de l sein nterior *ptr nos llev l ontenido @vlorA que nos punt ptrF ehor si le sumo un nmero entero ptr ntes de pedir el ontenidoD qu es lo que est psndoc v respuest viene dd por l delrin del puntdor on un tipoF i tenemos un puntdor tipo entero @omo es el so rriA el espio de ese vlor v venir ddo por sizeof@intAF intones si ptr se le greg el sizeof@intAD psr otro espio de memori donde podra omenzr otro vlor de enteroF eunque esto no es reomndle en muhs osionesD en el so de rreglos es perfetoF r filitr este luloD g viene inorpoE rdo on aritmtica de apuntadoresF isto signi( que ddo un puntdor delrdoX SS
hola *ptr;
v expresinX
ptr + 1
se resolver on l euinX
int
iY
return
HY
gdigo QHX sterin en un rreglo usndo el rreglo omo puntdor iste digo es ompletmente nlogo l digo PI en l pgin RPF xuevmente se sugiere sentrse pensr sore est suseinD trtndo de entender en d ejemplo ddo lo que est psndoD pso psoF n vez que quede lro este onepto podemos psr ls estruturs ms vnzE dsF
9r poder gregr l nodo un vlorD omo est en xvvD se dee iniilizr l vrileF gomo se quiere reservr un espio dinmio pr nuestr estruturD se requiere de un mllo del tmo de nodoF n vez reservdo el espioD se deer signr un vlor l ontenedor que tiene el nodoF odo esto se puede herD rendo un funinX bFrSI
pe a o n t e n e d o r Y / a p u n t a p A a c o n t e n e d o r / printf @4 7 s b wuestr l o que punt t i e n e o n t e n e d o r n4 D o n t e n e d o r A Y printf @4 7 s b wuestr l o que punt pen4 D peA Y pf a o n t e n e d o r P Y p r i n t f @ 4 n4 A Y
/ apunta pB a c o n t e n e d o r 2
char pe Y char pf Y
/ /
otro
t i p o
char
while @ pe
3a 9 H 9 A { SV
pfCC a peCCY
vo importnte es ver qu mo l vrile 7s en printfD imprime el rreE glo de hr sin prolemF mien hy un fuerte uso de puntdores y de sus signionesF pjese ien lo que ps dentro del ilo del whileF equi se est signndo d sill del ontenedorP l informin de l vrile onE tenedorF min muy importnte es el gregdo del \H despus de her opido rter por rterF i ien esto no es omo se opir un rreglo normlmente en gD es un demostrin muy interesnte de omo los rreglos de hrD los puntdores y los strings estn unidos en este lengujeF
SW
8.
Herramientas
8.1. Makele
n rhivo Makele es un espei(in de dependenis entre rhiE vos y de mo resolverls pr logrr un ojetivo glolF istos rhivos son proesdos por l utilidd makeD disponile es ulquier sistem xsF il progrm mke tuliz todos los ojetivos trvs de l tulizE in de tods sus dependenisF n grfo potenilmente omplejo es formdo undo se reliz el proesmiento de estos rhivosF n ejemplo senillo esX l l X foo f o o X f o o F o r F o z F o FFoX 6 @ggA 6 @gpveqA 6` o 6dd F l FX 6 @viA 6` 88 mv l e x F yy F 6dd gdigo QPX ijemplo enillo wke(le il grfo de fuentes soido este ejemplo esX
qenerlmenteD todos los ojetivos se sumen nomres de rhivosD y ls regls deen espei(r mo rer o tulizr estos rhivosF gundo se lleg los nodos hojsD omo se ve en el gr(o previoD el wke(le dee inluir un onjunto de omndos de shell que permite generr o tulizr estos rhivosF v tulizin de los ojetivos signi( que el tiempo de ltim modi(in de ls dependenis se ms reiente que el ojetivoF sgulmenteD se pueden espei(r regls que sern ejeutds inondiioE nlmenteD por ejemploX TH
target1: dep1 dep2 ... depN <tab> cmd1 <tab> cmd2 <tab> ... <tab> cmdN target2: dep4 dep5 <tab> cmd1 <tab> cmd2 dep4 dep5: <tab> cmd1
vos ojetivos deen estr l omienzo de un line y son seguidos de dos puntosF vuego sigue un espio en lno y el onjunto de dependenis seprds por un espio en lnoF in l lne siguiente vn los omndos de shell que deen ser ejeutdosD es importnte onoer que st lne dee tener omo pre(jo un espio de tuldorD este es un error muy omn en nuevos usuriosF is deirD no se aceptan varios espacios en blanco, solo un tabF edemsD en estos rhivos se pueden usr ierts mrosD sts empiezn on un signo de dlrF or ejemploX $(CC) $(CFLAGS) -c $< -o $@F equ ls form sintti 6@FFA indi expnsin de vrilesF n vrile se puede de(nir de l siguiente formX VAR=VALORD
CC=gcc el ser proesdoD donde se hy espei(do l vrile 6@ggA se sustituye literlmente on el vlor gF wke tiene un onjunto de vriles de(nids por defetoD el vlor primrio de 6gg es F vs mros ms omunes son 6d y 6`F sts representn los nomres de los ojetivos y l primer dependeni de l regl en l que preeF in el siguiente wke(le se puede ilustrrD
l l X dummy TI
deho 46d depends on 6`4 dummy X touh 6d gdigo QQX ijemplo enillo wke(le el ejeutr el omndo mkeD l slid esX
TP
8.2.
el esriir un progrm !en ulquier lenguje! suele ourrir que omeE temos erroresF vos progrms esritos pueden tener un omportmiento difeE rente l que espermos deido que nuestro lgoritmo er inorreto o que nos equivomos l esriirloF il proeso de depurinD ms omnmente onoido omo debugging onsiste en l squed y eliminin de errores en un progrm y esritoF hdo que relizr deugging de un progrm puede llegr ser un tre muy tediosD existe un vriedd de herrmients que yudn en el proesoF in prtiulr est disponile GDBD un deugger que form prte del proyeE to qxF ste permite exminr l ejeuin de un progrm mientrs est ejeutndose o l her termindo su ejeuinF ermite detener el progrm en puntos espei(dos pr oservr su estdo e intentr lolizr l fuente de ulquier error detetdoF r que nuestro progrm ejeutle onteng informin de deugging que nos yude durnte el uso de qhfD deemos ompilr usndo l opin -ggdb de gccF or ejemploD podemos herX
gdb bugs
el her esto estremos frente un prompt de gd en el ul podemos esriir omndosF ry un grn ntidd de omndos disponilesY los usuE rios ms experimentdos tienen muhs posiiliddes l utilizr est herrE mientF in emrgoD onoiendo un pequeo onjunto de omndos imporE tntes podemos provehrlF or supuestoD l mejor mner de prenderlos es usndolosF ixperimente on los siguientes omndosF uede utilizr el omndo help pr otener ms yud sore d unoF inuentre los errores en el progrm QSD que intent enontrr el menor nmero n tl que (@nA es myor que IHHHHHHHF rek print disply t list TQ
#include
{
`s t d i o F hb
int
f i @ unsigned
int
nA
if if
@ n aa H A
return return
HY IY
@n a IA
} {
return
f i @ n IACf i @ n PA Y
int
min @ int rg D
char
rgv A
int
{
while
{
if
p r i n t f @ 4 f i @ 7d A a 7 dn4 D i D f i @ i A A Y }
return
r empezr podemos de(nir un breakpoint l entrr minF isto hr que el progrm se deteng hD lo que nos permite ver l ejeuin pso pso desde el prinipioF isto se puede her esriiendo TR
break main
oD ddo que min empiez en l lne IRD
break 14
reho estoD esriimos
run
pr iniir l ejeuin del progrmF ste se detendr inmeditmenteD permitindonos drle ms omndos qhfF odemos usr los omndos print y display pr ver el ontenido de un vrile ddF next y step vnE zn un pso en l ejeuinF
TS
9.
Ejercicios
IF isri un funin strindex(s,t) que retorne l posiin de l ourrenE i uid ms l derehD del elemento t en el string sF in so de que hy ningun ourreni retornr eroF PF isri un funin similr l estudid previmente atof pr mE nejr l notin ient( de l formX IPQFRSeETD undo un punto )otnte este seguido de un e o E y opionlmente un signo en el exponenteF QF he(n un mro swp@tDxDyA que intermie dos rgumentosD x e yD de tipo tF RF isri un progrm pr omprr dos rhivosD imprimiendo ls priE mero lne donde di(erenF SF wodi(que el progrm de Grep propio ddo en ptulos previosD que tomen omo entrd de prmetros un onjunto de nomres de rhivos y usque el ptrn en todos esos rhivosF TF isri un progrm que imprim en pntll un onjunto de rhivosD entre d rhivo dee imprimir un lne en lno y se dee indir el nomre del rhivo orrespondiente en l slidF
TT