Soluciones a los ejercicios propuestos
(Ejercicios incluidos hasta el momento: 145, resueltos: 22)
- Apartado 1.2: Crea un programa que diga el resultado de sumar 118 y 56.
- 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.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 (Queda propuesto, por ser muy parecido a otros ya resueltos): Crear un programa que pida al usuario dos números enteros y diga cual es el mayor de ellos.
- Apartado 3.1.1c (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Queda propuesto, por ser muy parecido a otros ya resueltos): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Crea un programa que escriba en pantalla los números del 1 al 10, usando “while”.
- Apartado 3.2.1c (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Crea un programa que escriba en pantalla los números del 1 al 10, usando "do..while".
- Apartado 3.2.2c (Sin resolver todavía): Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "do..while".
- Apartado 3.2.2d (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Crear un programa que muestre las letras de la Z (mayúscula) a la A (mayúscula, descendiendo).
- Apartado 3.2.3d (Sin resolver todavía): Crear un programa que escriba en pantalla la tabla de multiplicar del 5.
- Apartado 3.2.3e (Sin resolver todavía): 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.7a (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Un programa que pida al usuario un número hexadecimal y muestre su equivalente en base 10.
- Apartado 4.2b (Sin resolver todavía): Un programa que pida al usuario un número octal y muestre su equivalente en base 10.
- Apartado 4.2c (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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.1c (Sin resolver todavía): Un programa que pida al usuario 10 números enteros y calcule (y muestre) cuál es el mayor de ellos.
- Apartado 5.1.2a (Sin resolver todavía): 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 (Sin resolver todavía): 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.4a (Sin resolver todavía): 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.4b (Sin resolver todavía): Crear un programa que pida al usuario 10 números y luego los muestre en orden inverso (del último al primero).
- Apartado 5.1.4c (Sin resolver todavía): 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.2.3a (Sin resolver todavía): 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 (Sin resolver todavía): 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.4 (Sin resolver todavía): 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.5 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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.4b (Sin resolver todavía): 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.5.1 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Mejorar la agenda anterior, para guardar y leer cada “ficha” (struct) de una vez, usando fwrite/fread y sizeof, como en el último ejemplo.
- Apartado 6.8b (Sin resolver todavía): 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.8c (Sin resolver todavía): 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.9a (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 7.4a (Sin resolver todavía): Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.
- Apartado 7.4b (Sin resolver todavía): 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.4c (Sin resolver todavía): Crear una función que calcule cual es el menor de dos números enteros. El resultado será otro número entero.
- Apartado 7.4d (Sin resolver todavía): 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.4e (Sin resolver todavía): 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.4f (Sin resolver todavía): 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 (Sin resolver todavía): Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.
- Apartado 7.5b (Sin resolver todavía): 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.6a (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Crear un programa que genere un número al azar entre 1 y 100. El usuario tendrá 6 oportunidades para acertarlo.
- Apartado 7.9.2a (Sin resolver todavía): 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 (Sin resolver todavía): 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.10a (Sin resolver todavía): 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 • 3 = 125). Esta función se debe crear de forma recursiva.
- Apartado 7.10b (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Crear un programa que emplee recursividad para calcular la suma de los elementos de un vector.
- Apartado 7.10e (Sin resolver todavía): Crear un programa que emplee recursividad para calcular el mayor de los elementos de un vector.
- Apartado 7.10f (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Implementa una lista doble enlazada que almacene números enteros.
- Apartado 10.4a (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Amplía el ejercicio de la nave, para que emplee un doble buffer que permita evitar parpadeos.
- Apartado 10.5.5a (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): 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 (Sin resolver todavía): Ampliar el ejercicio anterior, para añadir la posibilidad de que nuestro personaje “dispare”.
- Apartado 10.5.5e (Sin resolver todavía): Ampliar el ejercicio anterior, para que si un “disparo” toca a un “enemigo”, éste deje de dibujarse.
- Apartado 10.5.5f (Sin resolver todavía): Ampliar el ejercicio anterior, para que la partida termine si un “enemigo” toca a nustro personaje.
Apartado 1.2: Crea un programa que diga el resultado de sumar 118 y 56.
#include <stdio.h> main() { printf("La suma de 118 y 56 es %d", 118+56); }
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
#include <stdio.h> main() { printf("-2 + 3 * 5 = %d \n", // Resultado: 13 -2 + 3 * 5); printf("(20+5) %% 6 = %d \n", // Resultado: 1 (20+5) % 6); printf("15 + -5*6 / 10 = %d \n", // Resultado: 12 15 + -5*6 / 10); printf("2 + 10 / 5 * 2 - 7 %% 1 = %d \n", // Resultado: 6 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.
#include <stdio.h> main() { int a = 121; int b = 132; int producto; producto = a*b; printf("El producto es %d", producto); }
Apartado 1.7.1a: Multiplicar dos números tecleados por usuario
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 1.7.1a */ /* s010701a.c */ /* */ /* Multiplicar dos nums */ /* usando variables */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int a, b, resultado; printf("Introduce el primer numero "); scanf("%d", &a); printf("Introduce el segundo numero "); scanf("%d", &b); resultado = a*b; printf("Su producto es %d", resultado); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 1.7.1b */ /* s010701b.c */ /* */ /* Division y resto de 2 */ /* nums usando variables */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int x, y; int division, resto; printf("Introduce el primer numero "); scanf("%d", &x); printf("Introduce el segundo numero "); scanf("%d", &y); division = x/y; resto = x/y; printf("Su division es %d", division); printf("El resto de la division es %d", resto); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 1.7.1c */ /* s010701c.c */ /* */ /* Comparar (a+b)(a-b) */ /* con a2-b2 */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int a, b; printf("Introduce el primer numero "); scanf("%d", &a); printf("Introduce el segundo numero "); scanf("%d", &b); printf("Suma por diferencia: %d", (a+b)*(a-b) ); printf("Diferencia de cuadrados: %d", a*a - b*b ); }
Apartado 2.1.1: Multiplicar dos números de 4 cifras que teclee el usuario, usando el modificador “long”.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.1.1 */ /* s020101.c */ /* */ /* Multiplicar dos nums */ /* de 4 cifras, con long */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { long int a, b; printf("Introduce el primer numero "); scanf("%ld", &a); printf("Introduce el segundo numero "); scanf("%ld", &b); printf("Su producto es: %ld", a*b ); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.1.10a */ /* s020110a.c */ /* */ /* Ejemplo de incremento */ /* de numeros enteros */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int x=15, y=-10, z=2147483647; x++; y++; z++; printf("Resultados de incrementar: %d %d %d", x, y, z); }
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;
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.1.10b */ /* s020110b.c */ /* */ /* Resultado de varias */ /* operaciones */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int a, b, c; a=5; b=++a; c=a++; b=b*5; a=a*2; printf("Resultados: %d %d %d ", a, b, c); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.1.11a */ /* s020111a.c */ /* */ /* Ejemplo de += */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int x=15, y=-10, z=214; x += 12; y += 12; z += 12; printf("Resultados de incrementar: %d %d %d", x, y, z); }
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;
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.1.11b */ /* s020111b.c */ /* */ /* Resultado de varias */ /* operaciones */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int a, b, c; a=5; b=a+2; b-=3; c=-3; c*=2; ++c; a*=b; printf("Resultados: %d %d %d ", a, b, c); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.2.2a */ /* s020202a.c */ /* */ /* Dividir dos reales de */ /* doble precisión */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { double a, b; printf("Introduce el primer numero "); scanf("%lf", &a); printf("Introduce el segundo numero "); scanf("%lf", &b); printf("Su división es : %.3lf", a/b ); }
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.2.2b */ /* s020202b.c */ /* */ /* Pedir x,y,z (reales, */ /* simple precisión), y */ /* mostrar el mayor */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { float x, y, z; float mayor; printf("Introduce el primer numero "); scanf("%f", &x); printf("Introduce el segundo numero "); scanf("%f", &y); printf("Introduce el tercer numero "); scanf("%f", &z); if ((x > y) && (x > z)) mayor = x; else if (y > z) mayor = y; else mayor = z; printf("El mayor es: %f", mayor ); }
Apartado 2.3: Descubrir cual es el espacio ocupado por un “int” en el sistema operativo y compilador que utilizas.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.3 */ /* s0203.c */ /* */ /* Espacio ocupado por un */ /* "int" */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { printf("Espacio ocupado por un int: %d", sizeof(int) ); }
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".
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 2.5.1 */ /* s020501.c */ /* */ /* Pedir al usuario 4 */ /* letras, mostrarlas en */ /* orden inverso y entre */ /* comillas */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { char letra1, letra2, letra3, letra4; printf("Introduce la primera letra: "); scanf("%c%c", &letra1); printf("Introduce la segunda letra: "); scanf("%c%c", &letra2); printf("Introduce la tercera letra: "); scanf("%c%c", &letra3); printf("Introduce la cuarta letra: "); scanf("%c%c", &letra4); printf("Al reves quedan como \"%c%c%c%c\"", letra4, letra3, letra2, letra1 ); }
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) ...
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.1.1a */ /* s030101a.c */ /* */ /* Ver si un numero es */ /* par */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int x; printf("Escribe un numero: "); scanf("%d", &x); if (x%2 == 0) printf("Es un numero par."); if (x%2 != 0) printf("Es un numero impar."); }
Apartado 3.1.1b: Crear un programa que pida al usuario dos números enteros y diga cual es el mayor de ellos.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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).
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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".
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.1.3b */ /* s030103b.c */ /* */ /* Dividir... solo si es */ /* posible */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { float x, y; printf("Escribe un numero: "); scanf("%f", &x); printf("Escribe otro numero: "); scanf("%f", &y); if (y==0) printf("Error: No se puede dividir entre cero."); if (y!=0) printf("El resultado de su division es %f", x/y); }
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")
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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")
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.1.4b */ /* s030104b.c */ /* */ /* Dividir... solo si es */ /* posible (usa "else") */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { float x, y; printf("Escribe un numero: "); scanf("%f", &x); printf("Escribe otro numero: "); scanf("%f", &y); if (y==0) printf("Error: No se puede dividir entre cero."); else printf("El resultado de su division es %f", x/y); }
Apartado 3.1.5a: Crear un programa que pida una letra al usuario y diga si se trata de una vocal.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.1.5a */ /* s030105a.c */ /* */ /* Ver si una letra es */ /* una vocal */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { char x; printf("Introduce una letra en minusculas: "); x = getchar(); if ( (x=='a') || (x=='e') || (x=='i') || (x=='o') || (x=='u') ) printf("Es una vocal."); else printf("No es 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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
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.
/* Queda propuesto, por ser muy parecido a otros ya resueltos */
Apartado 3.1.9c: Usar el operador condicional para calcular el mayor de dos números.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.1.9c */ /* s030109c.c */ /* */ /* Mayor de dos numeros */ /* con operador condic. */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int a, b, mayor; printf("Escribe un numero: "); scanf("%d", &a); printf("Escribe otro numero: "); scanf("%d", &b); mayor = (a>b) ? a : b; printf("El mayor es %d", mayor); }
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.
/* Ejercicio sin resolver por ahora */
Apartado 3.2.1b: Crea un programa que escriba en pantalla los números del 1 al 10, usando “while”.
/* Ejercicio sin resolver por ahora */
Apartado 3.2.1c: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando “while”.
/* Ejercicio sin resolver por ahora */
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).
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 3.2.1d */ /* s030201d.c */ /* */ /* Cantidad de cifras de */ /* un entero */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ #include <stdio.h> main() { int numero; int cifras = 1; printf("Introduce un numero: "); scanf("%d", &numero); while(numero >= 10) { numero /= 10; cifras ++; } printf("El numero tiene %d cifras\n", cifras); }
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).
/* Ejercicio sin resolver por ahora */
Apartado 3.2.2b: Crea un programa que escriba en pantalla los números del 1 al 10, usando "do..while".
/* Ejercicio sin resolver por ahora */
Apartado 3.2.2c: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "do..while".
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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--).
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
Apartado 3.2.3c: Crear un programa que muestre las letras de la Z (mayúscula) a la A (mayúscula, descendiendo).
/* Ejercicio sin resolver por ahora */
Apartado 3.2.3d: Crear un programa que escriba en pantalla la tabla de multiplicar del 5.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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”).
/* Ejercicio sin resolver por ahora */
Apartado 4.2a: Un programa que pida al usuario un número hexadecimal y muestre su equivalente en base 10.
/* Ejercicio sin resolver por ahora */
Apartado 4.2b: Un programa que pida al usuario un número octal y muestre su equivalente en base 10.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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”).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
Apartado 5.1.1c: Un programa que pida al usuario 10 números enteros y calcule (y muestre) cuál es el mayor de ellos.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
Apartado 5.1.4a: 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.
/* Ejercicio sin resolver por ahora */
Apartado 5.1.4b: Crear un programa que pida al usuario 10 números y luego los muestre en orden inverso (del último al primero).
/* Ejercicio sin resolver por ahora */
Apartado 5.1.4c: 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.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
Apartado 5.2.4: 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”.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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".
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
Apartado 5.4a: 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).
/* Ejercicio sin resolver por ahora */
Apartado 5.4b: 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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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”).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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”).
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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()”).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/*-------------------------*/ /* Solucion al ejercicio */ /* propuesto 6.4c */ /* s0604c.c */ /* */ /* Agenda con capacidad */ /* para 100 datos */ /* */ /* Curso de C, */ /* Nacho Cabanes */ /*-------------------------*/ /* Enunciado completo: 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. */ #include <stdio.h> #include <string.h> main() { struct { char nombre [81]; char direccion [81]; char tlfMovil[13]; char email[51]; unsigned short int diaNac, mesNac, anyoNac; } ficha [100]; FILE* fichero; /* El fichero con los datos */ int ultimaFicha = -1; /* Ultima ficha. Inicialmente -1 porque no hay ninguna */ char linea[200]; /* Para leer de fichero o teclado linea a linea */ int opcion; /* La opcion escogida del menu */ int i; /* Para recorrer los datos con "for" */ /* Abro fichero... si existe */ fichero = fopen("agenda.dat", "rt"); if (fichero != NULL) { puts("Leyendo datos..."); while (! feof(fichero)) { /* Intento leer cada dato, y lo guardo si lo he conseguido */ fgets(linea, 80, fichero); if (feof(fichero)) break; /* Si no he podido, interrumpo */ if (strlen(linea) > 0) /* Quito el \n del final de la linea */ linea[strlen(linea) -1] ='\0'; strcpy(ficha[ultimaFicha+1].nombre, linea); fgets(linea, 80, fichero); if (feof(fichero)) break; if (strlen(linea) > 0) linea[strlen(linea) -1] ='\0'; strcpy(ficha[ultimaFicha+1].direccion, linea); fgets(linea, 12, fichero); if (feof(fichero)) break; if (strlen(linea) > 0) linea[strlen(linea) -1] ='\0'; strcpy(ficha[ultimaFicha+1].tlfMovil, linea); fgets(linea, 50, fichero); if (feof(fichero)) break; if (strlen(linea) > 0) linea[strlen(linea) -1] ='\0'; strcpy(ficha[ultimaFicha+1].email, linea); fgets(linea, 20, fichero); puts(linea); if (feof(fichero)) break; sscanf(linea, "%hd %hd %hd", &ficha[ultimaFicha+1].diaNac, &ficha[ultimaFicha+1].mesNac, &ficha[ultimaFicha+1].anyoNac); /* Si pude leer todo, hay una ficha mas */ ultimaFicha ++; } fclose(fichero); } printf("Leidos %d datos", ultimaFicha+1); /* Parte repetitiva de manipulacion */ do { /* Muestro el menú y pido opciones */ puts("\n\n Agenda, version 0.01\n"); puts("Elija una opcion"); puts("1.- Nuevo dato"); puts("2.- Ver datos existentes"); puts("3.- Ver detalles de una persona"); puts("0.- Terminar"); scanf("%d", &opcion); getchar(); /* Absorbo la tecla "intro" */ switch (opcion) { case 1: /* Añadir un nuevo dato */ puts ("Añadiendo datos..."); printf ("Introduce nombre: "); gets (ficha[ultimaFicha+1].nombre); printf ("Introduce direccion: "); gets (ficha[ultimaFicha+1].direccion); printf ("Introduce movil: "); gets (ficha[ultimaFicha+1].tlfMovil); printf ("Introduce correo electronico: "); gets (ficha[ultimaFicha+1].email); printf ("Introduce dia de nacimiento: "); gets (linea); sscanf (linea, "%hd", &ficha[ultimaFicha+1].diaNac); printf ("Introduce mes de nacimiento: "); gets (linea); sscanf (linea, "%hd", &ficha[ultimaFicha+1].mesNac); printf ("Introduce año de nacimiento: "); gets (linea); sscanf (linea, "%hd", &ficha[ultimaFicha+1].anyoNac); ultimaFicha ++; break; case 2: /* Ver todos los nombres */ puts ("Fichas existentes:"); for (i=0; i<=ultimaFicha; i++) puts (ficha[i].nombre); break; case 3: /* Ver todos los datos de una persona */ printf ("Nombre a buscar? "); gets (linea); for (i=0; i<=ultimaFicha; i++) if (strcmp (linea, ficha[i].nombre) == 0) { puts (ficha[i].nombre); puts (ficha[i].direccion); puts (ficha[i].tlfMovil); puts (ficha[i].email); printf("%hd %hd %hd\n", ficha[i].diaNac, ficha[i].mesNac, ficha[i].anyoNac); } break; } } while (opcion != 0); // Finalmente, guardo los cambios fichero = fopen("agenda.dat", "wt"); puts("Guardando datos..."); for (i=0; i<=ultimaFicha; i++) { fprintf (fichero, "%s\n", ficha[i].nombre); fprintf (fichero, "%s\n", ficha[i].direccion); fprintf (fichero, "%s\n", ficha[i].tlfMovil); fprintf (fichero, "%s\n", ficha[i].email); fprintf (fichero, "%hd %hd %hd\n", ficha[i].diaNac, ficha[i].mesNac, ficha[i].anyoNac); } fclose(fichero); printf("Terminado."); }
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
Apartado 6.8a: Mejorar la agenda anterior, para guardar y leer cada “ficha” (struct) de una vez, usando fwrite/fread y sizeof, como en el último ejemplo.
/* Ejercicio sin resolver por ahora */
Apartado 6.8b: 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”.
/* Ejercicio sin resolver por ahora */
Apartado 6.8c: 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.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
Apartado 7.4a: Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.
/* Ejercicio sin resolver por ahora */
Apartado 7.4b: 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.
/* Ejercicio sin resolver por ahora */
Apartado 7.4c: Crear una función que calcule cual es el menor de dos números enteros. El resultado será otro número entero.
/* Ejercicio sin resolver por ahora */
Apartado 7.4d: 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.
/* Ejercicio sin resolver por ahora */
Apartado 7.4e: 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”
/* Ejercicio sin resolver por ahora */
Apartado 7.4f: 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”.
/* Ejercicio sin resolver por ahora */
Apartado 7.5a: Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.
/* Ejercicio sin resolver por ahora */
Apartado 7.5b: 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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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
****
***
**
*
/* Ejercicio sin resolver por ahora */
Apartado 7.9.1a: Crear un programa que genere un número al azar entre 1 y 100. El usuario tendrá 6 oportunidades para acertarlo.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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
/* Ejercicio sin resolver por ahora */
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 • 3 = 125). Esta función se debe crear de forma recursiva.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
Apartado 7.10d: Crear un programa que emplee recursividad para calcular la suma de los elementos de un vector.
/* Ejercicio sin resolver por ahora */
Apartado 7.10e: Crear un programa que emplee recursividad para calcular el mayor de los elementos de un vector.
/* Ejercicio sin resolver por ahora */
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").
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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”.
/* Ejercicio sin resolver por ahora */
Apartado 9.10a: Implementa una lista doble enlazada que almacene números enteros.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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).
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
Apartado 10.5.4a: Amplía el ejercicio de la nave, para que emplee un doble buffer que permita evitar parpadeos.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
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.
/* Ejercicio sin resolver por ahora */
Apartado 10.5.5d: Ampliar el ejercicio anterior, para añadir la posibilidad de que nuestro personaje “dispare”.
/* Ejercicio sin resolver por ahora */
Apartado 10.5.5e: Ampliar el ejercicio anterior, para que si un “disparo” toca a un “enemigo”, éste deje de dibujarse.
/* Ejercicio sin resolver por ahora */
Apartado 10.5.5f: Ampliar el ejercicio anterior, para que la partida termine si un “enemigo” toca a nustro personaje.
/* Ejercicio sin resolver por ahora */