You are on page 1of 99

VctorSanchez2

http://www.victorsanchez2.com

Ejercicios y prcticas resuletas sobre PROGRAMACIN AVANZADA EN


Copyright (c) 2008 Vctor Snchez Snchez.

Permission is granted to copy, distrib te and!or modi"y this doc ment nder the terms o" the #$% &ree 'oc mentation (icense, Version ).* or any +ater ,ersion p b+ished by the &ree So"t-are &o ndation. -ith no /n,ariant Sections, no &ront0Co,er 1e2ts, and no 3ac40Co,er 1e2ts. 5 copy o" the +icense is inc+ ded in the section entit+ed 6#$% &ree 'oc mentation (icense6. 000 1his program is "ree so"t-are7 yo can redistrib te it and!or modi"y it nder the terms o" the #$% #enera+ P b+ic (icense as p b+ished by the &ree So"t-are &o ndation, either ,ersion * o" the (icense, or any +ater ,ersion. 1his program is distrib ted in the hope that it -i++ be se" +, b t 8/19:%1 5$; 85<<5$1;. -itho t e,en the imp+ied -arranty o" =><C95$153/(/1; or &/1$>SS &:< 5 P5<1/C%(5< P%<P:S>. See the #$% #enera+ P b+ic (icense "or more detai+s. ;o sho +d ha,e recei,ed a (icense a+ong -ith this ?http7!!---.gn .org!+icenses!@. copy o" the program. #$% #enera+ P b+ic /" not, see

!a "ocumentaci#n y los pro$ramas %ue"an licencia"os bajo las licencias &'(! y &)!.

Versi#n *.+ ,-+**+./


0utor: Vctor

Snchez2

1eb: www.victorsanchez2.com orreo: victorsanchez22$mail.com 3abber: victorsanchez22jabberes.or$

Se recomien"a utilizar el compila"or $cc y el sistema operativo &N4/!inu5. En la carrera vais a tener %ue utilizarlo in6ini"a" "e veces7 as %ue mejor comenzar ahora. Es el mejor compila"or %ue e5iste y est arropa"o por la in6ini"a" "e pro$ramas "e $ran cali"a" "el mun"o &N4/!inu5. )ara la carrera po"8is utilizar 0njuta para e"itar los pro$ramas y el ((( para corre$ir vuestros bu$s.

VctorSanchez2

http://www.victorsanchez2.com

PRCTICA 1: El objetivo "e esta prctica es a6ianzar ciertos conceptos bsicos "e la pro$ramaci#n en len$uaje :

9ucles y tablas. Entra"a y sali"a "e "atos. )aso "e ar$umentos a un pro$rama. :anejo "e archivos. 'unciones. 4so "e memoria "inmica.

EJERCICIOS 1.

Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue pi"a por tecla"o una serie "e n;meros enteros7 los almacene en una tabla esttica y posteriormente escriba por pantalla to"os los n;meros intro"uci"os in"ican"o a"ems cual es el mayor y el menor. !o primero %ue "ebe hacer el pro$rama es pre$untar al usuario cuantos n;meros se van a intro"ucir y comprobar %ue "icha canti"a" es menor %ue la "imensi#n "e la tabla. )ara "icha "imensi#n "ebe "e6inirse una constante ,por ejemplo :0<=(>:ENS>?N/ a la cual se pue"e asi$nar un valor razonable ,por ejemplo7 *++/.
'unciones a utilizar:

scanf: para leer n;meros intro"uci"os por el tecla"o. printf: para imprimir por pantalla.

Ejemplo "e ejecuci#n: lo %ue se vera por pantalla "ebe ser al$o as como >ntro"uce la canti"a" "e n;meros:
3 Introduce los nmeros: 5 7 2 Los nmeros introducidos son: 5 7 2 El mayor es el 7.

VctorSanchez2
El menor es el 2.

http://www.victorsanchez2.com

/********************************************************* * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * **********************************************************/ )include *stdio.h+ )include *stdli".h+ )include *strin(.h+ )de,ine -. / )de,ine E00 1/222/ )de,ine 3A456I3 /22 int enteros73A456I389 int num5total9 int int int int /* Array #ara (uardar los enteros */

lectura:%oid;9 sacar#antalla:int ma<= int min= int num5total;9 calcular:int *ma<= int *min= int total;9 es5di(ito:char caracter78;9

int main:; > int menor9 int mayor9

/* ?umero menor */ /* ?umero mayor */

i, :lectura:; @@ E00; > #rint,:AError al leer el numero de terminos.BnA;9 return E009 C i, :calcular:Dmayor= Dmenor= num5total; @@ E00; > #rint,:AError al intentar calcular el mayor y el menorA;9 return E009 C i, :sacar#antalla:mayor= menor= num5total; @@ E00; > #rint,:AError al mostrar #or #antalla.BnA;9 return E009 C return -.9 C /********************************************************* * Euncion: int lectura:int *total; * * I?: Foma una %aria"le ti#o int. * -GF: 6e%uel%e -. si se ha leido correctamente= E00 si hay al(un ,allo. * 3A.E: -"tiene los numeros Hue introduce el usuario y los (uarda * en un array de enteros **********************************************************/ int lectura:%oid; > int continuar @ -.9 int n9 char numeros73A456I389 ,or :n @ 29 n * :int; strlen:numeros;9 nII;

VctorSanchez2
numeros7n8 @ J2J9

http://www.victorsanchez2.com

#rint,:ABn&uantos numeros %a a introducirK 11+ A;9 do > (ets:numeros;9 continuar @ -.9 i, ::num5total @ es5di(ito:numeros;; @@ E00; continuar @ E009 i, :num5total *@ 2; > #rint,:A6e"e introducir un numero #ositi%o.BnA;9 continuar @ E009 C C $hile :continuar L@ -.;9 #rint,:ABnIntrodu ca los numeros: BnA;9 ,or :n @ 29 n * num5total9 nII; > (ets:numeros;9 i, ::enteros7n8 @ es5di(ito:numeros;; @@ E00; > #rint,:AError al leer el numero= #or ,a%or re#ita introduccion.BnA;9 n119 C C return -.9 C /********************************************************* * Euncion: int calcular:int *ma<= int *min= int num5total; * * I?: *ma< y *min Hue acumulan el numero mayor y menor. num5total * acumula la cantidad de numeros Hue se %an a introducir. * -GF: -. si se ha reali ado correctamente o E00 si hay ,allos. * 3A.E: Encuentra el minimo y el ma<imo de los numeros introducidos * **********************************************************/ int calcular:int *ma<= int *min= int total; > int n9 *min @ *ma< @ enteros7289 /* Lo iniciali amos */ ,or :n @ /9 n * total9 nII; > i, :*min + enteros7n8; *min @ enteros7n89 i, :*ma< * enteros7n8; *ma< @ enteros7n89 C return -.9 C /********************************************************* * Euncion: int sacar#antalla:int ma<= int min= int num5total; * * I?: toma el %alor ma<imo=minimo y total de elementos * -GF: de%uelde E00 si no #uede y -. si #uede * 3A.E: ?ada * **********************************************************/ int sacar#antalla:int ma<= int min= int num5total; > int n9 #rint,:ALos numeros introducidos son: A;9

VctorSanchez2
,or :n @ 29 n * num5total9 nII; #rint,:AMd= A= enteros7n8;9 #rint,:ABn3inimo: MdA= min;9 #rint,:ABn3a<imo: MdBnA= ma<;9 return -.9 C

http://www.victorsanchez2.com

/********************************************************* * Euncion: int es5di(ito:char caracter; * * I?: Se le da una serie de caracteres #ara Hue se #asen a numero * -GF: ?os de%ol%era E00 si se #roduce un eroor * 3A.E: &om#rue"a la inte(ridad de los datos * **********************************************************/ int es5di(ito:char caracter78; > int i9 int num @ 29 int ran(o9 /* Si la cadena esta %acia */ i, :caracter728 @@ 2; return E009 i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */ > i @ /9 /* Em#e amos el "ucle #ara %er si es caracter desde el si(uiente caracter */ ran(o @ 59 C else /* 6e"e ser un numero #ositi%o o hay al(un error */ > i @ 29 ran(o @ N9 C /* &om#ro"amos Hue todos los elementos sean di(itos */ /* El mayor numero Hue #ermitimos es OOOO */ i, ::int; strlen:caracter; + ran(o; > #rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9 #rint,:AEs demasiado (rande. Introdu ca numeros entre 1OOOO y OOOOBnA;9 return E009 C ,or :i @ i9 i * :int; strlen:caracter;9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnIntrodu ca unicamente di(itos= #or ,a%or.BnA;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9

VctorSanchez2
C

http://www.victorsanchez2.com

2. Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue lea el conteni"o "e un archivo "e te5to y lo vuel%ue por pantalla7 in"ican"o posteriormente la lon$itu" "e la lnea ms lar$a. El pro$rama "ebe recibir el nombre "el archivo como ar$umento7 no tenien"o %ue intro"ucirse 8ste por pantalla. )ara ello la 6unci#n main "ebe tener el prototipo estn"ar int main(int argc, char *argv[] .
'unciones a utilizar:

fopen: para abrir un archivo. fclose: para cerrar un archivo. fgets: para leer una lnea "e un archivo. strlen: para obtener la lon$itu" "e una ca"ena.

/***************************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Este al(oritmo lee un archi%o introducido #or el usuario * y calcula cual es el numero de caracteres de la linea mayor. *****************************************************************************/ )include *stdio.h+ )include *strin(.h+ )de,ine E00 1/ )de,ine -. / )de,ine 3A456I3 R2 /* 3a<ima lon(itud de la linea */ )de,ine mayor:a=";::a; + :"; K :a;::";; char *,(ets:char *linea= int ma<= EILE * ,#;9 int mayor5linea:%oid;9 int leer5archi%o:char *archi%o78;9 %oid ayuda:%oid;9 EILE * ,#9 int ma< @ 3A456I39 int main:int ar(c= char *ar(%78; > /* 6e"e introducir *nom"re del eSecuta"le+ *nom"re del archi%o+ */ i, :ar(c L@ 2; > ayuda:;9 return E009 C i, :leer5archi%o:Dar(%7/8; @@ E00; return E009 #rint,:ABnLa linea mas lar(a tiene Md caracteres.BnA= mayor5linea:;;9 ,close:,#;9 return -.9 C

VctorSanchez2

http://www.victorsanchez2.com

/***************************************************************************** * Euncion: int leer5archi%o:char *archi%o78; * * I?: ?om"re del archi%o * -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo * 3A.E: Lee un archi%o introducido #or el usuario. * *****************************************************************************/ int leer5archi%o:char *archi%o78; > i, ::,# @ ,o#en:archi%o728= ArA;; @@ ?GLL; > #rint,:AError al intentar a"rir el archi%oBnA;9 return E009 C return -.9 C /***************************************************************************** * Euncion: int mayor5linea:%oid; * * I?: * -GF: Fama(no de la linea de mayor lon(itud del archi%o. * 3A.E: &alcula el tama(no de la linea mas lar(a. * *****************************************************************************/ int mayor5linea:%oid; > char cad73A456I389 int mayor5cad @ 29 /* Iniciali amos el %alor de la cadena */ $hile :L,eo,:,#;; > ,(ets:cad= 3A456I3= ,#;9 mayor5cad @ mayor:mayor5cad= :int; strlen:cad;;9 C return mayor5cad9 C /***************************************************************************** * Euncion: %oid ayuda:%oid; * * I?: * -GF: 3ensaSe de ayuda #ara el usuario. * 3A.E: 3uestra ayuda al usuario #ara Hue introdu ca los datos correctamente. * *****************************************************************************/ %oid ayuda:%oid; > #rint,:ABn6e"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+BnA;9 C

!. El n;mero e ,2.C*.-.../ se pue"e apro5imar me"iante la suma:

VctorSanchez2

http://www.victorsanchez2.com Sumatorio "e */nD "es"e nE+ hasta nEN

En esta e5presi#n la precisi#n %ue"a "etermina"a por el valor N. El valor n! representa el 6actorial "e n ,*F2F...F,n G*/Fn/. Hecor"emos %ue7 por "e6inici#n7 +DE*. Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue permita calcular la apro5imaci#n al n;mero e "a"a por N ,valor pre$unta"o al usuario/. (ebe utilizarse una 6unci#n au5iliar "e prototipo "#$at %act$ria# (int n & "icha 6unci#n "ebe ser una 6unci#n recursiva7 puesto %ue nDEnF,nG*/D.

/********************************************************* * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * * 3A.E: Este #ro(rama reali a la a#ro<imacion al numero e. * Lo hemos reali ado de 2 maneras: * 1 0ecursi%amente. * 1 Eorma mas e,iciente :sin usar recursi%idad;. * * Gn eSem#lo: :introduciendo /2222 terminos; * 1 0ecursi%idad: /2 se(undos a#ro<imadamente * 1 E,icientemente: Se o"tiene el resultado instantaneamente. * **********************************************************/ )include *stdio.h+ )include *strin(.h+ )de,ine -. / )de,ine E00 1/222/ )de,ine ?- 2 )de,ine 3A45FE03 /222222 ,loat n5term9 int e,iciente9 int lectura:int *e,iciente= ,loat *n5term;9 ,loat calcular:,loat n5term;9 int sacar#antalla:,loat numeroe;9 ,loat ,actorial:int n;9 int es5di(ito:char caracter78;9

int main:; > i, :lectura:De,iciente= Dn5term; @@ E00; > #rint,:AError al leer el numero de terminosBnA;9 return E009 C i, :sacar#antalla:calcular:n5term;; @@ E00; > #rint,:AError al sacar #or #antalla/calcular el numeroBnA;9 return E009 C return -.9 C /*********************************************************

VctorSanchez2

http://www.victorsanchez2.com

* Euncion: int sacar#antalla:,loat numeroe; * * I?: Foma la %aria"le numeroe de ti#o ,loat. * -GF: 6e%uel%e -. si lo consi(ue= E00 si hay al(un * 3A.E: Saca #or #antalla el resultado. ?o modi,ica nin(una %aria"le. * **********************************************************/ int sacar#antalla:,loat numeroe; > #rint,:ABnEl %alor de la a#ro<imacion al numero e es: M,BnBnA= numeroe;9 return -.9 C /********************************************************* * Euncion: int lectura:int *e,iciente= ,loat *n5term; * * I?: Foma la direccion de la %aria"le e,iciente= y el numero de tTrminos * -GF: ?os de%uel%e -. si lo consi(ue E00 si hay al(un ,allo. * 3A.E: Se encar(a de leer el numero de terminos a calcular. 3odi,ica * n5term y e,iciente. * **********************************************************/ int lectura:int *e,iciente= ,loat *n5term; > char numero7589 char tem# @ 29 int continuar @ ?-9 do > #rint,:ABnIntrodu ca el numero de terminos a calcular del numero e: A;9 (ets:numero;9 C $hile ::*n5term @ es5di(ito:numero;; @@ E00 PP :*n5term * /;;9 do > #rint,:A6esea usar el modo de calculo ra#idoK 7S=?8:BtA;9 ,,lush:stdin;9 ,,lush:stdout;9 scan,:AMcA= Dtem#;9 ,,lush:stdin;9 i, ::tem# @@ JSJ; PP :tem# @@ J?J; PP :tem# @@ JsJ; PP :tem# @@ JnJ;; > continuar @ -.9 i, ::tem# @@ JSJ; PP :tem# @@ JsJ;; *e,iciente @ -.9 else > *e,iciente @ ?-9 i, :strlen:numero; + N; /* Uermitimos hasta el numero OOOO */ > #rint,:ABnSi desea calcular este numero con recursi%idad #uede ocasionar #ro"lemas.A;9 #rint,:ABnIntentelo con la manera e,iciente.BnA;9 return E009 C C C else > continuar @ ?-9 #rint,:AUor ,a%or introdu ca un %alor %alidoLLL BnA;9 C C $hile :continuar L@ -.;9 return -.9 C

VctorSanchez2

http://www.victorsanchez2.com

/********************************************************* * Euncion: ,loat calcular:,loat terminos; * * I?: ?umero de terminos #ara reali ar la a#ro<imacion. * -GF: La a#ro<imacion al numero e si es correcto o E00 si ha ha"ido un * ,allo. * 3A.E: &alcula la serie: / entre el ,actorial de un numero dado. * **********************************************************/ ,loat calcular:,loat terminos; > ,loat e @ 29 ,loat ,acto @ /9 /* Va a ir acumulando el %alor del ,actorial cuando se haya seleccionado Ae,icienteA */ int n9 i, :e,iciente @@ -.; > #rint,:ABnSe esta calculando el numero e de la manera mas e,iciente.A;9 e @ /9 ,or :n @ /9 n * :int; terminos9 IIn; > ,acto *@ n9 e I@ / / ,acto9 C return e9 C else /* &alculamos la serie usando recursi%idad */ > do > e I@ :/ / ,actorial::int; terminos11;;9 C $hile :terminos +@ 2;9 #rint,:ABnSe esta calculando el numero e usando recursi%idad.A;9 C return e9 C /********************************************************* * Euncion: ,loat ,actorial :int n; * * I?: ?umero de terminos de los Hue se calcularan sucesi%os ,actoriales * -GF: El ,actorial del numero o E00 si ha ha"ido al(un error. * 3A.E: &alcula el ,actorial de un numero dado. * **********************************************************/ ,loat ,actorial:int n; > i, :n @@ 2; return /9 else return :n * ,actorial:n 1 /;;9 C /********************************************************* * Euncion: int es5di(ito:char caracter; * * I?: Se le da una serie de caracteres #ara Hue se #asen a numero * -GF: ?os de%ol%era E00 si se #roduce un eroor * 3A.E: &om#rue"a la inte(ridad de los datos * **********************************************************/ int es5di(ito:char caracter78;

*+

VctorSanchez2
> int i9 int num @ 29 int ran(o9 /* Si la cadena esta %acVa */ i, :caracter728 @@ 2; return E009

http://www.victorsanchez2.com

i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */ > i @ /9 /* Em#e amos el "ucle #ara %er si es caracter desde el si(uiente caracter */ ran(o @ 79 C else /* 6e"e un numero #ositi%o o hay al(un error */ > i @ 29 ran(o @ 79 C /* &om#ro"amos Hue todos los elementos sean di(itos */ /* El mayor numero #ermitido es OOOOOOO */ i, ::int; strlen:caracter; + ran(o; > #rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9 #rint,:AEs demasiado (rande. 0an(o: 1OOOOOOO y OOOOOOOBnA;9 return E009 C ,or :i @ i9 i * :int; strlen:caracter;9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnIntrodu ca unicamente di(itos= #or ,a%or.BnA;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9 C

'. :o"i6icar el pro$rama "el ejercicio * para %ue en lu$ar "e utilizar una tabla esttica utilice una tabla aloca"a "inmicamente. !a tabla "ebe alocarse una vez %ue el usuario ha in"ica"o el n;mero "e elementos y "ebe liberarse al 6inalizar el pro$rama.
'unciones a utilizar:

malloc: para alocar memoria "inmicamente. free: para liberar memoria previamente aloca"a.

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

**

VctorSanchez2

http://www.victorsanchez2.com

* Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * *****************************************************************************/ )include *stdio.h+ )include *alloc.h+ )include *stdli".h+ )include *strin(.h+ )de,ine -. / )de,ine E00 1/222/ )de,ine ?- 2 )de,ine 3A456I3 OOOO int int int int int int int int crearta"la:int **#ta"la= int *numero;9 rellenarta"la:int *ta"la= int numero;9 controldeerrores:int numero;9 calcular:int *ta"la= int numero= int *ma<= int *min;9 mostrar%alores:int *ta"la= int numero= int ma<= int min;9 es5di(ito:char caracter78;9 *ta"la @ ?GLL9 numero= ma<= min9

int main:%oid; > i, :crearta"la:Dta"la= Dnumero; @@ E00; return E009 i, :rellenarta"la:ta"la= numero; @@ E00; return E009 calcular:ta"la= numero= Dma<= Dmin;9 mostrar%alores:ta"la= numero= ma<= min;9 return -.9 C /***************************************************************************** * Euncion: int crearta"la:int **#ta"la= int *numero; * * I?: la direccion de un #untero y la direccion del numero de elementos a * (uardar * -GF: -. si se consi(ue= E00 si se ,alla * 3A.E: &rea una ta"la dinamica de enteros en donde se (uardaran los numeros * introducidos * *****************************************************************************/ int crearta"la:int **#ta"la= int *numero; > int continuar9 char elementos73A456I389 do > continuar @ -.9 #rint,:AUor ,a%or introdu ca el numero de elementos: A;9 (ets:elementos;9 /* Si esta %acio= es ne(ati%o o 2... */ i, :elementos728 @@ 2 PP elementos728 @@ J1J PP elementos728 @@ J2J; continuar @ E009 i, ::*numero @ es5di(ito:elementos;; @@ E00; continuar @ E009 C $hile :continuar L@ -.;9 *#ta"la @ :int *; malloc:*numero * si eo,:int;;9

*2

VctorSanchez2
i, :*#ta"la @@ ?GLL; return E009 return -.9 C

http://www.victorsanchez2.com

/ ****************************************************************************** * Euncion: int rellenarta"la:int *ta"la= int numero; * * I?: la direccion de la ta"la= el numero de enteros a (uardar * -GF: -. si se consi(ue E00 si se ,alla * 3A.E: rellena la ta"la con los numero Hue introdu ca el usuario * *****************************************************************************/ int rellenarta"la:int *ta"la= int numero; > int i= continuar9 char num73A456I389 #rint,:AUor ,a%or introdu ca los numeros: BnA;9 ,or :i @ 29 i * numero9 IIi; > continuar @ -.9 (ets:num;9 i, :num728 @@ 2; > #rint,:A6e"eria introducir al(un di(ito.BnA;9 continuar @ E009 C i, ::*ta"laII @ es5di(ito:num;; @@ E00; > #rint,:AError al leer el numero.BnA;9 continuar @ E009 C i, :continuar @@ E00; i119 C return -.9 C / ****************************************************************************** * Euncion: int calcular:int *ta"la= int numero= int *ma<= int *min; * * I?: La direccion de la ta"la= el numero de elementos= y la direccion del * numero mas (rande y mas #eHueWo * -GF: -. si se consi(ue E00 si ,alla * 3A.E: calcula el numero mas (rande y el mas #eHueWo * *****************************************************************************/ int calcular:int *ta"la= int numero= int *ma<= int *min; > int i9 *ma< @ *min @ ta"la7/89 ,or :i @ 29 i * numero9 iII; > i, :ta"la7i8 + *ma<; *ma< @ ta"la7i89 i, :ta"la7i8 * *min; *min @ ta"la7i89 C

*-

VctorSanchez2
return -.9 C

http://www.victorsanchez2.com

/ ****************************************************************************** * Euncion: int mostrar%alores:int *ta"la= int numero= int ma<= int min; * * I?: La direccion de la ta"la y los %alores del numero ma<imo= minimo y * numero de enteros * -GF: -. si se consi(ue E00 si ,alla * 3A.E: mostrar #or #antalla los %alores * *****************************************************************************/ int mostrar%alores:int *ta"la= int numero= int ma<= int min; > int i9 #rint,:ALos %alores introducidos han sido:BtA;9 ,or :i @ 29 i * numero9 iII; #rint,:AMdBtA= ta"la7i8;9 ,ree:ta"la;9 #rint,:ABnEl %alor ma<imo ha sido:BtMdA= ma<;9 #rint,:ABnEl %alor minimo ha sido:BtMdA= min;9 #rint,:ABnEl numero de terminos introducidos ha sido: MdBtBnA= numero;9 return -.9 C /********************************************************* * Euncion: int es5di(ito:char caracter; * * I?: una cadena de caracters * -GF: el %alor del numero * 3A.E: nada * **********************************************************/ int es5di(ito:char caracter78; > int i9 int num @ 29 int ran(o9 i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */ > i @ /9 /* Em#e amos el "ucle #ara %er si es caracter desde el si(uiente caracter */ ran(o @ 59 C else /* 6e"e un numero #ositi%o o hay al(un error */ > i @ 29 ran(o @ N9 C /* &om#ro"amos Hue todos los elementos sean di(itos */ i, ::int; strlen:caracter; + ran(o; /* El mayor numero Hue #ermitimos es OOOO */ > #rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9 #rint,:AEs demasiado (rande. Introdu ca numeros entre 1OOOO y OOOOBnA;9 return E009 C

*@

VctorSanchez2

http://www.victorsanchez2.com

,or :i @ i9 i * :int; strlen:caracter;9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnIntrodu ca unicamente di(itos= #or ,a%or.BnA;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9 C

PRCTICA 2: ?93EJ>V?S El objetivo "e esta prctica es a6ianzar ciertos conceptos bsicos "e la pro$ramaci#n en len$uaje : Estructuras y tipos "e "atos "e6ini"os. )unteros. 4so "e memoria "inmica. omparaciones entre variables7 ca"enas7 punteros.

1. (e6inir un tipo "e "atos %ue represente a una persona7 sien"o sus campos: el nombre ,char K/7 el apelli"o ,char K/7 el ni6 ,char L*+M/ y la e"a" ,int/. !lamar )EHS?N0 a este tipo "e "atos. Escribir un pro$rama %ue pi"a por pantalla esos "atos y rellene una variable "e tipo )EHS?N0. )restar atenci#n al hecho "e %ue los miembros nombre y apelli"o "eben alocarse "inmicamente7 y liberarse posteriormente. Escribir una 6unci#n au5iliar "e prototipo voi" !iberar)ersona,)EHS?N0/N %ue libere "ichos punteros.
Funciones C a utilizar: typedef : para definir un tipo de datos. gets: para leer una lnea del teclado. malloc y free: para alocar y liberar memoria.

/***************************************************************************** * * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Este #ro(rama #ide los datos #or #antalla de una estructura en la * Hue se (uardaran: nom"re= a#ellido= ni, y edad. El nom"re y el * a#ellido son alocados dinamicamente y #osteriormente li"erados. *

*A

VctorSanchez2

http://www.victorsanchez2.com

*****************************************************************************/ )include *stdio.h+ )include *alloc.h+ )include *stdli".h+ )include *strin(.h+ )de,ine 3A45L-?X5?IE /2 )de,ine 3A4LE? R2 ty#ede, struct > char *nom"re9 char *a#ellido9 char ni,73A45L-?X5?IE89 int edad9 C UE0S-?A9 UE0S-?A #ersona= *#Uersona@?GLL9 ty#ede, enum > -. @ /= E00 @ 2C status9 status %oid status status int status Leer6atos:UE0S-?A *##;9 3ostrar6atos:UE0S-?A *;9 Es6i(ito:char *caracter;9 &adenaVacia:char caracter78;9 UasaAEntero:char caracter78= int ma<imo;9 Li"erarUersona:UE0S-?A *;9

