Salta al contenido principal

Ejercicios Integradores Resueltos (Listas, Matrices, Diccionarios, Funciones)

Sitio: Facultad de Ingeniería U.Na.M.
Curso: Informática ET241/EM241/IC241/IN241/IM204
Libro: Ejercicios Integradores Resueltos (Listas, Matrices, Diccionarios, Funciones)
Imprimido por: Invitado
Día: miércoles, 18 de diciembre de 2024, 03:56

Descripción

Este libro pretende poner a disposición del Alumno Ejercicios integradores resueltos. Los temas incluidos son:

  • Listas
  • Matrices
  • Diccionarios
  • Funciones

Sr. Docente. Si Propone un ejercicio y lo resuelve por favor cree un capítulo y escriba la consigna y solución propuesta.

1. Ordenar una lista. Burbuja

Cargar por teclado una lista de números reales, luego ordenar  de menor a mayor comparando UNO contra TODOS utilizando una función (esto se conoce como método de la burbuja).

Googlear en internet buscar información sobre el método.


Ver que se usa la variable inicio, que va cambiando o avanzando en cada pasada, y otra variable llamada i que es la que recorre lo que resta del arreglo hacia la "derecha", para comparar contra todos los restantes elementos.

2. Lista tipo LIFO

Cree una lista tipo PILA , el primero que entra es el ultimo elemento.. es decir,  cada uno que se va agregando se va APILANDO  al anterior.

Esto se conoce como : LIFO (LIFO, Last In, First Out) . Se suele usar para organizar un depósito,  cuando una empresa cuenta con varios lotes del mismo producto, y teniendo en cuenta que los precios, generalmente aumentan con el paso del tiempo, lo que se hace es vender primero los productos más caros (los últimos que ingresaron) , sería un ejemplo.  Veamos como implementar LIFO con Python.


El programa debe proveer un menú que permita agregar, listar y eliminar elementos de la Lista LIFO.

lifo=[]
while True:
        print ('''Menú \n
               
               i-Ingresar un elemento a LIFO
               s-Sacar un elemento a LIFO
               m-mostrar LIFO
               f-fin del programa...''')
        opc=str(input("Ingrese su opción: "))
        print(opc)
        if opc=="i":
            lifo.append(int(input("Inrgese valor LIFO: ")))
        elif opc=="s":
            lifo.pop()
        elif opc=="m":
            print(lifo)
        elif opc=="f":
            break

3. Ordenar una lista. Vecinos

Cargar por teclado una lista de números reales, luego ordenar  de menor a mayor comparando VECINOS.

4. Ordenar Listas. Métodos

Este método ordena la lista en su lugar, utilizando solo "comparando entre elementos".

No se suprimen las excepciones: si falla alguna operación de comparación, fallará toda la operación de clasificación (y la lista probablemente quedará en un estado parcialmente modificado).

sort () acepta dos argumentos: key y reverse.

El valor posible para reverse es True.

Para key hay varias alternativas, veremos algunas mas adelante.

Veremos como usar métodos para ordenar listas. El método sort está documentado en:

https://docs.python.org/3.7/library/stdtypes.html?highlight=sort#list.sort

En la documentación sobre el uso para ordenar está en : https://docs.python.org/3/howto/sorting.html , podemos ver que existen dos métodos que permiten ordenar listas. Ellos son.

  1. sort ( cambia el orden de la lista  original)
  2. sorted (regresa otra lista, sin modificar la original)

El método sort es para ordenar una lista en forma ascendente ( 1,2,3..etc ó a,b,c  ó A,B,C).

Se puede cambiar el criterio indicando el argumento reverse=True, para el método

La línea 13, se puede ver el argumento reverse=True, que cambia el tipo de orden del método.

Notar que este método MODIFICA la LISTA, esto en algunos casos puede que no sea deseado, para esos casos Python tiene el método sorted.

Vemos que en este caso sorted crea una nueva lista ordenada, en este caso solo se imprime por pantalla la lista ordenada, también se podría guardar en otra lista, por ejemplo.

Veamos un ejemplo donde la lista contiene elementos que nos son homogéneos ( del mismo tipo de datos), para poder ordenar se deber "migrar" los datos al tipo string , pasando el argumento key=str al método sort.



5. Lista tipo FIFO

Hay un método de almacenamiento en depósitos llamado FIFO, (First in First Out ) el primero que ingresa es el primero que sale , pensemos en un producto que tiene fecha de vencimiento a los 7 días de ingresado al depósito, tenemos que vender lo mas viejo ( o que ingresó primero). Vamos a ver como implementar con Python este tipo de almacenamiento.

Consigna.

Cree una lista tipo FIFO ( Firs In , First Out ) y un menú para trabajar con esa memoria. El programa debe proveer un menú que permita lista, ingresar y sacar elementos de la Lista.


fifo=[]
while True:
        print ('''Menú \n
               
               i-Ingresar un elemento a FIFO
               s-Sacar un elemento a FIFO
               m-mostrar FIFO
               f-fin del programa...''')
        opc=str(input("Ingrese su opción: "))
        print(opc)
        if opc=="i":
            fifo.append(int(input("Ingrese valor LIFO: ")))
        elif opc=="s":
            fifo.pop(0)
        elif opc=="m":
            print(fifo)
        elif opc=="f":
            break

6. Carga de Matriz

Cargar una una matriz con números reales definiendo las dimensiones. 
Luego de cargada la matriz, mostrar los valores de la misma de manera estética ( una fila por línea).
Este ejercicio demuestra que la forma de visualizar una matriz no es lo mismo que una lista, es por eso que requiere de crear una lista para cada fila.
Recordemos que el método append, inserta un elemento al final de una lista.


7. Diccionario de Pacientes

