2  2019-05-27
Examen de Inteligencia de los Negocios

Fecha de publicación

27 de mayo de 2019

Grado: Inteligencia de los Negocios
Fecha: 27 de Mayo de 2019

Ejercicio 2.1  

  1. Clonar con git el repositorio con la url https://github.com/asalberceu/examen-fundamentos-computadores-2019-05-27-parcial1.git.
  2. Crear una rama con los apellidos del alumno en mayúsculas y separados por un guión, es decir, <APELLIDO1-APELLIDO2>, y convertir esta rama en la rama activa.
  3. Crear el fichero ejercicio1.3.txt que contenga la salida del comando de Git que muestra para cada línea del fichero ejercicio2.py la información sobre el commit en que se realizó el último cambio en esa línea.
  4. Crear un fichero ejercicio1.4.txt que contenga la salida del comando que muestra las diferencias entre el primer y el segundo commits del repositorio.
  5. Crear un fichero ejercicio1.5.txt que contenga la salida del comando de Git que muestra el estado actual del repositorio.
  6. Añadir todos los cambios a la zona temporal de intercambio y hacer un commit con el mensaje “Añadidas respuestas.”
> git clone https://github.com/asalberceu/examen-fundamentos-computadores-2019-05-27-parcial1.git
> cd examen-fundamentos-computadores-2019-05-27-parcial1.git
> git checkout -b SANCHEZ-ALBERCA
> git annotate ejercicio2.py > ejercicio1.3.txt
> git diff afce5 b4a76 > ejercicio1.4.txt
> git status > ejercicio1.5.txt
> git add . 
> git commit -m "Añadida respuestas."

Ejercicio 2.2 Escribir un programa que pida al usuario un número entero \(n\) y muestre por pantalla un triángulo el de más abajo.

    * 
   ***
  *****
 *******
*********

donde \(n\) es el número de filas del triángulo.

Solución 1

# Preguntamos el número de filas del triángulo y lo convertimos en un entero
n = int(input('Introduce el número de filas del triángulo: '))
# Recorremos con un bucle cada fila del triángulo
for i in range(n):
    # Añadimos con un bucle el número de espacios de cada línea para que los asteriscos aparezcan centrados
    for j in range(n-i-1):
        print(' ', end='')
    # Añadimos con otro bucle el número de asteriscos de cada línea
    for j in range(2*i+1):
        print('*', end='')
    print()
Introduce el número de filas del triángulo:  10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

Solución 2

# Preguntamos el número de filas del triángulo y lo convertimos en un entero
n = int(input('Introduce el número de filas del triángulo: '))
# Recorremos con un bucle cada fila del triángulo
for i in range(n):
    # Añadimos el número de espacios de cada línea para que los asteriscos aparezcan centrados
    print(' '*(n-i-1), end='')
    # Añadimos el número de asteriscos de cada línea.
    print('*'*(2*i+1))
Introduce el número de filas del triángulo:  10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

Ver notebook de la solución en Colab

Ejercicio 2.3 Escribir un programa para ver los beneficios de una empresa en un periodo de años.

El programa debe cumplir los siguientes requisitos:

  • El programa tiene que preguntar al usuario por un año inicial y otro final, y después preguntar por los ingresos y los gastos de cada año desde el año inicial hasta el año final.
  • Con los datos introducidos se deben crear dos listas, una con los ingresos y otra con los gastos, de manera que los ingresos y los gastos de cada año aparezcan en la misma posición de las listas.
  • El programa debe crear otra lista con el beneficio de cada año (ingresos menos gastos) y mostrarla por pantalla.
  • El programa debe crear otra lista booleana que indique para cada año si ha habido beneficios o no y mostrarla por pantalla.
  • Finalmente el programa debe mostrar por pantalla la lista de los años con beneficios la lista de los años con pérdidas.
# Pregunta por los años inicial y final
inicio = int(input('Introduce el año inicial: '))
fin = int(input('Introduce el año final: '))
# Definimos las listas de años, ingresos y gastos vacías
años = []
ingresos = []
gastos = []
# Preguntamos por los ingresos y gastos de cada año y los añadimos a las listas correspondientes
for i in range(inicio, fin+1):
    años.append(i)
    ingresos.append(float(input('Ingresos del año ' + str(i) + ': ')))
    gastos.append(float(input('Gastos del año ' + str(i) + ': ')))
# Creamos la lista de beneficios vacía
beneficios = []
# Recorremos las listas de ingresos y gastos, calculamos la diferencia para los elementos que ocupan la misma posición y lo añadimos a la lista de beneficios.
for i in range(len(ingresos)):
    beneficios.append(ingresos[i] - gastos[i])
print(beneficios)
# Creamos la lista vacía para ver qué años ha habido beneficios
hay_beneficio = []
# Recorremos la lista de beneficios y añadimos a la lista hay_beneficio True si el beneficio es positivo y False en caso contrario
for i in range(len(beneficios)):
    hay_beneficio.append(beneficios[i] > 0)
print(hay_beneficio)
# Creamos dos listas vacías para los años con beneficios y los años con pérdidas
años_beneficios = []
años_perdidas = []
# Recorremos la lista hay_beneficio y dependiendo de si el valor es True o False añadimos el año correspondiente a la lista de años con beneficio o a la de años con pérdidas.
for i in range(len(hay_beneficio)):
    if hay_beneficio[i]:
        años_beneficios.append(años[i])
    else:
        años_perdidas.append(años[i])
print('Años con beneficios: ', años_beneficios)
print('Años con pérdidas: ', años_perdidas)
Introduce el año inicial:  2015
Introduce el año final:  2018
Ingresos del año 2015:  100000
Gastos del año 2015:  80000
Ingresos del año 2016:  120000
Gastos del año 2016:  125000
Ingresos del año 2017:  140000
Gastos del año 2017:  100000
Ingresos del año 2018:  150000
Gastos del año 2018:  125000
[20000.0, -5000.0, 40000.0, 25000.0]
[True, False, True, True]
Años con beneficios:  [2015, 2017, 2018]
Años con pérdidas:  [2016]

Ver notebook de la solución en Colab

Ejercicio 2.4 Definir una función que reciba un número entero entre 0 y 999, y devuelva una cadena con la cantidad introducida en palabras. Por ejemplo, si se introduce 647 debe devolver la cadena “seiscientos cuarenta y siete”.

La función debe cumplir los siguientes requisitos:

  • El único parámetro de entrada de la función es un número entero entre 0 y 999.
  • Deben usarse diccionarios para emparejar cada dígito con la palabra correspondiente para las unidades, decenas y centenas.
  • Debe devolver una cadena con la cantidad introducida en palabras.

Solución 1

