Soluciones a los ejercicios propuestos

(Ejercicios incluidos hasta el momento: 170, resueltos: 42)

 


Apartado 0.1.1: Localiza en Internet el intérprete de BASIC llamado Bywater Basic, en su versión para el sistema operativo que estés utilizando (o algún otro intérprete de BASIC clásico, como un emulador de un Amstrad CPC, un MSX o un Commodore 64) y prueba el primer programa de ejemplo que se ha visto en el apartado 0.1. (Nota: no es imprescindible para seguir el curso; puedes omitir este ejercicio si no quieres instalar en tu equipo software que quizá no vuelvas a utilizar).


Apartado 0.1.2: Localiza en Internet el compilador de Pascal llamado Free Pascal, en su versión para el sistema operativo que estés utilizando y prueba el segundo programa de ejemplo que se ha visto en el apartado 0.1. (Nota: no es imprescindible para seguir el curso; puedes omitir este ejercicio si no quieres instalar nada en tu equipo).


Apartado 1.2: Crea un programa que diga el resultado de sumar 118 y 56.


Apartado 1.2b: Un programa que calcule la diferencia entre 12345 y 998.


Apartado 1.2c: Un programa que calcule y muestre el resultado de dividir 3765 entre 18 y el resto de esa división.


Apartado 1.3.1: Calcular (a mano y después comprobar desde C) el resultado de estas operaciones: -2 + 3 * 5 ; (20+5) % 6 ; 15 + -5*6 / 10 ; 2 + 10 / 5 * 2 - 7 % 1


Apartado 1.4.3: Hacer un programa que calcule el producto de los números 121 y 132, usando variables.


Apartado 1.7.1a: Multiplicar dos números tecleados por usuario


Apartado 1.7.1b: El usuario tecleará dos números (x e y), y el programa deberá calcular cual es el resultado de su división y el resto de esa división.


Apartado 1.7.1c: El usuario tecleará dos números (a y b), y el programa mostrar el resultado de la operación (a+b)*(a-b) y el resultado de la operación a2-b2.


Apartado 2.1.1: Multiplicar dos números de 4 cifras que teclee el usuario, usando el modificador "long".


Apartado 2.1.3a: Crea un programa que te diga cuántos bytes son 3 megabytes.


Apartado 2.1.8a: Crea un programa en C que exprese en el sistema decimal los números octales 162, 76, 241, 102.


Apartado 2.1.8b: Crea un programa en C que exprese en el sistema decimal los números hexadecimales 1B2, 76, E1, 2A.


Apartado 2.1.10a: Crear un programa que use tres variables x,y,z. Sus valores iniciales serán 15, -10, 2.147.483.647. Se deberá incrementar el valor de estas variables. ¿Qué valores esperas que se obtengan? Contrástalo con el resultado obtenido por el programa.


Apartado 2.1.10b: ¿Cuál sería el resultado de las siguientes operaciones? a=5; b=++a; c=a++; b=b*5; a=a*2;


Apartado 2.1.11a: Crear un programa que use tres variables x,y,z. Sus valores iniciales serán 15, -10, 214. Se deberá incrementar el valor de estas variables en 12, usando el formato abreviado. ¿Qué valores esperas que se obtengan? Contrástalo con el resultado obtenido por el programa.


Apartado 2.1.11b: ¿Cuál sería el resultado de las siguientes operaciones? a=5; b=a+2; b-=3; c=-3; c*=2; ++c; a*=b;


Apartado 2.2.02a: El usuario de nuestro programa podrá teclear dos números de hasta 8 cifras significativas. El programa deberá mostrar el resultado de dividir el primer número entre el segundo, utilizando tres cifras decimales.


Apartado 2.2.02b: Crear un programa que use tres variables x,y,z. Las tres serán números reales, y nos bastará con dos cifras decimales. Deberá pedir al usuario los valores para las tres variables y mostrar en pantalla cual es el mayor de los tres números tecleados.


Apartado 2.3: Descubrir cual es el espacio ocupado por un "int" en el sistema operativo y compilador que utilizas.


Apartado 2.5.1: Crear un programa que pida al usuario que teclee cuatro letras y las muestre en pantalla juntas, pero en orden inverso, y entre comillas dobles. Por ejemplo si las letras que se teclean son a, l, o, h, escribiría "hola".


