En esta asignatura soy responsable de
un grupo de teoría y de dos de prácticas.
En mi
grupo de teoría utilizo estos apuntes.
Además
he preparado una colección de problemas cuyos enunciados están
disponibles aquí. Dada la
importante cantidad de ejercicios de examen de que se dispone, se
hará un uso marginal de este documento.
Para trabajar
en casa puedes utilizar dev-cpp
como Entorno Integrado de Desarrollo. Es gratuito y ocupa menos de
20MB. He preparado unos apuntes que
explican a nivel introductorio el funcionamiento de este programa. No
imprimir este documento, se ampliará a lo largo del curso. Las
capturas de pantalla se ven mucho mejor en la versión
en html del mismo documento.
Aquí iré
publicando los ejercicios que se hagan en clase y cualquier otro
material que vaya surgiendo a lo largo del curso.
Exámenes de otros años.
Luis
Junco tiene en su página
los exámenes de otros años recopilados en varios
ficheros comprimidos.
En la misma página hay
materiales interesantes en la zona de
descargas.
2003-2004.
2004-2005.
2005-2006.
PRÁCTICAS:
Primera práctica:
Considérese la sucesión obtenida del modo siguiente. Comenzando por un número n, el siguiente término se obtiene sumando el cuadrado de todos los dígitos. Por ejemplo si n es 42 la sucesión será 42, 20, 4, 16, 37, 58, 89, .... Un número se denomina feliz si la sucesión definida de esta forma que comienza en dicho número termina en 1, por ejemplo 103 es feliz dado que la sucesión correspondiente es 103, 10, 1. Escribir un programa que averigüe si un número n es feliz
Nota 1: Por simplicidad, considerar que si tras producir 100 términos no se llega a 1 el número no es feliz.
Vamos a hacer este ejercicio por fases.
I) En primer lugar hacer un programa que pida un entero por el teclado y que muestre la suma de los cuadrados de sus dígitos. Por ejemplo, si se introduce 58 el programa mostrará 89. Usar como referencia el ejercicio resuelto en clase "calcular la suma de las cifras de un número".
II) Utilizando el programa anterior, escribir otro que pida un entero por el teclado y que muestre los m primeros términos de la sucesión construida como se indica en el enunciado de la práctica. Por ejemplo, si el número es 42 y se piden 7 términos, el ordenador mostrará 42, 20, 4, 16, 37, 58, 89.
III) Finalmente escribir un programa que pida un entero por el teclado y muestre por la pantalla si el número es o no feliz.
Segunda práctica:
Escribir un programa que nos diga si un número n es narcisista o no. Se define un número narcisista como aquel que es igual a la suma de sus dígitos elevados al número de cifras del número.
5 = 5^1
Por ejemplo
153=1^3 + 5^3 + 3^3
1634=1^4 + 6^4 + 3^4 + 4^4
I) Escribir un programa que calcule el número de cifras de un número.
II) Escribir un programa que calcule a^b, ambos naturales.
III) Escribir un programa que calcule la suma de los dígitos de un número, elevados al número de cifras.
IV) Escribir el programa que se pide.
Tercera práctica :
Un último ejercicio de bucles:
Calcular el valor de PI utilizando la aproximación de Euler.
Intentar realizar el mínimo número de cálculos, en la línea del ejercicio ex.cpp.
Cuarta práctica:
Para los que habeis visto vectores:
La secuencia de Thue-Morse es una sucesión de Booleanos que se crea de la siguiente forma:
En cada iteración, los elementos existentes se cambian de true a false y viceversa, añadiéndose a la sucesión. El primer elemento es true. El proceso sería como sigue:
Paso 0: {true} (por definición)
Paso 1: {true, false} (se ha cambiado true por false y se ha añadido a la secuencia anterior)
Paso 2: {true, false, false, true} (se ha cambiado true-false por false-true y se ha añadido a la secuencia anterior)
Paso 3: {true, false, false, true, false, true, true, false} (se ha invertido true-false-false-true y se ha añadido a la secuencia anterior)
... (se realizan tantos pasos como se necesiten para obtener la longitud de la sucesión deseada a la secuencia anterior)
Escribir un programa que muestre los n primeros términos de la secuencia indicada, n se pide por el teclado. Por ejemplo, si se piden 6 términos el programa mostrará:
true false false true false true
Obsérvese que puede ser necesario calcular más términos de los que se muestran.
Vamos a hacer este ejercicio por fases.
I) Escribir un programa que genere un vector de booleanos a partir de otro, invirtiendo el valor de sus elementos.
II) Escribir un programa que añada a un vector de booleanos otro vector de booleanos.
III) Escribir el programa pedido.
Para los que habeis visto funciones:
Un número es semiprimo si se puede descomponer como producto de dos primos. Escribir un programa que nos diga si un número intoducido por el teclado es semiprimo y además, si lo es, escriba en pantalla los factores primos que multiplicados producen dicho número.
Vamos a hacer este ejercicio por fases.
I) Escribir una función que devuelva true si el número que se pasa como parámetro es primo, false en caso contrario. Escribir un programa de prueba y comprobar el funcionamiento de dicha función.
II) Escribir un programa que pida un número por el teclado y muestre por la pantalla todas las parejas de números que, multiplicados dan como resultado el número introducido por el teclado.
III) Escribir el programa pedido utilizando la función escrita en I) incorporada al programa escrito en II).
Quinta práctica:
Buscar el mayor
número entero (menor que 45000 por cuestiones de rango) cuyo
cuadrado se escriba con dígitos distintos. (Ejercicio de
examen)
Ejemplos de cuadrados que cumplen esa condición :
13^2 = 169 286^2=81796 32043^2=1026753849.
Vamos a hacer este ejercicio por fases.
Para los que no habeis visto funciones:
I) Escribir un programa que pida un vector de enteros por el teclado y que muestre por la pantalla si existen elementos repetidos.
II) Escribir un programa que pida un entero por el teclado y que guarde cada una de sus cifras en un elemento de un vector de enteros.
III) La semana que viene hacer el ejercicio que va a continuación.
Para los que habeis visto funciones:
I) Escribir una función que guarde las cifras de un entero que se pasa como parámetro en un vector que se devuelve como más le guste a ud, a su profesor o a ambos, lo que ocurra antes. Escribir un programa de prueba.
II) Escribir una función que reciba un vector como parámetro y que devuelva true si existen elementos repetidos, false en caso contrario. Escribir un programa de prueba.
III) Usando las anteriores escribir una función que devuelva el mayor número entero (menor que 45000 por cuestiones de rango) cuyo cuadrado se escriba con dígitos distintos.
Sexta práctica:
Un número perfecto es aquel que coincide con la suma de todos sus divisores, incluyendo el 1 pero no el propio número (por ejemplo 6 = 1+2+3, 28 = 1+2+4+7+14).
I) Escribir una función que, haciendo uso de la función anterior, devuelva la suma de los divisores de un número (incluyendo el 1 pero no el propio número) que se pasa como parámetro.
II) Escribir una función booleana que devuelva true si el número pasado como argumento es perfecto, false en caso contrario.
III) Escribir un programa que, haciendo uso de la función anterior, muestre por la pantalla los números perfectos menores que 10000.
IV) Escribir una función que devuelva en un vector que se pasa por referencia los n primeros números perfectos, n se pasa también como parámetro. Escribir un programa que utilice la función anterior, mostrando los cuatro primeros números perfectos.
Séptima práctica:
Escribir una función que calcule la longitud de una ruta tomando como datos las coordenadas proporcionadas por un GPS, en el sistema UTM. En este sistema los puntos de la corteza terrestre se proyectan en un plano, de modo que la distancia entre dos puntos se puede calcular mediante la trigonometría habitual, no se necesita hacer cálculos usando trigonometría esférica.
En cuanto veamos clases, lo convertiremos en uno de los ejercicios de examen del 2006-2007. Utilizar este siguiente guion , en donde se especifican las funciones que hay que implementar.
En la siguiente figura se muestra un ejemplo.
La trayectoria sería el vector<vector<float> > w.w[0][0] es la componente x del primer punto, w[1][0] es la coordenada x del segundo punto. Análogamente w[0][1] y w[1][1] son las componentes y del primer y segundo punto respectivamente. Para cada tramo se calcula su longitud como se indica en la siguente figura. La longitud total es la suma de las longitudes de todos los tramos.
Octava práctica:
Escribir el programa anterior utilizando una clase. Usar este guión ruta_c0_guion.cpp.
Novena práctica:
Trata de modificar el ejercicio introductorio de clases (clase complejo) visto en teoria, añadiendo funciones y operadores. Utilizar este guión..
NUEVO Décima práctica:
Vuelta de tuerca al ejercicio de la ruta, guión incluyendo explicación.
Opcional, para los/las que os gusten los juegos de lógica:
Hacer una implementación sencilla del Sokobán (no me molesto en poner un link, seguro que lo encontrais, hay un artículo en la ... SI!! la Wikipedia). En parte fue ejercicio de examen. Usar este guión.
TEORÍA:
Transparencias:
Introducción, para imprimir, para ver en el ordenador.
Estructuras básicas de algoritmos y de datos, parte I, para imprimir, para ver en el ordenador.
Estructuras básicas de algoritmos y de datos, parte II, para imprimir, para ver en el ordenador.
Estructuras básicas de algoritmos y de datos, parte III, para imprimir, para ver en el ordenador.
Programa de ejemplo. Fuente, para imprimir: pdf a dos columnas.
Definición de acciones no primitivas, parte I, para imprimir, para ver en el ordenador.
Definición de acciones no primitivas, parte II (Recursividad y un par de cosas más), para imprimir, para ver en el ordenador.
NUEVO Definición de nuevos tipos de datos, parte I, para imprimir, para ver en el ordenador.
PROBLEMAS:
Ejemplos para if-else switch:
Resolver una ecuación de segundo grado considerando todos los casos posibles, si la ecuación tiene la forma ax^2+bx+c=0, se piden a, b y c por el teclado y:
Si a es cero, se resuelve la ecuación que en realidad es lineal. Además si b es cero entonces no hay solución.
Si a no es cero se analiza el valor del discriminante y en función de este habrá solución real doble, dos soluciones reales o dos soluciones complejas conjugadas. En este último caso, calcular la parte real e imaginaria por separado y mostrarlas por la pantalla en notación cartesiana.
Pedir tres números por el teclado y mostrarlos por la pantalla ordenados de mayor a menor, intercambiando los valores de las variables adecuadas.
Mostrar la fecha siguiente a una dada.
Implementar una calculadora básica de números complejos, con las operaciones aritméticas habituales. Cuidar la presentación de los resultados de modo que:
Si el resultado es i no se muestre 0+1i
Si el resultado es 0 no se muestre 0+0i
Si el resultado es a-bi no se muestre a+-bi
etc.
Los dos últimos ejercicios en un mismo pdf a dos columnas.
Ejemplos de bucles:
Ejemplos iniciales.
Sumar las cifras de un número entero. sumacifras.cpp
Invertir el orden de las cifras de un número entero. reves.cpp
Averiguar si un número es capicúa o no. capicua.cpp
Convertir un número de decimal a binario. d2b.cpp
Obtener los 20 primeros términos de la sucesión de Fibonacci. fibo20.cpp
Aproximación de e^x por una serie, finaliza cuando se alcanza un máximo número de iteraciones o una determinada precisión, lo que suceda antes. Intentar realizar el mínimo número de cálculos posible. ex.cpp
Ejemplos con bucles anidados.
Mostrar los n primeros capicúas, n se pide por el teclado. ncapicua.cpp
Determinar los números menores que 1000 tales que aparecen al final de su cuadrado (ejercicio de examen). xy2xyz.cpp
Determinar cual es la fracción que se aproxima más a PI con el numerador y el denominador menores que 500 (ejercicio de examen). PI1.cpp
Descomponer un número en factores primos.factoresprimos.cpp
Buscar el mayor número
entero (menor que 45000 por cuestiones de rango) cuyo cuadrado se
escriba con dígitos distintos. (Ejercicio de examen)
Ejemplos
de cuadrados que cumplen esa condición : 13^2 = 169
286^2=81796 32043^2=1026753849. cuadrado_digitos_distintos.cpp
Un número perfecto es aquel que coincide con la suma de todos sus divisores, incluyendo el 1 pero no el propio número (por ejemplo 6 = 1+2+3, 28 = 1+2+4+7+14). Escribir un programa que muestre por la pantalla los números perfectos menores que 100. (Ejercicio de examen) perfectos.cpp
Todos los ejemplos anteriores en un pdf a dos columnas ejercicios_bucles.pdf
Ejemplos de vectores.
Suma de los elementos de un vector. sumavector.cpp
Suma vectorial de dos vectores. sumavectorial.cpp
Producto escalar de dos vectores. productoescalar.cpp
Módulo de un vector. modulo.cpp
Máximo de los elementos de un vector. maximov.cpp
Suma de dos matrices. sumamat.cpp
Producto de dos matrices. prodmat.cpp
Tipificar una matriz. tipificamat.cpp
Ejemplos preliminares para entender el siguiente, vectores maximov2.cpp y matrices maximofilcol.cpp.
Determinar la posición del punto de silla de una matriz. silla.cpp
Los ejemplos anteriores en un pdf a dos columnas ejercicios_vectores.pdf
Ejemplos introductorios de funciones.
Mostrar los n primeros capicúas, n se pide por el teclado. ncapicua_f.cpp
Mostrar los n primeros números que contienen la cifra x. ncontienex_f.cpp
Buscar el mayor número entero (menor que 45000 por
cuestiones de rango) cuyo cuadrado se escriba con dígitos
distintos. (Ejercicio de examen, versión con
funciones)
Ejemplos de cuadrados que cumplen esa condición
: 13^2 = 169 286^2=81796 32043^2=1026753849.
cuadrado_digitos_distintos_f.cpp
Más ejemplos de funciones, relacionados con los temas de los apuntes "Mecanismos de paso de argumentos" y "Semántica del paso de argumentos". De alguna forma todos han caído en algún examen.
Escribir una función que expurgue las repeticiones de los elementos de un vector de enteros. Varias versiones, usando o no push_back, devolviendo el resultado con return o a través de una referencia no constante. unicos.cpp
Sobrecarga de los operadores *, >> y << para matrices. matop.cpp
Mezcla (merge) de dos vectores ordenados produciendo un tercer vector, también ordenado. mezcla.cpp
Máximo de la suma de elementos contiguos de un vector. suma_maxima_segmento.cpp
Función que comprime un vector de enteros "casi vacío" y su contrapartida, descomprime un vector "casi vacío" (ejercicio de examen). Un vector "casi vacío" es aquel que contiene mayoritariamente elementos nulos. Para ahorrar espacio se guarda el tamaño del vector y (alternativamente) la posición y el contenido de los elementos no nulos en un vector de enteros convencional. Por ejemplo el vector {0,0,0,1,0,0,-7,0,0} se podría guardar como {9,3,1,6,-7}. La función comprime se ha escrito usando push_back y sin usarla. comprime.cpp
Función que devuelve true si la paridad de un vector de booleanos es par, false en caso contrario. La paridad es par si el número de elementos a true es par. vector_par.cpp
Los ejercicios anteriores en un mismo pdf a dos columnas. ejercicios_funciones.pdf
NUEVO Ejemplos de enumeraciones, estructuras y clases.
Programa que muestra las 40 cartas de la baraja española en orden aleatorio (barajadas). Se definen enumeraciones para la figura y para el palo y cada carta es una estructura cuyos campos son enumeraciones de los tipos anteriores. barajaf.cpp. El ejercicio tal y como se llevó a clase baraja.pdf.
Esquema general de implementación y uso de una clase, sin utilizar y utilizando el operador de resolución de ámbito, es decir definiendo las funciones miembro dentro de la clase esquema_clase.pdf y declarando las funciones dentro y definiéndolas fuera esquema_clase_scope.pdf.
Ejemplos de un problema resuelto sin funciones (complejos_pelado.cpp), con funciones (complejos_con_funciones.cpp), con estructuras (complejos_con_estructuras.cpp) y con clases (complejos_con_clases.cpp). Este último se irá refinando en clases sucesivas, a medida que se impartan los conocimientos necesarios para ello. El objetivo es comprender la ventaja que proporciona al programador/a el uso de clases.
Los ejercicios tal y como se llevaron a clase complejos_gradual.pdf.
Puntero this. explica_this.pdf
Ejemplos para ilustrar el concepto de interfaz pública de una clase. complejos_interfaz_publica.pdf
Ejercicios de examen sencillos. Enunciados enunciados_clases_sencillos.pdf y soluciones ejercicios_clases_sencillos.pdf.
Ejemplos y explicación para destructores, operador de asignación, constructor de copia, cuando se usa memoria dinamica.
Ejemplo de tipo paramétrico (template) clase par de T1 y T2.
Ejemplo de composición (examen), clase punto2d y clase segmento.
Ejemplo de composición (examen), clase punto2d y clase circunferencia.
Ejemplo de composición (examen), intervaloR e intervaloR2.
Ejemplo explicativo de herencia. Clase electrodoméstico. Probablemente esté basado en algún ejemplo de los apuntes de la Universidad de Navarra que no es pública, "Aprenda C++ como si estuviera en primero".
Ejemplo con algo más de sentido, por supuesto se le ocurrió a Luis Junco. Clase abstracta función con un método que calcula la integral definida entre dos valores numéricamente. De ella deriva la función polinomio de segundo grado.