You are on page 1of 9

Universidad Nacional de Asunción Jueves, 14 de octubre de 2010

Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

PROCESAMIENTO DE ARCHIVOS POR BLOQUE DE REGISTROS (CORTE DE CONTROL)

Características generales del procesamiento por bloque de registros


 El archivo debe estar ordenado por el campo de control.
 No se sabe la cantidad de registros por grupo de control.
 Lo de abajo es una sugerencia de procesamiento, aunque creemos que es la más sencilla de
implementar.

Estructura general de procesamiento por bloque de registros.


inicio
leer(..)
primer_registro()

mientras( not eof ) {


si ( gCampo_control_1 <> Campo_control_1 ) {
corte_nivel_1()
sino si ( gCampo_control_2 <> Campo_control_2 ) {
corte_nivel_2()
.....
sino si ( gCampo_contro_n <> Campo_control_n ) {
corte_nivel_n()
}

procesar_registro()
leer(...)
}
corte_nivel_1()
...
fin

donde…

subrutina corte_nivel_1() subrutina corte_nivel_2()


inicio inicio
corte_nivel_2() corte_nivel_3()
... ...
fin fin

subrutina corte_nivel_n() subrutina primer_registro()


inicio inicio
corte_nivel_n-1() gCampo_control_1 = Campo_control_1
... gCampo_control_2 = Campo_control_2
fin ..
gCampo_control_n = Campò_control_n
fin

1
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

EJERCICIOS SOBRE PROCESAMIENTO POR BLOQUE DE REGISTROS

EJERCICIO #42
Una compañía dedicada a la venta de artículos varios tiene almacenados sus datos relativos a un determinado
mes en un archivo que posee la siguiente estructura:

Día de venta, Código de artículo, precio unitario, cantidad vendida.

Los datos están ordenados por día.


Se desea obtener el importe total de venta por día, por mes, además del promedio de ventas.(Sumatoria
importe total por día, dividido por la cantidad total de días)
Ejemplo:
Dia Cod.Art. Precio Unitario Cantidad Vendida
1 01 300 10
1 02 1000 5
1 03 500 10
2 01 300 5
2 04 2000 3
3 02 1000 10
4 01 300 4

Se desea el sgte. resultado:


Dia Importe Total
----------------------------
1 13.000
2 7.500
3 10.000
4 1.200

Total Mes : 31.700


Promedio Ventas: 7.925

EJERCICIO #43
Una empresa tiene datos acerca de las ventas realizadas durante un año. El resumen contiene los sgtes datos:
Codigo de zona, dia, mes, importe.
Se desea saber
a) A cuánto ascienden las ventas por mes en cada zona. Imprimir el nro. de mes aunque no haya existido
venta.
b) Cuál es el total de ventas por mes de la empresa
Observación
 Los datos están ordenados por código de zona.

Ejemplo (Datos): Resultado:

| Codigo | dia | mes | importe | Zona : 01


| de zona | | | | Mes 1 = 13.500
| --------|-----|-----|---------| Mes 2 = 0
| 01 | 10 | 12 | 10.000 | Mes 3 = 15.750
| 01 | 5 | 1 | 2.500 | ...
| 01 | 3 | 3 | 15.750 | Mes 12 = 11.220
| 01 | 3 | 12 | 1.220 | Zona : 02
| 01 | 12 | 1 | 11.000 | Mes 1 = 0
| 02 | 12 | 10 | 13.450 | Mes 2 = 3.800
| 02 | 2 | 2 | 3.800 | ...
| 02 | 2 | 10 | 1.250 | Mes 10 = 14.700
... ...
Total Empresa:
Mes 1 = 13.500
Mes 2 = 3.800
Mes 3 = 15.750
...
Mes 10 = 14.700
...
Mes 12 = 11.220

2
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

EJERCICIO #44
Se tiene un archivo con los datos de los resultados de los exámenes de alumnos de una (solo una)
determinada carrera del año 2003. Cada registro tiene el siguiente formato:
Cedula (cadena), fecha_examen(AAAAMMDD), cod_curso, cod_asig, nota (1-5, -1=ausente)
Se desea imprimir, por cada alumno, cuántas veces estuvo ausente, cuántas se aplazó, cuántas veces obtuvo
2, etc. y al final el promedio de las notas que obtuvo.
Imprimir al final del listado los 25 mejores promedios en orden descendente de promedio. Si existen dos o más
iguales tener en cuenta el último en el archivo.
Se debe producir el siguiente listado
Frecuencia de notas
Cédula (A) (1) (2) (3) (4) (5) PROM
1383778 3 3 6 10 4 2 2.84
1782933 1 0 1 2 8 10 4.29
2673092 0 7 9 1 3 1 2.14

Mejores promedios
Cedula Promedio
1782933 4,29
1383778 2.84
---
Observaciones
 Para calcular el promedio tome únicamente las notas distintas a ausente.
 El archivo está ordenado por el campo cédula.

