Está en la página 1de 3

Programación 1

(1o de Grados de SE, SI, ST, TT y Tel.)


E.T.S.I. TELECOMUNICACIÓN Febrero 2017
Dpto. de Lenguajes y Ciencias de la Computación
Apellidos, Nombre Ord Grado Grupo Hora Entrega

Instrucciones para
Instrucciones para la la realización
realización deldel examen:
examen:
El código fuente debe guardarse en un fichero con nombre p12feb15.cpp
• El código fuente de cada ejercicio debe guardarse en los ficheros con los nombres siguientes: p1feb17_1.cpp,
Este fichero deberá
p1feb17_2.cpp, comenzar con un comentario con el nombre, apellidos, ordenador, grado y grupo.
p1feb17_3.cpp
Se deben
• Estos respetar
ficheros deberán en comenzar
todo momento
con unlos nombres especificados
comentario con el nombre,enapellidos,
el enunciado (nombres
ordenador, de yficheros,
grado grupo.
• Seidentificadores
deben respetar de tipos
en todoy demomento
subprogramas), ası́ como
los nombres los prototipos
especificados en para los subprogramas
el enunciado (nombresrequeridos.
de ficheros,
identificadores de tipos y de subprogramas), así como los prototipos para los subprogramas requeridos.
El programa resultante deberá compilar correctamente y funcionar según lo especificado en el enunciado.
• Los programas resultantes deberán compilar correctamente y funcionar según lo especificado en el enunciado.
• SeSevalorará
valoraráeluncódigo
códigobien
bienestructurado.
estructurado.
• AlSefinalizar el examen:
proporciona una función main() que deberá incorporarse al fichero p12feb15.cpp para probar los
subprogramas que
– Se deberán subir selos
vayan implementando.
ficheros p1feb17_1.cpp, p1feb17_2.cpp y p1feb17_3.cpp a la tarea especificada
del Campus
Al finalizar Virtual de la asignatura.
el examen:
– Además (salvo en los Mac), se deberán copiar los archivos p1feb17_1.cpp, p1feb17_2.cpp y
•p1feb17_3.cpp
Se deberá subiral eldirectorio
fichero que
de contiene
Windows el [Documentos\examen\p1feb17\]
código fuente del examen (p12feb15.cpp) a lala tarea
(si no existe ruta,
especificada
deberá crearse).del Campus Virtual de la asignatura.
– •SeSedeberá
deberáescribir
copiar ella fichero
hora dequeentrega
contiene el código
(además delfuente
resto del examen
de datos (p12feb15.cpp)
personales) al directorio
en la cabecera del
de Windows [Mis Documentos\examen\p12feb15\]
enunciado del examen y entregar al profesor. (si no existe deberá crearse).
• Se deberá escribir la hora de entrega (además del resto de datos personales) en la cabecera del
enunciado del examen y entregar al profesor.
Ejercicio 1 (2,5 pts)

