La dificultad de los ejercicios se irá incrementando conforme vaya avanzando en los temas (espero que un tema cada dos días como mucho xD), y diré con cada ristra de ejercicios que está y que no está permitido utilizar, ya que puede ser anterior al tema donde se dan los vectores o recursividad, por poner un ejemplo. Si alguien está interesado, podría pasarle por privado los pdf's de cada tema o del tema en concreto.
Citar
Tema 1
En este tema se hace una introducción a C++, se ven los tipos de datos simples, las constantes, variables y asignaciones, la entrada y salida básicas, el flujo de control, las expresiones lógicas o booleanas y las estructuras de selección (if y switch) e iteración (while, do-while, for). También se hace mención al control de errores y excepciones, pero no pone mucho interés en ello, se puede obviar xD
Ejercicios Tema 1
1.- Confecciona un bucle que lea de teclado un texto carácter a carácter hasta localizar un punto, y que al final dé como salida el número de comas encontradas, y el número de caracteres leídos.
2.- Diseña un algoritmo que determine si la cadena 'abc' aparece en una sucesión de caracteres cuyo final viene dado por un punto.
3.- Diseña un algoritmo que lea un número n por teclado y calcule el n-ésimo número de la serie de Fibonacci. Los dos primeros números de esta serie son el cero y el uno, y a partir de éstos cada número se calcula realizando la suma de los dos anteriores.
4.- Escribe un algoritmo que encuentre el mayor, el menor y la media aritmética de una colección de N números leídos por el teclado donde N es el primero de los números.
5.- Escribe un algoritmo que lea una lista de números enteros terminada en 0, y que encuentre y escriba en la pantalla la posición de la primera y de la última ocurrencia del número 12 dentro de la lista. Si el número 12 no está en la lista, el algoritmo debería escribir 0. Por ejemplo, si el octavo número de la lista es el único 12, entonces 8 sería la primera y la última posición de las ocurrencias de 12.
6.- Desarrolla un algoritmo para el siguiente juego:
El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango. El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador propondrá otro número hasta que lo acierte.
(Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador, somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD)
7.- Desarrollar un algoritmo para el siguiente juego:
El usuario introduce un número natural n que representa a n objetos. La máquina decide quien empieza y alternativamente, el usuario y la máquina retiran cada uno 1, 2 o 3 objetos (es decir, elige restar 1, 2 o 3 a n). El que retira el último objeto pierde.
En las condiciones del problema, es posible desarrollar un algoritmo para que siempre gane la máquina. Construir tal algoritmo.
En este tema se hace una introducción a C++, se ven los tipos de datos simples, las constantes, variables y asignaciones, la entrada y salida básicas, el flujo de control, las expresiones lógicas o booleanas y las estructuras de selección (if y switch) e iteración (while, do-while, for). También se hace mención al control de errores y excepciones, pero no pone mucho interés en ello, se puede obviar xD
Ejercicios Tema 1
1.- Confecciona un bucle que lea de teclado un texto carácter a carácter hasta localizar un punto, y que al final dé como salida el número de comas encontradas, y el número de caracteres leídos.
2.- Diseña un algoritmo que determine si la cadena 'abc' aparece en una sucesión de caracteres cuyo final viene dado por un punto.
3.- Diseña un algoritmo que lea un número n por teclado y calcule el n-ésimo número de la serie de Fibonacci. Los dos primeros números de esta serie son el cero y el uno, y a partir de éstos cada número se calcula realizando la suma de los dos anteriores.
4.- Escribe un algoritmo que encuentre el mayor, el menor y la media aritmética de una colección de N números leídos por el teclado donde N es el primero de los números.
5.- Escribe un algoritmo que lea una lista de números enteros terminada en 0, y que encuentre y escriba en la pantalla la posición de la primera y de la última ocurrencia del número 12 dentro de la lista. Si el número 12 no está en la lista, el algoritmo debería escribir 0. Por ejemplo, si el octavo número de la lista es el único 12, entonces 8 sería la primera y la última posición de las ocurrencias de 12.
6.- Desarrolla un algoritmo para el siguiente juego:
El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango. El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador propondrá otro número hasta que lo acierte.
(Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador, somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD)
7.- Desarrollar un algoritmo para el siguiente juego:
El usuario introduce un número natural n que representa a n objetos. La máquina decide quien empieza y alternativamente, el usuario y la máquina retiran cada uno 1, 2 o 3 objetos (es decir, elige restar 1, 2 o 3 a n). El que retira el último objeto pierde.
En las condiciones del problema, es posible desarrollar un algoritmo para que siempre gane la máquina. Construir tal algoritmo.
Citar
Tema 2
En este tema se ve el diseño descendente, procedimientos y funciones (definición y declaración, llamada, parámetros reales y formales, paso de parámetros por valor y por referencia, interfaz, criterios de modularización, variables locales y globales y precondiciones y postcondiciones) y recursividad.
Lo mismo que en el tema anterior, si hay alguien interesado en el pdf, que lo pida y se lo paso.
Ejercicios Tema 2
1.- Escribe un programa que lea un número natural N por teclado y dibuje un triángulo de asteriscos con base y altura N. Por ejemplo, si N=5 debería dibujar:
*
* *
* * *
* * * *
* * * * *
2.- Escribe un programa que tome como entrada desde teclado dos números naturales (mayores que cero) "N" e "i", e imprima en pantalla el dígito que ocupa la posición i-ésima del número N. Si i es mayor que el número de dígitos de N, se escribirá en pantalla -1. Por ejemplo, para N=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1.
3.- Escribe un programa que acepte como entrada desde teclado un número natural mayor que cero y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones simétricas respecto al dígito central dentro del número dado como entrada. Por ejemplo:
para el número: 2354869
la salida es: 2+9=11, 3+6=9, 5+8=13, 4
para el número: 6582
la salida es: 6+2=8, 8+5=13
4.- Dada una sucesión, de longitud indeterminada, de ceros y unos, construir un programa que permita calcular el tamaño de la mayor sucesión ordenada de menor a mayor. La sucesión se lee desde teclado, y el final viene dado por el número 2.
5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an
Por ejemplo 24, 13, 6, 15, 50 sería un valle.
Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos.
6.- El máximo común divisor (mcd) de dos números naturales p y q es el mayor entero d que divide a ambos. Un algoritmo muy conocido para calcularlo es el de Euclides. Éste utiliza dos variables, que contienen inicialmente a cada uno de los números, y trata de hacer que su contenido sea el mismo. Para ello, irá restando la menor a la mayor hasta que ambas contengan el mismo valor. En dicho momento, el valor obtenido en cualquiera de ellas es el máximo común divisor de los dos números iniciales. Por ejemplo, si P=18 y Q=12, el algoritmo hará que P y Q vayan tomando los siguientes valores:
Inicialmente P==18 y Q==12 (P>Q => P=P-Q)
Después P==6 y Q==12 (Q>P => Q=Q-P)
Después P==6 y Q==6 (P==Q => El mcd es 6)
Diseña el algoritmo anterior siguiendo un enfoque recursivo:
unsigned mcd(unsigned P, unsigned Q)
7.- Diseña un procedimiento recursivo que lea una secuencia de caracteres de longitud arbitraria terminada en un punto, y la imprima en orden inverso. El procedimiento no tiene parámetros.
En este tema se ve el diseño descendente, procedimientos y funciones (definición y declaración, llamada, parámetros reales y formales, paso de parámetros por valor y por referencia, interfaz, criterios de modularización, variables locales y globales y precondiciones y postcondiciones) y recursividad.
Lo mismo que en el tema anterior, si hay alguien interesado en el pdf, que lo pida y se lo paso.
Ejercicios Tema 2
1.- Escribe un programa que lea un número natural N por teclado y dibuje un triángulo de asteriscos con base y altura N. Por ejemplo, si N=5 debería dibujar:
*
* *
* * *
* * * *
* * * * *
2.- Escribe un programa que tome como entrada desde teclado dos números naturales (mayores que cero) "N" e "i", e imprima en pantalla el dígito que ocupa la posición i-ésima del número N. Si i es mayor que el número de dígitos de N, se escribirá en pantalla -1. Por ejemplo, para N=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1.
3.- Escribe un programa que acepte como entrada desde teclado un número natural mayor que cero y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones simétricas respecto al dígito central dentro del número dado como entrada. Por ejemplo:
para el número: 2354869
la salida es: 2+9=11, 3+6=9, 5+8=13, 4
para el número: 6582
la salida es: 6+2=8, 8+5=13
4.- Dada una sucesión, de longitud indeterminada, de ceros y unos, construir un programa que permita calcular el tamaño de la mayor sucesión ordenada de menor a mayor. La sucesión se lee desde teclado, y el final viene dado por el número 2.
5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an
Por ejemplo 24, 13, 6, 15, 50 sería un valle.
Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos.
6.- El máximo común divisor (mcd) de dos números naturales p y q es el mayor entero d que divide a ambos. Un algoritmo muy conocido para calcularlo es el de Euclides. Éste utiliza dos variables, que contienen inicialmente a cada uno de los números, y trata de hacer que su contenido sea el mismo. Para ello, irá restando la menor a la mayor hasta que ambas contengan el mismo valor. En dicho momento, el valor obtenido en cualquiera de ellas es el máximo común divisor de los dos números iniciales. Por ejemplo, si P=18 y Q=12, el algoritmo hará que P y Q vayan tomando los siguientes valores:
Inicialmente P==18 y Q==12 (P>Q => P=P-Q)
Después P==6 y Q==12 (Q>P => Q=Q-P)
Después P==6 y Q==6 (P==Q => El mcd es 6)
Diseña el algoritmo anterior siguiendo un enfoque recursivo:
unsigned mcd(unsigned P, unsigned Q)
7.- Diseña un procedimiento recursivo que lea una secuencia de caracteres de longitud arbitraria terminada en un punto, y la imprima en orden inverso. El procedimiento no tiene parámetros.
Citar
Tema 3
En este tema se ven los tipos de datos estructurados: Registros, arrays y cadenas de caracteres (tipo string) y la resolución de problemas usando tipos estructurados.
ESTE TEMA ES EL ÚLTIMO DE LA ASIGNATURA.
Ejercicios Tema 3
1.- Diseña un algoritmo que permita invertir el contenido de un array. El algoritmo no podrá utilizar arrays auxiliares. Impleméntalo de forma iterativa y recursiva.
Array Original: 24 12 45 90 7 9 15
Array Invertido: 15 9 7 90 45 12 24
2.- Escriba un programa que efectúe la conversión de un número natural en base 10 a otra determinada base, sabiendo que el resultado no sobrepasará los 50 dígitos. El usuario introducirá primero el número en base 10 y después la base a la que convertirlo (el programa debe asegurarse de que la base no sea ni menor de 2 ni mayor de 9)
3.- Diseña un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la frecuencia con la que aparece cada una de las letras del texto.
4.- Dados los siguientes tipos (para una constante MAX cualquiera):
b) Diseña una función booleana que dados dos registros de tipo Vector como parámetros devuelva TRUE si son iguales y FALSE en otro caso. Dos vectores son iguales si contienen los mismos elementos y en el mismo orden relativo, suponiendo que el primer elemento sigue al último. Por ejemplo, si los arrays fueran:
['A', 'C', 'D', 'F', 'E']
['D', F', 'E', 'A', 'C']
la función devolvería TRUE.
Supón, además, que cada carácter aparece a lo sumo una vez.
c) Diseña un procedimiento que tome como parámetros de entrada dos vectores con los arrays ordenados y devuelva (con un perámetro de salida) el vector resultado de realizar la mezcla ordenada de los dos arrays contenidos en los vectores de entrada.
5.- Los alumnos de informática desean celebrar una comida un día del presente mes en el que puedan acudir todos. Se pide realizar un algoritmo que recoja de cada alumno los días que le vendría bien ir a la comida, e imprima las fechas concordantes para todos los alumnos. Los datos se introducirán por teclado, y cada alumno escribirá una única línea con los números de los días libres separados por espacios.
6.- Se tiene un array de enteros. Obtén otro de forma que el contenido de cada elemento del nuevo array sea un índice que nos indique de menor a mayor los valores del array de enteros. El array original no se podrá modificar, ni se puede hacer copia del mismo. Por ejemplo:
[10,5,-7,0,12] ---> [2,3,1,0,4]
7.- La distancia entre dos letras en un texto es el número de letras que aparecen en el texto entre las dos letras indicadas. Diseñe un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la máxima distancia entre cada par de letras repetidas. Aquellas letras que no se repitan no aparecerán en la salida.
Por ejemplo:
- Texto de entrada: ABEADDGLAKE.
- Salida:
· Distancia entre A: 4
· Distancia entre D: 0
· Distancia entre E: 7
8.- Diseña un algoritmo para calcular la suma de los elementos de la diagonal principal de una matriz cuadrada.
9.- Una matriz tiene un punto silla en una de sus componentes, si ese componente es el mayor valor de su columna y el menor de su fila. Diseña un algoritmo que recogiendo de teclado los componentes de una matriz cuadrada de enteros de hasta un máximo de 10x10, muestre en la pantalla las coordenadas de todos sus puntos silla.
10.- Diseñe un algoritmo que lea de teclado un texto y muestre un listado por pantalla de todas las palabras del texto que comiencen por ciertas iniciales. Dichas iniciales serán las letras que formen la primera palabra del texto.
NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas)
- El carácter separador de palabras es el espacio en blanco.
11.- Diseñe un algoritmo que lea de teclado un patrón (una cadena de caracteres) y un texto, y dé como resultado las palabras del texto que contenga a dicho patrón. En la salida no habrá palabras repetidas. Ejemplo:
·Patrón: RE
·Texto: CREO QUE IREMOS A LA DIRECCION QUE NOS DIERON AUNQUE PIENSO QUE DICHA DIRECCION NO ES CORRECTA FIN
·Salida: CREO IREMOS DIRECCION CORRECTA
NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN.
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas).
- El caracter separador de palabras es el espacio en blanco.
- En el texto aparecerán un número máximo MAX_PAL_DIST (una constante) de palabras distintas.
12.- Una farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos:
- void LeerProducto(TProducto& p)
- void EscribirProducto(const TProducto& p)
- void InicializarFarmacia(TFarmacia& f)
void InsertarProducto(TFarmacia& f, const TProducto& p)
- void BorrarProducto(TFarmacia& f, unsigned codigo)
- void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p)
- void ListarFarmacia(const TFarmacia& f)
En este tema se ven los tipos de datos estructurados: Registros, arrays y cadenas de caracteres (tipo string) y la resolución de problemas usando tipos estructurados.
ESTE TEMA ES EL ÚLTIMO DE LA ASIGNATURA.
Ejercicios Tema 3
1.- Diseña un algoritmo que permita invertir el contenido de un array. El algoritmo no podrá utilizar arrays auxiliares. Impleméntalo de forma iterativa y recursiva.
Array Original: 24 12 45 90 7 9 15
Array Invertido: 15 9 7 90 45 12 24
2.- Escriba un programa que efectúe la conversión de un número natural en base 10 a otra determinada base, sabiendo que el resultado no sobrepasará los 50 dígitos. El usuario introducirá primero el número en base 10 y después la base a la que convertirlo (el programa debe asegurarse de que la base no sea ni menor de 2 ni mayor de 9)
3.- Diseña un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la frecuencia con la que aparece cada una de las letras del texto.
4.- Dados los siguientes tipos (para una constante MAX cualquiera):
Código
a) La moda de un array de caracteres es el carácter del array que se repite más frecuentemente. Si varios caracteres se repiten con la misma frecuencia máxima, entonces no hay moda. Escribe un procedimiento con tres parámetros. El primero es de entrada para recibir un registro de tipo Vector que contiene el array datos con tam caracteres. El segundo parámetro es de salida e indicará si se ha encontrado la moda en el array o no. El tercer parámetro es de salida y será el carácter que representa la moda (si es que existe).
typedef char Componentes[MAX] struct Vector{ Componentes datos; //array de caracteres unsigned tam //numero de celdas ocupadas };
b) Diseña una función booleana que dados dos registros de tipo Vector como parámetros devuelva TRUE si son iguales y FALSE en otro caso. Dos vectores son iguales si contienen los mismos elementos y en el mismo orden relativo, suponiendo que el primer elemento sigue al último. Por ejemplo, si los arrays fueran:
['A', 'C', 'D', 'F', 'E']
['D', F', 'E', 'A', 'C']
la función devolvería TRUE.
Supón, además, que cada carácter aparece a lo sumo una vez.
c) Diseña un procedimiento que tome como parámetros de entrada dos vectores con los arrays ordenados y devuelva (con un perámetro de salida) el vector resultado de realizar la mezcla ordenada de los dos arrays contenidos en los vectores de entrada.
5.- Los alumnos de informática desean celebrar una comida un día del presente mes en el que puedan acudir todos. Se pide realizar un algoritmo que recoja de cada alumno los días que le vendría bien ir a la comida, e imprima las fechas concordantes para todos los alumnos. Los datos se introducirán por teclado, y cada alumno escribirá una única línea con los números de los días libres separados por espacios.
6.- Se tiene un array de enteros. Obtén otro de forma que el contenido de cada elemento del nuevo array sea un índice que nos indique de menor a mayor los valores del array de enteros. El array original no se podrá modificar, ni se puede hacer copia del mismo. Por ejemplo:
[10,5,-7,0,12] ---> [2,3,1,0,4]
7.- La distancia entre dos letras en un texto es el número de letras que aparecen en el texto entre las dos letras indicadas. Diseñe un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la máxima distancia entre cada par de letras repetidas. Aquellas letras que no se repitan no aparecerán en la salida.
Por ejemplo:
- Texto de entrada: ABEADDGLAKE.
- Salida:
· Distancia entre A: 4
· Distancia entre D: 0
· Distancia entre E: 7
8.- Diseña un algoritmo para calcular la suma de los elementos de la diagonal principal de una matriz cuadrada.
9.- Una matriz tiene un punto silla en una de sus componentes, si ese componente es el mayor valor de su columna y el menor de su fila. Diseña un algoritmo que recogiendo de teclado los componentes de una matriz cuadrada de enteros de hasta un máximo de 10x10, muestre en la pantalla las coordenadas de todos sus puntos silla.
10.- Diseñe un algoritmo que lea de teclado un texto y muestre un listado por pantalla de todas las palabras del texto que comiencen por ciertas iniciales. Dichas iniciales serán las letras que formen la primera palabra del texto.
NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas)
- El carácter separador de palabras es el espacio en blanco.
11.- Diseñe un algoritmo que lea de teclado un patrón (una cadena de caracteres) y un texto, y dé como resultado las palabras del texto que contenga a dicho patrón. En la salida no habrá palabras repetidas. Ejemplo:
·Patrón: RE
·Texto: CREO QUE IREMOS A LA DIRECCION QUE NOS DIERON AUNQUE PIENSO QUE DICHA DIRECCION NO ES CORRECTA FIN
·Salida: CREO IREMOS DIRECCION CORRECTA
NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN.
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas).
- El caracter separador de palabras es el espacio en blanco.
- En el texto aparecerán un número máximo MAX_PAL_DIST (una constante) de palabras distintas.
12.- Una farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos:
- void LeerProducto(TProducto& p)
- void EscribirProducto(const TProducto& p)
- void InicializarFarmacia(TFarmacia& f)
void InsertarProducto(TFarmacia& f, const TProducto& p)
- void BorrarProducto(TFarmacia& f, unsigned codigo)
- void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p)
- void ListarFarmacia(const TFarmacia& f)