def enuncia_cantidad(n):
    """
    Función que recibe una cantidad n y devuelve una cadena con la misma cantidad expresada en palabras.
    Parámetros:
        - n es un número entero entre 1 y 999.
    Devuelve:
        Una cadena con la cantidad n expresada en palabras.
    """
    # Diccionarios con las traducciones de número a palabra para las unidades, decenas y centenas.
    unidades = {0:'', 1:'uno', 2:'dos', 3:'tres', 4:'cuatro', 5:'cinco', 6:'seis', 7:'siete', 8:'ocho', 9:'nueve'}
    decenas = {0:'', 1:'diez', 2:'veinte', 3:'treinta', 4:'cuarenta', 5:'cincuenta', 6:'sesenta', 7:'setenta', 8:'ochenta', 9:'noventa'}
    centenas = {0:'', 1:'ciento', 2:'doscientos', 3:'trescientos', 4:'cuatrocientos', 5:'quinientos', 6:'seiscientos', 7:'setecientos', 8:'ochocientos', 9:'novencientos'}
    # Obtenemos las centenas mediante división entera por 100
    cen = n // 100 # Otra alternativa es cen = int(str(n)[0])
    # Obtenemos las decenas mediante división entera por 10 y luego tomando el resto de la división entera por 10
    dec = (n // 10) % 10 # Otra alternativa es dec = int(str(n)[1])
    # Obtenemos las unidades mediante el resto de la visión entera por 10.
    uni = n % 10 # Otra alternativa es cen = int(str(n)[2])
    # Definimos el nexo entre las decenas y las unidades
    if not uni:
        # Si no hay unidades no hay nexo.
        nexo = ''
    elif not dec:
        # Si hay unidades pero no decenas no hay nexo.
        nexo = ''
    else:
        # Si hay unidades y decenas el nexo es 'y'
        nexo = ' y '

    return centenas[cen] + decenas[dec] + nexo + unidades[uni]

# Varias llamadas a la función de prueba
print(647, ':', enuncia_cantidad(647))
print(30, ':', enuncia_cantidad(30))
print(6, ':', enuncia_cantidad(6))
print(100, ':', enuncia_cantidad(100))
647 : seiscientoscuarenta y siete
30 : treinta
6 : seis
100 : ciento

Solución 2

def enuncia_cantidad(n):
    """
    Función que recibe una cantidad n y devuelve una cadena con la misma cantidad expresada en palabras.
    Parámetros:
        - n es un número entero entre 1 y 999.
    Devuelve:
        Una cadena con la cantidad n expresada en palabras.
    """
    # Diccionarios con las traducciones de número a palabra para las unidades, decenas y centenas.
    unidades = {0:'', 1:'uno', 2:'dos', 3:'tres', 4:'cuatro', 5:'cinco', 6:'seis', 7:'siete', 8:'ocho', 9:'nueve'}
    decenas = {0:'', 1:'diez', 2:'veinte', 3:'treinta', 4:'cuarenta', 5:'cincuenta', 6:'sesenta', 7:'setenta', 8:'ochenta', 9:'noventa'}
    centenas = {0:'', 1:'ciento', 2:'doscientos', 3:'trescientos', 4:'cuatrocientos', 5:'quinientos', 6:'seiscientos', 7:'setecientos', 8:'ochocientos', 9:'novencientos'}
    # Obtenemos las centenas mediante división entera por 100
    cen = n // 100  # Otra alternativa es cen = int(str(n)[0])
    # Obtenemos las decenas mediante división entera por 10 y luego tomando el resto de la división entera por 10
    dec = (n // 10) % 10  # Otra alternativa es dec = int(str(n)[1])
    # Obtenemos las unidades mediante el resto de la visión entera por 10.
    uni = n % 10  # Otra alternativa es cen = int(str(n)[2])
    # Definimos el nexo entre las decenas y las unidades
    if not uni:
        # Si no hay unidades no hay nexo.
        nexo = ''
    elif not dec:
        # Si hay unidades pero no decenas no hay nexo.
        nexo = ''
    else:
        # Si hay unidades y decenas el nexo es 'y'
        nexo = ' y '

    return centenas[cen] + decenas[dec] + nexo + unidades[uni]

# Varias llamadas a la función de prueba
print(647, ':', enuncia_cantidad(647))
print(30, ':', enuncia_cantidad(30))
print(6, ':', enuncia_cantidad(6))
print(100, ':', enuncia_cantidad(100))
647 : seiscientoscuarenta y siete
30 : treinta
6 : seis
100 : ciento

Ver notebook de la solución en Colab

Ejercicio 2.5 El fichero cotizacion.csv contiene las cotizaciones de las empresas del IBEX35 con las siguientes columnas: nombre (nombre de la empresa), Final (precio de la acción al cierre de bolsa), Máximo (precio máximo de la acción durante la jornada), Mínimo (precio mínimo de la acción durante la jornada), volumen (Volumen al cierre de bolsa), Efectivo (capitalización al cierre en miles de euros).

  1. Construir una función que abra un fichero con el formato anterior y devuelva un diccionario con los datos del fichero por columnas.

    La función debe cumplir los siguientes requisitos:

    • La función recibirá como único parámetro la ruta del fichero.
    • Debe realizarse un preprocesado de los datos que reemplace la coma por el punto como separador de decimales.
    • Debe realizarse el control de errores mediante excepciones para el caso de que el fichero no exista en la ruta indicada.
    • Debe devolver un diccionario con tantos elementos como columnas tenga el fichero, donde la clave de cada par sea el nombre de la columna y el valor la lista de datos de la columna.
  2. Construir una función que reciba el diccionario devuelto por la función anterior y cree un fichero en formato csv con el mínimo, el máximo y la media de dada columna.

    La función debe cumplir los siguientes requisitos:

    • La función recibirá como parámetros el diccionario con los datos de cotización y la ruta del fichero a crear.
    • El fichero generado tendrá las mismas columnas que el fichero cotizacion.csv con los mismos nombres de columnas, y tres líneas correspondientes al mínimo, máximo y media de los datos de cada columna. En la columna nombre en lugar del nombre de la empresa debe aparecer la medida calculada en esa línea (mínimo, máximo o media). Los datos deben estar separados por punto y coma.
def limpiar(cifra):
    """
    Función que elimina los puntos de separación de miles y cambia las comas de separación de decimales por puntos.
    Parámetros:
        - cifra: Es una cadena con una cifra
    Devuelve:
        Un real con la cifra de la cadena después de eliminar el separador de miles y cambiar el separador de decimales por punto.
    """
    cifra = cifra.replace('.', '')
    cifra = cifra.replace(',','.')
    return float(cifra) 

def preprocesado(ruta):
    """
    Función que preprocesa los datos contenidos en un fichero con formato csv y devuelve un diccionario con los nombres de las columnas como claves y las listas de valores asociados a ellas.
    Parámetros:
        - ruta: Es una cadena con la ruta del fichero.
    Devuelve:
        Un diccionario con pares formados por los nombres de las columnas y las listas de valores en las columnas.
    """
    try:
        # Abrimos el fichero en modo lectura
        f = open(ruta, 'r')
    except FileNotFoundError:
        print('El fichero no existe.')
        return
    # Leemos el fichero por líneas en una lista
    lines = f.readlines()
    # Cerramos el fichero
    f.close()
    # Leemos las claves del primer elemento de la lista y eliminamos el cambio de línea que aparece al final
    claves = lines[0]
    # Eliminamos el cambio de línea que aparece al final y dividimos la cadena por el punto y coma
    claves = claves[:-1].split(';')
    # Creamos el diccionario
    cotizaciones = {}
    # Inicializamos el diccionario con listas vacías
    for i in claves:
        cotizaciones[i] = []
    # Recorremos la lista línea a línea
    for linea in lines[1:]:
        # Eliminamos el cambio de línea que aparece al final y dividimos la cadena por el punto y coma
        linea = linea[:-1].split(';')
        cotizaciones[claves[0]].append(linea[0])
        # Añadimos cada dato a la lista correspondiente del diccionario
        for i in range(1, len(cotizaciones)):
            cotizaciones[claves[i]].append(limpiar(linea[i]))
    return cotizaciones


def resumen_cotizacion(cotizaciones, ruta):
    """
    Función que recibe un diccionario con los valores de cotización y crear un fichero con un resumen con el mínimo, el máximo y la media.
    Parámetros:
        - cotizaciones: Es un diccionario con pares cuyas claves son los nombres de la variables medidas y cuyos valores son las listas de valores de cada variable.
        - ruta: Es una cadena con la ruta del fichero.
    """
    # Eliminamos el primer par del diccionario que contiene los nombres de las empresas
    del(cotizaciones['Nombre'])
    # Abrimos el fichero en modo escritura
    f = open(ruta, 'w')
    # Escribimos en la primera línea los nombres de las columnas
    f.write('Nombre')
    for clave in cotizaciones.keys():
        f.write(';' + clave)
    # Calculamos los mínimos de cada lista y los escribimos en las columnas correspondientes
    f.write('\nMínimo')
    for valores in cotizaciones.values():
        f.write(';' + str(min(valores)))
    # Calculamos los máximos de cada lista y los escribimos en las columnas correspondientes
    f.write('\nMáximo')
    for valores in cotizaciones.values():
        f.write(';' + str(max(valores)))
    # Calculamos las medias de cada lista y las escribimos en las columnas correspondientes
    f.write('\nMedia')
    for valores in cotizaciones.values():
        f.write(';' + str(sum(valores)/len(valores)))
    f.close()
    return


# Llamada a las funciones de prueba
cotizaciones = preprocesado('cotizacion.csv')
resumen_cotizacion(cotizaciones, 'resumen-cotizacion.csv')

Ver notebook de la solución en Colab

Ejercicio 2.6 Definir una función que reciba una lista de facturas, un NIF y un mes, y devuelva un diccionario con el número de facturas emitidas a ese NIF en el mes indicado y el total facturado en ese mes.

La función debe cumplir los siguientes requisitos:

  • Los parámetros de entrada serán una lista de facturas, una cadena con un NIF y otra cadena con el mes.
  • Cada factura se representarán mediante un diccionario con las claves nif (NIF del cliente), mes (mes de emisión de la factura), cantidad (cantidad facturada sin IVA), iva (porcentaje de IVA a aplicar).
  • Se debe crear una lista con el total de cada factura (una vez aplicado el IVA) para el NIF y el mes indicados utilizando programación funcional o comprensión de listas.
  • La función debe devolver un diccionario con el número de facturas y el total facturado al NIF en el mes indicado.
def facturacion(facturas, nif, mes):
    """
    Función que recibe una lista de facturas y devuelve el número de facturas y el total facturado correspondiente a un nif y mes indicados.
    Parámetros:
        - facturas: Es una lista de facturas, donde cada factura es un diccionario con las claves nif, mes, cantidad e iva.
        - nif: Es una cadena con un nif.
        - mes: Es una cadena con el nombre de un mes.
    Devuelve:
        Un diccionario con el número de facturas y el total facturado (incluído el iva) al nif indicado en el mes indicado.
    """
    # Filtramos la lista para quedarnos con la lista de las cantidades de cada diccionario que tenga el nif y el mes indicados
    filtro = [factura['cantidad'] * (1 + factura['iva'] / 100) for factura in facturas if (factura['nif'] == nif and factura['mes'] == mes)]
    # Devolvemos un diccionario con la longitud de la lista (número de facturas) y la suma de sus valores (total facturado)
    return {'Num facturas': len(filtro), 'Total facturado': sum(filtro)}


# Lista de facturas de prueba
facturas = [{'nif': 'B12345678', 'mes': 'marzo', 'cantidad':1000, 'iva': 10},
            {'nif': 'A98765432', 'mes': 'julio', 'cantidad':500, 'iva': 21},
            {'nif': 'B12345678', 'mes': 'marzo', 'cantidad':2000, 'iva': 21},
            {'nif': 'C02040506', 'mes': 'enero', 'cantidad':200, 'iva': 4},
            {'nif': 'A98765432', 'mes': 'julio', 'cantidad':1500, 'iva': 10},
            {'nif': 'B12345678', 'mes': 'abril', 'cantidad':600, 'iva': 10},
            {'nif': 'B12345678', 'mes': 'marzo', 'cantidad':100, 'iva': 4}]

# Llamadas a la función de prueba
print(facturacion(facturas, 'B12345678', 'marzo'))
print(facturacion(facturas, 'B12345678', 'abril'))
print(facturacion(facturas, 'B12345678', 'agosto'))
{'Num facturas': 3, 'Total facturado': 3624.0}
{'Num facturas': 1, 'Total facturado': 660.0}
{'Num facturas': 0, 'Total facturado': 0}

Ver notebook de la solución en Colab