Defina el tipo Matriz como un array de 6 × 7 números enteros, y diseñe un subprograma para crear un calendario
Enunciado
de un mes genérico en una matriz que se devolverá como parámetro de salida.
El subprograma se denominará calendario. El primer parámetro (m), de salida, es de tipo Matriz. El segundo
1 Diseñe las funciones que se indican a continuación para calcular la raı́z cuadrada de un número
parámetro (ndias), de entrada, es de tipo int y representa el número total de días del mes del calendario (28,
2.5 pts.

29, 30 oreal
31). kElmayor
tercer oparámetro
igual a uno (k de entrada,
(pds), 1) mediante
es deeltipo
algoritmo babilónico
int y representa (nótese
el índice delque
día no se semana
de la puede
utilizar la función pow ni la función sqrt de la biblioteca estándar).
donde comienza el primer día del mes (donde 0 corresponde a Lunes, 1 a Martes, y así sucesivamente hasta 6
que representa al Domingo).
double aprox_inicial(double k)
Si los parámetros son correctos, es decir si 28 ≤ ndias ≤ 31 y 0 ≤ pds ≤ 6, entonces este subprograma rellena la
Diseñe una función que recibe un determinado valor k (k 1) de tipo real y devuelve la
matriz m con los días del mes de forma adecuada, teniendo en cuenta los valores de los parámetros de entrada
estimación del valor inicial x 0 según el método descrito a continuación:
ndias y pds. El resto de casillas del calendario sin días válidos se rellenarán con ceros. Sin embargo, si los
Sea D elson
valores de los parámetros número de dı́gitos
incorrectos, a la laizquierda
entonces matriz sedel punto
rellena decimal del número
completamente con ceros.k.
• Siparámetros
Por ejemplo, para los D es impar, entonces
ndias = 31 y zpds
==(D6 generará
1)/2 y la = 2 ⇤ 10zmatriz:
x0 siguiente
• Si D es par, entonces z = (D 2)/2 y x0 = 6 ⇤ 10z
double raiz_cuadrada(double 0k)1 2 3 4 5 6
0 0 0 0 0 0 0 1
Diseñe una
p función que reciba1 un
2 determinado
3 4 5 6 7 8valor k (k 1) de tipo real y devuelve el
valor de k según el método Babilónico descrito a continuación:
2 9 10 11 12 13 14 15
3 16 17 18 19 20 21 22
A partir del valor de x0 resultado de invocar a la función aprox_inicial, definida
4 23 24 25 26 27 28 29
anteriormente, sobre el número k, se
5 30 31 0 0 itera
0 0el 0siguiente cálculo hasta que la diferencia
entre xn+1 y xn sea menor que un determinado ERROR_DE_PRECISION (= 0.00001)
Diseñe también un programa que permita comprobarxn+1adecuadamente
= (xn + (k/xnla))/2
ejecución del subprograma anterior (lea
de teclado los valores necesarios de los parámetros, invoque al subprograma, y finalmente imprima la matriz
resultado).
1

1
Ejercicio 2 (3,5 pts)

Según el procedimiento ideado por Blaise Pascal, para comprobar si un número n es múltiplo de k, basta con
sumar cada uno de los dígitos de n, previamente multiplicados por unos coeficientes apropiados y calculados en
función de k. El proceso se repite con la cifra resultante de dicha suma hasta obtener una cifra de un solo dígito,
esto es, un número menor que 10 que, si es múltiplo de k indica que n es múltiplo de k.
Por ejemplo, si k = 7, los coeficientes por los que debemos multiplicar las cifras del número n son: 1, 3, 2,
6 y 4 (luego explicaremos cómo se calculan estos coeficientes). Así, si n es, por ejemplo, el número 21756,
para saber si es múltiplo de 7 calculamos la suma de los productos de cada dígito del número 21756 por el
coeficiente correspondiente, empezando por el dígito de las unidades, siguiendo por las decenas, etc. Esto es:
6 × 1 + 5 × 3 + 7 × 2 + 1 × 6 + 2 × 4 = 6 + 15 + 14 + 6 + 8 = 49. Ahora, hacemos lo mismo para el número 49
resultante: 9 × 1 + 4 × 3 = 9 + 12 = 21. Y, por último, para el 21 resultante: 1 × 1 + 2 × 3 = 1 + 6 = 7. De esta
forma hemos obtenido un número de una sola cifra, que es múltiplo de 7 (y en este caso es, precisamente, 7), por
lo que concluímos que el número n = 21756 es múltiplo de k = 7.
Para calcular los coeficientes, sea cual sea k (2 ≤ k ≤ 9), empezamos con un 1. El mecanismo general consiste en
tomar el último coeficiente calculado, multiplicarlo por 10, y calcular el resto de la división entera por k. Así
obtenemos el siguiente coeficiente.
De este modo, siguiendo con el ejemplo de k = 7, tendríamos los coeficientes:
1
1 × 10 mod 7 = 10 mod 7 = 3
3 × 10 mod 7 = 30 mod 7 = 2
2 × 10 mod 7 = 20 mod 7 = 6
6 × 10 mod 7 = 60 mod 7 = 4
Por tanto, los cinco primeros coeficientes para k = 7 son 1, 3, 2, 6, 4.
Si, por poner otro ejemplo, k = 8, los cinco primeros coeficientes resultantes son 1, 2, 4, 0, 0.
Dado este procedimiento explicado como criterio de divisibilidad de n por k, se pide:

a. Implementar la función num_digitos, que recibe un número entero n (>= 0) y devuelve el número de
dígitos que tiene.

b. Implementar la función obtener_digito, que recibe un número entero n (>= 0) y una posición pos (>=
0 y < num_digitos(n)) y devuelve el dígito correspondiente a esa posición, teniendo en cuenta que la
posición menos significativa (más a la derecha) del número es la posición 0.
c. Implementar la función obtener_coeficiente, que recibe un número entero k (>= 2 y <= 9) y una posición
pos (>= 0) y devuelve el coeficiente correspondiente, según el procedimiento de cálculo de coeficientes
explicado arriba. Así, por ejemplo, para k = 7, el coeficiente 0 es un 1, el coeficiente 1 es un 3, el coeficiente
2 es un 2,. . . , el coeficiente 4 es un 4, etc.
d. Implementar la función suma_productos, que recibe dos números enteros n (>= 0) y k (>= 2 y <= 9) y
devuelve la suma de los productos de los dígitos de n y los coeficientes obtenidos de k, según el procedimiento
explicado más arriba. Así, por ejemplo, si recibe n = 21756 y k = 7 debe devolver 49.
e. Implementar la función lógica es_multiplo, que recibe dos números enteros n (>= 0) y k (>= 2 y <= 9) e
indica si n es múltiplo de k, según el procedimiento de Pascal explicado arriba.

2
Ejercicio 3 (4 pts)

Dadas tres listas de números enteros de tamaño variable, encontrar y almacenar los pares de números de las dos
primeras listas (uno de cada lista) cuya suma es igual a algún número de la tercera lista.
Los pares de números que se encuentren deben guardarse en una estructura que permita almacenar: el número
de la primera lista, el de la segunda y la posición en la que se encuentra la suma de esos números en la tercera
lista (teniendo en cuenta que las posiciones en las listas se numeran empezando por cero).
Por ejemplo, para las listas:

lista 1: 1 2
lista 2: 3 4
lista 3: 6 5 8

Salida:

1 4 1
2 3 1
2 4 0

ya que, por ejemplo, para la primera fila de la salida: 1(primera lista) + 4(segunda lista) es igual a 5, y 1 es la
posición en la que el número 5 está en la tercera lista.
Se debe:

1. Definir el tipo de datos TipoLista adecuado para almacenar las tres listas de entrada, de tamaño variable,
siendo 5 el tamaño máximo de cada una de estas listas. Definir el tipo de datos TipoListaSalida adecuado
para almacenar el resultado de la búsqueda. Debe tenerse en cuenta que el tamaño máximo de esta lista es
25 (5x5).
2. Implementear la función posicion_en_lista que recibiendo como parámetros un número y una lista de
TipoLista devuelva la posición en la que está el número en la lista. Si el número no está en la lista,
devolverá -1.
3. Implementar el subalgoritmo crear_lista_salida que recibiendo como parámetros de entrada 3 listas
(de tipo TipoLista), y utilizando el subalgoritmo anterior, obtenga en un parámetro de salida de tipo
TipoListaSalida la lista de números y posiciones según se ha explicado. (Si no hay ningún par de números
que cumpla lo especificado, la salida no tendrá ningún elemento.)
4. Implementar un subalgoritmo mostar_lista_salida que muestre la lista de salida.
5. Escribir un programa principal (main) que usando los subalgoritmos previos resuelva el problema planteado.

Nota: se pueden utilizar las variables a, b y c, ya inicializadas, para probar el programa:

int main(){
TipoLista a = { 2, {{1,2,0,0,0}} };
TipoLista b = { 2, {{3,4,0,0,0}} };
TipoLista c = { 3, {{6,5,8,0,0}} };
...
}

También podría gustarte