1º Grado de IEM- ITL Fundamentos de Informática Hoja de Problemas 3 – Sentencias de Control y Funciones Problema 1 Escribir un programa que solicite al usuario un número n (entero positivo), y llame a la función TrianguloPares() para dibujar un triángulo de números pares tal y como aparece en el ejemplo. El prototipo de la función es: void TrianguloPares(int n); 2 2 4 2 4 6 2 4 6 8 .................. 2 4 6 8 ....................2*n Problema 2 El valor del número e se puede aproximar sumando n términos de la serie: e 1 1 1 1 ... 1! 2! 3! Escribir un programa que solicite n, llame a una función Exponencial() e informe del valor aproximado de e. Téngase en cuenta que el término i de la anterior serie se obtiene dividiendo el término anterior por (i-1). Problema 3 a) Escribir una función float tempfahr (float tempcelsius) que reciba una temperatura en grados centígrados y la convierta a grados fahrenheit. b) Escribir un programa principal que permita probarla al solicitar la conversión de varias temperaturas en un proceso iterativo que se acaba a voluntad del usuario. Problema 4 Escribir un programa que pida al usuario un capital inicial y un número de años (>=10) y calcule, a partir de ellos, el interés al que hay que poner el capital para doblarlo en los años pedidos. Se debe usar la función BuscarInteres() que devuelva el primer interés que encuentre que consiga, como mínimo, duplicar el capital inicial en el número de años indicado. El prototipo de BuscarInteres() va a ser: float BuscarInteres(float capital_inicial, int num_anios); Será de utilidad (para usarla dentro de BuscarInteres()) crearse otra función CalculoCapital() que le devuelva al usuario el capital acumulado para un capital inicial, un interés determinado y un número de años. Todas las entradas y salidas de datos se realizarán en el programa principal. El programa debe filtrar los datos para impedir la entrada de información inválida. Nota: capital_acumulado = capital_inicial * (1 + interes/100)num_anios; Está PROHIBIDO utilizar la función “pow” en este ejercicio. Problema 5 El valor de coseno(x) se puede aproximar sumando n términos de la serie: cos( x) 1 x2 x4 x6 ... 2! 4! 6! Escribir un programa que solicite n y un arco x y produzca un informe de 4 columnas y n filas. En la primera columna aparecerán los números 1, 2, 3, .... n. En la segunda el valor aproximado del coseno sumando tantos términos de la serie anterior como indique la primera columna. En la tercera el valor del coseno obtenido mediante la 1º Grado de IEM- ITL Fundamentos de Informática función propia del C, y en la cuarta la diferencia entre estas dos últimas. Los valores de las tres últimas columnas se darán con 6 cifras decimales. Problema 6 (Prueba 1 7/Oct/11) Escribir un programa que: Solicite al usuario la cantidad de números n que va a introducir, debiendo validar que n sea un valor positivo. A continuación, vaya solicitando tantos números enteros como haya indicado el usuario con n, y muestre por pantalla los números que sean múltiplos de 3. Finalmente, deberá mostrar al usuario la media de los valores que no son múltiplos de 3. Problema 7 Los números de Fibonacci forman una interesante secuencia en la que cada número es igual a la suma de los dos números anteriores. Fi = Fi-1 + Fi.-2 F1 = F2 = 1 Realizar dos funciones, FibonacciRec() (recursivo) y FibonacciIte() (iterativo) que reciban como argumento el número de Fibonacci que se quiere calcular y devuelvan dicho valor. Ejemplo: F0 = 0 F1 = 1 F2 = 1 F3 = F1 + F2 = 1 + 1 = 2 F4 = F3 + F2 = 2 + 1 = 3 ….. a) Realizar la función FibonacciRec() b) Realizar la función FibonacciIte() Problema 8 Los polinomios de Legendre se pueden calcular mediante las fórmulas: P0 = 1 P1 = x Pn = [ (2*n-1)/n] * x * Pn-1 – [(n-1)/n] * Pn-2 Donde n = 2, 3, 4, ... y x es un número real que se encuentra entre –1 y 1. Realizar una función principal que pida el valor n y el valor x (y realice una comprobación de ambos datos) y posteriormente llame a la función Polinomio_Legendre() que será la encargada de devolverle el valor del Pn. Posteriormente, la función principal se encargará de mostrarle al usuario el valor Pn. NOTA: La función Polinomio_Legendre() debe ser una función recursiva. Ejercicio adicional: Realizar la función Polinomio_Legendre() de manera iterativa. Problema 9 (Intersemestral Noviembre 10-11) Escribe un programa completo que lea un número entero de teclado y llame a una función Invertir() que invierte el número que recibe y lo devuelve. A continuación el programa muestra el resultado. Escribir también el código de la función Invertir(), teniendo en cuenta que debe ser una función iterativa que no emplea vectores. Ejemplo: si el entero inicial es 427, el resultado será 724 Nota: esta función no hace uso de vectores. El algoritmo implementa el uso del operador %. Problema 10 La siguiente ecuación permite calcular la presión de un gas real, tratado como un gas de Van der Waals, en función del volumen molar. p = R * T (vm-B) – A /( vm2) ESTIMACIÓN DE LA PRESIÓN p: atm presión del gas vm: dm3/mol volumen molar R= 0.0820575 dm3 atm / K mol constante de los gases 1º Grado de IEM- ITL Fundamentos de Informática T= 500 B= 0.0391 A= 1.39 K dm3 / mol dm6 atm / mol2 temperatura en Kelvin constante del gas nitrógeno constante del gas nitrógeno a) Implementar una función con nombre presion_van_der_waals() que permita estimar la presión (p) del gas nitrógeno, teniendo en cuenta la fórmula vista anteriormente. b) Implementar una función con nombre volumen_molar_van_der_waals() que permita calcular el volumen molar (vm) del gas nitrógeno a partir de una presión dada. Para el cálculo del volumen molar es necesario utilizar la función presion_van_der_waals() del apartado a) sin más que ir calculando la presión p para sucesivos valores de vm hasta encontrar una diferencia entre la presión dada y la presión calculada inferior a 1 atmósfera. Se debe partir de un valor inicial vm= 0.01 que se irá incrementando en pasos de 0.001 hasta dar con la presión que cumpla la condición citada (diferencia menor que 1 atmósfera). c) Implementar una función principal que muestre los valores obtenidos al llamar a las funciones creadas en los apartados anteriores con los siguientes parámetros: 1. La presión del gas real de nitrógeno para un volumen molar de 0.419 dm3/mol. 2. El volumen molar del gas real de nitrógeno para una presión de 200 atm. Problema 11 (Prueba 1 7/Oct/11) Escribir un programa completo (cabecera, includes, ...) que calcule el punto de corte de dos rectas y1 = ax + b y2 = cx + d El programa debe: Leer de teclado los números reales: a, b, c, y d. Cuando las dos rectas se cortan, y1 e y2 son iguales. Por tanto, es necesario calcular el valor de x en la expresión ax+b = cx+d. Ese valor de x es el que debe calcular el programa. El programa debe distinguir los siguientes casos: Rectas paralelas: dar un mensaje indicando que no hay punto de corte si a es igual a c. Rectas coincidentes: dar un mensaje en este caso (a y c, y b y d son iguales). En el resto de los casos calcular y mostrar el punto de corte. Problema 12 (Intersemestral Marzo 10-11) Escribe un programa completo (código completo en main) que pregunte al usuario cuántos números desea introducir (n) y luego lea de teclado esos n números reales, calculando: - El valor medio de los números positivos - El valor medio de los números negativos - La mínima diferencia entre los números positivos y los negativos Finalmente mostrará por pantalla los tres resultados. Nota: NO se puede hacer uso de vectores Ejemplo: si los números introducidos son: 1.2 , 7.8 , -0.4 , 9.0 , -2.1 La mínima diferencia es la diferencia entre el menor número positivo y el mayor (teniendo en cuenta el signo) número negativo: 1.2 – (-0.4) = 1.6 El valor medio de los números positivos es: (1.2 + 7.8 + 9.0)/3 El valor medio de los números negativos es: ( - 0.4 - 2.1 )/2 Problema 13 Como cooperante de la ONG Ingeniería Sin Fronteras, ha sido destinado a los campamentos de refugiados Saharauis situados en lo peor del desierto del Sáhara, “la Hamada” que está cerca de la ciudad argelina de Tindouf. Los campamentos están formados por 4 Wilayas entre las cuales ha de viajar para impartir una serie de cursos sobre energía solar fotovoltaica. Para realizar estos viajes dispone de un jeep que, dicho sea de paso, esta un poco destartalado. El jeep pierde agua por el radiador y esta pérdida aumenta obviamente según se calienta el motor. Por tanto, es necesario transportar una serie de garrafas de agua para ir rellenando el radiador. Se ha demostrado empíricamente que con n garrafas, la distancia l que es posible recorrer antes de que el motor se gripe viene dada por la siguiente expresión: 1 1 1 l 5001 ... 2 * n 1 3 5 que sólo es válida para distancias inferiores a 3000 kilómetros. 1º Grado de IEM- ITL Fundamentos de Informática Escribir un programa que presente un menú al usuario en el programa principal donde: a) A partir de un número de garrafas conocido se informe al cooperante de los kilómetros que puede recorrer el jeep. b) A partir de un número de kilómetros (distancia) que debe recorrer se informe al cooperante del número de garrafas que necesita llevar consigo en el jeep. En ambos casos, se llamará a una función distinta que devolverá el resultado al programa principal, donde se mostrará la respuesta. Nota: es posible que la función utilizada en el apartado (b) realice una llamada a la función utilizada en el apartado (a) para realizar los cálculos. Problema 14 (Intersemestral Marzo 10-11) Una serie dada aproxima el valor de una función cuyo resultado exacto se conoce y es res. Se desea saber el número de términos a sumar de la serie para que el error de la aproximación sea menor que un valor dado error Escribir el código de la función Serie(), que recibe el valor real x, el resultado exacto res (número real) y el error (número real) que se debe cumplir y calcula y devuelve el número de términos a sumar en la serie para que el error cometido sea menor que error. El alumno debe pensar el prototipo correcto de la función Serie() serie 1 1 1 1 5 3 x 2· x 3· x 4· x 7 Problema 15 Escribe la definición de tú versión de la función toupper ( ) que reciba un carácter en mayúscula o minúscula y lo devuelva en mayúsculas. Escribe también un programa que le esté solicitando de manera continuada al usuario datos de tipo carácter y que los transforme a minúscula la función. Cuando el usuario introduzca el carácter ‘*’ significará que desea terminar. Problema 16 (Prueba 1 Feb 14) Escribir un programa completo que calcule el máximo número oblongo que hay entre dos números dados por el usuario. El programa principal debe pedir al usuario que introduzca dos números enteros positivos (lim_inf, lim_sup) que van a marcar el valor inferior y superior del intervalo. Además de comprobar que ambos son positivos, va a ser necesario comprobar que lim_sup es mayor que lim_inf. El programa principal debe comprobar si cada uno de los valores que existen entre lim_inf y lim_sup (ambos inclusive) es un número oblongo o no, y ha de buscar el máximo número oblongo entre ambos límites. Para comprobar si un número es o no oblongo se ha de llamar a la función Oblongo(), que devolverá 1 si el número es oblongo, y 0 si no lo es. Finalmente, el programa principal debe mostrar el máximo número oblongo encontrado entre lim_inf y lim_sup. En caso de no existir ningún número oblongo entre ambos límites, se dará un mensaje de “No existen numeros oblongos”. El prototipo de la función Oblongo() es: int Oblongo(int num); Un Número Oblongo es un número natural que es el producto de dos números naturales consecutivos. Por ejemplo, 30 es un número oblongo porque es el producto de 5x6. Otros números oblongos son 42, 56, ... Escribir el programa completo: ficha del programa, includes, prototipo, función principal main() y función Oblongo(). Problema 17 (Prueba 1 Oct 13) Un profesor de colegio necesita imprimir una tabla de los divisores de los números enteros para los alumnos de su clase. Escribir un programa en C para ayudar al profesor crear esta tabla. Para crear la tabla, inicialmente hay que pedir al usuario un número entero positivo n. A continuación el programa llamará repetidamente a una función Escribir_Divisores() para obtener los divisores de cada número desde 1 hasta n. Se pide: escribir en el main la llamada a la función escribir la función Escribir_Divisores() Un ejemplo de la ejecución de este programa puede ser lo siguiente: