{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Informatika - Programación \n", "# Examen extraordinario - Fecha 08-02-2021\n", "\n", "## Nombre y apellidos: " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dado un sensor de temperatura, que nos manda una medición de temperatura (número entero) cada 15 minutos, queremos construir dinámicamente un histograma que nos diga, para cada temperatura, cuántas veces hemos obtenido dicha medición a lo largo del tiempo. El término dinámico significa que el histograma lo vamos a constuir conforme vayamos leyendo temperaturas del sensor. Para representar el histograma vamos a utilizar dos listas `temperaturas` y `ocurrencias`:\n", "- la lista `temperaturas` contendrá todas las temperaturas (enteras, de una en una) entre la temperatura mínima y la máxima leídas por el sensor, independientemente de que dicha temperatura haya sido registrada.\n", "- la lista `ocurrencias` contendrá el número de veces que cada temperatura ha sido registrada.\n", "\n", "Así, por ejemplo, si hemos registrado las temperaturas $15, 18, 15, 20, 13, 25, 13, 13, 13$\n", "- la lista `temperaturas` contendrá todos los números enteros entre la temperatura más baja (13) y la más alta (25)\n", "\n", " temperaturas = [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]\n", " \n", "- la lista `ocurrencias` contendrá cuántas veces hemos registrado cada temperatura\n", " \n", " ocurrencias = [4, 0, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1]\n", " \n", "Como se ha comentado, el histograma se constuirá paso a paso según vayamos leyendo temperaturas. El proceso de construcción seguirá los siguientes pasos.\n", "- Inicialmente, tendremos dos listas vacías \n", " \n", " temperaturas = []\n", " ocurrencias = []\n", " \n", "- Al leer la primera temperatura (15), tendremos \n", "\n", " temperaturas = [15]\n", " ocurrencias = [1]\n", " \n", "- Al leer la segunda temperatura (18), debemos añadir a `temperaturas` todos los números entre 15 y 18. A su vez, tendremos que añadir 0s al vector `ocurrencias` en las posiciones correspondientes a los nuevos valores en `temperaturas`. Finalmente, pondremos el último valor de `ocurrencias` (correspondiente a cuántas veces leemos 18) a 1. \n", "\n", " temperaturas = [15, 16, 17, 18]\n", " ocurrencias = [1, 0, 0, 1]\n", " \n", "- Al leer la tercera temperatura (15), como ya existe dicho número en `tenperaturas`, tendremos que aumentar `ocurrencias` en la posición correspondiente a 15\n", " \n", " temperaturas = [15, 16, 17, 18]\n", " ocurrencias = [2, 0, 0, 1]\n", " \n", "- Al leer la cuarta temperatura (20), debemos añadir a `temperaturas` todos los números entre 18 y 20 (y añadiremos 0s a las posiciones correspondientes a esas temperaturas en `ocurrencias`). Finalmente, pondremos el último valor de `ocurrencias` (correspondiente a cuántas veces leemos 20) a 1. \n", " \n", " temperaturas = [15, 16, 17, 18, 19, 20]\n", " ocurrencias = [2, 0, 0, 1, 0, 1]\n", " \n", "- Al leer la quinta temperatura (13), debemos añadir a `temperaturas` todos los números entre 13 y 15 (y añadiremos 0s a las posiciones correspondientes a esas temperaturas en `ocurrencias`). Finalmente, pondremos el primer valor de `ocurrencias` (correspondiente a cuántas veces leemos 13) a 1. \n", " \n", " temperaturas = [13, 14, 15, 16, 17, 18, 19, 20]\n", " ocurrencias = [1, 0, 2, 0, 0, 1, 0, 1]\n", " \n", "- Y así sucesivamente hasta terminar de leer la secuencia de números.\n", " \n", "Para constuir este programa, vamos a definir las siguientes funciones." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `genera_vacio` (0.25 punto)\n", "\n", "Esta función crea y devuelve dos listas vacías (`temperaturas` y `ocurrencias`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `añade_primero` (0.5 punto)\n", "\n", "Esta función recibe un valor de temperatura `x` y devolverá dos listas `temperaturas` y `ocurrencias`, en la que `temperaturas` contendrá el valor `x` y `ocurrencias` contendrá el valor 1. Para generar las listas iniciales, utiliza la función definida previamente," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " x = 15\n", " Salida:\n", " temperaturas = [15]\n", " ocurrencias = [1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `esta` (1 punto)\n", "\n", "Esta función recibe un valor de temperatura `x` y la lista `temperaturas` y devolverá -1, 0 o 1 en función de las siguientes reglas:\n", "- si `temperaturas` contiene a `x` como elemento, entonces devolverá el valor `0`.\n", "- si `x` no está en `temperaturas` y `x` es menor que el valor más pequeño de `temperaturas`, devolverá `-1`.\n", "- si `x` no está en `temperaturas` y `x` es mayor que el mayor elemento de `temperaturas`, entonces devolverá `1`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " x = 10\n", " temperaturas = [13, 14, 15, 16]\n", " Salida:\n", " -1\n", " \n", " Entrada: \n", " x = 20\n", " temperaturas = [13, 14, 15, 16]\n", " Salida:\n", " 1\n", " \n", " Entrada: \n", " x = 15\n", " temperaturas = [13, 14, 15, 16]\n", " Salida:\n", " 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "temperaturas = [13, 14, 15, 16]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `aumenta` (1 punto)\n", "\n", "Recibe como parámetro un valor de temperatura `x`, y las listas `temperaturas` y `ocurrencias`. Asumiremos que el elemento `x` está contenido en `temperaturas` y lo único que tenemos que hacer es aumentar el valor asociado en `ocurrencias` en uno. La función devolverá la lista `ocurrencias`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " x = 15\n", " temperaturas = [13, 14, 15, 16]\n", " ocurrencias = [1, 0, 1, 1]\n", " Salida:\n", " ocurrencias = [1, 0, 2, 1]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 15\n", "temperaturas = [13, 14, 15, 16]\n", "ocurrencias = [1, 0, 1, 1]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `inserta_derecha` (2.25 puntos)\n", "\n", "Recibe como parámetro un valor de temperatura `x`, y las listas `temperaturas` y `ocurrencias`. Asumiremos que el valor de `x` es mayor que el más grande de `temperaturas`. La función deberá añadir a `temperaturas` todos los elementos consecutivos entre el último valor de `temperaturas` y `x`. En `ocurrencias` deberá añadir el mismo número de elementos, pero con el valor 0. Por último, se pondrá a 1 el último valor de `ocurrencias`, para registrar la nueva temperatura `x`. La función devolverá las listas `temperaturas` y `ocurrencias`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " x = 20\n", " temperaturas = [10, 11, 12, 13, 14, 15, 16]\n", " ocurrencias = [1, 0, 0, 1, 0, 2, 1]\n", " Salida:\n", " temperaturas = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]\n", " ocurrencias = [1, 0, 0, 1, 0, 2, 1, 0, 0, 0, 1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 20\n", "temperaturas = [10, 11, 12, 13, 14, 15, 16]\n", "ocurrencias = [1, 0, 0, 1, 0, 2, 1]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `inserta_izquierda` (2.25 puntos)\n", "\n", "Recibe como parámetro un valor de temperatura `x`, y las listas `temperaturas` y `ocurrencias`. Asumiremos que el valor de `x` es menor que el más pequeño de `temperaturas`. La función deberá añadir a `temperaturas` todos los elementos consecutivos entre `x` y el primer valor que contuviese anteriormente. En `ocurrencias` deberá añadir el mismo número de elementos, pero con el valor 0. Por último, se pondrá a 1 el primer valor de `ocurrencias`, para registrar la nueva temperatura `x`. La función devolverá las listas `temperaturas` y `ocurrencias`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " x = 10\n", " temperaturas = [13, 14, 15, 16]\n", " ocurrencias = [1, 0, 2, 1]\n", " Salida:\n", " temperaturas = [10, 11, 12, 13, 14, 15, 16]\n", " ocurrencias = [1, 0, 0, 1, 0, 2, 1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 10\n", "temperaturas = [13, 14, 15, 16]\n", "ocurrencias = [1, 0, 2, 1]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `imprime_histograma` (0.5 puntos)\n", "\n", "Esta función recibirá dos listas `temperaturas` y `ocurrencias` e imprimirá en pantalla el contenido del histograma siguiendo el ejemplo." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " Entrada: \n", " temperaturas = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]\n", " ocurrencias = [1, 0, 0, 1, 0, 2, 1, 0, 0, 0, 1]\n", " Salida:\n", " Temperatura 10: 1\n", " Temperatura 11: 0\n", " Temperatura 12: 0\n", " Temperatura 13: 1\n", " Temperatura 14: 0\n", " Temperatura 15: 2\n", " Temperatura 16: 1\n", " Temperatura 17: 0\n", " Temperatura 18: 0\n", " Temperatura 19: 0\n", " Temperatura 20: 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Programa principal (2.25 puntos)\n", "\n", "A partir del vector `valores` que contiene las temperaturas registradas, el programa principal generará el histograma siguiendo los siguientes pasos utilizando siempre que sea posible las funciones definidas previamente:\n", "1. Coger el primer elemento y utilizarlo para generar las listas `temperaturas` y `ocurrencias` con dicho valor.\n", "2. Para cada valor del `registro` de temperaturas,\n", " a. Comprobar si dicha temperatura ya está en el histograma\n", " b. Aumentar el número de ocurrencias, insertar a la izquierda o a la derecha dependiendo del resultado del paso anterior.\n", "3. Imprimir el histograma obtenido por pantalla." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejemplo**\n", "\n", " valores = [15, 18, 15, 20, 13, 25, 13, 13, 13]\n", " Salida:\n", " Temperatura 13: 4\n", " Temperatura 14: 0\n", " Temperatura 15: 2\n", " Temperatura 16: 0\n", " Temperatura 17: 0\n", " Temperatura 18: 1\n", " Temperatura 19: 0\n", " Temperatura 20: 1\n", " Temperatura 21: 0\n", " Temperatura 22: 0\n", " Temperatura 23: 0\n", " Temperatura 24: 0\n", " Temperatura 25: 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "valores = [15, 18, 15, 20, 13, 25, 13, 13, 13]\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 2 }