Computing">
Nothing Special   »   [go: up one dir, main page]

Practica 5

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 6

Programación en Python

Boletin 5
Universidad Politécnica de Valencia
2021-2022

Ejercicio 1. Hacer un programa interactivo en Python que pida el número de personas a almacenar y
de cada una de ellas nos pida los siguientes datos por teclado: día mes y año de nacimiento (enteros)
y nombre de la persona (String) y lo almacene en un fichero llamado "fechas.txt" con el siguiente
formato:
fechas.txt
12 03 1996 | Salvador Ruiz Blanco
16 05 1997 | Javier Sanchez Aguado
08 10 1976 | Maria Magdalena Negro
04 03 2010 | Ramón Moneda Ricos

El fichero de arriba ha resultado de la siguiente sesión interactiva:

ejemplo con 4 personas


>>> %Run
Número de personas a almacenar: 4

Dar los datos para persona 1:


Día: 12
Mes: 3
Año: 1996
Nombre: Salvador Ruiz Blanco

Dar los datos para persona 2:


Día: 16
Mes: 5
Año: 1997
Nombre: Javier Sanchez Aguado

Dar los datos para persona 3:


Día: 8
Mes: 10
Año: 1976
Nombre: Maria Magdalena Negro

Dar los datos para persona 4:


Día: 4
Mes: 3
Año: 2010
Nombre: Ramón Moneda Ricos

Fichero "fechas.txt" generado.


>>>

1
Ejercicio 2. A partir del ejercicio anterior, haz un programa que lea el fichero "fechas.txt" y nos
diga cuantas personas nacieron en mayo. En el ejemplo anterior solo hay una persona que ha nacido
en mayo. Para testear bien tu programa asegura que lo pruebas también con diferentes ficheros
"fechas.txt":
un fichero "fechas.txt" que no tiene ninguna persona nacido en mayo
un fichero "fechas.txt" que tiene más de una persona nacido en mayo
Ejercicio 3. Continuando con el fichero "fechas.txt", escribe una función con paráme-
tros opcionales para permitir a su usuario buscar en el fichero de fechas. Por ejemplo
buscar_fechas("fechas.txt", mes=5) devuelve una lista con los nombres de las personas nacidos
en mayo; buscar_fechas("fechas.txt", mes=2, dia=29) devuelve una lista con los nombres de las
personas nacidos en 29 de febrero, etc. La función debe aceptar como parámetros opcionales día,
mes y año.
Ejercicio 4. Tenemos el siguiente formato para un fichero de texto:

tresnotas.txt
23 2.5 3.0 1.1
34 2.0 1.0 1.0
17 1.0 1.0 1.1
450 4.0 2.1 2.2
55 4.0 4.0 2.0

En cada linea tenemos:


el número de expediente del alumno, que es un entero
la nota del primer parcial, un valor real
la nota del segundo parcial, un valor real
la nota de asistencia, un valor real
Escribe una función calcular_notas en Python que recibe como parámetro el nombre de un fichero
de texto que tiene el formato como tresnotas.txt y escriba por pantalla, el total de alumnos y
cuántos de ellos han aprobado. Se considerará que un alumno está aprobado cuando la suma de sus
tres notas sea mayor que o igual a 5.

ejemplo de llamada a la función calcular_notas


>>> calcular_notas("tresnotas.txt")
numero de alumnos: 5
numero de aprobados: 3
>>>

Ejercicio 5. Escribe un programa en Python que puede generar una cantidad de ficheros con una
cantidad aleatoria (entre 1 y 10) de números reales aleatorios (entre 1.00 y 200.00). Los números
tienen que estar alineados a la derecha y con 2 decimales. Puedes importar random y usar randint
para generar números enteros de forma aleatorio, y uniform para generar números reales de forma
aleatorio.
Tu programa:
primero tiene que pedir al usuario la cantidad de ficheros que quiere generar
después le pide el nombre que quiere usar como base de los ficheros generados. Por ejemplo,
si el usuario quiere 5 ficheros con nombre de basefichero, tu programa generará los ficheros
fichero1.txt, fichero2.txt, . . . , fichero5.txt
Por ejemplo:

2
ejemplo de sesión interactiva
>>> %Run
Cuantos ficheros?: 4
Cual es el nombre base?: fichero
>>>

Puede generar por ejemplo:

fichero1.txt fichero2.txt fichero3.txt fichero4.txt


133.25 29.92 50.08 6.64
159.93 199.44 59.34 136.33
162.02 158.01 109.88 32.02
23.26 153.48 56.16
147.50 195.16 97.67
51.95 160.56
86.55
153.28

Ejercicio 6. Escribe una función calcular_varianza en Python que recibe el nombre de un fichero y
que lea una cantidad de números reales de este fichero, almacenándolos en una lista, y que muestre
por pantalla la varianza de dichos datos. La varianza se calcula como la suma de las diferencias al
cuadrado entre cada elemento de la lista, v[i], y la media, todo ello dividido entre el número de
elementos (N):
PN
(x[i] − media)2
w = i=1 (1)
N −1

Por ejemplo, imagina que tenemos:


numeros.txt
6.64
136.33
32.02
56.16
97.67
160.56
ejemplo de llamada a la función
>>> calcular_varianza("numeros.txt")
3035.443822222222

Para testear tu función vamos a utilizar el Ejercicio 5 para generar una cantidad de ficheros (p. ej. 5
ficheros numeros1.txt, numeros2.txt, numeros3.txt, numeros4.txt y numeros5.txt).
Después, termina el siguiente código pytest para ejecutar tus pruebas de forma automático. Como
salida_esperada podéis usar statistics.variance(lista).