/* Lon(itud ma<ima del ?IE */ /* Lon(itud ma<ima de las cadenas Hue leemos */

int main:%oid; > #Uersona @ D#ersona9 i, :Leer6atos:#Uersona; @@ E00; > Li"erarUersona:#Uersona;9 return E009 C 3ostrar6atos:#Uersona;9 Li"erarUersona:#Uersona;9 return -.9 C /***************************************************************************** * Euncion: status Leer6atos:UE0S-?A *##; * * I?: Uuntero a una estructura de ti#o UE0S-?A. Varia"le: *## * -GF: -. si se leen los datos correctamente= E00 si hay al(un ,allo * 3A.E: Uide los datos de la #ersona al usuario y lo (uarda en la estructura * *****************************************************************************/ status Leer6atos:UE0S-?A *##; > )de,ine L-?X5?IE R /* ?umero de di(itos Hue de"e tener el ?IE */ )de,ine L-?X5&A6E?A Y2 char tem#73A4LE?89 int i9 #rint,:AIntrodu ca los datos de la #ersona:BnA;9 #rint,:ABn?om"re: A;9 (ets:tem#;9 ##1+nom"re @ :char *; malloc::strlen:tem#; I /; * si eo,:char;;9 i, :&adenaVacia:tem#; @@ -.; return E009 else i, :strlen:tem#; + L-?X5&A6E?A; >

*B

VctorSanchez2

http://www.victorsanchez2.com

#rint,:ALa lon(itud de la cadena es demasiado lar(aA;9 return E009 C else strc#y:##1+nom"re= tem#;9 ,,lush:stdout;9 #rint,:AA#ellido: A;9 (ets:tem#;9 ##1+a#ellido @ :char *; malloc::strlen:tem#; I /; * si eo,:char;;9 i, :&adenaVacia:tem#; @@ -.; return E009 else strc#y:##1+a#ellido= tem#;9 ,or :i@29 i*strlen:##1+a#ellido;9 iII; > i, :##1+a#ellido7i8 @@ J J; > #rint,:AIntrodu ca un a#ellido unicamente y no deSe es#acios.A;9 return E009 C C #rint,:A?IE :R di(itos= comience con 2 si es necesario;: A;9 (ets:tem#;9 i, :strlen:tem#; L@ L-?X5?IE; > #rint,:AEl ?IE de"e tener R di(itos.BnA;9 return E009 C i, :Es6i(ito:tem#; @@ -.; > ,or :i@29 i*strlen:tem#;9 iII; ##1+ni,7i8 @ tem#7i89 C else return E009 #rint,:AEdad: A;9 (ets:tem#;9 i, :Es6i(ito:tem#; @@ E00; return E009 ##1+edad@UasaAEntero:tem#= 2;9 i, :##1+edad @@ E00; > #rint,:ABnError al intentar leer la edad.A;9 #rint,:ABnLa edad de"e estar entre / y OO.BnA;9 return E009 C return -.9 C /***************************************************************************** * Euncion: %oid 3ostrar6atos:UE0S-?A *##; * * I?: Uuntero a una estructura de ti#o UE0S-?A * -GF: * 3A.E: 3uestra los datos de la estructura #or #antalla * *****************************************************************************/ %oid 3ostrar6atos:UE0S-?A *##; > #rint,:ABnLos datos o"tenidos son:BnA;9 #rint,:ABn?om"re: MsA= ##1+nom"re;9

*C

VctorSanchez2
#rint,:ABnA#ellido: MsA= ##1+a#ellido;9 #rint,:ABn?IE: MsA= ##1+ni,;9 #rint,:ABnEdad: MdA= ##1+edad;9 C

http://www.victorsanchez2.com

/********************************************************* * Euncion: int Es6i(ito:char *caracter; * * I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un numero * -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si ha ido todo "ien * 3A.E: &om#rue"a la inte(ridad de los datos * **********************************************************/ status Es6i(ito:char *caracter; > int i9 &adenaVacia:caracter;9 ,or :i @ 29 i * :int; strlen:caracter;9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnIntrodu ca unicamente di(itos= #or ,a%or.BnA;9 return E009 C return -.9 C /***************************************************************************** * Euncion: status &adenaVacia:char caracter78; * * I?: Gna cadena de caracteres * -GF: E00 si la cadena no esta %acia= -. si la cadena esta %acia * 3A.E: &om#rue"a si una cadena esta o no %acia * *****************************************************************************/ status &adenaVacia:char caracter78; > i, :caracter728 @@ 2; > #rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosBnA;9 return -.9 C return E009 C /***************************************************************************** * Euncion: int UasaAEntero:char caracter78= int ma<imo; * * I?: cadena de caracteres Hue tenemos Hue #asar a entero y ma<imo de * di(itos #ermitidos. * -GF: El numero #asado a entero o E00 si hay al(un ,allo * 3A.E: Uasa una cadena de caracteres a entero * *****************************************************************************/ int UasaAEntero:char caracter78= int ma<imo; > int num@29 int i9 i, :strlen:caracter; + ma<imo; >

*.

VctorSanchez2
#rint,:ABn6ato erroneo.A;9 return E009 C

http://www.victorsanchez2.com

/* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 /* Lo de%ol%emos #asado a numero */ return num9 C /***************************************************************************** * Euncion: status Li"erarUersona:UE0S-?A *##; * * I?: Uuntero a una estructura de ti#o UE0S-?A * -GF: -. * 3A.E: Li"era la memoria Hue ha"iamos reser%ado #re%iamente * *****************************************************************************/ status Li"erarUersona:UE0S-?A *##; > ,ree:##1+nom"re;9 ,ree:##1+a#ellido;9 return -.9 C

2. Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue lea el conteni"o "e un archivo "e te5to en el %ue ca"a lnea conten$a los "atos %ue "e6inen a una persona7 y rellene "e esa 6orma una tabla "e variables "e tipo )EHS?N0. El pro$rama "ebe recibir el nombre "el archivo como ar$umento7 no tenien"o %ue intro"ucirse 8ste por pantalla. )ara ello la 6unci#n main "ebe tener el prototipo estn"ar int main(int argc, char *argv[] . El pro$rama "ebe comprobar %ue el n;mero "e lneas %ue se van leyen"o no supera la "imensi#n "e la tabla "e6ini"a. 4na vez termina"o "e leer el archivo "ebe imprimirse por pantalla los "atos "e to"as las personas ,una por lnea/7 y liberarse to"a la memoria aloca"a "inmicamente.
'unciones a utilizar:

fopen: para abrir un archivo. fclose: para cerrar un archivo. fgets: para leer una lnea "e un archivo

/***************************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Este #ro(rama lee el contenido de un archi%o de te<to en el Hue cada * linea contiene los datos Hue de,inen a una #ersona y rellena una

*I

VctorSanchez2

http://www.victorsanchez2.com

* ta"la de ti#o UE0S-?A. El nom"re del archi%o se reci"e como * ar(umento. &uando se ha terminado de leer el archi%o se muestran #or * #antalla los datos de las di,erentes #ersonas. * *****************************************************************************/ )include )include )include )include )include *stdio.h+ *stdli".h+ *strin(.h+ *cty#e.h+ *conio.h+

)de,ine 3A45LE? R2 )de,ine 3A45UE0S 222 )de,ine 3A45L-?X5?IE /2 ty#ede, struct > char *nom"re9 char *a#ellido9 char ni,73A45L-?X5?IE89 int edad9 C UE0S-?A9 UE0S-?A #ersona73A45UE0S8= *#Uersona@?GLL9 ty#ede, enum > -. @ /= E00 @ 2C status9 %oid ayuda:%oid;9 status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9 status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;9 status &adenaVacia:char *caracter;9 status Es6i(ito:char *caracter= int lon(itud;9 int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9 %oid 3ostrar6atos:UE0S-?A *##= int linea;9 status Li"erarUersona:UE0S-?A *;9 status Li"erarArray:UE0S-?A *##= int *to#;9 int main:int ar(c= char *ar(%78; > int to#@29 /* ?umero de #ersonas leidas */ clrscr:;9 #Uersona @ #ersona9 /* Uuntero Hue a#unta a una estructura de ti#o UE0S-?A */ /* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */ i, :ar(c L@ 2; > ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */ return E009 C i, :LeerArchi%o:Dar(%7/8= #Uersona= Dto#; @@ E00; > #rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9 return E009 C return -.9 C /***************************************************************************** * Euncion: %oid ayuda:%oid; * * I?: * -GF: 3ensaSe de ayuda #ara el usuario.

2+

VctorSanchez2

http://www.victorsanchez2.com

* 3A.E: 3uestra ayuda al usuario #ara Hue introdu ca los datos * correctamente. * *****************************************************************************/ %oid ayuda:%oid; > #rint,:AGso del #ro(rama: *nom"re del eSecuta"le+ *nom"re del archi%o+A;9 C /***************************************************************************** * Euncion: status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; * * I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y ma<imo * numero de #ersonas. * -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo * 3A.E: Lee un archi%o introducido #or el usuario. * *****************************************************************************/ status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; > EILE *,#9 int inicio@29 /* Uosicion en el array de estructuras */ char cad73A45LE?89 /* &adena con la Hue leemos las lineas del ,ichero */ char nom"re73A45LE?89 char a#ellido73A45LE?89 char ni,73A45LE?89 char edad73A45LE?89 i, :L:,# @ ,o#en:archi%o728= ArA;;; > #rint,:ABnError al intentar a"rir el archi%oBnA;9 return E009 C $hile :L,eo,:,#;; > i, :*#Fo# @@ 3A45UE0S; /* Si se %a a su#erar la dimension de la ta"la de,inida*/ > #rint,:ABnBnSe ha so"re#asado el limite de UE0S-?AS.BnA;9 return E009 C ##@D#ersona7inicio89 ,(ets:cad= 3A45LE?= ,#;9 i, :cad728@@JBnJ; > #rint,:ABnBn?o #uede deSar lineas en "lanco.A;9 return E009 C sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9 i,:&ontrolErrores:nom"re= a#ellido= ni,= edad; @@ E00; > #rint,:ABnZa ocurrido un error al leer los datos.BnA;9 return E009 C /* 0eser%amos memoria y asi(namos los %alores */ ##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * si eo,:char;;9 strc#y:##1+nom"re= nom"re;9 ##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * si eo,:char;;9 strc#y:##1+a#ellido= a#ellido;9 strc#y:##1+ni,= ni,;9 i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */

2*

VctorSanchez2
> ##1+edad @ UasaAEntero:edad= 2= ##;9 i, :##1+edad @@ E00; return E009

http://www.victorsanchez2.com

3ostrar6atos:##= inicio;9 inicioII9 /* Uasamos a la si(uiente estructura de ti#o UE0S-?A */ :*#Fo#;II9 C C i, :Li"erarArray:##= #Fo#; @@ E00; return E009 ,close:,#;9 return -.9 C /***************************************************************************** * Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= * char *#Edad; * * I?: ?om"re= A#ellido= ?IE y Edad como cadena de caracteres * -GF: -. si las cadenas no contienen ,allos= E00 si e<iste al(un error * 3A.E: &heHuea Hue las cadenas no conten(an datos no #ermitidos. * *****************************************************************************/ status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad; > )de,ine L-?X5?IE R /*Gnico %alor #ermitido #ara el numero de di(itos del ?IE */ )de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */ int i9 i, :strlen:#?om"re; + 3A45L-?X56AF-S; > #rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#A#ellido; + 3A45L-?X56AF-S; > #rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#?i,; L@ L-?X5?IE; > #rint,:ABnBnEl ?IE de"e tener R di(itos.A;9 return E009 C i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00; > #rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9 return E009 C i, :*#Edad @@ J2J; > #rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9 return E009 C ,or :i@29 i*strlen:#Edad;9 iII; > i, :Lisdi(it:#Edad7i8;;

22

VctorSanchez2
>

http://www.victorsanchez2.com

#rint,:ABnBnSe reali o una o#eracion no %alida mientras se leia el archi%o.BnA;9 return E009 C C return -.9 C /***************************************************************************** * Euncion: status &adenaVacia:char *caracter; * * I?: Gna cadena de caracteres * -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento * 3A.E: &om#rue"a si la cadena esta %acia * *****************************************************************************/ status &adenaVacia:char *caracter; > i, :caracter728 @@ 2; > #rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9 return -.9 C return E009 C /********************************************************* * Euncion: status Es6i(ito:char *caracter= int lon(itud; * * I?: Se le da una serie de caracteres #ara Hue com#rue"e si es un numero * -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto * 3A.E: &om#rue"a la inte(ridad de los datos * **********************************************************/ status Es6i(ito:char *caracter= int lon(itud; > int i@29 i, :&adenaVacia:caracter; @@ -.; return E009 /* &om#ro"amos Hue todos los elementos sean di(itos */ ,or :i @ i9 i * lon(itud9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnBnIntrodu ca unicamente di(itos= #or ,a%or.A;9 return E009 C return -.9 C /***************************************************************************** * Euncion: int UasaAEntero:char *caracter= int ma<imo; * * I?: &adena de caracteres Hue tenemos Hue #asar a entero y ma<imo de * di(itos #ermitidos. * -GF: El numero #asado a entero o E00 si hay al(un ,allo. * 3A.E: Uasa una cadena de caracteres a entero. * *****************************************************************************/ int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos; > int num@29

2-

VctorSanchez2
int i9

http://www.victorsanchez2.com

i, :strlen:caracter; + ma<imo; > #rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9 C /***************************************************************************** * Euncion: %oid 3ostrar6atos:UE0S-?A *##= int linea; * * I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en Hue de"emos * ir escri"iendo. * -GF: * 3A.E: 3uestra #or #antalla los datos de la estructura. * *****************************************************************************/ %oid 3ostrar6atos:UE0S-?A *##= int linea; > (oto<y: 3=lineaI/;9 (oto<y:32=lineaI/;9 (oto<y:52=lineaI/;9 (oto<y:72=lineaI/;9 C /***************************************************************************** * Euncion: int Li"erarUersona:UE0S-?A *##; * * I?: Uuntero a una estructura de ti#o UE0S-?A. * -GF: -. si se li"eran correctamente= E00 si hay al(un error. * 3A.E: Li"era la memoria Hue reser%amos anteriormente. * *****************************************************************************/ status Li"erarUersona:UE0S-?A *##; > i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */ > #rint,:ABnBnError al li"erar el #unteroA;9 return E009 C else > ,ree:##1+nom"re;9 ,ree:##1+a#ellido;9 C return -.9 C /***************************************************************************** * Euncion: int Li"erarArray:UE0S-?A *##= int *#Fo#; * * I?: Uuntero a una estructura de ti#o UE0S-?A y el numero de elementos. * -GF: -. * 3A.E: Li"era cada #arte de la estructura Hue le #asamos. #rint,:AGSGA0I-: MsA= ##1+nom"re;9 #rint,:AMsA= ##1+a#ellido;9 #rint,:A?IE: MsA= ##1+ni,;9 #rint,:AE6A6: MdA= ##1+edad;9

2@

VctorSanchez2

http://www.victorsanchez2.com

* *****************************************************************************/ status Li"erarArray:UE0S-?A *##= int *#Fo#; > int i9 ,or :i @ 29 i * *#Fo#9 iII; > Li"erarUersona:11##;9 C return -.9 C

!. :o"i6icar la "e6inici#n "el tipo )EHS?N0 "e 6orma tal %ue se aOa"a un campo %ue sea un puntero a otra persona7 %ue llamaremos el Pami$oP. ?bservar %ue para eso "ebe utilizarse la sentencia (tr)ct y no el tipo "e6ini"o. :o"i6icar el pro$rama "el ejercicio 2 para %ue "e manera aleatoria se asi$ne a ca"a una "e las personas "e la tabla un amigo7 y %ue este se imprima tambi8n por pantalla ,es "ecir al imprimir los "atos "e una persona se imprime tambi8n el nombre y apelli"o "e su amigo/. 4na vez termina"o este pro$rama mo"i6icarlo para %ue antes "e imprimir los "atos por pantalla libere la memoria "e la se$un"a mita" "e las personas ,por ejemplo7 "el A al I si 6uesen *+ en total/ e imprima solo los "atos "e la primera mita" ,en el ejemplo sera "el + al @/. E5plicar lo %ue ocurre.
'unciones a utilizar: rand: para $eneraci#n "e n;meros aleatorios.
/***************************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Uro(rama Hue asi(na de manera aleatoria un ami(o a cada una de las * #ersonas de la ta"la y lo im#rime #or #antalla. Gna %e reli ado * li"era la memoria de la se(unda mitad de las #ersonas e im#rime * unicamente los datos de la #rimera mitad. * *****************************************************************************/ )include )include )include )include )include )include *stdio.h+ *stdli".h+ *strin(.h+ *cty#e.h+ *conio.h+ *time.h+

)de,ine 3A45L-?X5?IE /2 )de,ine 3A45LE? 25Y )de,ine 3A45UE0S 222 struct #erson > char *nom"re9 char *a#ellido9 char ni,73A45L-?X5?IE89 int edad9 struct #erson *ami(o9 C9 ty#ede, struct #erson UE0S-?A9 UE0S-?A #ersona73A45UE0S8= *#Uersona9 int to#9 ty#ede, enum > -. @ /= E00 @ 2C status9

2A

VctorSanchez2

http://www.victorsanchez2.com

%oid status status status status status int %oid %oid status status

