Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Guión de prácticas: C++, Apuntes de Informática

Asignatura: microbiologia, Profesor: Fran Araque Cuenca, Carrera: Ingeniería Informática, Universidad: UGR

Tipo: Apuntes

2016/2017

Subido el 15/05/2017

rayohielo
rayohielo 🇪🇸

3.8

(26)

34 documentos

Vista previa parcial del texto

¡Descarga Guión de prácticas: C++ y más Apuntes en PDF de Informática solo en Docsity! Fundamentos de Programación. Guión de Prácticas. Curso 2016/2017 Para cualquier sugerencia o comentario sobre este guión de prácticas, por favor, enviad un e-mail a Juan Carlos Cubero (JC.Cubero@decsai.ugr.es) "Lo que tenemos que aprender a hacer, lo aprendemos haciéndolo". Aristóteles "In theory, there is no difference between theory and practice. But, in practice, there is". Jan L. A. van de Snepscheut "The gap between theory and practice is not as wide in theory as it is in practice". "Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why". Guión de Prácticas. Fundamentos de Programación 1 Instalación de Orwell Dev C++ en nuestra casa Preparar y acceder a la consola del sistema La consola de Windows (la ventana con fondo negro que aparece al ejecutar el comando cmd.exe, o bien la que sale al ejecutar un programa en Dev C++) no está preparada por defecto para mostrar adecuadamente caracteres latinos como los acentos. Por ejemplo, al ejecutar la sentencia de C++ cout << "Atención" saldrá en la consola un mensaje en la forma Atenci3/4n Para que podamos ver correctamente dichos caracteres, debemos seguir los siguientes pasos: 1. Cambiar la fuente de la consola a una que acepte caracteres Unicode. En la versión de XP de las aulas ya se ha realizado dicho cambio. En nuestra casa, tendremos que hacer lo siguiente: Inicio -> Ejecutar -> cmd Una vez que se muestre la consola, hacemos click con la derecha y seleccionamos Predeterminados. Seleccionamos la fuente Lucida Console y aceptamos. Guión de Prácticas. Fundamentos de Programación 4 Instalación de Orwell Dev C++ en nuestra casa 2. Debemos cargar la página de códigos correspondiente al alfabeto latino. Para ello, tenemos varias alternativas: a) Incluir la siguiente sentencia al inicio de nuestro programa (.cpp), al empezar el main: setlocale(LC_ALL, "spanish"); b) Lo siguiente es sólo para el SO Microsoft Windows. Si queremos que la consola siempre cargue la tabla de caracteres latinos, debemos modificar el registro de Windows. Lo abrimos desde Inicio->Ejecutar->regedit Nos situamos en la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ \Control\Nls\CodePage y cambiamos el valor que hubiese dentro de OEMCP y ACP por el de 1252. Esta es una página muy parecida a la 8859-1 referenciada en los apuntes (Tema I) Esta es la forma recomendada y la que se ha usado en las aulas de prácticas. Requiere reiniciar el ordenador. Muy Importante: Si se usa otra tabla (distinta a 1252), el sistema operativo podría incluso no arrancar. Guión de Prácticas. Fundamentos de Programación 5 Tabla resumen de accesos directos usados en Orwell Dev C++ Tabla resumen de accesos directos usados en Orwell Dev C++ Tab Tabula una línea o un bloque Shift Tab Quita tabulación a una línea o un bloque Ctrl Barra Espaciadora Ayuda autocompletación del código F9 Compilar F10 Ejecutar F11 Compilar y Ejecutar F5 Depurar Empieza la depuración F7 Siguiente paso Ejecución paso a paso sin entrar en los métodos o funciones F8 Avanzar paso a paso Ejecución paso a paso entrando en los métodos o funciones Guión de Prácticas. Fundamentos de Programación 6 El Entorno de Programación. Compilación de Programas I Actividades a realizar en las aulas de ordenadores Estas son las actividades que se realizarán durante las clases de prácticas en la segunda semana de clase. El Entorno de Programación. Compilación de Programas Arranque del Sistema Operativo Para poder arrancar el SO en las aulas de ordenadores, es necesario obtener el login y password indicados en las actividades a realizar en casa. En la casilla etiquetada como Código, introduciremos fp. Al arrancar el SO, aparecerá una instalación básica de Windows con el compilador Orwell Dev C++. Todo lo que escribamos en la unidad C: se perderá al apagar el ordenador. Por ello, el alumno dispone de un directorio de trabajo en la unidad lógica U:, cuyos conte- nidos permanecerán durante todo el curso académico. En cualquier caso, es recomendable no saturar el espacio usado ya que, en caso contrario, el compilador podría no funcionar. El alumno deberá crear el directorio U:\FP dentro de su unidad U: Para acceder a la unidad U: desde nuestras casas, debemos usar cualquier programa de ftp que use el protocolo ssh, como por ejemplo filezilla o winscp. Instalamos este programa en nuestra casa y simplemente nos conectamos a turing.ugr.es con nuestras credenciales. El primer programa Copiando el código fuente Descargue de decsai el fichero I_Pitagoras y cópielo en su carpeta local (dentro de U:\FP ). También puede bajarse el fichero desde la siguiente dirección: http://decsai.ugr.es/~carlos/FP/I_Pitagoras.cpp Desde el Explorador de Windows, haga doble click sobre el fichero I_Pitagoras.cpp. Debe aparecer una ventana como la de la figura 1 Guión de Prácticas. Fundamentos de Programación 9 El Entorno de Programación. Compilación de Programas Figura 1: Programa que implementa el algoritmo de Pitágoras Guión de Prácticas. Fundamentos de Programación 10 El Entorno de Programación. Compilación de Programas Algunas consideraciones con respecto a la escritura de código en C++ (ver figura 2) • Es bueno que, desde el principio se incluyan comentarios indicando el objetivo del programa y resaltando los aspectos más importantes de la implementación. • Es muy importante una correcta tabulación de los programas. Por ahora, incluiremos todas las sentencias del programa principal con una tabulación. Sólo es necesario incluir la primera; el resto las pone automáticamente el entorno, al pasar a la siguiente línea. • Para facilitar la lectura del código fuente, se deben usar espacios en blanco para se- parar las variables en la línea en la que van declaradas, así como antes y después del símbolo = en una sentencia de asignación. Dejad también un espacio en blanco antes y después de << y >> en las sentencias que contienen una llamada a cout y cin respectivamente. Figura 2: Escritura de código No respetar las normas de escritura de código baja puntos en todos los exámenes y prácticas de la asignatura Guión de Prácticas. Fundamentos de Programación 11 El Entorno de Programación. Compilación de Programas 6. Si después de corregir el error aparecen nuevos errores, volver a repetir el proceso desde el paso 1. A veces, el compilador no indica la línea exacta en la que se produce el error, sino alguna posterior. Para comprobarlo, haced lo siguiente: • Comentad la línea de cabecera #include <iostream> desde el principio. El com- pilador no reconocerá las apariciones de cin o cout. • Quitad un punto y coma al final de alguna sentencia. Dará el error en la línea siguiente. Para familiarizarnos con los errores más frecuentes y su corrección vamos a realizar el siguiente proceso: a partir del código fuente del ejemplo I_Pitagoras.cpp, iremos intro- duciendo deliberadamente errores para conocer los mensajes que nos aparecen. A conti- nuación se muestran algunos errores posibles. No deben introducirse todos ellos a la vez, sino que han de probarse por separado. 1. Cambiad algún punto y coma por cualquier otro símbolo 2. Cambiad double por dpuble 3. Cambiad la línea using namespace std; por using namespace STD; 4. Poned en lugar de iostream, el nombre iotream. 5. Borrad alguno de los paréntesis de la declaración de la función main 6. Introducid algún identificador incorrecto, como por ejemplo cour 7. Usad una variable no declarada. Por ejemplo, en la definición de variables cambiad el nombre a la variable lado1 por el identificador lado11. 8. Borrad alguna de las dobles comillas en una constante de cadena de caracteres, tanto las comillas iniciales como las finales. 9. Borrad alguna de las llaves que delimitan el inicio y final del programa. 10. Borrad la línea using namespace std; (basta con comentarla con //) 11. Cambiad un comentario iniciado con //, cambiando las barras anteriores por las si- guientes \\ 12. Cambiad la aparición de << en cout por las flechas cambiadas, es decir, >>. Haced lo mismo con cin. 13. Suprimid todo el main. No hace falta borrar el código, basta con comentarlo. Guión de Prácticas. Fundamentos de Programación 14 El Entorno de Programación. Compilación de Programas Además de los errores, el compilador puede generar avisos. Estos se muestran como Warning en la misma ventana de la lista de errores. Estas advertencias indican que algún código puede generar problemas durante la ejecución. Por ejemplo, al usar una variable que todavía no tiene un valor asignado, al intentar asignar un entero grande a un entero chico, etc. Sin embargo, no son errores de compilación, por lo que es posible generar el programa ejecutable correspondiente. Los errores lógicos y en tiempo de ejecución Aunque el programa compile, esto no significa que sea correcto. Puede producirse una excepción durante la ejecución, de forma que el programa terminará bruscamente (típico error en Windows de Exception Violation Address) o, lo que es peor, dará una salida que no es correcta (error lógico). Sobre el programa I_Pitagoras.cpp, haced lo siguiente: • Cambiad la sentencia sqrt(lado1*lado1 + lado2*lado2) por: sqrt(lado1*lado2 + lado2*lado2) Ejecutad introduciendo los lados 2 y 3. El resultado no es correcto, pero no se produce ningún error de compilación ni en ejecución. Es un error lógico. • Para mostrar un error de ejecución, declarad tres variables ENTERAS (tipo int) resultado, numerador y denominador. Asignadle cero a denominador y 7 a numerador. Asignadle a resultado la división de numerador entre denominador. Imprimid el resultado. Al ejecutar el programa, se produce una ex- cepción o error de ejecución al intentar dividir un entero entre cero. Creación de un programa nuevo En esta sección vamos a empezar a crear nuestros propios programas desde Orwell Dev C++. El primer ejemplo que vamos a implementar corresponde al ejercicio 2 sobre la Ley de Ohm, de la relación de problemas I. Para crear un programa nuevo, abrimos Orwell Dev C++y elegimos Archivo->Nuevo Código Fuente (Ctr-N) Para cambiar el nombre asignado por defecto, seleccionamos Archivo -> Guardar Como. Nos vamos a la carpeta U:\FP e introducimos el nombre I_Voltaje. Confirmad que en la esquina superior derecha está seleccionada la opción de compilación TDM-GCC ... Debug Guión de Prácticas. Fundamentos de Programación 15 El Entorno de Programación. Compilación de Programas Figura 3: Creación de un programa nuevo Ya estamos en condiciones de resolver el problema pedido. Escribimos el código en la ventana de edición. Habrá que leer desde teclado los valores de intensidad y resistencia y el programa imprimirá en pantalla el voltaje correspondiente. Recordad que compilamos con F9 y ejecutamos con F10, o directamente ambas acciones con F11. Nota. Cuando tenemos varias variables en el código, podemos empezar a escribir el nombre de alguna de ellas y antes de terminar, pulsar Ctr-Barra espaciadora. La ayuda nos mostrará los identificadores disponibles que empiecen por las letras tecleadas. Resuelva el ejercicio 6 (Diferencia entre instantes de tiempo) Este ejercicio no tiene que entregarlo, pero lo puede guardar en su unidad en decsai. La solución también estará disponible en decsai al final de la semana. Guión de Prácticas. Fundamentos de Programación 16 Tipos básicos y operadores Sesión 3 I Actividades a realizar en casa Actividad: Lectura de programas resueltos. Lea la solución de los siguientes ejercicios (disponible en decsai) 20 (Índice de mayúscula) 21 (Pasar de carácter a entero) 22 (Expresiones diversas) Actividad: Resolución de problemas. Resuelva los siguientes problemas de la relación de Problemas I: • Obligatorios: 23 (Horas, minutos, segundos) 24 (Intercambiar tres variables) 25 (Pasar de mayúscula a minúscula) 27 (Expresiones lógicas) • Opcionales: 28 (Precisión y desbordamiento) Actividades de Ampliación Hojear la página http://catless.ncl.ac.uk/Risks que publica periódicamente casos reales en los que un mal desarrollo del software ha tenido implicaciones importantes en la sociedad. Guión de Prácticas. Fundamentos de Programación 19 Redireccionando las entradas de cin I Actividades a realizar en las aulas de ordenadores Redireccionando las entradas de cin Cada vez que se ejecuta cin, se lee un dato desde el periférico por defecto. Nosotros lo hemos hecho desde el teclado, introduciendo un dato y a continuación un ENTER. Otra forma alternativa es introducir un dato y luego un separador (uno o varios espacios en blanco o un tabulador). Esto es posible gracias a la existencia de un buffer intermedio que canaliza el flujo de datos entre el programa y la consola. Para más detalle, consulte el final del Tema 1, disponible en decsai. Para comprobarlo, copiad localmente el fichero II_cin disponible en decsai. Observad el código del programa y ejecutadlo. Para introducir los datos pedidos (un entero y dos carac- teres) siempre hemos introducido cada valor y a continuación ENTER. Ahora lo hacemos de otra forma alternativa: introducimos los datos separados por espacios en blanco y pulsamos ENTER al final (una sola vez). Para comprobar el correcto funcionamiento de nuestros programas, tendremos que ejecu- tarlos en repetidas ocasiones usando distintos valores de entrada. Este proceso lo repe- tiremos hasta que no detectemos fallos. Para no tener que introducir los valores pedidos uno a uno, podemos recurrir a un simple copy-paste. Para comprobarlo, cread un fichero de texto con un entero y dos caracteres. Separad estos tres datos con varios espacios en blanco. Seleccionad con el ratón los tres y copiadlos al portapapeles (Click derecho-Copiar). Ejecutad el programa y cuando aparezca la consola del sistema haced click derecho sobre la ventana y seleccionad Editar-Pegar. Otra alternativa es ejecutar el fichero .exe desde el sistema operativo y redirigir la entrada de datos al fichero que contiene los datos. Para poder leer los datos del fichero, basta con ejecutar el programa .exe desde una consola del sistema y especificar que la entrada de datos será desde un fichero a través del símbolo de redireccionamiento < (no ha de con- fundirse con el token << que aparecía en una instrucción cout de C++) Hay que destacar que este redireccionamiento de la entrada lo estamos haciendo en la llamada al ejecutable desde la consola del sistema operativo1. Para probarlo, descargad desde decsai el fichero II_cin_datos_entrada.txt y copiadlo dentro de la misma carpeta en la que se ha descargado el programa II_cin. Abrimos dicha carpeta desde el explorador y selecciona- mos con el click derecha del ratón "Abrir Símbolo del Sistema"2. Introducimos la instrucción siguiente: 1También pueden leerse datos de un fichero desde dentro del propio código fuente del programa, pero esto se verá en el segundo cuatrimestre 2Para poder lanzar una consola desde el explorador de Windows, en nuestra casa, o bien instalamos un programa que permita abrir una consola en el directorio actual, como por ejemplo Open Command Prompt Shell Extension disponible en http://code.kliu.org/cmdopen/ o bien abrimos un símbolo del sistema (Inicio->Ejecutar->cmd) y vamos cambiando de directorio con la orden cd Guión de Prácticas. Fundamentos de Programación 20 Redireccionando las entradas de cin II_cin.exe < II_cin_datos_entrada.txt Ahora, cada vez que se ejecute una instrucción cin en el programa, se leerá un valor de los presentes en el fichero de texto. Cuando ejecutemos el programa, cada ejecución de cin leerá un dato desde el fichero indicado, saltándose todos los espacios en blanco y tabuladores que hubiese previamente. Cuando llegue al final del fichero, cualquier entrada de datos posterior que realicemos dará un fallo. Resuelva los siguientes ejercicios de la próxima sesión de prácticas: 5 (Subir sueldo -una única subida salarial-) y 6 (Subir sueldo -dos subidas salariales compatibles-) Guión de Prácticas. Fundamentos de Programación 21 Depuración Si cuando configuramos el compilador seleccionamos Herramientas | Opciones del Compilador | Compilador a configurar: ...... Debug nuestro entorno estará preparado para depurar programas. Si no fuera así, al intentar depurar el programa, Dev C++ nos mostrará la ventana de la figura 4. Figura 4: Ventana emergente que aparece cuando la configuración actual del compilador no permite tareas de depuración La idea básica en la depuración es ir ejecutando el código línea a línea para ver posibles fallos del programa. Para eso, debemos dar los siguientes pasos: 1. Establecer una línea del programa en la que queremos que se pare la ejecución. Lo haremos introduciendo un punto de ruptura o (breakpoint) en dicha línea. Si sospe- chamos dónde puede estar el error, situaremos el punto de ruptura en dicha línea. En caso contrario, lo situaremos: a) al principio del programa, si no sabemos exactamente dónde falla el programa, o b) al principio del bloque de instrucciones del que desconfiamos, siempre y cuando tengamos confianza en todas las instrucciones que se ejecutan antes. Para establecer un punto de ruptura podemos mover el ratón en la parte más a la izquierda de una línea de código (o sobre el número de línea) y pulsar el botón iz- quierdo del ratón en esa posición. La instrucción correspondiente queda marcada en rojo. Si en esa línea ya había un punto de ruptura, entonces será eliminado. También podemos colocar el cursor sobre la instrucción y con el menú contextual (botón de- recho del ratón) seleccionar Añadir/Quitar Punto de Ruptura o simplemente, pulsar F4 . Para eliminar un punto de ruptura, se realiza la misma operación que para incluirlo, sobre la instrucción que actualmente lo tiene. Colocad ahora un punto de ruptura sobre la linea que contiene la primera sentencia condicional if (figura 5). 2. Comenzar la depuración: Guión de Prácticas. Fundamentos de Programación 24 Depuración Figura 5: Se ha activado un punto de ruptura Guión de Prácticas. Fundamentos de Programación 25 Depuración a) pulsar F5 , b) pulsar sobre el icono , c) seleccionar en el menú Ejecutar | Depurar, ó d) en la zona inferior, pestaña Depurar, pulsar el botón Depurar (figura 6) Figura 6: Inicio del proceso de depuración Muy importante: Si se escoge ejecutar en lugar de depurar, el programa se ejecuta normalmente, sin detenerse en los puntos de ruptura. Al iniciarse la depuración se ejecutan todas las sentencias hasta alcanzar el primer punto de ruptura. Llegado a este punto, la ejecución se interrumpe (queda “en espera”) y se muestra en azul (figura 7) la línea que se va a ejecutar a continuación (en este caso, la que contiene el punto de interrupción). Ahora podemos escoger entre varias alternativas, todas ellas accesibles en la zona inferior (pestaña Depurar) pulsando el botón correspondiente (ver figura 7): • Parar ejecución : Detener la depuración (y ejecución) del programa. • Siguiente Paso (F7) : Ejecuta la siguiente instrucción. Si se trata de una llamada a una función, la ejecuta y continúa con la siguiente instrucción, sin entrar a ejecutar las instrucciones internas de la función. Las funciones se verán dentro de dos semanas. • Avanzar Paso a paso (F8) : Ejecuta la siguiente instrucción. Si se trata de una lla- mada a una función, entra en la función y ejecuta la primera instrucción de la función, continuando la depuración dentro de la función. • Saltar Paso : Ejecuta todas las instrucciones hasta encontrar un nuevo punto de rup- tura, o llegar al final del programa. Guión de Prácticas. Fundamentos de Programación 26 Depuración "When your code does not behave as expected, do not use the debugger, think". Resuelva el ejercicio 9 (subida salarial excluyente) La solución de este ejercicio no hay que entregarla. Guión de Prácticas. Fundamentos de Programación 29 Estructura Repetitiva. Bucles while Sesión 5 Estructura Repetitiva. Bucles while I Actividades a realizar en casa Actividad: Lectura de programas resueltos. Lea la solución de los siguientes ejercicios (disponible en decsai) 13 (Tres valores ordenados separando E/S y C con un bool) 15 (Mayúscula a minúscula y viceversa separando E/S y C con un enumerado) 19 (Divisores de un número) Actividad: Resolución de problemas. • Obligatorios: Ejercicios sobre condicionales: 11 (Subida salarial, con condicional anidado) 14 (Año bisiesto separando E/S y C) 16 (Tres valores ordenados separando E/S y C con un enumerado) Ejercicios sobre bucles: 22 (Gaussiana) 23 (Población) • Opcionales: 24 (Leer valores dentro de un rango) I Actividades a realizar en las aulas de ordenadores Resuelva el ejercicio 29 (Mayor secuencia ascendente de temperaturas) Este ejercicio es- tará incluido en la próxima sesión. Guión de Prácticas. Fundamentos de Programación 30 Estructura Repetitiva. Bucles while Sesión 6 Actividad: Lectura de programas resueltos. Lea la solución de los siguientes ejercicios (disponible en decsai) 33 (RLE) 38 (Narcisista) I Actividades a realizar en casa Actividad: Resolución de problemas. Resuelva los siguientes problemas de la Relación de Problemas II. Importante: En estos ejercicio se permiten mezclar E/S con cómputos dentro del mismo bucle (ya que todavía no se conocen herramientas para no hacerlo) • Obligatorios: 28 (Lectura de los datos de la subida salarial) 29 (Mayor secuencia ascendente de temperaturas) 30 (Pinta dígitos generalizado) • Opcionales: 31 (Multiplicación rusa) I Actividades a realizar en las aulas de ordenadores Empiece a trabajar con los ejercicios incluidos en la próxima sesión. Por ejemplo, puede resolver los ejercicios 40 y 46 (Factorial y sumatoria de factoriales) Guión de Prácticas. Fundamentos de Programación 31 Depuración de funciones I Actividades a realizar en las aulas de ordenadores Depuración de funciones En la sesión 3 trabajamos sobre la depuración de programas usando Dev C++. Entonces no conocíamos cómo escribir funciones y no pudimos sacar partido a todas las opciones de depuración. En esta sesión de prácticas vamos a trabajar sobre la manera en la que se puede monitorizar la ejecución de un programa que incluye funciones. Usaremos como ejemplo la función Combinatorio. En primer lugar, crearemos la carpeta III_Combinatorio en U:\FP y copiaremos en ella el fichero fuente III_FuncionesCombinatorio.cpp (disponible en decsai) Antes de empezar con las tareas de depuración observaremos el explorador de clases. Para acceder a él, basta con seleccionar Ver | Ir al Explorador de Clases En la figu- ra 10 puede observar que el explorador de clases muestra, para este programa, información acerca de las funciones contenidas en el fichero fuente abierto en el editor. Figura 10: Explorador de clases Para cada función muestra su nombre, los parámetros formales y su tipo, así como el tipo de la función (el tipo del valor devuelto). Se muestran todas las funciones en orden alfabético. Haciendo click sobre el nombre de cualquier función en el explorador, en el editor vemos el código de la función seleccionada. Éste es una manera rápida de acceder al código de cualquier función en nuestros programas. Guión de Prácticas. Fundamentos de Programación 34 Depuración de funciones El proceso de depuración se inicia de la manera habitual: 1. Fijar un punto de ruptura. 2. Comenzar la depuración. Fijaremos un punto de ruptura, por ejemplo, en la línea del main combinatorio = Combinatorio(total_a_elegir, elegidos); y comenzamos la depuración. El programa se ejecuta hasta llegar dicha línea, donde se detiene. Ahora podemos mo- nitorizar su ejecución usando los botones disponibles en la zona inferior, bajo la pestaña Depurar. • Parar ejecución : Detener la depuración (y ejecución) del programa. • Siguiente Paso. F7 : Ejecuta la siguiente instrucción. Si se trata de una llamada a una función, la ejecuta y continúa con la siguiente instrucción, sin entrar a ejecutar las instrucciones internas de la función. • Avanzar Paso a paso. F8 : Ejecuta la siguiente instrucción. Si se trata de una llama- da a una función, entra en la función y ejecuta la primera instrucción de la función, continuando la depuración dentro de la función. • Saltar Paso. : Ejecuta todas las instrucciones hasta encontrar un nuevo punto de ruptura, o llegar al final del programa. En la línea en la que está situado el punto de interrupción, si se pulsara Siguiente Paso se ejecuta completamente esa línea: la llamada a la función Combinatorio y la instrucción de asignación, pasando el control a la línea siguiente del main. Observad cómo la variable combinatorio se ha actualizado correctamente. Durante la ejecución de una función pueden añadirse a la lista de variables monitorizadas cualquiera de las variables locales de la función (incluidas los parámetros formales, por supuesto). Al finalizar la ejecución de la función y dejar de estar activas las variables locales de la función veremos un mensaje de error en estas variables. La ejecución completa de línea siguiente conlleva la ejecución de dos llamadas a la función Factorial: denominador = Factorial(m) * Factorial(n - m); En este punto, • si se pulsa Siguiente Paso se completa la ejecución de esa línea y se cede el control a la línea siguiente. Observad que la variable local combinatorio contiene el valor ya calculado. Guión de Prácticas. Fundamentos de Programación 35 Depuración de funciones • si se pulsa Avanzar Paso a paso se entra a ejecutar la función Factorial, pasan- do el control a la primera instrucción de esa función. Continúe monitorizando la ejecución del programa como desee. No se olvide de probar a establecer un punto de ruptura dentro de una función y observar qué ocurre cuando se pul- san el botón Siguiente Paso ¿se detiene la ejecución en el punto de ruptura o lo ignora? Guión de Prácticas. Fundamentos de Programación 36 Vectores Sesión 11 Vectores I Actividades a realizar en casa Actividad: Lectura de programas resueltos. Lea la solución de los siguientes ejercicios (disponible en decsai) 1 (Palíndromo e invierte) 2 (k mayores que un valor de referencia, versión ineficiente) Actividad: Resolución de problemas. Resuelva los siguientes ejercicios de la relación de problemas IV: • Obligatorios: 3 (k mayores que un valor de referencia, versión eficiente) 4 (Moda) • Opcionales: 5 (Descodifica) Guión de Prácticas. Fundamentos de Programación 39 Vectores Sesión 12 I Actividades a realizar en casa Actividad: Lectura de programas resueltos. Lea la solución de los siguientes ejercicios (disponible en decsai) 8 (Palíndromo e invierte dentro de la clase SecuenciaCaracteres) 9 (Intercambia) 16 (Número de series ascendentes) Actividad: Resolución de problemas. Resuelva los siguientes ejercicios de la relación de problemas IV: • Obligatorios: 10 (Moda dentro de la clase SecuenciaCaracteres) 11 (Elimina todas las ocurrencias de un carácter. Versión ineficiente) 12 (Elimina un bloque de caracteres. Versión ineficiente) 13 (Elimina un bloque de caracteres. Versión eficiente) 15 (Parking con un número variable de tramos) • Opcionales: 14 (Elimina todas las ocurrencias de un carácter. Versión eficiente) Guión de Prácticas. Fundamentos de Programación 40 Fundamentos de Programación. Relaciones de Problemas. RELACIÓN DE PROBLEMAS I. Introducción a C++ En la asignación que calcula la variable total, ¿se podría sustituir dicha variable por capital? es decir: capital = capital + capital * interes / 100; Analice las ventajas o inconvenientes de hacerlo así. Ejemplo de entrada: 300 5.4 −− Salida correcta: 316.2 Ejemplo de entrada: 300 0 −− Salida correcta: 300 Ejemplo de entrada: 0 5.4 −− Salida correcta: 0 Finalidad: Resolver un problema real sencillo, usando varias sentencias. Dificultad Baja. 6. Calcule el número de segundos que hay entre dos instantes del mismo día. Cada instante se caracteriza por la hora (entre 0 y 23), minuto (entre 0 y 59) y segundo (entre 0 y 59). El programa leerá la hora, minuto y segundo del instante inicial y la hora, minuto y segundo del instante final (supondremos que los valores introducidos son correctos) y mostrará el número de segundos entre ambos instantes. Ejemplo de entrada: 9 12 9 10 34 55 −− Salida correcta: 4966 Ejemplo de entrada: 10 34 55 9 12 9 −− Salida correcta: -4966 Ejemplo de entrada: 10 34 55 10 34 55 −− Salida correcta: 0 Finalidad: Trabajar con expresiones numéricas y algoritmos. Dificultad Baja. 7. Queremos construir un programa que simule un juego inspirado en el de los triles (del que procede el nombre de trilero). Suponemos que hay dos participantes y cada uno tiene una caja etiquetada con su nombre. Dentro de cada caja hay una cantidad de dinero y el objetivo es intercambiar las cantidades que hay dentro. Por ahora, sólo se pide construir un programa que haga lo siguiente: • Debe leer desde teclado dos variables caja_izda y caja_dcha. • A continuación debe intercambiar sus valores y finalmente, mostrarlos en panta- lla. Observe que se desea intercambiar el contenido de las variables, de forma que caja_izda pasa a contener lo que tenía caja_dcha y viceversa. El siguiente có- digo no es válido ya que simplemente engaña al usuario pero las cajas no se quedan modificadas: cout << "La caja izquierda vale " << caja_dcha << "\n"; cout << "La caja derecha vale " << caja_izda; Estaríamos tentados a escribir el siguiente código: Guión de Prácticas. Fundamentos de Programación RP-I.3 RELACIÓN DE PROBLEMAS I. Introducción a C++ caja_izda = caja_dcha; caja_dcha = caja_izda; pero no funciona correctamente ¿Por qué? Proponga una solución e impleméntela. Finalidad: Entender cómo funciona la asignación entre variables. Dificultad Baja. 8. Realice un programa que nos pida una longitud cualquiera dada en metros. El progra- ma deberá calcular e imprimir en pantalla el equivalente de dicha longitud en pulgadas, pies, yardas y millas. Para el cálculo, utilice la siguiente tabla de conversión del sistema métrico: 1 pulgada= 25,4 milímetros 1 pie = 30,48 centímetros 1 yarda = 0,9144 metros 1 milla = 1609,344 metros Ejemplo de entrada: 1−− Salida correcta: 39.3701 3.28084 1.09361 0.00062 Finalidad: Plantear la solución de un ejercicio básico como es el de una conversión. Dificultad Baja. 9. Recupere la solución del ejercicio 4 (Subir sueldo usando la variable salario_final) Además de mostrar el salario con la subida del 2% se quiere mostrar el salario resultante de subirle otro 3% adicional. Esta segunda subida se realizará sobre el resultado de haber aplicado la primera subida. El programa debe mostrar los salarios resultantes (el resultante de la subida del 2% y el resultante de las dos subidas consecutivas del 2% y del 3%). Ejemplo de entrada: 30 −− Salida correcta: 30.6 31.518 Ejemplo de entrada: 0 −− Salida correcta: 0 0 Finalidad: Trabajar con expresiones numéricas y con variables para no repetir cómpu- tos. Dificultad Baja. 10. La función gaussiana es muy importante en Estadística. Es una función real de va- riable real que depende de dos parámetros µ y σ. El primero (µ) se conoce como esperanza o media y el segundo (σ) como desviación típica (mean y standard devia- tion en inglés). Su definición viene dada por la siguiente expresión: gaussiana(x) = 1 σ √ 2π e ( −0,5 ( x− µ σ )2) En la gráfica de abajo pueden verse algunos ejemplos de esta función con distintos parámetros. Guión de Prácticas. Fundamentos de Programación RP-I.4 RELACIÓN DE PROBLEMAS I. Introducción a C++ Realice un programa que lea los coeficientes reales µ y σ de una función gaussiana. A continuación el programa leerá un valor de abscisa x y se imprimirá el valor que toma la función en x Para representar el número π defina una constante con el valor 3.1416 -no use una coma para separar la parte entera de la decimal, sino un punto- Para realizar las operaciones indicadas , debe utilizar las siguientes funciones de la biblioteca cmath: • Para elevar el número e a un valor cualquiera, use la función exp. Por ejemplo, para calcular e8 debería usar la siguiente expresión: exp(8) • Para calcular la raíz cuadrada, use sqrt. • Para elevar un número a otro, utilice la función pow en la siguiente forma: pow(base, exponente) En nuestro caso, la base es x− µ σ y el exponente 2. Una vez resuelto el ejercicio usando la función pow, resuélvalo de otra forma en la que no necesite usar dicha función. Compruebe que los resultados son correctos, usando cualquiera de las calculadoras disponibles en: http://danielsoper.com/statcalc3/calc.aspx?id=54 https://www.easycalculation.com/statistics/normal-pdf.php Ejemplo de entrada: 12 5 2.5 −− Salida correcta: 0.01312316 Ejemplo de entrada: 0 1 0 −− Salida correcta: 0.39894228 Finalidad: Trabajar con expresiones numéricas más complejas. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-I.5 RELACIÓN DE PROBLEMAS I. Introducción a C++ Finalidad: Trabajar con expresiones numéricas que involucren distintos tipos de datos. Dificultad Baja. 19. Realice el ejercicio del cálculo de la desviación típica, pero cambiando el tipo de dato de las variables xi a int. Nota: Para no tener problemas en la llamada a la función pow (en el caso de que se haya utilizado para implementar el cuadrado de las diferencias de los datos con la media), obligamos a que la base de la potencia sea un real multiplicando por 1.0, por lo que la llamada quedaría en la forma pow(base*1.0, exponente) Finalidad: Trabajar con expresiones numéricas que involucren distintos tipos de datos. Dificultad Baja. 20. Realice un programa que lea una mayúscula desde teclado sobre una variable de tipo char. A continuación, el programa imprimirá el 0 si se ha introducido el carácter A, el 1 si era la B, el 2 si era la C y así sucesivamente. Supondremos que el usuario introduce siempre un carácter mayúscula. Ejemplo de entrada: C −− Salida correcta: 2 Finalidad: Entender el tipo de dato char. Dificultad Baja. 21. Supongamos el siguiente código: int entero; char caracter; cin >> caracter; entero = caracter; Supongamos que ejecutamos el código e introducimos el 7 desde teclado. El progra- ma está leyendo una variable de tipo char. Por lo tanto, el símbolo 7 se interpreta como un carácter y es como si hiciésemos la siguiente asignación: caracter = '7'; entero = caracter; por lo que la variable caracter almacenará internamente el valor 55 (el orden en la tabla ASCII del carácter '7'). Lo mismo ocurre con la variable entero, que pasa a contener 55. Sin embargo, queremos construir un programa para asignarle a la variable entero el número 7 asociado al dígito representado en la variable caracter, es decir, el 7 y no el 55. ¿Cómo se le ocurre hacerlo? El programa también imprimirá en pantalla el resultado. Guión de Prácticas. Fundamentos de Programación RP-I.8 RELACIÓN DE PROBLEMAS I. Introducción a C++ Nota. La comilla simple para representar un literal de carácter es la que hay en el teclado del ordenador debajo de la interrogación ?. Esta comilla hay que ponerla en el código pero no en la entrada del carácter desde teclado. Ejemplo de entrada: 7 (cin de un char) −− Salida correcta: 7 (cout de un int) Finalidad: Entender la equivalencia de C++ entre tipos enteros y de carácter. Dificultad Baja. 22. Razone sobre la falsedad o no de las siguientes afirmaciones: a) 'c' es una expresión de caracteres. b) 4 < 3 es una expresión numérica. c) (4 + 3) < 5 es una expresión numérica. d) cout << a; da como salida la escritura en pantalla de una a. e) ¿Qué realiza cin >> cte, siendo cte una constante entera? Finalidad: Distinguir entre expresiones de distinto tipo de dato. Dificultad Baja. 23. Construya un programa que lea desde teclado tres variables correspondientes a un número de horas, minutos y segundos, respectivamente. A continuación, el programa debe calcular las horas, minutos y segundos dentro de su rango correspondiente. Por ejemplo, dadas 312 horas, 119 minutos y 1291 segundos, debería dar como resultado 13 días, 2 horas, 20 minutos y 31 segundos. El programa no calculará meses, años, etc. sino que se quedará en los días. Como consejo, utilice el operador / que cuando trabaja sobre datos enteros, obtiene la división entera. Para calcular el resto de la división entera, use el operador %. Ejemplo de entrada: 312 119 1291 −− Salida correcta: 13 2 20 31 Finalidad: Trabajar con expresiones numéricas y con variables para no repetir cómpu- tos. Dificultad Media. 24. Se quiere generalizar el ejercicio 7 que intercambiaba el valor de dos variables al caso de tres variables. Construya un programa que declare las variables x, y y z, lea su valor desde teclado e intercambien entre sí sus valores de forma que el valor de x pasa a y, el de y pasa a z y el valor de z pasa a x (se pueden declarar variables auxiliares aunque se pide que se use el menor número posible). Ejemplo de entrada: 7 4 5 −− Salida correcta: 5 7 4 Finalidad: Mostrar la importancia en el orden de las asignaciones. Dificultad Media. 25. Construya un programa que lea un carácter (supondremos que el usuario introduce una mayúscula), lo pase a minúscula y lo imprima en pantalla. Hágalo sin usar las funciones toupper ni tolower de la biblioteca cctype. Para ello, debe considerarse la relación que hay en C++ entre los tipos enteros y caracteres. Guión de Prácticas. Fundamentos de Programación RP-I.9 RELACIÓN DE PROBLEMAS I. Introducción a C++ Ejemplo de entrada: D −− Salida correcta: d Finalidad: Entender la equivalencia de C++ entre tipos enteros y de carácter. Dificultad Baja. 26. Dadas las variables count = 0, limit = 10, x = 2, y = 7, calcule el valor de las siguientes expresiones lógicas count == 0 && limit < 20 limit > 20 || count < 5 !(count == 12) count == 1 && x < y !( (count < 10 || x < y) && count >= 0 ) (count > 5 && y == 7) || (count <= 0 && limit == 5*x) !( limit != 10 && x > y ) 27. Escriba una expresión lógica que sea verdadera si una variable de tipo carácter llama- da letra es una letra minúscula y falso en otro caso. Escriba una expresión lógica que sea verdadera si una variable de tipo entero llamada edad es menor de 18 o mayor de 65. Escriba una expresión lógica que sea verdadera si una variable de tipo entero llamada adivine está entre 1 y 100. Escriba una expresión lógica que sea verdadera si un año es bisiesto. Los años bisies- tos son aquellos que o bien son divisibles por 4 pero no por 100, o bien son divisibles por 400. Escriba un programa que lea las variables letra, edad, adivine y anio, calcule el valor de las expresiones lógicas anteriores e imprima el resultado. Debe almacenarse el resultado de las expresiones lógicas en variables de tipo bool. Tenga en cuenta que cuando se imprime por pantalla (con cout) una expresión lógica que es true, se imprime 1. Si es false, se imprime un 0. En el tema 2 veremos la razón. Ejemplo de entrada: a 30 0 2017 −− Salida correcta: 1 0 0 0 Ejemplo de entrada: A 17 30 2000 −− Salida correcta: 0 1 1 1 Finalidad: Empezar a trabajar con expresiones lógicas, muy usadas en el tema 2. Dificultad Baja. 28. Indique si se produce un problema de precisión o de desbordamiento en los siguientes ejemplos y diga cuál sería el resultado final de las operaciones. Nota. Si se desea ver el contenido de una variable real con cout, es necesario que an- tes de hacerlo, se establezca el número de decimales que se quieren mostrar en pan- talla. Para ello, basta ejecutar la sentencia cout.precision(numero_digitos); al inicio del programa. Hay que destacar que al trabajar con reales en coma flotante (double, float, etc) siempre debemos asumir que el valor almacenado es sólo una representación aproximada. Guión de Prácticas. Fundamentos de Programación RP-I.10 RELACIÓN DE PROBLEMAS I. Introducción a C++ dónde D es la distancia que separa los puntos iniciales de partida. Los datos de entrada al programa serán D, V1 y V2. Dificultad Baja. 35. El área A de un triángulo se puede calcular a partir del valor de dos de sus lados, a y b, y del ángulo θ que éstos forman entre sí con la fórmulaA = 1 2 ab sin(θ). Construya un programa que pida al usuario el valor de los dos lados (en centímetros), el ángulo que éstos forman (en grados), y muestre el valor del área. Tened en cuenta que el argumento de la función sin va en radianes por lo que habrá que transformar los grados del ángulo en radianes (recordad que 360 grados son 2Π radianes). Dificultad Baja. 36. Los compiladores utilizan siempre el mismo número de bits para representar un tipo de dato entero (este número puede variar de un compilador a otro). Por ejemplo, 32 bits para un int. Pero, realmente, no se necesitan 32 bits para representar el 6, por ejemplo, ya que bastarían 3 bits: 6 = 1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 ≡ 110 Se pide crear un programa que lea un entero n, y calcule el mínimo número de dígitos que se necesitan para su representación. Para simplificar los cómputos, suponed que sólo queremos representar valores enteros positivos (incluido el cero). Consejo: se necesitará usar el logaritmo en base 2 y obtener la parte entera de un real (se obtiene tras el truncamiento que se produce al asignar un real a un entero) Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-I.13 RELACIÓN DE PROBLEMAS II. Estructuras de Control RELACIÓN DE PROBLEMAS II. Estructuras de Control Ejercicios sobre condicionales 1. Amplie el ejercicio 15 de la relación de problemas I, para que, una vez calculada la media y la desviación, el programa imprima por cada uno de los valores introducidos previamente, si está por encima o por debajo de la media. Por ejemplo: 33 es menor que su media 48 es mayor o igual que su media ..... Nota. Los valores introducidos son enteros, pero la media y la desviación son reales. Finalidad: Plantear un ejemplo básico con varias estructuras condicionales dobles con- secutivas. Dificultad Baja. 2. Se quiere leer un carácter letra_original desde teclado, y comprobar con una estructura condicional si es una letra mayúscula. En dicho caso, hay que calcu- lar la minúscula correspondiente almacenando el resultado en una variable llamada letra_convertida. En el caso de que no sea una mayúscula, le asignaremos a letra_convertida el valor que tenga letra_original. Finalmente, imprimire- mos en pantalla el valor de letra_convertida. No pueden usarse las funciones tolower ni toupper de la biblioteca cctype. Ejemplo de entrada: D −− Salida correcta: d Ejemplo de entrada: d −− Salida correcta: d Ejemplo de entrada: ! −− Salida correcta: ! Finalidad: Plantear una estructura condicional doble con una expresión lógica com- puesta. Dificultad Baja. 3. Realice un programa en C++ que lea dos valores enteros desde teclado y diga si cualquiera de ellos divide o no (de forma entera) al otro. En este problema no hace falta decir quién divide a quién. Supondremos que los valores leídos desde teclado son ambos distintos de cero. Finalidad: Plantear una estructura condicional doble con una expresión lógica com- puesta. Dificultad Baja. 4. Queremos modificar el ejercicio 2 para leer un carácter letra_original desde te- clado y hacer lo siguiente: • Si es una letra mayúscula, almacenaremos en la variable letra_convertida la correspondiente letra minúscula. Guión de Prácticas. Fundamentos de Programación RP-II.1 RELACIÓN DE PROBLEMAS II. Estructuras de Control • Si es una letra minúscula, almacenaremos en la variable letra_convertida la correspondiente letra mayúscula. • Si es un carácter no alfabético, almacenaremos el mismo carácter en la variable letra_convertida El programa debe imprimir en pantalla el valor de letra_convertida e indicar si la letra introducida era una minúscula, mayúscula o no era una carácter alfabético. No pueden usarse las funciones tolower ni toupper de la biblioteca cctype. Finalidad: Plantear una estructura condicional anidada. Dificultad Baja. 5. Queremos gestionar la nómina de los empleados de un centro de atención telefónica. Construya un programa que lea el salario por hora (dato de tipo real) de un empleado, el número de horas trabajadas durante el mes actual (dato de tipo entero) el número de casos resueltos de forma satisfactoria (dato de tipo entero) y el grado medio de satisfacción de los usuarios de los servicios telefónicos con el empleado en cuestión (real entre 0 y 5). Se quiere aplicar una subida salarial en función de varios factores. En ejercicios suce- sivos se irán planteando distintas posibilidades. La primera que se quiere implementar es la siguiente: Se aplicará una subida del 4% a los empleados que han resuelto más de 30 casos. Más de 30 casos resueltos: +4% Imprima el salario final en pantalla. Ejemplo de entrada: 8.5 150 32 5 −− Salida correcta: 1326 Ejemplo de entrada: 7.5 130 24 3 −− Salida correcta: 975 Finalidad: Plantear una estructura condicional de actualización de una variable. Difi- cultad Baja. 6. Recupere la solución del ejercicio 5 sobre el cómputo de la nómina de los trabajadores de un centro de atención telefónica. Implemente ahora el siguiente criterio para la subida salarial. Se aplicará una subida del 4% a los empleados que han resuelto más de 30 casos y una subida del 2% si el grado de satisfacción media de los usuarios es mayor o igual que 4.0. Ambas subidas son compatibles, es decir, si un trabajador cumple las dos condiciones, se le aplicarán ambas subidas. Resuelva este ejercicio considerando que la nueva subida del 2% se realiza sobre el salario inicial y no sobre el resultado de haber aplicado, en su caso, la otra subida del 4%. Más de 30 casos resueltos: +4% Grado de satisfacción >= 4: +2% Guión de Prácticas. Fundamentos de Programación RP-II.2 RELACIÓN DE PROBLEMAS II. Estructuras de Control 14. Modifique la solución del ejercicio 8 (año bisiesto) para que no se mezclen E/S y C (entradas/salidas y cómputos) dentro de la misma estructura condicional. Finalidad: Diseñar programas que separen Entradas/Salidas y cómputos. Dificultad Baja. 15. Modifique la solución al ejercicio 4 para que, dependiendo de cómo era la letra intro- ducida, imprima en pantalla alguno de los siguientes mensajes: • La letra era una mayúscula. Una vez convertida es ... • La letra era una minúscula. Una vez convertida es ... • El carácter no era una letra. Hágalo separando entradas y salidas de los cómputos. Para ello, utilice una variable de tipo enumerado que represente las opciones de que un carácter sea una mayúscula, una minúscula o un carácter no alfabético. Finalidad: Separar E/S y C. Usar el tipo enumerado para detectar cuándo se produce una situación determinada. Dificultad Media. 16. Modifique el ejercicio 7 para que el programa nos diga si los tres valores leídos es- tán ordenados de forma ascendente, ordenados de forma descendente o no están ordenados. Para resolver este problema, debe usar una variable de tipo enumerado. Finalidad: Separar E/S y C. Usar el tipo enumerado para detectar cuándo se produce una situación determinada. Dificultad Baja. 17. Cree un programa que lea los datos fiscales da una persona, reajuste su renta bruta según el criterio que se indica posteriormente e imprima su renta neta final. • La renta bruta es la cantidad de dinero íntegra que el trabajador gana. • La retención fiscal es el tanto por ciento que el gobierno se queda. • La renta neta es la cantidad que le queda al trabajador después de quitarle el porcentaje de retención fiscal, es decir: Renta_neta = Renta_bruta - Renta_bruta * Retención final / 100 Los datos a leer son: • Si la persona es un trabajador autónomo o no • Si es pensionista o no • Estado civil • Renta bruta (total de ingresos obtenidos) • Retención inicial a aplicar. La retención inicial se va a modificar ahora atendiendo al siguiente criterio: Guión de Prácticas. Fundamentos de Programación RP-II.5 RELACIÓN DE PROBLEMAS II. Estructuras de Control • Se baja 3 puntos la retención fiscal a los autónomos, es decir, si la retención inicial era de un 15 %, por ejemplo, la retención final a aplicar será de un 12 % (por lo que la renta neta final será mayor) • Para los no autónomos: – Se sube un punto la retención fiscal a todos los pensionistas, es decir, si la retención inicial era de un 13 %, por ejemplo, la retención final a aplicar será de un 14 % (por lo que la renta neta final será menor) – Al resto de trabajadores (no autónomo y no pensionista) se le aplica a todos una primera subida lineal de dos puntos en la retención inicial. Una vez hecha esta subida, se le aplica (sobre el resultado anterior) las si- guientes subidas adicionales, dependiendo de su estado civil y niveles de ingresos: ◦ Se sube otros dos puntos la retención fiscal si la renta bruta es menor de 20.000 euros ◦ Se sube otros 2.5 puntos la retención fiscal a los casados con renta bruta superior a 20.000 euros ◦ Se sube otros tres puntos la retención fiscal a los solteros con renta bruta superior a 20.000 euros Una vez calculada la retención final, habrá que aplicarla sobre la renta bruta para así obtener la renta final del trabajador. Finalidad: Plantear una estructura condicional anidada. Dificultad Media. 18. Una compañía aérea establece el precio del billete como sigue: en primer lugar se fija una tarifa base de 150 euros, la misma para todos los destinos. Si el destino está a menos de 200 kilómetros, el precio final es la tarifa inicial. Para destinos a más de 200 Km, se suman 10 céntimos por cada kilómetro de distancia al destino (a partir del Km 200). En una campaña de promoción se va a realizar una rebaja lineal de 15 euros a todos los viajes. Además, se pretenden añadir otras rebajas y se barajan las siguientes alternativas de políticas de descuento: a) Una rebaja del 3 % en el precio final, para destinos a más de 600Km. b) Una rebaja del 4 % en el precio final, para destinos a más de 1100Km. En este caso, no se aplica el anterior descuento. c) Una rebaja del 5 % si el comprador es cliente previo de la empresa. Cree un programa para que lea el número de kilómetros al destino y si el billete co- rresponde a un cliente previo de la empresa. Calcular el precio final del billete con las siguientes políticas de descuento: • Aplicando c) de forma adicional a los descuentos a) y b) Guión de Prácticas. Fundamentos de Programación RP-II.6 RELACIÓN DE PROBLEMAS II. Estructuras de Control • Aplicando c) de forma exclusiva con los anteriores, es decir, que si se aplica c), no se aplicaría ni a) ni b) Finalidad: Plantear una estructura condicional anidada. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.7 RELACIÓN DE PROBLEMAS II. Estructuras de Control Finalidad: Ejemplo básico de asignación acumulada. Dificultad Baja. 24. Se pide leer dos enteros min y max que representarán un rango de valores [min,max]. El primer valor a leer, min, debe ser un número positivo y el segun- do valor max, debe ser mayor que min. El programa irá leyendo estos dos valores hasta que el usuario los introduzca correctamente. Una vez leídos ambos valores, el programa pedirá otro entero nuevo obligando a que esté dentro del intervalo [min, max]. Si el usuario introduce más de 3 valores fuera del rango, el bucle terminará y se mostrará en pantalla un mensaje indicando que superó el número de intentos máximo. En caso contrario, es decir, el usuario introduce un valor en el rango pedido, el bucle también terminará y se mostrará en pantalla el resultado de calcular nuevo - min y max - nuevo. Ejemplo de entrada: -5 -6 -7 -1 5 3 4 2 8 7 −− Salida correcta: 2 1 Ejemplo de entrada: -5 -6 -7 -1 5 3 4 2 8 4 9 7 −− Salida correcta: 2 1 Ejemplo de entrada: -5 -6 -7 -1 5 3 4 2 8 4 9 10 −− Salida correcta: Número de intentos sobrepasado Finalidad: Trabajar con bucles con condiciones compuestas en filtros de entrada de datos. Dificultad Media. 25. Se pide leer un carácter desde teclado, obligando al usuario a que sea una letra ma- yúscula. Para ello, habrá que usar una estructura repetitiva do while, de forma que si el usuario introduce un carácter que no sea una letra mayúscula, se le volverá a pedir otro carácter. Calcule la minúscula correspondiente e imprímala en pantalla. No pueden usarse las funciones tolower ni toupperde la biblioteca cctype. Finalidad: Trabajar con bucles con condiciones compuestas. Dificultad Baja. 26. Realice un programa que lea enteros desde teclado y calcule cuántos se han intro- ducido y cual es el mínimo de dichos valores (pueden ser positivos o negativos). Se dejará de leer datos cuando el usuario introduzca el valor 0. Realice la lectura de los enteros dentro de un bucle sobre una única variable llamada dato. Es importante controlar los casos extremos, como por ejemplo, que el primer valor leído fuese ya el terminador de entrada (en este caso, el cero). Finalidad: Destacar la importancia de las inicializaciones antes de entrar al bucle. Ejemplo de lectura anticipada. Dificultad Baja. 27. Amplíe el ejercicio 6 de manera que se permita que los dos instantes puedan perte- necer a dos días distintos, pero eso sí, consecutivos. Filtrar adecuadamente los datos leídos. Finalidad: Trabajar con condicionales complejos y filtros de entradas de datos. Reutili- zar código ya escrito y verificado. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.10 RELACIÓN DE PROBLEMAS II. Estructuras de Control 28. Se quiere construir un programa para leer los datos necesarios del ejercicio 11 de la subida salarial. Supondremos que sólo hay tres empleados y que están identificados con un código (1, 2 y 3). Además, el salario por hora es el mismo para todos los empleados. Éste será el primer valor que se leerá (de tipo double) Después de haber leído este dato, se leerán los datos de los casos atendidos por los empleados en el siguiente orden: en primer lugar, el código del empleado, a continuación el número de segundos que ha durado la atención telefónica, en tercer lugar un 1 si el caso se resolvió de forma satisfactoria y un 0 en caso contrario; finalmente, un valor entero entre 0 y 5 con el grado de satisfacción del usuario. Cuando nos encontremos el terminador -1 como primer dato (código del empleado) se detendrá la introducción de datos. Supondremos que siempre se introduce al me- nos el primer valor (el salario), pudiendo ser ya el siguiente dato leído el terminador. 7.5 <- Salario de 7.5 euros por hora 2 124 1 3 <- Empleado 2, 124'', resuelto, grado sat: 3 1 32 0 0 <- Empleado 1, 32'' , no resuelto, grado sat: 0 2 26 0 2 <- Empleado 2, 26'' , no resuelto, grado sat: 2 -1 <- Fin de entrada de datos El programa debe imprimir el número total de casos introducidos (3 en el ejemplo anterior) y el código del empleado con mayor grado de satisfacción medio (también imprimirá dicho grado medio). En el ejemplo anterior, sería el empleado 2 con un nivel medio de satisfacción de 2.5 (observe que el grado medio se calcula en relación al número total de casos atendidos y no sobre los casos resueltos). Observe que, en este ejercicio, no se están teniendo en cuenta los datos referentes al tiempo de cada caso y si fue resuelto o no, pero hay que leer todos los datos para llegar a los que sí nos interesan. Ejemplo de entrada: 7.5 2 124 1 3 1 32 0 0 2 26 0 2 -1 −− Salida correcta: 3 2 2.5 Ejemplo de entrada: 7.5 -1 −− Salida correcta: No se introdujo ningún caso Finalidad: Plantear un bucle de lectura de datos. Dificultad Baja. 29. Construya un programa que calcule cuándo se produjo la mayor secuencia de días consecutivos con temperaturas crecientes. El programa leerá una secuencia de reales representando temperaturas, hasta llegar al -1 y debe calcular la subsecuencia de números ordenada, de menor a mayor, de mayor longitud. El programa nos debe decir la posición donde comienza la subsecuencia y su longitud. Por ejemplo, ante la entrada siguiente: 17.2 17.3 16.2 16.4 17.1 19.2 18.9 -1.0 Guión de Prácticas. Fundamentos de Programación RP-II.11 RELACIÓN DE PROBLEMAS II. Estructuras de Control el programa nos debe indicar que la mayor subsecuencia empieza en la posición 3 (en el 16.2) y tiene longitud 4 (termina en 19.2) Puede suponer que siempre se introducirá al menos un valor de temperatura. Ejemplo de entrada: 17.2 17.3 16.2 16.4 17.1 19.2 18.9 -1 −− Salida correcta: 3 4 Ejemplo de entrada: 17.2 17.3 16.2 16.4 17.1 19.2 -1 −− Salida correcta: 3 4 Ejemplo de entrada: 17.2 17.3 -1 −− Salida correcta: 1 2 Ejemplo de entrada: 17.2 15.3 -1 −− Salida correcta: 1 1 Ejemplo de entrada: 17.2 -1 −− Salida correcta: 1 1 Finalidad: Trabajar con bucles que comparan un valor actual con otro anterior. Dificul- tad Media. 30. En el ejercicio 13 de la Relación de Problemas I se pedía escribir un programa que leyese un valor entero de tres dígitos e imprimiese los dígitos separados por un espa- cio en blanco. Haga lo mismo pero para un número entero arbitrario. Por ejemplo, si el número es 3519, la salida sería: 3 5 1 9 En este ejercicio se pueden mezclar entradas y salidas con cómputos. Finalidad: Trabajar con bucles que recorren los dígitos de un número. Dificultad Media. 31. El algoritmo de la multiplicación rusa es una forma distinta de calcular la multiplicación de dos números enteros n ∗ m. Para ello este algoritmo va calculando el doble del multiplicador m y la mitad (sin decimales) del multiplicando n hasta que n tome el valor 1 y suma todos aquellos multiplicadores cuyos multiplicandos sean impares. Por ejemplo, para multiplicar 37 y 12 se harían las siguientes iteraciones Iteración Multiplicando Multiplicador 1 37 12 2 18 24 3 9 48 4 4 96 5 2 192 6 1 384 Con lo que el resultado de multiplicar 37 y 12 sería la suma de los multi- plicadores correspondientes a los multiplicandos impares (en negrita), es decir 37*12=12+48+384=444 Cree un programa para leer dos enteros n y m y calcule su producto utilizando este algoritmo. No puede utilizarse en ningún momento el operador producto *. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.12 RELACIÓN DE PROBLEMAS II. Estructuras de Control 37. Un número entero n se dice que es desgarrable (torn) si al dividirlo en dos partes cualesquiera izda y dcha, el cuadrado de la suma de ambas partes es igual a n. Por ejemplo, 88209 es desgarrable ya que (88 + 209)2 = 88209; 81 también lo es ya que 81 = (8+1)2. Cree un programa que lea un entero n e indique si es o no desgarrable. Finalidad: Ejercitar los bucles. Dificultad Baja. 38. Un número entero de n dígitos se dice que es narcisista si se puede obtener como la suma de las potencias n-ésimas de cada uno de sus dígitos. Por ejemplo 153 y 8208 son números narcisistas porque 153 = 13 + 53 + 33 (153 tiene 3 dígitos) y 8208 = 84 + 24 + 04 + 84 (8208 tiene 4 dígitos). Construya un programa que, dado un número entero positivo, nos indique si el número es o no narcisista. Finalidad: Ejercitar los bucles. Dificultad Media. 39. Todo lo que se puede hacer con un bucle while se puede hacer con un do while. Lo mismo ocurre al revés. Sin embargo, cada bucle se usa de forma natural en ciertas situaciones. El no hacerlo, nos obligará a escribir más código y éste será más difícil de entender. Para comprobarlo, haced lo siguiente: a) Modifique la solución del ejercicio 19 de forma que el filtro de entrada usado para leer la variable tope, se haga con un bucle pre-test while. b) Modifique la solución del ejercicio 20 sustituyendo el bucle while por un do while. Observad que debemos considerar el caso en el que el número de años leído fuese cero. Finalidad: Enfatizar la necesidad de saber elegir entre un bucle pre-test o un bucle post-test. Dificultad Media. 40. Calcule mediante un programa en C++ la función potencia xn, y la función factorial n! con n un valor entero y x un valor real. No pueden usarse las funciones de la biblioteca cmath, por lo que tendrá que implementar los cómputos con los bucles necesarios. El factorial de un entero n se define de la forma siguiente: 0! = 1 n! = 1× 2× 3× · · ·n, ∀n ≥ 1 Escriba un programa de prueba que lea un número entero n obligando a que esté en el intervalo [1, 20]. A continuación lea un valor real x y calcule e imprima en pantalla el factorial de n y la potencia de x elevado a n. Finalidad: Trabajar con bucles controlados por contador. Dificultad Baja. 41. Calcule mediante un programa en C++ el combinatorio ( n m ) con n, m valores en- teros. No pueden usarse las funciones de la biblioteca cmath. Guión de Prácticas. Fundamentos de Programación RP-II.15 RELACIÓN DE PROBLEMAS II. Estructuras de Control El combinatorio de n sobre m (con n ≥ m) es un número entero que se define como sigue: ( n m ) = n! m! (n−m)! Finalidad: Trabajar con bucles controlados por contador. Dificultad Media. 42. Escriba un programa que lea cuatro valores de tipo char (min_izda, max_izda, min_dcha, max_dcha) e imprima las parejas que pueden formarse con un elemento del conjunto {min_izda ... max_izda} y otro elemento del conjunto {min_dcha ... max_dcha}. Por ejemplo, si min_izda = b, max_izda = d, min_dcha = j, max_dcha = m, el programa debe imprimir las parejas que pueden formarse con un elemento de {b c d} y otro elemento de {j k l m}, es decir: bj bk bl bm cj ck cl cm dj dk dl dm Finalidad: Ejercitar los bucles anidados. Dificultad Baja. 43. Cree un programa que ofrezca en pantalla la siguiente salida: 1 2 3 4 5 6 2 3 4 5 6 3 4 5 6 4 5 6 5 6 6 Finalidad: Ejercitar los bucles anidados. Dificultad Baja. 44. Cree un programa que ofrezca en pantalla la siguiente salida: 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 4 5 6 7 8 9 5 6 7 8 9 10 6 7 8 9 10 11 Finalidad: Ejercitar los bucles anidados. Dificultad Media. 45. Modifique los dos ejercicios anteriores para que se lea desde teclado el valor inicial y el número de filas a imprimir. En los ejemplos anteriores, el valor inicial era 1 y se imprimían un total de 6 filas. Finalidad: Ejercitar los bucles anidados. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.16 RELACIÓN DE PROBLEMAS II. Estructuras de Control 46. Construya un programa que lea un valor T y calcule la siguiente sumatoria: i=T∑ i=1 i! = i=T∑ i=1 ( j=i∏ j=1 j ) Por ejemplo, para T = 4, la operación a realizar es: 1! + 2! + 3! + 4! es decir: 1 + (1 ∗ 2) + (1 ∗ 2 ∗ 3) + (1 ∗ 2 ∗ 3 ∗ 4) Ejemplo de entrada: 3 −− Salida correcta: 9 Ejemplo de entrada: 4 −− Salida correcta: 33 Ejemplo de entrada: 6 −− Salida correcta: 873 Finalidad: Ejercitar los bucles anidados. Dificultad Media. 47. Resuelva el ejercicio 46 sin utilizar bucles anidados, es decir, debe usar un único bucle. Finalidad: Aprovechar en una iteración los cómputos hechos en la iteración anterior. Dificultad Media. 48. Recupere la solución del ejercicio 10 (función gaussiana) de la relación de problemas I. Se pide crear un menú principal para que el usuario pueda elegir las siguientes opciones: Introducir parámetros de la función (esperanza y desviación) Salir del programa Si el usuario elige la opción de salir, el programa terminará; si elige la opción de intro- ducir los parámetros, el programa leerá los dos parámetros (esperanza y desviación). La media puede ser un valor cualquiera, pero la desviación ha de ser un número posi- tivo. A continuación, el programa presentará un menú con las siguientes opciones: Introducir rango de valores de abscisas Volver al menú anterior (el menú principal) Si el usuario elige volver al menú anterior, el programa debe presentar el primer menú (el de la introducción de los parámetros) Si el usuario elige introducir los valores de abscisas, el programa le pedirá un valor minimo, un valor maximo (ha de ser mayor que minimo) y un incremento y mostrará el valor de la función gaussiana en to- dos los valores de x (la abscisa) entre minimo y maximo a saltos de incremento, es decir, minimo, minimo + incremento, minimo + 2*incremento, · · · , has- ta llegar, como mucho, a maximo. Después de mostrar los valores de la función, el programa volverá al menú de introducción del rango de valores de abscisas. Guión de Prácticas. Fundamentos de Programación RP-II.17 RELACIÓN DE PROBLEMAS II. Estructuras de Control 54. Sobre la solución del ejercicio 20 de esta relación de problemas, se pide lo siguiente. Supondremos que sólo pueden introducirse intereses enteros (1, 2, 3, etc). Se pide calcular el capital obtenido al término de cada año, pero realizando los cálculos para todos los tipos de interés enteros menores o iguales que el introducido (en pasos de 1). Por ejemplo, si el usuario introduce un interés igual a 5 y un número de años igual a 3, hay que mostrar el capital ganado al término de cada uno de los tres años a un interés del 1 %, a continuación, lo mismo para un interés del 2 % y así sucesivamente hasta llegar al 5 %. El programa debe mostrar una salida del tipo: Cálculos realizados al 1%: Dinero obtenido en el año número 1 = 2020 Dinero obtenido en el año número 2 = 2040.2 Dinero obtenido en el año número 3 = 2060.6 Cálculos realizados al 2%: Dinero obtenido en el año número 1 = 2040 Dinero obtenido en el año número 2 = 2080.8 Dinero obtenido en el año número 3 = 2122.42 ....... Finalidad: Empezar a trabajar con bucles anidados. Dificultad Baja. 55. Implemente un programa que sea capaz de “dibujar” rectángulos utilizando un símbolo (un carácter) dado. El usuario ingresará el símbolo simb, la altura M y el ancho N del rectángulo. Por ejemplo, siendo simb =*, M = 3 y N = 5, el dibujo tendría la siguiente forma: ***** ***** ***** Finalidad: Ejercitar los bucles anidados. Dificultad Baja. 56. Implemente un programa que sea capaz de “dibujar” pinos utilizando asteriscos “*”. El usuario ingresara el ancho de la base del pino (podemos asumir que es un número impar). Supongamos que se ingresa 7, entonces el dibujo tendrá la siguiente forma: * *** ***** ******* Guión de Prácticas. Fundamentos de Programación RP-II.20 RELACIÓN DE PROBLEMAS II. Estructuras de Control *** *** Finalidad: Ejercitar los bucles anidados. Dificultad Media. 57. Se dice que un número natural es feliz si cumple que si sumamos los cuadrados de sus dígitos y seguimos el proceso con los resultados obtenidos, finalmente obtenemos uno (1) como resultado. Por ejemplo, el número 203 es un número feliz ya que 22 + 02 + 32 = 13→ 12 + 32 = 10→ 12 + 02 = 1. Se dice que un número es feliz de grado k si se ha podido demostrar que es feliz en un máximo de k iteraciones. Se entiende que una iteración se produce cada vez que se elevan al cuadrado los dígitos del valor actual y se suman. En el ejemplo anterior, 203 es un número feliz de grado 3 (además, es feliz de cualquier grado mayor o igual que 3) Escribir un programa que diga si un número natural n es feliz para un grado k dado de antemano. Tanto n como k son valores introducidos por el usuario. Finalidad: Ejercitar los bucles anidados. Dificultad Media. 58. Realizar un programa para calcular los valores de la función: f(x) = √ 3x+ x2 1− x2 para valores de x enteros en el rango [-3..3]. Dificultad Baja. 59. Realizar un programa para calcular los valores de la función: f(x, y) = √ x y2 − 1 para los valores de (x, y) con x = −50,−48, . . . , 48, 50 y = −40,−39, . . . , 39, 40, es decir queremos mostrar en pantalla los valores de la función en los puntos (−50, 40), (−50,−39), · · · (−50, 40), (−48, 40), (−48,−39), · · · (50, 40) Dificultad Baja. 60. Diseñar un programa que presente una tabla de grados C a grados Fahrenheit ( F=9/5C+32) desde los 0 grados a los 300, con incremento de 20 en 20 grados. Dificultad Baja. Guión de Prácticas. Fundamentos de Programación RP-II.21 RELACIÓN DE PROBLEMAS II. Estructuras de Control 61. Diseñar un programa que lea caracteres desde la entrada y los muestre en pantalla, hasta que se pulsa el '.' y diga cuántos separadores se han leído (espacios en blanco ' ', tabuladores '\t' y caracteres de nueva línea '\n'). Dificultad Baja. 62. Realizar un programa para calcular la suma de los términos de la serie 1− 1/2 + 1/4− 1/6 + 1/8− 1/10 + ...− 1/(2n− 1) + 1/(2n) para un valor n dado. Dificultad Baja. 63. Se decide informatizar el acta de un partido de baloncesto para saber qué equipo es el ganador del partido. El acta contiene una serie de anotaciones formadas por una pareja de números cada una, con el dorsal del jugador y el número de puntos conseguidos teniendo en cuenta que la última anotación es un valor -1. Por ejemplo 1 2 4 1 4 1 2 3 6 2 3 2 5 2 5 1 1 3 -1 El programa deberá indicar si ha ganado el equipo 1 (con los dorsales 1, 2 y 3) o el equipo 2 (dorsales 4, 5 y 6) o han empatado. Por ejemplo, con la entrada anterior, gana el equipo 1. Dificultad Baja. 64. La Unión Europea ha decidido premiar al país que más toneladas de hortalizas exporte a lo largo del año. Se dispone de un registro de transacciones comerciales en el que aparecen tres valores en cada apunte. El primer valor es el indicativo del país (E: España, F: Francia y A: Alemania), el segundo valor es un indicativo de la hortaliza que se ha vendido en una transacción (T: Tomate, P: Patata, E: Espinaca) y el tercer valor indica las toneladas que se han vendido en esa transacción. Diseñar un programa que lea desde el teclado este registro, el cual termina siempre al leer un país con indicativo ’@’, y que diga qué país es el que más hortalizas exporta y las toneladas que exporta. Por ejemplo, con la entrada E T 10 E T 4 E P 1 E P 1 E E 2 F T 15 F T 6 F P 20 A E 40 @ el país que más vende es Francia con un total de 41 toneladas. Dificultad Baja. 65. Se pide leer dos enteros sabiendo que el primero no tiene un tamaño fijo y que el segundo siempre es un entero de dos dígitos. Se pide comprobar si el segundo está contenido en el primero. Entendemos que está contenido si los dos dígitos del segun- do entero están en el primer entero de forma consecutiva y en el mismo orden. Por ejemplo, 89 está contenido en 7890, en 7789 y en 8977 pero no en 7980. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.22 RELACIÓN DE PROBLEMAS II. Estructuras de Control La sucesión de valores así calculada proporciona, alternativamente, valores superio- res e inferiores a φ, siendo cada vez más cercanos a éste, y por lo tanto la diferencia entre an y φ es cada vez más pequeña conforme n se hace mayor. Escribir un programa que calcule el menor valor de n que hace que la aproximación dada por an difiera en menos de δ del número φ, sabiendo que n ≥ 1. La entrada del programa será el valor de δ y la salida el valor de n. Por ejemplo, para un valor de δ = 0,1 el valor de salida es n = 4 Dificultad Media. 73. Una sucesión alícuota es una sucesión iterativa en la que cada término es la suma de los divisores propios del término anterior. La sucesión alícuota que comienza con el entero positivo k puede ser definida formalmente mediante la función divisor σ1 de la siguiente manera: s0 = k sn = σ1(sn−1)− sn−1 Por ejemplo, la sucesión alícuota de 10 es 10, 8, 7, 1, 0 porque: σ1(10)− 10 = 5 + 2 + 1 = 8 σ1(8)− 8 = 4 + 2 + 1 = 7 σ1(7)− 7 = 1 σ1(1)− 1 = 0 Aunque muchas sucesiones alícuotas terminan en cero, otras pueden no terminar y producir una sucesión alícuota períodica de período 1, 2 o más. Está demostrado que si en una sucesión alícuota aparece un número perfecto (como el 6) se produce una sucesión infinita de período 1. Un número amigable produce una sucesión infinita de período 2 (como el 220 ó 284). Escribir un programa que lea un número natural menor que 1000 y muestre su su- cesión alícuota. Hay que tener en cuenta que en ocasiones se pueden producir su- cesiones infinitas, por lo que en estos casos habrá que detectarlas e imprimir puntos suspensivos cuando el período se repita. Solo hay que considerar períodos infinitos de longitud 2 como máximo. Por ejemplo; para el número 6, se imprimiría: 6, 6, . . .; y para el número 220, se imprimiría: 220, 284, 220, 284, . . .. Finalidad: Practicar los bucles anidados y controlar las condiciones de parada a partir de lo sucedido en iteracione pasadas.. Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-II.25 RELACIÓN DE PROBLEMAS III. Funciones y Clases RELACIÓN DE PROBLEMAS III. Funciones y Clases Problemas sobre funciones 1. Encuentre los errores de las siguientes funciones: int ValorAbsoluto (int entero) { if (entero < 0) entero = -entero; else return entero; } void Imprime(double valor) { double valor; cout << valor; } void Cuadrado (int entero) { return entero*entero; } bool EsPositivo(int valor) { if (valor > 0) return true; } Finalidad: Familiarizarnos con la definición de funciones, el paso de parámetros y el ámbito de las variables. Dificultad Baja. 2. Reescriba la solución del ejercicio 40 (factorial y potencia) de la Relación de Proble- mas II, modularizándola con funciones. Para el factorial, use la función Factorial vista en las transparencias de clase. Para el cómputo de la potencia, defina la función Potencia. Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 3. En las transparencias de clase se ha visto la función Max3 que calculaba el máximo de tres valores enteros. Defina ahora la función Max que calcule el máximo de dos valores enteros y cambie la implementación de Max3 para que llame a la función Max. Construya un programa principal que llame a Max3 con tres valores leídos desde teclado. Finalidad: Familiarizarnos con las llamadas entre funciones. Dificultad Baja. 4. En el ejercicio 24 de la Relación de Problemas II, se pedía leer un número en un rango. Defina una función LeeIntRango para este propósito. Para ello, dicha función debe ir leyendo números enteros (de tipo int) desde la entrada por defecto, hasta que se Guión de Prácticas. Fundamentos de Programación RP-III.1 RELACIÓN DE PROBLEMAS III. Funciones y Clases lea un valor correcto que pertenezca al rango [min, max] (no hay ningún límite en el número de intentos). La función devolverá dicho valor. Escriba un pequeño programa de prueba que lea dos números cualesquiera min y max. Supondremos que el valor introducido de max es correcto, es decir, que será mayor o igual que min. A continuación lea 3 valores en dicho rango y finalmente calcule la suma de dichos valores. Ejemplo de entrada: 3 6 -1 2 3 7 2 1 4 4 −− Salida correcta: 11 Ejemplo de entrada: 3 6 3 4 4 −− Salida correcta: 11 Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 5. Recupere la solución del ejercicio 4. Defina ahora una función LeeIntMayorIgualQue para leer un entero mayor o igual que un número da- do (éste será un parámetro a la función). Para ello, dicha función debe ir leyendo números enteros (de tipo int) desde la entrada por defecto, hasta que se lea un valor correcto que sea mayor o igual que el número especificado. La función devolverá dicho valor. Utilice esta función para leer el valor de max del ejercicio 4, obligando a que sea mayor que min. Ejemplo de entrada: 3 2 1 6 -1 2 3 7 2 1 4 4 −− Salida correcta: 11 Ejemplo de entrada: 3 6 3 4 4 −− Salida correcta: 11 Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 6. Reescriba la solución del ejercicio 46 que calcula la suma de los primeros T facto- riales. Para ello, debe leer el valor T usando la función LeeIntRango del ejercicio 4 para obligar a que esté en el intervalo [1,20]. Debe definir la función SumaFactoriales que calcule la suma pedida. Implemente dos versiones de esta función: • En una primera versión, la función SumaFactoriales debe llamar a la función Factorial, para realizar la suma tal y como se indica en el ejercicio 46 • En una segunda versión, la función SumaFactoriales debe realizar la suma de forma directa tal y como se indica en el ejercicio 47. Ponga dentro de un comentario la primera versión. Finalidad: Familiarizarnos con la llamada entre funciones. Dificultad Baja. Guión de Prácticas. Fundamentos de Programación RP-III.2 RELACIÓN DE PROBLEMAS III. Funciones y Clases 85 -> Limite 2 del parking 2 110 -> Limite 3 del parking 2 660 -> Limite 4 del parking 2 0.0402 -> Tarifa Tramo 1 del parking 2 0.0375 -> Tarifa Tramo 2 del parking 2 0.0319 -> Tarifa Tramo 3 del parking 2 0.0315 -> Tarifa Tramo 4 del parking 2 32 -> Tarifa día completo del parking 2 2 1 30 -> Entra a las 2 de la madrugada, 1 minuto, 30 segundos 4 2 50 -> Sale a las 4 de la madrugada, 2 minutos y 50 segundos 2 2 5 -> Entra a las 2 de la madrugada, 2 minutos, 5 segundos 4 3 7 -> Sale a las 4 de la madrugada, 3 minutos, 7 segundos -1 -> Fin de la entrada de datos. Ejemplo de entrada: 30 90 120 660 0.0412 0.0370 0.0311 0.0305 31.55 35 85 110 660 0.0402 0.0375 0.0319 0.0315 32 2 1 30 4 2 50 2 1 30 3 41 31 2 1 30 5 41 31 2 1 30 23 1 1 -1 −− Salida correcta: 4.4195 4.4262 3.767 3.7605 7.439 7.5445 31.55 32 47.1755 47.731 Finalidad: Diseño de una función. Dificultad Media. 10. Retome la solución del ejercicio 23 (población) de la Relación de Problemas II. Re- escríbalo usando las funciones LeeIntRango del ejercicio 4 para leer los valores de las tasas y LeeIntMayorIgualQue del ejercicio 5 para leer el número de años que sea positivo. Defina también sendas funciones para calcular los dos valores que se piden en el ejercicio, a saber, el número de habitantes después de tres años y el número de años que pasarán hasta doblar la población inicial. Intente diseñar las funciones para que sean lo más generales posible. Ejemplo de entrada: 1375570814 2000 32 2000 2000 12 7 -4 -4 3 Guión de Prácticas. Fundamentos de Programación RP-III.5 RELACIÓN DE PROBLEMAS III. Funciones y Clases −− Salida correcta: 1490027497 27 2824131580 Finalidad: Diseño de una función. Dificultad Baja. 11. Retome la solución de los ejercicios 11 y 28 (servicio atención telefónica) de la Rela- ción de Problemas II. Recordemos que el criterio de subida salarial era el siguiente: Entre 20 y 30 casos resueltos: +3% Más de 30 casos resueltos: +4% Grado de satisfacción >= 4: +2% Defina una función SalarioFinal que calcule el salario final del trabajador, en fun- ción de los datos anteriores. Al igual que se pedía en el ejercicio 28 debe ir leyendo los datos de tres empleados en el siguiente orden: 7.5 <- Salario de 7.5 euros por hora (el mismo para todos) 2 124 1 3 <- Empleado 2, 124'', resuelto, grado sat: 3 1 32 0 0 <- Empleado 1, 32'' , no resuelto, grado sat: 0 2 26 0 2 <- Empleado 2, 26'' , no resuelto, grado sat: 2 -1 <- Fin de entrada de datos El número de horas trabajadas de cada empleado será un número real y se calculará en función de la suma total de segundos dedicados a cada llamada telefónica (la com- pañía no paga por el tiempo de estancia en la empresa sino por el tiempo dedicado a resolver casos) El programa debe llamar a la función SalarioFinal para calcular el salario final de cada uno de los tres empleados y los debe mostrar en pantalla. Puede utilizar el fichero de datos datos_atencion_telefonica.txt disponible en decsai. La salida correcta para este fichero es 1016.196 118.287 128.893 Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Media. 12. Retome la solución del ejercicio 11 de esta Relación de Problemas. Modifíquela para tener en cuenta que los límites correspondientes a los casos resueltos (20 y 30) y el grado de satisfacción media (4), así como los porcentajes de incrementos correspon- dientes (3%, 4% y 2%) ya no son constantes sino que pueden variar. Por lo tanto, debe leer desde teclado dichos valores límites (justo después del salario por hora y en el orden indicado anteriormente) y cambiar la función definida en el ejercicio 11 para que tenga en cuenta este cambio. Puede utilizar el fichero de datos Guión de Prácticas. Fundamentos de Programación RP-III.6 RELACIÓN DE PROBLEMAS III. Funciones y Clases datos_atencion_telefonica_limites_variables.txt disponible en decsai. La salida correcta para este fichero es 1016.196 118.287 128.893 Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 13. Implemente la solución del ejercicio 38 (Narcisista) de la relación de problemas II, usando funciones. Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 14. Escriba una función en C++ LeeOpcion2Alternativas que imprima en pantalla un mensaje, lea una opción como un carácter y sólo permita aceptar los caracteres 'S' o 'N' (mayúscula o minúscula). ¿Qué debería devolver la función? ¿El carácter leído o un bool?. Aplique esta función en la solución del ejercicio 17 (Renta bruta y neta) de la relación de problemas II, para leer si una persona es pensionista o si es autónomo. Finalidad: Familiarizarnos con la definición de funciones y el paso de parámetros. Dificultad Baja. 15. A un trabajador le pagan según sus horas trabajadas y la tarifa está a un valor por hora. Si la cantidad de horas trabajadas es mayor de 40 horas, la tarifa por hora se incrementa en un 50 % para las horas extras (las que haya por encima de 40). Cons- truir una función que dado el número total de horas trabajadas y el precio por hora, devuelva el salario del trabajador. Finalidad: Familiarizarnos con la definición de funciones y paso de parámetros. Difi- cultad Baja. 16. Cree las siguientes funciones relacionadas con la progresión geométrica que se vio en el ejercicio 51 de la relación de problemas II. Analice cuáles deben ser los parámetros a estas funciones. a) Una función SumaHasta que calcule la suma de los primeros k valores de una progresión geométrica. Para implementarla, use el mismo algoritmo (con un bucle for) que se vio como solución del ejercicio 51 de la relación de problemas II. b) Una función ProductoHasta para que multiplique los k primeros elementos de la progresión, aplicando la siguiente fórmula: i=k∏ i=1 ai = √ (a1ak)k Guión de Prácticas. Fundamentos de Programación RP-III.7 RELACIÓN DE PROBLEMAS III. Funciones y Clases es necesaria declararla como constante local en ambas funciones. Para no repetir este código, ¿qué podemos hacer? Implemente la solución adoptada. d) CambiaMayusculaMinuscula, a la que se le pase como parámetro un char y haga lo siguiente: • si el argumento es una letra en mayúscula, devuelve su correspondiente letra en minúscula, • si el argumento es una letra en minúscula, devuelve su correspondiente letra en mayúscula, • si el argumento no es ni una letra mayúscula, ni una letra mayúscula, devuel- ve el carácter pasado como argumento. Finalidad: Entender cómo se llaman las funciones entre sí. Dificultad Media. 20. Examen Septiembre 2014. Dos números amigos son dos números naturales a y b, tales que la suma de los divisores propios de a más uno es igual a b, y viceversa. Un ejemplo de números amigos es el par de naturales (220; 284), ya que: • Los divisores propios de 220 son 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 283, y 283 + 1 = 284. • Los divisores propios de 284 son 2, 4, 71 y 142, que suman 219, y 219 + 1 = 220. Realice un programa que implemente estas dos tareas: a) En primer lugar debe leer dos números naturales e indicar si son o no amigos. b) A continuación leerá otro número natural, n, e informará si existe algún número amigo de n en el intervalo centrado en n y de radio 3. Utilice las funciones que estime oportuno. Finalidad: Descomponer la solución de un problema en varias funciones. Dificultad Media. 21. Defina una función para implementar la solución del ejercicio 53 de la relación de problemas II (Serie) Dificultad Media. 22. Defina una función para implementar la solución del ejercicio 57 de la relación de problemas II (número feliz) Dificultad Media. Guión de Prácticas. Fundamentos de Programación RP-III.10 RELACIÓN DE PROBLEMAS III. Funciones y Clases Problemas sobre clases 23. En este ejercicio se plantean varias modificaciones. Debe entregar un fichero cpp por cada uno de los apartados. Se desea implementar una clase Recta para representar una recta en el plano. Una recta viene determinada por tres coeficientes A, B, C, de forma que todos los puntos (x,y) que pertenecen a la recta verifican lo siguiente (ecuación general de la recta): Ax + By + C = 0 a) Definición de la clase y creación de objetos Defina la clase Recta. En este apartado utilice únicamente datos miembro públi- cos. Cree un programa principal que haga lo siguiente: • Defina dos objetos de la clase Recta. • Lea seis reales desde teclado. • Le asigne los tres primeros a los coeficientes de una recta y los otros tres a la segunda recta. • Calcule e imprima la pendiente de cada recta aplicando la fórmula: pendiente = - A / B b) Métodos públicos En vez de calcular la pendiente en el programa principal, vamos a ponerlo como un método de la clase y así lo reutilizaremos todas las veces que necesitemos. Añada un método para el cálculo de la pendiente y modifique el main para tener en cuenta este cambio. ¿Añadimos pendiente como dato miembro de la recta? La respuesta es que no ¿Por qué? Añada también los siguiente métodos: • Obtener la ordenada (y) dado un valor de abscisa x, aplicando la fórmula: (-C -xA) / B • Obtener la abscisa (x) dado un valor de ordenada y, aplicando la fórmula: (-C -yB) / A En la función main lea un valor de abscisa e imprima la ordenada según la recta. A continuación lea un valor de ordenada e imprima la abscisa que le corresponde. Hágalo sólo con la primera recta. c) Datos miembro privados Cambie ahora los datos miembro públicos y póngalos privados. Tendrá que añadir métodos para asignar y ver los valores de los datos miembro. Añada métodos Guión de Prácticas. Fundamentos de Programación RP-III.11 RELACIÓN DE PROBLEMAS III. Funciones y Clases para asignar un valor a cada uno de los tres datos miembro. Modifique el main para tener en cuenta estos cambios. A partir de ahora, todos los ejercicios deben resolverse utilizando únicamente datos miembro privados. d) Política de acceso a los datos miembros En vez de usar un método para asignar un valor a cada dato miembro, defina un único método SetCoeficientes para asignar los tres a la misma vez. Observe que los métodos permiten definir la política de acceso a los datos miem- bro. Si tengo previsto cambiar por separado los coeficientes de la recta, usaré métodos de asignación individuales. En caso contrario, usaré un único método que modifique a la misma vez todos los datos miembro. Incluso pueden dejarse en la clase ambos tipos de métodos para que así el cliente de la clase pueda usar los que estime oportunos en cada momento. Por ahora, mantenga únicamente el método de asignación en bloque SetCoeficientes. e) Constructor Modifique el programa principal del último apartado e imprima los valores de los datos miembros de una recta, antes de asignarles los coeficientes. Mostrará, ob- viamente, un valor indeterminado. Para evitar este problema, añada un construc- tor a la recta para que el objeto esté en un estado válido en el mismo momento de su definición. El constructor deberá tener como parámetros, obligatoriamente, los tres coeficientes de la recta. Tendrá que modificar convenientemente el main para tener en cuenta este cambio. f ) Política de acceso a los datos miembro Suprima ahora el método SetCoeficientes. De esta forma, una vez creado el objeto (pasándole los datos apropiados en el constructor) ya no podremos modificar los datos miembro. Esto es útil en aquellas situaciones en las que no queremos permitir que el estado del objeto cambie, una vez se ha creado. g) Métodos privados Vuelva a recuperar el método SetCoeficientes. Añada un método privado que nos indique si los coeficientes son correctos, es decir, A y B no pueden ser simultáneamente nulos. Llame a este método donde sea necesario. Finalidad: Familiarizarnos con la definición de clases. Dificultad Baja. 24. Considere la siguiente definición de la clase Cronometro: #include <chrono> class Cronometro{ private: Guión de Prácticas. Fundamentos de Programación RP-III.12 RELACIÓN DE PROBLEMAS III. Funciones y Clases Utilice dicha clase para crear un conjunto de datos de prueba para el ejercicio 11 de esta relación de problemas (centro de atención telefónica) Genere un total de 1000 casos, con un código de empleado entre 1 y 3, un número de segundos de atención entre 40 y 300, un código 0 o 1 de caso resuelto y un grado de satisfacción del cliente entre 0 y 5. Nota: Realmente, los números generados son pseudoaleatorios (puede consultar In- ternet para tener una idea de este concepto) En este ejemplo se han generado según una distribución uniforme pero se pueden generar números con las probabilidades da- das por muchas otras distribuciones -disponibles en la biblioteca random de C++11-. Finalidad: Enfatizar la importancia de la ocultación de información y de la interfaz pública de una clase. Dificultad Baja. 26. Defina la clase CalculadoraNotaFebrero para calcular la nota en la convocatoria ordinaria de Febrero de un alumno en la asignatura de Fundamentos de Programa- ción. Para ello, debe considerar lo siguiente: • Cada alumno es calificado con 4 notas (especificadas de 0 a 10): evaluación continua, dos exámenes prácticos y un examen escrito. Por defecto, la pondera- ción de cada parte en el cómputo de la nota final es 10 %, 10 %, 20 % y 60 % respectivamente. Estos porcentajes son los mismos para todos los grupos. En cualquier caso, se quiere contemplar la posibilidad de manejar otros distintos. • El profesor de cada grupo, tiene la posibilidad, si así lo desea, de subir la nota del examen escrito un máximo de 0,5 puntos. Esta subida sólo se aplica a aquellos alumnos para los que, después de aplicarla, obtienen una nota mayor o igual que 5. • Para poder aprobar la asignatura, es preciso haber sacado al menos un 4 en la nota del examen escrito. Este límite (4), al igual que los porcentajes del primer apartado, es el mismo para todos los grupos y se aplica antes de la subida de nota especificada en el apartado anterior. Si el alumno no supera la nota mínima de 4 en el examen escrito, la nota final será la nota del examen escrito. Construya un programa principal que lea los datos en el siguiente orden y calcule la nota final de cada alumno. No hay límite en el número de grupos que se van a introducir. 0.1 0.1 0.2 0.6 -> Las ponderaciones de las 4 partes Común a todos los grupos Siempre se introducirán al menos estos 4 datos 0.5 -> Subida lineal del grupo 1 Guión de Prácticas. Fundamentos de Programación RP-III.15 RELACIÓN DE PROBLEMAS III. Funciones y Clases 2.5 3.5 7.5 4.4 -> Notas del alumno 1 del grupo 1 6.4 9.5 8.5 7.2 -> Notas del alumno 2 del grupo 1 ...... -1 -> Fin de datos del grupo 1 0.3 -> Subida lineal del grupo 2 3.5 6.4 5.5 6.4 -> Notas del alumno 1 del grupo 2 1.4 2.5 3.4 1.3 -> Notas del alumno 2 del grupo 2 ...... -1 -> Fin de datos del grupo 2 -1 -> Fin de datos En decsai se encuentra un fichero de prueba para este ejercicio, así como un fichero con las notas finales correspondientes. Ejemplo de entrada: 0.1 0.1 0.2 0.6 0.5 7 7 7 3.9 5 5 5 4.4 5 5 5 4.5 -1 0.4 7 7 7 3.9 5 5 5 4.4 5 5 5 4.5 5 5 5 5 -1 -1 −− Salida correcta: 3.9 4.6 5 3.9 4.6 4.7 5.2 Finalidad: Diseño de una clase. Dificultad Media. 27. Recupere la solución del ejercicio 8 de esta relación de problemas sobre la función gaussiana. En vez de trabajar con funciones, plantee la solución con una clase. Debe diseñar la clase teniendo en cuenta que la función matemática gaussiana viene deter- minada unívocamente por el valor de la esperanza y la desviación, es decir, son estos dos parámetros lo que distinguen a una función gaussiana de otra. Finalidad: Diseño de una clase. Dificultad Baja. 28. Recupere la solución del ejercicio 10 de esta relación de problemas (población con funciones). Re-escríbalo para que los cómputos relacionados con la población estén encapsulados en una clase. La lectura de los valores en los rangos adecuados se hará Guión de Prácticas. Fundamentos de Programación RP-III.16 RELACIÓN DE PROBLEMAS III. Funciones y Clases con las mismas funciones que ya se definieron en ese ejercicio. Modifique apropiada- mente el programa principal. Finalidad: Diseño de una clase. Dificultad Baja. 29. Recupere la solución del ejercicio 9 de esta relación de problemas (parking con funciones). Re-escríbalo para que los cómputos relacionados con el cálculo de la tarifa, estén encapsulados en una clase. Mantenga la definición de la función MinutosEntreInstantes tal y como está. Modifique apropiadamente el programa principal. Finalidad: Diseño de una clase. Dificultad Media. 30. En el ejercicio 16 de esta relación de problemas se definieron varias funciones para operar sobre una progresión geométrica. Definid ahora una clase para representar una progresión geométrica. a) Diseñad la clase pensando cuáles serían los datos miembro esenciales que defi- nen una progresión geométrica, así como el constructor de la clase. b) Definir un método Termino que devuelva el término k-ésimo. c) Definid los métodos SumaHastaInfinito, SumaHasta, MultiplicaHasta. d) Cread un programa principal que lea los datos miembro de una progresión, cree el objeto correspondiente y a continuación lea un entero tope e imprima los tope primeros términos de la progresión, así como la suma hasta tope de dichos términos. Finalidad: Comparar la ventaja de un diseño con clases a uno con funciones. Dificultad Baja. 31. Se quiere construir una clase DepositoSimulacion para simular préstamos, ofre- ciendo la funcionalidad descrita en los ejercicios 20 (reinvierte capital e interés un número de años) y 21 (reinvierte capital e interés hasta obtener el doble de la can- tidad inicial) de la relación de problemas II (página RP-II.8). Por tanto, la clase debe proporcionar, para un capital y unos intereses dados, métodos para: a) Calcular el capital que se obtendrá al cabo de un número de años, b) Calcular el número de años que deben pasar hasta obtener el doble de la canti- dad inicial. A la hora de diseñar la clase, tendremos que analizar cuestiones como: • ¿Cuáles son sus datos miembro? Parece claro que el capital y el interés sí lo serán ya que cualquier operación que se nos ocurra hacer con un objeto de la clase DepositoSimulacion involucra a ambas cantidades. ¿Pero y el número de años? Guión de Prácticas. Fundamentos de Programación RP-III.17
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved