Está en la página 1de 26

Nombre: Apellidos

EXAMEN INFORMATICA Y REDES


Valencia, 21 de Octubre de 2021

Opción A
Notas:
1. Rellenar correctamente los datos de la cabecera. Sobre todo, en el test, el correspondiente al
número de expediente o DNI.
2. Los contenidos teóricos generan la NotaTeoriaParcial1 (sobre 10) y en ella cuenta un 40 % la
parte de test y un 60 % la parte de desarrollo. Los contenidos prácticos generan la
NotaPracticasParcial1 (sobre 10) y en ella cuenta un 20% el test y un 80% el desarrollo.
3. Las preguntas de test cuentan (en relación con su parte) todas iguales. Las preguntas no
contestadas ni cuentan ni descuentan, cada pregunta contestada erróneamente descuenta 1/3 de la
nota que tendría esa pregunta de haber sido correcta.
4. Las notas se publicarán en PoliformaT. Donde también se publicarán las soluciones, así como la
fecha y lugar de la revisión de los exámenes.
5. La realización del examen está sujeta a la normativa vigente así como a la Normativa de
Honestidad Académica establecida por la ETSII.
6. Cuando se termine el test, se da la vuelta a la pagina de contestaciones y se deja encima de la
mesa. El profesor pasará a recogerlo después de que cumpla el tiempo. Lo mismo para el resto
del examen.
7. Duración: Acto Evaluación 1 (test) ································45 minutos
Acto Evaluación 2 (parte Desarrollo Teoría) ········45 minutos
Acto Evaluación 2 (parte Desarrollo Prácticas) ·····90 minutos

Acto Evaluación 1 (TEST) Parte I-Teoría

( Test de contenidos teóricos 40% de la NotaTeoriaParcial1)

Pregunta 1. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) Especificar el diseño de un programa, mediante un programa en
pseudocódigo, es una de las posibilidades que tenemos en la fase de
diseño.
b) El estudio de viabilidad de un proyecto de programación se realiza
posteriormente a la fase de pruebas, cuando ya se dispone de un
prototipo que ha superado los test de aceptación. Por tanto ya
conocemos su coste.
c) La fase mas crítica de un proyecto es la fase de análisis, ya que de una
definición correcta de las especificaciones, dependerá el éxito o no del
proyecto.
d) Ninguna de las anteriores.
2 GRADO DE INGENIERIA BIOMEDICA

Pregunta 2. ¿Cuál de las siguientes afirmaciones es CIERTA?


a) Como una CPU solo entiende su código maquina, los compiladores
traducen las instrucciones y los datos de un programa al código máquina
del procesador que va a ejecutar ese programa.
b) Como una CPU solo entiende su código maquina, los compiladores
traducen las instrucciones a código máquina y los datos los codifican
con algunas de las técnicas de representación de la información
existentes.
c) La necesidad de ejecutar programas bajados de Internet, obliga al
Sistema Operativo a bajarse los programas sin compilar y compilarlos en
local para generar el código máquina de cada CPU.
d) Ninguna de las anteriores.

Pregunta 3. Cuando estamos programando es bueno plantearse las hipótesis de


fallos, para ver que puede fallar y así, generar y/o tratar las correspondientes
excepciones …¿Cuál de las siguientes afirmaciones es CIERTA?
a) El estudio de qué puede fallar y por tanto qué errores debemos tratar se
hace en la fase de especificaciones, ya que es una especificación mas.
b) El estudio de que puede fallar y por tanto que errores debemos tratar se
hace en la fase de diseño, ya que es en ella donde el ingeniero debe
seleccionar las estructuras de datos y control y el tratamiento de
excepciones forma parte de estas.
c) El estudio de que puede fallar y por tanto que errores debemos tratar se
hace en la fase de codificación, ya que es en esta fase donde Python
nos dice, para cada función que vayamos a utilizar, que excepciones
puede generar esta.
d) Ninguna de las anteriores.

Pregunta 4. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) Ningún computador trabaja en hexadecimal. EL sistema hexadecimal lo
usamos nosotros como una forma compacta del binario.
b) En la técnica del exceso Z para representar número con signo, puedo
tomar como Z cualquier valor, pero si tomo Z = 2n-1, su rango coincidirá
con el de la técnica del Ca2
c) La técnica del complemento a 2 para representar los números con signo,
representa (en la memoria de la máquina), cualquier número mediante
su complemento a 2
d) Ninguna de las anteriores.

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 3

Pregunta 5. En un programa tenemos un tipo de dato con n=4 (4 bits) y en un


momento, una determinada una variable de ese tipo, tiene su posición de memoria
con el valor 1101:
¿Qué valor tiene esa variable?
a) +5 en exceso Z con Z=8
b) -3 en Ca1
c) -2 en SyM
d) Ninguna de las anteriores

Pregunta 6. Un compilador de Python codifica los datos de tipo int con 16 bits. Un
programa, tiene las siguientes líneas de código:
a = 23
b = - 48
suma = a + b
¿Cuál es el valor, que tendrá la variable suma en su correspondiente posición de
memoria, tras ejecutar ese programa?
a) 0x8019
b) 0xFFE7
c) 0x8007
d) Ninguna de las anteriores.

