UTNianos

Versión completa: [Algoritmos y Estructuras de Datos]Ayuda con ejercicio 29 de la guía de los 83 ejs.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola a todos!
Tengo dudas con la resolución del siguiente ejercicio:

Ejercicio Nro. 29:

Dado el archivo ALUMNOS.DAT con los datos personales de alumnos ordenado por legajo, donde cada registro contiene:
a) Nro. de legajo (7 dígitos) b) Apellido y nombres (30 caracteres) c) Domicilio (30 caracteres)
d) Código postal (4 dígitos) e) Teléfono (10 caracteres) f) Año de ingreso (4 dígitos)
y otro con el mismo orden que el mencionado llamado NOVEDAD.DAT, con las actualizaciones (altas, bajas y modificaciones) a ser aplicadas, donde cada registro contiene además de todos los campos de ALUMNOS.DAT un código de operación ('A'= Alta, 'B'= Baja, 'M'= Modificación).
Desarrollar el programa que actualice el archivo ALUMNOS.DAT con los registros de NOVEDAD.DAT y obtenga el archivo actualizado ALUMACTU.DAT.


Mi problema es que no sé con qué criterios realizar el apareo de los dos archivos. Espero puedan ayudarme =) Muchas Gracias!
Es que en realidad no vendría a ser un apareo propiamente dicho, vendría a ser algo más complejo que eso; dado que no estás combinando dos archivos en uno, sino que estás leyendo uno y comparando con otro vas subiendo una nueva versión del que ya tenías.

La forma de laburar con esto vendría a ser leer un registro de cada uno, y ver si coinciden. De no coincidir, en caso de que el registro de NOVEDAD tenga una "A", moverlo a ALUMACTU; caso contrario se mueve el registro de ALUMNOS a ALUMACTU. Pero si coinciden (seguramente ya tendría el alta, por lo que solo analizás si lo modifica o lo vuela) y tiene una "M", subis el de NOVEDAD a ALUMACTU, si tiene una "B", seguis de largo y lees los próximos registros de los dos archivos.

Cualquier cosa seguí preguntando, en lo preliminar calculo que esto te puede ayudar.
Éxitos!
No lo entiendo muy bien, este es el código en Pascal:



while (leoAlumnos = 'si') and (leoNovedad = 'si') do
begin
if ra.nl = rn.nl then
begin
if rn.codigo = 'm' then
begin
raux.nl := rn.nl;
raux.nya := rn.nya;

write(archivoActualizado, raux)
end;

leerAlumnos(archivoAlumnos, ra, leoAlumnos);
leerNovedad(archivoNovedad, rn, leoNovedad);
end
else
begin
if rn.codigo = 'a' then
begin
raux.nl := rn.nl;
raux.nya := rn.nya;

write(archivoActualizado, raux)
end

else write(archivoActualizado, ra);

end;
end;



Lo resolví! No sé si es la forma más eficiente, pero creo que probé todos los casos posibles que se me ocurrieron y funcionó...
Ahí va el código:


leoAlumnos := 'si';
leoNovedad := 'si';
leerAlumnos(archivoAlumnos, ra, leoAlumnos);
leerNovedad(archivoNovedad, rn, leoNovedad);



while (leoAlumnos = 'si') and (leoNovedad = 'si') do
begin
writeln('entre');
if ra.nl = rn.nl then
begin
if rn.codigo = 'm' then
begin
raux.nl := rn.nl;
raux.nya := rn.nya;


write(archivoActualizado, raux)
end;

leerAlumnos(archivoAlumnos, ra, leoAlumnos);
leerNovedad(archivoNovedad, rn, leoNovedad);
end
else
begin
if rn.codigo = 'a' then
begin
if rn.nl > ra.nl then
begin
write(archivoActualizado, ra);
leerAlumnos(archivoAlumnos, ra, leoAlumnos)
end;

raux.nl := rn.nl;
raux.nya := rn.nya;

write(archivoActualizado, raux) ;
leerNovedad(archivoNovedad, rn, leoNovedad);

end

else
begin
write(archivoActualizado, ra);

leerAlumnos(archivoAlumnos, ra, leoAlumnos)
end;


end;
end;

writeln('leoAlumnos: ', leoAlumnos);
writeln('leoNovedad: ', leoNovedad);


while leoAlumnos = 'si' do
begin
write(archivoActualizado, ra);

leerAlumnos(archivoAlumnos, ra, leoAlumnos);
end;

while leoNovedad = 'si' do
begin
if rn.codigo = 'a' then
begin
raux.nl := rn.nl;
raux.nya := rn.nya;

write(archivoActualizado, raux)
end;
leerNovedad(archivoNovedad, rn, leoNovedad);
end;




El primer ciclo de repetición hace el apareo raro, y los otros dos agotan el archivo que todavía tenga registros (de estos últimos dos, sólo uno se ejecutará)
Saludos, y gracias rob. por darme la idea =)

Off-topic:
TIP: Salvo que algún profesor te haya pedido el código, hacelo en diagrama; es lo mismo y se toma como correcto. Además que te puede resultar más práctico de cara a efectuar todo rápido.


Ahí en el código separaste los que coinciden en legajo con el archivo ALUMNOS y NOVEDAD.
  • En el caso de que coincidan, hay que verificar si es una modificación (si no lo es, asumimos que es una baja): en el primer caso, se mueve lo de NOVEDAD al archivo actualizado y se leen nuevos registros de ALUMNOS y NOVEDAD; mientras que en el segundo caso (baja), como no hay nada que subir al actualizado directamente leemos los siguientes registros (pero no dejes al "else" sin nada!).
  • Y en el caso de que no coincidan, tiene que ser o un alta, o un alumno que no sufrió modificaciones. Ahí va otro IF verificando cual de los dos iría primero (o sea, RA.NL < RN.NL) y vamos cargando tranquilos en el actualizado, finalmente leemos nuevo registro de ALUMNOS solamente; pero si no es así es porque el RN.CODIGO es una alta, entonces cargamos el registro de NOVEDAD en el actualizado y luego leemos el siguiente registro de NOVEDAD.


¿Me explico? lo venías haciendo bien, pero te morfaste algunos grandes detalles =P


ADD: Luego de ese while, tenés que hacer otros dos más, uno para ALUMNOS y otro abajo aparte para NOVEDAD en donde vas cargando directamente en el actualizado, porque es seguro que los archivos no van a terminar simultáneamente. O sea,

while (leoAlumnos = 'si') do
...
while (leoNovedad = 'si') do
...
Dejé al else sin nada porque si coinciden, o es una baja o es una modificación, entonces si es una modificación actualizamos, pero si es una baja no hacemos nada, y como en los dos casos hay que leer de ambos archivos, puse las instrucciones de lectura directamente, sin la clausula else.
(13-02-2013 02:45)oreo_dorada escribió: [ -> ]Dejé al else sin nada porque si coinciden, o es una baja o es una modificación, entonces si es una modificación actualizamos, pero si es una baja no hacemos nada, y como en los dos casos hay que leer de ambos archivos, puse las instrucciones de lectura directamente, sin la clausula else.

Claro, lo que te comentaba era para el primer código, que era justamente lo que me decís vos ahora.

El segundo está correcto; y la eficiencia no creo que sea lo ideal empezar a verlo a esta altura (es en particular con los casos de memoria estática y dinámica, que lo ves después en arrays y estructuras enlazadas). Lo importante, si vas con archivos, es fundamentalmente entender, porque luego es fundamental para trabajar con lo que sigue.


Saludos! =D
URLs de referencia