import pytest

@pytest .mark. parametrize ("testcase , f_entrada , salida_esperada " ,[


(1, " numeros1 .txt", ....) ,
(2, " numeros2 .txt", ...
(3,
(4,
(5,
])

def test_calcular_varianza (testcase , f_entrada , salida_esperada ):

3
assert abs( calcular_varianza ( f_entrada ) − salida_esperada ) < 10∗∗−7 ,\
"caso {0}". format ( testcase )

Recuerda que hay que tener en cuenta que comparar flotantes para la igualdad tiene problemas
de redondeo y precisión. Por eso hay que comparar que la diferencia entre lo que sale de nuestra
función y lo que esperamos es menor a por ejemplo 10−7
Ejercicio 7. Escribir una función que, dado un número entero n mayor que cero, devuelve una lista de
los múltiplos de 3 que hay entre 3 y n. Escribe otra función que, dado un número entero n mayor
que cero, devuelve una lista de los divisores de n. Prueba tus funciones con pytest, por ejemplo:
@pytest .mark. parametrize ( ' testcase , entrada , salida_esperada ' ,[
(1, 10, [3, 6, 9]),
(2, 0, []),
(3, 1, []),
(4, −5, []),
(5, 12, [3, 6, 9, 12]) ,
(6, 3, [3])
])
def test_multiplos_de_3 (testcase , entrada , salida_esperada ):
assert multiplos_de_3 ( entrada )== salida_esperada , ' caso {0} ' . format ( testcase )

@pytest .mark. parametrize ( ' testcase , entrada , salida_esperada ' ,[


(1, 10, [1, 2, 5, 10]) ,
(2, 18, [1, 2, 3, 6, 9, 18]) ,
(3, 1, [1]) ,
(4, −5, []),
(5, 12, [1, 2, 3, 4, 6, 12]) ,
(6, 0, [])
])
def test_divisores_de (testcase , entrada , salida_esperada ):
assert divisores_de ( entrada )== salida_esperada , ' caso {0} ' . format ( testcase )

Ahora, usa estas funciones para escribir un programa main que pide un numero mayor que cero al
usuario a través del teclado que devuelve el siguiente:

>>> %Run
Teclea un numero entero mayo a cero: 1
No hay multiplos de 3
>>> %Run
Teclea un numero entero mayo a cero: 2
No hay multiplos de 3
>>> %Run
Teclea un numero entero mayo a cero: 3
multiplo = 3 divisores del 3 = [1, 3]
>>> %Run
Teclea un numero entero mayo a cero: 13
multiplo = 3 divisores del 3 = [1, 3]
multiplo = 6 divisores del 6 = [1, 2, 3, 6]
multiplo = 9 divisores del 9 = [1, 3, 9]
multiplo = 12 divisores del 12 = [1, 2, 3, 4, 6, 12]
>>>

Ejercicio 8. Implementar una función fib(n) que devuelve una lista con los primeros n números de
Fibonacci. Si n==0, la función tiene que devolver la lista [1], si n==1, la función tiene que devolver la

4
lista[1,1]. Cuando n<1, entonces hay que empezar con la lista [1,1] y añadir el siguiente numero
Fibonacci sumando los números anteriores en la lista.
Por ejemplo tecleando:

>>> print(fib(0))
[1]
>>> print(fib(1))
[1, 1]
>>> print(fib(2))
[1, 1, 2]
>>> print(fib(12))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

¡No olvida tus pytests para automatizar los tests!


Ejercicio 9. Escribe una función (posMax) que dada una lista no vacía devuelva la posición donde
se encuentra su valor máximo. Puedes suponer que los elementos de la lista tendrán siempre el
mismo tipo, por ejemplo [1, 2, 3] y ["1", "b", "t"] son entradas válidas, pero [1, "2", False]
no. Después, completa la tabla de abajo con la cantidad de filas que ves necesario para diseñar tu
conjunto de tests y ejecuta los tests automáticos con pytest. Esta vez no hace falta testear la lista
vacía, porque el enunciado dice claramente que tu función solo tiene que funcionar para una lista no
vacía.

caso de test número entrada salida esperada


1
2
3
....
Ejercicio 10. Escribir una función que dada una lista de palabras y una palabra devuelva el número de
veces que aparece dicha palabra en la lista. Después, completa la tabla con la cantidad de filas que
ves necesario para diseñar tu conjunto de tests y ejecuta los tests automáticos con pytest.

caso de test número entrada salida esperada


1
2
3
....
Ejercicio 11. Diseña una función (miSplit) que obtiene una cadena y devuelve una lista con todas sus
palabras en minúsculas. La lista devuelta no debe contener palabras repetidas. No puedes usar el
split predefinido de Python. Por ejemplo, ante la cadena:

>>> miSplit('Una frase formada con palabras. Otra frase con otras palabras.')
['una', 'frase', 'formada', 'con', 'palabras', 'otra', 'otras']
>>> miSplit('Hi! Helloooo HI')
['hi', 'helloooo']

Para diseñar tu conjunto de tests que tienes que ejecutar de forma automáticos con pytest piensa en
casos:
que la cadena es vacía
que la cadena tiene signos de puntuación, como ,;.:-¿?+*()!¡
que la cadena termine con un punto
que la cadena no termine con un punto
que la cadena tiene números

5
que la cadena tiene palabras repetidos, pero unos tiene mayúsculas y otras no (por ejemplo:
' HOla hola hoLa'
que la cadena tiene más de 1 espacio entre palabras
etc.

También podría gustarte