Logo Studenta

AYUDANTÍA 14 ENUNCIADO Y SOLUCIÓN

¡Estudia con miles de materiales!

Vista previa del material en texto

1 
 
Universidad de los Andes 
Facultad de Ciencias Económicas y Empresariales 
Ingeniería Comercial 
Programación y Manejo de la Información 3-2020 
 
Ayudant́ıa 1 4 Examen 
Consultas 
23 de Noviembre de 2020 
Profesores: Andrés Kipreos - Agust́ın Lagos - Stefan Elbl 
Ayudante: Jorge Rivas 
 
 
1. SQL (Anidada con agregación) 
 
Para esta pregunta se utilizará la base de datos de Invoicing ya utilizada en ejercicios anteriores. La 
base está compuesta por 4 relaciones: Cliente, Invoices, Payment_methods y Payments. Para hacer un 
recordatorio general se abordará una pregunta que incorpora tanto componentes de una consulta 
anidada y como de una consulta de agregación. 
 
- A partir de los clientes que han realizado pago (total o parcial) de las facturas adeudadas, 
consiga el nombre del cliente que sume el mayor monto (sumando todos sus pagos realizados), 
la suma del monto y uno de los métodos de pago utilizado (dado que pudo utilizar más de uno. 
 
Respuesta: 
 
SELECT c.name, ii.client_id, pm.name, ii.total 
FROM (SELECT i.client_id, i.invoice_id, SUM(payment_total) as total 
FROM invoices i 
WHERE i.payment_date IS NOT null 
GROUP BY i.client_id) ii 
JOIN clients c 
ON c.client_id = ii.client_id 
JOIN payments p 
ON p.invoice_id = ii.invoice_id 
JOIN payment_methods pm 
ON pm.payment_method_id = p.payment_method 
WHERE ii.total IN (SELECT MAX(aa.total2) 
FROM (SELECT SUM(a.payment_total) as total2 
FROM invoices a 
WHERE a.payment_date IS NOT null 
GROUP BY a.client_id) aa); 
 
 
 
2 
2. Condiciones borde y Validación. 
 
2.1 Siempre que se programa se deben considerar condiciones borde, pero que es una condición 
borde? Es una condición que hace que el programa no funcione como estaba diseñado. Básicamente 
la idea es siempre programar pensando en que alguien va a querer romper o engañar tu programa. 
 
Pongamos un ejemplo, escriba un programa que le pida al usuario un número y usando un while haga 
un print de una cuenta regresiva de ese número hasta cero. 
 
Ahora, ¿qué pasa si el usuario ingresa un número negativo? Este sería un caso borde. ¿Cómo lo 
solucionaría? 
 
Solución: 
 
n=int(input("Ingrese un número: ")) 
while n<0: 
 n=int(input("Numero inválido. Ingrese otro número: ")) 
 
while n>=0: 
 print(n) 
 n-=1 
 
Para evitar casos borde como el anterior se pueden aplicar validaciones, es decir, se puede pedir el 
input del usuario en un while que valide cada vez que se ingresa el dato. Por ejemplo: 
 
 
 
2.2 Escriba un programa que primero le pida el precio de un producto (validando que sea un número 
mayor a cero) y después que le pida cuanto se pagó por el producto y valide que el pago sea mayor 
al precio. Si el pago es menor pida al usuario que ingrese nuevamente el pago. 
 
Solución: 
 
precio=float(input("ingrese el precio del producto: ")) 
while precio<=0: 
 precio=float(input("ingrese el precio del producto: ")) 
 
pago=float(input("ingrese cuanto se pagó: ")) 
while pago<precio: 
 pago=float(input("ingrese cuanto se pagó: ")) 
print(int(pago - precio)) 
 
 
 
3 
3. Diccionario 
 
3.1 Escribir un programa que cree un diccionario simulando una cesta de la compra. El programa debe 
preguntar el artículo y su precio y añadir el par al diccionario, hasta que el usuario decida terminar. 
Después se debe mostrar por pantalla la lista de la compra y el coste total, con el siguiente formato. 
 
 
 
Solución 
 
basket = {} 
more = 'Si' 
while more == 'Si': 
 item = input('Introduce un artículo: ') 
 price = float(input('Introduce el precio de ' + item + ': ')) 
 basket[item] = price 
 more = input('¿Quieres añadir artículos a la lista (Si/No)? ') 
cost = 0 
print('Lista de la compra') 
for item, price in basket.items(): 
 print(item, '\t', price) 
 cost += price 
print('Coste total: ', cost) 
 
 
3.2 a) Escribir un programa que cree un diccionario lo vaya llenado con llaves que describan a una 
persona (por ejemplo, nombre, edad, sexo, teléfono, correo electrónico, etc.). Inicialmente cada valor 
debe quedar con listas vacías. Al finalizar se debe imprimir las llaves del diccionario 
 
Solución 
def diccionario(): 
 global personas 
 personas = {} 
 more = 'si' 
 while more=='si': 
 key = input('¿Qué dato quieres introducir? ') 
 value = [] 
 personas[key] = value 
 more = input('¿Quieres añadir más información (si/no)? ') 
 print("Las llaves creadas en tu diccionario personas son:",personas) 
4 
Para trabajar con diccionarios se pueden crear múltiples funciones y estas pueden quedar a la medida 
de uno según lo que uno vaya necesitando. 
 
b) Intenta crear una función en la cual se le entrega un diccionario y esta imprime las llaves de este. 
 
Solución 
 
def consultar(x): 
 print(x.keys()) 
 
c) Inventa una función en la cual se puedan agregar valores a un diccionario ya creado. 
 
Solución 
 
def agregarValores(x): 
 y= 'si' 
 while (y =='si'): 
 for key in x: 
 valor = input('que valor quieres agregar a la llave '+ key +'?') 
 x[key].append(valor) 
 y=input('¿Quieres añadir mas valores a la lista (si/no)? ') 
 print(x) 
 
 
 
Las soluciones no son únicas y existen múltiples formas de resolver un 
problema. 
 
Éxito en el Examen !!!!

Otros materiales