Está en la página 1de 12

C1 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C1 (1 Punto)
El siguiente programa calcula sumas de algunos términos de una serie.
int main() // 1,6,6
{
int suma1 = 0;
float suma2 = 0.;

for (int i = 1; i < 6; ++i)


{
float t = 6./i;
suma1 -= t;
suma2 += t;
}
cout << suma1 << " " << suma2 << endl;
}

Se pide:
• ¿Qué valores se obtienen por pantalla? -13 13.7
• Obtener la representación binaria interna de suma1 y suma2. Muestre en ambos casos los pasos realizados.

i 1 2 3 4 5
t 6 3 2 1.5 1.2
suma1 -6 -9 -11 -12 -13
suma2 6 9 11 12.5 13.7

suma1 es entero (32 bits) negativo (complemento a 2 de 13|10=1101|2) 11111…..1110011

suma2 es real, simple precisión (32 bits)


signo 0
parte entera 13|10=1101|2. Luego exponente es +3. Con 8 bits, exceso 127, 130 10000010
parte fraccionaria
0.7 x 2 = 1.4 1
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
A partir de ahí se repite 0110 0.7|10 = 0.1011001100110011001100110…..|2

Es decir
Signo Exponente (8 bits, exceso 127) Mantisa (23 bits, sin el 1 implícito)
0 10000010 10110110011001100110011

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


C1 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C1 (1 Punto)
El siguiente programa calcula sumas de algunos términos de una serie.
int main() // 2,7,6
{
int suma1 = 0;
float suma2 = 0.;

for (int i = 2; i < 7; ++i)


{
float t = 6./i;
suma1 -= t;
suma2 += t;
}
cout << suma1 << " " << suma2 << endl;
}

Se pide:
• ¿Qué valores se obtienen por pantalla? -8 8.7
• Obtener la representación binaria interna de suma1 y suma2. Muestre en ambos casos los pasos realizados.

i 2 3 4 5 6
t 3 2 1.5 1.2 1
suma1 -3 -5 -6 -7 -8
suma2 3 5 6.5 7.7 8.7

suma1 es entero (32 bits) negativo (complemento a 2 de 8|10=1000|2) 11111…..11111000

suma2 es real, simple precisión (32 bits)


signo 0
parte entera 8|10=1000|2. Luego exponente es +3. Con 8 bits, exceso 127, 130 10000010
parte fraccionaria
0.7 x 2 = 1.4 1
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
A partir de ahí se repite 0110 0.7|10 = 0.1011001100110011001100110…..|2

Es decir
Signo Exponente (8 bits, exceso 127) Mantisa (23 bits, sin el 1 implícito)
0 10000010 00010110011001100110011

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


C1 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C1 (1 Punto)
El siguiente programa calcula sumas de algunos términos de una serie.
int main() // 1,7,9
{
int suma1 = 0;
float suma2 = 0.;

for (int i = 1; i < 7; ++i)


{
float t = 9./i;
suma1 -= t;
suma2 += t;
}
cout << suma1 << " " << suma2 << endl;
}

Se pide:
• ¿Qué valores se obtienen por pantalla? -20, 22.05
• Obtener la representación binaria interna de suma1 y suma2. Muestre en ambos casos los pasos realizados.

i 1 2 3 4 5 6
t 9 4.5 3 2.25 1.8 1.5
suma1 -9 -13 -16 -18 -19 -20
suma2 9 13.5 16.5 18.75 20.55 22.05

suma1 es entero (32 bits) negativo (complemento a 2 de 20|10=10100|2) 11111…..11101100


suma2 es real, simple precisión (32 bits)
signo 0
parte entera 22|10=10110|2.
Luego exponente es +4. Con 8 bits, exceso 127, 131 10000011
parte fraccionaria
0.05 x 2 = 0.1 0
0.1 x 2 = 0.2 0
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
A partir de ahí se repite 0011 0.15|10 = 0.0000110011001100110011 …..|2

Es decir
Signo Exponente (8 bits, exceso 127) Mantisa (23 bits, sin el 1 implícito)
0 10000011 01100000110011001100110

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


C1 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C1 (1 Punto)
El siguiente programa calcula sumas de algunos términos de una serie.
El siguiente programa calcula sumas de algunos términos de una serie.
int main() // 2,7,9
{
int suma1 = 0;
float suma2 = 0.;

for (int i = 2; i < 7; ++i)


{
float t = 9./i;
suma1 -= t;
suma2 += t;
}
cout << suma1 << " " << suma2 << endl;
}

Se pide:
• ¿Qué valores se obtienen por pantalla? -11, 13.05
• Obtener la representación binaria interna de suma1 y suma2. Muestre en ambos casos los pasos realizados.

i 2 3 4 5 6
t 4.5 3 2.25 1.8 1.5
suma1 -4 -7 -9 -10 -11
suma2 4.5 7.5 9.75 11.55 13.05

suma1 es entero (32 bits) negativo (complemento a 2 de 11|10=1011|2) 11111…..1110101


suma2 es real, simple precisión (32 bits)
signo 0
parte entera 13|10=1101|2.
Luego exponente es +3. Con 8 bits, exceso 127, 130 10000010
parte fraccionaria
0.05 x 2 = 0.1 0
0.1 x 2 = 0.2 0
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
A partir de ahí se repite 0011 0.15|10 = 0.0000110011001100110011 …..|2

Es decir
Signo Exponente (8 bits, exceso 127) Mantisa (23 bits, sin el 1 implícito)
0 10000010 10100001100110011001100

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


C2 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C2 (1.5 Puntos)

1. Diferencias, ventajas y desventajas de un intérprete con máquina virtual respecto a un compilador. (0.3 Pts.)

Páginas 23, 30 y 31 del tema Lenguajes de Programación

2. Se quiere codificar en octal los 93 alumnos de un Grado. ¿Cuál es el número mínimo de dígitos en octal necesarios
para lograrlo? Con esos dígitos, ¿cuál es el mayor número de alumnos que sería codificable? (0.3 Pts.)

93 = 64 + 16 + 8 + 4 + 1
En binario: 10111012.
Agrupando en grupos de 3: 001.011.101 tenemos que en octal es 1358
Por tanto, la respuesta es que necesitamos 3 dígitos.
El mayor número codificable sería el 7778 que en binario es 111.111.1112 y en decimal sería: 29-1 = 511.

Las respuestas válidas son, por tanto, 3 y 511.

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


3. La representación de los números C++ tipo float, ¿está uniformemente distribuida en la recta real?
Justifique matemáticamente o con algún ejemplo práctico la respuesta. (0.3 Pts.)

La respuesta es no.
La mantisa tiene 23 posiciones, por lo que tenemos 2x223 posibles números. El primer 2 es para tener en cuenta a los
positivos y negativos. Pero el número de valores es lo de menos a la hora de la argumentación. Lo importante, es que,
para cada exponente, el número de valores representados es fijo, en el caso de float, 224.

Supongamos el exponente 0 con valores positivos, es decir, los números del tipo 1.xxxxx
Son los valores representados en el intervalo [1,2)
Hagamos el mismo ejercicio con el exponente 1, es decir, los números del tipo 1x.xxxxx
Son los valores representados en el intervalo [2,4)
Por tanto, vemos que en el intervalo [1,2) hay el mismo número de valores representados que en el [2,4), y así sucesiva-
mente con el intervalo [4,8), etc. Conforme aumenta en 1 el valor del exponente se reduce a la mitad la densidad de
valores representados.
4. Dibuje un esquema y describa brevemente los componentes principales de la arquitectura Von Neuman. (0.3 Pts.)

Páginas 9 y 10 del tema Arquitectura de Computadores

5. Explique en qué consiste el Acceso Directo a Memoria (DMA). (0.3 Pts.)

Páginas 98 y 99 del tema Arquitectura de Computadores


C3 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C3 (1.5 Puntos)

1. Un chip de memoria trabaja con palabras de 32 bits. Si el bus de direcciones tiene 8 líneas, ¿cuál es el número máximo
de palabras que se podrá direccionar? ¿Cuántos datos tipo char podrá almacenar? (0.3 Pts.)

Lo importante para la primera pregunta es el número de líneas del bis de direcciones.


28=256 palabras. La longitud de palabra no influye.

Por otro lado, dado que un char tiene 8 bits:


256palabras
32bit/palabra
8bit/char

256palabras x 32 bit/palabra x 1char/(8 bit) =1024 datos char

2. Describa el principal cometido del buffer de un controlador de un dispositivo de E/S y su razón de ser. (0.3 Pts.)