"""
ESCRIBIR UN CODIGO QUE PERMITA:

MOSTRAR UN MENU CON LAS SIGUIENTES OPCIONES:
    1-CARGA DE DATOS DE PACIENTES
    2-MOSTRAR DATOS DE PACIENTE
    F-FINALIZAR EL PROGRAMA
    
PARA MOSTRAR EL MENU SE UTILIZARA UNA FUNCION LLAMADA mostrar_menu.

SI SE INGRESA 1 SE DEBERA LLAMAR A LA FUNCION carga, QUE CARGARA
UN DICCIONARIO QUE TENGA COMO CLAVES NUMEROS DE DNI, Y COMO VALORES
LISTAS QUE A SU VEZ CONTENGAN LA EDAD DEL PACIENTE Y SU ALTURA.

SI SE INGRESA 2 SE DEBERA INGRESAR POR TECLADO EL DNI DE UN
PACIENTE Y PASARSELO COMO ARGUMENTO A LA FUNCION
mostrar_paciente, BUSCARA EL DNI DENTRO DEL DICCIONARIO Y SI
HAY COINCIDENCIA RETORNARA LOS DATOS DEL PACIENTE PARA QUE
SEAN MOSTRADOS POR PANTALLA. SI NO HAY COINCIDENCIA SE DEBERA
MOSTRAR EL MENSAJE "PACIENTE INEXISTENTE".

SI SE INGRESA F O f SE DEBERA FINALIZAR EL PROGRAMA
"""
def mostrar_menu():
    print("Menu...")
    print("1-CARGA DE DATOS DE PACIENTES")
    print("2-MOSTRAR DATOS DE PACIENTE")
    print("F-FINALIZAR EL PROGRAMA")

def carga():
    dni=int(input("Ingrese el DNI del paciente: "))
    edad=int(input("Ingrese la edad del paciente: "))
    altura=float(input("Ingrese la altura del paciente: "))
    pacientes[dni]=[edad,altura]

def mostrar_paciente(ndni):
    encontrado=False
    for i in pacientes:
        if ndni==i:
            encontrado=True
            return(pacientes[i])
    if not encontrado:
        return([0,0])

pacientes={}

while True:
    mostrar_menu()
    op=input("Ingrese la opcion elegida...")
    
    if op=='1':
        carga()
    elif op=='2':
        numDNI=int(input("Ingrese el DNI del paciente a buscar: "))
        datos=mostrar_paciente(numDNI)
        if not datos==[0,0]:
            print("El paciente con DNI {} tiene {} años y mide {}m.".format(numDNI,datos[0],datos[1]))
        else:
            print("No se encontro al paciente...")
    elif op.upper()=='F':
        print("Finalizando...")
        break
    else:
        print("Opcion incorrecta, reingrese")

8. Mayor de Matriz

'''
Realizar un programa en Python que:
1)Invoque a una funcion menú que SOLO regresa una opcion válida del menu.
2)Que permita invocar a la función carga, que carga una matriz humedad de dimensiones N x M.
N y M definidas como constantes
3)Que permita invocar a la funcion mayor, que regresa el mayor valor de la diagonal principal.
4) Que presente una opción para finalizar el programa.
Los valores permitidos para carga en la matriz humedad son [0;100]
'''
#Funcion que valida ingresos, regresa opcion válida solo 1,2,3
def menu():
while True:
print('1-Cargar')
print('2-Buscar Mayor')
print('3-Salir')
opc=input('Ingrese opcion: ')
if not(opc=='1' or opc=='2' or opc=='3'):
print('opcion no válida.. reingrese')
else:
return opc # regresa 1 o 2 o3
#Funcion que carga matriz.
def carga(humedad):
for x in range(N):#este for recorre CADA fila por lo tanto x va tomar valores 0 y N-1
humedad.append(list())#lista que oficia de fila
for y in range(M):
while True:
ingreso=float(input('ingrese nro'))
if ingreso>=0 and ingreso<=10:
break
else:
print('valor no valido.. reingrese')
humedad[x].append(ingreso)# si es valido guardo.
return(True)

#Funcion que busca y regresa el mayor de la diagonal.
def mayor(humedad):
mayor=humedad[0][0]#propongo un elemento de la matriz como mayor
#El algoritmo que sigue busca si hay algún elemento mayor ...
for x in range(N):#este for recorre CADA fila por lo tanto x va tomar valores 0 y N-1
for y in range(M):
if humedad[x][y]>mayor:
mayor=humedad[x][y]#cuando encuentro uno mas grande que mayor lo tomo como mayor.
return(mayor)

N=2 #Defino dimensiones
M=3 #Defino dimensiones
humedad=[]#declaro una lista de nombre humedad.
cargada=False
while True:
opc=menu()
if opc=='1':
cargada=carga(humedad)# si regresa True es por que se cargó.
print(humedad)
elif opc=='2' :
if cargada:
print(mayor(humedad))
elif opc=='3':
print('saliendo')
break


9. Temperaturas Días Semana.

'''Consigna: 
Dado un diccionario que tiene los días laborares de la semana en el que se cargan
para cada día valores de 5 temperaturas del día que pueden estar en [-10,10] ó [20;50]
crear una función que muestre el menu siguiente:
1)Cargar un día...(paso como argumento las claves del diccionario..)
2)Mostrar día...(paso número de día 1 para Lunes,2 para Martes..)
3)Mostrar todo el diccionario ( un día por línea)
4)Mostrar el día que tuvo mayor promedio
5)Salir.
Cada punto del 1 al 4 implementar con una función.

'''
# Que faltaría para ir mejorando el programa?
# Que pasa si se carga dos veces un día? 
# Que pasa si se ingresan valores que no corresponden? letras en lugar de números.
# Puedo parametrizar los valores de temperatura?
# Que pasa si no cargue nada y ejecuto puntos 2,3,4?

datos={'Lunes':[],'Martes':[],'Miercoles':[],'Jueves':[],'Viernes':[]}

