Boletı́n de ejercicios de la asignatura de INFORMÁTICA para la realización de las prácticas de laboratorio Ejercicios de Estructuras de Control Escuela Técnica Superior de Ingenierı́a Geodésica, Cartográfica y Topográfica (UPV) Pedro Alonso Jordá Fernando Garcı́a Granada Laura Sebastiá Tarı́n Miguel Vicente Ripollés {palonso,fgarcia,lstarin,mvicente}@dsic.upv.es Curso 2007-2008 Ejercicio 1. Escribir un programa que lea un número entero y diga si es par o impar. Ejercicio 2. Implementar un programa en C que permita resolver el siguiente problema: determinar la cantidad total a pagar por una llamada telefónica, teniendo en cuenta lo siguiente: toda llamada que dure menos de 1 minuto tiene un coste de 10 céntimos, cada minuto adicional a partir del primero cuesta 5 céntimos. Ejercicio 3. Implementar un programa en C que dados tres números enteros calcule el máximo y el mı́nimo. Ejercicio 4. Escribir un programa que lea un año y diga si es o no bisiesto. Un año es bisiesto cuando es divisible por 4 y no lo es por 100. Alternativamente, tambié es bisiesto cuando es divisible por 400. Ejercicio 5. Escribir un programa que determine si un atleta es seleccionado para correr una maratón. Para ser seleccionado, los tiempos de clasificación son 150 minutos para hombres menores de 40 años, 175 minutos para hombres mayores de 40 años, y 180 minutos para mujeres. Los datos a introducir son: sexo (valores posibles: H, M), edad y tiempo. El programa visualizará el mensaje “Seleccionado” o “No seleccionado”. NOTA: Recordad que las constantes de tipo caracter se representan entre comillas simples, por ejemplo, ’h’. Repasad también el Ejercicio 13 del Boletı́n1 para la introducción de caracteres por teclado. 1 2 Ejercicio 6. Escribir un programa en C que sea equivalente al siguiente fragmento de programa, pero sin utilizar la estructura de control de selección múltiple switch: scanf ("%d", &a); switch (a) { case 2: case 5: case 8: case 11: printf ("A\n"); break; case 3: case 6: case 9: case 12: printf ("B\n"); break; case 4: case 7: case 10: case 13: printf ("C\n"); break; } Ejercicio 7. Dado el siguiente programa en C: main () { int a,b,i,aux,resultado; printf ("Introduce dos numeros enteros "); scanf ("%d%d", &a, &b); if (a > b) { aux=a; a=b; b=aux; } resultado=1; for (i=a+1; i<=b; i=i+1) { resultado=resultado*i; } printf ("El resultado es: %d \n", resultado); } responder a las siguientes cuestiones: ¿Cuál serı́a el resultado del programa si los datos introducidos fuesen 3 y 6?. Demostrarlo con una traza. ¿Y si los datos introducidos fuesen 7 y 7 ?. No se pide traza. ¿El resultado del programa depende del orden en que son introducidos los datos?. Responder SI o NO y explicar brevemente por qué. Expresar con una fórmula qué cálculo hace este programa cuando a <= b. Boletı́n de ejercicios de INFORMÁTICA 3 Ejercicio 8. ¿Qué se visualiza en los siguientes programas? main () { int i; i=0; while (i<6) { printf ("El valor de i es %d \n", i); i=i+1; } } main () { int i; i=0; while (i<6) { i=i+1; printf ("El valor de i es %d \n", i); } } Ejercicio 9. Implementar un programa en C que lea un número entero correspondiente a un mes del año, validando la corrección del mismo. El programa debe solicitar un nuevo número si el valor introducido no está en el intervalo [1, 12]. Cuando el valor sea correcto, el programa mostrará el nombre del mes correspondiente. Ejercicio 10. Escribir un programa en C para calcular el cociente y resto de la división entera de dos números enteros, utilizando para ello la operación de resta o sustracción. Ejercicio 11. Escribir un programa en C para determinar si un número entero es primo o no. Ejercicio 12. Escribir un programa en C para calcular la suma de los números enteros comprendidos entre N y M , siendo N y M valores introducidos por el usuario. Ejercicio 13. Realizar un programa en C para leer 10 números y calcular, independientemente, la suma de los números pares e impares. Ejercicio 14. Dado un número N , escribir un programa en C que genere todos los números múltiplos de 7 que hay entre 1 y N . Modificar el programa anterior para que visualize sólo aquellos múltiplos de 7 entre 1 y N que no son divisibles entre 3. Ejercicio 15. Escribir un programa que genere la secuencia de números: 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, . . . , 1, 2, 3, . . . Ejercicio 16. Escribir un programa en C que lea una serie de números positivos y distintos de 0 y obtenga el mayor de ellos. Introducir un número negativo para detectar el final de la serie numérica. Ejercicio 17. Escribir un programa en C que lea un conjunto de 100 números naturales almacenados en un fichero y determine: Boletı́n de ejercicios de INFORMÁTICA 4 ¿Cuántos son menores o iguales que 15? ¿Cuántos son mayores o iguales que 50? ¿Cuántos están comprendidos entre 25 y 45, ambos inclusive? Para gerenar dicho fichero se puede utilizar el siguiente código: int i; FILE *fp; fp = fopen("Fichero.txt","w"); srand(1234); for( i=0; i<100; i++ ) { fprintf(fp,"%d\n",rand()%100); } fclose(fp); que crea el fichero Fichero.txt con 100 números enteros comprendidos entre 0 y 100 (es necesario incluir los ficheros de cabecera stdio.h y stdlib.h). Tomando ese fichero como entrada, el resultado del ejercicio es: Menores de 15 = 23 Mayores de 50 = 45 Entre 25 y 45 = 17 Ejercicio 18. Implementar un programa en C que lea 100 números reales almacenados en un fichero y calcule la media de los números positivos y la de los negativos. Para gerenar dicho fichero se puede utilizar el siguiente código: int i; FILE *fp; fp = fopen("Fichero.txt","w"); srand(1234); for( i=0; i<100; i++ ) { fprintf(fp,"%lf\n",((double) rand())/((double) RAND_MAX) - 0.5); } fclose(fp); que crea el fichero Fichero.txt con 100 números reales comprendidos entre -0.5 y 0.5. (es necesario incluir los ficheros de cabecera stdio.h y stdlib.h). El resultado en este caso es de 0.233231 de media para los positivos y -0.260781 de media para los negativos. Ejercicio 19. Implementar un programa en C que, dados dos números enteros, devuelva si uno es divisor del otro. (Hay que detectar cual es el más pequeño; no se puede utilizar la operación de división ni de resto; se suponen que los dos números son > 0). La salida del algoritmo debe ser del tipo: xxx [no] es divisor de yyy Ejercicio 20. Escribir un programa que encuentre el primer valor N para el que la suma 1 + 2 + 3 +... + N exceda a un valor LIMITE que se introduce por teclado. Boletı́n de ejercicios de INFORMÁTICA 5 Ejercicio 21. El siguiente programa en C lee un número N y devuelve un número M . Describir en dos lı́neas cuál es la relación que existe entre N y M y poner un ejemplo de un dato de entrada y otro de salida. Realizar una traza para N = 2341. main () { int A, B, D, N, M=0, i=0, j, k; printf ("Introduce un numero entero: "); scanf ("%d", &N); A=N; while ((A/10) != 0) { A=A/10; i=i+1; } B=N; for (j=i; j>= 0; j--) { D=1; for (k=0; k<j; k++ ) D=D*10; M=M+(B%10)*D; B=B/10; } printf (" El resultado es %d", M); } Ejercicio 22. Escribir un programa en C que lea las calificaciones de los alumnos de una determinada asignatura hasta que el usuario introduzca una calificación negativa, y al final escriba el número de aprobados, el número de suspendidos, y la calificación media. Ejercicio 23. Escribir un programa en C que dado un número entero N 1, devuelva otro número entero N 2 que sea el resultado de eliminar la primera y última cifra de N 1. (Nota: Si N 1 tiene 2 cifras o una sola, entonces N 2 deberá ser 0) Ejemplos: N1=42635 → N2=263; N1=23 → N2=0 Ejercicio 24. Una persona dispone de una cantidad de X euros que quiere repartir a un conjunto de personas. A cada persona le da una cantidad de dinero proporcional a la edad de la misma; ası́ por ejemplo, si una persona tiene 17 años recibirá 1.700 euros y si tiene 32 años, recibirá 3.200 euros. El problema consiste en hacer un programa que devuelva el número de personas que podrán recibir una cantidad de dinero. Nota: Cuando la cantidad de dinero ya no es suficiente para dársela a una persona, se supone que no existen más personas y que, por tanto, el algoritmo finaliza. Ejercicio 25. Un número se dice que es capicúa si leı́do de derecha a izquierda da el mismo resultado que leı́do de izquierda a derecha. Por ejemplo, los números 22, 343, 5665 o 12321 son capicúas. Implementar un programa en C que lea desde teclado un número entero mayor de 9 y devuelva si el número es capicúa o no. Ejercicio 26. Implementar un programa en C que calcule el máximo, el mı́nimo y la media de una lista indefinida de números enteros positivos introducidos desde el teclado. En el caso de introducir un número negativo dicho número deberá ser rechazado indicando el motivo (a través de la pantalla) por el que ha sido rechazado (”es negativo”). La entrada de datos finalizará cuando se introduzca el valor 0. Boletı́n de ejercicios de INFORMÁTICA 6 Ejercicio 27. Implementar un programa en C que, dado un número entero N mayor que cero, calcule los múltiplos de 3 que hay entre 3 y N y, para cada múltiplo, calcule los divisores del mismo. Ejemplo: para N = 10 el resultado será múltiplo=3 divisores del 3 = {1,3} múltiplo=6 divisores del 6 = {1,2,3,6} múltiplo=9 divisores del 9 = {1,3,9} Ejercicio 28. Se dispone de un conjunto de N alumnos y para cada uno de ellos las calificaciones correspondientes a 7 asignaturas (numeradas del 1 al 7). Implementar un programa en C para calcular el tanto por ciento de aprobados de cada asignatura. Ejercicio 29. Se dispone de un conjunto de N familias, cada una de las cuales tiene un número de hijos. Escribir un programa en C capaz de averiguar la media de edad de los hijos de todas las familias. Ejercicio 30. Un número entero se puede descomponer en una suma de números primos. Por ejemplo el número 8 se puede poner como 7+1, el número 9 como 7+2, el número 6 como 5+1 y un número primo se descompone únicamente en sı́ mismo. Escribe un programa en C que devuelva los números primos en los que se puede descomponer un número entero. Nota: Algunos números como el número 9 también se podrı́a descomponer como 3+3+3 o 5+3+1, pero el algoritmo debe usar siempre los números primos mayores posibles y el menor número de ellos. Boletı́n de ejercicios de INFORMÁTICA