3ra Evaluación I Término 2018-2019. 14-Septiembre-2018 /CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 1 (40 puntos). En una empresa de transporte de carga (trailers) se registran para cada fecha, el código de los choferes que manejaron en una ruta.
id_ruta, id_chofer, fecha
Guayaquil-Cuenca,SMS,17-05-2018
Guayaquil-Cuenca,AGB,18-05-2018
Guayaquil-Cuenca,SMZ,17-05-2018
Guayaquil-Daule,EVN,17-05-2018
Guayaquil-Daule,AAQ,18-05-2018
Por lo rutinario del trabajo, se ha recomendado que los choferes no repitan una ruta para los últimos n días a partir de una fecha. Para seguir la recomendación se requiere implementar:
a) La función cargarDatos(narchivo) que recibe un archivo de registro y retorna una tupla con:
– un conjunto con los choferes que trabajaron en las fechas del archivo (id_chofer)
– los datos del archivo en un diccionario con la estructura mostrada.
b) La función encontrarChoferes(datos, loschoferes, unafecha, unaruta, n), que para seguir la recomendación, encuentra aquellos choferes que no manejaron en una ruta, durante los n dias anteriores a una fecha.
c) La función grabarArchivo(datos, loschoferes, unafecha, unaruta, n) que crea un archivo con el resultado de la función anterior con el formato mostrado. El nombre del archico generado se conforma como: «unaruta_unafecha.txt»
Nombre de archivo: Guayaquil-Cuenca_19-05-2018_2.txt
Para la ruta Guayaquil-Cuenca los choferes disponibles para la fecha 19-05-2018 que no hayan manejado 2 dias anteriores son:
EVN
AAQ
d) Genere todos los archivos para todas las rutas disponibles.
NOTA: Para administrar las fechas, usted ya dispone de una función calcularFecha(unafecha,n) que recibe una fecha y los n días anteriores y determina la fecha pasada. El formato de fecha se maneja en el mismo formato de fecha que el archivo.
>>> calcularFecha('19-05-2018',2)
'17-05-2018'
Rúbrica: Literal a (12 puntos), Literal b(16 puntos), Literal c y d (12 puntos)
La propuesta considera el uso de listas, por ser parte de los ejercicios del proyecto para 3ra Evaluación.
# CCPG1001-Fundamentos de Programación - FIEC-ESPOL# 3Eva_IT2018_T1 Choferes y Rutas Trailers# literal adefcargarDatos(narchivo):
loschoferes = []
tabla = {}
archivo = open(narchivo,'r')
cabecera = archivo.readline()
linea = archivo.readline()
whilenot(linea==''):
linea = linea.strip('\n')
partes = linea.split(',')
ruta = partes[0]
chofer = partes[1]
fecha = partes[2]
ifnot(chofer in loschoferes):
loschoferes.append(chofer)
ifnot(fecha in tabla):
tabla[fecha] = {ruta:[chofer]}
else:
ifnot(ruta in tabla[fecha]):
tabla[fecha][ruta] = [chofer]
else:
tabla[fecha][ruta].append(chofer)
linea = archivo.readline()
archivo.close()
return((loschoferes,tabla))
# función para pruebas, no requerida en la evaluaciónimport datetime as dtt
defcalcularFecha(unafecha,n):
formato = '%d-%m-%Y'
fecha = dtt.datetime.strptime(unafecha,formato)
pasada = fecha - dtt.timedelta(days=n)
pasadatxt = dtt.datetime.strftime(pasada,formato)
return(pasadatxt)
# literal bdefencontrarChoferes(tabla,loschoferes,unafecha,unaruta,n):
simanejaron = []
fechas = list(tabla.keys())
for i inrange(1,n+1,1):
pasada = calcularFecha(unafecha,i)
if (pasada in fechas):
trabajaron = tabla[pasada][unaruta]
for unchofer in trabajaron:
ifnot(unchofer in simanejaron):
simanejaron.append(unchofer)
nomanejaron = []
for unchofer in loschoferes:
ifnot(unchofer in simanejaron):
nomanejaron.append(unchofer)
return(nomanejaron)
# literal cdefgrabarArchivo(tabla,loschoferes,unafecha,n):
narchivograba = unaruta+'_'+unafecha+'_'+str(n)+'.txt'
archivo = open(narchivograba,'w')
cabecera = 'Para la ruta '+unaruta+'\n'
cabecera = cabecera + 'los choferes disponibles para la fecha '+unafecha+'\n'
cabecera = cabecera + 'que no hayan manejado '+str(n)+' dias anteriores son: \n'
archivo.write(cabecera)
nomanejaron = encontrarChoferes(tabla,loschoferes,unafecha,unaruta,n)
for cadachofer in nomanejaron:
archivo.write(cadachofer+'\n')
archivo.close()
return(narchivograba)
programa de prueba, como trabajo extra, no requerido para el examen:
# CCPG1001-Fundamentos de Programación - FIEC-ESPOL# PROGRAMA PRUEBA -------# INGRESO
narchivo = 'rutasManejadas2018.txt'
unafecha = '19-05-2018'
unaruta = 'Guayaquil-Cuenca'
n = 2
# PROCEDIMIENTO
datos = cargarDatos(narchivo)
loschoferes = datos[0]
tabla = datos[1]
nomanejaron = encontrarChoferes(tabla,loschoferes,unafecha,unaruta,n)
elarchivo = grabarArchivo(tabla,loschoferes,unafecha,n)
# SALIDAprint('a) los choferes registrados son: ')
print(loschoferes)
print(' la tabla de trabajos es: ')
print(tabla)
print('b) los choferes que no manejaron en ')
print(' '+unaruta+', '+str(n)+' dias antes del '+unafecha+': ')
print(nomanejaron)
print('c) resultados en el archivo: ', elarchivo)
Se muestra el resultado en pantalla del programa usando los datos de prueba del archivo:
a) los choferes registrados son:
['SMS', 'AGB', 'SMZ', 'EVN', 'AAQ']
la tabla de trabajos es:
{'17-05-2018': {'Guayaquil-Cuenca': ['SMS', 'SMZ'], 'Guayaquil-Daule': ['EVN']}, '18-05-2018': {'Guayaquil-Cuenca': ['AGB'], 'Guayaquil-Daule': ['AAQ']}}
b) los choferes que no manejaron en
Guayaquil-Cuenca, 2 dias antes del 19-05-2018:
['EVN', 'AAQ']
c) resultados en el archivo: Guayaquil-Cuenca_19-05-2018_2.txt
>>>
2da Evaluación I Término 2018-2019. 31-Agosto-2018 /CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 2. (50 puntos) Una compañía, con miles de empleados y varias sucursales en el país, paga sus salarios por hora clasificadas como:
– horas regulares (HR),
– horas fuera de horario normal (HER),
– fines de semana (HFDS) y
– feriados (HF).
El registro de asistencia de los empleados contiene: dia, mes, año, cantidad de horas trabajadas, entre otros mostrados en el archivo ejemplo.
El archivo inicia con líneas del valor en dólares por hora, los factores de pago por tipo, una linea de encabezado y el detalle de las horas trabajadas por empleado. Por ejemplo:
VH,10,Valor Hora en ésta compañía
HR,1,Factor Horas Regulares
HER,1.21,Factor Horas Extras en dias Regulares (lunes-viernes)
HFDS,1.37,Factor Horas en Fin De Semana (Sabado o domingo)
HF,1.39,Factor Horas en Feriado
Fecha,dia,feriado,ID,nombre,sucursal,ciudad,horas-trabajadas
...
10-Agosto-2018,5,Si,FG848801,Fabricio Granados,River Mall,Cuenca,1
10-Agosto-2018,5,Si,GH907603,Segunda Vez Zambrano,River Mall,Cuenca,1
09-Agosto-2018,4,No,FG848801,Fabricio Granados,River Mall,Cuenca,9
...
Las horas extras en días regulares se calculan después de la 8va hora de trabajo.
Si el empleado trabajó en un dia feriado, que también es fin de semana, el factor aplicado es el más alto, es decir feriado.
Desarrolle las funciones descritas a continuación y un programa para calcular los valores a pagar para cada empleado.
a) calcularHoras(linea). Recibe una línea del archivo y determina el número de horas trabajadas para cada categoría. El resultado es una tupla con el identificador del empleado, ciudad y horas trabajadas regulares, extras, fines de semana y feriado.
>>> linea = "09-Agosto-2018,4,No,FG848801,Fabricio Granados, River Mall, Cuenca,9"
>>> calcularHoras(linea)
('FG848801','Cuenca',8,1,0,0)
b) leerData(nomA). Recibe el nombre del archivo de nómina (nomA) correspondiente a un mes de un año y retorna una tupla de tres elementos: (totales, mes, año). Totales es un diccionario con la suma en dólares de HR, HER, HFDS y HF trabajados por cada empleado con la siguiente estructura:
c) generaReporte(nomA). Recibe el nombre del archivo de nómina (nomA) correspondiente a un mes de un añoy genera un nuevo archivo reporte para cada ciudad.
Cada archivo reporte tiene como nombre «ciudadMes-Año.txt» y contiene: cabecera y la siguiente información por cada empleado:
2da Evaluación I Término 2018-2019. 31-Agosto-2018 /CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 1. (40 puntos) Para analizar los niveles de seguridad en el país, se registran los incidentes por ciudad y tipo delito en un archivo.
incidentes
robo vehículo
asalto
Escandalo vía pública
…
Quito
540
4523
24
…
Guayaquil
605
6345
5
…
Cuenca
123
676
133
…
Machala
67
1234
412
…
…
…
….
….
…
Dispone de un modulo «ecu911» con la función cargarDatos(nombrearchivo) que lee el archivo y entrega un diccionariocon la las veces que se ha reportado cada tipo de delito para cada ciudad del país en el siguiente formato:
Para crear el diccionario debe importar el módulo.
Se requiere implementar lo siguiente:
a. Una función tablatitulos(diccionario) que recibe el diccionario descrito y retorna una coleccion:
titulos = (ciudad, tipodelito)
ciudad contiene las ciudades del archivo, y tipodelito contiene los tipos considerados en el diccionario, ambos sin duplicados.
b. La función crearMatriz(diccionario) que usando la información del diccionario crea una matriz con el número de incidentes por ciudad y tipo de delito. La matriz es un arreglo de numpy, semejante al ejemplo:
c. Una función ciudadesMenosSeguras(matriz, titulos, untipo, poblacion) que retorna los nombres de las tres ciudades que tienen el mayor indice per capita de para untipode delito.
\text{indice per capita} = \frac{\text{numero de incidentes reportados}}{\text{poblacion de la ciudad}}
La función recibe la matriz , titulos de los literales anteriores, un tipo de delito y la población de cada ciudad del país en un vector, arreglo Numpy.
Rúbrica: literal a (10 puntos), literal b (20 puntos), literal c (10 puntos).