ayuda:%oid;9 LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9 Asi(narAmi(os:UE0S-?A *##= int *to#;9 &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;9 &adenaVacia:char *caracter;9 Es6i(ito:char *caracter= int lon(itud;9 UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9 3ostrarUersona:UE0S-?A *##= int *linea;9 3ostrarAmi(o:UE0S-?A *##= int *linea;9 AsesinarUersonas:UE0S-?A *##= int *to#;9 Li"erarUersona:UE0S-?A *;9

int main:int ar(c= char *ar(%78; > int to# @ 29 /* ?umero de #ersonas en el archi%o */ int line/ @ /9 int line2 @ 29 int i9 clrscr:;9 #Uersona @ #ersona9 /* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */ i, :ar(c L@ 2; > ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */ return E009 C i, :LeerArchi%o:Dar(%7/8= #Uersona= Dto#; @@ E00; > #rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9 return E009 C i, :Asi(narAmi(os:#ersona= Dto#; L@ -.; return E009 #Uersona @ D#ersona7to#/289 i, :AsesinarUersonas:#Uersona= Dto#; @@ E00; > #rint,:ABnError al asesinar a las #ersonas.A;9 return E009 C #rint,:ABnBnLa mitad de las #ersonas han sido li"eradas= #ulse #ara continuar.BnA;9 (etch:;9 clrscr:;9 ,or :i@29 i*to#9 iII; > #Uersona @ D#ersona7i89 3ostrarUersona:#Uersona= Dline/;9 3ostrarAmi(o:#Uersona= Dline2;9 C return -.9 C /***************************************************************************** * Euncion: %oid ayuda:; * * I?: * -GF: 3ensaSe de ayuda #ara el usuario.

2B

VctorSanchez2

http://www.victorsanchez2.com

* 3A.E: 3uestra ayuda #ara Hue se introdu cna los datos correctamente. * *****************************************************************************/ %oid ayuda:; > #rint,:AGso: *nom"re del eSecuta"le+ *nom"re del archi%o de te<to+BnA;9 C /***************************************************************************** * Euncion: int LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; * * I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y numero * de #ersonas Hue hay. * -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo. * 3A.E: Lee un archi%o introducido #or el usuario y (uarda los datos en una * estructura de ti#o UE0S-?A. * *****************************************************************************/ status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; > EILE *,#9 int inicio@29 /* Uosicion en el array de estructuras */ int linea @ /9 /* ?os %a a ser%ir #ara mo%ernos #or la #antalla */ char cad73A45LE?89 char nom"re73A45LE?89 char a#ellido73A45LE?89 char ni,73A45LE?89 char edad73A45LE?89 i, :L:,# @ ,o#en:archi%o728= ArA;;; > #rint,:ABnError al intentar a"rir el archi%oBnA;9 return E009 C $hile :L,eo,:,#;; > i, :*#Fo# @@ 3A45UE0S; /* Si se %a a su#erar la dimension de la ta"la de,inida*/ > #rint,:ABnBnSe so"re#aso el limite de UE0S-?AS.BnA;9 return E009 C ##@D#ersona7inicio89 ,(ets:cad= 3A45LE?= ,#;9 i, :cad728@@JBnJ; > #rint,:ABnBn?o #uede deSar lineas en "lanco.A;9 return E009 C sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9 i,:&ontrolErrores:nom"re= a#ellido= ni,= edad; @@ E00; > #rint,:ABnZa ocurrido un error al leer los datos.BnA;9 return E009 C /* 0eser%amos memoria y asi(namos los %alores */ ##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * si eo,:char;;9 strc#y:##1+nom"re= nom"re;9 ##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * si eo,:char;;9 strc#y:##1+a#ellido= a#ellido;9 strc#y:##1+ni,= ni,;9

2C

VctorSanchez2

http://www.victorsanchez2.com

i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */ > ##1+edad @ UasaAEntero:edad= 2= ##;9 i, :##1+edad @@ E00; return E009 3ostrarUersona:##= Dlinea;9 /* Uasaremos a la si(uiente estructura de ti#o UE0S-?A */ inicioII9 :*#Fo#;II9 C C ,close:,#;9 return -.9 C /***************************************************************************** * Euncion: status Asi(narAmi(os:UE0S-?A *##= int *to#; * * I?: Uuntero a una estructura y el numero de #ersonas. * -GF: -. * 3A.E: Asi(na una estructura llamada Aami(oA a cada #ersona. * *****************************************************************************/ status Asi(narAmi(os:UE0S-?A *##= int *to#; > int i9 int aleat9 /* ?umero aleatorio */ int linea @ 29 srand::unsi(ned int; time::time5t *;?GLL;;9 ,or :i @ 29 i L@ *to#9 iII; > aleat @ rand:; M :*to#;9 ##@D#ersona7i89 i, :i L@ aleat; /* Gna #ersona no #uede ser su #ro#io ami(o*/ > ##1+ami(o @ D#ersona7aleat89 3ostrarAmi(o:##= Dlinea;9 C else i119 C return -.9 C /***************************************************************************** * Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= * char *#Edad; * * I?: ?om"re= a#ellido= ?IE y edad de la #ersona Hue hemos leido. * -GF: -. si los datos no contienen ,allos= E00 si se han encontrado * errores. * 3A.E: &heHuea Hue los datos leidos no conten(an errores. * *****************************************************************************/ status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad; > )de,ine L-?X5?IE R /* Gnico %alor #ermitido #ara el numero de di(itos del ?IE */ )de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */ int i9 i, :strlen:#?om"re; + 3A45L-?X56AF-S; >

2.

VctorSanchez2

http://www.victorsanchez2.com

#rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#A#ellido; + 3A45L-?X56AF-S; > #rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#?i,; L@ L-?X5?IE; > #rint,:ABnBnEl ?IE de"e tener R di(itos.A;9 return E009 C i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00; > #rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9 return E009 C i, :*#Edad @@ J2J; > #rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9 return E009 C ,or :i@29 i*strlen:#Edad;9 iII; > i, :Lisdi(it:#Edad7i8;; > #rint,:ABnBnSe reali o una o#eracion no %alida mientras se leia el archi%o.BnA;9 return E009 C C return -.9 C /***************************************************************************** * Euncion: int &adenaVacia:char *caracter; * * I?: Gna cadena de caracteres. * -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento. * 3A.E: &heHuea si la cadena introducida esta %acia. * *****************************************************************************/ status &adenaVacia:char *caracter; > i, :caracter728 @@ 2; > #rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9 return -.9 C return E009 C /********************************************************* * Euncion: status Es6i(ito:char *caracter= int lon(itud; * * I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un * numero. * -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto.

2I

VctorSanchez2

http://www.victorsanchez2.com

* 3A.E: &om#rue"a la inte(ridad de los datos. * **********************************************************/ status Es6i(ito:char *caracter= int lon(itud; > int i@29 i, :&adenaVacia:caracter; @@ -.; return E009 /* &om#ro"amos Hue todos los elementos sean di(itos */ ,or :i @ i9 i * lon(itud9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnBnIntrodu ca unicamente di(itos= #or ,a%or.A;9 return E009 C return -.9 C /***************************************************************************** * Euncion: int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos; * * I?: Gna cadena de caracteres= el ma<imo de di(itos #ermitidos y un #untero * a una estructura de ti#o UE0S-?A. * -GF: El numero con%ertido a entero o E00 si hay al(un ,allo. * 3A.E: Uasa una cadena de caracteres a entero. * *****************************************************************************/ int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos; > int num@29 int i9 i, :strlen:caracter; + ma<imo; > #rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9 C /***************************************************************************** * Euncion: %oid 3ostrar6atos:UE0S-?A *##= int *linea; * * I?: Gn #untero a una estructura y la linea donde escri"iremos en #antalla. * -GF: * 3A.E: 3uestra #or #antalla los datos de la estructura. * *****************************************************************************/ %oid 3ostrarUersona:UE0S-?A *##= int *linea; > (oto<y: 3= (oto<y:32= (oto<y:52= (oto<y:72= *linea;9 *linea;9 *linea;9 *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9 #rint,:AMsA= ##1+a#ellido;9 #rint,:A?IE: MsA= ##1+ni,;9 #rint,:AE6A6: MdA= ##1+edad;9

-+

VctorSanchez2
*linea I@ 29 C

http://www.victorsanchez2.com

/***************************************************************************** * Euncion: %oid 3ostrarAmi(o:UE0S-?A *##= int *linea; * * I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en la Hue %amos * a escri"ir en la #antalla. * -GF: * 3A.E: 3uestra #or #antalla los datos del ami(o. * *****************************************************************************/ %oid 3ostrarAmi(o:UE0S-?A *##= int *linea; > (oto<y: 3= *linea;9 #rint,:AA3IX-: MsA= ##1+ami(o1+nom"re;9 (oto<y:32= *linea;9 #rint,:AMsA= ##1+ami(o1+a#ellido;9 *linea I@ 29 C /***************************************************************************** * Euncion: int Li"erarUersona:UE0S-?A *##; * * I?: Uuntero a la estructura. * -GF: -. si todo es correcto= E00 si ha ocurrido al(un error. * 3A.E: Li"era el nom"re y a#ellido de la estructura introducida. * *****************************************************************************/ status Li"erarUersona:UE0S-?A *##; > i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */ > #rint,:ABnBnError al li"erar el #unteroA;9 return E009 C else > ,ree:##1+nom"re;9 ,ree:##1+a#ellido;9 C return -.9 C /***************************************************************************** * Euncion: status AsesinarUersonas:UE0S-?A *##= int *to#; * * I?: Uuntero a una estructura y el numero de #ersonas. * -GF: -. * 3A.E: Li"era las #ersonas Hue estan desde la mitad hasta el ,inal. * *****************************************************************************/ status AsesinarUersonas:UE0S-?A *##= int *to#; > int i9 ,or :i @ :*to#/2;9 i * *to#9 iII; Li"erarUersona:##II;9 *to#@::int;*to#;/29 return -.9 C

'.

-*

VctorSanchez2

http://www.victorsanchez2.com

:o"i6icar el pro$rama "el ejercicio - para %ue una vez %ue ha le"o to"os los "atos7 bus%ue me"iante un bucle si hay "os personas %ue ten$an la misma e"a". Hepetir lo mismo para buscar si hay "os personas con el mismo nombre7 apelli"o o ni6. Hepetir lo mismo para buscar si hay "os personas %ue tienen el mismo amigo.
'unciones a utilizar: strcmp: para comparar "os ca"enas "e caracteres.

/***************************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Uro(rama Hue asi(na de manera aleatoria un ami(o a cada una de las * #ersonas de la ta"la y lo im#rime #or #antalla. Gna %e reli ado * esto li"era la memoria de la se(unda mitad de las #ersonas e im#rime * unicamente los datos de la #rimera mitad. * *****************************************************************************/ )include )include )include )include )include )include *stdio.h+ *stdli".h+ *strin(.h+ *cty#e.h+ *conio.h+ *time.h+

)de,ine 3A45L-?X5?IE /2 )de,ine 3A45LE? 25Y )de,ine 3A45UE0S 222 struct #erson > char *nom"re9 char *a#ellido9 char ni,73A45L-?X5?IE89 int edad9 struct #erson *ami(o9 C9 ty#ede, struct #erson UE0S-?A9 UE0S-?A #ersona73A45UE0S8= *#Uersona9 int to#9 ty#ede, enum > -. @ /= E00 @ 2C status9 %oid status status status status status int %oid %oid status status status ayuda:%oid;9 LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9 Asi(narAmi(os:UE0S-?A *##= int *to#;9 &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;9 &adenaVacia:char *caracter;9 Es6i(ito:char *caracter= int lon(itud;9 UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9 3ostrarUersona:UE0S-?A *##= int *linea;9 3ostrarAmi(o:UE0S-?A *##= int *linea;9 Li"erarArray:UE0S-?A *##= int to#;9 Li"erarUersona:UE0S-?A *;9 &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#;9

int main:int ar(c= char *ar(%78; > int to# @ 29 /* ?umero de #ersonas en el archi%o */ int line/ @ /9 int line2 @ 29 int i9 clrscr:;9

-2

VctorSanchez2
#Uersona @ #ersona9

http://www.victorsanchez2.com

/* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */ i, :ar(c L@ 2; > ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */ return E009 C i, :LLeerArchi%o:Dar(%7/8= #Uersona= Dto#;; > #rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9 return E009 C i, :Asi(narAmi(os:#ersona= Dto#; L@ -.; return E009 ,or :i@29 i*to#9 iII; > #Uersona @ D#ersona7i89 3ostrarUersona:#Uersona= Dline/;9 3ostrarAmi(o:#Uersona= Dline2;9 C i, :L&om#ararUersonas:#ersona= to#;; return E009 #Uersona @ D#ersona7to#89 i, :Li"erarArray:#Uersona= to#; L@ -.; return E009 return -.9 C /***************************************************************************** * Euncion: %oid ayuda:; * * I?: * -GF: 3ensaSe de ayuda #ara el usuario. * 3A.E: 3uestra ayuda al usuario #ara Hue introdu ca los datos * correctamente. * *****************************************************************************/ %oid ayuda:; > #rint,:AGso: *nom"re del eSecuta"le+ *nom"re del archi%o de te<to+BnA;9 C /***************************************************************************** * Euncion: int LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; * * I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y numero * de #ersonas Hue hay. * -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo. * 3A.E: Lee un archi%o introducido #or el usuario y (uarda los datos en una * estructura de ti#o UE0S-?A. * *****************************************************************************/ status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#; > EILE *,#9 int inicio@29 /* Uosicion en el array de estructuras */ int linea @ /9 /* ?os %a a ser%ir #ara mo%ernos #or la #antalla */ char cad73A45LE?89 char nom"re73A45LE?89

--

VctorSanchez2
char a#ellido73A45LE?89 char ni,73A45LE?89 char edad73A45LE?89

http://www.victorsanchez2.com

i, :L:,# @ ,o#en:archi%o728= ArA;;; > #rint,:ABnError al intentar a"rir el archi%oBnA;9 return E009 C $hile :L,eo,:,#;; > i, :*#Fo# @@ 3A45UE0S; /* Si se %a a su#erar la dimension de la ta"la de,inida*/ > #rint,:ABnBnSe so"re#aso el limite de UE0S-?AS.BnA;9 return E009 C ##@D#ersona7inicio89 ,(ets:cad= 3A45LE?= ,#;9 i, :cad728@@JBnJ; > #rint,:ABnBn?o #uede deSar lineas en "lanco.A;9 return E009 C sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9 i,:L&ontrolErrores:nom"re= a#ellido= ni,= edad;; > #rint,:ABnZa ocurrido un error al leer los datos.BnA;9 return E009 C /* 0eser%amos memoria y asi(namos los %alores */ ##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * si eo,:char;;9 strc#y:##1+nom"re= nom"re;9 ##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * si eo,:char;;9 strc#y:##1+a#ellido= a#ellido;9 strc#y:##1+ni,= ni,;9 i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */ > ##1+edad @ UasaAEntero:edad= 2= ##;9 i, :##1+edad @@ E00; return E009 3ostrarUersona:##= Dlinea;9 /* Uasaremos a la si(uiente estructura de ti#o UE0S-?A */ inicioII9 :*#Fo#;II9 C C ,close:,#;9 return -.9 C /***************************************************************************** * Euncion: status Asi(narAmi(os:UE0S-?A *##= int *to#; * * I?: Uuntero a una estructura y el numero de #ersonas. * -GF: -. * 3A.E: Asi(na una estructura llamada Aami(oA a cada #ersona. * *****************************************************************************/ status Asi(narAmi(os:UE0S-?A *##= int *to#;

-@

VctorSanchez2
> int i9 int aleat9 /* ?umero aleatorio */ int linea @ 29

http://www.victorsanchez2.com

srand::unsi(ned int; time::time5t *;?GLL;;9 ,or :i @ 29 i L@ *to#9 iII; > aleat @ rand:; M :*to#;9 ##@D#ersona7i89 i, :i L@ aleat; /* Gna #ersona no #uede ser su #ro#io ami(o*/ > ##1+ami(o @ D#ersona7aleat89 3ostrarAmi(o:##= Dlinea;9 C else i119 C return -.9 C /***************************************************************************** * Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad; * * I?: ?om"re= a#ellido= ?IE y edad de la #ersona Hue hemos leido. * -GF: -. si los datos no contienen ,allos= E00 si se han encontrado errores. * 3A.E: &heHuea Hue los datos leidos no conten(an errores. * *****************************************************************************/ status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad; > )de,ine L-?X5?IE R /* Gnico %alor #ermitido #ara el numero de di(itos del ?IE */ )de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */ int i9 i, :strlen:#?om"re; + 3A45L-?X56AF-S; > #rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#A#ellido; + 3A45L-?X56AF-S; > #rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado (rande.A;9 return E009 C i, :strlen:#?i,; L@ L-?X5?IE; > #rint,:ABnBnEl ?IE de"e tener R di(itos.A;9 return E009 C i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00; > #rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9 return E009 C i, :*#Edad @@ J2J; >

-A

VctorSanchez2

http://www.victorsanchez2.com

#rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9 return E009 C ,or :i@29 i*strlen:#Edad;9 iII; > i, :Lisdi(it:#Edad7i8;; > #rint,:ABnBnSe reali o una o#eracion no %alida mientras se leia el archi%o.BnA;9 return E009 C C return -.9 C /***************************************************************************** * Euncion: int &adenaVacia:char *caracter; * * I?: Gna cadena de caracteres. * -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento. * 3A.E: &heHuea si la cadena introducida esta %acia. * *****************************************************************************/ status &adenaVacia:char *caracter; > i, :caracter728 @@ 2; > #rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9 return -.9 C return E009 C /********************************************************* * Euncion: status Es6i(ito:char *caracter= int lon(itud; * * I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un * numero. * -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto. * 3A.E: &om#rue"a la inte(ridad de los datos. * **********************************************************/ status Es6i(ito:char *caracter= int lon(itud; > int i@29 i, :&adenaVacia:caracter; @@ -.; return E009 /* &om#ro"amos Hue todos los elementos sean di(itos */ ,or :i @ i9 i * lon(itud9 iII; i, :caracter7i8 * J2J PP caracter7i8 + JOJ; > #rint,:ABnBnIntrodu ca unicamente di(itos= #or ,a%or.A;9 return E009 C return -.9 C /***************************************************************************** * Euncion: int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos; * * I?: Gna cadena de caracteres= el ma<imo de di(itos #ermitidos y un #untero * a una estructura de ti#o UE0S-?A.

-B

VctorSanchez2

http://www.victorsanchez2.com

* -GF: El numero con%ertido a entero o E00 si hay al(un ,allo. * 3A.E: Uasa una cadena de caracteres a entero. * *****************************************************************************/ int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos; > int num@29 int i9 i, :strlen:caracter; + ma<imo; > #rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9 return E009 C /* Si solo se ha introducido un caracter */ i, :strlen:caracter; @@ /; return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */ /* Si hay mas de un caracter */ ,or :i @ 29 i L@ :int; strlen:caracter;9 iII; num @ :num * /2; I :caracter7i8 1 J2J;9 return num9 C /***************************************************************************** * Euncion: %oid 3ostrar6atos:UE0S-?A *##= int *linea; * * I?: Gn #untero a una estructura y la linea donde escri"iremos en #antalla. * -GF: * 3A.E: 3uestra #or #antalla los datos de la estructura. * *****************************************************************************/ %oid 3ostrarUersona:UE0S-?A *##= int *linea; > (oto<y: 3= (oto<y:32= (oto<y:52= (oto<y:72= C /***************************************************************************** * Euncion: %oid 3ostrarAmi(o:UE0S-?A *##= int *linea; * * I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en la Hue %amos * a escri"ir en la #antalla. * -GF: * 3A.E: 3uestra #or #antalla los datos del ami(o. * *****************************************************************************/ %oid 3ostrarAmi(o:UE0S-?A *##= int *linea; > (oto<y: 3= *linea;9 #rint,:AA3IX-: MsA= ##1+ami(o1+nom"re;9 (oto<y:32= *linea;9 #rint,:AMsA= ##1+ami(o1+a#ellido;9 *linea I@ 29 C /***************************************************************************** * Euncion: int Li"erarUersona:UE0S-?A *##; * * I?: Uuntero a la estructura. * -GF: -. si todo es correcto= E00 si ha ocurrido al(un error. *linea;9 *linea;9 *linea;9 *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9 #rint,:AMsA= ##1+a#ellido;9 #rint,:A?IE: MsA= ##1+ni,;9 #rint,:AE6A6: MdA= ##1+edad;9

*linea I@ 29

-C

VctorSanchez2

http://www.victorsanchez2.com

* 3A.E: Li"era el nom"re y a#ellido de la estructura introducida. * *****************************************************************************/ status Li"erarUersona:UE0S-?A *##; > i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */ > #rint,:ABn.A;9 return E009 C else > ,ree:##1+nom"re;9 ,ree:##1+a#ellido;9 C return -.9 C /***************************************************************************** * Euncion: int Li"erarArray:UE0S-?A *##; * * I?: Uuntero a una estructura de ti#o UE0S-?A. * -GF: -. * 3A.E: Li"era el array de estructuras. * *****************************************************************************/ status Li"erarArray:UE0S-?A *##= int to#; > int i9 ,or :i @ 29 i * to#9 iII; > Li"erarUersona:11##;9 C return -.9 C /***************************************************************************** * Euncion: status &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#; * * I?: Estructura con un tamaWo 73A45UE0S8= y el numero de #ersonas * -GF: -. * 3A.E: 3uestra #or #antalla las similitudes entre las #ersonas. * *****************************************************************************/ status &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#; > int i= S9 #rint,:ABnBnVamos a %er las com#araciones. Uulse una tecla.A;9 (etch:;9 clrscr:;9 #rint,:ABnBnB A;9 ,or :i@29 i*to#9 iII; > ,or:S@iI/9 S*to#9 SII; > i, :iL@S; > i, :#7i8.edad @@ #7S8.edad; > #rint,:ABn3isma edad:Md;: MsA= #7i8.edad= #7i8.nom"re;9 #rint,:ABn MsA= #7S8.nom"re;9 C i, :Lstrcm#:#7i8.nom"re= #7S8.nom"re;; > #rint,:ABn3ismo nom"re:Ms;: MsA= #7i8.nom"re= #7i8.a#ellido;9 #rint,:ABn MsA= #7S8.a#ellido;9

-.

VctorSanchez2

http://www.victorsanchez2.com

C i, :Lstrcm#:#7i8.a#ellido= #7S8.a#ellido;; > #rint,:ABn3ismo a#ellido :Ms;: MsA= #7i8.a#ellido= #7i8.nom"re;9 #rint,:ABn MsA= #7S8.nom"re;9 C i, :Lstrcm#:#7i8.ni,= #7S8.ni,;; > #rint,:ABn3ismo ?IE :Ms;: MsA= #7i8.ni,= #7i8.nom"re;9 #rint,:ABn MsA= #7S8.nom"re;9 C i, :#7i8.ami(o @@ #7S8.ami(o; > #rint,:ABn3ismo Ami(o: MsA= #7i8.ami(o1+nom"re;9 #rint,:ABn MsA= #7i8.nom"re;9 #rint,:ABn MsA= #7S8.nom"re;9 C C C C #rint,:ABnA;9 return -.9 C

PRCTICA !
O*JETI+OS

El objetivo "e esta prctica es implementar el tipo abstracto "e "atos ,J0(/ )>!0 y realizar un ejercicio "e aplicaci#n "e "icho tipo "e "atos. El ejercicio consistir en pro$ramar la resoluci#n "e laberintos: "a"o %ue el al$oritmo bsico para resolver un laberinto consiste en ir proban"o movimientos y volver atrs cuan"o ya no hay sali"a "esan"an"o el ;ltimo movimiento7 se presta a la utilizaci#n "e una pila ya %ue lo %ue hay %ue hacer es ir almacenan"o los movimientos %ue se han e6ectua"o e irlos recuperan"o en or"en inverso7 es "ecir si$uien"o el or"en !>'? ,!ast >n 'irst ?ut/. !a implementaci#n "el tipo "e "ato ser una implementaci#n $en8rica7 es "ecir no "epen"iente "el tipo "e elemento %ue se va a $uar"ar en la pila. Se va a utilizar el tipo "e pila esttica. Esto %uiere "ecir %ue el espacio %ue reserva el "ato para almacenar los elementos es "e un tamaOo "a"o %ue no se mo"i6ica posteriormente. Notemos %ue esto no %uiere "ecir %ue "icho espacio no pue"a reservarse "inmicamente ,me"iante malloc/7 sino %ue es un tamaOo %ue una vez aloca"o no se mo"i6ica ,y la pila "evuelve error si se intenta rebasar "icho tamaOo/. Si bien se incluyen en la prctica un par "e ejercicios au5iliares para comprobar la implementaci#n "el tipo "e "atos )>!07 la cali6icaci#n "e la prctica estar basa"a principalmente en el ejercicio n;mero @.
EJERCICIOS 1.

>mplementar las 6unciones bsicas "el J0( )>!0. (ichas 6unciones estn "e6ini"as en el archivo ,i#a.h %ue se a"junta7 y son las si$uientes:
reserva memoria para el array de datos de la pila, devuelve error si no ha conseguido alocar memoria.
ESTADO InicializaPila(PILA *pila): BOOLEANO PilaVacia(PILA pila):

indica si la pila est o no vaca.

-I

VctorSanchez2
BOOLEANO PilaLlena(PILA pila):

http://www.victorsanchez2.com
indica si la pila est o no llena.

a!"): introduce un elemento en la pila, devuelve error si no ha sido posible (la pila est llena). ESTADO Push(PILA *pila, TIPO_INFO_PILA ESTADO P"p(PILA *pila, TIPO_INFO_PILA * a!"):

saca un elemento de la pila, devuelve

error si no ha sido posible (la pila est vaca).


#"i Li$e%aPila(PILA *pila):

libera la memoria alocada para el array interno de datos

de la pila.

En "icho archivo se "e6inen tanto los tipos "e "atos )>!07 J>)?=>N'?=)>!07 ESJ0(? y 9??!E0N?. El tipo "e "atos J>)?=>N'?=)>!0 se "e6ine inicialmente como char7 es "ecir los elementos "e la pila en esta primera implementaci#n sern caracteres. !a implementaci#n "e las 6unciones "el J0( )>!0 "ebe realizarse en un archivo "e nombre ,i#a.c.
2.

Escribir un pro$rama "e prueba para comprobar el 6uncionamiento a"ecua"o "e la implementaci#n "el tipo "e "atos )>!0. El pro$rama "ebe recibir como ar$umento por la lnea "e coman"os una ca"ena "e caracteres e imprimir por pantalla "icha ca"ena al rev8s. )ara ello "ebe intro"ucir to"os los caracteres en la pila y sacarlos a continuaci#n ,en or"en inverso/. El c#"i$o 6uente "el pro$rama principal "eber estar en un archivo "i6erente al "e las 6unciones "el J0( )>!07 "ebien"o $enerarse un proyecto con el Jurbo para $enerar un ejecutable a partir "e "os archivos. Es importante tambi8n %ue la utilizaci#n "e la pila se realice a trav8s "e las 6unciones "e6ini"as en el ejercicio *7 y no a trav8s "e acceso "irecto a los miembros "e la estructura "e "atos. :o"i6icar el archivo ,i#a.h, "e 6orma %ue el J>)?=>N'?=)>!0 sea ahora un char KN renombrar el archivo pila*.h. :o"i6icar el pro$rama "el ejercicio 2 para %ue reciba una serie "e palabras como ar$umentos y las imprima en or"en inverso.
3. 4.

)ro$ramaci#n "el al$oritmo "e resoluci#n "e laberintos. )ara ello se co"i6icar un laberinto como una matriz en la %ue ca"a casilla pue"e estar vaca ,Q Q/ o ocupa"a por un muro ,Q<Q/N e5iste tambi8n una casilla "e entra"a ,QEQ/ y otra "e sali"a ,QSQ/. !os laberintos ten"rn siempre 6orma rectan$ular7 y se po"rn escribir en archivos "e te5to7 tenien"o por lo tanto %ue escribirse una 6unci#n para leer el archivo y volcarlo a una estructura "e "atos correspon"iente. En "icho archivo el 6inal "e una lnea se in"icar con la letra Q'Q ,la cual no 6orma parte "el laberinto/ para "e este mo"o evitar con6usiones conespacios enblanco o saltos "e lnea. !a "e6inici#n "e "icha estructura y "e las 6unciones necesarias se encuentra en el archivo #a-.rint$.h7 y las repro"ucimos a continuaci#n.

ty#ede, enum > ?I?XG?-= A00I[A= A[A\-= 6E0E&ZA= I]^GIE06A C 3-VI3IE?F-9 )de,ine LA6-53A4 /22 ty#ede, struct >

@+

VctorSanchez2

http://www.victorsanchez2.com
char ma#a7LA6-53A487LA6-53A489 int ancho9 int alto9

C LA[E0I?F-9 /* de,inici_n del ti#o la"erinto */ ty#ede, struct > int <9 int y9 C &--06E?A6A9 ESTADO lee_la$e%in!"(cha% *n"&$%e_'iche%", LABE(INTO *la$e%in!", )OO(DENADA *p"sici"n_en!%a a): Se encar(a de %olcar los datos desde el ,ichero a la estructura la"erinto. Adem`s= de%uel%e las coordenadas < e y de la entrada al la"erinto. 6a E00-0 si hay al(n #ro"lema. #"i i&p%i&e_la$e%in!"(LABE(INTO *la$e%in!"): Im#rime el la"erinto #or #antalla. BOOLEANO es_casilla_pe%&i!i a(LABE(INTO la$e%in!", )OO(DENADA p"sici"n_ac!ual): dice si #odemos ocu#ar esa casilla del la"erinto o no9 #odemos ocu#ar las casillas Hue tienen un es#acio %acVo= JEJ o JSJ. BOOLEANO es_casilla_sali a(LABE(INTO la$e%in!", )OO(DENADA p"sici"n_ac!ual): dice si esa casilla es la salida : JSJ; o no. *OVI*IENTO p"li!ica_&"#i&ien!"(*OVI*IENTO ul!i&"_&"#i&ien!"): en "ase al ltimo mo%imiento Hue se ha reali ado= nos dice HuT mo%imiento de"emos de intentar ahora. Uor eSem#lo: nin(uno1 +arri"a= arri"a1+derecha= derecha1+a"aSo= a"aSo1+i Huierda= i Huierda1+nin(uno. Esta ,unci_n de"e im#lementarse con un switch. *OVI*IENTO &"#i&ien!"_"pues!"(*OVI*IENTO &"#i&ien!"): #ara un mo%imiento dado= nos dice su o#uesto. I Huierda y derecha son o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es nin(uno. Esta ,unci_n se de"e im#lementar con un switch. )OO(DENADA calcula_nue#a_p"sici"n()OO(DENADA p"sici"n_ac!ual, *OVI*IENTO si+uien!e_&"#i&ien!"): Esta ,unci_n nos dice Hue coordenada tendremos si reali amos el mo%imiento es#eci,icado desde la #osicion actual. Esta ,unci_n se de"e im#lementar con un switch. #"i &a%ca_la$e%in!"(LABE(INTO *la$e%in!", )OO(DENADA p"sici"n_ac!ual): Esta ,unci_n marca el la"erinto= en la #osicion en la Hue estemos= con un #unto :J . ;.

!a implementaci#n "e estas 6unciones "eber realizarse en un archivo "e nombre #a-.rint$.c. 0 continuaci#n "ebe pro$ramarse el al$oritmo "e resoluci#n "e laberinto7 si$uien"o el pseu"oGc#"i$o %ue se "escribe a continuaci#n. )seu"oGc#"i$o como re6erencia para escribir el c#"i$o correspon"iente:

@*

VctorSanchez2
iniciali ar la #ila de mo%imientos ultimo5mo%imiento5e<#lorado @ ?I?XG?salida5im#osi"le @ ?-

http://www.victorsanchez2.com

salida5encontrada @ es5casilla5salida:la"erinto= #osicion5actual;9 mientras Hue no se haya encontrado la salida ni sali a_i&p"si$le sea SI= > marcar la #osici_n actual en el la"erinto hallar si(uiente mo%imiento se(n nuestra #olVtica y meterlo en la %aria"le si+uien!e_"pci"n_&"#i&ien!" si la %aria"le si+uien!e_"pci"n_&"#i&ien!" no es ?I?XG?-= > ultimo5mo%imiento5e<#lorado @ si(uiente5o#cion5mo%imiento calcular nue%a #osicion y meterla en la %aria"le si+uien!e_p"sici"n si la casilla corres#ondiente a la nue%a #osicion es una casilla #ermitida > meter el mo%imiento Hue hemos hecho en la #ila ultimo5mo%imiento5e<#lorado @ ?I?XG?#osicion5actual @ si(uiente5#osicion C C en caso contrario > sacar un dato de la #ila de mo%imientos :este dato contiene el mo%imiento Hue me ha lle%ado a la actual #osicion; y meterlo en ultimo5mo%imiento5e<#lorado si no he #odido sacar nada de la #ila #orHue no ha"Va nada salida5im#osi"le @ SI en caso contrario calcular la nue%a #osici_n deshaciendo el mo%imiento Hue me ha lle%ado a la casilla actual :tendrT Hue mo%erme en la direcci_n o#uesta;=asi(n`ndoselo a la %aria"le p"sici"n_ac!ual

@2

VctorSanchez2
C

http://www.victorsanchez2.com

cheHuear si nos encontramos en la casilla de salida= en ese caso hacer SI la %aria"le sali a_enc"n!%a a C :,in del mientras;

0 mo"o "e resumen7 el pro$rama realiza"o "eber: Hecibir el nombre "el archivo con el laberinto "es"e la lnea "e coman"os7 comproban"o por lo tanto %ue recibe los ar$umentos a"ecua"os. Volcar los "atos "el laberinto a la matriz PlaberintoP ,6unci#n lee=laberinto/. omprobar la e5istencia "el archivo7 "evolvien"o error en caso contrario. ontrolar otros errores como el intento "e lectura "e laberintos "emasia"o $ran"es7 laberintos en los %ue las lneas tienen "i6erente tamaOo7 laberintos en los %ue no haya sali"a7 o no entra"a7 laberintos en los %ue haya ms "e una entra"a7 etc. Healizar una b;s%ue"a "e un posible camino "es"e la entra"a ,E/ a la sali"a ,S/ "el laberinto. Se "ebern "e controlar errores como la e5istencia "e laberintos en los %ue no hay nin$;n camino posible "es"e la entra"a a la sali"a7 etc. (ar como sali"a la secuencia "e movimientos necesaria para salir "es"e la entra"a ,E/ a la sali"a ,S/ "el laberinto.

E/.rcici$ 2: Este ejercico est compuesto "e C archivos: in6opila.h al$orit.h tipos.h pila.h pila.c al$orit.c main.c *.in6opila.h
)i,nde, 5I?E-5UILA5Z )de,ine 5I?E-5UILA5Z /* 6e,inici_n del ti#o de dato a almacenar en la #ila */ ty#ede, char FIU-5I?E-5UILA9 /* ,in del archi%o in,o#ila.h */ )endi,

2.al$orit.h
)i,nde, ALX-0IF5Z )de,ine ALX-0IF5Z ESFA6- Al(oritmo:int ar(c= char *ar(%78;9 )endi,

@-

VctorSanchez2

http://www.victorsanchez2.com

-.tipos.h
)i,nde, 5FIU-S5Z )de,ine 5FIU-S5Z ty#ede, enum > E00-0= [IE? C ESFA6-9 ty#ede, enum > SI= ?C [--LEA?-9 /* ,in del archi%o ti#os.h */ )endi,

@.pila.h
)i,nde, 5UILA5Z )de,ine 5UILA5Z )include Ati#os.hA )include Ain,o#ila.hA )de,ine 3A45UILA /222 /* tamaWo m`<imo de la #ila */

/* de,inici_n del nue%o ti#o llamado UILA */ ty#ede, struct > FIU-5I?E-5UILA *datos9 int to#e9 C UILA9 /* Esta ,unci_n iniciali a la #ila como %acVa y reser%a memoria su,iciente #ara un m`<imo de 3A45UILA elementos en la #ila */ ESFA6- Iniciali aUila:UILA *#ila;9 /* Esta ,unci_n nos dice si la #ila est` %acVa o no */ [--LEA?- UilaVacia:UILA #ila;9 /* Esta ,unci_n nos dice si la #ila est` llena o no */ [--LEA?- UilaLlena:UILA #ila;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9 /* Esta ,unci_n li"era la memoria Hue se ha"Va reser%ado #ara los datos de la #ila */ %oid Li"eraUila:UILA *#ila;9 /* ,in del archi%o #ila.h */ )endi,

A.pila.c

@@

VctorSanchez2
)include Ati#os.hA )include Ain,o#ila.hA )include A#ila.hA )include *alloc.h+ )include *stdli".h+ )de,ine 3A45UILA /222

http://www.victorsanchez2.com

/* Esta ,uncion iniciali a la #ila como %acia y reser%a memoria su,iciente #ara un ma<imo de 3A45UILA elementos en la #ila */ ESFA6- Iniciali aUila:UILA *#ila; > i, :L#ila; return E00-09 i, :L:#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * si eo,:FIU-5I?E-5UILA;;;; return E00-09 #ila1+to#e@1/9 return [IE?9 C /* Esta ,uncion nos dice si la #ila est` %acVa o no */ [--LEA?- UilaVacia:UILA #ila; > i, :#ila.to#e@@1/; return SI9 return ?-9 C /* Esta ,uncion nos dice si la #ila est` llena o no */ [--LEA?- UilaLlena:UILA #ila; > i, :#ila.to#e@@3A45UILA; return SI9 return ?-9 C /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato; > i, :L#ila; return E00-09 i, :UilaLlena:*#ila;@@SI; return E00-09 #ila1+to#eII9 #ila1+datos7#ila1+to#e8@dato9 return [IE?9 C /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato; > i, :L#ila PP Ldato; return E00-09 i, :UilaVacia:*#ila;@@SI; return E00-09 *dato@#ila1+datos7#ila1+to#e89 #ila1+to#e119

@A

VctorSanchez2
return [IE?9 C

http://www.victorsanchez2.com

/* Esta ,uncion li"era la memoria Hue se ha"Va reser%ado #ara los datos de la #ila */ %oid Li"eraUila:UILA *#ila; > ,ree:#ila1+datos;9 C

B.al$orit.c
)include )include )include )include )include A#ila.hA Ati#os.hA Aal(orit.hA *strin(.h+ *stdio.h+

ESFA6- Al(oritmo:int ar(c= char* ar(%78; > int i@2= S@2= lon(itud9 UILA #ila9 FIU-5I?E-5UILA dato9 i, :Lar(%; return E00-09 i, :LIniciali aUila:D#ila;; > ,#rint,:stderr=ABnError al iniciali ar la #ila= #osi"lemente= no hay memoria su,icienteBnA;9 return E00-09 C /* &ontrolamos Hue se metan #arametros al comando */ i, :ar(c*2; > ,#rint,:stderr=ABnGso del #ro(rama: Ms *UA0A3EF0-S+A=ar(%728;9 return E00-09 C /*3etemos la in,ormacion en la #ila...*/ ,or:i@/9i*ar(c9iII; > lon(itud@strlen:ar(%7i8;9 Uush:D#ila=J J;9 ,or:S@29S*lon(itud9SII; i,:LUush:D#ila=ar(%7i87S8;; > ,#rint,:stderr=ABnError al maneSar la #ila= memoria insu,icienteBnA;9 return E00-09 C C /* Im#rimamos la #ila */ $hile:UilaVacia:#ila;@@?-; > Uo#:D#ila=Ddato;9 ,#rint,:stdout=AMcA=dato;9 C ,#rint,:stdout=ABnA;9 /*Li"eremos la #ila */ Li"eraUila:D#ila;9 return [IE?9 C

@B

VctorSanchez2

http://www.victorsanchez2.com

C.main.c
)include )include )include )include A#ila.hA Ain,o#ila.hA Aal(orit.hA *stdio.h+

int main:int ar(c= char *ar(%78; > i, :LAl(oritmo:ar(c=ar(%;; > ,#rint,:stderr=ABnError al reali ar el al(oritmo.BnA;9 return E00-09 C return [IE?9 C

E/.rcici$ !: Este ejercico est compuesto "e C archivos: in6opila.h al$orit.h tipos.h pila.h pila.c al$orit.c main.c *.in6opila.h
)i,nde, 5I?E-5UILA5Z )de,ine 5I?E-5UILA5Z /* 6e,inici_n del ti#o de dato a almacenar en la #ila */ ty#ede, char * FIU-5I?E-5UILA9 )endi,

2.al$orit.h
)i,nde, ALX-0IF5Z )de,ine ALX-0IF5Z ESFA6- Al(oritmo:int ar(c= char *ar(%78;9 )endi,

-.tipos.h
)i,nde, 5FIU-S5Z )de,ine 5FIU-S5Z ty#ede, enum > E00-0= [IE? C ESFA6-9

@C

VctorSanchez2
ty#ede, enum > SI= ?C [--LEA?-9 )endi,

http://www.victorsanchez2.com

@.pila.h
)i,nde, 5UILA5Z )de,ine 5UILA5Z )include Ati#os.hA )include Ain,o#ila.hA )de,ine 3A45UILA /222 /* tamaWo ma<imo de la #ila */

/* de,inicion del nue%o ti#o llamado UILA */ ty#ede, struct > FIU-5I?E-5UILA *datos9 int to#e9 C UILA9 /* Esta ,uncion iniciali a la #ila como %acia y reser%a memoria su,iciente #ara un ma<imo de 3A45UILA elementos en la #ila */ ESFA6- Iniciali aUila:UILA *#ila;9 /* Esta ,uncion nos dice si la #ila esta %acia o no */ [--LEA?- UilaVacia:UILA #ila;9 /* Esta ,uncion nos dice si la #ila esta llena o no */ [--LEA?- UilaLlena:UILA #ila;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9 /* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de la #ila */ %oid Li"eraUila:UILA *#ila;9 )endi,

A.pila.c
)include Ati#os.hA )include Ain,o#ila.hA )include A#ila.hA )include *stdli".h+ )include *alloc.h+ )de,ine 3A45UILA /222 /* Esta ,uncion iniciali a la #ila como %acia y reser%a memoria su,iciente #ara un ma<imo de 3A45UILA elementos en la #ila */ ESFA6- Iniciali aUila:UILA *#ila; > i, :L#ila; return E00-09 #ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * si eo,:FIU-5I?E-5UILA;;9

@.

VctorSanchez2
i, :L#ila1+datos; return E00-09 #ila1+to#e@1/9 return [IE?9 C

http://www.victorsanchez2.com

/* Esta ,uncion nos dice si la #ila esta %acia o no */ [--LEA?- UilaVacia:UILA #ila; > i, :#ila.to#e@@1/; return SI9 return ?-9 C /* Esta ,uncion nos dice si la #ila esta llena o no */ [--LEA?- UilaLlena:UILA #ila; > i, :#ila.to#e@@3A45UILA; return SI9 return ?-9 C /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato; > i, :L#ila; return E00-09 i, :UilaLlena:*#ila;@@SI; return E00-09 #ila1+to#eII9 #ila1+datos7#ila1+to#e8@dato9 return [IE?9 C /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato; > i, :L#ila PP Ldato; return E00-09 i, :UilaVacia:*#ila;@@SI; return E00-09 *dato@#ila1+datos7#ila1+to#e89 #ila1+to#e119 return [IE?9 C /* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de la #ila */ %oid Li"eraUila:UILA *#ila; > ,ree:#ila1+datos;9 C

B.al$orit.c
)include A#ila.hA )include Ati#os.hA

@I

VctorSanchez2
)include Aal(orit.hA )include *strin(.h+ )include *stdio.h+ ESFA6- Al(oritmo:int ar(c= char* ar(%78; > int i@2= lon(itud9 UILA #ila9 FIU-5I?E-5UILA dato9

http://www.victorsanchez2.com

i, :Lar(%; return E00-09 i, :LIniciali aUila:D#ila;; > ,#rint,:stderr=ABnError al iniciali ar la #ila= #osi"lemente= no hay memoria su,icienteBnA;9 return E00-09 C /* &ontrolamos Hue se metan #arametros al comando */ i, :ar(c*2; > ,#rint,:stderr=ABnGso del #ro(rama: Ms *UA0a3EF0-S+A=ar(%728;9 return E00-09 C /*3etemos la in,ormacion en la #ila...*/ ,or:i@/9i*ar(c9iII; > lon(itud@strlen:ar(%7i8;9 Uush:D#ila=A A;9 i,:LUush:D#ila=ar(%7i8;; > ,#rint,:stderr=ABnError al maneSar la #ila= memoria insu,icienteBnA;9 return E00-09 C C /* Im#rimamos la #ila */ $hile:UilaVacia:#ila;@@?-; > Uo#:D#ila=Ddato;9 ,#rint,:stdout=AMsA=dato;9 C ,#rint,:stdout=ABnA;9 /*Li"eremos la #ila */ Li"eraUila:D#ila;9 return [IE?9 C

C.main.c
)include )include )include )include A#ila.hA Ain,o#ila.hA Aal(orit.hA *stdio.h+

int main:int ar(c= char *ar(%78; > i, :LAl(oritmo:ar(c=ar(%;; > ,#rint,:stderr=ABnError al reali ar el al(oritmo.BnA;9 return E00-09 C return [IE?9

A+

VctorSanchez2
C

http://www.victorsanchez2.com

E/.rcici$ ': Este ejercico est compuesto "e I archivos: *. in6opila.h 2. al$orit.h -. tipos.h @. pila.h A. lab.h B. pila.c C. lab.c .. al$orit.c I. main.c Jo"os los archivos son necesarios para %ue el pro$rama 6uncione correctamente. )ara %ue nuestro compila"or lo entien"a correctamente "eberemos $enerar un proyecto en J o el compila"or %ue utilicemos. *.in6opila.h
)i,nde, 5I?E-5UILA5Z )de,ine 5I?E-5UILA5Z )include Ati#os.hA )include Ala".hA /* 6e,inicion del ti#o de dato a almacenar en la #ila */ ty#ede, 3-VI3IE?F- FIU-5I?E-5UILA9 )endi,

2.al$orit.h
)i,nde, 5ALX-0IF5Z )de,ine 5ALX-0IF5Z )include Ati#os.hA )include Ala".hA /* 0esuel%e el la"erinto */ ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int #arametro= [--LEA?- *solucion;9 )endi,

-. tipos.h
)i,nde, 5FIU-S5Z )de,ine 5FIU-S5Z ty#ede, enum > E00-0= [IE?= SALI6A5I3U-SI[LE= E00-05&-3A?6C ESFA6-9 ty#ede, enum > SI= ?C [--LEA?-9

A*

VctorSanchez2
)endi,

http://www.victorsanchez2.com

@.pila.h
)i,nde, 5UILA5Z )de,ine 5UILA5Z )include Ati#os.hA )include Ain,o#ila.hA )de,ine 3A45UILA /222 /* 3a<imo de elementos #osi"les en la #ila */

/* 6e,inicion del nue%o ti#o llamado UILA */ ty#ede, struct > FIU-5I?E-5UILA *datos9 int to#e9 C UILA9 /* Esta ,uncion iniciali a la #ila como %acia y reser%a memoria su,iciente #ara un ma<imo de 3A45UILA elementos en la #ila */ ESFA6- Iniciali aUila:UILA *#ila;9 /* Esta ,uncion nos dice si la #ila esta %acia o no */ [--LEA?- UilaVacia:UILA *#ila;9 /* Esta ,uncion nos dice si la #ila esta llena o no */ [--LEA?- UilaLlena:UILA *#ila;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9 /* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9 /* 3ostramos los mo%imientos Hue se han reali ado en el la"erinto */ ESFA6- mostrar5mo%imientos:UILA *#Uila;9 /* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de la #ila */ %oid Li"eraUila:UILA *#ila;9 )endi,

A.lab.h
)i,nde, 5LA[5Z )de,ine 5LA[5Z )include Ati#os.hA )de,ine LA6-53A4 /22 /* 6imension ma<ima #ermitida #ara el la"erinto */

ty#ede, enum > ?I?XG?-= A00I[A= A[A\-= 6E0E&ZA= I]^GIE06A C 3-VI3IE?F-9 ty#ede, struct > char ma#a7LA6-53A487LA6-53A489

A2

