Está en la página 1de 101

VctorSanchez2 http://www.victorsanchez2.

com
Ejercicios y prcticas resuletas sobre
PROGRAMACIN AVANZADA EN
Copyright (c) 2008 Vctor Snchez Snchez.
Permission is granted to copy, distribte and!or modi"y this
docment nder the terms o" the #$% &ree 'ocmentation (icense,
Version ).* or any +ater ,ersion pb+ished by the &ree So"t-are
&ondation. -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 'ocmentation (icense6.
000
1his program is "ree so"t-are7 yo can redistribte it and!or
modi"y it nder the terms o" the #$% #enera+ Pb+ic (icense as
pb+ished by the &ree So"t-are &ondation, either ,ersion * o" the
(icense, or any +ater ,ersion.
1his program is distribted in the hope that it -i++ be se"+,
bt 8/19:%1 5$; 85<<5$1;. -ithot e,en the imp+ied -arranty o"
=><C95$153/(/1; or &/1$>SS &:< 5 P5<1/C%(5< P%<P:S>. See the #$%
#enera+ Pb+ic (icense "or more detai+s.
;o sho+d ha,e recei,ed a copy o" the #$% #enera+ Pb+ic
(icense a+ong -ith this program. /" not, see
?http7!!---.gn.org!+icenses!@.
!a "ocumentaci#n y los pro$ramas %ue"an licencia"os bajo las licencias &'(! y &)!.
Versi#n *.+ ,-+**+./
0utor: Vctor Snchez
2
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
VctorSanchez2 http://www.victorsanchez2.com
2
Los nmeros introducidos son:
5
7
2
El mayor es el 7.
El menor es el 2.
/*********************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
*
**********************************************************/

)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)de,ine -. /
)de,ine E00 1/222/
)de,ine 3A456I3 /22
int enteros73A456I389 /* Array #ara (uardar los enteros */
int num5total9
int lectura:%oid;9
int sacar#antalla:int ma<= int min= int num5total;9
int calcular:int *ma<= int *min= int total;9
int es5di(ito:char caracter78;9
int main:;
>
int menor9 /* ?umero menor */
int mayor9 /* ?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

-
VctorSanchez2 http://www.victorsanchez2.com
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;
numeros7n8 @ J2J9
#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,:ABnIntroduca 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 realiado 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 inicialiamos */

,or :n @ /9 n * total9 nII;
>
@
VctorSanchez2 http://www.victorsanchez2.com
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

,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
/*********************************************************
* 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#eamos 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;
>
A
VctorSanchez2 http://www.victorsanchez2.com
#rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9
#rint,:AEs demasiado (rande. Introduca 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,:ABnIntroduca 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
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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 -. /
B
VctorSanchez2 http://www.victorsanchez2.com
)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
/*****************************************************************************
* 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 /* Inicialiamos el %alor de la cadena */
$hile :L,eo,:,#;;
>
,(ets:cad= 3A456I3= ,#;9
mayor5cad @ mayor:mayor5cad= :int; strlen:cad;;9
C

C
VctorSanchez2 http://www.victorsanchez2.com
return mayor5cad9
C
/*****************************************************************************
* Euncion: %oid ayuda:%oid;
*
* I?:
* -GF: 3ensaSe de ayuda #ara el usuario.
* 3A.E: 3uestra ayuda al usuario #ara Hue introduca 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:
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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
*
* 3A.E: Este #ro(rama realia la a#ro<imacion al numero e.
* Lo hemos realiado 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
.
VctorSanchez2 http://www.victorsanchez2.com
* 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
/*********************************************************
* 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
I
VctorSanchez2 http://www.victorsanchez2.com

do >
#rint,:ABnIntroduca 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 introduca un %alor %alidoLLL BnA;9
C
C $hile :continuar L@ -.;9
return -.9
C
/*********************************************************
* Euncion: ,loat calcular:,loat terminos;
*
* I?: ?umero de terminos #ara realiar 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

*+
VctorSanchez2 http://www.victorsanchez2.com
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;
>
int i9
int num @ 29
int ran(o9
/* Si la cadena esta %acVa */
i, :caracter728 @@ 2;
return E009
i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */
>
i @ /9
/* Em#eamos 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
**
VctorSanchez2 http://www.victorsanchez2.com
#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,:ABnIntroduca 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.
/*****************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 crearta"la:int **#ta"la= int *numero;9
int rellenarta"la:int *ta"la= int numero;9
int controldeerrores:int numero;9
int calcular:int *ta"la= int numero= int *ma<= int *min;9
int mostrar%alores:int *ta"la= int numero= int ma<= int min;9
int es5di(ito:char caracter78;9
int *ta"la @ ?GLL9
int numero= ma<= min9
*2
VctorSanchez2 http://www.victorsanchez2.com
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 introduca 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 * sieo,:int;;9

i, :*#ta"la @@ ?GLL;
return E009

return -.9
C
/
******************************************************************************
* 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 introduca el usuario
*
*****************************************************************************/
int rellenarta"la:int *ta"la= int numero;
>

int i= continuar9
char num73A456I389
#rint,:AUor ,a%or introduca los numeros: BnA;9
,or :i @ 29 i * numero9 IIi;
>
*-
VctorSanchez2 http://www.victorsanchez2.com
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

return -.9
C
/
******************************************************************************
* 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

*@
VctorSanchez2 http://www.victorsanchez2.com
#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#eamos 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. Introduca 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,:ABnIntroduca 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:
*A
VctorSanchez2 http://www.victorsanchez2.com
?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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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.
*
*****************************************************************************/
)include *stdio.h+
)include *alloc.h+
)include *stdli".h+
)include *strin(.h+
)de,ine 3A45L-?X5?IE /2 /* Lon(itud ma<ima del ?IE */
)de,ine 3A4LE? R2 /* Lon(itud ma<ima de las cadenas Hue leemos */
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 Leer6atos:UE0S-?A *##;9
*B
VctorSanchez2 http://www.victorsanchez2.com
%oid 3ostrar6atos:UE0S-?A *;9
status Es6i(ito:char *caracter;9
status &adenaVacia:char caracter78;9
int UasaAEntero:char caracter78= int ma<imo;9
status Li"erarUersona:UE0S-?A *;9
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,:AIntroduca los datos de la #ersona:BnA;9
#rint,:ABn?om"re: A;9
(ets:tem#;9
##1+nom"re @ :char *; malloc::strlen:tem#; I /; * sieo,:char;;9
i, :&adenaVacia:tem#; @@ -.;
return E009
else i, :strlen:tem#; + L-?X5&A6E?A;
>
#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 /; * sieo,: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,:AIntroduca un a#ellido unicamente y no deSe es#acios.A;9
return E009
C
*C
VctorSanchez2 http://www.victorsanchez2.com
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
#rint,:ABnA#ellido: MsA= ##1+a#ellido;9
#rint,:ABn?IE: MsA= ##1+ni,;9
#rint,:ABnEdad: MdA= ##1+edad;9
C
/*********************************************************
* 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;
*.
VctorSanchez2 http://www.victorsanchez2.com
>
#rint,:ABnIntroduca 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;
>
#rint,:ABn6ato erroneo.A;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 /* 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
*I
VctorSanchez2 http://www.victorsanchez2.com
* -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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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
* 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 *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *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
2+
VctorSanchez2 http://www.victorsanchez2.com
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.
* 3A.E: 3uestra ayuda al usuario #ara Hue introduca 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#;
>
2*
VctorSanchez2 http://www.victorsanchez2.com
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 /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,: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
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;
22
VctorSanchez2 http://www.victorsanchez2.com
*
* 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;;
>
#rint,:ABnBnSe realio 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;
>
2-
VctorSanchez2 http://www.victorsanchez2.com
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,:ABnBnIntroduca 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
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
/*****************************************************************************
2@
VctorSanchez2 http://www.victorsanchez2.com
* 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 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32=lineaI/;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52=lineaI/;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72=lineaI/;9 #rint,:AE6A6: MdA= ##1+edad;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.
*
*****************************************************************************/
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
2A
VctorSanchez2 http://www.victorsanchez2.com
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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 reliado
* li"era la memoria de la se(unda mitad de las #ersonas e im#rime
* unicamente los datos de la #rimera mitad.
*
*****************************************************************************/
)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *conio.h+
)include *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 ayuda:%oid;9
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9
status Asi(narAmi(os:UE0S-?A *##= int *to#;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 3ostrarUersona:UE0S-?A *##= int *linea;9
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;9
status AsesinarUersonas:UE0S-?A *##= int *to#;9
status 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
2B
VctorSanchez2 http://www.victorsanchez2.com
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.
* 3A.E: 3uestra ayuda #ara Hue se introducna 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.
*
*****************************************************************************/
2C
VctorSanchez2 http://www.victorsanchez2.com
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 /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,: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#;
2.
VctorSanchez2 http://www.victorsanchez2.com
*
* 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;
>
#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;
2I
VctorSanchez2 http://www.victorsanchez2.com
>
#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 realio 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,:ABnBnIntroduca unicamente di(itos= #or ,a%or.A;9
return E009
C
return -.9
-+
VctorSanchez2 http://www.victorsanchez2.com
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= *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52= *linea;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72= *linea;9 #rint,:AE6A6: MdA= ##1+edad;9
*linea I@ 29
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
-*
VctorSanchez2 http://www.victorsanchez2.com
/*****************************************************************************
* 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
'.
: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 Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 reliado
* esto li"era la memoria de la se(unda mitad de las #ersonas e im#rime
* unicamente los datos de la #rimera mitad.
*
*****************************************************************************/
-2
VctorSanchez2 http://www.victorsanchez2.com
)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *conio.h+
)include *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 ayuda:%oid;9
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9
status Asi(narAmi(os:UE0S-?A *##= int *to#;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 3ostrarUersona:UE0S-?A *##= int *linea;9
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;9
status Li"erarArray:UE0S-?A *##= int to#;9
status Li"erarUersona:UE0S-?A *;9
status &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
#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, :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;
--
VctorSanchez2 http://www.victorsanchez2.com
>
#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 introduca 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
-@
VctorSanchez2 http://www.victorsanchez2.com
,(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 /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,: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#;
>
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
-A
VctorSanchez2 http://www.victorsanchez2.com
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;
>
#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 realio 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;
-B
VctorSanchez2 http://www.victorsanchez2.com
*
* 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,:ABnBnIntroduca 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 */
-C
VctorSanchez2 http://www.victorsanchez2.com
/* 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= *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52= *linea;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72= *linea;9 #rint,:AE6A6: MdA= ##1+edad;9
*linea I@ 29
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.
* 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
-.
VctorSanchez2 http://www.victorsanchez2.com
/*****************************************************************************
* 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
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
-I
VctorSanchez2 http://www.victorsanchez2.com
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:
ESTADO InicializaPila(PILA *pila): reserva memoria para el array de datos de la pila,
devuelve error si no ha conseguido alocar memoria.
BOOLEANO PilaVacia(PILA pila): indica si la pila est o no vaca.
BOOLEANO PilaLlena(PILA pila): indica si la pila est o no llena.
ESTADO Push(PILA *pila, TIPO_INFO_PILA a!"): introduce un elemento en la pila,
devuelve error si no ha sido posible (la pila est llena).
@+
VctorSanchez2 http://www.victorsanchez2.com
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.
3. :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.
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
@*
VctorSanchez2 http://www.victorsanchez2.com
)de,ine LA6-53A4 /22
ty#ede, struct >
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!%aa): 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!ia(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_salia(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 realiado= 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+iHuierda=
iHuierda1+nin(uno. Esta ,unci_n de"e im#lementarse con un
switch.
@2
VctorSanchez2 http://www.victorsanchez2.com
*OVI*IENTO &"#i&ien!"_"pues!"(*OVI*IENTO &"#i&ien!"): #ara un
mo%imiento dado= nos dice su o#uesto. IHuierda 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 realiamos 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:
inicialiar la #ila de mo%imientos
ultimo5mo%imiento5e<#lorado @ ?I?XG?-
salida5im#osi"le @ ?-
salida5encontrada @ es5casilla5salida:la"erinto= #osicion5actual;9
mientras Hue no se haya encontrado la salida ni salia_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
@-
VctorSanchez2 http://www.victorsanchez2.com
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
C
cheHuear si nos encontramos en la casilla de salida= en ese caso hacer
SI la %aria"le salia_enc"n!%aa
@@
VctorSanchez2 http://www.victorsanchez2.com
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,
-.tipos.h
)i,nde, 5FIU-S5Z
@A
VctorSanchez2 http://www.victorsanchez2.com
)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 inicialia la #ila como %acVa y reser%a memoria su,iciente
#ara un m`<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila: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
)include Ati#os.hA
)include Ain,o#ila.hA
)include A#ila.hA
)include *alloc.h+
)include *stdli".h+
@B
VctorSanchez2 http://www.victorsanchez2.com
)de,ine 3A45UILA /222
/* Esta ,uncion inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
i, :L:#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA *
sieo,: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
return [IE?9
C
@C
VctorSanchez2 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 A#ila.hA
)include Ati#os.hA
)include Aal(orit.hA
)include *strin(.h+
)include *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, :LInicialiaUila:D#ila;;
>
,#rint,:stderr=ABnError al inicialiar 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
C.main.c
@.
VctorSanchez2 http://www.victorsanchez2.com
)include A#ila.hA
)include Ain,o#ila.hA
)include Aal(orit.hA
)include *stdio.h+
int main:int ar(c= char *ar(%78;
>
i, :LAl(oritmo:ar(c=ar(%;;
>
,#rint,:stderr=ABnError al realiar 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
ty#ede, enum >
SI= ?-
C [--LEA?-9
@I
VctorSanchez2 http://www.victorsanchez2.com
)endi,
@.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 inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila: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 inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * sieo,:FIU-5I?E-5UILA;;9
i, :L#ila1+datos;
return E00-09
A+
VctorSanchez2 http://www.victorsanchez2.com
#ila1+to#e@1/9
return [IE?9
C
/* 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
)include Aal(orit.hA
)include *strin(.h+
A*
VctorSanchez2 http://www.victorsanchez2.com
)include *stdio.h+
ESFA6- Al(oritmo:int ar(c= char* ar(%78;
>
int i@2= lon(itud9
UILA #ila9
FIU-5I?E-5UILA dato9
i, :Lar(%; return E00-09
i, :LInicialiaUila:D#ila;;
>
,#rint,:stderr=ABnError al inicialiar 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 A#ila.hA
)include Ain,o#ila.hA
)include Aal(orit.hA
)include *stdio.h+
int main:int ar(c= char *ar(%78;
>
i, :LAl(oritmo:ar(c=ar(%;;
>
,#rint,:stderr=ABnError al realiar el al(oritmo.BnA;9
return E00-09
C
return [IE?9
C
A2
VctorSanchez2 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?6-
C ESFA6-9
ty#ede, enum >
SI= ?-
C [--LEA?-9
)endi,
A-
VctorSanchez2 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 inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila: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 realiado 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
A@
VctorSanchez2 http://www.victorsanchez2.com
int ancho9
int alto9
C LA[E0I?F-9 /* 6e,inimos el ti#o del la"erinto */
ty#ede, struct >
int <9
int y9
C &--06E?A6A9
/* 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 realiado= 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+iHuierda= iHuierda1+nin(uno.*/
3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento;9
/* Uara un mo%imiento dado= nos dice su o#uesto. IHuierda 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 realiamos el mo%imiento
es#eci,icado desde la #osicion actual.*/
&--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?F-
si(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,
AA
VctorSanchez2 http://www.victorsanchez2.com
B.pila.c
)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- InicialiaUila:UILA *#ila;
*
* I?: Uuntero a la #ila.
* -GF: Error si no se ha #odido inicialiar la #ila.
* 3A.E: Esta ,uncion inicialia la #ila como %acia y reser%a memoria
su,iciente
* #ara un ma<imo de 3A45UILA elementos en la #ila.
*
*****************************************************************************/
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * sieo,: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
AB
VctorSanchez2 http://www.victorsanchez2.com
C
/*****************************************************************************
* 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 realiados.
* 3A.E: 3ostramos los mo%imientos Hue se han realiado en el la"erinto.
*
*****************************************************************************/
ESFA6- mostrar5mo%imientos:UILA *#Uila;
>
UILA UilaAu<9
FIU-5I?E-5UILA elemento9
InicialiaUila:DUilaAu<;9
$hile :UilaVacia:#Uila; @@ ?-;
>
Uo#:#Uila= Delemento;9
Uush:DUilaAu<= elemento;9
C
$hile :UilaVacia:DUilaAu<; @@ ?-;
>
AC
VctorSanchez2 http://www.victorsanchez2.com
Uo#:DUilaAu<= Delemento;9
s$itch :elemento;
>
case A00I[A: #rint,:AArri"a1+A;9 "reaQ9
case 6E0E&ZA: #rint,:A6erecha1+A;9 "reaQ9
case A[A\-: #rint,:AA"aSo1+A;9 "reaQ9
case I]^GIE06A: #rint,:AIHuierda1+A;9 "reaQ9
C
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: ESFA6- lee5la"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;
A.
VctorSanchez2 http://www.victorsanchez2.com
return E00-09
la"erinto1+ancho @ 1/9
/* 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
AI
VctorSanchez2 http://www.victorsanchez2.com
case J<J:
case J4J: la"erinto1+ma#a7<87y8 @ c9
"reaQ9
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:
B+
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: Im#rime el la"erinto #or #antalla.
*
*****************************************************************************/
%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;
B*
VctorSanchez2 http://www.victorsanchez2.com
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
else
,#rint,:stdout= A A;9
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.
B2
VctorSanchez2 http://www.victorsanchez2.com
* -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.
*
*****************************************************************************/
[--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 realiado.
* -GF: 6e%uel%e el mo%imiento de acuerdo a nuestra #olitica.
* 3A.E: En "ase al ultimo mo%imiento Hue se ha realiado= nos dice Hue
* mo%imiento de"emos intentar ahora: nin(uno1+arri"a= arri"a1+derecha=
* derecha1+a"aSo= a"aSo1+iHuierda= iHuierda1+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: return *ultimo5mo%imiento @ 6E0E&ZA9
case 6E0E&ZA: return *ultimo5mo%imiento @ A[A\-9
case A[A\-: return *ultimo5mo%imiento @ I]^GIE06A9
case I]^GIE06A: return *ultimo5mo%imiento @ ?I?XG?-9
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. IHuierda 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: return A[A\-9
B-
VctorSanchez2 http://www.victorsanchez2.com
case 6E0E&ZA: return I]^GIE06A9
case A[A\-: return A00I[A9
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 realiar.
* -GF: La coordenada Hue se calcula con la #osicion actual y el mo%imiento.
* 3A.E: Esta ,uncion nos dice Hue coordenada tendremos si realiamos el
* mo%imiento es#eci,icado desde la #osicion actual.
*
*****************************************************************************/
&--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?F-
si(uiente5mo%imiento;
>
s$itch :si(uiente5mo%imiento;
>
case ?I?XG?-: return #osicion5actual9
case A00I[A: #osicion5actual.y119 /* Eila su#erior a la actual */
return #osicion5actual9
case 6E0E&ZA: #osicion5actual.<II9 /* &olumna si(uiente a la actual */
return #osicion5actual9
case A[A\-: #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=
B@
VctorSanchez2 http://www.victorsanchez2.com
* con una coma J=J
*
*****************************************************************************/
%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 *stdio.h+
)include Ain,o#ila.hA
)include Ala".hA
)include A#ila.hA
)include Ati#os.hA
)include Aal(orit.hA
)include 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 realiar 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*/
InicialiaUila: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
BA
VctorSanchez2 http://www.victorsanchez2.com
else
>
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,:ABnIntroduca 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 Aal(orit.hA
)include A#ila.hA
)include Ala".hA
)include Ati#os.hA
)include *stdio.h+
)include *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;
BB
VctorSanchez2 http://www.victorsanchez2.com
>
com#ara @ strcm#:ar(%728= comando;9
/* 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 realiado 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 introduca 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 '
RS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiGlan$ua$e: ESG
JH0(PTO*JETI+OS0O:P102O:P102SPA31
BC
VctorSanchez2 http://www.victorsanchez2.com
0SPA3 #ang4ES5TRA6 (t7#.48%O3T5SI9E: 1:,t& m($5an(i5#ang)ag.: ES5
TRA681El 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
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.R?:)TR/?:)TR/S)0NT
RS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiGlan$ua$e: ESGJH0(PT!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.
RS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiGlan$ua$e: ESGJH0(PT
R?:)TR/?:)TR/S)0NTRS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiG
lan$ua$e: ESGJH0(PTE3EH>>?S
R?:)TR/?:)TR/S)0NTRDLi6 Dsupport!istsMTRS)0N lan$EESGJH0( styleEP'?NJG
S>SE: *+ptN msoGansiGlan$ua$e: ESGJH0(PT*.RS)0N styleEP'?NJ: Cpt QJimes New
HomanQPT >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.
RDLi6 Dsupport!istsMTRS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiG
lan$ua$e: ESGJH0(PT2.RS)0N styleEP'?NJ: Cpt QJimes New HomanQPT
R/S)0NTR/S)0NTRDLen"i6MTRS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoG
ansiGlan$ua$e: ESGJH0(PTEscribir 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.

R?:)TR/?:)TR/S)0NTRDLi6 Dsupport!istsMTRS)0N lan$EESGJH0( styleEP'?NJG
S>SE: *+ptN msoGansiGlan$ua$e: ESGJH0(PT-.RS)0N styleEP'?NJ: Cpt QJimes New
HomanQPT )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.
R/S)0NTR/S)0NTRDLen"i6MTRS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoG
ansiGlan$ua$e: ESGJH0(PTRDLi6 Dsupport!istsMTRS)0N lan$EESGJH0( styleEP'?NJG
S>SE: *+ptN msoGansiGlan$ua$e: ESGJH0(PT@.RS)0N styleEP'?NJ: Cpt QJimes New
B.
VctorSanchez2 http://www.victorsanchez2.com
HomanQPT 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 R/S)0NTR/S)0NTRD
Len"i6MTRS)0N lan$EESGJH0( styleEP'?NJGS>SE: *+ptN msoGansiGlan$ua$e: ESG
JH0(PTHealizar un pro$rama %ue R?:)TR/?:)TR/S)0NTe insertarlos en una lista.
(icha lista se manten"r en memoria hasta la 6inalizaci#n "el pro$rama.
El 6ormato "e este 6ichero ser:
NombreUtapelli"osUte"a"Ut(N>Un
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>)ersonaUt(N>0mi$o*Ut(N>0mi$o2...Ut(N>0mi$oNUn
)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.
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
BI
VctorSanchez2 http://www.victorsanchez2.com
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 * ar(%78= int ar(c;9
ESFA6- 3ostrar&ontenidos:LISFA * #lista;9
%oid Li"era&ontenido:%oid * #contenido;9
ESFA6- Im#rime&ontenido:%oid *#contenido;9
)endi,
2.lista.h
)i,nde, 5LISFA5Z
)de,ine 5LISFA5Z
)include Ati#os.hA /* 6onde en ti#os.h estan las de,iniciones de ESFA6-
y [--LEA?- */
/* &omieno de lista.h */
ty#ede, struct ?-6- >
%oid *in,o9 /*#untero a la in,ormaci_n :(eneral; */
struct ?-6- *ne<t9 /*#untero al si(uiente nodo */
C nodo9
ty#ede, nodo *LISFA9 /*declaraci_n del ti#o LISFA */
/* Esta ,uncion inicialia la lista a una lista %acVa */
%oid InicialiaLista: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 inicialia 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
C+
VctorSanchez2 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.
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,
-.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 *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include Ati#os.hA
)include Alista.hA
)include 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;
>
C*
VctorSanchez2 http://www.victorsanchez2.com
,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.
* -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
C2
VctorSanchez2 http://www.victorsanchez2.com
#Einal@#?odo9
C
return [IE?9
C
A.lista.c
)include Alista.hA
)include AeSer.hA
)include *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include *strin(.h+
/**********************************************************************
* Euncion: %oid InicialiaLista:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: ?ada.
* 3A.E: Inicialia la lista a una lista %acia.
*
**********************************************************************/
%oid InicialiaLista: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 inicialia 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:sieo,:nodo;;; @@ ?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,icienteBnA;9
return E00-09
C
:*##n;1+in,o @ ?GLL9
C-
VctorSanchez2 http://www.victorsanchez2.com
:*##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; @@ ?-;
>
i, :#?odo @@ ?odoA[uscar;
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. */
,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutiliar
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@
VctorSanchez2 http://www.victorsanchez2.com
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.
*
**********************************************************************/
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; @@ ?-;
CA
VctorSanchez2 http://www.victorsanchez2.com
>
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 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
CB
VctorSanchez2 http://www.victorsanchez2.com
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
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
B.main.c
/
******************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 enlaada.
* 6es#ues de esto recorre la lista #ara im#rimirlas #or #antalla.
*
*****************************************************************************/
)include Alista.hA
)include Ati#os.hA
)include AeSer.hA
)include *stdio.h+
%oid ayuda:%oid;9 /* 3uestra ayuda al usuario #ara introducir las cadenas */
LISFA lista@?GLL9
int main:int ar(c= char *ar(%78;
>
/* &om#ro"amos el numero de #arametros */
i, :ar(c @@ /;
>
CC
VctorSanchez2 http://www.victorsanchez2.com
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:
* 3A.E: 3uestra un mensaSe de ayuda #ara Hue el usuario introduca 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 /* En ti#os.h estan las de,iniciones de ESFA6- y
[--LEA?- */
/* &omieno de lista.h */
ty#ede, struct ?-6- >
C.
VctorSanchez2 http://www.victorsanchez2.com
%oid *in,o9 /* Uuntero a la in,ormacion :(eneral; */
struct ?-6- *ne<t9 /* Uuntero al si(uiente nodo */
C nodo9
ty#ede, nodo *LISFA9 /* 6eclaracion del ti#o LISFA */
/* Inicialia la lista a una lista %acia. */
%oid InicialiaLista: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 inicialia 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
Hue estan 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. */
%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
/* &omieno de #ersona.h */
/* estructura #ersona */
ty#ede, struct #ersona >
CI
VctorSanchez2 http://www.victorsanchez2.com
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 enlaada 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. */
LISFA -rdenarUor6?I: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 -rdenarUorEdad:LISFA lista;9
/* li"era los nodos de una lista enlaada.*/
%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
.+
VctorSanchez2 http://www.victorsanchez2.com
/* 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,
@.lista.c
)include Alista.hA
)include *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include *strin(.h+
)include A#ersona.hA
/*********************************************************************
* Euncion: %oid InicialiaLista:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: ?ada.
* 3A.E: Inicialia la lista a una lista %acia.
*
**********************************************************************/
%oid InicialiaLista: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
.*
VctorSanchez2 http://www.victorsanchez2.com
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 inicialia 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:sieo,: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; @@ ?-;
>
/* 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
.2
VctorSanchez2 http://www.victorsanchez2.com
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. */
,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutiliar
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 */
.-
VctorSanchez2 http://www.victorsanchez2.com
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.
*
**********************************************************************/
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
.@
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 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.
*
**********************************************************************/
%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
.A
VctorSanchez2 http://www.victorsanchez2.com
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
#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
A.persona.c
)include Alista.hA
)include A#ersona.hA
)include *stdio.h+
)include *stdli".h+
)include *math.h+
)include *cty#e.h+
)include *strin(.h+
)de,ine L-?X5?-3 52
)de,ine 3A45LE?XFZ /22N
)de,ine 3A45&A0A&FE0ES 32
)de,ine 3A45L-?X 52
)de,ine 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;.
*
**********************************************************************/
.B
VctorSanchez2 http://www.victorsanchez2.com
%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 enlaada.
*
**********************************************************************/
%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
/*********************************************************************
* 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
.C
VctorSanchez2 http://www.victorsanchez2.com
#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
return [IE?9
C
/*********************************************************************
* 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
..
VctorSanchez2 http://www.victorsanchez2.com
$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
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista:Dlistaordenada;9
/* 3etemos el #rimer elemento */
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
listaordenada @ #?odo9
lista @ lista1+ne<t9
/* &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;
.I
VctorSanchez2 http://www.victorsanchez2.com
>
-"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;
>
[--LEA?- continuar9
nodo *#?odo= *#nord9
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista: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
: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
I+
VctorSanchez2 http://www.victorsanchez2.com
/* 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.
*
**********************************************************************/
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
InicialiaLista: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;
>
I*
VctorSanchez2 http://www.victorsanchez2.com
-"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
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
I2
VctorSanchez2 http://www.victorsanchez2.com
nodo *#?odo= *#nord9
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista: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
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
* enlaada con los datos leidos= en el orden en el Hue ,i(ura"an en el
* ,ichero.
*
**********************************************************************/
LISFA LeerUersonas:char *nom"reEichero;
>
EILE *#tr9
I-
VctorSanchez2 http://www.victorsanchez2.com
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
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:sieo,:UE0S-?A;;; @@ ?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,iciente.BnA;9
return E00-09
C
I@
VctorSanchez2 http://www.victorsanchez2.com
i, :::*##Uersona;1+nom"re @ :char *; malloc:L-?X5?-3 * sieo,: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 * sieo,:char;;; @@
?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,iciente.BnA;9
return E00-09
C
InicialiaLista: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;
>
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 * sieo,:char;;9
#Li"erador@linea9
/* A"rimos el archi%o #ara lectura. */
#tr @ ,o#en:nom"reEichero= ArA;9
IA
VctorSanchez2 http://www.victorsanchez2.com
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
>
/* 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
IB
VctorSanchez2 http://www.victorsanchez2.com
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
,#rint,:stdout=ABnIm#osi"le realiar 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
IC
VctorSanchez2 http://www.victorsanchez2.com
case J,J:
case JEJ:
,#rint,:stdout=ABnUor ,a%or introduca 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
C
C
C
"reaQ9
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; 1+BtA;9
,,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
I.
VctorSanchez2 http://www.victorsanchez2.com
/* [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.
*
**********************************************************************/
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 /* Inicialiamos #ara %ol%er a em#ear si es necesrio */
C
return [IE?9
C
B.main.c
/**********************************************************************
II
VctorSanchez2 http://www.victorsanchez2.com
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(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 Alista.hA
)include A#ersona.hA
)include Ati#os.hA
)include *stdio.h+
%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 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= #or ,a%or
re%iselo.BnA;9
Li"erarListaUersonas:Dlista;9
return E00-09
C
i, :LAl(oritmo:Dlista;;
>
,#rint,:stderr=ABnZa ocurrido un error (ra%e= se ,inaliara el
#ro(rama.BnA;9
Li"erarListaUersonas:Dlista;9
return E00-09
C
Li"erarListaUersonas:Dlista;9
return [IE?9
C
*++
VctorSanchez2 http://www.victorsanchez2.com
/**********************************************************************
* Euncion: %oid ayuda:;
*
* I?:
* -GF:
* 3A.E: 3uestra un mensaSe al usuario #ara Hue introduca 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.
*+*

También podría gustarte