Download RELACIÓN DE EJERCICIOS Tema 5: Subprogramas (Funciones)
Document related concepts
no text concepts found
Transcript
FUNDAMENTOS DE INFORMÁTICA Dpto. Lenguajes y Ciencias de la Computación UNIVERSIDAD DE MÁLAGA Escuela Politécnica Superior RELACIÓN DE EJERCICIOS Tema 5: Subprogramas (Funciones) NOTAS Como ejercicios de este tema puede programar los ejercicios de temas anteriores pero utilizando funciones. Al realizar las funciones intente que sean lo más generales posible, de tal modo que sirvan en cualquier sitio desde donde se las llame. Esto se puede conseguir teniendo en cuenta lo siguiente: Dentro de la función no se deben, en general, leer ni escribir valores. Los valores que se necesitan pueden venir por distintas vías (no sólo la lectura) y los valores de salida pueden ser usados de distintas formas (no sólo para escribirlos por pantalla). Defina bien los parámetros de entrada y salida dejando bien claro lo que necesita y devuelve la función. No use variables globales. Ponga un comentario justo antes de cada función que indique como mínimo qué es lo que hace esa función. NIVEL BÁSICO 1. Considera la siguiente función: void escr(char ch,int longitud) { while (longitud > 0) { cout<<ch; longitud --; } } a. Si ch tiene el valor 'X' y numero el valor 5, .cuál sería el efecto de ejecutar cada una de las siguientes llamadas a la función: escr(ch,4*numero-12) escr(ch,6) escr(5,numero) escr('/',numero) escr('.',6) escr('p',-10) b. 2. Escribe llamadas a la función escr para que cuando se ejecuten produzcan las siguientes salidas: 1) 35 guiones sucesivos; 2) 6 veces tantos espacios en blanco como el valor de número; 3) el valor actual de ch 14 veces. Sigue la ejecución del siguiente programa y averigua lo que saldría por la pantalla. Después, compila el programa y ejecútalo en un ordenador para comprobar los resultados que has obtenido: 3. /* Programa de Prueba de los pasos de parámetros */ #include <iostream> Fundamentos de Informática Tema 5: subprogramas /* Subprograma con pasos de parámetros por valor y por referencia */ void dos(int x,int y,int& z) { z = x + y + z; cout<<x<<y<<z<<endl; } int main() { int a,b,c; a = 5; b = 8; c = 3; dos(a,b,c); dos(7, a+b+c, a); dos(a*b, a/b, c); cout<<c; return 0; } 4. Supongamos las siguientes declaraciones de un programa principal: float x,y; int m; char c; Y sea un subalgoritmo con el siguiente prototipo: void Prueba(int a, int b, float & c, float & d, char & e); ¿Cuáles de las siguientes llamadas desde el programa principal son incorrectas y cuál es la razón? Prueba(m+3,10,x,y,c); Prueba(30,10,m,x,c); Prueba(m,19,x,y); Prueba(m,m*m,y,x,c); Prueba(35,m*10,x,c,y); Prueba(m,10,35.0,y,'E'); Prueba(m,3.5,x,y,c); Prueba(30,10,x,x+y,c); Prueba(30,10,c,d,e); 5. Dadas las siguientes declaraciones en un determinado algoritmo: // -- Prototipos ---bool uno (unsigned x, unsigned y); void dos (unsigned& x, unsigned y); unsigned tres (unsigned x); // -- Principal -------int main () { unsigned a, b, c; bool fin; } ¿Cuáles de las siguientes llamadas a subprogramas en el cuerpo del programa principal son válidas? a. if (uno(a,b))/*...*/ b. dos(a, b + 3); c. fin = uno(c, 5); d. fin = dos(c, 5); e. dos(a,tres(a)); f. dos(tres(b),c); g. if (tres(a))/*...*/ h. b = tres(dos(a,5)); i. dos(4, c); 6. Escriba los prototipos de las siguientes funciones: a. Una función que devuelva la fracción de cualquier número introducido como parámetro. Por ejemplo, si se introduce el número 256.879, debe devolver el número 0.879. ¿.Cómo devuelve la función el valor (con return o usando un parámetro por referencia)? b. Una función llamada entero() que devuelva la parte entera de cualquier número que se transmita a la función. ¿Cómo devuelve la función el valor? c. Una función que acepte un número como parámetro y devuelva la parte entera de dicho número y también su parte fraccionaria. ¿Cómo devuelve la función los valores? d. Suponga que en un programa de prueba, la función main() declara las siguientes variables: float numero, f, e; Escriba posibles llamadas a cada una de las funciones anteriores. Dpto. Lenguajes y Ciencias de la Computación Escuela Politécnica Superior 2/8 Fundamentos de Informática Tema 5: subprogramas 7. Escriba una función llamada TrianguloRectangulo() que acepte la longitud de dos lados de un triángulo rectángulo como argumentos. La función debe calcular y devolver la hipotenusa del triángulo. Incluya la función escrita en un programa que funcione. La función main() debe llamar correctamente a la función y mostrar el valor que devuelve la función. 8. Escriba las siguientes funciones: a. El volumen, v, de un cilindro está dado por la siguiente fórmula: donde r es el radio del cilindro y l es la altura. Utilizando esta fórmula escriba una función llamada VolumenCilindro() que acepte como argumentos de entrada el radio y la altura de un cilindro y devuelva el volumen. Use esta función en un programa de prueba. b. La superficie, s, de un cilindro está dada por la siguiente fórmula: + donde r es el radio del cilindro y l es la altura (se supone el cilindro con sus 2 tapaderas). Utilizando esta fórmula escriba una función llamada AreaCilindro() que acepte como argumentos de entrada el radio y la altura de un cilindro y que devuelva la superficie. Añada esta función al programa anterior y modifique la función principal para probar también esta función. c. Realice una única función que acepte como argumentos de entrada el radio y la altura de un cilindro y devuelva su volumen y su superficie con las fórmulas de los ejercicios anteriores. Puede probar esta función en el mismo programa anterior, o bien, crear otro distinto, ya que esta nueva función sustituye a las dos anteriores. 9. Diseñar una función lógica que nos diga si un número es impar. 10. Escribir una función de tipo lógico en C++ que devuelva true cuando un carácter que acepte como entrada sea una vocal, y false cuando no lo sea. 11. Escribe una función en C++ que devuelva el factorial de un número que recibe como parámetro de entrada. 12. Diseña una función que devuelva un número combinatorio de forma modular. Después diséñala de forma más eficiente sacrificando la modularidad. 13. Dado que no es aconsejable utilizar la igualdad entre número reales por ser dependiente de la precisión, diseñar una función que devuelva el valor true cuando sus dos argumentos reales son iguales para una tolerancia dada, y false cuando no lo sean. Utilizar para ello la siguiente especificación: bool IgualesR(float v1, float v2, float tolerancia); 14. Diseña un subprograma, tanto su especificación como su implementación, que tome como entrada los coeficientes de una ecuación de segundo grado y dé como salida las dos raíces reales de dicha ecuación. En un argumento de salida lógico indicará cuándo las raíces son complejas, en cuyo caso no se calcularán las raíces. 15. Mejora el subprograma anterior, cambiando si es necesario su especificación, para que calcule también las raíces complejas. 16. Escribe un subprograma, Intercambiar, que intercambie 2 números que llegan como parámetros de entrada/salida. Llamando al subprograma anterior, escribe otro, Ordenar2, que acepte 2 números enteros en 2 parámetros de entrada/salida y los devuelva ordenados en los mismos parámetros, de forma que el menor quede en el primer parámetro y el mayor en el segundo. Apoyándote en el subprograma anterior, escribe otro, Ordenar3, que acepte como entrada 3 números enteros y los devuelva ordenados en los mismos parámetros reales. 17. Escribe una función lógica, EsPrimo, que determine si un número de entrada es primo o no. 18. Escribe un procedimiento que halle la suma de 2 números complejos. Cada sumando complejo en realidad serán 2 parámetros de entrada de tipo real. Y la suma será otros 2 parámetros de salida de tipo real. 19. Escribe un procedimiento que reciba como parámetros de entrada la parte real y la parte imaginaria de un número complejo y lo pase a forma polar devolviéndolo en 2 parámetros de salida que contengan el módulo y argumento correspondientes. Dpto. Lenguajes y Ciencias de la Computación Escuela Politécnica Superior 3/8 Fundamentos de Informática Tema 5: subprogramas 20. El método de Euclides para encontrar el máximo común divisor de dos números enteros positivos consta de los siguientes pasos: a. b. c. Divida el número mayor entre el menor y conserve el resto. Divida el número menor entre el resto, y utilice nuevamente el resto. Siga dividiendo el resto anterior entre el nuevo resto hasta que el resto se haga cero; el último resto que no sea cero es el máximo común divisor. Usando este algoritmo, realice una función que calcule y devuelva el máximo común divisor de dos números enteros que se pasan como parámetros. NIVEL MEDIO 21. En un almacén, cada producto es identificado por un número y un dígito adicional. Este segundo valor es un dígito de autoverificación, que se calcula a partir del primer número, de la siguiente forma: a) Multiplicar la posición de las unidades y cada posición alternada por dos. Ejemplo: Si el número del producto es 543211 obtenemos 583412. b) Sumar los dígitos no multiplicados y los resultados de los productos obtenidos en el apartado 1. En el ejemplo obtenemos 23. c) Restar el número obtenido en el apartado 2 del número más próximo y superior a éste, que termine en cero. En el ejemplo sería 30-23=7. El resultado será el dígito de autoverificación. Codificar una función que dado un número, devuelva su dígito de autoverificación. Escribir un programa que vaya leyendo números de productos y compruebe mediante el dígito de autoverificación si el número introducido es correcto o no. El proceso se repetirá hasta que se introduzca un cero como número de producto. 22. Escribir una función CuentaChars() que lea desde teclado una cadena de caracteres acabada en un punto, para calcular la posición de la primera y la última ocurrencia de un determinado carácter ch. La función tendrá 4 argumentos: El primero será el carácter ch , los dos siguientes serán utilizados para devolver los valores indicados (usando un paso de parámetros por referencia). Ambos valores serán cero si ch no aparece ninguna vez en la cadena de caracteres leída. El último parámetro será para devolver el número de veces que aparece el carácter ch. El programa de prueba principal simplemente leerá el carácter ch, llamará a la función CuentaChars() y mostrará los 3 valores resultantes. 23. Escribe una función, seno, que devuelva el seno aproximado de un número utilizando la serie de MacLaurin (Taylor alrededor de 0): sin( x) x x3 x5 x7 ... 3! 5! 7! Realiza el cálculo sumando términos hasta el primero que sea menor que una tolerancia, por ejemplo 10-6. 24. De forma similar, escribe otra función, coseno, que devuelva el coseno aproximado de un número utilizando su desarrollo en serie de MacLaurin: cos( x) 1 x2 x4 x6 ... 2! 4! 6! 25. Escribe un programa que lea un número entero positivo y calcule la suma de sus divisores, exceptuando él mismo. 26. Dos números son amigos cuando coincide la suma de todos sus divisores. Apoyándote en una función SumaDivisores que devuelva la suma de los divisores de un número, escribe otra función lógica, amigos, que acepte 2 números como parámetros de entrada y devuelva true o false según sean o no amigos ambos números. Dpto. Lenguajes y Ciencias de la Computación Escuela Politécnica Superior 4/8 Fundamentos de Informática Tema 5: subprogramas 27. Realizar una función fibonacci(n) que calcule el término n-ésimo de la sucesión de Fibonacci, dada por: fibonacci (0) = 0 fibonacci (1) = 1 fibonacci (i) = fibonacci (i-1) + fibonacci (i-2) Diseñar un programa principal que acepte valores de n desde el teclado, utilice la función anterior y escriba el resultado en la pantalla. El programa finalizará cuando se introduzca un valor negativo. 28. Dado un suceso X, que tiene una probabilidad de que ocurra p (número real entre 0 y 1), la probabilidad Pr de que el suceso ocurra i veces en n experimentos viene dada por la función binomial, n Pr( X i ) p i (1 p ) ni i donde i es un número entero entre 0 y n. Escribe un programa que lea de teclado los valores p, n e i y calcule dicha probabilidad. Modulariza todos los cálculos, los cuales no deberán aparecer en ningún caso en el programa principal. Apoyándote en las funciones Combinatorio de un ejercicio anterior y la función pow de la librería matemática estándar, escribe una función que, dados la probabilidad p de un suceso y un número de veces i, calcule la probabilidad de que el suceso ocurra i veces. 29. Escribe un programa en C++ que lea de teclado un texto de entrada terminado en un punto y saque en pantalla el número de palabras de que consta. Se considera palabra a una serie de letras y/o dígitos que no contienen ningún otro carácter entre ellos. 30. Implementar lo siguiente: a. Una función que, dados como argumentos los valores de 2 resistencias (en ohmios), devuelva la resistencia global que ofrecen ambas si se conectan en paralelo. b. Una función que, dados (como argumentos por valor) los valores de 3 resistencias (en ohmios), devuelva la resistencia global que ofrecen si se conectan en paralelo. Implementar esta función usando y sin usar la función anterior. c. Un programa que calcule la resistencia global de n resistencias conectadas en paralelo. El programa pedirá sucesivamente una tras otra las n resistencias. El programa entenderá que no hay más resistencias cuando lea una resistencia menor o igual a cero. El programa se implementará de forma que utilice la función del apartado a. 31. Programe una función con dos argumentos. El primero será un carácter pasado por valor y el segundo un carácter pasado por referencia. La función servirá para descubrir el tipo de carácter que es el primer argumento y, según eso devolverá (con return) los siguientes valores: 2: El carácter es una letra mayúscula entre la 'A' y la 'Z' del código ASCII. 1: El carácter es una letra minúscula entre la 'a' y la 'z' del código ASCII. 0: El carácter es un dígito numérico (de '0' a '9'). -1: El carácter es de cualquier otro tipo. Además, si el carácter es una letra se devolverá en el segundo argumento la misma letra cambiando su estado (de mayúsculas a minúsculas y viceversa). Si no es una letra, devolverá en el segundo argumento el mismo carácter de entrada. En la función no debe usarse ningún número que referencie al código ASCII (en su lugar se usarán los caracteres entre comillas simples). 32. Programe una función que lea sucesivamente caracteres uno a uno hasta llegar a un punto (carácter '.'). La función escribirá cada carácter leído intercambiando mayúsculas por minúsculas y viceversa. Además, la función tendrá 3 argumentos numéricos en los que devolverá cuántos caracteres hay de cada tipo (letras, números y el resto). Observe que los 3 argumentos deben pasarse por referencia. 33. Codificar un programa que resuelva las ecuaciones simultáneas siguientes: ax + by + c = 0 Dpto. Lenguajes y Ciencias de la Computación y px + qy + r = 0 Escuela Politécnica Superior 5/8 Fundamentos de Informática Tema 5: subprogramas Realizar una función encargada de la solución de las ecuaciones que devuelva el valor de x e y en función del resto de parámetros de las ecuaciones. La función también debe devolver una variable lógica que indique si el sistema de ecuaciones tiene solución o no. El programa principal debe leer los valores, resolver las ecuaciones usando la función diseñada e imprimir en pantalla los valores en caso de existir o un mensaje de error si no es posible resolverlas. Resolver con dicho módulo las ecuaciones siguientes: 3x + 2y - 7 = 0 3x + 2y - 7 = 0 9x - 5y + 1 = 0 9x + 6y - 21 = 0 3x + 2y - 7 = 0 9x + 6y - 20 = 0 34. Defina una función llamada SumaDeDigitos() que reciba como parámetro un número unsigned int y devuelva la suma de los dígitos que lo componen. Componga con ella un programa donde se lea el número, se calcule esta suma y se presente en pantalla el resultado. Unos ejemplos de ejecución son: para la entrada 102 el resultado es 3 y para 1800 el resultado es 9. 35. Dattatreya Kaprekar (1905-1986) fue un matemático indio que nunca escribió nada de alto nivel y sus trabajos no han dado origen a ninguna investigación especial ni tienen ninguna utilidad importante, pero son sorprendentes y originales. Entre sus trabajos está el siguiente: Elegir un número de cuatro cifras A (no todas iguales y en el que las primeras pueden ser ceros). Ordenar las cifras del número A en orden creciente, generando el número B, y luego en orden decreciente, generando el número C. Restar ambos números: D = C – B. Volver a empezar pero considerando ahora el número D (en vez del número A). Lo curioso es que independientemente del número A elegido, al final siempre se llega al mismo número. Hacer un programa que averigüe ese número final (6174). Fases del programa: Primero hacer una función que dado el número A como único argumento, nos devuelva el número D. Esa función sólo efectuará un ciclo. El programa principal pedirá un número y aplicará la función sucesivamente hasta que el resultado de la función sea igual a su argumento, es decir, hasta que ya no tenga sentido seguir aplicando la función porque siempre obtenemos el mismo número. En ese momento el programa mostrará ese número y terminará. 36. Otra idea de Kaprekar es coger un número A de 5 cifras que dividimos en dos partes, una B con las 3 primeras cifras y otra C con las 2 últimas. Se suma 2 a ambos números B y C, despreciando el acarreo si se supera el número de cifras inicial de B y C. Invertid los dos números poniendo delante el de dos cifras, CB, obteniendo un nuevo número de 5 cifras. Ahora volver a empezar, repitiendo el proceso, hasta que obtengamos, de nuevo, el número inicial, contando el número de pasos que vamos dando. Por ejemplo: A partir del número 45113, Kaprekar descubrió que se obtiene el número inicial en 24568 etapas: 45113, 15453, 55156, 58553... 37. Siguiendo con Kaprekar, descubrió que algunos números al elevarlos al cuadrado y partir el resultado en dos partes de 3 dígitos, si se suman esas dos partes se obtiene el número inicial. Por ejemplo, 297, cuyo cuadrado es 88209, si ahora dividimos en dos partes y las sumamos obtenemos que: 88+209=297. Si a esos números los llamamos números de Kaprekar, este ejercicio consiste en hacer una función que calcule y muestre todos los números de Kaprekar menores a N, donde N es un valor natural que se introduce como único argumento de esa función. 38. En el año 1582 el Papa Gregorio XIII implantó el llamado CALENDARIO GREGORIANO, una modificación del anterior calendario, el Juliano, que se adapta mejor a la duración real de un año (365 días, 5 horas, 48 minutos y 45,9 segundos que tarda la Tierra en dar una vuelta completa alrededor del Sol). Este calendario se estableció en el Concilio de Trento y comienza el 15 de octubre de 1582, siendo el que usamos en la actualidad y, según él, un año es BISIESTO: Si es divisible por 4 y no por 100 Caso de ser divisible por 100 que lo sea también por 400. Ejemplos: El 1900 no fue bisiesto y el 2000 sí. Codifique lo siguiente: Dpto. Lenguajes y Ciencias de la Computación Escuela Politécnica Superior 6/8 Fundamentos de Informática a. b. c. Tema 5: subprogramas Función Bisiesto: Devuelve un valor lógico verdad si el año que toma como único argumento es bisiesto y falso en caso contrario. Función Dia1Enero: Acepta un año como único argumento y calcula, usando la función anterior, el día de la semana del 1 de Enero de ese año. Para ello, tendremos en cuenta que el 1 de Enero de 1996 fue Lunes. El día de la semana resultante será devuelto por la función usando un número (1: Lunes, ..., 7: Domingo). Programa Principal: Lee un año y, usando las funciones anteriores, indicará si dicho año es o no bisiesto, así como el día de la semana del 1 de Enero de ese año. El día de la semana se escribirá por pantalla con el nombre (Lunes, Martes, ...). Se debe controlar que el año sea superior a 1582. 39. Escribir una función sumanumeros() que lea una cadena de números separados por espacios acabada en un punto (los caracteres se leerán uno a uno hasta leer el punto final). La función debe devolver la suma de todos los números de la cadena y además debe aceptar tres argumentos: el primero será un carácter que contiene un dígito (del 0 al 9), el segundo argumento devolverá el número de veces que ese dígito aparece en la cadena de entrada y el tercer argumento devolverá el número de números que se han sumado en la cadena de entrada. Observa que los dos últimos parámetros deben ser pasados por referencia. Por ejemplo, si la cadena de entrada es: 22 18 1122 8. La función es usada tal como: sumaNum=sumanumeros('2',numVecesDigito,numNumeros); Al terminar la ejecución de la misma tendremos los siguientes valores: sumaNum=1170, es decir 22+18+1122+8 numVecesDigito=4, es decir el 2 aparece 4 veces numNumeros=4, es decir hay cuatro números en la entrada NIVEL ALTO 40. Realizar un programa que simule el siguiente juego: Un jugador tira dos dados. Si en la primera tirada la suma de los dos es 7 u 11 el jugador gana. Si es 2, 3 ó 12 pierde. Si es cualquier otra puntuación el jugador debe seguir tirando los dados hasta que bien repita la primera puntuación en cuyo caso gana la partida, o bien salga un 7 y pierda. 41. Implementar una función, Digit(N,num) que devuelva el dígito N-ésimo de un número num de tipo long unsigned int, teniendo en cuenta que el dígito 0 es el dígito más a la derecha (el menos significativo). La función devolverá -1 si el número no tiene suficientes dígitos. Ejemplos: Digit (0,3456) Digit (1,3456) Digit (4,3456) Devuelve 6 Devuelve 5 Devuelve -1 Escriba un programa que tome como entrada desde teclado el número y la posición y escriba el dígito resultante. Si la posición es mayor que el número de dígitos se escribirá en pantalla el mensaje “No existe ningún dígito en esa posición”. Nota: Considere la posibilidad de que el número N sea negativo. 42. Las resistencias electrónicas suelen ir identificadas por un código de colores que permite marcar cada resistencia con su valor (en Ohmios, Ω) y su Tolerancia (en %). Este código de colores viene representado en la siguiente tabla: Dígito 0 1 2 3 4 5 Dpto. Lenguajes y Ciencias de la Computación Color Ninguno Plata Oro Negro Marrón Rojo Naranja Amarillo Verde Multiplicador 0.01 0.1 1 10 102 103 104 105 Tolerancia 20 % 10 % 5% 1% 2% Escuela Politécnica Superior 7/8 Fundamentos de Informática Tema 5: subprogramas 6 7 8 9 Azul Violeta Gris Blanco 106 107 El código que suele emplearse en las resistencias es un código de 4 colores, es decir, cada resistencia está marcada con 4 bandas y cada una de ellas puede ser de diferente color. Cada banda tiene un significado, que depende de cada color: Las primeras 2 bandas indican un número de 2 dígitos: Esos dos dígitos vienen dados por el color de esas bandas, según la columna “Dígito” de la tabla. La tercera banda es un valor por el que se multiplicará el número obtenido por las bandas anteriores. Una vez multiplicados ambos valores, obtenemos el valor de la resistencia en Ohmios (Ω). La cuarta banda indica la tolerancia de la resistencia y, como puede verse en la tabla, no puede ser de cualquier color. Ejemplo: Unas resistencias con los siguientes colores, tienen los siguientes valores de resistencia y tolerancia: Verde-Azul-Amarillo-Oro Rojo-Negro-Rojo-Rojo Rojo-Rojo-Marrón-Plata 560kΩ, 5% 2kΩ, 2% 220Ω, 10% Según todo lo anterior, implemente un subprograma que permita calcular la resistencia y la tolerancia de una resistencia, sabiendo los códigos de colores. El subprograma tendrá, como mínimo, 4 argumentos, que serán números naturales, y que indicarán el color de las bandas según la columna “Dígito”. Los colores Oro, Plata y Ninguno tomarán los valores 10, 11 y 12 respectivamente. Implementar otro subprograma que muestre por pantalla el dígito que le corresponde a cada color (incluyendo los dígitos 10, 11 y 12). Codificar también un programa principal que pida los colores de las 4 bandas y muestre los valores devueltos por el anterior subprograma. El programa mostrará el dígito que le corresponde a cada color usando la función ya creada y leerá de teclado 4 números que corresponderán a los colores de las 4 bandas. Tras esta lectura mostrará los datos de la resistencia con esos colores en las bandas. El programa se repetirá indefinidamente hasta que lea un valor negativo como color de una banda. 43. Escribe un programa que acepte como entrada desde teclado un número entero positivo y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones simétricas respecto al dígito central dentro del número dado como entrada. Utilice para ello la función realizada en el ejercicio anterior. Por ejemplo: Para el número : 2354869 la salida es: 2+9 = 11, 3 + 6 = 9, 5 + 8 = 13, 4 Para el número : 6582 la salida es : 6 + 2 = 8, 5 + 8 = 13 Dpto. Lenguajes y Ciencias de la Computación Escuela Politécnica Superior 8/8