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:

Consiste en resolver dos ejercicios que formaban parte de algún examen correspondiente a cursos anteriores.


A.- El enunciado de la conjetura de Goldbach es "Todo número par mayor que 2 puede escribirse como suma de dos números primos". Considerándola cierta, escribir un programa que descomponga un número par en suma de dos números primos.


Utilizar el siguiente esquema:



NOTA: Como primera aproximacion, escribir un programa que muestre todas las posibles descomposiciones de un número en suma de otros dos, mayores que cero, completando este código:


#include<iostream>

using namespace std;

int main()

{

int n,a,b;

cin>>n;

//cuales son los limites del bucle?

for (int i=...;i...;i++)

//cuales son los numeros que suman n?

cout<<...<<'+'<<...<<endl;

}


Después escribir un programa que averigüe si un número es o no primo, completando este código:


#include<iostream>

using namespace std;

int main()

{

int n;

//cual es el valor inicial de es_primo?

bool es_primo=...;

cin>>n;

//cuales son los limites del bucle?

for (int i=...;i...;i++)

//cual es la condicion que se cumple si i es

//divisor de n?

if (...)

//si hay al menos un divisor, que valor toma es_primo?

es_primo=...;

//mostrar si es o no primo

if (...)

cout<<"Es Primo"<<endl;

else

cout<<"No es Primo"<<endl;

}


Finalmente fundir los dos programas en uno para hacer el que se pide.


B.- Escribir un programa que muestre si un número es o no narcisista. Un número es narcisista si es igual a la suma de sus dígitos elevado al número de cifras.


Ejemplo: 153=13+53+33.


Los ejemplos de referencia de la clase de teoría son sumacifras.cpp, reves.cpp, capicua.cpp.


Utilizar el siguiente esquema:

Cuando termine este ejercicio, realizar el siguiente:

Escribir un programa en C++ que muestre los n primeros números narcisistas, n se pide por el teclado.

Ejemplo de referencia ncapicua.cpp.


Segunda práctica:

Consiste en estructurar los programas anteriores utilizando funciones.


A.- Reescribir el programa que descomponía un entero par en suma de dos primos. Utilizar una función que devuelva true si un número es primo y false en caso contrario.


B.- Reescribir el programa que analizaba si un número era o no narcisista. Utilizar las siguientes funciones:

C.- Escribir un programa que muestre los n primeros números narcisistas, n se pide por el teclado.


Tercera práctica:

Problema 2 de Septiembre de 2006.

Buscar el mayor número entero (menor que 45000 por cuestiones de rango) cuyo cuadrado se escriba con dígitos distintos. Ejemplos de cuadrados que cumplen esa condición:

13^2 = 169 286^2=81796 320432=102675384^9

Guión para la práctica.



Por indicación de Su Santidad :-), se incluye un esquema alternativo para la función mayor_blabla más respestuoso con la inviolabilidad del sacrosanto bucle for.

int mayor_blabla(void) {

vector<int> digitos;

//inicializar y declarar i

...;

do {

//actualizar i

...;

//calcular el cuadrado de i y pasarlo a vector

...;

//mientras existan repetidos

}while (...);

return i;

}


Cuarta práctica:

Versa sobre operaciones con matrices y vectores.

Tomando como punto de partida el ejercicio de clase matop.cpp, ampliarlo, añadiendo operaciones.

Escribir un programa que utilice las operaciones anteriores para efectuar el siguiente cálculo:

tipifica(A*B+C')

En donde A, B, C son matrices de dimensiones 3x4, 4x3, 3x3, respectivamente. Comprobar el resultado utilizando Matlab o calculadora.

Si apetece, añadir las operaciones básicas con vectores.


Quinta práctica:

Trata sobre la ley Dont, el método que se utiliza para asignar escaños o concejales a las candidaturas en unas elecciones, en función de los votos recibidos. Cayó en un examen del plan antiguo.

La ley electoral utiliza el sistema DONT para el cálculo del número de candidatos electos de cada una de las candidaturas presentadas.
En primer lugar se eliminan aquellas candidaturas que obtengan menos del 5% del número total de votos.
Seguidamente se construye una tabla en la cual cada columna contiene el número de votos de la candidatura dividido entre 1,2,3... y así sucesivamente, hasta completar P columnas, siendo P el número de candidatos electos. De entre todos estos números se seleccionan los P mayores.


En un pueblo de Asturias con 11 concejales se presentaron 7 candidaturas y cada una de ellas obtuvo los votos reflejados en la columna N de la tabla. Supongamos que no existen votos nulos o blancos. El número total de votos fue pues de 9140, así que se eliminan las candidaturas que obtuvieron menos de 457 votos, para ellos se hacen cero sus votos.


tabla



Los 11 mayores números que aparecen en la tabla son: 3505 ­ 2692 ­ 1753 ­ 1465 ­ 1346 ­ 1168 ­
897 ­ 876 ­ 733 ­ 701 ­ 693 con lo que la candidatura 0 obtuvo cinco concejales, la 2 uno, la 3 tres y
la 5 dos concejales.

NOTA:
En lugar de construir una tabla como la de arriba, es mejor utilizar un vector en el que se almacenen los datos de la primera columna y en cada iteración, se actualizan las casillas correspondientes, es decir, se parte de lo siguiente (después de eliminar los votos de las candidaturas que obtuvieron menos del 5% de los votos):


3505

0

693

2692

0

1465

492


El mayor es 3505, entonces se suma un concejal a la candidatura 0 y se divide 3505 entre 2 (en la tabla aparece redondeado hacia arriba, en la práctica divida entre 2 sin mas). La siguiente vez que se dividan los votos de esta candidatura se hará entre 3. La tabla ahora queda:

1753

0

693

2692

0

1465

492


El mayor ahora es 2692, se suma un concejal a la candidatura 3 y se divide 2692 entre 2, 3505 entre 3 y asi sucesivamente.

En resumen:

Se pide el número de candidaturas y de concejales.
Se pide el número de votos de cada candidatura, se almacenan en un vector.
Se calcula el número total de votos.
Se hace cero el número de votos de las candidaturas que obtienen menos del 5% de votos.
Se repite P veces:

Incrementar en uno el número de concejales de la candidatura con mayor número de votos.
Actualizar la cantidad entre la que se divide
Dividir los votos de cada candidatura entre la cantidad que corresponda.

Utilizar las siguientes funciones para estructurar el ejercicio:

De este modo el programa podría quedar así (no se incluye la declaración y definición de las funciones):


Sexta práctica:

Tres ejercicios propuestos, en función de hasta donde se haya estudiado o visto en clase, escoger dos de ellos.


Séptima práctica:

Resolver el mismo problema de la ruta codificándola como una clase. Seguir este guión.


Octava (y última, que ganas tenía!) práctica:

Resolver el mismo problema de la ruta definiendo la clase punto y la clase ruta (problema de examen). Seguir este guión.


Teoría.

Ejemplos de if, if else y switch.


Ejemplos iniciales de bucles.


Ejemplos con bucles anidados.


Todos los ejemplos anteriores en un pdf a dos columnas ejercicios_clase_1.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_clase2.pdf

Ejemplos de recursividad.

Ejemplos de funciones template.

Los fuentes en un mismo pdf.

Ejemplo de estructuras y enumeraciones.

Ejemplos de clases.