Está en la página 1de 16

Captulo 16

EJERCIO 16.1
typedef struct
{
char candidato1[41];
long vot1;
char candidato2[41];
long vot2;
char candidato3[41];
long vot3;
} Distrito;
char* archivo = !etanca"dat;
#$%& *pf = '(%%;
)*
Cdigo fuente del programa, petanca.c, que escribe secuencialmente los
registros en el archivo Petanca.dat.
*)
void *ain+,
{
Distrito d;
int ter*ina;
pf = fopen+archivo- a.,;
if +pf == '(%%,
{
puts+'o se puedecrear el archivo",;
e/it+01,;
}
strcpy+d"candidato1-%is 1le.uche,;
strcpy+d"candidato2-!asionis 2a.itorihe,;
strcpy+d"candidato3-3ulius 4artaria,;
ter*ina = 5;
puts+$ntroducir los votos de cada candidato- ter*ina con 5 5 5,;
do {
lee6egistro+7d,;
if ++d"vot1 == 5, 77 +d"vot2 == 5, 77 +d"vot3 == 5,,
{
ter*ina = 1;
puts+#in del proceso" 8e cierra el archivo,;
}
else
f9rite+7d- si:eof+Distrito,-1- pf,;
} 9hile +;ter*ina,;
fclose+pf,;
}
2 Programacin en C. Algoritmos, estructura de datos y objetos.
void lee6egistro+Distrito* d,
{
printf +<otos para =s > - d 0? candidato1,;
scanf+=ld- 7+d 0? vot1,,;
printf +<otos para =s > - d 0? candidato2,;
scanf+=ld- 7+d 0? vot2,,;
printf +<otos para =s > - d 0? candidato3,;
scanf+=ld- 7+d 0? vot3,,;
}
)*
2@digo fuente del progra*a- cntavoto.c- Aue lee secuencial*ente
los registros del archivo Petanca.dat y cuenta los votos"
*)
Binclude Cstdli."h?
Binclude Cstdio"h?
Binclude Cstring"h?
Binclude petanca"h
void *ain+,
{
Distrito d;
int votos[3] = {5-5-5};
pf = fopen+archivo- r.,;
if +pf == '(%%,
{
puts+'o se puede leer el archivo",;
e/it+01,;
}
fread+7d- si:eof+Distrito,-1- pf,;
9hile +;feof+pf,,
{
votos[5] D= d"vot1;
votos[1] D= d"vot2;
votos[2] D= d"vot3;
fread+7d- si:eof+Distrito,-1- pf,;
}
fclose+pf,;
puts+EnEt<FGF8 D& 21D1 21'D$D1GFEn,;
printf + =s =ld> En- d"candidato1- votos[5],;
printf + =s =ld> En- d"candidato2- votos[1],;
printf + =s =ld> En- d"candidato3- votos[2],;
}
EJERCICIO 16.2
Binclude Cstdio"h?
Binclude Cstring"h?
Binclude Cstdli."h?
Binclude Cctype"h?
Organizacin de archivos de datos 3
Bdefine nu*ha. HH
#$%& *f. = '(%%;
const char fich[] = fichero"dat;
typedef struct
{
int nu*;
char nif[13];
char no*.re[4H];
} Ia.itacion;
Bdefine despla:a*iento+n, ++n 0 1, * si:eof+Ia.itacion,,
void inaguracion+void,;
void entrada+void,;
void salida+void,;
void ocupadas+void,;
void leer6es+Ia.itacion * ph,;
void escri.ir6es+Ia.itacion h,;
void *ain+,
{
char opcion;
do
{
puts+1" $naguracion,;
puts+2" &ntrada ,;
puts+3" 8alida ,;
puts+4" Fcupadas ,;
puts+H" 8alir ,;
do {
printf+&lige una opci@n ,;
scanf+=c=*c- 7opcion,;
}9hile +opcion C J1J KK opcion ? JHJ,;
s9itch +opcion,
{
case J1J>
inaguracion+,;
.reaL;
case J2J>
entrada+,;
.reaL;
case J3J>
salida+,;
.reaL;
case J4J>
ocupadas+,;
syste*+pause,;
.reaL;
}
}
9hile +opcion ;= JHJ,;
if +f. ;= '(%%, fclose+f.,;
}
4 Programacin en C. Algoritmos, estructura de datos y objetos.
void inaguracion+void,
{
Ia.itacion h;
int i;
if +f. ;= '(%%,
{
char opcion;
printf+1rchivo ya creado- M desea continuar+8)', N> ,;
scanf+=c=*c- 7opcion,;
if +toupper+opcion, ;= J'J, return;
}
f. = fopen+fich- 9.D,;
for +i = 1; i C= nu*ha.; iDD,
{
h"nu* = i;
strcpy+h"nif- *,;
f9rite+7h- si:eof+h,- 1- f.,;
}
fflush+f.,;
}
void entrada+void,
{
Ia.itacion h;
int encontrado- nh;
)* OPsAueda secuencial de pri*era ha.itaci@n li.re *)
encontrado = 5;
nh = 5;
if +f. == '(%%, f. = fopen+fich- r.D,;
fseeL+f.- 5%- 8&&QR8&G,;
9hile ++nh C nu*ha., 77 ;encontrado,
{
fread+7h- si:eof+h,- 1- f.,;
nhDD;
if +strc*p+h"nif -*, == 5, )* Ia.itaci@n li.re *)
{
encontrado = 1;
leer6es+7h,;
fseeL+f.- despla:a*iento+h"nu*,- 8&&QR8&G,;
f9rite+7h- si:eof+h,- 1- f.,;
puts+Datos gra.ados,;
}
}
if +;encontrado, puts+Iotel co*pleto ,;
fflush+f.,;
}
void salida+void,
{
Ia.itacion h;
int n;
Organizacin de archivos de datos 5
char r;
if +f. == '(%%, f. = fopen+fich- r.D,;
printf+'u*ero de ha.itacion> ,;
scanf+=d=*c-7n,;
fseeL+f.- despla:a*iento+n,- 8&&QR8&G,;
fread+7h- si:eof+h,- 1- f.,;
if +strc*p+h"nif-*, ;= 5,
{
escri.ir6es+h,;
printf+M8on correctos los datosN+8)', ,;
scanf+=c=*c-7r,;
if +toupper+r, == J8J,
{
strcpy+h"nif- *,;
fseeL+f.- 0 si:eof+h,- 8&&QR2(6,;)* se posiciona de nuevo *)
f9rite+7h- si:eof+h,- 1- f.,;
}
}
else
puts+%a ha.itacion figura co*o li.re,;
fflush+f.,;
}
void ocupadas+void,
{
Ia.itacion h;
int n;
if +f. == '(%%, f. = fopen+fich- r.D,;
fseeL+f.- 5%- 8&&QR8&G,;
puts+ 'u*ero Et '$# EtEt 'o*.re,;
puts+ ha.itacion ,;
for +n = 1 ; n C= nu*ha.; nDD,
{
fread+7h- si:eof+h,- 1- f.,;
if +strc*p+h"nif -*, ;= 5,
escri.ir6es+h,;
}
}
void leer6es+Ia.itacion *ph,
{
printf+'if> ,;
gets+ph 0? nif,;
printf+'o*.re ,;
gets+ph 0? no*.re,;
}
void escri.ir6es+Ia.itacion h,
{
printf+Et =d- h"nu*,;
printf+Et=sEt- h"nif,;
6 Programacin en C. Algoritmos, estructura de datos y objetos.
printf+Et=sEn- h"no*.re,;
}
EJERCICIO 16.3
Binclude Cstdio"h?
Binclude Cstdli."h?
Binclude Cctype"h?
Binclude Cstring"h?
Bdefine principal 1SS
Bdefine total 245
const char fich[12] = fichash"dat;
#$%& *fh = '(%%;
typedef struct
{
char codigo[T];
char autor[41];
char titulo[41];
} %i.ro;
Bdefine despla:a*iento+n, ++n, * si:eof+%i.ro,,
)* prototipo de las funciones *)
void creacion+void,;
void co*pra+void,; )* operaci@n 1lta *)
void venta+void,; )* operaci@n OaUa *)
void consulta+void,;
void colisiones+%i.ro li.,;
int inde/8inoni*o+const char c[],;
int hash+char c[],;
long transfor*a2lave+const char c[],;
void escri.ir+%i.ro li.,;
void *ain+,
{
char opcion;
)* co*prue.a si el archivo ya ha sido creado *)
fh = fopen+fich- r.,;
if +fh == '(%%,
{
puts+&% 162I$<F <1 1 8&6 26&1DF,;
creacion+,;
}
else
fh = '(%%;
do
{
puts+1" 2o*pra ,;
puts+2" <enta ,;
puts+3" 2onsulta ,;
Organizacin de archivos de datos 7
puts+H" 8alir ,;
do {
printf+&lige una opci@n ,;
scanf+=c=*c- 7opcion,;
} 9hile +opcion C J1J KK opcion ? JHJ KK opcion == J4J,;
s9itch +opcion,
{
case J1J>
co*pra+,; .reaL;
case J2J>
venta+,; .reaL;
case J3J>
consulta+,; .reaL;
}
} 9hile +opcion ;= JHJ,;
if +fh ;= '(%%, fclose+fh,;
}
)*
Creacin> escri.e consecutiva*ente total registros- todos con
el ca*po c@digo igual a J*J para indicar Aue estVn li.res"
*)
void creacion+void,
{
%i.ro li.;
int i;
fh = fopen+fich- 9.D,;
strcpy+li."codigo- *,;
for +i = 1; i C= total; iDD,
f9rite+7li.- si:eof+li.,- 1- fh,;
fclose+fh,;
fh = '(%%;
}
)*
Alta de un registro> pide al usuario los ca*pos c@digo- tWtulo
y autor" %la*a a la funci@n hash+, para o.tener la posici@n en
la Aue leer el registro- si estV li.re gra.a el nuevo registro"
8i estV ocupado .usca en el Vrea de colisiones la pri*era
posici@n li.re Aue serV donde escri.e el registro"
*)
void co*pra+void,
{
%i.ro li.- li.ar;
long posicion;
if +fh == '(%%, fh = fopen+fich- r.D,;
printf+2@digo> ,; gets+li."codigo,;
printf+1utor> ,; gets+li."autor,;
printf+GWtulo> ,; gets+li."titulo,;
8 Programacin en C. Algoritmos, estructura de datos y objetos.
posicion = hash+li."codigo,;
posicion = despla:a*iento+posicion,;
fseeL+fh- posicion- 8&&QR8&G,;
fread+7li.ar- si:eof+%i.ro,- 1- fh,;
if +strc*p+li.ar"codigo- *, == 5, )* registro li.re *)
{
fseeL+fh- 0si:eof+%i.ro,- 8&&QR2(6,;
f9rite+7li.- si:eof+%i.ro,- 1- fh,;
printf+6egistro gra.ado en la direcci@n> =ldEn-posicion,;
}
else if +strc*p+li."codigo- li.ar"codigo, == 5, )* duplicado *)
{
puts+2@digo repetido- revisar los datos",;
return;
}
else
colisiones+li.,;
fflush+fh,;
}
)*
Baja de un registro> pide el c@digo del registro" 8e lee el
registro cuya posici@n estV deter*inada por la funci@n hash+,"
8i los c@digos son iguales- se da de .aUa escri.iendo J*J en el
ca*po codigo" &n caso contrario se .usca en el Vrea de
colisiones y se procede igual"
*)
void venta+,
{
%i.ro li.ar;
char codigo[T]- r;
long posicion;
if +fh == '(%%, fh = fopen+fich- r.D,;
printf+2@digo> ,; gets+codigo,;
posicion = hash+codigo,;
posicion = despla:a*iento+posicion,;
fseeL+fh- posicion- 8&&QR8&G,;
fread+7li.ar- si:eof+%i.ro,- 1- fh,;
if +strc*p+li.ar"codigo- codigo, ;= 5,
posicion = inde/8inoni*o+codigo,;
if +posicion ;= 01,
{
escri.ir+li.ar,;
printf+M8on correctos los datosN +8)',> ,;
scanf+=c=*c-7r,;
if +toupper+r, == J8J,
{
strcpy+li.ar"codigo- *,;
Organizacin de archivos de datos 9
fseeL+fh- 0si:eof+%i.ro,- 8&&QR2(6,;
f9rite+7li.ar- si:eof+%i.ro,- 1- fh,;
}
}
else
puts+'o se encuentra un registro con ese c@digo",;
fflush+fh,;
}
)*
Consulta de un registro> pide el c@digo del registro" 8e lee el
registro cuya posici@n estV deter*inada por la funci@n hash+,"
8i los c@digos son iguales se *uestra por pantalla" &n caso
contrario se .usca en el Vrea de colisiones"
*)
void consulta+,
{
%i.ro li.;
char codigo[T];
long posicion;
if +fh == '(%%, fh = fopen+fich- r.D,;
printf+2@digo> ,; gets+codigo,;
posicion = hash+codigo,;
posicion = despla:a*iento+posicion,;
fseeL+fh- posicion- 8&&QR8&G,;
fread+7li.- si:eof+%i.ro,- 1- fh,;
if +strc*p+li."codigo- codigo, == 5,
escri.ir+li.,;
else
{
int posicion;
posicion = inde/8inoni*o+codigo,;
if +posicion ;= 01,
{
fseeL+fh- 0si:eof+%i.ro,- 8&&QR2(6,;
fread+7li.- si:eof+%i.ro,- 1- fh,;
escri.ir+li.,;
}
else
puts+'o se encuentra un eUe*plar con ese c@digo",;
}
}
)*
$nserta en rea de sinnimos> .usca secuencial*ente el pri*er
registro li.re +codigo==J*J, para gra.ar el registro li."
*)
void colisiones+%i.ro li.,
{
%i.ro li.ar;
10 Programacin en C. Algoritmos, estructura de datos y objetos.
int pos = despla:a*iento+principal,;
int U = principal;
int encontrado;
fseeL+fh- pos- 8&&QR8&G,; )* se sitPa en Vrea de sin@ni*os *)
encontrado = 5;
9hile ++U C total, 77 ;encontrado,
{
fread+7li.ar- si:eof+%i.ro,- 1- fh,;
UDD;
if +strc*p+li.ar"codigo -*, == 5, )* li.re *)
{
encontrado = 1;
fseeL+fh- 0si:eof+%i.ro,- 8&&QR2(6,;
f9rite+7li.- si:eof+%i.ro,- 1- fh,;
puts+Datos gra.ados en el Vrea de sin@ni*os",;
}
}
if +;encontrado, puts+Xrea de sin@ni*os co*pleta" ,;
fflush+fh,;
}
)*
Bsqueda en Vrea de sin@ni*os> .usca secuencial- por c@digo- de
un registro"Devuelve la posici@n Aue ocupa- o .ien 01 si no se
encuentra"
*)
int inde/8inoni*o+const char c[],
{
%i.ro li.ar;
int pos = despla:a*iento+principal,;
int U = principal;
int encontrado;
fseeL+fh- pos- 8&&QR8&G,; )* se situa en area de sin@ni*os *)
encontrado = 5;
9hile ++U C total, 77 ;encontrado,
{
fread+7li.ar- si:eof+%i.ro,- 1- fh,;
UDD;
if +strc*p+li.ar"codigo- c, == 5,
encontrado = 1;
}
if +;encontrado, U = 01;
return U;
}
)*
Aritmtica modular> transfor*a cadena a un entero en el rango
[5- principal," &n pri*er lugar pasa los caracteres del c@digo
a *ayPsculas" 1 continuaci@n- lla*a a la funci@n Aue convierte
Organizacin de archivos de datos 11
la cadena a entero largo" !or Plti*o- aplica el *@dulo respecto
a principal" &l *@dulo produce un entero de 5 a principal01"
*)
int hash+char c[],
{
int i- su*a = 5;
for +i = 5; i C strlen+c,; iDD,
c[i] = toupper+c[i],;
return transfor*a2lave+c, = principal;
}
long transfor*a2lave+const char* clave,
{
int U;
long d;
d = 5;
for +U = 5; U C strlen+clave,; UDD,
{
d = d * 2T D clave[U];
}
)*
8i d supera el *V/i*o entero largo- genera nP*ero negativo
*)
if +d C 5, d = 0d;
return d;
}
void escri.ir+%i.ro li.,
{
printf+2@digo> =sEt- li."codigo,;
printf+1utor> =sEt- li."autor,;
printf+GWtulo> =sEn-li."titulo,;
}
EJERCICIO 16.4
Binclude Cstdli."h?
Binclude Cstdio"h?
Binclude articulo"h
Binclude inde/ado"h
Bdefine 4Y16 255
$ndice ta.la[4Y16];
void escri.eGa.la+$ndice *ta.- int nreg,;
void *ain+,
{
int nu*6eg;
char opcion;
if ++fi/ = fopen+*itienda"dat- r.D,, == '(%%,
12 Programacin en C. Algoritmos, estructura de datos y objetos.
{
fi/ = fopen+*itienda"dat-9.D,;
findices = fopen+in/tienda"dat-9.,;
nu*6eg = 5;
}
else )* archivos ya e/isten" 8e vuelcan los Wndices a la ta.la *)
recupera$ndice+ta.la- 7nu*6eg,;
escri.eGa.la+ta.la- nu*6eg,;
do
{
puts+1" 1lta ,;
puts+2" OaUa ,;
puts+3" 2onsulta ,;
puts+H" 8alir ,;
do {
printf+&lige una opci@n ,;
scanf+=c=*c- 7opcion,;
} 9hile +opcion C J1J KK opcion ? JHJ KK opcion == J4J,;
s9itch +opcion,
{
case J1J>
1ltas+ta.la- 7nu*6eg,; .reaL;
case J2J>
OaUas+ta.la- 7nu*6eg,; .reaL;
case J3J>
2onsulta+ta.la- nu*6eg,; .reaL;
case JHJ>
gra.a$ndice+ta.la- nu*6eg,;.reaL;
}
} 9hile +opcion ;= JHJ,;
if +fi/ ;= '(%%, fclose+fi/,;
}
void escri.eGa.la+$ndice *ta.- int nreg,
{
int i = 5;
if +nreg ? 5,
{
puts+Ga.la de Wndices actual,;
for +;i C nreg; iDD,
printf +=s =dEn-ta.la[i]"no*.re-ta.la[i]"posicion,;
syste*+!ause,;
syste*+cls,;
}
}
Apartado 16.5.1
void fusion+#$%&* f1- #$%&* f2- #$%&* f3,
Organizacin de archivos de datos 13
{
6egistro actual1- actual2;
fread+7actual1- si:eof+6egistro,- 1- f1,;
fread+7actual2- si:eof+6egistro,- 1- f2,;
9hile +;feof+f1, 77 ;feof+f2,,
{
6egistro d;
if +actual1"clave C actual2"clave,
{
d = actual1;
fread+7actual1- si:eof+6egistro,- 1- f1,;
}
else
{
d = actual2;
fread+7actual2- si:eof+6egistro,- 1- f2,;
}
f9rite+7d- si:eof+6egistro,- 1- f3,;
}
)*
%ectura ter*inada de f1 o f2" 8e escri.en los registros no
procesados
*)
9hile +;feof+f1,,
{
f9rite+7actual1- si:eof+6egistro,- 1- f3,;
fread+7actual1- si:eof+6egistro,- 1- f1,;
}
9hile +;feof+f2,,
{
f9rite+7actual2- si:eof+6egistro,- 1- f3,;
fread+7actual2- si:eof+6egistro,- 1- f1,;
}
fclose +f3,;fclose+f1,;fclose+f2,;
}
Apartado 16.6.1
typedef int Gipo2lave;
typedef struct
{
Gipo2lave clave;
} 6egistro;
void *e:claDirecta+#$%& *f,
{
int long8ec;
int nu*6eg;
#$%& *f1 = '(%%- *f2 = '(%%;
14 Programacin en C. Algoritmos, estructura de datos y objetos.
f = fopen+fileorg-r.,;
nu*6eg = nu*ero6eg+f,;
long8ec = 1;
9hile +long8ec C nu*6eg,
{
distri.uir+f- f1- f2- long8ec- nu*6eg,;
*e:clar+f1- f2- f- 7long8ec- nu*6eg,;
}
}
void distri.uir+#$%&* f- #$%&* f1- #$%&* f2- int lon8ec- int nu*6eg,
{
int nu*8ec- resto- i;
nu*8ec = nu*6eg)+2*lon8ec,;
resto = nu*6eg=+2*lon8ec,;
f = fopen+fileorg-r.,;
f1 = fopen+file1u/1-9.,;
f2 = fopen+file1u/2-9.,;
for +i = 1; i C= nu*8ec; iDD,
{
su.8ecuencia+f- f1- lon8ec,;
su.8ecuencia+f- f2- lon8ec,;
}
)*
8e procesa el resto de registros del archivo
*)
if +resto ? lon8ec,
resto 0= lon8ec;
else
{
lon8ec = resto;
resto = 5;
}
su.8ecuencia+f- f1- lon8ec,;
su.8ecuencia+f- f2- resto,;
fclose+f1,; fclose+f2,;fclose+f,;
}
void su.8ecuencia+#$%&* f- #$%&* t- int long8ec,
{
6egistro r;
int U;
for +U = 1; U C= long8ec; UDD,
{
fread+7r- si:eof+6egistro,- 1- f,;
f9rite+7r- si:eof+6egistro,- 1- t,;
}
}
Organizacin de archivos de datos 15
void *e:clar+#$%&* f1- #$%&* f2- #$%&* f- int* lon8ec- int nu*6eg,
{
int nu*8ec- resto- s- i- U- L- n1- n2;
6egistro r1- r2;
nu*8ec = nu*6eg)+2*+*lon8ec,,; )* nP*ero de su.secuencias *)
resto = nu*6eg=+2*+*lon8ec,,;
f = fopen+fileorg-9.,;
f1 = fopen+file1u/1-r.,;
f2 = fopen+file1u/2-r.,;
fread+7r1- si:eof+6egistro,- 1- f1,;
fread+7r2- si:eof+6egistro,- 1- f2,;
for +s = 1; s C= nu*8ecD1; sDD,
{
n1 = n2 = +*lon8ec,;
if +s == nu*8ecD1,
{ )* proceso de los registros de la su.secuencia inco*pleta *)
if +resto ? +*lon8ec,,
n2 = resto 0 +*lon8ec,;
else
{
n1 = resto;
n2 = 5;
}
}
i = U = 1;
9hile +i C= n1 77 U C= n2,
{
6egistro d;
if +r1"clave C r2"clave,
{
d = r1;
fread+7r1- si:eof+6egistro,- 1- f1,;
iDD;
}
else
{
d = r2;
fread+7r2- si:eof+6egistro,- 1- f2,;
UDD;
}
f9rite+7d- si:eof+6egistro,- 1- f,;
}
)*
%os registros no procesados se escri.en directa*ente
*)
for +L = i; L C= n1; LDD,
{
f9rite+7r1- si:eof+6egistro,- 1- f,;
fread+7r1- si:eof+6egistro,- 1- f1,;
}
for +L = U; L C= n2; LDD,
16 Programacin en C. Algoritmos, estructura de datos y objetos.
{
f9rite+7r2- si:eof+6egistro,- 1- f,;
fread+7r2- si:eof+6egistro,- 1- f2,;
}
}

+*lon8ec, *= 2;
fclose +f,;fclose+f1,;fclose+f2,;
}

También podría gustarte