Boletín 2 1. Escriba el siguiente código , compílelo y ejecútelo. ¿Obtiene el resultado esperado? Modifíquelo para que se comporte como debe: #include <stdio.h> int main () { int i, j; scanf("%d%d",&i,&j); if (i = j) printf("los números leídos son iguales\n"); else printf("los números leídos son distintos\n"); return 0; } 2. Escriba el siguiente código, compílelo y ejecútelo. Modifíquelo para que funcione correctamente: #include <stdio.h> int main () { int i, j, k=5; scanf("%d%d",&i,&j); if (i<k<j) printf("k está entre los números leídos\n"); else printf("k no está entre los números leídos\n"); } 3. Escriba el siguiente código, compílelo y ejecútelo. Modifíquelo para que funcione correctamente: #include <stdio.h> int main () { int i; scanf("%d",&i); switch(i){ case (1): printf("i es igual a 1\n"); case (-1): printf("i es igual a -1\n"); case (0): printf("i es igual a cero\n"); default: printf("i toma otro valor\n"); } } 4. El siguiente código debería mantener el valor de a como 20, pero no lo hace. Explique el porqué, y modifique el código para que funcione correctamente: #include <stdio.h> int main () { int a = 20; if (a > 0) if (a < 15) a = a * 2; else a = 0; printf("a vale %d\n",a); } 5. Escriba un programa que lea un dato de la entrada estándar y calcule e imprima su inverso. Considere el caso especial del valor 0, en cuyo caso el programa (¡no el sistema operativo!) deberá mostrar el mensaje “ERROR – división por cero”. 6. Escriba un programa que lea un número entero desde la entrada estándar y compruebe si es correcto. En caso negativo, el programa imprimirá el mensaje “ERROR – número incorrecto”. Considere los siguientes casos para decidir si un número es o no correcto: a) El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO y MAXIMO. b) El número es correcto si es uno de los tres valores constantes VALOR1, VALOR2 o VALOR3. c) El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO y MAXIMO, o bien es igual al valor constante VALOR1. d) El número es correcto si se encuentra en el rango definido por dos valores constantes MINIMO1 y MAXIMO1, o bien en el definido por los valores constantes MINIMO2 y MAXIMO2. 7. Escriba un programa que lea un instante de tiempo expresado en horas y minutos y escriba como respuesta uno de los mensajes “Buenos días”, “Buenas tardes” o “Buenas noches, de acuerdo con las siguientes reglas: a) Se considera que es de día desde las 7:30 horas hasta las 14:00 horas. b) Se considera que es por la tarde desde las 14:01 hasta las 20:30 horas. c) Se considera que es de noche desde las 20:31 horas hasta las 7:29 horas. 8. El siguiente programa incompleto indica si un número que se ha leído desde la entrada estándar es par: #include <stdio.h> int main () { int numero; scanf("%d", &numero); if (?????) printf("Es un número par"); else printf("Es un número impar"); } Reemplace los interrogantes por la expresión lógica adecuada para que el programa cumpla su cometido. 9. Modifique el programa anterior para que compruebe si el número es múltiplo de un número variable n, que se habrá leído previamente de la entrada estándar. 10. Escriba un programa que lea dos números de la entrada estándar y los escriba en la salida estándar ordenados de mayor a menor. 11. Escriba un programa que lea un carácter de la entrada estándar e indique su tipo, que podrá ser uno de los siguientes: letra mayúscula (de la ‘A’ a la ‘Z’), letra minúscula (de la ‘a’ a la ‘z’), dígito (del ‘0’ al ‘9’) u otro. Si se trata de una letra minúscula escribirá, además, la correspondiente letra mayúscula. 12. Desarrolle un programa que lea de la entrada estándar las coordenadas cartesianas (x, y) de un punto del plano y calcule e imprima el cuadrante al cual pertenece el punto. Hágalo de dos formas distintas: a. Utilizando 4 estructuras selectivas simples. b. Utilizando 2 estructuras dobles anidadas. 13. Generalice el programa anterior al espacio tridimensional. Cada punto tiene ahora 3 coordenadas (x, y, z) y puede estar situado en 8 cuadrantes diferentes. Finalmente incluya la posible coincidencia con los ejes de coordenadas y el origen (0, 0, 0). 14. Escriba un programa que lea un número x de la entrada estándar y lleve a cabo las siguientes operaciones: a. Si es positivo, calculará e imprimirá su raíz cuadrada (use la función sqrt). b. Si es distinto de cero, calculará e imprimirá su inverso (1/x). c. Si es par, calculará e imprimirá su cociente entre 2 (x/2). d. Si es positivo y menor que 10, imprimirá el mensaje “sólo tiene un dígito”. e. Si está comprendido entre 32 y 127 (ambos inclusive) imprimirá el carácter cuyo código ASCII representa. 15. Sea el siguiente programa incompleto: #include <stdio.h> int main () { int ca, ce, ci, co, cu; char caracter; scanf("%c", &caracter); ... printf("%d%d%d%d%d\n", ca, ce, ci, co, cu); } Complete el programa para que imprima 10000 si el carácter leído es una ‘a’, 01000 si es una ‘e’, 00100 si es una ‘i’, 00010 si es una ‘o’, 00001 si es una ‘u’ y ‘00000’ en cualquier otro caso. Hágalo en primer lugar con estructuras selectivas anidadas, y posteriormente con una estructura switch. 16. Se desea escribir un programa para el cálculo del área de diversas superficies: cuadrado, rectángulo, círculo, triángulo y trapecio. El programa mostrará al inicio el siguiente menú: ============================================ CÁLCULO DE SUPERFICIES (versión 1.0) ============================================ 1. Cuadrado lado*lado 2. Círculo pi*radio*radio 3. Rectángulo base*altura 4. Trapecio (base1+base2)*altura/2 5. Triángulo (base*altura)/2 ============================================ Seguidamente leerá de la entrada estándar un valor que estará comprendido entre 1 y 5, indicando el tipo de superficie cuya área se desea calcular. El programa leerá entonces los datos que necesite para calcular el área en cuestión. El resultado se mostrará en la salida estándar, tras lo cual el programa terminará. 17. El siguiente programa lee dos números enteros de la entrada estándar y calcula e imprime el mayor de ellos. Complételo utilizando una estructura selectiva doble. #include <stdio.h> int main () { int a, b, maximo; scanf("%d%d", &a, &b); ????? printf("\nEl máximo de %d y %d es %d", a, b, maximo); } 18. Modifique el programa anterior para que, en caso de igualdad de los dos números leídos, escriba el mensaje “ambos números son iguales”. 19. Escriba un programa que lea tres números a, b, c de la entrada estándar y los escriba en la salida estándar ordenados de mayor a menor. Utilice el siguiente esquema como ayuda: { { 20. 21. 22. 23. 24. { { { Considere ahora 4 números en lugar de 3. Construya un esquema similar al anterior para ayudarse. Escriba un programa que convierta de grados Fahrenheit a Celsius y viceversa. El programa deberá leer en primer lugar un número entero que indicará si se va a convertir de grados Fahrenheit a Celsius (1) o de grados Celsius a Fahrenheit (2). Seguidamente leerá el valor de la temperatura, realizará la conversión aplicando la fórmula adecuada y mostrará el resultado en la salida estándar. Escriba un programa que lea dos fechas dadas por un día, mes y año e indique cuál de ellas es anterior en el tiempo a la otra. Escriba un programa que lea dos fechas de un mismo año dadas por un día y un mes y calcule el número de días transcurridos entre ambas. Tenga en cuenta que el año puede ser bisiesto. Escriba un programa que lea dos instantes de tiempo expresados en horas, minutos y segundos e indique cuál de ellos es anterior al otro. Hágalo de dos formas: a. Calcule los segundos transcurridos desde las 00:00 horas hasta cada uno de ellos y compárelos. b. Compare directamente las horas, los minutos y los segundos de ambos instantes de tiempo. Escriba de la entrada estándar tres números enteros que representan las longitudes de tres segmentos rectilíneos, e indique si dichos segmentos pueden formar o no un triángulo (la condición necesaria pero no suficiente es que ninguno de los segmentos tenga una longitud superior a la suma de los otros dos). 25. El siguiente programa en pseudocódigo obtiene las soluciones de una ecuación de segundo grado (sin considerar las soluciones imaginarias). La ecuación es: Y las soluciones vienen dadas por √ Leer a, b, c d b2 – 4ac si d = 0: x -b / (2.0a) | d > 0: x1 (-b+raiz2(d))/(2.0a) x2 (-b+raiz2(d))/(2.0a) escribir x1, x2 | d < 0: nula fsi Escriba el programa correspondiente en lenguaje C. 26. Modifique el programa anterior para que considere las soluciones imaginarias. Para ello, considere el siguiente fragmento de código: ... int signo = 0; ... d = b*b - 4*a*c; if (d > 0) signo = 1; else if (d < 0) signo = -1; ... Utilice la variable signo calculada de esta forma como la expresión de una estructura switch (Pista: compare los tres posibles valores de signo con los tres casos a considerar en el problema). 27. Escriba una sentencia switch que a partir de una nota expresada en forma numérica imprima su correspondiente literal, según la siguiente correspondencia: 0 a 4 SUSPENSO, 5 y 6 APROBADO, 7 y 8 NOTABLE, 9 y 10 SOBRESALIENTE. Para cualquier otro valor de la nota numérica se imprimirá el mensaje VALOR INCORRECTO.