Página 35 del tema Arquitectura de Computadores

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


3. Describe el cometido básico de la memoria caché y los principios en los que se fundamenta (0.3 Pts.)

Disminuir en promedio el tiempo de acceso a memoria.


Principios: Página 80 del tema Arquitectura de Computadores

4. Describe la fase de búsqueda del ciclo de instrucción en una arquitectura basada en acumulador, nombrando los
registros que participan. (0.3 Pts.)

Página 54 del tema Arquitectura de Computadores

5. Explica brevemente qué es un cambio de contexto. ¿Se producirá en un fallo de página? Justifícalo. (0.3 Pts.)

1) La interrupción de la ejecución de un proceso almacenando toda la información del estado del proceso para que
pueda luego ser restaurado.
2) La restauración del estado del siguiente proceso a ejecutar

El fallo de página supone una interrupción, donde el kernel del S.O., que es otro proceso, toma el control para llevar la
página de disco a memoria principal. Por tanto, debe almacenarse el contexto del proceso que ha causado el fallo de
página para que sea ahora el kernel el nuevo proceso en ejecución.
C4 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C4 (1 Punto)

1. Escriba en cada recuadro los valores solicitados: (0.2 puntos)


Código Valores solicitados Solución
int a = 5, b = 2, c = 0;
c 0 ó false
c = b > a;
int a = 8, b = 0;
b = a++; byc 8y9
int c = a;
int a = 10, b = 3;
x 3
double x = a/b;
int a = 10, b = 2;
c 18
int c = (--a)*b;

2. Dada la siguiente línea de código, escoge la(s) respuesta(s) correcta(s): (0.1 puntos)
double fun(int, double, char);
Respuesta Marca las respuestas correctas
La definición de fun.
La declaración de fun.
La cabecera de la definición de fun.
El prototipo de fun.
Es una declaración errónea al faltar el nombre de los parámetros.

3. ¿Cuál es el cometido que tiene void? (0.1 puntos)


Respuesta Marca las respuestas correctas
Cuando se utiliza en una función, especifica que admite cualquier
tipo de dato en los parámetros.
Cuando se utiliza en una función, permite especificar que no tiene
parámetros.
Cuando se utiliza en una función, especifica que admite cualquier
número de parámetros.
Cuando se utiliza en una función, permite especificar que
no devuelve un resultado.

4. Programa la definición de la función ¿? no_negativo(¿?) para que el resultado del siguiente programa
sea: 4 3 2 1 0. (0.1 puntos)
Código Función ¿? no_negativo(¿?)
main() bool no_negativo(int a)
{ {
int n = 4; if (a>=0)
do return true;
{ else
cout << n-- << " "; return false;
}while (no_negativo(n)); // O simplemente return a >= 0;
} }

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


5. Al compilar y ejecutar el siguiente código, escoge la(s) respuesta(s) correcta(s): (0.1 puntos)
Código Respuesta Marca las respuestas correctas
void poner_a_cero(double);
main() Se visualizará 0.
{
int a = 10;
poner_a_cero(a); Se visualizará 10.
cout << a << endl;
}
void poner_a_cero(double a)
Se obtendrá un error: sobra la sentencia
{ return al ser void.
a = 0; Se obtendrá un error: el tipo de a en
return; main() es int, pero la función sólo
} admite double.

6. Después de la ejecución del programa indicado, ¿Qué valores salen por pantalla?
¿Cuál es el contenido del vector lista? (0.2 puntos)
Código Respuesta
void fun(vector<int>& v)
{ Salida por pantalla:
int c = 2;
int dim = v.size(); 0 12 18 8 10 2 8 14 6
while (dim > 0)
{
v[dim-1] = c*v[dim-1];
cout << v[dim-1] << " ";
--dim;
} Contenido del vector lista:
}
main()
{ 6 14 8 2 10 8 18 12 0
vector<int> lista(9);
lista = {3, 7, 4, 1, 5, 4, 9, 6, 0};
fun(lista);
}

7. Escribe 4 sentencias diferentes, que incrementen cada una z en 1 partir de int z = 3; (0.1 puntos)
Opciones A partir de int z = 3;, escribe 4 sentencias diferentes que incrementen en 1 a z.
1 z = z + 1;
2 z += 1;
3 ++z;
4 z++;

8. Escribe un fragmento de código que verifique si el valor de una variable real x pertenece al intervalo
cerrado [0,1] y, en ese caso, que guarde su valor en un archivo llamado datos.txt. (0.1 puntos)
double x; cin >> x;

if (x >= 0 && x <= 1)


{
ofstream fich("datos.txt");
if (!fich)
{
cout << "No se pudo abrir datos.txt\n";
exit(EXIT_FAILURE); // exit(-1), etc.
}
fich << x << endl; // Sin endl también es válido
}
C5 Escuela de Ingenierías Industriales

Fundamentos de Informática Examen Ordinario: 21 de enero de 2021


Apellidos (en Mayúsculas) Nombre Grupo T IM IOI IQ ITI IEIA IELE IENE
1
2
3

Observaciones: Nota:
• Rellena los datos (apellidos, nombre y grupo) que se solicitan en la parte superior de esta hoja.
• Contesta a la cuestión en esta misma hoja.
Cuestión C5 (1.5 Puntos)
Se desea calcular un sumatorio dado por la expresión:
𝑁𝑁
1
𝑠𝑠(𝑡𝑡, 𝑁𝑁) = � sin (2 ∗ 𝑛𝑛 ∗ 𝜋𝜋 ∗ 𝑡𝑡)
𝑛𝑛
𝑛𝑛=1

Escriba una función con salida real con prototipo ¿? sum_sin(¿? t, ¿? N), con argumento real para t.
sum_sin( )
{
const double pi = 3.14159;

Supongamos que disponemos de un vector tiempos de tamaño tam, con valores equidistantes entre un tiempo ini-
cial t_ini y un tiempo final t_fin.
Así, con tam = 6, t_ini = 1.0 y t_fin = 3.5, se tiene el vector tiempos = {1.0, 1.5, 2.0, 2.5, 3.0, 3.5}.
La función dientes_sierra() crea un vector de valores que se asemejan a dientes de sierra, resultado de aplicar a
cada elemento 𝑡𝑡𝑖𝑖 del vector de tiempos la siguiente función:
𝑁𝑁
1 1 1 1 1
𝑑𝑑(𝑡𝑡𝑖𝑖 , 𝑁𝑁) = + � sin (2 ∗ 𝑛𝑛 ∗ 𝜋𝜋 ∗ 𝑡𝑡𝑖𝑖 ) = + 𝑠𝑠(𝑡𝑡𝑖𝑖 , 𝑁𝑁)
2 𝜋𝜋 𝑛𝑛 2 𝜋𝜋
𝑛𝑛=1

La figura muestra la función dientes_sierra() para 1000


valores en el intervalo de tiempos [0,3]. El valor N es 5.

Escriba una función con prototipo ¿? dientes_sierra(¿? tiempos, ¿? N) que obtenga el vector de valores dien-
tes de sierra para un vector de tiempos. ¡Esta función debe usar la función sum_sin()!
dientes_sierra( )
{
const double pi = 3.14159;

Universidad de Valladolid – Departamento de Ingeniería de Sistemas y Automática


Posible solución

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

vector<double> tiempo_lin(double tin, double tend, int tam);


double sum_sin(double t, int N);
vector<double> dientes_sierra(const vector<double>& tiempo, int N);

int main()
{
vector<double> tiempos = tiempo_lin(0, 3, 1000);
vector<double> y = dientes_sierra(tiempos, 5);
for (auto x : y)
cout << x << "\n";
}

double sum_sin(double t, int N)


{
const double pi = 3.14159;
double suma = 0.;
for (int n = 1; n <= N; ++n)
suma += (1./n)*sin(2*n*pi*t);
return suma;
}

vector<double> dientes_sierra(const vector<double>& tiempos, int N)


{
const double pi = 3.14159;
vector<double> y;
y.reserve(tiempos.size()); // Opcional
for (int i = 0; i < tiempos.size(); ++i)
y.push_back(0.5 + (1./pi)*sum_sin(tiempos[i], N));
return y;
}

vector<double> tiempo_lin(double tin, double tend, int tam)


{
double incr = (tend - tin)/(tam - 1);
vector<double> tiempo;
tiempo.reserve(tam); // Opcional
for (int i = 0; i<tam; ++i)
tiempo.push_back(tin + i*incr);
return tiempo;
}

También podría gustarte