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.

2006-2007.


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:

Solución.

Pedir tres números por el teclado y mostrarlos por la pantalla ordenados de mayor a menor, intercambiando los valores de las variables adecuadas.

Solución.

Mostrar la fecha siguiente a una dada.

Solución.

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:

Solución.

Los dos últimos ejercicios en un mismo pdf a dos columnas.

Ejemplos de bucles:

Ejemplos iniciales.


Ejemplos con bucles anidados.


Todos los ejemplos anteriores en un pdf a dos columnas ejercicios_bucles.pdf

Ejemplos de vectores.

Los ejemplos anteriores en un pdf a dos columnas ejercicios_vectores.pdf



Ejemplos introductorios de funciones.


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.

Los ejercicios anteriores en un mismo pdf a dos columnas. ejercicios_funciones.pdf

NUEVO Ejemplos de enumeraciones, estructuras y clases.