2da Evaluación II Término 2018-2019. 2-Febrero-2019 /CCPG001
Sección 4. Programa que usa las funciones de la sección 1, 2, 3 (preguntas 6-9)
implemente un programa principal que:
6. Forme las matrices a partir del archivo ‘artico2009-2019.txt‘
7. Muestre por pantalla el código de las especies que en el 2019 son comunes (se repiten) para los cuadrantes Q1, Q2 y Q4 pero que no existan en Q3.
Los siguientes dos numerales se resuelven juntos.
8. Determine si ha habido migración de la especie con código 3. Existe migración si el cuadrante con mayor población en el 2009 y 2019 son diferentes .
9. Una posible explicación para la migración de una especie puede ser el deshielo. Entonces, si existió migración (de la especie con código 3) del cuadrante con mayor población en el 2009 (Qx) al cuadrante con mayor población en el 2019 (Qy), muestre la diferencia (positiva o negativa) de densidad de hielo del 2009 al 2019 para el cuadrante Qx.
Calcule la diferencia con la siguiente fórmula:
Diferencia = densidad_Qx_2019 - densidad_Qx_2009
Por ejemplo:
Si migracionEspecie retorna (‘Q1’, ‘Q4’), la diferencia será la densidad de hielo en el 2009 del cuadrante ‘Q1’ menos la densidad de hielo en el 2019 del mismo cuadrante ‘Q1’.
Para esto dispone de información sobre la cantidad de hielo y población de animales de diversas especies durante los años 2009 y 2019 en un archivo con el siguiente formato:
Número de filas
Número de columnas
Año,fila,columna,hielo,especie
crearMatriz(nomArchivo) que recibe el nombre del archivo con los datos de la WWF y retorna una tupla que contiene las siguientes cuatro matrices:
mhielo2009: Cantidad de hielo 2009
1
0
0
1
…
0
1
1
1
…
1
0
1
0
…
1
1
1
0
…
0
1
0
1
…
1
1
1
0
…
…
…
…
…
…
mhielo2019: Cantidad de hielo 2019
1
0
0
1
…
0
1
0
1
…
1
0
1
0
…
1
0
1
0
…
0
1
0
1
…
0
0
1
0
…
…
…
…
…
…
mAnimales2009: Especies de animales 2009
1
2
4
4
…
2
5
5
3
…
1
3
9
1
…
1
1
4
2
…
4
22
4
7
…
1
1
14
4
…
…
…
…
…
…
mAnimales2019: Especies de animales 2019
3
2
4
1
…
0
11
3
5
…
1
0
67
1
…
2
22
3
2
…
13
13
2
3
…
3
0
1
0
…
…
…
…
…
…
En las matrices de hielo cada valor uno (1) en una celda representa la presencia de hielo.
En las matrices de animales cada celda representa la presencia de un animal de una especie usando una cierta codificación, como la del ejemplo:
0: No hay animal
1: Lobo ártico
2: Oso Polar
3: Reno
4: Foca
5: ...
Rúbrica: numeral 1 (15 puntos): abrir y cerrar archivo, procesar lineas de tamaño de matriz, crear matrices, procesar líneas de datos de matriz, llenar matrices.
1ra Evaluación II Término 2018-2019, Noviembre 23, 2018. CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 3. (50 puntos) El Black Friday inaugura la temporada de compras navideñas con significativas rebajas en muchas tiendas minoristas y grandes almacenes.
Sucede después de la celebración de Acción de Gracias en Estados Unidos.
Suponga que posee los datos de los productos de una tienda en los siguientes arreglos:
C: códigos de todos los productos (cadenas de caracteres) P: precios en dólares para cada uno de los productos (valores con decimales). D: descuentos asociados a cada producto (enteros entre 0 y 100) S: nombre de la sección donde se encuentra cada producto (cadenas de caracteres)
Se requiere implementar las siguientes funciones:
calcularPrecio(codigo,C,P,D) que recibe un código y los arreglos C,P,D y retorna el precio final del producto, aplicando el descuento correspondiente.
Para calcular el precio final, aplique las siguiente fórmula: precio_final = precio - precio*\frac{descuento}{100}
calcularTotal(compras,C,P,D) que recibe una lista de compras con los códigos de los productos, los arreglos C,P,D y aplicando todos los descuentos calcula el valor total a pagar, .
hallarSecciones(compras,C,S) que recibe una lista de compras con los códigos de los productos, los arreglos C y S y determina las secciones que deberán visitar durante las compras. La lista de visitas no tiene elementos repetidos.
descuentosPorSección(D,S) que recibe los arrelgos D y S y retorna una tabla con el nombre de cada sección y la cantidad de productos que tienen más del 50% de descuento.
Realice un programa que inicialmente muestre una tabla con las secciones y cantidad de productos con más del 50% de descuento. Luego para las compras, permita ingresar los códigos de los productos, procese y muestre el valor total a pagar y las secciones que necesita visitar. El usuario terminará de ingresar las compras escribiendo ‘fin’.
Ejemplos de arreglos:
C = ['CTR-2424', 'SKU-5675', 'PSS-4542']
P = [ 56.65, 32.00, 22.22]
D = [0, 50, 10]
S = ['Ropa Niños', 'Juguetes', 'Hombre']
Rúbrica: numeral 1 (5 puntos), numeral 2 y 3 (10 puntos c/u), numeral 4 (15 puntos). programa (10 puntos)
# CCPG1001 Fundamentos de Programación FIEC-ESPOL# 1Eva_IIT2018_T3 Compras ‘Black Friday’# Tarea: descuentosPorSecciónimport random as rnd
import numpy as np
defcalcularPrecio(unacompra,Codigo,Precio,Descuento):
unprecio = 0
if (unacompra in Codigo):
donde = Codigo.index(unacompra)
valor = Precio[donde]
unprecio = valor - Descuento[donde]*valor/100
return(unprecio)
defcalcularTotal(compras,Codigo,Precio,Descuento):
m = len(compras)
totalpagar = 0
i = 0
whilenot(i>=m):
unacompra = compras[i]
unprecio = calcularPrecio(unacompra, Codigo,
Precio, Descuento)
totalpagar = totalpagar + unprecio
i = i + 1
return(totalpagar)
defhallarSecciones(compras,Codigo,Seccion):
m = len(compras)
visitar = []
i = 0
whilenot(i>=m):
unacompra = compras[i]
donde = Codigo.index(unacompra)
unaseccion = Seccion[donde]
ifnot(unaseccion in visitar):
visitar.append(unaseccion)
i = i + 1
return(visitar)
defdescuentosPorSección(Descuento,Seccion):
remate = []
# Tarea: Desarrollarreturn(remate)
# INGRESO
unacompra = input('codigo de una compra: ')
# Tarea: ingresar varias compras
compras = ['SKU-5675', 'PSS-4542']
Codigo = ['CTR-2424', 'SKU-5675', 'PSS-4542']
Precio = [ 56.65, 32.00, 22.22]
Descuento = [0, 50, 10]
Seccion = ['Ropa Niños', 'Juguetes', 'Hombre']
# PROCEDIMIENTO
unprecio = calcularPrecio(unacompra, Codigo,
Precio,Descuento)
totalpagar = calcularTotal(compras, Codigo,
Precio,Descuento)
visitar = hallarSecciones(compras,Codigo, Seccion)
remate = descuentosPorSección(Descuento, Seccion)
# SALIDAprint('El precio de : ',unacompra)
print(unprecio)
print('total a pagar de lista de compras: ', totalpagar)
print('tiendas a visitar: ',visitar)
print('remate de productos por seccion: ',remate)
resultado del algoritmo
codigo de una compra: CTR-2424
El precio de : CTR-2424
56.65
total a pagar de lista de compras: 35.998
tiendas a visitar: ['Juguetes', 'Hombre']
remate de productos por seccion: []
>>>
1ra Evaluación II Término 2018-2019, Noviembre 23, 2018. CCPG001
(Editado para tarea, se mantiene el objetivo de aprendizaje)
Tema 2. (30 puntos) Para un juego llamado «conocimiento», dispone de una lista que contiene un número determinado de ‘palabras‘.
El juego tiene las siguientes reglas:
1. Al inicio, se selecciona aleatoriamente una palabra secreta de la lista de palabras.
2. Como una pista, aleatoriamente se escoge una letra de la palabra secreta, que sea consonante y se la muestra entre los espacios por adivinar de secreta.
Por ejemplo, si la palabra secreta es 'ESPOL' y la letra pista sorteada es 'S', se mostrará:
'-S---'
3. Se pide al jugador ingresar una letra, indiferente si es mayúscula o minúscula.
Si la letra e encuentra en secreta se muestra la letra adivinada en la posición que corresponde.
Letra: L
'-S--L'
4. El máximo de intentos para el jugador es el doble de letras de la palabra secreta.
5. Al final muestre si el usuario ganó o perdió y la cantidad de intentos usados,
Escriba un programa en Python para implementar el juego.
Sugerencia: Realice una función cambialetra(secreta,letra,estado) para revisar si letra se encuentra en secreta y cambiar el estado del juego.
Ejemplo:
secreta = 'ESPOL'
letra = 'S'
estado = '-----'
cambialetra(secreta, letra, estado)
>>>'-S---'
Sugerencia: Realice una función escondeletras(secreta) que cambia las letras de la palabra secreta por un símbolo predeterminado:
Estado del juego: F***
adivine una letra: C
Adivinaste...C
Estado del juego: FC**
turno: 1
fallas: 0
adivine una letra: M
Adivinaste...M
Estado del juego: FC*M
turno: 2
fallas: 0
adivine una letra: A
NO es una letra de palabra...
Estado del juego: FC*M
turno: 3
fallas: 1
adivine una letra: N
Adivinaste...N
Estado del juego: FCNM
turno: 4
fallas: 1
Felicitaciones, adivinó: FCNM
>>>
Algoritmo en Python
Siguiendo las sugerencias, para dividir y simplificar el problema, primero se crean las funciones: escondeletras(secreta) y cambialetra(secreta,letra,estado).
Se inicia con la selección aleatoria de la palabra secreta y el sorteo de la letra pista, verificando que sea consonante.
Se actualiza la palabra secreta con la letra pista, y se inicia el juego.
# CCPG1001 Fundamentos de Programación FIEC-ESPOL# 1Eva_IIT2018_T2 Juego conocimiento (Ahorcado)# propuesta de solución: edelros@espol.edu.ec# tarea: indiferente usar mayúsculas/minúsculas# contar solo letras adivinadas, no repetidasimport numpy as np
import random as rnd
defescondeletras(secreta):
estado = ''
n = len(secreta)
i = 0
whilenot(i>=n):
estado = estado + '*'
i = i + 1
return(estado)
defcambialetra(secreta,letra,estado):
nuevoestado = ''
n = len(secreta)
i = 0
whilenot(i>=n):
if (secreta[i]==letra):
nuevoestado = nuevoestado + letra
else:
nuevoestado = nuevoestado + estado[i]
i = i + 1
return(nuevoestado)
# PROGRAMA JUEGO# selecciona secreta
palabras = ['ESPOL','FCNM','FIEC','FIMCP','FICT']
n = len(palabras)
sorteo = int(rnd.random()*n)+0
secreta = palabras[sorteo]
# estado inicial del juego
estado = escondeletras(secreta)
# una letra como pista
consonante = 'BCDFGHJKLMNPQRSTVWXYZ'
m = len(secreta)
sorteo = int(rnd.random()*m)+0
pista = secreta[sorteo]
whilenot(pista in consonante):
sorteo = int(rnd.random()*m)+0
pista = secreta[sorteo]
# actualiza estado del juego
estado = cambialetra(secreta,pista,estado)
# Control del Juego
turnomax = 2*m
gana = 1
falla = 0
print('Estado del juego: ', estado)
turno = 1
whilenot(turno>turnomax or gana==m):
letra = input(' adivine una letra: ')
if (letra in secreta):
gana = gana +1
estado = cambialetra(secreta,letra, estado)
mensaje = ' Adivinaste...' + letra
else:
falla = falla + 1
mensaje = ' NO es una letra de palabra...'print(mensaje)
print()
print('Estado del juego: ', estado)
print('turno:', turno)
print('fallas: ', falla)
turno = turno + 1
if (turno<=turnomax and gana==m):
mensaje = 'Felicitaciones, adivinó: ' + secreta
else:
mensaje = 'lo lamento, perdió..., la palabra era: '
mensaje = mensaje + secreta
# SALIDAprint(mensaje)
Recuerde que se ha dejado como tarea, realizar las instrucciones para cumplir que:
– sea indiferente usar mayúsculas/minúsculas
– contar solo letras adivinadas, no repetidas
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
«Cheat Sheet». algunas funciones y propiedades de referencia en Python usadas en evaluación. (desde 2016)
Numpy para arreglos
import numpy as np
np.zeros((numfilas,numColumnas),dtype='' ) # arreglo de ceros
np.ones((numfilas,numColumnas),dtype='' ) # arreglo de unos
np.array((numfilas,numColumnas),dtype='' ) # inicializa arreglo
np.empty((numfilas,numColumnas),dtype='' ) # arreglo vacio
np.unique(arreglo) # elementos sin repetir
np.max(arreglo) # valor máximo
np.argmax(arreglo) # posición del máximo
np.sum(arreglo) # suma de elementos
np.sum(arreglo, axis=1) # suma de una fila o columna (0/1)
np.mean(arreglo) # promedio del arreglo
np.shape(arreglo) # dimensiones de un arreglo
np.ndim(arreglo) # número de dimensiones
np.size(arreglo) # cantidad de casillas
arreglos.fill(valor) # rellena un arreglo con una constante
arreglos.reshape() # Redistribuye un arreglo
Cadenas de caracteres
cadenas.islower()
cadenas.isupper()
cadenas.lower() # convierte a minúsculas
cadenas.upper() # convierte a mayúsculas
cadenas.split('c') # separa el texto usando 'c'
cadenas.find('c') # encuentra la posicion de 'c'
cadenas.count('c') # cuenta las veces de 'c'
Listas
listas.append() # añade un elemento
listas.count() # cuenta elementos
listas.index() # indice de un elemento
listas.pop() # extrae el último elemento
elemento in listas # verifica si elemento esta en listas
listas.extend(...)
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']
>>>