VctorSanchez2
int ancho9 int alto9 C LA[E0I?F-9 ty#ede, struct > int <9 int y9 C &--06E?A6A9

http://www.victorsanchez2.com

/* 6e,inimos el ti#o del la"erinto */

/* Se encar(a de %olcar los datos desde el ,ichero a la estructura la"erinto. Adem`s= de%uel%e las coordenadas < e y de la entrada al la"erinto. 6a E00-0 si hay al(n #ro"lema. */ ESFA6- lee5la"erinto:char *nom"re5,ichero= LA[E0I?F- * la"erinto= &--06E?A6A * #osicion5entrada;9 /* Im#rime el la"erinto #or #antalla */ %oid im#rime5la"erinto:LA[E0I?F- * la"erinto;9 /* 6ice si #odemos ocu#ar esa casilla del la"erinto o no9 #odemos ocu#ar las casillas Hue tienen un es#acio %acVo= JEJ o JSJ.*/ [--LEA?es5casilla5#ermitida:LA[E0I?F*la"erinto= &--06E?A6A #osicion5actual;9 /* 6ice si esa casilla es la salida : JSJ; o no. */ [--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual;9 /* &om#ro"amos si la casilla de salida esta rodeada #or 4 */ [--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A coord5salida;9 /* En "ase al ultimo mo%imiento Hue se ha reali ado= nos dice Hue mo%imiento de"emos de intentar ahora. Uor eSem#lo: nin(uno1+arri"a= arri"a1+derecha= derecha1+a"aSo= a"aSo1+i Huierda= i Huierda1+nin(uno.*/ 3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento;9 /* Uara un mo%imiento dado= nos dice su o#uesto. I Huierda y derecha son o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es nin(uno. */ 3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento;9 /* Esta ,uncion nos dice Hue coordenada tendremos si reali amos el mo%imiento es#eci,icado desde la #osicion actual.*/ &--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?Fsi(uiente5mo%imiento;9 /* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con un #unto :J . ;*/ %oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;9 /* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con un #unto :J . ;*/ %oid marca5la"erinto3al&amino:LA[E0I?F* la"erinto= &--06E?A6A #osicion5actual;9 /* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con una E :J E ;*/ %oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;9 /* Im#rime la solucion del la"erinto #or #antalla */ %oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto;9 )endi,

B.pila.c A-

VctorSanchez2

http://www.victorsanchez2.com

)include Ati#os.hA )include Ain,o#ila.hA )include A#ila.hA )include *alloc.h+ )include *stdli".h+ )include *stdio.h+ )de,ine 3A45UILA /222

/* Elementos Hue #uede contener la #ila */

/***************************************************************************** * Euncion: ESFA6- Iniciali aUila:UILA *#ila; * * I?: Uuntero a la #ila. * -GF: Error si no se ha #odido iniciali ar la #ila. * 3A.E: Esta ,uncion iniciali a la #ila como %acia y reser%a memoria su,iciente * #ara un ma<imo de 3A45UILA elementos en la #ila. * *****************************************************************************/ ESFA6- Iniciali aUila:UILA *#ila; > i, :L#ila; return E00-09 #ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * si eo,:FIU-5I?E-5UILA;;9 i, :L:#ila1+datos;; return E00-09 #ila1+to#e@1/9 return [IE?9 C /***************************************************************************** * Euncion: [--LEA?- UilaVacia:UILA *#ila; * * I?: Uuntero a la #ila. * -GF: 6e%uel%e SI= si la #ila no contiene elementos. * 3A.E: Esta ,uncion nos dice si la #ila esta %acia o no. * *****************************************************************************/ [--LEA?- UilaVacia:UILA *#ila; > i, :#ila1+to#e @@ 1/; return SI9 return ?-9 C /***************************************************************************** * Euncion: [--LEA?- UilaLlena:UILA *#ila; * * I?: Uuntero a la #ila. * -GF: 6e%uel%e SI si la #ila esta llena. * 3A.E: Esta ,uncion nos in,orma de si la #ila esta llena o no * *****************************************************************************/ [--LEA?- UilaLlena:UILA *#ila; > i, :#ila1+to#e @@ 3A45UILA; return SI9 return ?-9 C

A@

VctorSanchez2

http://www.victorsanchez2.com

/***************************************************************************** * Euncion: ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato; * * I?: Uuntero a la #ila y el dato Hue se introduce en la #ila. * -GF: 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario. * 3A.E: Introducimos un dato en la #ila si es #osi"le. * *****************************************************************************/ ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato; > i, :L#ila; return E00-09 i, :UilaLlena:#ila;@@SI; return E00-09 #ila1+to#eII9 #ila1+datos7#ila1+to#e8@dato9 return [IE?9 C /***************************************************************************** * Euncion: ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato; * * I?: Uuntero a la #ila y #untero al ti#o de dato. * -GF: 6e%uel%e [IE? si todo ha ido correctamte= E00-0 en caso contrario. * 3A.E: Sacamos un dato de la #ila si es #osi"le. * *****************************************************************************/ ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato; > i, :L#ila PP Ldato; return E00-09 i, :UilaVacia:#ila;@@SI; return E00-09 *dato@#ila1+datos7#ila1+to#e89 #ila1+to#e119 return [IE?9 C /***************************************************************************** * Euncion: ESFA6- mostrar5mo%imientos:UILA *#Uila; * * I?: Uuntero a la #ila. * -GF: Se muestran #or #antalla los mo%imientos reali ados. * 3A.E: 3ostramos los mo%imientos Hue se han reali ado en el la"erinto. * *****************************************************************************/ ESFA6- mostrar5mo%imientos:UILA *#Uila; > UILA UilaAu<9 FIU-5I?E-5UILA elemento9 Iniciali aUila:DUilaAu<;9 $hile :UilaVacia:#Uila; @@ ?-; > Uo#:#Uila= Delemento;9 Uush:DUilaAu<= elemento;9 C $hile :UilaVacia:DUilaAu<; @@ ?-; > Uo#:DUilaAu<= Delemento;9 s$itch :elemento;

AA

VctorSanchez2
> case case case case C A00I[A: 6E0E&ZA: A[A\-: I]^GIE06A:

http://www.victorsanchez2.com

#rint,:AArri"a1+A;9 #rint,:A6erecha1+A;9 #rint,:AA"aSo1+A;9 #rint,:AI Huierda1+A;9

"reaQ9 "reaQ9 "reaQ9 "reaQ9

C #rint,:ABnA;9 Li"eraUila:DUilaAu<;9 return [IE?9 C

/***************************************************************************** * Euncion: %oid Li"eraUila:UILA *#ila; * * I?: Uuntero a la #ila. * -GF: * 3A.E: Li"era la memoria Hue se ha"ia reser%ado #ara los datos de la #ila. * *****************************************************************************/ %oid Li"eraUila:UILA *#ila; > ,ree:#ila1+datos;9 C

C.lab.c
)include Ala".hA )include Ati#os.hA )include *stdio.h+ /***************************************************************************** * Euncion: ESFA6lee5la"erinto:char *nom"re5,ichero=LA[E0I?F*la"erinto=&--06E?A6A *#osicion5entrada; * * I?: El nom"re del ,ichero= un #untero al la"erinto y un #untero a la #osicion de entrada. * -GF: Uosicion de entrada al la"erinto y la estructura la"erinto com#letada. E00-0 si al(o * ha ido mal. * 3A.E: Se encar(a de %olcar los datos desde el ,ichero a la estructura la"erinto. Ademas= * de%uel%e las coordenadas < e y de la entrada al la"erinto. 6e%uel%e error si hay * al(un #ro"lema. * *****************************************************************************/ ESFA6- lee5la"erinto:char *nom"re5,ichero= LA[E0I?F- * la"erinto= &--06E?A6A * #osicion5entrada; > EILE *#tr@?GLL9 char c9 /* Varia"le #ara ir leyendo los caracteres del archi%o */ [--LEA?- entrada @ ?-= salida @ ?-9 /* Uara com#ro"ar el numero de entradas y salidas */ [--LEA?- salida5im#osi"le@?-9 /* 3ostraremos si el la"erinto no tiene solucion */ &--06E?A6A coordenada5salida9 int < @ 2= y @ 29 i, :Lla"erinto PP Lnom"re5,ichero PP L#osicion5entrada; return E00-09 la"erinto1+ancho @ 1/9

AB

VctorSanchez2

http://www.victorsanchez2.com

/* A"rimos el archi%o #ara lectura */ #tr @ ,o#en:nom"re5,ichero= ArA;9 i, :L#tr; > ,#rint,:stderr= ABn?o se #udo leer el archi%o dado= #or ,a%or re%ise rutas y #ermisos.A;9 return E00-09 C /* 3ientras Hue no lle(uemos al ,inal del archi%o %amos com#ro"ando y acumulando el la"erinto */ $hile ::c @ ,(etc:#tr;; L@ E-E; > i, :< * 2; > i, :c @@ JBnJ; > < @ 1/9 i, :y@@LA6-53A4; > ,#rint,:stderr=ABnLa"erinto demasiado alto= #or ,a%or re%iseloBnA;9 return E00-09 C yII9 C else <119 C else > s$itch :c; > case JeJ: case JEJ: i, :entrada @@ SI; > ,#rint,:stderr= ABnSolo se #ermite una entrada #or ,ichero.BnA;9 return E00-09 C else > entrada @ SI9 la"erinto1+ma#a7<87y8 @ c9 #osicion5entrada1+< @ <9 #osicion5entrada1+y @ y9 C "reaQ9 case JsJ: case JSJ: i, :salida @@ SI; > ,#rint,:stderr= ABnSolo se #ermite una salida #or ,ichero.BnA;9 return E00-09 C else > salida @ SI9 la"erinto1+ma#a7<87y8 @ c9 coordenada5salida.< @ <9 coordenada5salida.y @ y9 i, :salida5rodeada:la"erinto= coordenada5salida;@@SI; salida5im#osi"le@SI9 C "reaQ9 case J<J: case J4J: la"erinto1+ma#a7<87y8 @ c9

AC

VctorSanchez2
"reaQ9

http://www.victorsanchez2.com

case J,J: case JEJ: i, :la"erinto1+ancho @@ 1/; la"erinto1+ancho @ < 1 /9 else i, :la"erinto1+ancho L@ < 1 /; > ,#rint,:stderr=ABnLos anchos no concuerdan= #or ,a%or re%ise el archi%o.BnA;9 return E00-09 C < @ 129 "reaQ9 case JBnJ: ,#rint,:stderr= ABnLinea sin delimitador de ,inal :JEJ;.BnA;9 return E00-09 case J J: la"erinto1+ma#a7<87y8 @ c9 "reaQ9 de,ault: ,#rint,:stderr= ABn&aracter in%alido= #or ,a%or re%ise el ,icheroBnA;9 return E00-09 C /* Ein s$itch */ C /* Ein: else */ i, :<@@LA6-53A4; > ,#rint,:stderr=ABnLa"erinto demasiado ancho= #or ,a%or re%iselo.BnA;9 return E00-09 C <II9 C /* Ein $hile */ i, :salida@@?-; > ,#rint,:stderr= ABn6e"e ha"er al(una salida.A;9 return E00-09 C i, :entrada@@?-; > ,#rint,:stderr= ABn6e"e ha"er al(una entrada.A;9 return E00-09 C la"erinto1+alto @ y1/9 ,close:#tr;9 i, :salida5im#osi"le@@SI; > ,#rint,:stdout= ABnEl la"erinto no tiene solucion.A;9 ,#rint,:stdout= ABnLa salida esta rodeada #or 4.BnBnA;9 return SALI6A5I3U-SI[LE9 C return [IE?9 C /***************************************************************************** * Euncion: %oid im#rime5la"erinto:LA[E0I?F- * la"erinto; * * I?: Uuntero al la"erinto. * -GF: * 3A.E: Im#rime el la"erinto #or #antalla. * *****************************************************************************/

A.

VctorSanchez2

http://www.victorsanchez2.com

%oid im#rime5la"erinto:LA[E0I?F- * la"erinto; > )de,ine AltoUermitido /Y int <= y9 ,or :y@29 y *@ la"erinto1+alto9 yII; > ,or :<@29 < *@ la"erinto1+ancho9 <II; > i, :y; /* Si y es L@ de 2 */ > /* Uaramos cada AAltoUermitidoA lineas */ i, : ::y M AltoUermitido; @@ 2; DD :<@@2; ; > ,,lush:stdin;9 ,(etc:stdin;9 /* Leemos un caracter #ara detener la #antalla */ ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 C else ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 C else ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 C /* Ein del se(undo Eor */ ,#rint,:stdout= ABnA;9 C /* Ein del #rimer Eor */ ,#rint,:stdout= ABnA;9 C /***************************************************************************** * Euncion: %oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto; * * I?: Uuntero al la"erinto. * -GF: * 3A.E: Im#rime la solucion del la"erinto #or #antalla. * *****************************************************************************/ %oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto; > int <= y9 #rint,:ABnUulse una tecla #ara %er la solucion:A;9 ,,lush:stdin;9 ,(etc:stdin;9 ,or :y @ 29 y *@ la"erinto1+alto9 yII; > ,or :< @ 29 < *@ la"erinto1+ancho9 <II; > i, :y; > i, : ::y M AltoUermitido; @@ 2; DD :<@@2; ; > ,,lush:stdin;9 ,(etc:stdin;9 i, :la"erinto1+ma#a7<87y8 L@ J=J; ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 else ,#rint,:stdout= A A;9 C else > i, :la"erinto1+ma#a7<87y8 L@ J=J; ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 else ,#rint,:stdout= A A;9

AI

VctorSanchez2

http://www.victorsanchez2.com

C C else > i, :la"erinto1+ma#a7<87y8 L@ J=J; ,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9 else ,#rint,:stdout= A A;9 C C ,#rint,:stdout= ABnA;9 C ,#rint,:stdout= ABnA;9 C /***************************************************************************** * Euncion: [--LEA?- es5casilla5#ermitida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual; * * I?: Uuntero al la"erinto y la #osicion actual. * -GF: Si la casilla esta #ermitida de%uel%e SI= de lo contrario de%uel%e ?-. * 3A.E: 6ice si #odemos ocu#ar la casilla del la"erinto o no. Uodemos ocu#ar las * casillas Hue tienen un es#acio %acio= son JEJ= JeJ= JSJ o JsJ. * *****************************************************************************/ [--LEA?es5casilla5#ermitida:LA[E0I?F*la"erinto= &--06E?A6A #osicion5actual; > i, : :#osicion5actual.< + la"erinto1+ancho; PP :#osicion5actual.y + la"erinto1+alto; ; return ?-9 i, :la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ JSJ PP la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ J J; return SI9 return ?-9 C /***************************************************************************** * Euncion: [--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual; * * I?: Uuntero al la"erinto y #osicion actual. * -GF: Si es la casilla de salida de%uel%e SI= si no de%uel%e ?-. * 3A.E: 6ice si esa casilla es la salida :JSJ; o no. * *****************************************************************************/ [--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual; > i, :la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ JSJ; return SI9 return ?-9 C /***************************************************************************** * Euncion: [--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A coord5salida; * * I?: Uuntero al la"erinto y la coordenada de salida. * -GF: Si la salida es im#osi"le de%uel%e SI= si no esta rodeada #or 4 de%uel%e ?-. * 3A.E: &om#ro"amos si la casilla de salida esta rodeada #or 4.

B+

VctorSanchez2

http://www.victorsanchez2.com

* *****************************************************************************/ [--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A coord5salida; > 3-VI3IE?F- mo%imiento @ A00I[A9 &--06E?A6A #osicion5actual9 $hile :mo%imiento L@ ?I?XG?-; > #osicion5actual @ calcula5nue%a5#osicion:coord5salida= mo%imiento;9 i, :es5casilla5#ermitida:la"erinto= #osicion5actual;@@SI; return ?-9 #olitica5mo%imiento:Dmo%imiento;9 C return SI9 C /***************************************************************************** * Euncion: 3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento; * * I?: Uuntero al ultimo mo%imiento reali ado. * -GF: 6e%uel%e el mo%imiento de acuerdo a nuestra #olitica. * 3A.E: En "ase al ultimo mo%imiento Hue se ha reali ado= nos dice Hue * mo%imiento de"emos intentar ahora: nin(uno1+arri"a= arri"a1+derecha= * derecha1+a"aSo= a"aSo1+i Huierda= i Huierda1+nin(uno. * *****************************************************************************/ 3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento; > s$itch :*ultimo5mo%imiento; > case ?I?XG?-: return *ultimo5mo%imiento @ A00I[A9 case A00I[A: case 6E0E&ZA: case A[A\-: C return *ultimo5mo%imiento9 C /***************************************************************************** * Euncion: 3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento; * * I?: 3o%imiento del Hue calcularemos el o#uesto. * -GF: 6e%uel%e el mo%imiento o#uesto. * 3A.E: Uara un mo%imiento dado= nos dice su o#uesto. I Huierda y derecha son * o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es nin(uno. * *****************************************************************************/ 3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento; > s$itch :mo%imiento; > case ?I?XG?-: return ?I?XG?-9 case A00I[A: case 6E0E&ZA: case A[A\-: return A[A\-9 return I]^GIE06A9 return A00I[A9 return *ultimo5mo%imiento @ 6E0E&ZA9 return *ultimo5mo%imiento @ A[A\-9 return *ultimo5mo%imiento @ I]^GIE06A9

case I]^GIE06A: return *ultimo5mo%imiento @ ?I?XG?-9

B*

VctorSanchez2

http://www.victorsanchez2.com

case I]^GIE06A: return 6E0E&ZA9 C return ?I?XG?-9 C /***************************************************************************** * Euncion: &--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= * 3-VI3IE?F- si(uiente5mo%imiento; * * I?: La #osicion actual y el si(uiente mo%imiento Hue tenemos Hue reali ar. * -GF: La coordenada Hue se calcula con la #osicion actual y el mo%imiento. * 3A.E: Esta ,uncion nos dice Hue coordenada tendremos si reali amos el * mo%imiento es#eci,icado desde la #osicion actual. * *****************************************************************************/ &--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?Fsi(uiente5mo%imiento; > s$itch :si(uiente5mo%imiento; > case ?I?XG?-: return #osicion5actual9 case A00I[A: case 6E0E&ZA: case A[A\-: #osicion5actual.y119 /* Eila su#erior a la actual */ return #osicion5actual9 #osicion5actual.<II9 /* &olumna si(uiente a la actual */ return #osicion5actual9 #osicion5actual.yII9 /* Eila in,erior a la actual */ return #osicion5actual9

case I]^GIE06A: #osicion5actual.<119 /* &olumna anterior a la actual */ return #osicion5actual9 C return #osicion5actual9 C /***************************************************************************** * Euncion: %oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A * #osicion5actual; * * I?: Uuntero al la"erinto y #osicion actual. * -GF: * 3A.E: Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= * con un #unto J.J * *****************************************************************************/ %oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual; > la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ J.J9 C /***************************************************************************** * Euncion: %oid marca5la"erinto3al&amino:LA[E0I?F- * la"erinto= &--06E?A6A * #osicion5actual; * * I?: Uuntero al la"erinto y la #osicion actual. * -GF: * 3A.E: Euncion Hue marca el la"erinto= en la #osicion en la Hue estemos= * con una coma J=J * *****************************************************************************/

B2

VctorSanchez2

http://www.victorsanchez2.com

%oid marca5la"erinto3al&amino:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual; > la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ J=J9 C /***************************************************************************** * Euncion: %oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual; * * I?: Gn #untero al la"erinto y la #osicion actual * -GF: * 3A.E: Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= * con una JEJ * *****************************************************************************/ %oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual; > la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ JEJ9 C

..al$orit.c
)include )include )include )include )include )include )include *stdio.h+ Ain,o#ila.hA Ala".hA A#ila.hA Ati#os.hA Aal(orit.hA Astdio.hA

/***************************************************************************** * Euncion: ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int * #arametro= [--LEA?- *solucion; * * I?: Uuntero al la"erinto= coordenada= un #arametro Hue es el comando y si * el la"erinto tiene solucion se acumulara en *solucion. * -GF: Si las cosas marchar correctamente de%uel%e [IE?= si no de%uel%e E00-0. * 3A.E: Euncion #ara reali ar el al(oritmo del la"erinto. * *****************************************************************************/ ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int #arametro= [--LEA?- *solucion; > 3-VI3IE?F- mo%imiento @ A00I[A9 UILA #ila9 char "asura7/289 char %er5mo%9 /* El ususario lo eli(e #ara %er los mo%imientos*/ Iniciali aUila:D#ila;9 i, :Lla"erinto; return E00-09 Uush:D#ila= ?I?XG?-;9 do > i, :mo%imiento @@ ?I?XG?-; > marca5la"erinto3al&amino:la"erinto= coordenada;9 i, :UilaVacia:D#ila; @@ ?-; Uo#:D#ila= Dmo%imiento;9 coordenada @ calcula5nue%a5#osicion:coordenada= mo%imiento5o#uesto:mo%imiento;;9 C else >

B-

VctorSanchez2

http://www.victorsanchez2.com

i, :es5casilla5#ermitida :la"erinto= calcula5nue%a5#osicion:coordenada= mo%imiento;; @@ SI; > Uush:D#ila= mo%imiento;9 i, :#arametro@@3; > im#rime5la"erinto:la"erinto;9 ,(ets:"asura= /2= stdin;9 ,,lush:stdin;9 C coordenada @ calcula5nue%a5#osicion:coordenada= mo%imiento;9 i, :es5casilla5salida:la"erinto= coordenada; @@ SI; > ,#rint,:stdout= ABnLa"erinto &-? solucionBnBnA;9 *solucion@SI9 #rint,:ABnSi desea %er los mo%imientos escri"a JsJ o JSJ: A;9 %er5mo% @ ,(etc:stdin;9 i, : :%er5mo%@@JsJ; PP :%er5mo%@@JSJ; ; mostrar5mo%imientos:D#ila;9 #rint,:ABnIntrodu ca cualHuier caracter #ara %er la solucionA;9 ,,lush:stdin;9 ,(etc:stdin;9 Li"eraUila:D#ila;9 return [IE?9 C marca5la"erinto:la"erinto= coordenada;9 mo%imiento@?I?XG?-9 C C #olitica5mo%imiento:Dmo%imiento;9 C $hile :UilaVacia:D#ila; @@ ?-;9 marca5con5E:la"erinto=coordenada;9 ,#rint,:stdout= ABnLa"erinto SI? solucionBnA;9 Li"eraUila:D#ila;9 return [IE?9 C

I.main.c
)include )include )include )include )include )include Aal(orit.hA A#ila.hA Ala".hA Ati#os.hA *stdio.h+ *strin(.h+

%oid AyudaGso:%oid;9 int main:int ar(c= char *ar(%78; > [--LEA?- solucion@?-9 LA[E0I?F- la"erinto9 &--06E?A6A coordenada9 int com#ara9 char comando78@A1sA9 i, : L::ar(c@@2; PP :ar(c@@3;; ; > AyudaGso:;9 return E00-05&-3A?6-9 C i, :ar(c @@ 3; > com#ara @ strcm#:ar(%728= comando;9

B@

VctorSanchez2

http://www.victorsanchez2.com

/* Si no se ha introducido 1s como comando mostramos el error */ i, :com#ara; > AyudaGso:;9 return E00-05&-3A?6-9 C C s$itch :lee5la"erinto:ar(%7/8= Dla"erinto= Dcoordenada;; > case E00-0: ,#rint,:stderr=ABnError al leer el ,ichero.BnA;9 return E00-09 case SALI6A5I3U-SI[LE: im#rime5la"erinto:Dla"erinto;9 return SALI6A5I3U-SI[LE9 C i, : LAl(oritmo:Dla"erinto= coordenada= ar(c= Dsolucion; ; > ,#rint,:stderr=ABnError al #asar el al(oritmo= #or ,a%or consulte con su distri"uidor.A;9 return E00-09 C ,#rint,:stdout=ABnEl trayecto reali ado ha sido: BnA;9 im#rime5la"erinto:Dla"erinto;9 i, :solucion@@SI; > ,#rint,:stdout=ABnLa solucion del la"erinto es: BnA;9 im#rime5la"erinto5solucion:Dla"erinto;9 C return [IE?9 C /***************************************************************************** * Euncion: %oid AyudaGso:%oid; * * I?: * -GF: * 3A.E: 3uestra un mensaSe de ayuda #ara el usuario #ara Hue introdu ca los * comandos correctamente. * ****************************************************************************** */ %oid AyudaGso:%oid; > ,#rint,:stderr=ABnEl uso del comando es: *eSecuta"le+ *nom"re del la"erinto+ 71s8BnA;9 C

!os archivos "e prueba con los laberintos para este pro$rama "eberan venir a"juntos con este "ocumento. Si hay al$;n problema pue"en visitar mi web y a"%uirirlos: http://www.victorsanchez2.com PRCTICA '
O*JETI+OS

El objetivo "e esta prctica es implementar la :eta Estructura "e (atos ,:eta E"(/ !>SJ0 y realizar un ejercicio "e aplicaci#n "e "icho tipo "e "atos. El ejercicio

BA

VctorSanchez2

http://www.victorsanchez2.com

consistir en pro$ramar la $esti#n "e una serie "e personas ,utilizan"o la estructura "e "atos "e6ini"a en la prctica 2/ usan"o listas para or"enarlas "e acuer"o a "iversos criterios as como para "e6inir la lista "e amigos "e una persona. !a implementaci#n "el tipo "e "ato ser una implementaci#n $en8rica7 es "ecir no "epen"iente "el tipo "e elemento %ue se va a $uar"ar en la lista. E3EH > >?S *. >mplementaci#n "e la :eta E"( LIST ,archivos lista.! y lista.c" El archivo lista.! contiene las constantes y "e6iniciones "e tipos asocia"as a la :eta E"( lista y la cabecera "e las 6unciones asocia"as a esa :eta E"(. El archivo lista.c "eber "e contener el c#"i$o %ue implementa las 6unciones "e6ini"as en lista.h. 2. Escribir un pro$rama "e prueba para comprobar el 6uncionamiento a"ecua"o "e la implementaci#n "e la :eta E"( !>SJ0. El pro$rama "ebe recibir como ar$umentos por la lnea "e coman"os una serie "e ca"enas "e caracteres e insertarlas en una lista enlaza"a. 4na vez hecho esto "ebe recorrer la lista para volver a obtener "ichas ca"enas e imprimirlas por pantalla. -. )ara este ejercicio se utilizar la estructura "e "atos persona utiliza"a en la prctica 27 en la cual el campo amigo se ha re"e6ini"o como LIST amigos. (icha "e6inici#n se encuentra en el archivo persona.h %ue se a"junta. >mplementar tambi8n en "icho archivo la 6unci#n au5iliar !iberar)ersona "e la prctica 2. El archivo persona.c "eber "e contener el c#"i$o %ue implementa las 6unciones "e6ini"as en persona.h. @. Healizar un pro$rama "river para probar las 6unciones "e manipulaci#n "e listas. (icho pro$rama "eber: 0.!eer "e un archivo "e te5to ,cuyo nombre se recibir como el primer ar$umento pasa"o al pro$rama/ los "atos "e una serie "e personas Healizar un pro$rama %ue e insertarlos en una lista. (icha lista se manten"r en memoria hasta la 6inalizaci#n "el pro$rama. El 6ormato "e este 6ichero ser: NombreRtapelli"osRte"a"Rt(N>Rn ampos o "atos "e una persona separa"os por tabula"ores7 ca"a persona termina con salto "e carro. #er fic!ero personas.t$t 9.!eer "e un se$un"o archivo "e te5to ,cuyo nombre se recibir como ar$umento si$uiente al anterior/ "on"e estarn conteni"os las relaciones "e Pamista"P entre las personas "el 6ichero "el punto 0. El 6ormato "e este 6ichero ser: (N>)ersonaRt(N>0mi$o*Rt(N>0mi$o2...Rt(N>0mi$oNRn )rimero est el (N> "e una persona y lue$o los (N> "e sus ami$os7 to"o separa"o por tabula"ores7 se termina la lista "e ami$os "e una persona con un salto "e carro.

BB

VctorSanchez2

http://www.victorsanchez2.com

Si en la sucesi#n "e (N>s "e los ami$os hay un (N> no e5istente ,%ue no estaba en el 6ichero "e personas/7 ese (N> se i$nora y se si$ue a"elante. Si el (N> "e la persona ,el primer (N> "e ca"a lnea/ no e5ista en el 6ichero "e personas se i$nora to"a la lnea. #er fic!ero amigos.t$t .4na vez car$a"os los "atos "e los 6icheros anteriores el pro$rama ejecutar un bucle en el cual se po"rn ele$ir las si$uientes opciones: a.?r"enar por nombre. Se crear una lista or"ena"a por nombre. Se enseOar por pantalla y a continuaci#n se liberar la memoria "e "icha lista. b.?r"enar por apelli"os. Se crear una lista or"ena"a por apelli"os. Se enseOar por pantalla y a continuaci#n se liberar la memoria "e "icha lista. c.?r"enar por e"a". Se crear una lista or"ena"a por e"a". Se enseOar por pantalla y a continuaci#n se liberar la memoria "e "icha lista. ".?r"enar por (N>. Se crear una lista or"ena"a por (N>. Se enseOar por pantalla y a continuaci#n se liberar la memoria "e "icha lista. e.:ostrar lista "e ami$os. Se mostrar para ca"a persona la lista "e sus ami$os. 6.Eliminar persona. El pro$rama pe"ir i"enti6icar a la persona a borrar por me"io "el (N>7 recorrer la lista para buscar "icha persona y la eliminar "e "icha lista. 0simismo se "ebe comprobar las listas "e ami$os "e ca"a persona para ver si est presente y eliminarlo "e "icha lista. Si hubiese ms "e una persona con el mismo (N> se eliminaran to"as ellas. $.Jerminar: se libera la memoria utiliza"a y se termina el pro$rama. E/.rcici$ 2: Este ejercico est compuesto "e B archivos: *.ejer.h 2.lista.h -.tipos.h @.ejer.c A.lista.c B.main.c *.ejer.h
)i,nde, 5E\E05Z )de,ine 5E\E05Z ESFA6- 3eter&ontenidos:LISFA * #lista =char * ESFA6- 3ostrar&ontenidos:LISFA * #lista;9 %oid Li"era&ontenido:%oid * #contenido;9 ESFA6- Im#rime&ontenido:%oid *#contenido;9 )endi, ar(%78= int ar(c;9

2.lista.h
)i,nde, 5LISFA5Z )de,ine 5LISFA5Z

BC

VctorSanchez2
)include Ati#os.hA y [--LEA?- */ /* &omien o de lista.h */ ty#ede, struct ?-6- > %oid *in,o9 struct ?-6- *ne<t9 C nodo9 ty#ede, nodo *LISFA9

http://www.victorsanchez2.com
/* 6onde en ti#os.h estan las de,iniciones de ESFA6-

/*#untero a la in,ormaci_n :(eneral; */ /*#untero al si(uiente nodo */

/*declaraci_n del ti#o LISFA */

/* Esta ,uncion iniciali a la lista a una lista %acVa */ %oid Iniciali aLista:LISFA * lista;9 /* Indica si la lista est` %acVa o no.*/ [--LEA?- ListaVacia:LISFA * lista;9 /* Esta ,uncion o"tiene memoria #ara un nodo de la lista= lo iniciali a y de%uel%e error si no hay memoria #ara el nue%o nodo. */ ESFA6- -"tener?odo:nodo ** ##n;9 /* Esta ,uncion inserta en la lista el nodo elemento5actual delante del nodo elemento5si(uiente. Si ya est dicho nodo en la lista de%uel%e error. */ ESFA6- InsertaElemento:LISFA * lista= nodo * elemento5actual= nodo * elemento5si(uiente;9 /* Esta ,uncion elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el caso de Hue dicho elemento no se encuentre en la lista. */ ESFA6- EliminaElemento:LISFA * lista= nodo * elemento5actual;9 /* Esta ,uncion im#rime #or #antalla el contenido de la lista en el orden en el Hue est`n los elementos en la lista. */ %oid Im#rimeLista:LISFA lista;9 /* Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien la lista de ami(os. */ %oid Im#rimeListaEs#ecial:LISFA lista;9 /* Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los Hue %a #asando. 6e%uel%e una lista %acVa. */ %oid Li"eraLista:LISFA * lista;9 /*Esta ,uncion "usca #or toda la lista un nodo y si lo encuntra nos da su direccion. */ [--LEA?- E<iste?odo:LISFA * #lista= nodo * nodoa"uscar;9 /* Esta ,uncion se encar(a de "uscar el elemento anterior a uno dado */ ESFA6- [uscaUre%io:LISFA lista= nodo * elementoA"uscar= nodo ** elementoAnterior;9 /*Esta ,uncion se encar(a de li"erar los nodos */ %oid Li"era?odo:nodo * #nodo;9 /* 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una lista */ ESFA6- 3eter&ontenido:LISFA * #lista= %oid *#untero;9 /* Ein de lista.h */ )endi,

B.

VctorSanchez2

http://www.victorsanchez2.com

-.tipos.h
)i,nde, 5FIU-S5Z )de,ine 5FIU-S5Z ty#ede, enum > E00-0= [IE? C ESFA6-9 ty#ede, enum > SI= ?C [--LEA?-9 /* ,in del archi%o ti#os.h */ )endi,

@.ejer.c
)include )include )include )include )include )include *stdio.h+ *stdli".h+ *alloc.h+ Ati#os.hA Alista.hA AeSer.hA

/********************************************************************** * Euncion: %oid Li"era&ontenido:%oid * #&ontenido; * * I?: Uuntero a %oid * -GF: * 3A.E: Li"era el contenido del #untero Hue se nos #asa. * **********************************************************************/ %oid Li"era&ontenido:%oid * #&ontenido; > ,ree::%oid *; #&ontenido;9 #&ontenido @ ?GLL9 return9 C /********************************************************************** * Euncion: ESFA6- Im#rime&ontenido:%oid *#&ontenido; * * I?: Uuntero a %oid. * -GF: [IE? si se ha #odido mostrar el contenido del #untero adecuadamente= * E00-0 si el #untero #asado es nulo. * 3A.E: 3uestra el contenido de un #untero a %oid Hue le #asemos. * **********************************************************************/ ESFA6- Im#rime&ontenido:%oid *#&ontenido; > i, :L#&ontenido; return E00-09 ,#rint,:stdout=ABtMsA=:char *; #&ontenido;9 return [IE?9 C /********************************************************************** * Euncion: ESFA6- 3ostrar&ontenidos:LISFA *#Lista; * * I?: Gn #untero a una lista dada.

BI

VctorSanchez2

http://www.victorsanchez2.com

* -GF: [IE? si hemos #odido mostrar el contenido de la lista= E00-0 si la * lista esta"a %acia. * 3A.E: 3uestra el contenido de una lista dada. * **********************************************************************/ ESFA6- 3ostrar&ontenidos:LISFA *#Lista; > i, :L#Lista; return E00-09 Im#rimeLista:*#Lista;9 return [IE?9 C /********************************************************************** * Euncion: ESFA6- 3eter&ontenidos:LISFA * #Lista =char * ar(%78= int ar(c; * * I?: Uuntero a una lista= los ar(umentos y el numero de ar(umentos. * -GF: [IE? si se han introducido los datos correctamente o E00-0 si ha * ha"ido al(un #ro"lema. * 3A.E: Introduce los ar(umentos dados #or el usuario en una lista. * **********************************************************************/ ESFA6- 3eter&ontenidos:LISFA *#Lista =char *ar(%78= int ar(c; > nodo *#?odo= *#Einal9 int i9 i, :L#Lista PP Lar(% ; return E00-09 #Einal@*#Lista9 -"tener?odo:D#?odo;9 #?odo1+in,o @ :char *; ar(%7/89 *#Lista@#?odo9 #Einal@#?odo9 ,or :i@39 i*@ ar(c9 IIi; > -"tener?odo:D#?odo;9 #?odo1+in,o @ :char *; ar(%7i1/89 InsertaElemento:#Lista=#?odo=#Einal;9 #Einal@#?odo9 C return [IE?9 C

A.lista.c
)include )include )include )include )include )include Alista.hA AeSer.hA *stdio.h+ *stdli".h+ *alloc.h+ *strin(.h+

/********************************************************************** * Euncion: %oid Iniciali aLista:LISFA * lista; * * I?: Uuntero a una lista. * -GF: ?ada. * 3A.E: Iniciali a la lista a una lista %acia. * **********************************************************************/ %oid Iniciali aLista:LISFA *lista; > *lista @ ?GLL9

C+

VctorSanchez2
return9 C

http://www.victorsanchez2.com

/********************************************************************** * Euncion: [--LEA?- ListaVacia:LISFA * lista; * * I?: Uuntero a una lista. * -GF: 6e%ol%emos SI si la lista esta %acia= ?- en caso contrario. * 3A.E: Indica si la lista esta %acia o no. * **********************************************************************/ [--LEA?- ListaVacia:LISFA *lista; > i, :*lista @@ ?GLL; return SI9 return ?-9 C /********************************************************************** * Euncion: ESFA6- -"tener?odo:nodo ** ##n; * * I?: Uuntero a #untero a nodo. * -GF: [IE? si se consi(ue reser%ar memoria correctamente= E00-0 si hay * #ro"lemas * 3A.E: 0eser%a memoria #ara un nodo de la lista y lo iniciali a o * de%uel%e error si no hay memoria #ara el nue%o nodo. * **********************************************************************/ ESFA6- -"tener?odo:nodo **##n; > i, :L##n; return E00-09 i, ::*##n @ :nodo *; malloc:si eo,:nodo;;; @@ ?GLL; > ,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria insu,icienteBnA;9 return E00-09 C :*##n;1+in,o @ ?GLL9 :*##n;1+ne<t @ ?GLL9 return [IE?9 C /********************************************************************** * Euncion: [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar; * * I?: Uuntero a una lista donde * tenemos Hue "uscar el nodo y un nodo= al cual * de"emos "uscar uno similar y %er si e<iste o no. * -GF: Si ya hay un nodo con los mismos datos de%ol%emos SI= de lo contrario * de%ol%emos ?-. * 3A.E: [usca #or toda la lista un nodo y si lo encuentra nos da su * direccion. * **********************************************************************/ [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar; > nodo *#?odo9 i, :L#Lista PP L?odoA[uscar; return ?-9 i, :ListaVacia:#Lista; @@ SI; return ?-9 #?odo @ *#Lista9 $hile :ListaVacia:D#?odo; @@ ?-; >

C*

VctorSanchez2
i, :#?odo @@ ?odoA[uscar; return SI9 #?odo @ #?odo1+ne<t9 C return ?-9 C

http://www.victorsanchez2.com

/********************************************************************** * Euncion: ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo * *elemento5si(uiente; * * I?: Uuntero a la lista donde estan los datos y dos #unteros a nodo= el Hue * %amos a insertar y el Hue estara a continuacion. * -GF: * 3A.E: Inserta en la lista el nodo elemento5actual delante del nodo * elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e * error. * **********************************************************************/ ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo *elemento5si(uiente; > i, :Llista PP Lelemento5actual PP Lelemento5si(uiente; return E00-09 i, :ListaVacia:lista; @@ SI; return E00-09 /* Si ya hay un nodo i(ual en la lista de%ol%eremos error. */ i, :E<iste?odo:lista= elemento5actual; @@ SI; > /* 3ostramos un mensaSe de error y la #ersona Hue lo ha #roducido. */ ,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutili ar un nodo.BnA;9 return E00-09 C /* Insertamos el nodo en la lista. */ elemento5actual1+ne<t @ elemento5si(uiente1+ne<t9 elemento5si(uiente1+ne<t @ elemento5actual9 return [IE?9 C /********************************************************************** * Euncion: ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual; * * I?: Uuntero a la lista donde estan los datos y el nodo Hue Hueremos * eliminar * -GF: 6e%ol%emos [IE? si todo ha ido correctamente= E00-0 si hemos * encontrado al(un #ro"lema Hue nos im#ide eliminar el elemento. * 3A.E: Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el * caso de Hue dicho elemento no se encuentre en la lista. * **********************************************************************/ ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual; > nodo *#?odo @ ?GLL= *#?odo2 @ ?GLL9 i, :Llista PP Lelemento5actual; return E00-09 /* 3iramos si el elemento esta al #rinci#io */ i, ::*lista; @@ elemento5actual; > *lista @ elemento5actual1+ne<t9 Li"era?odo:elemento5actual;9 return [IE?9 C /* [uscamos des#ues */ i, :L[uscaUre%io:*lista= elemento5actual= D#?odo;;

C2

VctorSanchez2
>

http://www.victorsanchez2.com

,#rint,:stderr= ABnError en la "usHueda= im#osi"le el "orrado.BnA;9 return E00-09 C i, :#?odo @@ ?GLL; > ,#rint,:stderr= ABnElemento no encontrado= im#osi"le el "orrado.BnA;9 return E00-09 C /* Si hemos encontrado el nodo en la lista lo eliminamos */ #?odo2 @ #?odo1+ne<t9 #?odo1+ne<t @ :#?odo1+ne<t;1+ne<t9 Li"era?odo:#?odo2;9 return [IE?9 C /********************************************************************** * Euncion: ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo * *ElementoAnterior; * * I?: Gna lista con los datos= un #untero a nodo ElementoA[uscar del cual * de%emos "uscar su elemento anterior. * -GF: 6e%ol%emos E00-0 si no se #uede encontrar el elemento anterior= [IE? * si se ha encontrado satis,actoriamente. * 3A.E: Euncion Hue se encar(a de "uscar el elemento anterior a uno dado. * **********************************************************************/ ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo **ElementoAnterior; > *ElementoAnterior@?GLL9 i, :Llista PP LElementoA[uscar; return E00-09 i, :ElementoA[uscar @@ lista; return E00-09 i, :ListaVacia:Dlista;@@SI; return [IE?9 $hile :ListaVacia:Dlista1+ne<t; @@ ?-; > i, ::lista1+ne<t; @@ ElementoA[uscar; > *ElementoAnterior@lista9 return [IE?9 C lista@lista1+ne<t9 C *ElementoAnterior @ ?GLL9 return [IE?9 C /********************************************************************** * Euncion: %oid Li"era?odo:nodo *#?odo; * * I?: Uuntero a nodo del cual de"emos li"erar la memoria. * -GF: ?ada= solo se li"era el #untero y se #one a ?GLL. * 3A.E: Se encar(a de li"erar los nodos. * **********************************************************************/ %oid Li"era?odo:nodo *#?odo; > ,ree:#?odo;9 #?odo @ ?GLL9 C /**********************************************************************

C-

VctorSanchez2

http://www.victorsanchez2.com

* Euncion: %oid Im#rimeLista:LISFA lista; * * I?: Gna lista con los datos. * -GF: 3uestra #or #antalla los datos Hue contiene. * 3A.E: Im#rime #or #antalla el contenido de la lista en el orden en el Hue * estan los elementos de la lista. * **********************************************************************/ %oid Im#rimeLista:LISFA lista; > $hile :ListaVacia:Dlista;; > Im#rime&ontenido:lista1+in,o;9 lista @ lista1+ne<t9 C ,#rint,:stdout= ABnA;9 return9 C /********************************************************************** * Euncion: %oid Li"eraLista:LISFA * lista; * * I?: Uuntero a lista. * -GF: ?ada. * 3A.E: Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los * Hue %a #asando. * **********************************************************************/ %oid Li"eraLista:LISFA *lista; > nodo *#n9 #n @ *lista9 $hile :ListaVacia:lista; @@ ?-; > *lista @ #n1+ne<t9 Li"era?odo:#n;9 #n @ *lista9 C return9 C /********************************************************************** * Euncion: ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero; * * I?: Uuntero a una lista y un #untero a %oid. * -GF: [IE? si se mete el contenido correctamente= E00-0 si se encontrado * al(un #untero nulo o no se ha #odido reser%ar memoria. * 3A.E: 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una * lista. * **********************************************************************/ ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero; > nodo *#n9 LISFA lista9 i, :L#Lista PP L#untero; return E00-09 i, :L-"tener?odo:D#n;; return E00-09 i, :ListaVacia:#Lista;@@SI; > *#Lista@#n9 #n1+in,o@#untero9 return [IE?9

C@

VctorSanchez2
C lista@*#Lista9 $hile :ListaVacia:D:lista1+ne<t;; L@ SI; lista@lista1+ne<t9 lista1+ne<t@#n9 #n1+in,o@#untero9 return [IE?9 C

http://www.victorsanchez2.com

B.main.c
/ ****************************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Este #ro(rama reci"e como ar(umentos #or la linea de comandos una * serie de cadenas de caracteres y las inserta en una lista enla ada. * 6es#ues de esto recorre la lista #ara im#rimirlas #or #antalla. * *****************************************************************************/ )include )include )include )include Alista.hA Ati#os.hA AeSer.hA *stdio.h+ /* 3uestra ayuda al usuario #ara introducir las cadenas */

%oid ayuda:%oid;9 LISFA lista@?GLL9

int main:int ar(c= char *ar(%78; > /* &om#ro"amos el numero de #arametros */ i, :ar(c @@ /; > ayuda:;9 return E00-09 C /* 3etemos las cadenas */ i, :L3eter&ontenidos:Dlista= ar(%= ar(c;; > ,#rint,:stderr=ABnError al insertar los contenidos BnA;9 return E00-09 C /* 3ostramos los contenidos */ i, :L3ostrar&ontenidos:Dlista;; > ,#rint,:stderr=ABnError al mostrar los contenidos BnA;9 return E00-09 C /* Li"erar la lista */ Li"eraLista:Dlista;9 return [IE?9 C /********************************************************************** * Euncion: %oid ayuda:; * * I?: * -GF:

CA

VctorSanchez2

http://www.victorsanchez2.com

* 3A.E: 3uestra un mensaSe de ayuda #ara Hue el usuario introdu ca los * #arametros correctamente. * **********************************************************************/ %oid ayuda:; > ,#rint,:stderr=ABnGso del #ro(rama: *eSecuta"le+ *cadena/+ *cadena2+ ... BnA;9 C

E/.rcici$ ': Este ejercico est compuesto "e B archivos: *.lista.h 2.persona.h -.tipos.h @.lista.c A.persona.c B.main.c

*.lista.h
)i,nde, 5LISFA5Z )de,ine 5LISFA5Z )include Ati#os.hA [--LEA?- */ /* En ti#os.h estan las de,iniciones de ESFA6- y

/* &omien o de lista.h */ ty#ede, struct ?-6- > %oid *in,o9 struct ?-6- *ne<t9 C nodo9 ty#ede, nodo *LISFA9 /* 6eclaracion del ti#o LISFA */ /* Uuntero a la in,ormacion :(eneral; */ /* Uuntero al si(uiente nodo */

/* Iniciali a la lista a una lista %acia. */ %oid Iniciali aLista:LISFA *lista;9 /* Indica si la lista esta %acia o no. */ [--LEA?- ListaVacia:LISFA *lista;9 /* -"tiene memoria #ara un nodo de la lista y lo iniciali a o de%uel%e error si no hay memoria #ara el nue%o nodo. */ ESFA6- -"tener?odo:nodo **##n;9 /* Inserta en la lista el nodo elemento5actual delante del nodo elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e error. */ ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo *elemento5si(uiente;9 /* Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el caso de Hue dicho elemento no se encuentre en la lista. */ ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;9 /* Im#rime #or #antalla el contenido de la lista en el orden en el

CB

VctorSanchez2
Hue estan los elementos en la lista. */ %oid Im#rimeLista:LISFA lista;9

http://www.victorsanchez2.com

/* Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien la lista de ami(os. */ %oid Im#rimeListaEs#ecial:LISFA lista;9 /* Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los Hue %a #asando. */ %oid Li"eraLista:LISFA *lista;9 /* [usca #or toda la lista un nodo y si lo encuentra nos da su direccion. */ [--LEA?- E<iste?odo:LISFA * #Lista= nodo *?odoA[uscar;9 /* Esta ,uncion se encar(a de "uscar el elemento anterior a uno dado. */ ESFA6- [uscaUre%io:LISFA lista= nodo *elementoA"uscar= nodo **elementoAnterior;9 /*Esta ,uncion se encar(a de li"erar los nodos. */ %oid Li"era?odo:nodo *#nodo;9 /* 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una lista */ ESFA6- 3eter&ontenido:LISFA *#lista= %oid *#untero;9 /* Ein de lista.h */ )endi,

2.persona.h
)i,nde, 5UE0S-?A5Z )de,ine 5UE0S-?A5Z )include Alista.hA /* &omien o de #ersona.h */ /* estructura #ersona */ ty#ede, struct #ersona > char *nom"re9 char *a#ellido9 int edad9 char 6?I7/289 LISFA ami(os9 /* El conSunto de ami(os de una #ersona es una lista */ C UE0S-?A9 /* lee de un ,ichero de te<to :una linea #or #ersona; y (enera la lista enla ada con los datos leVdos= en el orden en el Hue ,i(ura"an en el ,ichero. */ LISFA LeerUersonas:char *nom"reEichero;9 /* im#rime #or #antalla los datos de todas las #ersonas :sin incluir la lista de ami(os;. */ %oid Im#rimirListaUersonas:LISFA lista;9 /* (enera una nue%a lista= en la cual los nodos est`n ordenados #or nom"re. Los nue%os nodos de"en ser alocados dentro de esta ,unci_n= si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */ LISFA -rdenarUor?om"re:LISFA lista;9 /* (enera una nue%a lista= en la cual los nodos est`n ordenados #or a#ellido. Los nue%os nodos de"en ser alocados dentro de esta ,unci_n= si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */ LISFA -rdenarUorA#ellido:LISFA lista;9 /* (enera una nue%a lista= en la cual los nodos est`n ordenados #or 6?I. Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */

CC

VctorSanchez2
LISFA -rdenarUor6?I:LISFA lista;9 /* (enera una nue%a lista= Los nue%os nodos de"en ser #unteros a los Hue a#untan LISFA -rdenarUorEdad:LISFA

http://www.victorsanchez2.com

en la cual los nodos est`n ordenados #or nom"re. alocados dentro de esta ,unci_n= si "ien los los cam#os in,o de"en se(uir siendo los mismos. */ lista;9

/* li"era los nodos de una lista enla ada.*/ %oid Li"erarListaUersonas:LISFA *lista;9 /* Im#rime el contenido de una #ersona */ ESFA6- Im#rime&ontenido:%oid *contenido;9 /* Im#rime el contenido de una #ersona con sus ami(os */ ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido;9 /* Li"era una #ersona */ ESFA6- Li"eraUersona:%oid *contenido;9 /*[usca a una #ersona en una lista */ nodo *[uscaUersona:UE0S-?A * ##ersona= LISFA lista;9 /*0esuel%e de#endecias causadas #or la Amuerte de una #ersonaA */ ESFA6- 0esol%er6e#endencias:LISFA *#lista= UE0S-?A * ##ersona;9 /*-"tenemos memoria #ara una #ersona */ ESFA6- -"tenerUersona:UE0S-?A ** ###ersona;9 /*[usca a una #ersona #or su 6?I en una lista */ UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista;9 /* lee de un ,ichero de te<to con las de#endencias de ami(os = en el orden en el Hue ,i(ura"an en el ,ichero. */ ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista;9 /* im#rime #or #antalla los datos de todas las #ersonas :incluyendo la lista de ami(os;. */ %oid Im#rimirListaAmi(os:LISFA lista;9 /* Este #roceso hace de ,rontend entre las ,unciones y el usuario */ ESFA6- Al(oritmo:LISFA *lista;9 /* [usca #osi"les errores en los 6?I */ ESFA6- ErroresLinea6?I:char *linea;9 /* [usca #osi"les errores en los datos de las #ersonas */ ESFA6- ErroresLineaUersonas:char *linea;9 )endi,

-.tipos.h
)i,nde, 5FIU-S5Z )de,ine 5FIU-S5Z ty#ede, enum > E00-0= [IE? C ESFA6-9 ty#ede, enum > SI= ?C [--LEA?-9 /* ,in del archi%o ti#os.h */ )endi,

C.

VctorSanchez2

http://www.victorsanchez2.com

@.lista.c
)include )include )include )include )include )include Alista.hA *stdio.h+ *stdli".h+ *alloc.h+ *strin(.h+ A#ersona.hA

/********************************************************************* * Euncion: %oid Iniciali aLista:LISFA * lista; * * I?: Uuntero a una lista. * -GF: ?ada. * 3A.E: Iniciali a la lista a una lista %acia. * **********************************************************************/ %oid Iniciali aLista:LISFA *lista; > *lista @ ?GLL9 return9 C /********************************************************************* * Euncion: [--LEA?- ListaVacia:LISFA * lista; * * I?: Uuntero a una lista. * -GF: 6e%ol%emos SI si la lista esta %acia= ?- en caso contrario. * 3A.E: Indica si la lista esta %acia o no. * **********************************************************************/ [--LEA?- ListaVacia:LISFA *lista; > i, :*lista @@ ?GLL; return SI9 return ?-9 C /********************************************************************* * Euncion: ESFA6- -"tener?odo:nodo ** ##n; * * I?: Uuntero a #untero a nodo. * -GF: [IE? si se consi(ue reser%ar memoria correctamente= E00-0 si hay * #ro"lemas * 3A.E: 0eser%a memoria #ara un nodo de la lista y lo iniciali a o * de%uel%e error si no hay memoria #ara el nue%o nodo. * **********************************************************************/ ESFA6- -"tener?odo:nodo **##n; > i, :L##n; return E00-09 i, ::*##n @ :nodo *; malloc:si eo,:nodo;;; @@ ?GLL; > ,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria insu,icienteBnA;9 return E00-09 C :*##n;1+in,o @ ?GLL9 :*##n;1+ne<t @ ?GLL9 return [IE?9

CI

VctorSanchez2
C

http://www.victorsanchez2.com

/********************************************************************* * Euncion: [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar; * * I?: Uuntero a una lista donde tenemos Hue "uscar el nodo y un nodo= al cual * de"emos "uscar uno similar y %er si e<iste o no. * -GF: Si ya hay un nodo con los mismos datos de%ol%emos SI= de lo contrario * de%ol%emos ?-. * 3A.E: [usca #or toda la lista un nodo y si lo encuentra nos da su direccion. * **********************************************************************/ [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar; > nodo *#?odo9 i, :L#Lista PP L?odoA[uscar; return ?-9 i, :ListaVacia:#Lista; @@ SI; return ?-9 #?odo @ *#Lista9 $hile :ListaVacia:D#?odo; @@ ?-; > /* Si los todos los datos son i(uales es Hue ya e<iste esa #ersona */ i, : : :*:::UE0S-?A *;#?odo1+in,o;1+nom"re;; @@ :*:::UE0S-?A *; ?odoA[uscar1+in,o;1+nom"re;;; DD : :*:::UE0S-?A *;#?odo1+in,o;1+a#ellido;; @@ :*:::UE0S-?A *; ?odoA[uscar1+in,o;1+a#ellido;;; DD : : :::UE0S-?A *;#?odo1+in,o;1+edad;; @@ : :::UE0S-?A *; ?odoA[uscar1+in,o;1+edad;;; DD : :*:::UE0S-?A *;#?odo1+in,o;1+6?I;; @@ :*:::UE0S-?A *; ?odoA[uscar1+in,o;1+6?I;;; ; return SI9 #?odo @ #?odo1+ne<t9 C return ?-9 C /********************************************************************* * Euncion: ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo *elemento5si(uiente; * * I?: Uuntero a la lista donde estan los datos y dos #unteros a nodo= el Hue * %amos a insertar y el Hue estara a continuacion. * -GF: * 3A.E: Inserta en la lista el nodo elemento5actual delante del nodo * elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e error. * **********************************************************************/ ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo *elemento5si(uiente; > i, :Llista PP Lelemento5actual PP Lelemento5si(uiente; return E00-09 i, :ListaVacia:lista; @@ SI; return E00-09 /* Si ya hay un nodo i(ual en la lista de%ol%eremos error. */ i, :E<iste?odo:lista= elemento5actual; @@ SI; > /* 3ostramos un mensaSe de error y la #ersona Hue lo ha #roducido. */

.+

VctorSanchez2

http://www.victorsanchez2.com

,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutili ar un nodo.BnA;9 ,#rint,:stderr=ABnMs Ms es un usuario ya e<istente. -mitimos la re#eticion.BnA= ::UE0S-?A*;elemento5actual1+in,o;1+nom"re= ::UE0S-?A*;elemento5actual1+in,o;1+a#ellido;9 return E00-09 C /* Insertamos el nodo en la lista. */ elemento5actual1+ne<t @ elemento5si(uiente1+ne<t9 elemento5si(uiente1+ne<t @ elemento5actual9 return [IE?9 C /********************************************************************* * Euncion: ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual; * * I?: Uuntero a la lista donde estan los datos y el nodo Hue Hueremos * eliminar * -GF: 6e%ol%emos [IE? si todo ha ido correctamente= E00-0 si hemos * encontrado al(un #ro"lema Hue nos im#ide eliminar el elemento. * 3A.E: Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el * caso de Hue dicho elemento no se encuentre en la lista. * **********************************************************************/ ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual; > nodo *#?odo @ ?GLL= *#?odo2 @ ?GLL9 i, :Llista PP Lelemento5actual; return E00-09 /* 3iramos si el elemento esta al #rinci#io */ i, ::*lista; @@ elemento5actual; > *lista @ elemento5actual1+ne<t9 Li"era?odo:elemento5actual;9 return [IE?9 C /* [uscamos des#ues */ i, :L[uscaUre%io:*lista= elemento5actual= D#?odo;; > ,#rint,:stderr= ABnError en la "usHueda= im#osi"le el "orrado.BnA;9 return E00-09 C i, :#?odo @@ ?GLL; > ,#rint,:stderr= ABnElemento no encontrado= im#osi"le el "orrado.BnA;9 return E00-09 C /* Si hemos encontrado el nodo en la lista lo eliminamos */ #?odo2 @ #?odo1+ne<t9 #?odo1+ne<t @ :#?odo1+ne<t;1+ne<t9 Li"era?odo:#?odo2;9 return [IE?9 C /********************************************************************* * Euncion: ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo **ElementoAnterior; * * I?: Gna lista con los datos= un #untero a nodo ElementoA[uscar del cual * de%emos "uscar su elemento anterior. * -GF: 6e%ol%emos E00-0 si no se #uede encontrar el elemento anterior= [IE? * si se ha encontrado satis,actoriamente. * 3A.E: Euncion Hue se encar(a de "uscar el elemento anterior a uno dado. *

.*

VctorSanchez2

http://www.victorsanchez2.com

**********************************************************************/ ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo **ElementoAnterior; > *ElementoAnterior@?GLL9 i, :Llista PP LElementoA[uscar; return E00-09 i, :ElementoA[uscar @@ lista; return E00-09 i, :ListaVacia:Dlista;@@SI; return [IE?9 $hile :ListaVacia:Dlista1+ne<t; @@ ?-; > i, ::lista1+ne<t; @@ ElementoA[uscar; > *ElementoAnterior@lista9 return [IE?9 C lista@lista1+ne<t9 C *ElementoAnterior @ ?GLL9 return [IE?9 C /********************************************************************* * Euncion: %oid Li"era?odo:nodo *#?odo; * * I?: Uuntero a nodo del cual de"emos li"erar la memoria. * -GF: ?ada= solo se li"era el #untero y se #one a ?GLL. * 3A.E: Se encar(a de li"erar los nodos. * **********************************************************************/ %oid Li"era?odo:nodo *#?odo; > ,ree:#?odo;9 #?odo @ ?GLL9 C /********************************************************************* * Euncion: %oid Im#rimeLista:LISFA lista; * * I?: Gna lista con los datos. * -GF: 3uestra #or #antalla los datos Hue contiene. * 3A.E: Im#rime #or #antalla el contenido de la lista en el orden en el Hue * estan los elementos de la lista. * **********************************************************************/ %oid Im#rimeLista:LISFA lista; > $hile :ListaVacia:Dlista;; > Im#rime&ontenido:lista1+in,o;9 lista @ lista1+ne<t9 C ,#rint,:stdout= ABnA;9 return9 C /********************************************************************* * Euncion: %oid Im#rimeListaEs#ecial:LISFA lista; * * I?: Gna lista con los datos. * -GF: ?ada. 3uestra las #ersonas con sus ami(os. * 3A.E: Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien * la lista de ami(os.

.2

VctorSanchez2

http://www.victorsanchez2.com

* **********************************************************************/ %oid Im#rimeListaEs#ecial:LISFA lista; > int i@/9 $hile :ListaVacia:Dlista;; > Im#rime&ontenidoEs#ecial:lista1+in,o;9 lista @ lista1+ne<t9 /* Vamos #arando la #antalla cada N #ersonas mostradas. */ i, : :iII M N; @@ 2; > ,#rint,:stdout=ABnUulse enter #ara continuar.BnA;9 ,(etc:stdin;9 C C ,#rint,:stdout= ABnA;9 return9 C /********************************************************************* * Euncion: %oid Li"eraLista:LISFA * lista; * * I?: Uuntero a lista. * -GF: ?ada. * 3A.E: Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los Hue * %a #asando. * **********************************************************************/ %oid Li"eraLista:LISFA *lista; > nodo *#n9 #n @ *lista9 $hile :ListaVacia:lista; @@ ?-; > *lista @ #n1+ne<t9 Li"era?odo:#n;9 #n @ *lista9 C return9 C /********************************************************************* * Euncion: ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero; * * I?: Uuntero a una lista y un #untero a %oid. * -GF: * 3A.E: 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una * lista. * **********************************************************************/ ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero; > nodo *#n9 LISFA lista9 i, :L#Lista PP L#untero; return E00-09 i, :L-"tener?odo:D#n;; return E00-09 i, :ListaVacia:#Lista;@@SI; > *#Lista@#n9

.-

VctorSanchez2
#n1+in,o@#untero9 return [IE?9 C lista@*#Lista9 $hile :ListaVacia:D:lista1+ne<t;; L@ SI; lista@lista1+ne<t9 lista1+ne<t@#n9 #n1+in,o@#untero9 return [IE?9 C

http://www.victorsanchez2.com

A.persona.c
)include )include )include )include )include )include )include )de,ine )de,ine )de,ine )de,ine )de,ine Alista.hA A#ersona.hA *stdio.h+ *stdli".h+ *math.h+ *cty#e.h+ *strin(.h+ L-?X5?-3 52 3A45LE?XFZ /22N 3A45&A0A&FE0ES 32 3A45L-?X 52 L-?XIFG6 /22

/********************************************************************* * Euncion: %oid Im#rimirListaUersonas:LISFA lista; * * I?: Gna lista. * -GF: Llama a la ,uncion Im#rimelista:lista; Hue mostrara la lista. * 3A.E: Im#rime #or #antalla los datos de todas las #ersonas :sin incluir * la lista de ami(os;. * **********************************************************************/ %oid Im#rimirListaUersonas:LISFA lista; > Im#rimeLista:lista;9 C /********************************************************************* * Euncion: %oid Im#rimirListaAmi(os:LISFA lista; * * I?: Gna Lista. * -GF: Llama a la ,uncion Im#rimeListaEs#ecial Hue la mostrara con los * ami(os. * 3A.E: Im#rime #or #antalla los datos de todas las #ersonas :incluyendo * la lista de ami(os. * **********************************************************************/ %oid Im#rimirListaAmi(os:LISFA lista; > Im#rimeListaEs#ecial:lista;9 C /********************************************************************* * Euncion: %oid Li"erarListaUersonas:LISFA *lista; * * I?: * -GF: * 3A.E: Li"era los nodos de una lista enla ada. * **********************************************************************/

.@

VctorSanchez2
%oid Li"erarListaUersonas:LISFA *lista; > $hile :ListaVacia:lista; L@ SI; > Li"eraUersona::*lista;1+in,o;9 :*lista; @ :*lista;1+ne<t9 C Li"eraLista:lista;9 C

http://www.victorsanchez2.com

/********************************************************************* * Euncion: ESFA6- Im#rime&ontenido:%oid *contenido; * * I?: Uuntero a %oid. * -GF: * 3A.E: Im#rime el contenido de una #ersona. * **********************************************************************/ ESFA6- Im#rime&ontenido:%oid *contenido; > UE0S-?A *#Uersona9 #Uersona @ :UE0S-?A *; contenido9 ,#rint,:stdout= AMs BtMs BtMdBtMsBnA= #Uersona1+nom"re= #Uersona1 +a#ellido= #Uersona1+edad= #Uersona1+6?I;9 return [IE?9 C /********************************************************************* * Euncion: ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido; * * I?: * -GF: * 3A.E: Im#rime el contenido de una #ersona con sus ami(os. * **********************************************************************/ ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido; > UE0S-?A *#Uersona9 #Uersona @ :UE0S-?A *; contenido9 ,#rint,:stdout= AMs BtMs BtMdBtMsBnA= #Uersona1+nom"re= #Uersona1 +a#ellido= #Uersona1+edad= #Uersona1+6?I;9 ,#rint,:stdout= ASus Ami(os son: BnA;9 Im#rimeLista:#Uersona1+ami(os;9 ,#rint,:stdout= ABnBnA;9 return [IE?9 C /********************************************************************* * Euncion: ESFA6- Li"eraUersona:%oid *contenido; * * I?: * -GF: * 3A.E: Li"era una #ersona. * **********************************************************************/ ESFA6- Li"eraUersona:%oid *contenido; > UE0S-?A *#Uersona9 #Uersona @ :UE0S-?A *; contenido9 ,ree:#Uersona1+nom"re;9 ,ree:#Uersona1+a#ellido;9 Li"eraLista:D:#Uersona1+ami(os;;9

.A