Pregunta 7. Un compilador de Python codifica los datos de tipo int con 16 bits. Un
programa, tiene definida una variable y en su correspondiente posición de memoria,
en un momento dado, aparece el valor 0xFFCF
¿Cuál es el valor de esa variable en ese momento, expresado en decimal?
a) -48
b) -49
c) +48
d) Ninguna de las anteriores.

Pregunta 8. En un programa Python (que vamos a compilar con un compilador


especial que utiliza IEEE754 de simple precisión para codificar los datos de tipo
float) tenemos la siguiente línea de código:

precioKwh = 314.375;
¿Cómo inicializará ese compilador el valor de la variable precioKwh en la
memoria del computador (mostrado en hexadecimal)?
a) 0x81C60000
b) 0x439D3000
c) 0xFDC50000
d) Ninguna de las anteriores

Valencia 21 de Octubre de 2021


4 GRADO DE INGENIERIA BIOMEDICA

Pregunta 9. En un programa Python (que vamos a compilar con un compilador


especial que utiliza IEEE754 de simple precisión para codificar los datos de tipo
float) tenemos que, momento de su ejecución, tiene en la posición de memoria
reservada para una variable, el valor 0xC1E50000 ¿Cuál sería el valor que en ese
momento tiene esa variable en decimal?
a) – 28.625
b) - 12,5
c) - 38,625
d) Ninguna de las anteriores.

Pregunta 10. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) El código ASCII, con 7 bits, no es capaz de representar caracteres como
la ñ o la á (a centuada).
b) En el código ISO 8859-1 (también denominado Alfabeto Latino o ISO
latín 1), contiene todos los caracteres del código ASCII, a los que añade
27 caracteres propios de idiomas europeos.
c) Unicode es capaz de representar, los caracteres que no es capaz de
representar el código ISO 8859-1, ofreciendo una codificación alternativa
para codificar el resto de lenguas de Internet.
d) Ninguna de las anteriores.

Pregunta 11. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) Las técnicas de compresión diferenciales se basan en codificar
diferencias (que son mas pequeñas) en vez de valores absolutos (que
son mas grandes).
b) Las técnicas de compresión por frecuencia de uso se basan en codificar
aquellos elementos que mas aparecen con menor número de bits.
c) Las técnicas de compresión por longitud de series, se basan en sustituir
un elemento que se repite varias veces por un carácter de repetición,
seguido del elemento que se repite y el número de veces que se repite..
d) Ninguna de las anteriores.

Pregunta 12. ¿Cuál de las siguientes afirmaciones es FALSA?


a) El protocolo UDP no restringe el tamaño máximo de un mensaje.
b) La cabecera del protocolo UDP incluye un campo de suma de
comprobación que no se siempre se usa.
c) Cuando una aplicación utiliza el servicio ofrecido por el protocolo UDP
(es decir utiliza un socket UDP) debe identificar para cada mensaje que
envía el Puerto y la Dirección IP destino de ese mensaje.
d) Ninguna de las anteriores.

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 5

Pregunta 13. Se han recibido los códigos


110000111
110010001
101010100
010110000
011100001
111011010
011011011

correspondiente a una codificación entrelazada usando paridad PAR (suponiendo


que contamos de izquierda a derecha y de arriba abajo) ¿Cuál de las siguientes
afirmaciones es CIERTA?:
a) Se que hay 2 errores pero no los puedo corregir.
b) Se que tengo mal las fila 1 y 4 y las columnas 5 y 7, por ello, para
corregir los errores busco el bit de la fila 1 columna 5 y lo corrijo y hago
lo mismo con el bit de la fila 4 columna 7. Ahora ya están bien todas las
paridades y por tanto he corregido el error.
c) Se que hay 4 errores, pero no los puedo corregir.
d) Ninguna de las anteriores.

Pregunta 14. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) En los sistemas de autentificación por clave publica, el emisor autentifica
los mensajes codificándolos (firmándolos) con la clave privada y luego el
receptor se asegura que el mensaje es de quien dice ser usando la
clave publica del firmante.
b) Cuando dos sistemas quieren intercambiar información entre si de forma
privada, cada uno de ellos utiliza un encriptador unidireccional para
enviar al otro la información encriptada.
c) Los sistemas de encriptación por clave publica, también denominados
de clave simétrica, calculan dos claves de forma que si se encripta con
una, solo se puede desencriptar con la otra.
d) Ninguna de las anteriores.

Valencia 21 de Octubre de 2021


6 GRADO DE INGENIERIA BIOMEDICA

Pregunta 15. Para un canal de comunicaciones (medio físico) multipunto. ¿Cuál


de las siguientes afirmaciones es FALSA?:
a) La capacidad de intercambio de información entre los nodos, será la
misma tanto si se usa Multiplexación en el Dominio del Tiempo (TDM)
como si se usa Multiplexación en el Dominio de la Frecuencia (FDM).
b) Una red con mayor ancho de banda que otra es capaz, si se usa la
Multiplexación en el Dominio de la Frecuencia (FDM) de proporcionar o
mas canales de comunicación con el mismo ancho de banda por canal o
el mismo número de canales pero con mas ancho de banda por canal
c) Una red donde se usa Multiplexación en el Dominio de Tiempo (TDM), la
capacidad de transferencia de información no depende del tiempo que
se ofrezca a cada uno de sus nodos (anchura del slot temporal).
d) Ninguna de las anteriores.

Pregunta 16. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) En el modelo de Internet el Nivel de Aplicación engloba los niveles de
Sesión, Presentación y Aplicación del modelo OSI/ISO.
b) Una de las diferencias entre el modelo de Internet y el modelo OSI/ISO
es que en el modelo de Internet el Nivel de Enlace se subdivide en MAC
y LLC y en el modelo OSI/ISO no.
c) El Nivel de Aplicación es quien fija el paradigma de comunicaciones que
se usará (Cliente/Servidor, Productor/Consumidor, Par a Par (P2P),
etc.), independientemente del servicio que esta aplicación requiera del
Nivel de Transporte.
d) Ninguna de las anteriores.

Pregunta 17. ¿Cuál de las siguientes afirmaciones es FALSA?:


a) En HTML las etiquetas deben estar anidadas, mientras que en XML no
es necesario ya que, gracias al uso de la gramática, esta determina
donde se abre y se cierra cada etiqueta.
b) HTML y XML tienen en común que son lenguajes de marcado , es decir
que usan etiquetas (tags), pero mientras que en HTML las etiquetas
están definidas por el estándar, en XML las definimos nosotros
c) Un documento XML, para ser válido, debe incluir una referencia a una
gramática (que este bien en el propio documento o en un fichero
externo).
d) Ninguna de las anteriores.

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 7

Acto Evaluación 1 (TEST) Parte II-Prácticas

(Test de contenidos prácticos 20% de la NotaPracticasParcial1)

Pregunta 1 ¿Cuál de las siguientes afirmaciones es FALSA?:


a) En Python no podemos asegurar con cuantos bits se codifica un int,
mientras que un float seguro que con 64.
b) La diferencia entre un atributo de clase y uno de instancia es que el de
clase se declara fuera de cualquier método y no va precedido por nada,
mientras que el de instancia se declara dentro de un método y va
precedido por self.
c) Para acceder a un atributo de clase dentro de un objeto, se utiliza el
operador punto aplicado a la referencia de ese objeto.
d) Ninguna de las anteriores

Pregunta 2 El siguiente programa:

Su ejecución ¿Qué salida genera?:

a) 12345
b) 1234
c) 0124
d) Ninguna de las anteriores

Pregunta 3 ¿Cuál de las siguientes afirmaciones es FALSA?:


a) Para instanciar un objeto de un clase dada, se utiliza el nombre de la
clase y entre paréntesis, le pasamos los parámetros que necesita el
constructor de esa clase.
b) Si una clase hereda de otra ya no hereda de la superclase object.
c) Si una clase hereda de otra clase, en el constructor de la clase
descendiente se debe llamar al constructor de la superclase.
d) Ninguna de la anteriores

Valencia 21 de Octubre de 2021


8 GRADO DE INGENIERIA BIOMEDICA

Para el resto de preguntas y dado el siguiente fragmento de un programa:

Pregunta 4 En el programa anterior, debería sustituir la referencia (4) por


a) SenseHat
b) sense_hat
c) __int()__
d) Ninguna de la anteriores

Pregunta 5 En el programa anterior, debería sustituir la referencia (5) por


a) (255,255,0)
b) (255,0,0)
c) (0,255,0)
d) Ninguna de la anteriores

Pregunta 6 En el programa anterior, debería sustituir la referencia (6) por


a) clear
b) put_pixel
c) set_pixel
d) Ninguna de la anteriores

Pregunta 7 En el programa anterior, debería sustituir la referencia (7) por


a) (colorBlanco, colorBlanco, colorBlanco)
b) ‘ ‘ #entre las comillas hay un espacio
c) colorBlanco
d) Ninguna de la anteriores

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 9

Pregunta 8 En el programa anterior, debería sustituir la referencia (8) por


a) False
b) True
c) continuar
d) Ninguna de la anteriores

Pregunta 9 En el programa anterior, debería sustituir la referencia (9) por


a) (colorNegro, colorNegro, colorNegro)
b) 0
c) colorNegro
d) Ninguna de la anteriores

Valencia 21 de Octubre de 2021


10 GRADO DE INGENIERIA BIOMEDICA

EXAMEN INFORMATICA Y REDES


Valencia, 21 de Octubre de 2021

Notas:
1. Responder las preguntas sobre el espacio que se deja (en caso necesario indicarlo y responder en
última hoja)
2. Para la realización del examen no se puede utilizar ningún apunte, ni dispositivo electrónico….

Acto Evaluación 2 (Desarrollo) Parte I-Teoría

(Desarrollo contenido teórico 60% de la NotaTeoriaParcial1)

Pregunta 1 (3 puntos) Se tiene un protocolo de ventana deslizante de 2 bits con el


siguiente estado de partida (fruto de muchas vueltas tras envíos y recepciones):
En A se tienen el buffer de transmisión 10 lleno y resto vacíos y números de
secuencia: NSENVIO = 11 y NSACK = 11. En B se tiene sus buffers vacíos y números
de secuencia: NSENVIO = 11 y NSACK = 11

Se pide:

a) B recibe de su nivel superior unos datos para enviar. ¿Que procesos sigue
B?.

B monta la siguiente estructura la guarda en la ventana de


transmisión 11 (porque Nenvio es 11). Incrementa su NSenvio (que pasa a
valer 00) y la envía. Las ventanas quedaran

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 11

b) Ahora A recibe este envío. ¿Qué pasos sigue (suponer que la trama llega
sin errores)?

A guarda esta información en la ventana 11 del buffer de


recepción (por que su Nack vale 11). Analiza el CRC y como nos han dicho
que supongamos que es correcto, comenzamos a trabajar sobre esa
información. Primero se analiza el Nenvio de la información (que vale 11) y
como A esta esperando la trama 11 (por que su Nack vale 11) extrae los datos
y los pasa a su nivel superior. Entonces incrementa su Nack para pasar a
esperar la 00. Luego analiza el Nack de la información entrante y ve que vale
11 (le dicen que esperan la 11 y por tanto le confirman la recepción correcta de
la 10). A borra su buffer de transmisión 10. Las ventanas quedarán. Nota:
como ya ha usado el buffer de recepcion 11 para almacenar la información
entrante y procesado ésta, al incrementar su Nack a 00 es como si vaciara este
buffer (en la figura se ha puesto gris pero también es correcto dejarlo blanco
indicando que se ha llenado (pasa a gris) y vaciado (pasa a blanco)

Pregunta 2 (3 puntos) Para el ejercicio anterior y considerando que todas las


tramas enviadas tienen un TimeOut de 50 tics: En un momento dado, la lista de
tiempos remanentes, de A está en el siguiente estado:

Valencia 21 de Octubre de 2021


12 GRADO DE INGENIERIA BIOMEDICA

a) ¿Qué se puede decir a partir de la información de esa lista? explicar por


qué lo sabéis
Que hace 50-32= 18 tics que A envió la trama 10

b) Después de 10 tics del estado anterior, A recibe de su nivel superior una


información para mandar. ¿Cómo quedará la lista de tiempos remanentes
inmediatamente después del envío. (Para acompañar la explicación dibujar
la lista antes y después del envío)
Al pasar 10 tics la situación será: y el enviar la nueva información (que
tendrá numero de secuencia 11 su
tiempo remanente será de 50-22 = 28 tics

c) Al cabo de 5 tics del envío, ocurre el caso a) de la pregunta 1 (es decir, B


envía una información a A). Sabiendo que el tiempo de vuelo de B hacia A
es de 9 tics ¿qué ocurrirá y como terminará la lista de tiempos remanentes
inmediatamente después de la recepción de esa información en A?. (Para
acompañar la explicación dibujar la lista antes y después del envío)
Si han pasado 5 tics y el tiempo de vuelo es de 9 tics, A recibirá la información
al cabo de 5+9 = 14 tics. Por tanto:
Al cabo de 14 tics la lista estará: y como nos confirman la recepción de la
información con numero de secuencia 10,
se eliminará ese nodo de la lista que quedará

Pregunta 3 (2 puntos) Explica mediante un dibujo:


a) La diferencia que, desde el punto de vista del servidor DNS Local, hay entre
una consulta iterativa y una consulta recursiva.

b) En que consiste un RR (Registro de Recurso) de tipo A

Pregunta 2 (2 puntos) explica:

a) ¿Por qué? no puede usar el protocolo SMTP para bajarse el correo del servidor

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 13

b) ¿Qué diferencias existen entre el protocolo POT3 y el protocolo IMAP?

Acto Evaluación 2 (Desarrollo) Parte II-Prácticas

(Desarrollo contenido práctico 80% de la NotaPracticasParcial1)

Pregunta 1 Una vez terminada la carrera decides, junto a unos compañeros del
alma, montar una empresa para la realización de avanzados y complicados
análisis clínicos. Para ello decides hacer un programa que os ayude a vosotros y a
vuestros empleados a realizar los análisis correctamente

El programa a realizar debe ofrecer un menú (intuitivo) que permita a los usuarios:
crear un cultivo, cambiar de fase un cultivo existente, visualizar los cultivos en
marcha, etc., (evidentemente la información no especificada os la podéis
inventar….):

La jerarquía de clases a desarrollar podría ser:

Analisis es una clase que contiene la información común a los análisis de


cultivos que realiza la empresa.
Cultivo es una clase que contiene la información relativa a un cultivo. Hereda de
Analisis y cada cultivo que realicemos será un objeto de este tipo
Estreptococo, Helicobacter pylori, etc., son clases que contienen
información sobre estas bacterias en concreto (no vamos a trabajar sobre ellas).

A estas clases, hay que añadir el módulo:


AnalyticalEnterprise es un módulo que constituye la aplicación. Ofrece el
menú al usuario y permite trabajar con las clases que componen la aplicación

Evidentemente, los trabajadores de la empresa, después de realizar una acción


determinada, deben reflejarla en el programa. Para que toda esta información no

Valencia 21 de Octubre de 2021


14 GRADO DE INGENIERIA BIOMEDICA

se pierda, cualquier acción es necesario guardarla en disco. Asimismo, cuando


arranca el programa, se deben cargar todos los análisis guardados en disco para
poder trabajar sobre ellos.

Para una primera versión del programa, el diseño de las clases que tenéis que
codificar en Python es:

Clases a las que, como ya se ha indicado, habrá que añadir el módulo


AnalyticalEnterprise que contiene variables y funciones para manejar estas
clases.

Para realizar el programa se pide seguir los pasos que se enumeran a


continuación. (estos pasos son de complejidad creciente y siguen varios recorridos
cada uno de ellos para explorar las capacidades del alumno para trabajar con:
estructuras de datos, estructuras de control, manejo de clases y entrada/salida. Si
algún alumno no puede realizar un paso, que continúe con el resto. Si un alumno
tiene alguna duda o necesita algo para continuar, que lo exprese por escrito y,
suponiendo lo que sea necesario suponer, continúe avanzando…)
Las contestaciones realizarlas dentro del espacio destinado a ello (no es
necesario para cada una copiar todo lo anterior, basta decir donde se coloca si es
necesario y contestar únicamente con lo que pide ese punto. Por otra parte, si no
nos cabe la contestación en el espacio destinado para ello, indicarlo y usar las
hojas que se anexan en el examen).

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 15

1) Crear un módulo de nombre AnalyticalEnterprise. En él:


a) Definir una función denominada imprimirCabecera(), que no retorna nada y
recibe como parámetro una cadena de caracteres (un String) con el nombre del
programador. En su cuerpo debe sacar por pantalla el mensaje que se muestra en
la figura inferior (fijaros que después de (c) debe salir vuestro nombre)

b) En el cuerpo del programa principal, en primer lugar, se preguntará al usuario el


nombre del experto programador que ha realizado el programa, y se asignará el
nombre tecleado a una variable de tipo String denominada nombreProgramador.

a) def imprimirCabecera(programador):
print('************************************************')
print('** Empresa de Analisis Avanzados **')
print('** (c) '+programador+' **')
print('************************************************')

b) nombreProgramador = input('Nombre del experto Programador?\n')


imprimirCabecera(nombreProgramador)

Valencia 21 de Octubre de 2021


16 GRADO DE INGENIERIA BIOMEDICA

2) Tras llamar a la función para imprimir la cabecera del programa, debéis


introducir el código necesario para que se visualice por pantalla el menú que se
muestra en la siguiente figura.

Este menú se debe ofrecer repetidamente mientras no se seleccione la opción 0.


Las opciones 1, 2, 3, 4 y 5 deben sacar por pantalla la frase “Has
seleccionado la opción de <opción>” (donde <opción> es el texto de la
correspondiente línea en el menú). Si no se introduce ninguna opción valida hay
que generar el correspondiente mensaje antes de mostrar nuevamente el menú.

continuar = True
while continuar:
print('seleccione una de estas opciones')
print(' 0 - salir')
print(' 1 - crear cultivo')
print(' 2 - cambiar fase cultivo')
print(' 3 - visualizar cultivos')
print(' 4 - guardar cultivos')
print(' 5 - recuperar cultivos')
opcion = input()
if opcion == '0':
continuar = False
elif opcion == '1':
print(¿Has seleccionado….)
elif opcion == '2':
print(¿Has seleccionado….)
elif opcion == '3':
print(¿Has seleccionado….)
elif opcion == '4':
print(¿Has seleccionado….)
elif opcion == '5':
print(¿Has seleccionado….)
else:
print('Opcion incorrecta')

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 17

3) Crear una clase a la que denominaréis Analisis. Dentro de esa clase:


a) Declarar tres atributos de clase, constantes y de tipo String a los que
denominareis COCO (lo inicializareis al valor “coco”). BACILO (lo inicializareis al
valor “bacilo”) y HELICO (lo inicializareis al valor “helico”).
b) Declarar el método constructor que recibe como parámetros dos Strings,
uno con el nombre de la bacteria a analizar y otro con el código del análisis.
Dentro del cuerpo debéis crear dos atributos de tipo String: Uno que denominareis
bacteria y otro al que denominareis codigoAnalisis a los que asignareis los
parámetros recibidos.
c) Definir un método al que denominareis getTipoBacteria(), que no recibe
nada y retorna el valor del atributo bacteria.
d) Definir el método getCodigoAnalisis(), que no recibe nada y retorna el
valor del atributo codigoAnalisis.
e) Definir el método getDescripcion(), que no recibe nada y retorna un String
describiendo el análisis de la forma:
‘El análisis con código <código> analiza la presencia de
bacterias de tipo <bacteria>’ (donde <código> y <bacteria> son los
valores de los correspondientes atributos)

class Analisis(object):

COCO = 'coco'
BACILO = 'bacilo'
HELICO = 'helico'

def __init__(self, bacteria, codigo):


self.bacteria = bacteria
self.codigoAnalisis = codigo

def getTipoBacteria(self):
return self.bacteria

def getCodigoAnalisis(self):
return self.codigoAnalisis

def getDescripcion(self):
return 'El análisis con código '+ self.codigoAnalisis()+' analiza
la presencia de bacterias de tipo '+ self.bacteria()

Valencia 21 de Octubre de 2021


18 GRADO DE INGENIERIA BIOMEDICA

4) Crear una clase a la que denominareis Cultivo. Esa clase desciende de la


clase Analisis. Dentro de esa clase:
a) Declarar los atributos de clase, constantes y de tipo String
F1 inicializándolo al valor "Inicial"
F2 inicializándolo al valor "Crecimiento"
F3 inicializándolo al valor "Destrucción"
b) Definir el método constructor, que recibe como parámetros el tipo de bacteria a
analizar y el código del análisis para ese cultivo. Dentro del cuerpo:
- definir dos atributos: uno que será de tipo String al que denominareis fase e
inicializareis al valor ‘sin asignar’ y otro que será de tipo float al que denominareis
temperatura y que inicializareis al valor 22.5
- (No olvidar llamar al constructor de la superclase y para ello, importar lo que
tenéis que importar).
- Adicionalmente, debéis llamar al método prepararCultivo()
c) Definir el método prepararCultivo(), que no retorna nada y recibe como
parámetro el tipo de bacteria con que realizar ese cultivo. Dentro del cuerpo se
debe: c.1) En primer lugar, asignar al atributo temperatura el valor 33.5 si la
bacteria es un bacilo, 35.6 si es un coco o 39.2 si es un helico. c.2) A
continuación, asignar al atributo fase al valor de la Fase1 que es la fase ‘inicial’
(para ello, usar el atributo constante que a tal efecto habéis declarado en el punto
a)
d) Definir los métodos getFase(), setFase(), getTempetatura() y
setTemperatura(), que es evidente que reciben y que retornan y lo que tienen
que hacer en su cuerpo…
e) Definir el método getDescripcion(), que no recibe nada y retorna un String
describiendo el análisis con dos líneas de la forma:
‘El análisis con código <codigo> analiza la presencia de
bacterias de tipo <bacteria>’ (donde <codigo> y <bacteria> son los
valores de los correspondientes atributos, recordar que esta descripción ya la tiene
Analisis) ‘Esta en la fase <fase> y se realiza a una
temperatura de <temperatura> Cº’ (donde <fase> y <temperatura> son
los valores de los correspondientes atributos)

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 19

from Examen_Cultivo_Octubre2021.Analisis import *

class Cultivo(Analisis):

F1 = "Inicial"
F2 = "Crecimiento"
F3 = "Destrucción"

def __init__(self, bacteria, codigo):


Analisis.__init__(self, bacteria, codigo)
self.temperatura = 22.5
self.fase = 'sin asignar'
self.prepararCultivo(bacteria)

def prepararCultivo(self, bacteria):


if bacteria == Analisis.BACILO:
self.temperatura = 33.5
elif bacteria == Analisis.COCO:
self.temperatura = 35.6
elif bacteria == Analisis.HELICO:
self.temperatura = 39.2
else:
print('Error al crear el cultivo, bacteria desconocida ')
self.fase = Cultivo.F1

def getFase(self):
return self.fase

def setFase(self, nuevaFase):


self.fase = nuevaFase

def getTemperatura(self):
return self.temperatura

def setTemperatura(self, nuevaTemperatura):


self.temperatura = nuevaTemperatura

def getDescripcion(self):
descripcion = Analisis.getDescripcion(self)+'\n'
descripcion = descripcion + 'Esta en la fase '+ self.fase +
' y se realiza a una temperatura de '+ str(self.temperatura)
return descripcion

Valencia 21 de Octubre de 2021


20 GRADO DE INGENIERIA BIOMEDICA

5) Dentro del módulo AnalyticalEnterprise:


a) Definir una lista (Lista de Python), denominada listaCultivos, inicialmente
vacía, que contendrá la lista de los Cultivos de nuestra empresa. Cada
componente de esa lista será un objeto de tipo Cultivo
b) Definir una función a la que denominareis crearCultivo(), Esa función, ni
recibe ni retorna nada y en su cuerpo debe realizar las siguientes acciones:
- En primer lugar, preguntar al usuario para qué tipo de bacteria desea realizar el
cultivo (si elige una opción incorrecta no se debe crear el cultivo)
- Luego debe preguntar por el código que desea asignar a ese cultivo
- Para terminar, debe instanciar un objeto de tipo Cultivo, colocarlo en Fase 1 e
introducirlo en la lista de cultivos de la empresa. (no olvides importar lo que
necesitas…)
c) Llama a esa función desde la correspondiente opción del menú

from Examen_Cultivo_Octubre2021.Cultivo import *

a) listaCultivos = []

b) def crearCultivo():
seleccionCorrecta = False
print('Para que tipo de bacteria deseas hacer el cultivo?')
print(' 1 - COCO')
print(' 2 - BACILO')
print(' 3 - HELICO')
seleccion = input()
if seleccion == '1':
bacteria=Analisis.COCO
seleccionCorrecta = True
elif seleccion == '2':
bacteria=Analisis.BACILO
seleccionCorrecta = True
elif seleccion == '3':
bacteria=Analisis.HELICO
seleccionCorrecta = True
if seleccionCorrecta:
codigo = input('Introduce el codigo para ese cultivo')
nuevoCultivo = Cultivo(bacteria, codigo)
listaCultivos.append(nuevoCultivo)
else:
print('Seleccion de bacteria incorrecta. No se crea el
cultivo')

c) elif opcion == '1':


crearCultivo()

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 21

6) Dentro del módulo AnalyticalEnterprise:


a) Definir una función a la que denominareis visualizarCultivos(), Esa
función, ni recibe ni retorna nada y en su cuerpo debe sacar por pantalla un listado
con todos los cultivos que tiene la empresa (si tiene cultivos, claro, de lo contrario
debe indicar que no hay cultivos)
b) Llama a esa función desde la correspondiente opción del menú

def visualizarCultivos():
if len(listaCultivos) != 0:
for cultivo in listaCultivos:
print(cultivo.getDescripcion())
else:
print('No hay cultivos en la lista')

7) Dentro del módulo AnalyticalEnterprise:


a) Definir una función a la que denominareis cambiarFaseCultivo(), Esa
función, ni recibe ni retorna nada y en su cuerpo debe realizar las siguientes
acciones:
- Ofrecer una lista de los cultivos y preguntar al usuario cuál de ellos desea
cambiar la fase de cultivo (comprobar que se selecciona un cultivo válido..)
- Para ese cultivo (si es válido) indicar en qué fase está y preguntar al usuario si
quiere cambiarlo a la siguiente fase (solo se puede cambiar de F1 a F2 y de F2 a
F3).
- Si el usuario acepta el cambio, cambiar la fase de ese cultivo
b) Llama a esa función desde la correspondiente opción del menú

Valencia 21 de Octubre de 2021


22 GRADO DE INGENIERIA BIOMEDICA

si queremos seleccionar numerando los cultivos seria así:

def cambiarFaseCultivo_v1():
print('Los cultivos disponibles son:')
indice = 0
for cultivo in listaCultivos:
print(str(indice)+' - '+cultivo.getDescripcion())
indice = indice + 1
indiceSeleccionado = int(input('De que numero quieres cambiar la
fase?:'))
if (indiceSeleccionado > -1) and (indiceSeleccionado <
len(listaCultivos)):
print('El cultivo seleccionado esta en fase '+
listaCultivos[indiceSeleccionado].getFase())
if listaCultivos[indiceSeleccionado].getFase() == Cultivo.F1:
pasar = input('Quieres pasarlo a fase 2? (responder con si o
no)')
if pasar[0] == 's':
listaCultivos[indiceSeleccionado].setFase(Cultivo.F2)
print('El cultivo se pasa a Fase 2')
else:
print('El cultivo se deja en la fase actual')
elif listaCultivos[indiceSeleccionado].getFase() == Cultivo.F2:
pasar = input('Quieres pasarlo a Fase 3? (responder con si o
no)')
if pasar[0] == 's':
listaCultivos[indiceSeleccionado].setFase(Cultivo.F3)
print('El cultivo se pasa a Fase 3')
else:
print('El cultivo se deja en la fase actual')
else:
print('Ese indice es incorrecto')

si queremos seleccionar por código de cultivo seria así:


def cambiarFaseCultivo_v2():
print('Los cultivos disponibles son:')
for cultivo in listaCultivos:
print(cultivo.getDescripcion())
codigoSeleccionado = input('Indica el código del cultivo del
que deseas cambiar la fase?:')
cultivoCorrecto = False
for cultivo in listaCultivos:
if cultivo.getCodigoAnalisis() == codigoSeleccionado:
cultivoCorrecto = True
print('El cultivo seleccionado esta en fase '+
cultivo.getFase())
if cultivo.getFase() == Cultivo.F1:
pasar = input('Quieres pasarlo a fase 2?
(responder con si o no)')
if pasar[0] == 's':
cultivo.setFase(Cultivo.F2)
print('El cultivo se pasa a Fase 2')
else:

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 23

print('El cultivo se deja en la fase actual')


elif cultivo.getFase() == Cultivo.F2:
pasar = input('Quieres pasarlo a Fase 3?
(responder con si o no)')
if pasar[0] == 's':
cultivo.setFase(Cultivo.F3)
print('El cultivo se pasa a Fase 3')
else:
print('El cultivo se deja en la fase actual')
if cultivoCorrecto == False:
print('Ese codigo de cultivo es incorrecto')

Alternativa 3, más compacta:


def cambiarFaseCultivo_v3():
print('Los cultivos disponibles son:')
for cultivo in listaCultivos:
print(cultivo.getDescripcion())
codigoSeleccionado = input('Indica el código del cultivo del que
deseas cambiar la fase?:')
cultivoCorrecto = False
for cultivo in listaCultivos:
if cultivo.getCodigoAnalisis() == codigoSeleccionado:
cultivoCorrecto = True
print('El cultivo seleccionado está en fase '+
cultivo.getFase())
if cultivo.getFase() == Cultivo.F1:
FaseSiguiente = “2”
elif cultivo.getFase() == Cultivo.F2:
FaseSiguiente = “3”
pasar = input('Quieres pasarlo a Fase “+FaseSiguiente+”?
(responder con si o no)')
if pasar[0] == 's':
if cultivo.getFase() == Cultivo.F1:
cultivo.setFase(Cultivo.F2)
elif cultivo.getFase() == Cultivo.F2:
cultivo.setFase(Cultivo.F3)
else :
print (“El cultivo ya está en la última fase”)
else:
print('El cultivo se deja en la fase actual')
if cultivoCorrecto == False:
print('Ese código de cultivo es incorrecto')

Valencia 21 de Octubre de 2021


24 GRADO DE INGENIERIA BIOMEDICA

8) Dentro del módulo AnalyticalEnterprise:


a) Definir una función a la que denominareis guardarCultivos(), Esa función,
ni recibe ni retorna nada y en su cuerpo debe realizar las siguientes acciones:
- Preguntar al usuario el nombre del fichero donde desea guardar los datos.
- Abrir para escritura ese fichero (recordar que esa operación puede generar la
excepción IOError que debéis tratar)
- Escribir en ese fichero cada uno de los cultivos de la lista de cultivos. El formato
de escritura será: (cuidado con el tipo de temperatura)
codigo:bacteria:fase:temperatura:
- Cerrar el fichero
b) Llama a esa función desde la correspondiente opción

def guardarCultivos():
nombreFichero = input('Nombre el fichero donde deseas guardar los
cultivos? ')
try:
fichero = open(nombreFichero,'w')
for cultivo in listaCultivos:
fichero.write(cultivo.getCodigoAnalisis()+':'+
cultivo.getTipoBacteria()+':'+cultivo.getFase()+
':'+str(cultivo.getTemperatura())+':\n')
fichero.close()
except IOError:
print('Error al abrir el fichero')

9) Dentro del módulo AnalyticalEnterprise:


a) Definir una función a la que denominareis recuperarCultivos(), Esa
función, ni recibe ni retorna nada y en su cuerpo debe realizar las siguientes
acciones:
- Preguntar al usuario el nombre del fichero del que desea recuperar los datos.
- Abrir para lectura ese fichero (recordar que esa operación puede generar la
excepción FileNotFoundError que debéis tratar)
- Leer de ese fichero cada uno de los cultivos de la lista de cultivos,
visualizándolos (tal y como se leen) por pantalla
- Cerrar el fichero
b) Llama a esa función desde la correspondiente opción

def recuperarCultivos9():
nombreFichero = input('Nombre el fichero del que deseas recuperar los
cultivos? ')
try:
fichero = open(nombreFichero,'r')
lista = fichero.readlines()
for linea in lista:
print(linea)
except FileNotFoundError:
print('error al abrir el fichero')

Valencia 21 de Octubre de 2021


EXAMEN DE INFORMATICA Y REDES 25

10). Redefinir (ampliar la) función recuperarCultivos(), para que, además de


hacer lo que ya hace, borre la lista actual de cultivos y al leer los datos del disco
extraiga de ellos la correspondiente información (cuidado con el tipo de
temperatura) y con ella, para cada cultivo, instancie un objeto de tipo Cultivo y
lo introduzca en la lista de cultivos.

def recuperarCultivos10():
nombreFichero = input('Nombre el fichero del que deseas recuperar los
cultivos? ')
try:
fichero = open(nombreFichero,'r')
lista = fichero.readlines()
listaCultivos.clear()
for linea in lista:
indice = 0
codigo = ''
while linea[indice] != ':':
codigo = codigo + linea[indice]
indice = indice +1
indice = indice +1
bacteria=''
while linea[indice] != ':':
bacteria = bacteria + linea[indice]
indice = indice +1
indice = indice +1
fase=''
while linea[indice] != ':':
fase = fase + linea[indice]
indice = indice +1
indice = indice +1
temperatura=''
while linea[indice] != ':':
temperatura = temperatura + linea[indice]
indice = indice +1
indice = indice +1
temperatura=float(temperatura)
nuevoCultivo = Cultivo(bacteria,codigo)
nuevoCultivo.setFase(fase)
nuevoCultivo.setTemperatura(temperatura)
listaCultivos.append(nuevoCultivo)
except FileNotFoundError:
print('error al abrir el fichero')

Algunos métodos de la lista de Python son:

.append(elemento) // añade el elemento a la lista


.clear() // borra todos los elementos de la lista (la deja vacía)

y la función len() recibe como parámetro una lista y retorna el numero de elementos que
contiene la lista

Valencia 21 de Octubre de 2021


26 GRADO DE INGENIERIA BIOMEDICA

La primera vez que ejecutamos el programa nos da

y si salimos y volvemos a ejecutar, leemos el cultivo que tenemos


guardado en él:

Valencia 21 de Octubre de 2021

También podría gustarte