#------------------------------------------------------------
def menu():
   while True:
     print('1) Cargar un día de la semana')
     print('2) Mostra temperaturas de un día')
     print('3) Mostrar todo los datos')
     print('4) Mostrar el día con mayor promedio')
     print('5) Salir-finalizar el programa')
     opc=input('Ingrese una opción válida: ')
     if not(opc=='1' or opc=='2'or opc=='3'or opc=='4'or opc=='5'):
         print('La opción ingresada no es válida.. reingrese..')
     else:
        return opc
#------------------------------------------------------------
def cargar(dia):
    for i in range(5):
        temp=float(input('Ingrese la temperatura: '))
        while not((temp>=-10 and temp<=10) or (temp>=20 and temp<=50)):
            print('Ud. ingresó un valor que no pertence al rango..reingrese..')
            temp=float(input('Ingrese la temperatura: '))
        datos[dia].append(temp)

#------------------------------------------------------------
def mostrar_dia(dia):
    dias_semana=['Lunes','Martes','Miercoles','Jueves','Viernes']
    print(datos[dias_semana[dia-1]])
    
#------------------------------------------------------------
def mostrar_todo(): 
    print('-------------Valores cargados------------------')
    for z in datos:
        print(datos[z])
    print('------------------------------------------------')

#------------------------------------------------------------
def mayor_promedio():
    promedio_maximo=0
    for i in datos:
        print('i vale',i)
        acumulador=0
        for x in range(5):
            acumulador=acumulador+datos[i][x]
        if promedio_maximo<(acumulador/5):
            dia=i
    return dia

# Código principal-------------------------------------------------
while True:
    opc=menu()
    if opc=='1':
        while True:
            dia=input('Ingrese un día de la semana: ')
            dia=dia.capitalize()
            if dia in datos:
                cargar(dia)
                break
            else:
                print('El día ingresado no es válido. Reingrese..')
        print(datos)
    elif opc=='2':
        while True:
            dia=int(input('Ingrese un día de la semana: '))
            if dia in range(1,6):
                mostrar_dia(dia)
                break
            else:
                print('El día ingresado no es válido. Reingrese..')
    elif opc=='3':
        print('tres')
    elif opc=='4':
        print(mayor_promedio())
    elif opc=='5':
        break

10. Listas pares e impares

CONSIGNA

Realizar un programa que permita:

a) Llamar a una función que muestre un menú como el siguiente y retorne solo opciones 1, 2, 3 o F

1.- Cargar listas

2.- Buscar valor en la lista

F.- Finalizar

c) Si elige 1.  debe llamar a una función que debe ir ingresando valores hasta que ingrese el cero. Por cada valor que ingresa lo debe cargar a la lista pares o impares según corresponda.  Al final mostrar ambas listas.

d) Si elige 2. llamar a una función que pida que ingrese un número y la función lo busque en la lista que corresponda.  Si es par debe buscarlo en la lista pares o si es impar buscarlo en la lista impares.  Mostrar si se encuentra o no y si estuviera, en qué posición de la lista.

f) El programa solo termina con F para finalizar.

RESOLUCION
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 15 20:35:55 2021
@author: Andrea
"""
def menu():
    op=(input("Menu...1.-Cargar 2.-Buscar F.- Fin"))
    while (op!='1' and op!='2' and op!='f' and op!='F'):
        op=(input("Error. Menu...1.-Cargar 2.-Buscar F.- Fin"))
    return (op)
def carga():
    
    n=int(input("ingrese un nro"))
    while (n!=0):
       if (n%2==0):
           pares.append(n)
       else:
           impares.append(n)
       n=int(input("ingrese un nro"))   
    print (pares)
    print (impares)
def buscar(x):
    b = False
    if(x%2==0):
        for i in range(len(pares)):
            if (x==pares[i]):
                b=True
                print ("El valor {} se encuentra en la posicion {}".format(x,i))
        if not b:
            print ("el valor no se encuentra en la lista de pares")
    else:
        for i in range(len(impares)):
            if (x==impares[i]):
                b=True
                print ("El valor {} se encuentra en la posicion {}".format(x,i))
        if not b:
            print ("el valor no se encuentra en la lista de impares")
    
            
pares=[]
impares=[]          
op=menu()
while (op!='f' and op!='F'):
    if (op=='1'):
        carga()
    elif (op=='2'):
        x=int(input('Ingrese el nro a buscar: '))
        buscar(x)
    else:
        print ("chauuu")
    op=menu()





11. Diccionario con peso

Consigna

Realizar un programa que permita:

a)  cargar un número N. Validar que sea positivo sino reingresar.  Luego cargar un diccionario con los nombres de N pacientes y su peso. Validar peso entre 0 y 250 kg B

b) Mostrar un menú como el siguiente:

1.- Cantidad de personas que pesan mas que A

2.- Hay personas de menos de X kg?

3.- Promedio de pesos

F.- Finalizar

c) Si elige 1. ingresar un valor A y llamar a una función pasandole ese valor como argumento y retornar la cantidad de personas que superen en peso A pasado como argumento. El valor retornado mostrarlo en el programa.

d) Si elige 2. llamar a una función que pida que ingrese un valor X e informe si hay o no personas con menos de X kg. Si hubiere mostrar el nombre de esas personas en la función.

e) Si elige 3. llamar a una funcion que calcule y retorne el promedio de los pesos de las personas cargadas. El valor retornado mostrarlo en el programa.

f) El programa solo termina con F para finalizar. Si ingresa cualquier otro valor mostrar “Error”

Resolución

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 15 19:53:34 2021
@author: Andrea
"""
def ejer (peso):
    cont=0
    for j in pacientes:
        if (pacientes[j]>=peso):
            cont+=1
    return (cont)
def fun2 (peso):
    band = False
    
    for j in pacientes:
        if (pacientes[j]<=peso):
            band=True
            print ("Nombre conmenos  de {} kg: {}". format(peso,j))
    if (not band):
            print("No hubo personas con menos del peso ingresado")
    
def prom():
    suma=0
    for j in pacientes:
        suma+=pacientes[j]
    print ("El promedio de pesos es ", suma/len(pacientes))
    
    
    
N = int (input ("Ingrese el valor N"))
while N<0:
    N = int (input ("Erro. Re Ingrese el valor N"))
pacientes= {}
for i in range(N):
    clave=input('Ingrese el nombre del paciente: ')
    peso=float(input('Ingrese el peso del paciente: '))
    while peso < 0 or peso >250:
         peso=float(input('Error. ReIngrese el peso del paciente: '))
    pacientes[clave]=peso
print (pacientes)
opc=(input("Menu...1.- cantidad 2.- hay  3.- Promedio F.- Fin"))
while opc!='F'and opc!='f':
    if (opc=='1'):
        a = float(input('Ingrese el peso A a buscar: '))
        c = ejer(a)
        print("la cantidad de valores que supera los {} kg es {}".format(a,c))
    elif (opc=='2'):
        X=float(input('Ingrese el peso X a buscar: '))
        fun2(X)
    elif (opc=='3'):
        prom()
    elif (opc=='F') or (opc=='f'):
        print ("chauuu")
    else:
        print ("error. opcion incorrecta")
    opc=(input("Menu...1.- cantidad 2.- hay  3.- Promedio F.- Fin"))    

12. Manejo de Matrices

A continuación se presenta la consigna y la solución desarrollada por los alumnos en clase. Para cada función se presentaron códigos de lo más variado. No existió un criterio para definir el código de quién se subía al aula. En parte, sirve para ver la variedad de formas de pensar que existen.

"""
CONSIGNA:
Dada una matriz cuadrada, se requieren determinadas funciones para conformar un
programa más complejo.
Las funciones requeridas son las siguientes:
    
    media: Recibe como argumento la matriz bajo análisis. Devuelve el promedio
    de todos los valores de la matriz.
    
    buscaPositivo: Recibe como argumento la matriz bajo análisis. Si existe un
    número positivo devuelve True, caso contrario, False. Además, admite el 
    parámetro reverse=True, con el cual, realiza lo propio pero con valores
    negativos.
    
    buscaMayor: Recibe como argumento la matriz bajo análisis. Devuelve el
    mayor número de la matriz. Además, admite el parámetro reverse=True,
    con el cual, realiza lo propio pero con el menor valor.
    
    mayoresQue: Recibe como argumento la matriz bajo análisis y un valor.  
    Devuelve la cantidad de elementos que son mayores que el valor recibido
    como parámetro. Además, admite el parámetro reverse=True, con el cual, 
    realiza lo propio pero con los elementos menores al valor recibido.
    
    --DESAFIO--
    moda: Recibe como argumento la matriz bajo análisis. Retorna el valor que
    más se repite. Si hay más de un valor con la misma cantidad de
    repeticiones, se retorna cualquiera de ellos.
    
El programa presentará un informe, a raíz de analizar una matriz dada, con cada 
una de las opciones ofrecidas por las funciones. Ej:
    - La media de los valores de la Matriz es: ...
    - Existen ... valores Mayores que la media
    - Existen ... valores Menores que la media
    - La Matriz tiene valores Positivos
    - La Matriz No tiene valores Negativos
    - El Mayor valor encontrado es: ...
    - El Menor valor encontrado es: ...
"""
## FUNCIONES ##
def mostrar(matriz):
    # Recibe matriz y muestra por filas. No devuelve nada
    for fila in matriz:
        print(fila)
def media(matriz):
    acumulador = 0
    for x in matriz:
        for i in x:
            acumulador += i
    media = acumulador / (len(matriz) * len(matriz))
    return(media)
def buscaPositivo(matriz,reverse=False):
    positivos = 0
    negativos = 0
    for i in matriz:
        for j in i:
            if j > 0:
                positivos +=1                
            if j < 0:
                negativos +=1                
                
    if reverse == False and positivos != 0:
        return True
    if reverse == False and positivos == 0:
        return False
    if reverse == True and negativos != 0:
        return True
    if reverse == True and negativos == 0:
        return False
def buscaMayor(matriz, reverse=False):
    if reverse==False:
        maximos=[]
        for i in matriz:
            maximos.append(max(i))        
        maximo=max(maximos)
        return maximo
    else:
        minimos=[]
        for i in matriz:
            minimos.append(min(i))
        for j in minimos:
            minimo=min(minimos)
        return minimo
def mayoresQue(m,valor,reverse=False):
    c = 0
    for i in m:
        for j in i:
            if reverse==False:
                if j>valor:
                    c+=1
            if reverse==True:
                if j<valor:
                    c+=1
    return c    
## PROGRAMA PRINCIPAL ##
# Definición de la "matriz cuadrada" para la prueba de las funciones
matriz = [[1,2,3,4],
          [5,6,7,8],
          [9,2,3,4],
          [6,7,8,2]]
# matriz = [[-1,1,1,1],
#           [2,-2,2,2],
#           [3,3,-3,3],
#           [4,-4,4,4]]
# matriz = [[-1,-2,-3],
#           [-5,-6,-7],
#           [-9,-2,-8]]
print("-----------------INFORME:--------------")
print("La matriz es:")
mostrar(matriz)
print("La media de los valores de la matriz es: {}" .format(media(matriz)))
print("Existen {} valores Mayores que la media" .format(mayoresQue(matriz, media(matriz), reverse = False)))
print("Existen {} valores Menores que la media" .format(mayoresQue(matriz, media(matriz), reverse = True)))
if buscaPositivo(matriz, reverse = False):
    print("La Matriz tiene valores Positivos")
else:
    print("La Matriz no tiene Valores Positivos")
if buscaPositivo(matriz, reverse = True):
    print("La Matriz tiene valores Negativos")
else:
    print("La Matriz no tiene Valores Negativos")
print("El Mayor valor encontrado es: {}" .format(buscaMayor(matriz, reverse = False)))
print("El Menor valor encontrado es: {}" .format(buscaMayor(matriz, reverse = True)))

13. Más sobre matrices

'''
Dada una matriz de 4 filas y 3 columnas, realizar un programa en Python que 
permita:
      
    -Obtener los promedios de las filas y Mostrar.
    
    -Obtener los promedios de las columnas y Mostrar.
    
    -Cargar los valores en una lista y ordenarlos de menor a mayor o viceversa 
     segun selección del usuario, NO USAR MÉTODOS. Mostrar Lista Ordenada.
     
    -Reemplazar los elementos cuyo suma del INDICE de FILA y COLUMNA sean 
    números primos por -1.
    
    -Obtener su transpuesta. Mostrar.
    
    -Modificar los valores de la matriz, teniendo en cuenta que en los elementos
     cuya suma de las posiciones (fila, columna) es par solo pueden cargarse valores dentro 
     del rango [10 , 15], en caso de un ingreso incorrecto volver a pedir que ingrese un
     valor.
    
    -Validar que lo ingresado por teclado sea del tipo númerico.
Cada una de estas acciones se deben realizar en funciones.
Se debe presentar un menu con las opciones mostradas anteriormente en el cual se debe
validar que la opción ingresadas sea correcta y el programa termina solamente cuando se 
selecciona la opción de salir.
------MENU-----
1 - Mostrar Matriz
2 - Obtener Transpuesta
3 - Promedio de FILAS
4 - Promedio de COLUMNAS
5 - Ordenar valores
6 - Reemplazar primos
7 - Modificar matriz
s - SALIR
'''
#-----------------------------SOLUCIÓN-------------------------------------#
#Función que muestra la matriz.
#------------------------------------------------------------------------------#
def mostrar(matx):
    for i in MATRIZ:
        print(i)     
 
#Función que obtiene la transpuesta de la matriz.
#------------------------------------------------------------------------------# 
def transp():
    temp=[]
    for i in range(m):
        temp.append([])
        for j in range(n):
            temp[i].append(MATRIZ[j][i])
    for i in temp:
        print(i)
#Función que calcula el promedio de las filas.
#------------------------------------------------------------------------------#
def promedioF():
    print('El promedio de las FILAS es:')
    c = 0
    for i in MATRIZ:
        acc = 0
        for j in i:
            acc += j
        print('Fila {}: {:.2f}'.format(c,acc/m))
        c += 1
#Función que calcula el promedio de las columnas.
#------------------------------------------------------------------------------#    
def promedioC():
    print('El promedio de las COLUMNAS es:')
    for j in range(m):
        acc = 0
        for i in range(n):
            acc += MATRIZ[i][j]
        print('Columna {}: {:.2f}'.format(j,acc/n))
    
#Función que presenta los datos de la matriz ordenados de mayor a menor o viceversa
#según selección del usuario en una lista.
#------------------------------------------------------------------------------#
def ordenar(orden):
    tempLISTA = []
    for i in MATRIZ:
        tempLISTA = tempLISTA + i
    while True:
        cont = 0
        for i in range(len(tempLISTA)-1):
            if orden.lower() == 'a':
                if tempLISTA[i] > tempLISTA[i+1]:
                    tempLISTA[i] , tempLISTA[i+1] = tempLISTA[i+1] , tempLISTA[i]
                    cont += 1
            else:
                if tempLISTA[i] < tempLISTA[i+1]:
                    tempLISTA[i] , tempLISTA[i+1] = tempLISTA[i+1] , tempLISTA[i]
                    cont += 1                    
        if cont == 0:
            break                
    print(tempLISTA)
    #pass
def reempPrimos():
    for i in range(n):
        for j in range(m):
            temp = (i + j) + 2
            if temp > 1:
                for k in range(2 , temp+1):
                    if temp%k == 0 and k != temp:
                        break
                    elif k == temp:
                        MATRIZ[i][j] = -1
    for i in MATRIZ:
        print(i)
    
#Función que permite modificar todos los elementos de la matriz con restricciones
#para ciertas posiciones..
#------------------------------------------------------------------------------#
def modMatriz():
    for i in range(n):
        for j in range(m):
            if (i+j) % 2 == 0 and (i+j) != 0:
                while True:
                    z = input('Ingrese el nuevo valor del elemento [{}] [{}]: '.format(i,j))
                    z = verificaNUM(z)
                    if z != 'NaN':
                        if z < 10 or z > 15:
                            print('El número ingresado se encuentra fuera del rango admitido para el indice actual.\nVuelva a intentarlo.')
                        else:
                            break
            else:
                while True:
                    z = input('Ingrese el nuevo valor del elemento [{}] [{}]: '.format(i,j))
                    z = verificaNUM(z)
                    if z != 'NaN':
                        break
            MATRIZ[i][j] = z
#Función que verifica que lo que s eingresa por teclado sea númerico.
#------------------------------------------------------------------------------#
def verificaNUM(a):
    try:
        a = int(a)
        return a
    except ValueError:
        print('El valor ingresado no corresponde al tipo numerico.\nVuelva a intentarlo.')
        return 'NaN'                      
    