Apartado 3.1.1a: Crear un programa que pida al usuario un número entero y diga si es par (pista: habrá que comprobar si el resto que se obtiene al dividir entre dos es cero: if (x % 2 == 0) ...


Apartado 3.1.1b: Crear un programa que pida al usuario dos números enteros y diga cual es el mayor de ellos.


Apartado 3.1.1c: Crear un programa que pida al usuario dos números enteros y diga si el primero es múltiplo del segundo (pista: igual que antes, habrá que ver si el resto de la división es cero: a % b == 0).


Apartado 3.1.3a: Crear un programa que multiplique dos números enteros de la siguiente forma: pedirá al usuario un primer número entero. Si el número que se que teclee es 0, escribirá en pantalla "El producto de 0 por cualquier número es 0". Si se ha tecleado un número distinto de cero, se pedirá al usuario un segundo número y se mostrará el producto de ambos.


Apartado 3.1.3b: Crear un programa que pida al usuario dos números reales. Si el segundo no es cero, mostrará el resultado de dividir entre el primero y el segundo. Por el contrario, si el segundo número es cero, escribirá "Error: No se puede dividir entre cero".


Apartado 3.1.4a: Crear un programa que multiplique dos números enteros de la siguiente forma: pedirá al usuario un primer número entero. Si el número que se que teclee es 0, escribirá en pantalla "El producto de 0 por cualquier número es 0". Si se ha tecleado un número distinto de cero, se pedirá al usuario un segundo número y se mostrará el producto de ambos. (Variante con "else")


Apartado 3.1.4b: Crear un programa que pida al usuario dos números reales. Si el segundo no es cero, mostrará el resultado de dividir entre el primero y el segundo. Por el contrario, si el segundo número es cero, escribirá "Error: No se puede dividir entre cero". (Variante con "else")


Apartado 3.1.5a: Crear un programa que pida una letra al usuario y diga si se trata de una vocal.


Apartado 3.1.5b: Crear un programa que pida al usuario dos números enteros y diga "Uno de los números es positivo", "Los dos números son positivos" o bien "Ninguno de los números es positivo", según corresponda.


Apartado 3.1.5c: Crear un programa que pida al usuario tres números reales y muestre cuál es el mayor de los tres.


Apartado 3.1.5d: Crear un programa que pida al usuario dos números enteros cortos y diga si son iguales o, en caso contrario, cuál es el mayor de ellos.


Apartado 3.1.9a: Crear un programa que use el operador condicional para mostrar un el valor absoluto de un número de la siguiente forma: si el número es positivo, se mostrará tal cual; si es negativo, se mostrará cambiado de signo.


Apartado 3.1.9b: Crear un programa que use el operador condicional para dar a una variable llamada "iguales" (entera) el valor 1 si los dos números que ha tecleado el usuario son iguales, o el valor 0 si son distintos.


Apartado 3.1.9c: Usar el operador condicional para calcular el mayor de dos números.


Apartado 3.2.1a: Crear un programa que pida al usuario su contraseña (numérica). Deberá terminar cuando introduzca como contraseña el número 4567, pero volvérsela a pedir tantas veces como sea necesario.


Apartado 3.2.1b: Crea un programa que escriba en pantalla los números del 1 al 10, usando "while".


Apartado 3.2.1c: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "while".


Apartado 3.2.1d: Crear un programa calcule cuantas cifras tiene un número entero positivo (pista: se puede hacer dividiendo varias veces entre 10).


Apartado 3.2.2a: Crear un programa que pida números positivos al usuario, y vaya calculando la suma de todos ellos (terminará cuando se teclea un número negativo o cero).


Apartado 3.2.2b: Crea un programa que escriba en pantalla los números del 1 al 10, usando "do..while".


Apartado 3.2.2c: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "do..while".


Apartado 3.2.2d: Crea un programa que pida al usuario su código de usuario (un número entero) y su contraseña numérica (otro número entero), y no le permita seguir hasta que introduzca como código 1024 y como contraseña 4567.


Apartado 3.2.3a: Crear un programa que muestre los números del 15 al 5, descendiendo (pista: en cada pasada habrá que descontar 1, por ejemplo haciendo i--).


Apartado 3.2.3b: Crear un programa que muestre los primeros ocho números pares (pista: en cada pasada habrá que aumentar de 2 en 2, o bien mostrar el doble del valor que hace de contador).


Apartado 3.2.3c: Crear un programa que muestre las letras de la Z (mayúscula) a la A (mayúscula, descendiendo).


Apartado 3.2.3d: Crear un programa que escriba en pantalla la tabla de multiplicar del 6.


Apartado 3.2.3e: Crear un programa que escriba en pantalla los números del 1 al 50 que sean múltiplos de 3 (pista: habrá que recorrer todos esos números y ver si el resto de la división entre 3 resulta 0).


Apartado 3.3a: Crear un programa que pida un número al usuario (entre 1 y 100) y muestre tantas letras A como indique ese número, usando "break" para terminar.


Apartado 3.4a: Crear un programa que pida un número al usuario (entre 1 y 20) y muestre los números el 1 al 20, excepto el indicado por el usuario, usando "continue" para evitar ese valor.


Apartado 3.7a: Crear un programa que dé al usuario la oportunidad de adivinar un número del 1 al 100 (prefijado en el programa) en un máximo de 6 intentos. En cada pasada deberá avisar de si se ha pasado o se ha quedado corto.


Apartado 3.7b: Crear un programa que descomponga un número (que teclee el usuario) como producto de sus factores primos. Por ejemplo, 60 = 2 • 2 • 3 • 5


Apartado 4.1a: Un programa que pida al usuario un número entero y muestre sus equivalentes en formato hexadecimal y en octal. Deberá seguir pidiendo (y convirtiendo) números hasta que se introduzca 0.


Apartado 4.1b: Un programa que pida al usuario 2 números reales y muestre su división con 2 decimales (excepto si el segundo es 0; en ese caso, deberá decir "no se puede dividir").


Apartado 4.2a: Un programa que pida al usuario un número hexadecimal y muestre su equivalente en base 10.


Apartado 4.2b: Un programa que pida al usuario un número octal y muestre su equivalente en base 10.


Apartado 4.2c: Un programa que pida al usuario una letra, después le pida una segunda letra, y las muestre en el orden contrario al que se introdujeron.


Apartado 4.3: Un programa que escriba las letras de la A (a mayúscula) a la Z (z mayúscula), usando "for" y "putchar".


Apartado 4.4: Un programa que pida al usuario 4 letras (usando "getchar") y las muestre en orden inverso (por ejemplo, si las letras son "h o l a", escribiría "aloh").


Apartado 5.1.1a: Un programa que pida al usuario 4 números, los memorice (utilizando una tabla), calcule su media aritmética y después muestre en pantalla la media y los datos tecleados.


Apartado 5.1.1b: Un programa que pida al usuario 5 números reales y luego los muestre en el orden contrario al que se introdujeron.


Apartado 5.1.2a: Un programa que almacene en una tabla el número de días que tiene cada mes (supondremos que es un año no bisiesto), pida al usuario que le indique un mes (1=enero, 12=diciembre) y muestre en pantalla el número de días que tiene ese mes.


Apartado 5.1.2b: Un programa que almacene en una tabla el número de días que tiene cada mes (año no bisiesto), pida al usuario que le indique un mes (ej. 2 para febrero) y un día (ej. el día 15) y diga qué número de día es dentro del año (por ejemplo, el 15 de febrero sería el día número 46, el 31 de diciembre sería el día 365).


Apartado 5.1.3a: A partir del programa propuesto en 5.1.2, que almacenaba en una tabla el número de días que tiene cada mes, crear otro que pida al usuario que le indique la fecha, detallando el día (1 al 31) y el mes (1=enero, 12=diciembre), como respuesta muestre en pantalla el número de días que quedan hasta final de año.


Apartado 5.1.3b: Crear un programa que pida al usuario 10 números y luego los muestre en orden inverso (del último al primero).


Apartado 5.1.3c: Crear un programa que pida al usuario 10 números, calcule su media y luego muestre los que están por encima de la media.


Apartado 5.1.3d: Un programa que pida al usuario 10 números enteros y calcule (y muestre) cuál es el mayor de ellos.


Apartado 5.2.1a: Un programa que te pida tu nombre y una cifra numérica, y escriba tu nombre tantas veces como indique esa cifra numérica.


Apartado 5.2.1b: Un programa similar al anterior, pero que pida en primer lugar la cifra numérica y después tu nombre, y luego escriba el nombre tantas veces como indique esa cifra numérica.


Apartado 5.2.2: Un programa que pida al usuario que introduzca una palabra, cambie su primera letra por una "A" y muestre la palabra resultante.


Apartado 5.2.3a: Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio. Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "J u a n".


Apartado 5.2.3b: Un programa que te pida tu nombre y lo muestre en pantalla separando al revés. Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "nauJ".


Apartado 5.2.4a: Un programa que te pida una frase y la muestre en pantalla sin espacios. Por ejemplo, si la frase es "Hola, como estás", debería aparecer en pantalla "Hola,comoestás".


Apartado 5.2.4b: Un programa que te pida tu nombre (usando "gets") y una cifra numérica, y escriba tu nombre tantas veces como indique esa cifra numérica.


Apartado 5.2.4c: Un programa similar al anterior, pero que pida en primer lugar la cifra numérica y después tu nombre (con "gets"), y luego escriba el nombre tantas veces como indique esa cifra numérica.


Apartado 5.2.5: Un programa que te pida una palabra, y la almacene en la variable llamada "texto". Luego deberá pedir una segunda palabra, y añadirla al final de "texto". Finalmente, deberá pedir una tercera palabra, y guardarla en la variable "texto" y en otra variable llamada "texto2".


Apartado 5.2.6a: Crear un programa que pida al usuario su contraseña. Deberá terminar cuando introduzca como contraseña la palabra "clave", pero volvérsela a pedir tantas veces como sea necesario.


Apartado 5.2.6b: Crear un programa que pida al usuario su nombre y su contraseña, y no le permita seguir hasta que introduzca como nombre "Pedro" y como contraseña "Peter".


Apartado 5.2.7: Un programa que pida tu nombre, tu día de nacimiento y tu mes de nacimiento y lo junte todo en una cadena, separando el nombre de la fecha por una coma y el día del mes por una barra inclinada, así: "Juan, nacido el 31/12".


Apartado 5.3a: Un programa guarde los nombres de los meses. El usuario deberá indicar un número de mes (por ejemplo, 3) y se le mostrará el nombre de dicho mes (por ejemplo, Marzo).


Apartado 5.3b: Usar un array de 3 dimensiones para guardar los nombres de los meses en español e inglés. El usuario deberá indicar un número de mes (por ejemplo, 3) y se le mostrará el nombre de dicho mes en español (Marzo) y en inglés (March).


Apartado 5.4a: Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee "fin".


Apartado 5.4b: Un programa que prepare espacio para un máximo de 100 nombres (de un máximo de 80 letras cada uno). El usuario deberá ir introduciendo un nombre cada vez, hasta que se pulse Intro sin teclear nada, momento en el que dejarán de pedirse más nombres y se mostrará en pantalla la lista de los nombres que se han introducido hasta entonces.


Apartado 5.5.1: Un "struct" que almacene datos de una canción en formato MP3: Artista, Título, Duración (en segundos), Tamaño del fichero (en KB). Un programa debe pedir los datos de una canción al usuario, almacenarlos en dicho "struct" y después mostrarlos en pantalla.


Apartado 5.5.2a: Ampliar el programa del apartado 5.5.1, para que almacene datos de hasta 100 canciones. Deberá tener un menú que permita las opciones: añadir una nueva canción, mostrar el título de todas las canciones, buscar la canción que contenga un cierto texto (en el artista o en el título).


Apartado 5.5.2b: Un programa que permita guardar datos de "imágenes" (ficheros de ordenador que contengan fotografías o cualquier otro tipo de información gráfica). De cada imagen se debe guardar: nombre (texto), ancho en píxeles (por ejemplo 2000), alto en píxeles (por ejemplo, 3000), tamaño en Kb (por ejemplo 145,6). El programa debe ser capaz de almacenar hasta 700 imágenes (deberá avisar cuando su capacidad esté llena). Debe permitir las opciones: añadir una ficha nueva, ver todas las fichas (número y nombre de cada imagen), buscar la ficha que tenga un cierto nombre.


Apartado 5.5.3: Ampliar el programa del apartado 5.5.2, para que el campo "duración" se almacene como minutos y segundos, usando un "struct" anidado que contenga a su vez estos dos campos.


Apartado 5.6a: Un programa que pida el nombre, el apellido y la edad de una persona, los almacene en un "struct" y luego muestre los tres datos en una misma línea, separados por comas.


Apartado 5.6b: Un programa que pida datos de 8 personas: nombre, dia de nacimiento, mes de nacimiento, y año de nacimiento (que se deben almacenar en una tabla de structs). Después deberá repetir lo siguiente: preguntar un número de mes y mostrar en pantalla los datos de las personas que cumplan los años durante ese mes. Terminará de repetirse cuando se teclee 0 como número de mes.


Apartado 5.6c: Un programa que sea capaz de almacenar los datos de hasta 50 personas: nombre, dirección, teléfono, edad (usando una tabla de structs). Deberá ir pidiendo los datos uno por uno, hasta que un nombre se introduzca vacío (se pulse Intro sin teclear nada). Entonces deberá aparecer un menú que permita: Mostrar la lista de todos los nombres; Mostrar las personas de una cierta edad; Mostrar las personas cuya inicial sea la que el usuario indique; Salir del programa (lógicamente, este menú debe repetirse hasta que se escoja la opción de "salir").


Apartado 5.6d: Mejorar la base de datos de ficheros (ejemplo 53) para que no permita introducir tamaños incorrectos (números negativos) ni nombres de fichero vacíos.


Apartado 5.6e: Ampliar la base de datos de ficheros (ejemplo 53) para que incluya una opción de búsqueda parcial, en la que el usuario indique parte del nombre y se muestre todos los ficheros que contienen ese fragmento (usando "strstr").


Apartado 5.6f: Ampliar la base de datos de ficheros (ejemplo 53) para que se pueda borrar un cierto dato (habrá que "mover hacia atrás" todos los datos que había después de ese, y disminuir el contador de la cantidad de datos que tenemos).


Apartado 5.6g: Mejorar la base de datos de ficheros (ejemplo 53) para que se pueda modificar un cierto dato a partir de su número (por ejemplo, el dato número 3). En esa modificación, se deberá permitir al usuario pulsar Intro sin teclear nada, para indicar que no desea modificar un cierto dato, en vez de reemplazarlo por una cadena vacía.


Apartado 5.6h: Ampliar la base de datos de ficheros (ejemplo 53) para que se permita ordenar los datos por nombre. Para ello, deberás buscar información sobre algún método de ordenación sencillo, como el "método de burbuja", y aplicarlo a este caso concreto.


Apartado 5.7: Un programa que cree un array de 7 números enteros y lo ordene con cada uno de estos tres métodos, mostrando el resultado de los pasos intermedios.


Apartado 6.1: Crea un programa que vaya leyendo las frases que el usuario teclea y las guarde en un fichero de texto. Terminará cuando la frase introducida sea "fin" (esa frase no deberá guardarse en el fichero).


Apartado 6.2: Crea un programa que lea las tres primeras líneas del fichero creado en el apartado anterior y las muestre en pantalla. Si el fichero no existe, se deberá mostrar un aviso.


Apartado 6.3a: Un programa que pida al usuario que teclee frases, y las almacene en el fichero "frases.txt". Acabará cuando el usuario pulse Intro sin teclear nada. Después deberá mostrar el contenido del fichero.


Apartado 6.3b: Un programa que pregunte un nombre de fichero y muestre en pantalla el contenido de ese fichero, haciendo una pausa después de cada 25 líneas, para que dé tiempo a leerlo. Cuando el usuario pulse intro, se mostrarán las siguientes 25 líneas, y así hasta que termine el fichero. (Pista: puedes usar un contador, volverlo a poner a cero tras cada 25 líneas o bien comprobar si has avanzado otras 25 líneas usando la operación "resto de la división", y hacer la pausa con "getchar()").


Apartado 6.4a: Crear un "struct" que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia. Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado "gente.dat". Cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado.


Apartado 6.4b: Ampliar el programa anterior para que use un "array de structs", de forma que se puedan tener datos de 10 personas. Se deberá pedir al usuario los datos de las 10 personas y guardarlos en el fichero. Después se pedirá al usuario un número del 1 al 10 y se mostrarán los datos de la persona indicada por ese número, que se deberán leer de fichero (1 será la primera ficha, y 10 será la última). Por ejemplo, si el usuario indica que quiere ver los datos de la persona 3 (tercera), se deberá leer las dos primeras, ignorando su contenido, y después leer la tercera, que sí se deberá mostrar.


Apartado 6.4c: Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día, mes y año de nacimiento (estos tres últimos datos deberán ser números enteros cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una persona (se preguntará al usuario cual es el nombre de esa persona que quiere visualizar). Al empezar el programa, leerá los datos de un fichero llamado "agenda.dat" (si existe). Al terminar, guardará todos los datos en ese fichero.


Apartado 6.6a: Un programa que pida al usuario que teclee frases, y las almacene en el fichero "registro.txt", que puede existir anteriormente (y que no deberá borrarse, sino añadir al final de su contenido). Cada sesión acabará cuando el usuario pulse Intro sin teclear nada.


Apartado 6.6b: Crear un programa que pida al usuario pares de números enteros y escriba su suma (con el formato "20 + 3 = 23") en pantalla y en un fichero llamado "sumas.txt", que se encontrará en un subdirectorio llamado "resultados". Cada vez que se ejecute el programa, deberá añadir los nuevos resultados a continuación de los resultados de las ejecuciones anteriores.


Apartado 6.8a: Crear un "struct" que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia. Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado "gente.dat", usando "fwrite". Cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado, que se deben leer con "fread".


Apartado 6.8b: Ampliar el programa anterior para que use un "array de structs", de forma que se puedan tener datos de 10 personas. Se deberá pedir al usuario los datos de las 10 personas y guardarlos en el fichero, usando "fwrite". Después se pedirá al usuario un número del 1 al 10 y se mostrarán los datos de la persona indicada por ese número, que se deberán leer de fichero (1 será la primera ficha, y 10 será la última). Por ejemplo, si el usuario indica que quiere ver los datos de la persona 3 (tercera), se deberá leer las dos primeras (con "fread"), ignorando su contenido, y después leer la tercera, que sí se deberá mostrar.


Apartado 6.8c: Mejorar la agenda anterior (del apartado 6.4), para guardar y leer cada "ficha" (struct) de una vez, usando fwrite/fread y sizeof, como en el último ejemplo.


Apartado 6.9a: Ampliar el programa anterior (el "array de structs" con 10 personas) para que el dato que indique el usuario se lea sin leer y descartar antes los que le preceden, sino que se salte directamente a la ficha deseada usando "fseek".


Apartado 6.10a: Mejorar la última versión de la agenda anterior (la que usa fwrite, fread y sizeof) para que no lea todas las fichas a la vez, sino que lea una única ficha del disco cada vez que lo necesite, saltando a la posición en que se encuentra dicha ficha con "fseek".


Apartado 6.10b: Hacer un programa que muestre información sobre una imagen en formato GIF (se deberá localizar en Internet los detalles sobre dicho formato): versión, ancho de la imagen (en píxeles), alto de la imagen y cantidad de colores.


Apartado 6.10c: Hacer un programa que muestre información sobre una imagen en formato PCX: ancho de la imagen (en píxeles), alto de la imagen y cantidad de colores.


Apartado 6.10d: Mejorar la base de datos de ficheros (ejemplo 53) para que los datos se guarden en disco al terminar la sesión de uso, y se lean de disco cuando comienza una nueva sesión.


Apartado 6.10e: Mejorar la base de datos de ficheros (ejemplo 53) para que cada dato introducido se guarde inmediatamente en disco, sin esperar a que termine la sesión de uso. En vez de emplear un "array de structs", debe existir un solo "struct" en memoria cada vez, y para las búsquedas se recorra todo el contenido del fichero.


Apartado 6.10f: Mejorar el ejercicio anterior (ejemplo 53 ampliado con ficheros, que se manejan ficha a ficha) para que se pueda modificar un cierto dato a partir de su número (por ejemplo, el dato número 3). En esa modificación, se deberá permitir al usuario pulsar Intro sin teclear nada, para indicar que no desea modificar un cierto dato, en vez de reemplazarlo por una cadena vacía.


Apartado 6.14a: Pedir al usuario dos números y la operación (suma o resta) a realizar con ellos, y mostrar el resultado de dicha operación. Utilizar "fgets" y "sscanf" para la lectura de teclado.


Apartado 7.4a: Crear una función que calcule el cubo de un número real (float). El resultado deberá ser otro número real. Probar esta función para calcular el cubo de 3.2 y el de 5.


Apartado 7.4b: Crear una función que calcule cual es el menor de dos números enteros. El resultado será otro número entero.


Apartado 7.4c: Crear una función llamada "signo", que reciba un número real, y devuelva un número entero con el valor: -1 si el número es negativo, 1 si es positivo o 0 si es cero.


Apartado 7.4d: Crear una función que devuelva la primera letra de una cadena de texto. Probar esta función para calcular la primera letra de la frase "Hola"


Apartado 7.4e: Crear una función que devuelva la última letra de una cadena de texto. Probar esta función para calcular la última letra de la frase "Hola".


Apartado 7.5a: Crear una función "escribirGuiones" que escriba en pantalla tantos guiones ("-") como se indique como parámetro y no devuelva ningún valor.


Apartado 7.5b: Crear una función "dibujarRectangulo", que reciba como parámetros la anchura y la altura del rectángulo a mostrar, y muestre en pantalla un rectángulo de ese tamaño, relleno de caracteres "#".


Apartado 7.5c: Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.


Apartado 7.5d: Crear una función que reciba un número y muestre en pantalla el perímetro y la superficie de un cuadrado que tenga como lado el número que se ha indicado como parámetro.


Apartado 7.5e: Crear una función "escribirCentrado" que reciba un texto y lo escriba centrado en la siguiente línea de pantalla (suponiendo 80 columnas en pantalla). Por ejemplo, si el texto es "Hola", que tiene 4 letras, se escribirán 38 espacios antes de él.


Apartado 7.6a: Crear una función "pedirEntero", que reciba como parámetros el texto que se debe mostrar en pantalla, el valor mínimo aceptable y el valor máximo aceptable. Deberá pedir al usuario que introduzca el valor tantas veces como sea necesario, volvérselo a pedir en caso de error, y devolver un valor correcto. Probarlo con un programa que pida al usuario un año entre 1800 y 2100.


Apartado 7.6b: Crear una función "escribirTablaMultiplicar", que reciba como parámetro un número entero, y escriba la tabla de multiplicar de ese número (por ejemplo, para el 3 deberá llegar desde 3x0=0 hasta 3x10=30).


Apartado 7.6c: Crear una función "esPrimo", que reciba un número y devuelva el valor 1 si es un número primo o 0 en caso contrario.


Apartado 7.6d: Crear una función que reciba una cadena y una letra, y devuelva la cantidad de veces que dicha letra aparece en la cadena. Por ejemplo, si la cadena es "Barcelona" y la letra es 'a', debería devolver 2 (aparece 2 veces).


Apartado 7.6e: Crear una función que reciba un número cualquiera y que devuelva como resultado la suma de sus dígitos. Por ejemplo, si el número fuera 123 la suma sería 6.


Apartado 7.6f: Crear una función que reciba una letra y un número, y escriba un "triángulo" formado por esa letra, que tenga como anchura inicial la que se ha indicado. Por ejemplo, si la letra es * y la anchura es 4, debería escribir
****
***
**
*


Apartado 7.9.1a: Crea un programa que escriba varias veces "Hola" (entre 5 y 10 veces, al azar).


Apartado 7.9.1b: Crear un programa que genere un número al azar entre 1 y 100. El usuario tendrá 6 oportunidades para acertarlo.


Apartado 7.9.1c: Crea un programa que muestre un "fondo estrellado" en pantalla: mostrará 24 líneas, cada una de las cuales contendrá entre 1 y 78 espacios (al azar) seguidos por un asterisco ("*").


Apartado 7.9.2a: Crear un programa que halle cualquier raíz de un número. El usuario deberá indicar el número (por ejemplo, 2) y el índice de la raiz (por ejemplo, 3 para la raíz cúbica). Pista: hallar la raíz cúbica de 2 es lo mismo que elevar 2 a 1/3.


Apartado 7.9.2b: Crear un programa que resuelva ecuaciones de segundo grado, del tipo ax2 + bx + c = 0 El usuario deberá introducir los valores de a, b y c. Pista: la solución se calcula con x = +- raíz (b2 – 4•a•c) / 2•a


Apartado 7.9.2c: Crear un programa que muestre el seno de los ángulos de 30 grados, 45 grados, 60 grados y 90 grados. Cuidado: la función "sin" espera que se le indique el ángulo en radianes, no en grados. Tendrás que recordar que 180 grados es lo mismo que Pi radianes (con Pi = 3,1415926535). Puedes crearte una función auxiliar que convierta de grados a radianes.


Apartado 7.9.3a: Crea un programa que escriba la raíz cuadrada de 10 y muestre la cantidad de cifras que se han escrito en pantalla. (Pista: mira el valor devuelto por "printf").


Apartado 7.10a: Crear una función que calcule el valor de elevar un número entero a otro número entero (por ejemplo, 5 elevado a 3 = 53 = 5 •5 • 5 = 125). Esta función se debe crear de forma recursiva.


Apartado 7.10b: Como alternativa, crear una función que calcule el valor de elevar un número entero a otro número entero de forma NO recursiva (lo que llamaremos "de forma iterativa"), usando la orden "for".


Apartado 7.10c: Crear un programa que emplee recursividad para calcular un número de la serie Fibonacci (en la que los dos primeros elementos valen 1, y para los restantes, cada elemento es la suma de los dos anteriores).


Apartado 7.10d: Crear un programa que emplee recursividad para calcular la suma de los elementos de un vector.


Apartado 7.10e: Crear un programa que emplee recursividad para calcular el mayor de los elementos de un vector.


Apartado 7.10f: Crear un programa que emplee recursividad para dar la vuelta a una cadena de caracteres (por ejemplo, a partir de "Hola" devolvería "aloH").


Apartado 7.10g: Crear, tanto de forma recursiva como de forma iterativa, una función diga si una cadena de caracteres es simétrica (un palíndromo). Por ejemplo, \"DABALEARROZALAZORRAELABAD\" es un palíndromo.


Apartado 7.10h: Crear un programa que encuentre el máximo común divisor de dos números usando el algoritmo de Euclides: Dados dos números enteros positivos m y n, tal que m > n, para encontrar su máximo común divisor, es decir, el mayor entero positivo que divide a ambos: - Dividir m por n para obtener el resto r (0 = r < n) ; - Si r = 0, el MCD es n.; - Si no, el máximo común divisor es MCD(n,r).


Apartado 9.5a: Crear una función que calcule las dos soluciones de una ecuación de segundo grado (Ax2 + Bx + C = 0) y devuelva las dos soluciones como parámetros.


Apartado 9.8a: Mejorar la versión de la agenda que leía todos los datos al principio de la ejecución y guardaba todos los datos cuando terminábamos su uso (apartado 6.4). Esta nueva versión deberá estar preparada para manejar hasta 1000 fichas, pero sólo reservará espacio para las que realmente sean necesarias.


Apartado 9.9a: Crear un programa llamado "suma", que calcule (y muestre) la suma de dos números que se le indiquen como parámetro. Por ejemplo, si se teclea "suma 2 3" deberá responder "5", y si se teclea "suma 2" deberá responder "no hay suficientes datos.


Apartado 9.9b: Crear una calculadora básica, llamada "calcula", que deberá sumar, restar, multiplicar o dividir los dos números que se le indiquen como parámetros. Ejemplos de su uso sería "calcula 2 + 3" o "calcula 5 * 60".


Apartado 9.10a: Crea una "pila de enteros", que permitirá añadir un nuevo número (lo que llama¬remos "apilar") o bien extraer el número que se encuentra en la parte más alta de la pila ("desapilar"). En una primera aproximación, usa un array para guardar los datos.


Apartado 9.10b: Crea una nueva versión de la "pila de enteros", que utilice memoria dinámica.


Apartado 9.10c: Crea una "cola de enteros", que permitirá añadir un nuevo número al final de la cola (lo que llama¬remos "encolar") o bien extraer el número que se encuentra al principio de la cola ("desencolar"). En esta primera aproximación, usa un array para guardar los datos.


Apartado 9.10d: Crea una nueva versión de la "cola de enteros", que utilice memoria dinámica.


Apartado 9.10e: Implementa una lista doble enlazada que almacene números enteros.


Apartado 10.4a: Crea un menú para MsDos que muestre varias opciones en el centro de la pantalla, y el reloj en la parte superior derecha de la pantalla. Mientras el usuario no pulse una tecla, el reloj debe actualizarse continuamente.


Apartado 10.4b: Crea, tanto para MsDos como para Linux, un "protector de pantalla" que muestre tu nombre rebotando en los laterales de la pantalla. Deberá avanzar de posición cada segundo.


Apartado 10.5.1a: Crea (o busca en Internet) una imagen de fondo de tamaño 800x600 que represente un cielo negro con estrellas, y tres imágenes de planetas con un tamaño menor (cercano a 100x100, por ejemplo). Entra a modo gráfico 800x600 con 24 bits de color usando SDL, dibuja la imagen de fondo, y sobre ella, las de los tres planetas. El título de la ventana deberá ser "Planetas". Las imágenes deberán mostrarse durante 7 segundos.


Apartado 10.5.2a: Amplía el ejercicio anterior, añadiendo la imagen de una nave espacial, que deberá moverse cada vez que el usuario pulse una de las flechas del cursor. Ya no se saldrá al cabo de varios segundos, sino cuando el usuario pulse la tecla ESC.


Apartado 10.5.3a: Amplía el ejercicio anterior, para que la imagen de la nave espacial tenga el contorno transparente (y quizá también alguna zona interior).


Apartado 10.5.3b: Crea una imagen que contenga varias letras (al menos H, O, L, A), y úsala para escribir las frases HOLA y OH en modo gráfico con SDL.


Apartado 10.5.4a: Amplía el ejercicio de la nave, para que emplee un doble buffer que permita evitar parpadeos.


Apartado 10.5.5a: Amplía el ejercicio de la nave, para que emplee tenga una función "buclePrincipal", que siga la apariencia de un bucle de juego clásico, llamando a funciones con los nombres "comprobarTeclas", "dibujarElementos", "moverEstrellas", "mostrarPantallaOculta". Existirán algunas estrellas, cuya posición cambiará cuando se llame a "moverEstrellas" y que se dibujarán, junto con los demás componentes, al llamar a en "dibujarElementos". Al final de cada "pasada" por el bucle principal habrá una pausa de 20 milisegundos, para que la velocidad del "juego" no dependa del ordenador en que se ejecute.


Apartado 10.5.5b: Ampliar el ejercicio anterior, para que también exista un "enemigo" que se mueva de lado a lado de la pantalla.


Apartado 10.5.5c: Ampliar el ejercicio anterior, para que haya 20 "enemigos" (un array) que se muevan de lado a lado de la pantalla.


Apartado 10.5.5d: Ampliar el ejercicio anterior, para añadir la posibilidad de que nuestro personaje "dispare".


Apartado 10.5.5e: Ampliar el ejercicio anterior, para que si un "disparo" toca a un "enemigo", éste deje de dibujarse.


Apartado 10.5.5f: Ampliar el ejercicio anterior, para que la partida termine si un "enemigo" toca a nustro personaje.