EJERCICIO #45
En un año determinado se realizó un control sobre los vehículos que han pasado por un puesto de peaje.
Todos los datos obtenidos se han grabado en un archivo con el siguiente formato:
Mes, dia, codigo de vehiculo, peso
El costo de peaje por vehículo asciende a:
Código Tipo Monto
COC Coche 6.000
CTA Camioneta 8.000
MIN Minibus 12.000
OMN Omnibus 20.000
CMN Camión 15.000
CMA Camión con acoplado 18.000

A cada camión con o sin acoplado se les pesó y se les cobró un recargo de 1200 G. por cada 50 Kilos o
fracción. Ej: 1201 => 1250; 1249 => 1250
Se desea obtener:
Por mes:
 Cuantos vehículos de cada tipo pasaron y que monto se recaudó por cada tipo.
 Monto total del peaje cobrado.
Por Año:
 Promedio de recaudación mensual.
 Promedio de recaudación por tipo de vehículos.
 Total de vehículos que pasaron por el lugar por tipo de vehículo.
Observación:
 El archivo está ordenado por Mes, día y código de vehículo.

3
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

EJERCICIO #46
La universidad tiene registrado por cada alumno un archivo con el siguiente formato:
facultad(cadena), carrera(cadena), curso(numerico), cedula(cadena), nombre(cadena)
Se desea saber:
 por cada curso, la lista de los alumnos que asisten y el total de alumnos del curso.
 por cada carrera, el promedio de alumnos que asisten por curso.
 por cada facultad, el total de alumnos.
Ejemplo de la salida:
Facultad: xxxxxxx
Carrera: xxxxxxxxxxxx
Curso: xxxxxxxxxxxx
Cedula Nombre
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Total de alumnos: nn

Curso: xxxxxxxxxxxx
Cedula Nombre
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Total de alumnos: nn

Promedio de Alumnos en la carrera: nn


Total de alumnos en la facultad: nnn

Observaciones:
 El último registro no procesable tiene 0 en la variable facultad.
 El archivo está ordenado por facultad, carrera y curso.

4
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

SOLUCION – Problema #42


programa corte_1_nivel
var
dia, codart, punit, cnt: numerico /* Campos del registro */
gdia : numerico
tot_dia, tot_mes : numerico /* Totalizadores por dia y mes */
cnt_dia : numerico /* Cantidad de dias diferentes */
inicio
/* Inicializamos el total por mes y la cantidad de dias diferentes */
tot_mes = 0
cnt_dia = 0

leer(dia, codart,punit, cnt)


primer_registro()

/* Imprimir la cabecera del informe */


imprimir("\nDia\tImporte total")
imprimir("\n---\t-------------")

mientras ( not eof() ) {


si ( gdia <> dia ) {
corte_dia()
}
procesar_registro()
leer(dia,codart,punit,cnt)
}

corte_dia()

imprimir("\nTotal mes :", tot_mes)


imprimir("\nPromedio de ventas :", tot_mes/cnt_dia)

fin

/*
En la rutina de “primer_registro” guardamos el valor del campo de control e
inicializamos el total por dia
*/
sub primer_registro()
inicio
gdia = dia
tot_dia = 0
fin

sub procesar_registro()
inicio
tot_dia = tot_dia + punit * cnt
fin

/*
Por cada grupo imprimimos el dia y
el total de ventas realizadas por ese dia
*/
sub corte_dia()
inicio
imprimir("\n", gdia, "\t", tot_dia)
tot_mes = tot_mes + tot_dia
cnt_dia = cnt_dia + 1
primer_registro()
fin

5
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

SOLUCION – Problema #44


programa resultados_examenes
tipos
TPromedio : registro {
cedula : cadena
prom : numerico
}
var
v_Mejores_Prom : vector [25] TPromedio // Guardará los 25 mejores promedios
v_notas : vector [6] numerico // Contara la frecuencia de cada nota 1-5-Ausente de un alumno
cedula, gCedula, cnota : cadena
fecha, codcurso, codasign, nota : numerico
MAX_PROM : numerico
inicio
cls()

MAX_PROM = 0

si ( not set_stdin ( "notas.txt" ) ) {


terminar("No existe el archivo notas.txt")
}

leer(cedula, fecha, codcurso, codasign, cnota)


nota = val(substr(cnota,1,strlen(cnota)-1)) // Hacemos esto por el problema del separador de campos

primer_registro()

imprimir("\n------\t\t\t\tFrecuencia de Notas ")


imprimir("\nCedula\t\t(A)\t(1)\t(2)\t(3)\t(4)\t(5)\tPROM")
imprimir("\n------\t\t---\t---\t---\t---\t---\t---\t----")

mientras ( not eof() ) {


si ( gCedula <> cedula ) {
corte_Alumno()
}
procesar_registro()
leer(cedula, fecha, codcurso, codasign, cnota)
nota = val(substr(cnota,1,strlen(cnota)-1))
}
corte_Alumno() // Necesitamos hacer para procesar el último grupo.
imprimir_mejores_prom()
fin

/*
Procesar el primer registro
Inicializar la variable que guarda el campo de control del anterior registro leido
Inicializar el vector de conteo de notas
*/
sub primer_registro()
inicio
gCedula = cedula
v_notas = {0,0,...}
fin

/*
Procesar el registro leido
Simplemente se cuenta la nota en la posicion correcta del vector
En la posicion 6 se colocan la cantidad de ausentes (nota == -1 )
*/
sub procesar_registro()
inicio
si (nota <> -1 ) {
inc ( v_notas[nota])
sino
inc ( v_notas[6])
}
fin

6
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

/*
Por cada alumno debemos imprimir la cantidad de cada tipo de nota.
Ademas se imprime el promedio.
Luego se averigua (ver_mayor_prom) si el alumno leido formará parte de los 25 mejores promedio
Se vuelve a llamar a primer_registro() que inicializa gCedula y el vector contador de notas
*/
sub corte_Alumno ()
var
prom : numerico
c,s : numerico
k : numerico
inicio
imprimir("\n", gCedula, "\t\t") // Fíjese que se usa gCedula y NO cedula!!!
imprimir(v_notas[6]) //cantidad de ausentes

desde k=1 hasta 5 {


c = c + v_notas[k] //cantidad de notas
s = s + v_notas[k]*k //suma de notas
imprimir("\t", v_notas[k])
}

prom = s/c
imprimir("\t", prom)
ver_mayor_prom(prom)
primer_registro()
fin

/*
Averiguar si el alumno analizado forma parte de los 25 mejores promedios.
Se mantiene un vector de registros ordenados por promedio en forma descendente.
*/
sub ver_mayor_prom(p : numerico)
var
aux : TPromedio
k,j : numerico
inicio
aux.cedula = gCedula
aux.prom = p

desde k=1 hasta MAX_PROM {


si ( v_Mejores_Prom[k].prom <= aux.prom ) {
aux = v_Mejores_Prom[k]
v_Mejores_Prom[k].cedula = gCedula
v_Mejores_Prom[k].prom = p

desde j=k+1 hasta MAX_PROM {


intercambiar(aux, v_Mejores_Prom[j])
}
salir
}
}

si ( MAX_PROM < 25 ) {
inc(MAX_PROM)
v_Mejores_Prom[MAX_PROM] = aux
}
fin

/*
Imprimir el resumen de los 25 mejores promedios (como máximo )
*/
sub imprimir_mejores_prom()
var
k : numerico
inicio
imprimir("\n\nMejores promedios\n\tCedula\t\tPromedio")
imprimir("\n\t-------\t\t--------")

desde k=1 hasta MAX_PROM {


imprimir("\n\t", v_Mejores_Prom[k].cedula, "\t\t", v_Mejores_Prom[k].prom)
}
fin

7
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

SOLUCION – Problema #46


programa lista_facultad
var
facultad, carrera, cedula, nombre : cadena
curso, gcurso : numerico
gfacultad, gcarrera : cadena
tot_curso, tot_carrera, tot_facultad : numerico
cnt_curso : numerico
inicio
cls()

leer(facultad, carrera, curso, cedula, nombre)


primer_registro()

// Imprimir cabecera
imp_cab_facultad()

mientras ( not eof() ) {


si ( gfacultad <> facultad ) {
corte_facultad()
imp_cab_facultad()
sino si ( gcarrera <> carrera )
corte_carrera()
imp_cab_carrera()
sino si ( gcurso <> curso )
corte_curso()
imp_cab_curso()
}
procesar_registro()
leer(facultad, carrera, curso, cedula, nombre)
}
corte_facultad()
fin

sub primer_registro()
inicio
gfacultad = facultad
gcarrera = carrera
gcurso = curso
tot_curso = 0
tot_carrera = 0
tot_facultad = 0
cnt_curso = 0
fin

sub procesar_registro()
inicio
imprimir("\n\t\t\t",cedula, "\t", nombre)
inc(tot_curso)
fin

sub corte_curso()
inicio
imprimir("\n\t\tTotal de alumnos:", tot_curso)
inc(tot_carrera, tot_curso)
inc(cnt_curso)
tot_curso = 0
gcurso = curso
fin

sub corte_carrera()
inicio
corte_curso()
imprimir("\n\tPromedio de alumnos en la carrera:", tot_carrera/cnt_curso)
inc(tot_facultad, tot_carrera)
tot_carrera = 0
cnt_curso = 0
gcarrera = carrera
fin

8
Universidad Nacional de Asunción Jueves, 14 de octubre de 2010
Facultad Politécnica
Carrera: Licenciatura en Ciencias Informáticas - Plan 2009
2º Nivel – Turno Mañana – Sección “J”
Prof. Ricardo Barboza Lezcano
ALGORÍTMICA II

sub corte_facultad ()
inicio
corte_carrera()
imprimir("\nTotal de alumnos en la facultad : ", tot_facultad)
tot_facultad = 0
gfacultad = facultad
fin

sub imp_cab_facultad()
inicio
imprimir("\n\n\nFacultad:", facultad)
imp_cab_carrera()
fin

sub imp_cab_carrera()
inicio
imprimir("\n\n\tCarrera:", carrera)
imp_cab_curso()
fin

sub imp_cab_curso()
inicio
imprimir("\n\t\tCurso:", curso)
imprimir("\n\t\t\tCedula\tNombre");
fin

You might also like