#-------------------------------PRINCIPAL-------------------------------------#
MATRIZ = [[4,5,6],[8,6,4],[7,1,9],[7,9,7]]
n = len(MATRIZ) #N° FILAS n=4
m = len(MATRIZ[0])#N° COLUMNAS m=3
op = ''
while op.lower() != 's':
        print('\t--------MENU-------\n\
    1 - Mostrar Matriz\n\
    2 - Obtener Transpuesta\n\
    3 - Promedio de FILAS\n\
    4 - Promedio de COLUMNAS\n\
    5 - Ordenar valores\n\
    6 - Reemplazar primos\n\
    7 - Modificar Matriz\n\
    s - SALIR')
        op = input('Seleccione una opción: ')
        if op.lower() == '1':
            mostrar()
        
        elif op.lower() == '2':
            transp()
        
        elif op.lower() == '3':
            promedioF()
        
        elif op.lower() == '4':
            promedioC()
        
        elif op.lower() == '5':
            a = ''
            while a != 'a' and a != 'd':
                a = input('¿Desea ordenar de forma Ascendente [A] o Descendente [D]?: ')
                if a != 'a' and a != 'd':
                    print('La opción ingresada es incorrecta. Vuelva a intentarlo.')
            ordenar(a)
        
        elif op.lower() == '6':
            reempPrimos()
        
        elif op.lower() == '7':
            modMatriz()
        
        elif op.lower() == 's':
            print('¡¡¡ADIOS!!!')
        
        else:
            print('Opción Invalida. Vuelva a intentarlo.')

14. Diccionarios. Facturas