VctorSanchez2
return [IE?9 C

http://www.victorsanchez2.com

/********************************************************************* * Euncion: nodo *[uscaUersona:UE0S-?A *#Uersona= LISFA lista; * * I?: Uuntero a una estructura de ti#o UE0S-?A y una lista. * -GF: 6e%ol%emos la lista si se ha encontrado a la #ersona= ?GLL si * no hemos encontrado a nadie. * 3A.E: [usca a una #ersona en una lista. * **********************************************************************/ nodo *[uscaUersona:UE0S-?A *#Uersona= LISFA lista; > $hile :ListaVacia:Dlista; L@ SI; > i, :lista1+in,o @@ :UE0S-?A *; #Uersona; return lista9 lista @ lista1+ne<t9 C return ?GLL9 /* Si no se ha encontrado a la #ersona */ C /******************************************************************** * Euncion: ESFA6- 0esol%er6e#endencias:LISFA *#Lista= UE0S-?A *#Uersona; * * I?: Uuntero a una lista y un #untero a una estructura de ti#o UE0S-?A. * -GF: [IE? si todo ha ido correctamente= E00-0 si al(un #untero es ?GLL. * 3A.E: 0esuel%e de#endecias causadas #or la Amuerte de una #ersonaA. * **********************************************************************/ ESFA6- 0esol%er6e#endencias:LISFA *#Lista= UE0S-?A *#Uersona; > nodo *#?odo @ ?GLL9 LISFA lista9 i, :L#Lista PP L#Uersona; return E00-09 lista @ *#Lista9 $hile :ListaVacia:Dlista; L@ SI; > /* La #ersona Hue eliminamos %a a deSar de a#arecer en la lista de ami(os de las #ersonas Hue le tu%iesen como ami(o */ #?odo @ [uscaUersona:#Uersona= ::UE0S-?A *; :lista1+in,o;;1+ami(os;9 i, :#?odo L@ ?GLL; EliminaElemento:D:::UE0S-?A *; :lista1+in,o;;1+ami(os;= #?odo;9 lista @ lista1+ne<t9 C return [IE?9 C /********************************************************************* * Euncion: LISFA -rdenarUor?om"re:LISFA lista; * * I?: Gna lista con los datos de todas las #ersonas. * -GF: Gna nue%a lista con las #ersonas ordenadas #or nom"re. * 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenador #or * nom"re. Los nue%os nodos de"en ser alocados dentro de esta ,uncion= * si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir * siendo los mismos. * **********************************************************************/ LISFA -rdenarUor?om"re:LISFA lista; > [--LEA?- continuar9 nodo *#?odo= *#nord9

.B

VctorSanchez2
LISFA listaordenada9 i, :ListaVacia:Dlista; @@ SI; return ?GLL9 Iniciali aLista:Dlistaordenada;9 /* 3etemos el #rimer elemento */ -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 listaordenada @ #?odo9 lista @ lista1+ne<t9

http://www.victorsanchez2.com

/* &ontinuamos con los demas */ $hile :ListaVacia:Dlista; L@ SI; > #nord @ listaordenada9 continuar @ SI9 $hile :continuar @@ SI; > /* &om#ro"amos si estamos al #rinci#io y es menor */ i, ::#nord @@ listaordenada; DD :strcm#: ::UE0S-?A *; :lista1+in,o;;1+nom"re= ::UE0S-?A *; :#nord1+in,o;;1+nom"re; * 2;; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 #?odo1+ne<t @ listaordenada9 listaordenada @ #?odo9 continuar @ ?-9 C /* &om#ro"amos Hue no estemos al ,inal */ else i, :#nord1+ne<t @@ ?GLL; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C /* En los demas casos */ else i, :strcm#: ::UE0S-?A *; :lista1+in,o;;1+nom"re= ::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+ nom"re; * 2; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C #nord @ #nord1+ne<t9 C lista @ lista1+ne<t9 C return listaordenada9 C /********************************************************************* * Euncion: LISFA -rdenarUorA#ellido:LISFA lista; * * I?: Gna lista con los datos de todas las #ersona. * -GF: Gna nue%a lista con las #ersonas ordenadas #or a#ellido. * 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or * a#ellido. Los nue%os nodos de"en ser alocados dentro de esta ,uncion= * si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir * siendo los mismos. * **********************************************************************/ LISFA -rdenarUorA#ellido:LISFA lista;

.C

VctorSanchez2
> [--LEA?- continuar9 nodo *#?odo= *#nord9 LISFA listaordenada9 i, :ListaVacia:Dlista; @@ SI; return ?GLL9 Iniciali aLista:Dlistaordenada;9 /* 3etemos el #rimer elemento */ -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 listaordenada @ #?odo9 lista @ lista1+ne<t9

http://www.victorsanchez2.com

/* Se(uimos con los demas */ $hile :ListaVacia:Dlista; L@ SI; > #nord @ listaordenada9 continuar @ SI9 $hile :continuar @@ SI; > /* &om#ro"amos si estamos al #rinci#io y es menor */ i, ::#nord @@ listaordenada; DD :strcm# :::UE0S-?A *; :lista1+in,o;;1+a#ellido= ::UE0S-?A *; :#nord1+in,o;;1+a#ellido; * 2;; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 #?odo1+ne<t @ listaordenada9 listaordenada @ #?odo9 continuar @ ?-9 C /* &om#ro"amos Hue no estemos al ,inal */ else i, :#nord1+ne<t @@ ?GLL; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C /* En los demas casos */ else i, :strcm#:::UE0S-?A *; :lista1+in,o;;1+a#ellido= ::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+a#ellido; * 2; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C #nord @ #nord1+ne<t9 C /* Ein: $hile :continuar @@ SI; */ lista @ lista1+ne<t9 C /* Ein: $hile :ListaVacia:Dlista; L@ SI; */ return listaordenada9 C /********************************************************************* * Euncion: LISFA -rdenarUor6?I:LISFA lista; * * I?: Gna lista con los datos de todas las #ersona. * -GF: Gna nue%a lista con las #ersonas ordenadas #or 6?I. * 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or * 6?I. Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si * "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir * siendo los mismos. * **********************************************************************/

..

VctorSanchez2

http://www.victorsanchez2.com

LISFA -rdenarUor6?I:LISFA lista; > [--LEA?- continuar9 nodo *#?odo= *#nord9 LISFA listaordenada9 ,loat ,/= ,2= ,39 /* Uara com#arar los 6?I de di,erente lon(itud */ i, :ListaVacia:Dlista; @@ SI; return ?GLL9 Iniciali aLista:Dlistaordenada;9 /* 3etemos el #rimer elemento */ -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 listaordenada @ #?odo9 lista @ lista1+ne<t9 /* Se(uimos con los demas */ $hile :ListaVacia:Dlista; L@ SI; > #nord @ listaordenada9 continuar @ SI9 i, :strlen:::UE0S-?A *; :lista1+in,o;;1+6?I; L@ strlen:::UE0S-?A *; :#nord1+in,o;;1+6?I;; > $hile :continuar @@ SI; > ,/ @ ato,:::UE0S-?A *; :lista1+in,o;;1+6?I;9 ,2 @ ato,:::UE0S-?A *; :#nord1+in,o;;1+6?I;9 ,3 @ ato,:::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+6?I;9 /* Si estamos al #rinci#io... */ i, ::#nord @@ listaordenada; DD :,/*,2;; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 #?odo1+ne<t @ listaordenada9 listaordenada @ #?odo9 continuar @ ?-9 C else i, :#nord1+ne<t @@ ?GLL; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C else i, :,/ * ,3; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C #nord @ #nord1+ne<t9 C C $hile :continuar @@ SI; > /* &om#ro"amos si estamos al #rinci#io y es menor */ i, ::#nord @@ listaordenada; DD :strcm# :::UE0S-?A *; :lista1+in,o;;1+6?I= ::UE0S-?A *; :#nord1+in,o;;1+6?I; * 2;; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 #?odo1+ne<t @ listaordenada9 listaordenada @ #?odo9 continuar @ ?-9

.I

VctorSanchez2

http://www.victorsanchez2.com

C /* &om#ro"amos Hue no estemos al ,inal */ else i, :#nord1+ne<t @@ ?GLL; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C /* En los demas casos */ else i, :strcm#:::UE0S-?A *; :lista1+in,o;;1+6?I= ::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+6?I; * 2; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C #nord @ #nord1+ne<t9 C /* Ein: $hile :continuar @@ SI; */ lista @ lista1+ne<t9 C /* Ein: $hile :ListaVacia:Dlista; L@ SI; */ return listaordenada9 C /********************************************************************* * Euncion: LISFA -rdenarUorEdad:LISFA lista; * * I?: Gna lista con los datos de todas las #ersona. * -GF: Gna nue%a lista con las #ersonas ordenadas #or edad. * 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or edad. * Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si "ien * los #unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo * los mismos. * **********************************************************************/ LISFA -rdenarUorEdad:LISFA lista; > [--LEA?- continuar9 nodo *#?odo= *#nord9 LISFA listaordenada9 i, :ListaVacia:Dlista; @@ SI; return ?GLL9 Iniciali aLista:Dlistaordenada;9 /* 3etemos el #rimer elemento */ -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 listaordenada @ #?odo9 lista @ lista1+ne<t9 /* Se(uimos con los demas */ $hile :ListaVacia:Dlista; L@ SI; > #nord @ listaordenada9 continuar @ SI9 $hile :continuar @@ SI; > /* &om#ro"amos si estamos al #rinci#io y es menor */ i, ::#nord @@ listaordenada; DD :::UE0S-?A *; :lista1+in,o;;1+edad * ::UE0S-?A *; :#nord1+in,o;;1 +edad;; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 #?odo1+ne<t @ listaordenada9 listaordenada @ #?odo9

I+

VctorSanchez2

http://www.victorsanchez2.com

continuar @ ?-9 C /* &om#ro"amos Hue no estemos al ,inal */ else i, :#nord1+ne<t @@ ?GLL; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C /* En los demas casos */ else i, :::UE0S-?A *; :lista1+in,o;;1+edad * ::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+edad; > -"tener?odo:D#?odo;9 #?odo1+in,o @ lista1+in,o9 InsertaElemento:Dlistaordenada= #?odo= #nord;9 continuar @ ?-9 C #nord @ #nord1+ne<t9 C lista @ lista1+ne<t9 C return listaordenada9 C /********************************************************************* * Euncion: LISFA LeerUersonas:char *nom"reEichero; * * I?: ?om"re del ,ichero de donde de"emos leer los datos. * -GF: Gna lista con los datos= o E00-0 si no lo hemos conse(uido. * 3A.E: Lee de un ,ichero de te<to :una linea #or #ersona; y (enera la lista * enla ada con los datos leidos= en el orden en el Hue ,i(ura"an en el * ,ichero. * **********************************************************************/ LISFA LeerUersonas:char *nom"reEichero; > EILE *#tr9 char linea73A45LE?XFZ89 UE0S-?A *#Uersona9 nodo *#?odo= *#,inal9 LISFA lista9 i, :Lnom"reEichero; return E00-09 /* A"rimos el archi%o #ara lectura */ #tr @ ,o#en:nom"reEichero= ArA;9 i, :L#tr; > ,#rint,:stderr=ABnError al leer el archi%o dado= #or ,a%or re%ise rutas y #ermisos.A;9 return E00-09 C /* Sacamos la in,ormacion */ i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL; return ?GLL9 /* [uscamos los #osi"les erroes Hue se #uedan #roducir en los datos */ ErroresLineaUersonas:linea;9 i, :L-"tenerUersona:D#Uersona;; return ?GLL9 sscan,:linea= AMsBtMsBMdBtMsBnA=#Uersona1+nom"re= #Uersona1+a#ellido= D#Uersona1+edad= #Uersona1+6?I;9 i, :-"tener?odo:D#?odo; @@ E00-0; return ?GLL9 #?odo1+in,o @ #Uersona9

I*

VctorSanchez2

http://www.victorsanchez2.com

lista @ #?odo9 #,inal @ lista9 /* Sacamos los demas */ $hile :,(ets:linea= 3A45LE?XFZ= #tr; L@ ?GLL; > ErroresLineaUersonas:linea;9 i, :L-"tenerUersona:D#Uersona;; return ?GLL9 sscan,:linea= AMsBtMsBMdBtMsBnA= #Uersona1+nom"re= #Uersona1+a#ellido= D#Uersona1+edad= #Uersona1+6?I;9 i, :-"tener?odo:D#?odo; @@ E00-0; return ?GLL9 #?odo1+in,o @ #Uersona9 InsertaElemento:Dlista= #?odo= #,inal;9 #,inal @ #?odo9 C ,close:#tr;9 return lista9 C /********************************************************************* * Euncion: ESFA6- -"tenerUersona:UE0S-?A **##Uersona; * * I?: Uuntero a #untero a una estructura de ti#o UE0S-?A. * -GF: [IE? si se ha conse(uido reser%ar memoria= E00-0 si no #odemos. * 3A.E: -"tenemos memoria #ara una #ersona. * **********************************************************************/ ESFA6- -"tenerUersona:UE0S-?A **##Uersona; > i, :L##Uersona; return E00-09 i, ::*##Uersona @ :UE0S-?A *; malloc:si eo,:UE0S-?A;;; @@ ?GLL; > ,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria insu,iciente.BnA;9 return E00-09 C i, :::*##Uersona;1+nom"re @ :char *; malloc:L-?X5?-3 * si eo,:char;;; @@ ?GLL; > ,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria insu,iciente.BnA;9 return E00-09 C i, :::*##Uersona;1+a#ellido @ :char *; malloc:L-?X5?-3 * si eo,:char;;; @@ ?GLL; > ,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria insu,iciente.BnA;9 return E00-09 C Iniciali aLista:D:*##Uersona;1+ami(os;9 return [IE?9 C /********************************************************************* * Euncion: UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista; * * I?: 6?I de la #ersona y la lista donde de"emos "uscar. * -GF: 6e%ol%emos la #ersona si la encontramos= ?GLL si no la hemos hallado. * 3A.E: [usca a una #ersona #or su 6?I en una lista. * **********************************************************************/ UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista; >

I2

VctorSanchez2

http://www.victorsanchez2.com

i, :L6?I; return ?GLL9 i, :ListaVacia:Dlista; @@ SI; return ?GLL9 $hile :ListaVacia:Dlista; L@ SI; > /* Vamos com#arando el 6?I Hue nos dan con los de la lista */ i, :strcm#:6?I= ::UE0S-?A *; :lista1+in,o;;1+6?I; @@ 2; return :UE0S-?A *; lista1+in,o9 lista @ lista1+ne<t9 C ,#rint,:stderr=ABnEl 6?I Ms no se encuentra en el archi%o de #ersonas.A=6?I;9 ,#rint,:stderr=ABn0e%ise el ,ichero si Huiere %er todo correctamente.BnA;9 return ?GLL9 C /********************************************************************* * Euncion: ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista; * * I?: ?om"re del ,ichero donde de"en estar los ami(os y una lista. * -GF: * 3A.E: Lee de un ,ichero de te<to con las de#endencias de ami(os en el orden * en el Hue ,i(ura"an en el ,ichero. * **********************************************************************/ ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista; > [--LEA?- continuar= ,inEichero @ ?-9 EILE *#tr9 char *linea= 6?I7/28= *#&har= *#Li"erador9 UE0S-?A *#Uersona @ ?GLL= *#Ami(o @ ?GLL9 linea @ :char *; malloc:3A45LE?XFZ * si eo,:char;;9 #Li"erador@linea9 /* A"rimos el archi%o #ara lectura. */ #tr @ ,o#en:nom"reEichero= ArA;9 i, :L#tr; > ,#rint,:stderr=ABnError al leer el archi%o dado= #or ,a%or re%ise rutas y #ermisos.A;9 ,ree:#Li"erador;9 return E00-09 C /* Sacamos la in,ormacion del archi%o. */ i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL; ,inEichero @ SI9 /* Vemos si hay errores en el 6?I y mostramos al usuario el corres#ondiente mensaSe de alarma :sin terminar el #ro(rama; */ ErroresLinea6?I:linea;9 $hile :,inEichero L@ SI; > continuar @ ?-9 /* Sacamos el #rimer 6?I. */ i, ::#&har @ strchr:linea= JBtJ;; L@ ?GLL; > sscan,:linea= AMsBtA= 6?I;9 /* -"tenemos los ami(os */ linea @ #&har I /9 continuar @ SI9 C /* [uscamos la #ersona a la Hue se re,iere. */ i, :continuar @@ SI; i, ::#Uersona @ [usca6?IUersona:6?I= lista;; @@ ?GLL; ,#rint,:stderr=ABnSe omitira la lista de ami(os del 6?I erroneo.BnA;9 else

I-

VctorSanchez2
>

http://www.victorsanchez2.com

/* Actuamos con ella.*/ $hile ::#&har @ strchr:linea= JBtJ;; L@ ?GLL; > sscan,:linea= AMsBtA= 6?I;9 /* ?o #ueden tener el mismo 6?I la #ersona y el ami(o */ i, :*:#Uersona1+6?I; @@ *6?I; > ,#rint,:stderr=ABnGna #ersona no #uede ser su #ro#io ami(o.A;9 ,#rint,:stderr=ABnEl 6?I Ms es el mismo.A= 6?I;9 /*return E00-09*/ C linea @ #&har I /9 i, ::#Ami(o @ [usca6?IUersona:6?I= lista;; L@ ?GLL; i, :L3eter&ontenido:D:#Uersona1+ami(os;= :%oid *; #Ami(o;; > ,#rint,:stderr=ABnError al alocar memoria dinamica.BnA;9 ,ree:#Li"erador;9 return E00-09 C C /* Gltimo 6?I de la linea */ sscan,:linea= AMsBnA= 6?I;9 i, ::#Ami(o @ [usca6?IUersona:6?I= lista;; L@ ?GLL; i, :L3eter&ontenido:D:#Uersona1+ami(os;= :%oid *; #Ami(o;; > ,#rint,:stderr=ABnError al alocar memoria dinamica.BnA;9 ,ree:#Li"erador;9 return E00-09 C C i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL; ,inEichero @ SI9 else ErroresLinea6?I:linea;9 C /* Ein: $hile :,inEichero L@ SI; */ ,ree:#Li"erador;9 ,close:#tr;9 return [IE?9 C /********************************************************************* * Euncion: ESFA6- Al(oritmo:LISFA *lista; * * I?: * -GF: * 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario. * **********************************************************************/ ESFA6- Al(oritmo:LISFA *lista; > UE0S-?A *#Uersona9 char comando= 6?I7/28 @ AA= a#oyo7/28 @ AA9 nodo *#?odo9 LISFA listadea#oyo9 ,#rint,:stdout= ABn&ommando :h #ara la ayuda; 1+BtA;9 ,,lush:stdin;9 ,(ets:Dcomando= L-?XIFG6= stdin;9 /* Leemos la o#cion del usuario */ ,#rint,:stdout=ABnA;9 $hile ::comando L@ J^J; DD :comando L@ JHJ;; > i, :*lista @@ ?GLL; /* Si ya no e<iste nin(un nodo en la lista. */ > ,#rint,:stdout=ABnSe han eliminado todas las #ersonas de la lista.A;9

I@

VctorSanchez2

http://www.victorsanchez2.com

,#rint,:stdout=ABnIm#osi"le reali ar mas o#eraciones.A;9 /* Ferminamos #orHue ya no #odemos hacer nin(una otra cosa. */ return [IE?9 C s$itch :comando; > case JaJ: case JAJ: listadea#oyo @ -rdenarUor?om"re:*lista;9 Im#rimeLista:listadea#oyo;9 Li"eraLista:Dlistadea#oyo;9 "reaQ9 case J"J: case J[J: listadea#oyo @ -rdenarUorA#ellido:*lista;9 Im#rimeLista:listadea#oyo;9 Li"eraLista:Dlistadea#oyo;9 "reaQ9 case JcJ: case J&J: listadea#oyo @ -rdenarUorEdad:*lista;9 Im#rimeLista:listadea#oyo;9 Li"eraLista:Dlistadea#oyo;9 "reaQ9 case JdJ: case J6J: listadea#oyo @ -rdenarUor6?I:*lista;9 Im#rimeLista:listadea#oyo;9 Li"eraLista:Dlistadea#oyo;9 "reaQ9 case J#J: case JeJ: case JEJ: Im#rimirListaAmi(os:*lista;9 "reaQ9 case J,J: case JEJ: ,#rint,:stdout=ABnUor ,a%or introdu ca el 6?I de la #ersona a eliminar1+A;9 ,(ets:a#oyo= //= stdin;9 sscan,:a#oyo= AMsBnA= 6?I;9 /* [uscamos a al(uien con el 6?I dado */ i, ::#Uersona @ [usca6?IUersona:6?I= *lista;; @@ ?GLL; ,#rint,:stderr=ABn6?I no encontrado= ?adie ha sido eliminadoBnA;9 else > $hile::#Uersona @ [usca6?IUersona:6?I= *lista;; L@ ?GLL; > /* -"tenemos el nodo de la #ersona */ i, ::#?odo @ [uscaUersona:#Uersona= *lista;; @@ ?GLL; return E00-09 /* Eliminamos la #ersona de todos los lu(ares y nodos */ 0esol%er6e#endencias:lista= #Uersona;9 i, :LEliminaElemento:lista= #?odo;; return E00-09 ,#rint,:stdout=ABn6?I encontrado= se eliminara a Ms MsBnA= #Uersona1+nom"re= #Uersona1+a#ellido;9 i, :LLi"eraUersona::%oid *; #Uersona;; > ,#rint,:stderr= ABnError= no se ha #odido eliminar a la #ersona.A;9 return E00-09

IA

VctorSanchez2
C C C "reaQ9

http://www.victorsanchez2.com

case JhJ: case JZJ: ,#rint,:stdout=ABn-rdenar #or nom"re: JaJA;9 ,#rint,:stdout=ABn-rdenar #or a#ellido: J"JA;9 ,#rint,:stdout=ABn-rdenar #or edad: JcJA;9 ,#rint,:stdout=ABn-rdenar #or 6?I: JdJA;9 ,#rint,:stdout=ABnLista de ami(os: JeJA;9 ,#rint,:stdout=ABnEliminar una #ersona: J,JA;9 ,#rint,:stdout=ABnFerminar: JHJBnA;9 "reaQ9 de,ault: ,#rint,:stderr= ABn&omando incorrecto.BnA;9 C /* Ein: s$itch :comando; */ ,#rint,:stdout= ABn&ommando :h #ara la ayuda; ,,lush:stdin;9 ,(ets:Dcomando= L-?XIFG6= stdin;9 ,#rint,:stdout=ABnA;9 C /* Ein: !hile... */ return [IE?9 C /********************************************************************* * Euncion: ESFA6- ErroresLineaUersonas:char *linea; * * I?: * -GF: * 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario. * **********************************************************************/ ESFA6- ErroresLineaUersonas:char *linea; > char nom"re73A45L-?X8= a#ellido73A45L-?X8= edad73A45L-?X8= dni73A45L-?X89 int i@29 /* [uscamos todos los errores #osi"les Hue #ueda ha"er en la linea */ sscan,:linea=AMs Ms Ms MsA= nom"re= a#ellido= edad= dni;9 i, :strlen:nom"re; + 3A45&A0A&FE0ES; ,#rint,:stderr=ABnEl nom"re Ms es demasiado lar(o.A=nom"re;9 i, :strlen:a#ellido; + 3A45&A0A&FE0ES; ,#rint,:stderr=ABnEl a#ellido Ms es demasiado lar(o.A=a#ellido;9 i, :strlen:edad; + 2; ,#rint,:stderr=ABnLa lon(u(itud de la edad Ms de"e estar entre / y 2A=edad;9 ErroresLinea6?I:dni;9 i, :edad @@ A2A; ,#rint,:stderr=ABnLa edad de una #ersona no #uede ser 2. 0e%ise el ,icheroA;9 ,or :i@29 edad7i8 L@ JB2J9 iII; > i, :Lisdi(it:edad7i8;; ,#rint,:stderr=ABnLa edad Ms no es correcta.A= edad;9 C return [IE?9 C /********************************************************************* * Euncion: ESFA6- ErroresLinea6?I:char *linea; * * I?: * -GF: * 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario. 1+BtA;9

IB

VctorSanchez2

http://www.victorsanchez2.com

* **********************************************************************/ ESFA6- ErroresLinea6?I:char *linea; > int i@2= S@29 int &harErroneo@29 $hile ::linea7S8 L@ JBnJ; DD :linea7S8 L@ JB<2J;; > ,or :i@2=S@S9 :linea7S8 L@ JBtJ;DD:linea7S8 L@ JBnJ;DD:linea7S8 L@ JB<2J;9 iII=SII; > i, :Lisdi(it:linea7S8;; &harErroneoII9 C i, :&harErroneo; /* Si se ha encontrado al(un caracter erroneo */ > ,#rint,:stderr=ABnSe han encontrado Md caracteres erroneos=A=&harErroneo;9 ,#rint,:stderr=ABnse omitiran los 6?I Hue no sean correctos.A;9 C i, : :i L@ 7; DD :i L@ R; ; > ,#rint,:stderr=ABnEl 6?I leido no tiene la lon(itud adecuada.A;9 ,#rint,:stderr=ABn0e%ise el ,ichero #ara e%itar #ro"lemas.A;9 C /* Saltamos el ta"ulador */ i, :linea7S8 @@ JBtJ; SII9 &harErroneo @ 29 /* Iniciali amos #ara %ol%er a em#e ar si es necesrio */ C return [IE?9 C

B.main.c
/********************************************************************** * Autor: Victor Sanche 2 * !e": htt#://$$$.%ictorsanche 2.com * &orreo: %ictorsanche 2'(mail.com * 3aQe: Lee de un archi%o de te<to= el cual es reci"ido como un ar(umento * Hue introduce el usuario= e inserta los datos de las di,erentes #ersonas * dentro de una lista. * El ,ormato del archi%o del Hue se leeran los datos es: * nom"reBta#ellidoBtBedadBt6?IBn * 6e un se(undo :#asado como ar(umento si(uiente al anterior; archi%o * se leen los 6?I de las #ersonas a las cuales se le asi(naran los * ami,os. El ,ormato es: * 6?I5UersonaBt6?I5Ami(oBt6?I5Ami(o2...Bt6?I5Ami(o?Bn * En #rimer lu(ar encontramos el 6?I de una #ersona y lue(o los 6?I de * sus ami(os. * El #ro(rama crea una lista en la Hue #odremos ordenar las #ersonas * #or su nom"re= a#ellido= edad o 6?I. Fam"ien e<iste una o#cion #ara * mostrar los ami(os de cada #ersona y otra #ara eliminar a al(uien * escri"iendo su 6?I. * *************************************************************/ )include )include )include )include Alista.hA A#ersona.hA Ati#os.hA *stdio.h+

%oid ayuda:%oid;9 LISFA lista @ ?GLL9

IC

VctorSanchez2

http://www.victorsanchez2.com

int main:int ar(c= char *ar(%78; > /* &om#ro"amos el numero de #arametros */ i, :ar(c L@ 3; > ayuda:;9 return E00-09 C i, ::lista @ LeerUersonas:ar(%7/8;;@@?GLL; > ,#rint,:stderr=ABnError al leer el archi%o de #ersonas= #or ,a%or re%iselo.BnA;9 Li"erarListaUersonas:Dlista;9 return E00-09 C i, :LLeerAmi(os:ar(%728= lista;; > ,#rint,:stderr=ABnError al leer el archi%o de ami(os= re%iselo.BnA;9 Li"erarListaUersonas:Dlista;9 return E00-09 C

#or ,a%or

i, :LAl(oritmo:Dlista;; > ,#rint,:stderr=ABnZa ocurrido un error (ra%e= se ,inali ara el #ro(rama.BnA;9 Li"erarListaUersonas:Dlista;9 return E00-09 C Li"erarListaUersonas:Dlista;9 return [IE?9 C /********************************************************************** * Euncion: %oid ayuda:; * * I?: * -GF: * 3A.E: 3uestra un mensaSe al usuario #ara Hue introdu ca correctamente * los archi%os de las #ersonas y los ami(os. * **********************************************************************/ %oid ayuda:; > ,#rint,:stderr=ABnGso del #ro(rama: *eSecuta"le+ *,ichero5#ersonas+ *,ichero5ami(os+.BnA;9 C

%stilo de programaci&n: %s especialmente importante el control de errores: es 'ustificable (ue un programa no admita )alores muy grandes de los datos* pero no es 'ustificable (ue el programa tenga un comportamiento an&malo con dic!os )alores. +or e'emplo en el e'ercicio , podra comprobarse (ue el n-mero N no supere una cantidad dada. lo err&neo sera (ue el usuario pusiese por e'emplo N/011111 y el programa 2cascase3 o se (uedase 3colgado3.

I.

VctorSanchez2

http://www.victorsanchez2.com

II

You might also like