1ra Evaluación II Término 2018-2019, Noviembre 23, 2018. CCPG001
Tema 1. (20 puntos)
a. (10 puntos) ¿Qué imprime el siguiente código? Justifique su respuesta
lista = [89, 45, 23, 17, 55, 95, 13, 41, 28, 11]
lista.sort()
promedio = sum(lista)//len(lista)
print(promedio)
menores = []
i = 0
while lista[i] < promedio:
menores.append(lista[i])
i += 1
print(menores)
b. (10 puntos) ¿Qué imprime el siguiente código? Justifique su respuesta
pal = 'Se van en sus naves'
b = pal[::-1].replace(' ', '').lower()
pal_b = pal.lower().replace(' ', '')
if pal_b == b:
print('Es palíndromo')
else:
print('No es palíndromo')
Nota: Asuma que este tema NO tiemen errores de compilación. Si usted cree que hay algún error de compilación, consúltelo inmediatamente con su profesor
3ra Evaluación I Término 2018-2019. 14-Septiembre-2018 /CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 2. (50 puntos) En el último discurso presidencial, se mencionaron algunos datos sobre las ganancias de algunos minerales del país que llamaron la atención de los ciudadanos.
Suponga que tiene todo el texto del discurso con el formato en minúsculas, las palabras separadas por un espacio, sin signos de puntuacion ni otros símbolos. Los minerales están identificados por el prefijo "mral_" seguido del nombre del mineral. Por ejemplo: 'mral_oro', 'mral_plata', 'mral_cobalto'
discurso = '... y el dia de ayer descubrimos en la mina mirador que la cantidad de mral_oro ...'
a) Implemente la función extraerMinerales(discurso) que al recibir el texto del discurso encuentra los nombres de todos los minerales mencionados. El resultado es una lista con los nombres de los minerales que empiezan con mayúscula y no se repiten en la lista.
Por otro lado, suponque que dispone de las tablas de producción para cada mineral de las canteras del país, costos totales de extracción, costos totales de transporte, los nombres de los minerales y minas asociados a las filas y columnas de las tablas, y los precios cada mineral, semejantes a los mostrados al final del ejercicio.
Con ésta información implemente las siguiente funciones:
b) La función calcularGanancias(P,C,T,precios) que calcula las ganancias o pérdidas de cada mineral por mina. La función recibe la lista de precios de venta de los minerales las tres matrices: producción (P) , costos totales de extracción (C) y costos totales de transporte (T).
Adicionamente, considere las siguientes fórmulas:
ganancia = ventas - costos
ventas = producción*precio
costos = costos de transporte + costo de extracción
c) La función gananciaTotal(M, Minerales) determina las ganancias totales de cada mineral de mayor a menor, junto a los correspondientes nombres de mineral.
La función recibe la matriz del literal anterior y la lista de las etiquetas de los minerales (fila de la matriz).
El resultado es una tupla de dos elementos ordenados por ganancia:
- el vector de Numpy de las ganancias totales por mineral
- una lista con los nombres de los minerales.
d) La función top8(discurso, ganatotal) presenta los nombres de los ocho (8) minerales que generaron más ganancias totales y que fueron mencionados en el discurso. La variable ganatotal corresponde al resultado de la función del literal anterior.
Rúbrica: literal a (1o puntos), literal b (15 puntos), literal c (15 puntos), literal d (10 puntos)
Datos de prueba:
minerales = ['Oro', 'Plata', 'Cobre']
precios = [38.48, 3.43, 0.01]
minas = ['MIRADOR', 'FRUTA_DEL_NORTE', 'LOMA_LARGA', 'otra']
# produccion
P = np.array([[ 13524000, 121072000, 1204000, 9632000],
[ 28000000, 952000, 9632000, 96404000],
[126980000, 896000, 92988000, 9604000]])
# costos totales de extracción
C = np.array([[12.32, 10.23, 23.23, 19.23],
[ 3.13, 1.78, 2.45, 1,69],
[ 8.32, 5.25, 6.32, 6.89]])
# costos totales de transporte
T = np.array([[ 43736616, 341786256, 5442080, 28241024],
[ 76244000, 1827840, 13966400, 435746080],
[156439360, 1121792,300723192, 10785292]])
Solución propuesta en Python, el primer bloque corresponde solo a las funciones requeridas en el examen. El segundo bloque corresponde a un programa de prueba.
# CCPG1001-Fundamentos de Programación - FIEC-ESPOL# 3Eva_IT2018_T2 Producción minera del paísimport numpy as np
# Literal adefextraerMinerales(discurso):
palabras = discurso.split(' ')
cuales = []
for unapalabra in palabras:
# Tarea: verificar únicosif'mral_'in unapalabra:
mencionados = unapalabra[5:]
mencionados = mencionados.title()
cuales.append(mencionados)
return(cuales)
# literal bdefcalcularGanancias(P,C,T,precios):
produccion = np.array(P)
costosExtraccion = np.array(C, dtype=float)
costosTransporte = np.array(T)
# precio en forma de columna
precios = np.transpose([precios])
ventas = produccion*precios
costo = costosTransporte + costosExtraccion
ganancia = ventas - costo
return(ganancia)
# literal cdefgananciaTotal(ganancia, minerales):
ganametal = np.sum(ganancia,axis =1)
ascendente = np.argsort(ganametal)
descendente = np.argsort(-ganametal)
totalmetal = ganametal[descendente]
# convierte arreglo para ascendente
minerales = np.array(minerales)
cualmetal = minerales[descendente]
ganatotal = (totalmetal,list(cualmetal))
return(ganatotal)
# literal ddeftop8(discurso,reporte):
mencionados = extraerMinerales(discurso)
totalmetal = reporte[0]
cualmetal = reporte[1]
interseccion = []
m = len(cualmetal)
for i inrange(0,m,1):
if (cualmetal[i] in mencionados):
interseccion.append(cualmetal[i])
mejoresmencionados = interseccion[:8]
return (mejoresmencionados)
Programa de Prueba
Observación: las matrices C y T no tienen el mismo orden de magnitud a pesar de ser costos totales. Podría ser que el costo de extracción C sea por gramos, sin embargo las matrices se usan tal como fueron presentadas en el examen
# CCPG1001-Fundamentos de Programación - FIEC-ESPOL# PROGRAMA DE PRUEBA -----
discurso = 'y el dia de ayer descubrimos en la mina mirador que la cantidad de mral_oro'
minerales = ['Oro', 'Plata', 'Cobre']
precios = [38.48, 3.43, 0.01]
minas = ['MIRADOR', 'FRUTA_DEL_NORTE', 'LOMA_LARGA', 'otra']
P = [[ 13524000, 121072000, 1204000, 9632000],
[ 28000000, 952000, 9632000, 96404000],
[126980000, 896000, 92988000, 9604000]]
C = [[ 12.32, 10.23, 23.23, 19.23],
[ 3.13, 1.78, 2.45, 1.69],
[ 8.32, 5.25, 6.32, 6.89]]
T = [[ 43736616, 341786256, 5442080, 28241024],
[ 76244000, 1827840, 13966400, 435746080],
[156439360, 1121792,300723192, 10785292]]
# PROCEDIMIENTO
mencionados = extraerMinerales(discurso)
ganancias = calcularGanancias(P,C,T,precios)
ganatotal = gananciaTotal(ganancias, minerales)
totalmetal = ganatotal[0]
cualmetal = ganatotal[1]
mejoresmencionados = top8(discurso,ganatotal)
# SALIDAprint('a) los minerales mencionados son: ')
print(mencionados)
print('b) las ganancias totales son:')
print(ganancias)
print('c) ganancias totales por metal')
print(totalmetal)
print(cualmetal)
print('d) los 8 mejores mencionados: ')
print(mejoresmencionados)
los resultados en pantalla son :
a) los minerales mencionados son:
['Oro']
b) las ganancias totales son:
[[ 4.76666892e+08 4.31706429e+09 4.08878168e+07 3.42398317e+08]
[ 1.97959969e+07 1.43751822e+06 1.90713576e+07 -1.05080362e+08]
[ -1.55169568e+08 -1.11283725e+06 -2.99793318e+08 -1.06892589e+07]]
c) ganancias totales por metal
[ 5.17701732e+09 -6.47754890e+07 -4.66764983e+08]
['Oro', 'Plata', 'Cobre']
d) los 8 mejores mencionados:
['Oro']
>>>
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.
Algoritmo en Python
# 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: