Está en la página 1de 10

Departamento de Estadística, Informática y Matemáticas

Estatistika, Informatika eta Matematika Saila

Examen de Informática (TIC)


1º Ingenierías
11-01-2021
Nombre: Grupo:
Ejercicio 1 (4 puntos)
Se denominan "matrices dispersas" a aquellas matrices en las que la mayoría de sus
elementos son cero. Cuando estas matrices tienen una dimensión muy elevada, la cantidad
de ceros es tan alta que, en aras de la eficiencia, se suelen utilizar representaciones
alternativas a la habitual (lista de listas con todos los elementos de la matriz). Una de las más
sencillas se denomina COO y consiste en almacenar, por cada elemento de la matriz no nulo
(distinto de cero), la fila y la columna en la que se sitúa. Toda esta información se guardaría
en una matriz de 3 columnas y tantas filas como elementos no nulos. Así, por cada elemento
no nulo se generaría una nueva fila en la que:

 el primer número representa el valor del elemento


 el segundo número representa la fila en la que está situado
 el tercer número representa la columna en la que está situado

Así, por ejemplo, la siguiente matriz de dimensión 5x5 tiene 4 elementos no nulos

m = [[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[-1, 0, 0, 0, 0],
[1, 2, 0, 0, 0],
[0, 0, 0, 0, 0]]

 el elemento 1, que está situado en la fila 0, columna 2


 el elemento -1, que está situado en la fila 2, columna 0
 el elemento 1, que está situado en la fila 3, columna 0
 el elemento 2, que está situado en la fila 3, columna 1

Por tanto, la representación COO de la matriz m sería:

d = [[1, 0, 2],
[-1, 2, 0],
[1, 3, 0],
[2, 3, 1]]

Implementa las siguientes funciones relacionadas con matrices dispersas:

 normal_a_dispersa: recibe como parámetro una matriz m en su formato habitual (NxM


elementos) y devuelve la matriz en formato COO (elemento/fila/columna), que será una
matriz de q x 3, donde q es el número de elementos no nulos de la matriz de entrada.
(1 punto)
Ejemplo:
Entrada: Salida:
m = [[0, 0, 1, 0, 0], d = [[1, 0, 2],
[0, 0, 0, 0, 0], [-1, 2, 0],
[-1, 0, 0, 0, 0], [1, 3, 0],
[1, 2, 0, 0, 0], [2, 3, 1]]
[0, 0, 0, 0, 0]]

 dispersa_a_normal: función que hace justo lo contrario que la función anterior. Esta vez
la función debe recibir, además de la matriz d, el número de filas N y de columnas M de
la matriz en formato habitual que se desea construir. (1 punto)

Ejemplo:
Entrada: Salida:
d = [[1, 0, 2], m = [[0, 0, 1, 0, 0],
[-1, 2, 0], [0, 0, 0, 0, 0],
[1, 3, 0], [-1, 0, 0, 0, 0],
[2, 3, 1]] [1, 2, 0, 0, 0],
N = 5 [0, 0, 0, 0, 0]]
M = 5

 densidad: recibe como parámetro de entrada una matriz m en formato habitual y devuelve
la proporción de elementos no nulos respecto al número de elementos originales de la
matriz. Así, por ejemplo, si la matriz original era de 5x5 y contiene únicamente 5
elementos no nulos, entonces la proporción es de 0.2. (0.5 puntos)
 es_nulo: recibe como parámetro de entrada una matriz d en formato COO, un número de
fila f y un número de columna c. La función devolverá True si el elemento f, c de la
matriz original en formato habitual es nulo (igual a cero). En caso contrario devolverá
False. (0.5 puntos)
Ejemplo:
Entrada: Salida:
d = [[1, 0, 2], False
[-1, 2, 0],
[1, 3, 0],
[2, 3, 1]]
f = 2
c = 0
 imprime_matriz: recibe como parámetro de entrada una matriz m, un parámetro esCoo
de tipo booleano y dos parámetros N y M que representan la dimensión original de la
matriz. Si esCoo es True, entonces se asume que m está en formato COO y hay que
transformarla a su formato habitual antes de imprimirla. Si, por el contrario, esCoo es
False, se asume que la matriz está en formato habitual. A continuación, la función
imprimirá la matriz en formato habitual. (0.25 puntos)
 Programa principal: escribe un programa principal que pida al usuario un número de
filas N y un número de columnas M. A continuación, deberá leer números del usuario
que los irá guardando en una matriz m de dimensión NxM. El programa deberá pedir a
continuación un número de fila f y un número de columna c y deberá mostrar si dicho
elemento es nulo o no. Para ello, se debe transformar la matriz a formato COO y utilizar
la función es_nulo. Por último, se mostrará la matriz utilizando la función
imprime_matriz. Si la densidad de la matriz es menor o igual de 0.2, se llamará a
imprime_matriz con la matriz en formato COO. En caso contrario se llamará a la función
con la matriz en su formato habitual (0.75 puntos)
Ejemplo:
Introduce número de filas: 5
Introduce número de filas: 5
0 1 0 0 0
0 0 0 4 0
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0
Introduce un número de fila: 3
Introduce un número de columna: 1
El elemento 3,1 es nulo
0 1 0 0 0
0 0 0 4 0
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0

def LeeMatriz(n,m):
matrix=[]
for i in range(n):
lista=[]
for j in range(m):
lista.append(int(input()))
matrix.append(lista)
return matrix

def normal_a_dispersa(matrix):
matrixcoo=[]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]!=0:
lista=[matrix[i][j],i,j]
matrixcoo.append(lista)
return matrixcoo

def es_nulo(matrix,fila,columna):
nulo=True
for i in range(len(matrix)):
if matrix[i][1]==fila and matrix[i][2]==columna:
nulo=False
if nulo:
print('el elemento',fila,',',columna,' es nulo')
else:
print('el elemento',fila,',',columna,' no es nulo')

def dispersa_a_normal(d,N,M):
matrix=[]
for i in range(N):
fila=[0]*M
matrix.append(fila)
for j in range(len(d)):
matrix[d[j][1]][d[j][2]]=d[j][0]
return matrix

def densidad(matrix):
count=0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]!=0:
count=count+1
proporcion=count/(len(matrix)*len(matrix[0]))
return proporcion

def imprime_matriz(m, esCoo, N, M):


if esCoo:
m = dispersa_a_normal(m, N, M)
for fila in m:
for elemento in fila:
print('{:3}'.format(elemento), end = '')
print()

#---------------------- MAIN -------------------------------

N=int(input('Introduce numero de filas '))


M=int(input('Introduce numero de columnas '))
m=LeeMatriz(N,M)
COO=normal_a_dispersa(m)
f=int(input('Introduce un numero de filas '))
c=int(input('Introduce un numero de columnas '))
es_nulo(COO,f,c)
prop=densidad(m)
print(prop)
if prop<=0.2:
imprime_matriz(COO, True, N,M)
else:
imprime_matriz(m,False,N,M )
Ejercicio 2 (3,5 puntos)
Escribe un programa que conste de las siguientes funciones:
 lee_frase: debe leer una frase desde teclado (sólo contendrá letras y espacios) y devolver
una lista con las palabras que forman la frase en minúsculas (0.2 puntos)
 longitud_maxima: toma una lista de palabras y nos devuelve cuál es la longitud de la
palabra más larga. (0.3 puntos)
 construye_matriz: recibe un número de filas f , un número de columnas c y un
parámetro booleano esNum que nos indica si la matriz es numérica o no. Si esNum es
True, la función devolverá una matriz f x c de ceros, si es False, devolverá una matriz
f x c de caracteres guion (' - '). (0. 5 puntos)
 introduce_palabra: recibe una matriz de caracteres, una palabra y un número de fila y
la función devuelve la matriz con los caracteres de la palabra insertados al final de la
fila indicada. (0,7 puntos)
Ejemplo:
Entrada: Salida:
m = [[-, -, -, h, o, l, a] m = [[-, -, -, h, o, l, a]
[-, -, -, -, -, m, e] [-, -, -, -, -, m, e]
[-, -, -, -, -, -, -] [-, -, l, l, a, m, o]
[-, -, -, -, -, -, -]] [-, -, -, -, -, -, -]]

palabra = 'llamo'

 cuenta_letra: recibe una matriz de caracteres y un caracter y devuelve el número de


veces que dicho caracter está en la matriz. (0,3 puntos)
 crea_asociada: recibe una matriz de caracteres y devuelve otra matriz de enteros del
mismo tamaño. En cada posición pondremos el número de veces que el caracter
correspondiente aparece en la matriz de caracteres. Si el carácter es ' - ', pondremos un
0. (0,8 puntos)
Ejemplo:
Entrada: Salida:
m = [[-, -, -, h, o, l, a] a = [[0, 0, 0, 1, 3, 3, 2]
[-, -, -, -, -, m, e] [0, 0, 0, 0, 0, 2, 3]
[-, -, l, l, a, m, o] [0, 0, 3, 3, 2, 2, 3]
[e, r, n, e, s, t, o]] [3, 1, 1, 3, 1, 1, 3]]

Nota: El elemento (1,6) de la matriz de caracteres es 'e' y su valor en la asociada es 2, las veces que
'e' aparece en la matriz de caracteres m

 imprime_matriz: recibe una matriz y la imprime en pantalla debidamente formateada.


(0,2 puntos)
 El programa principal debe utilizar las funciones anteriormente definidas para leer una
frase desde teclado, inicializar una matriz de caracteres con guiones (tendrá tantas filas
como palabras tenga la frase y tantas columnas como la longitud de la palabra más
larga), insertar las palabras en la matriz, crear la matriz numérica asociada e imprimir
ambas matrices en pantalla. (0,5 puntos)
Ejemplo:
Introduce una frase: Hola me llamo Ernesto
La matriz de caracteres es:
- - - h o l a
- - - - - m e
- - l l a m o
e r n e s t o
La matriz numérica asociada es:
0 0 0 1 3 3 2
0 0 0 0 0 2 3
0 0 3 3 2 2 3
3 1 1 3 1 1 3

def lee_frase():
frase=input('Introduce una frase: ')
frase=frase.split()
return frase

def longitud_maxima(l):
maxima=-1
for palabra in l:
if len(palabra)>maxima:
maxima=len(palabra)
return máxima

def construye_matriz(n,m,b):
matrix=[]
if b:
lista=[0]*m
for i in range(n):
matrix.append(lista)
else:
lista=['-']*m
for i in range(n):
matrix.append(lista)
return matrix

def introduce_palabra(matrix,fila,palabra):
matrix2=[]
for elemento in matrix:
matrix2.append(elemento[:])
for j in range(len(palabra)):
matrix2[fila][-1-j]=palabra[-1-j]
return matrix2
def cuenta_letra(matrix,letra):
count=0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==letra:
count=count+1
return count

def crea_asociada(matrix):
esNum=True
matrix_num=construye_matriz(len(matrix),len(matrix[0]),esNum)
matrix2=[]
for elemento in matrix_num:
matrix2.append(elemento[:])
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]!='-':
num=cuenta_letra(matrix,matrix[i][j])
matrix2[i][j]=num
return matrix2

def imprime_matriz(matrix):
for fila in matrix:
for elemento in fila:
print('{:3}'.format(elemento), end = '')
print()

#-------------------------- MAIN --------------------------------------


lista=lee_frase()
ll=longitud_maxima(lista)
esNum=False
matriz=construye_matriz(len(lista),ll,esNum)
for i in range(len(lista)):
matriz=introduce_palabra(matriz,i,lista[i])
matriz_numerica=crea_asociada(matriz)
print('La matriz de caracteres es: ')
imprime_matriz(matriz)
print('La matriz asociada es: ')
imprime_matriz(matriz_numerica)
Ejercicio 3 (2.5 puntos)
Queremos almacenar datos sobre concesionarios de vehículos a nivel nacional. La base de
datos dispone de 4 tablas en la que se guardan dichos datos. La tabla CONCESIONARIOS
tiene la información referente a cada concesionario que sólo puede trabajar con una marca de
vehículos. Cada concesionario tiene un identificador único y no hay dos concesionarios con
el mismo nombre. Puede haber varios concesionarios de la misma marca en la misma ciudad.
La tabla VENDEDORES contiene información sobre los vendedores. Un vendedor sólo puede
trabajar en un concesionario, pero un concesionario puede tener varios vendedores. La tabla
VENTAS hace referencia a cada venta realizada: nos dice quién es el vendedor, el cliente la
matrícula del vehículo vendido, el importe de la venta, el modelo y la cilindrada. También
tiene el campo Usado, de tipo booleano, que puede contener los valores Verdadero o Falso y
que nos indica si el vehículo es de segunda mano o no. Un vendedor puede vender varios
vehículos a un mismo cliente, incluso el mismo día (por ejemplo, una flota para una empresa).
En este caso cada vehículo aparece en un registro diferente. La última tabla almacena los datos
referentes a los CLIENTES que han comprado algún vehículo.

a) Escribe las posibles claves candidatas de cada una de las tablas. Si hay más de una,
escribe una por línea.
(0.3 puntos)
CONCESIONARIOS: Id_Concesionario
Nombre_Concesionario
Teléfono
VENDEDORES DNI
Nº Licencia
Teléfono
VENTAS: Matrícula
CLIENTES: DNI
Teléfono
b) Escribe las claves ajenas (externas) que haya en estas tablas. Indica, para cada una,
en qué tabla es clave externa y a qué tabla y atributo (o campo) hace referencia. (0.3
puntos)
VENDEDORES tiene como clave externa Concesionario que
hace referencia a Id_Concesionario de la tabla CONCESIONARIOS
VENTAS tiene dos claves externas: Vendedor que hace
referencia a DNI de la tabla VENDEDORES y DNI_Cliente que hace
referencia a DNI de la tabla CLIENTES
Ni CONCESIONARIOS ni CLIENTES tienen claves externas
Indica las claves principales elegidas en cada tabla y las relaciones entre tablas.

c) Realiza las siguientes consultas.


-En la parte superior de la parrilla las tablas y sus relaciones (no es necesario que escribas
todos los campos sobre las que se basa la consulta). Nota importante: no poner para la
resolución de cada cuestión más de las tablas absolutamente necesarias para ello.
-En la parte inferior de la parrilla, los campos, criterios, operadores, etc. necesarios.

c1) Queremos obtener un listado con los nombres y apellidos de los clientes que han comprado
un OPEL usado en concesionarios de Barcelona. También queremos que salgan en dicho
listado los nombres y apellidos de los clientes que han comprado un BMW con una cilindrada
de 1800 cc o superior. Ordenaremos el listado por cilindrada, de menos a mayor, que también
mostraremos. (0.5 puntos)
c2) Queremos saber cuántos coches de 2000 cc ha vendido cada vendedor a personas nacidas
antes de 1990 así como el total facturado por cada vendedor con dichas ventas.
(0.7 puntos)

c3) Queremos obtener para cada marca de vehículos:


- Cuántos vehículos usados ha vendido
- El importe medio de dichas ventas
- Cual ha sido el precio del vehículo usado mas caro que ha vendido. (0.7 puntos)

También podría gustarte