Crear un diccionario que permita almacenar N facturas. La es clave el numero de factuira
y el valor el importe de la misma.
La carga finaliza cuando el usuario contesta que no desea cargar mas datos.
Luego, realizar las funciones necesarias para:
1) Mostar todo el diccionario
2) Imprimir solo los facturas con importe superior a 1000
3) consultar la factura ingresando el nro de factura
Si el alumno lo desea, puede rearmar el ejercicio utilizando un menu para las opciones 1,2 y 3.
'''
''' punto carga de facturas '''
def cargar():
facturas = {}
continua = "s"
while continua=="s":
nro = input("Ingrese el numero de la factura:")
importe = float(input("Ingrese el precio:"))
facturas[nro] = importe
continua = input("Quiere cargar otra factura:[s/n]")
return facturas


''' Muestra del dicionario'''
def mostrar(facturas):
print("Listado de todos las facturas")
for x in facturas:
print(x, facturas[x])

''' Mustra de facturas mayores a 1000'''

def imprimir_mayor(facturas):
print("Listado de facturas con importes mayores a 1000")
for nro in facturas:
if facturas[nro]>1000:
print(nro)

''' Busqueda de facturas por nro de factura'''
def buscar(facturas):
buscado=input("ingrese nro de factura a buscar")
if buscado in facturas:
print(" la factura se ha encontrado y el importe es {}".format(facturas[buscado]))
else:
print(" no se ha encontrado")



fact=cargar()
mostrar(fact)
imprimir_mayor(fact)
buscar(fact)

15. Area de Rectangulo

Realiza una función llamada area_rectangulo(base, altura) que devuelva el área del rectangulo a partir de una base y una altura. Se pide ingresar base y altura y le función calcula y muestra el Area del Rectángulo.

Solución:

def area_rectangulo(base, altura):
    return base*altura

altura=int(input("Ingrese Altura: "))
base=int(input("Ingrese Base: "))
print( area_rectangulo(base,altura) )

16. Area de Círuculo

Realiza una función llamada area_circulo(radio) que devuelva el área de un círculo a partir de un radio ingresado por teclado.

Solución:

import math
def area_circulo(radio):
    return (radio**2) * math.pi
radio=int(input("Ingrese Radio: "))
print( area_circulo(radio))

17. Punto Intermedio

Realiza una función llamada intermedio(a, b) que a partir de dos números ingresados por teclado, devuelva su punto intermedio.

Solución:

def intermedio(a, b):
    return (a + b) / 2
a=int(input("Ingrese 1er Valor: "))
b=int(input("Ingrese 2do Valor: "))
print( intermedio(a,b) )

18. Valor dentro de un intevalo

Se desea saber si un número se encuentra dentro de un segmento, fuera del segmento por encima o debajo.

Crear una función que regresa True o False. Recibe como argumento 3 números Reales: min,max,x.

y verifica si min<=x<=max, en ese caso regresa True. Caso contrario False.

Observación: Ver que sucede si no se puede garantizar que min<=max?  . Plantee el mismo ejercicio pero asumiendo que se pueden ingresar máximo y mínimo en distinto orden. El Programa deberá detectar el mayor y menor de manera de lograr el intervalo (mínino, máximo)

Solución:

def posicion(x, minimo, maximo):
    if x < minimo:
        return "debajo"
    elif x > maximo:
        return "encima"
    return "dentro"

minimo=int(input("Ingrese mínimo: "))
maximo=int(input("Ingrese máximo:"))
x=int(input("Ingrese x: "))
print("En número ingresado se encentra ",posicion(x, minimo,maximo), "del segmento")

¿Que sucede si mínimo>maximo?

 

19. Separar Listas Pares e impares

Realiza una función separar(lista) que tome una lista de números enteros DEFINIDA en el script y regresa dos listas ordenadas.

La primera con los números pares y la segunda con los números impares.

Recordar :

numeros = [-12, 84, 13, 20, -33, 101, 9] #Lista definida en el script
def separar(lista):
    lista.sort()# método ordenar lista
    pares = [] # creo una lista vacia
    impares = [] # creo una lista vacia
    for n in lista:
        if n%2 == 0:
            pares.append(n) #método append(), agrega elementos a la lista
        else:
            impares.append(n) #método append(), agrega elementos a la lista
    return pares, impares # ver que retorna 2 valores!
pares, impares = separar(numeros)
print(pares)
print(impares)

¿Que es eso append()?    La respuesta está aquí


20. Valores entre dos enteros.

Escribir el código que permita ingresar dos enteros , llame a una función pasando esos enteros como argumentos y muestre los valores comprendidos entre esos enteros.

Solución:

def numerosEntre(num1, num2):  
    if (num1 > num2):
        aux = num1
        num1 = num2
        num2 = aux
 
    for i in range(num1+1, num2):
        print(i)

x=int(input("Ingrese x: "))
y=int(input("Ingrese y: "))
numerosEntre(x,y)

¿Que sucede si x>y?


21. Factorial

Crear un programa que pida el ingreso de un nro. entero positivo y calcule el factorial.

Solución

def factorial(num):  
    resultado = num
    for i in range(num-1,1,-1): #interpretar los argumentos de range!
        resultado = resultado * i
    return resultado

x=int(input("Ingrese x, calcularemos x!: "))
print(factorial(x))

¿Que sucede x es negativo?Que sucede si x es cero?


22. Números Aleatorios

Hacer una función que nos genere 10 numeros aleatorios entre dos parámetros x ,y pasados.

from random import *
def generaNumeroAleatorio(minimo,maximo):
 
    try:
        if minimo > maximo:
            aux = minimo
            minimo = maximo
            maximo = aux
 
        return randint(minimo, maximo)
    except TypeError:
        print("Debes escribir numeros")
        return -1

x=int(input("Ingrese mínimo: "))
y=int(input("Ingrese máximo: "))
i=0
while i<10:
    print(generaNumeroAleatorio(x,y))
    i=i+1

¿Que es eso e try?    La respuesta está aquí


23. Banderas de países

Banderas de países

Realizar un programa con menú para cargar banderas de países con bandas tricolores.

El país sería la clave y los colores van en una lista. Cada opción llama a una función:
    Menú:
    A- cargar una bandera de país
    B- buscar por país
    C- buscar por color
    S- salir

* Cuando el usuario ingresa una opción del menú incorrecta, mostrar un mensaje
 * El programa finaliza cuando presiona la "S", considerar también las minúsculas

* A la carga, se le pasa como parámetro el nombre del pais y retorna True cuando finaliza la carga.

* Considerar antes de cargar un pais si éste ya no fue cargado, en ese caso emitir un mensaje
y permitir el reingreso de otro nombre de pais.
* Permitir la carga de más de un pais, preguntando luego de la carga del primero si quiere ingresar otro, si presiona el usuario "S" permitirá ingresar un segundo, en caso que presione cualquier otra tecla, volverá al menú principal.

 * Permitir al usuario ingresar el color que busca, si está que muestre el país, pero si no está retorne False yemita un mensaje en el programa principal.

Si el usuario elige la opcion A debe llamar a la funcion carga con argumento el nombre del pais, retorna un booleano.

Si el usuario elige la opción B debe llamar a la función buscapais que recibe como argumento el país a buscar y en la función muestra si encontró el nombre del país y los colores. Retorna un booleano que se evalúa en el programa principal por el False indicando que no se encontró el país.

Si el usuario elige la opción C debe llamar a la función buscacolor recibe como argumento el color a buscar. En la función, si encuentra, indica qué país tiene ese color caso contrario, emite un mensaje de "no encontrado". No retorna nada. 

Controlar que para realizar la opcion B o C antes debe haber cargado por lo menos un pais.

23.1. Resolución def

# DEFINICIÓN DE LAS FUNCIONES       
def carga(clave):
    lista=[]
    for i in range(3): #bucle para cargar los tres colores
        color=input("ingrese color: ")
        lista.append(color)        
        bande[clave]=lista
    print (bande)
    return True
def buscapais(p): # el parámetro es el nombre del pais   
    if p in bande:
        print("Está el pais", p, "sus colores son :", bande[p])
        return True        
    else:
        return False
        
def buscacolor(c):
    encuentra=False  # variable para saber si encuentra el color
    for k in bande:
        for l in range(len(bande)):
            if bande[k][l]==c:
                print("tiene el color ", c, " la bandera de ", k)
                encuentra= True   # cambia de valor cuando encuentra el color         
       
    if not(encuentra): # si terminaron los bucles y no cambió el valor 
        print("ninguna bandera cargada tiene el color ", c)  
        

23.2. Resolución programa principal

# PROGRAMA PRINCIPAL    
bande={}  # defino un diccionario vacío en el programa principal
cargado=False #variable para saber si se cargó un país, se ocupará en B y C
opc="X"
while opc != "S" and opc != "s":
    print ("Menú")
    print ("A- cargar una bandera ")    # carga(p) retorna True
    print ("B- buscar por país ")       # buscapais(p) retorna True o False si encuentra el pais
    print ("C- buscar por color ")      # buscacolor(c) retorna True o False si encuentra el color
    print ("S- salir ")
    opc=input("elija una opción del menú:")
    if opc =="S" or opc=="s":
        print("Salió del programa")
        break
    elif opc =="A" or opc=="a":
        repe="S"
        while repe =="S":
            pais=input("ingrese el pais: ")
            cargado=carga(pais)
            repe=input("Presione S si desea cargar otro país o N si no:")
    elif opc =="B" or opc=="b":
        if cargado ==False: 
            print ("No puede buscar un pais porque no se cargó ninguno, elija la opción A")
        else:
            pais=input("ingrese el pais a buscar: ")
            if not(buscapais(pais)):
                print("no se encuentra el pais ", pais)
    elif opc =="C" or opc=="c":
        if cargado==False:
            print ("No puede buscar un color porque no se cargó banderas, elija la opción A")
        else:
            color=input("ingrese el color a buscar: ")
            buscacolor(color)
    else:
        print("Opción incorrecta, por favor reintente")

24. Ejercicio Empresa

Enunciado

Se desea desarrollar un programa para el control de empleados en una empresa. El mismo debe contar con las siguientes funciones:

  • Función Menu
  • Función Carga
  • Función Turnos
  • Función Sectores

Función Menu:

  • No recibe argumentos
  • Debe mostrar en pantalla el siguiente menú:
    MENU:
    1: Carga de empleados
    2: Cantidad de empleados por turno
    3: Promedio de horas por sector
    S: Salir
  • Debe retornar la opción elegida por el usuario
  • Se debe llamar a esta función repetitivamente hasta que el usuario ingrese la opción "S".

Función Carga

  • Recibe como argumentos la cantidad de empleados a cargar (mayor a 0 y menor a 1000) y la lista donde se deben cargar.
  • Por cada empleado se debe crear un diccionario con las siguientes claves y valores:
    “legajo” : un número entero entre 0 y 1000
    “edad” : un número entero entre 18 y 65
    “sector” : un caracter (M: Mantenimiento, A: Administración, O: Operarios)
    “turno” : un caracter (M o T)
    “horas”: un número entre 10 y 40
  • Una vez cargado, el diccionario se debe agregar a la lista de empleados

Función Turnos

  • Recibe como argumentos un turno elegido por el usuario y la lista de empleados
  • Muestra en pantalla la cantidad de empleados que trabajan en dicho turno

Función Sectores

  • Recibe como argumentos un sector elegido por el usuario y la lista de empleados.
  • Retorna al programa principal el promedio de horas de trabajo en el sector elegido.

24.1. Paso 1: Estructura principal

Pasos a seguir para desarrollar el programa

Paso 1: Armar la estructura general del programa

Armo la estructura del programa con las definiciones de las funciones

  • Función Menu
  • Función Carga
  • Función Turnos
  • Función Sectores

En el programa principal, creo la lista vacía para almacenar los empleados.

24.2. Paso 2: Función Menú

Paso 2: Función Menú

  • No recibe argumentos
  • Debe mostrar en pantalla el siguiente menú:
    MENU:
    1: Carga de empleados
    2: Cantidad de empleados por turno
    3: Promedio de horas por sector
    S: Salir
  • Debe retornar la opción elegida por el usuario

¿Cómo me aseguro de que el usuario ingresa alguna de estas opciones y no otras?

24.3. Paso 3: Estructura del programa Principal

¿Cómo voy a llamar a la función "menu"?

¿Qué estructura repetitiva utilizo para que el programa se repita hasta que el usuario ingrese "S"?

¿Qué estructura utilizo para ingresar a las opciones del menú?

Para poder ingresar a las opciones 2 y 3, primero debería haber cargado por lo menos un empleado. ¿Cómo verifico esto?

24.4. Paso 4: Función Validar (OPCIONAL)

Como en la consigna veo que se van a solicitar muchos ingresos de números, para validar que se encuentren en los rangos correctos voy a utilizar la función “validar”.

24.5. Paso 5: Función Carga

  • Recibe como argumentos la cantidad de empleados a cargar (mayor a 0 y menor a 1000) y la lista donde se deben cargar.
  • Por cada empleado se debe crear un diccionario con las siguientes claves y valores:
    “legajo” : un número entero entre 0 y 1000
    “edad” : un número entero entre 18 y 65
    “sector” : un caracter (M: Mantenimiento, A: Administración, O: Operarios)
    “turno” : un caracter (M o T)
    “horas”: un número entre 10 y 40
  • Una vez cargado, el diccionario se debe agregar a la lista de empleados

En la definición de la función agrego los argumentos que recibe.

En el programa principal se debe solicitar el ingreso de la cantidad de empleados a cargar.

¿Qué estructura uso para repetir la carga con cada empleado?

Ahora debo solicitar los ingresos para cada clave del diccionario.

24.6. Paso 6: Función Turnos

  • Recibe como argumentos un turno elegido por el usuario y la lista de empleados
  • Muestra en pantalla la cantidad de empleados que trabajan en dicho turno

En la definición de la función agrego los argumentos que recibe.

En el programa principal solicito el ingreso de un turno (M o T).

¿Cómo puedo recorrer la lista para contar la cantidad de empleados en el turno?

24.7. Paso 7: Función Sectores

  • Recibe como argumentos un sector (M, A, O) elegido por el usuario y la lista de empleados.
  • Retorna al programa principal el promedio de horas de trabajo en el sector elegido.

En la definición de la función agrego los argumentos que recibe.

En el programa principal solicito al usuario el ingreso del sector.

¿Cómo llamo a la función desde el programa principal?

Ahora defino la función:

¿Qué necesito conocer para calcular el promedio?

¿Cómo utilizo estos contadores para sumar la cantidad de horas y de empleados por sector?

¿Qué pasa si la cantidad de empleados en el sector es 0? ¿Cómo salvo el error de división por cero?

24.8. Programa Completo

FUNCIONES

PROGRAMA PRINCIPAL

24.9. Opcional

Crear una función que reciba como argumento una cantidad de horas ingresada por teclado y muestre en pantalla los legajos de los empleados que trabajan una cantidad de horas igual o superior a la ingresada.

25. Cantidad elementos seguidos

Escribir una función empaquetar para una lista, donde epaquetar significa indicar la repetición de valores consecutivos mediante una tupla (valor, cantidad de repeticiones). Por ejemplo, empaquetar ([1, 1, 1, 3, 5, 1, 1, 3, 3]) debe devolver [(1, 3) , (3, 1) , (5, 1), (1, 2), (3, 2)].


25.1. Solución

# -*- coding: utf-8 -*-
"""
Editor de Spyder

Este es un archivo temporal
"""
def empaquetar(l):
    cantidad=len(l)    
    salida=[]
    cont=1
    for t in range(cantidad-1):# -1 por que tengo t+1
        if l[t]==l[t+1]:
            cont+=1
        elif t==cantidad-2:#los dos ultimos
                print("x")
                temp=[l[t],1]
                salida.append(tuple(temp))
                temp=[l[t+1],1]
                salida.append(tuple(temp))   
        else:
            temp=[l[t],cont]
            salida.append(tuple(temp))
            cont=1
    return(salida)
l=[]
n=int(input("Cuantos enteros tiene la lista? :"))
for x in range(n):
    l.append(int(input("Ingrese un entero:")))     
print("La lista a empaquetar es: ",l)
print(empaquetar(l))


26. Ejercicio Socios