FPjunio Con Solucion

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

A

NOMBRE...................................................................................................................................

NÚM. de MATRÍCULA...............................................................................................................

Examen final de Fundamentos de Programación. Junio de 2023


Instrucciones
• El examen consta de diez preguntas. Las respuestas puntúan cero o un punto excepto en la primera.
• Se calificará con un punto si la respuesta correcta se indica en la forma más simple.
• La duración total del examen será de 2 horas y 15 minutos.
• Las notas se publicarán en AulaWeb (19/06/2023). Revisión (23/06/2023). Actas (26/06/2023).

1. [0.5 puntos por cada apartado] Dado un formato de representación binaria de un valor numérico real en
coma flotante normalizada con 9 bits, 5 para mantisa y 4 para exponente, ambos en complemento a 2:
a) representar en este formato binario el valor decimal -0.25 y 11000 1111
b) indicar, en el sistema numérico decimal, el valor positivo más
grande (el de mayor valor absoluto) que se puede representar. 0.9375· 27 = 120.00

2. Construir una función para que, dado un void deBinaDec(int n, int *d) {
parámetro entero que sólo tiene cifras de int i = 1;
ceros y unos (como un número representado *d = 0;
do {
en el sistema binario), calcule y guarde el *d = *d + (n % 10)*i;
valor decimal correspondiente en la variable i = i * 2;
entera cuya dirección de memoria se indica n = n / 10;
en el segundo parámetro. Por ejemplo, la } while (n>0);
}
llamada a la función deBinaDec(1110, &a)
deberá guardar el valor 14 en a.

3. Escribir una función crecientes que, al ejecutarse, pida al usuario introducir por teclado valores
estrictamente positivos que sean asignados a los n primeros elementos de un array v de datos de tipo
double. La petición de valor para su asignación a cada elemento del array se debe repetir si el valor
introducido no es estrictamente mayor que el anterior. Por lo tanto, al terminar la ejecución de la función
los n primeros valores del array deben tener valores estrictamente positivos en orden estrictamente
creciente. v y n son los dos parámetros de la función. Nota: se supone que n es siempre mayor que 0.

void crecientes(double * v, int n) {


int i;
do {
printf("Intro valor [0]: ");
scanf("%lf", &v[0]);
} while (v[0]<=0);
for (i=1; i<n; i++) {
do {
printf("Intro valor [%d]: ", i);
scanf("%lf", &v[i]);
} while (v[i]<=v[i-1]);
}
}
4. Juan ha escrito una función neg que retorna el número de valores negativos almacenados en una
submatriz delimitada por las n primeras filas y n primeras columnas de una matriz a de números reales
de dimensiones DIM x DIM. a y n son los dos parámetros de la función. Se supone que n es siempre menor
o igual que DIM. Esta función NO hay que implementarla.
• SE PIDE completar la función main para que compruebe su
correcto funcionamiento en tres casos: siempre con la matriz a de la
figura de la derecha y para tres valores distintos de n (0, 2 y 5).

#include <stdio.h>
#define DIM 5
int neg(double a[][DIM], int n) { /* Funcion ya codificada por Juan */ }
int main () {
int ok;

double a[DIM][DIM] = {{-2.3, -8.5, 0.9, 7.8, 9.6},


{-8.0, -4.2, 4.5, 4.2, 0.4},
{ 2.9, 1.5, -2.8, 4.1, -6.7},
{ 8.8, -5.0, 2.7, -1.3, 0.0},
{-6.3, 8.9, -5.8, 2.0, -2.5}};
ok = (neg(a, 0) == 0) && (neg(a, 2) == 4) && (neg(a, 5) == 11);

if ( ok )
printf("Funciona BIEN en los tres casos\n");
else
printf("NO funciona bien\n");
return 0;
}

5. Construir una función contiene que indique si todos los caracteres de una cadena s1 se encuentran en
otra s2. En este caso, la función debe retornar el valor 1 y, en caso contrario, debe retornar el valor 0.
s1 y s2 son los parámetros de la función. Si s1 está vacía la función debe retornar el valor 1. Por ejemplo,
la llamada a contiene("ella", "clave") debe retornar el valor 1, mientras que contiene("bola",
"pelota") debe retornar el valor 0. Nota: puede emplearse la librería string.h.
int contiene(char *s1, char *s2) {
int i, j, distintos;
for (i=0; i<strlen(s1); i++) {
distintos = 0;
for (j=0; j<strlen(s2); j++)
if (s1[i]!=s2[j])
distintos++;
if (distintos==strlen(s2))
return 0;
}
return 1;
}

6. Escribir una función equals para que retorne 1 si los valores de todos los struct item {
campos respectivos de dos parámetros de tipo struct item son iguales y char id[9];
char clase;
0 en caso contrario. La declaración del tipo de dato struct item se facilita int un[10];
a la derecha. Nota: puede emplearse la librería string.h. };

int equals(struct item a1, struct item a2) {


int aux, i;
aux = !strcmp(a1.id, a2.id) && (a1.clase == a2.clase);
for (i=0; i<10; i++)
aux = aux && (a1.un[i] == a2.un[i]);
return aux;
}
7. Escribir un programa que pida al usuario introducir por teclado una cadena de caracteres (de tamaño
máximo 20) y, a continuación, un carácter. Seguidamente debe mostrar por pantalla el número de
caracteres de la cadena diferentes al carácter introducido y la propia cadena modificada sustituyendo
todas las veces que aparezca dicho carácter dado por '#'. Por ejemplo: si el usuario introduce "Barrida"
y 'a', entonces se mostrará por pantalla 5 y "B#rrid#". Nota: puede emplearse la librería string.h.
#include <stdio.h>
#include <string.h>
#define TAM 21
int main(){
char caracter;
char cadena[TAM];
int i, diferentes=0;
printf("Introduzca la cadena\n");
scanf("%20s", cadena);
fflush(stdin);
printf("Introduzca el caracter\n");
scanf("%c", &caracter);
for (i=0; i<strlen(cadena); i++) {
if(cadena[i]==caracter) {
cadena[i] = '#';
}
else {
diferentes++;
}
}
printf("%d %s", diferentes, cadena);
return 0;
}

8. Construir una función que retorne el elemento que almacene la hora más
tardía de los n primeros elementos de un array t formado con elementos de /* Declaracion
del tipo de
tipo struct hora. El campo hh puede almacenar valores entre 0 y 11, el dato: */
campo mm guarda valores entre 0 y 59 y el campo ap puede almacenar el valor
"AM" (Ante Meridiem) o "PM" (Post Meridiem). t y n son los dos parámetros de la struct hora {
función. Nota 1: Como ejemplo de comparación, la hora {0, 0, "PM"} es int hh;
int mm;
posterior a la hora {11, 59, "AM"}. Nota 2: Si n vale 0 entonces debe char ap[3];
retornar un elemento con el valor {0, 0, "AM"}. Nota 3: si es necesario };
puede emplearse la librería string.h.

struct hora examen(struct hora *t, int n) {


int i;
struct hora aux = {0, 0, "AM"};
for (i=0; i<n; i++) {
if (strcmp(aux.ap, t[i].ap)<0)
aux = t[i];
else if (!strcmp(aux.ap, t[i].ap) && (aux.hh<t[i].hh))
aux = t[i];
else if ((aux.hh==t[i].hh) && (aux.mm<t[i].mm))
aux = t[i];
}
return aux;
}
9. Una empresa desea incentivar la productividad de sus empleados. Para ello, realiza una monitorización
de los equipos para ver el tiempo dedicado a navegar por Internet. Se dispone de un archivo de texto con:
i) el nombre de usuario (máximo, 20 caracteres), ii) identificador MAC del equipo (17 caracteres) y iii)
número de minutos de navegación (valor entero), en cada línea
como, a modo de ejemplo, se muestra en la figura de la derecha.
SE PIDE: construir una función monitorizar que, dada la ruta
o vía de acceso del archivo, devuelva el nombre del usuario y el
MAC del equipo con menos minutos de uso de Internet
mediante otros dos parámetros. Si el archivo no existe o está vacío entonces debe devolver dos cadenas
vacías.

#include <string.h>
void monitorizar(char * ruta, char * empleado, char * mac){
int menos = 9999, aux, tiempo;
FILE * f;
char emplAux[21];
char macAux[18];
strcpy(empleado, "");
strcpy(mac, "");
f = fopen(ruta, "r");
if (f!=NULL) {
do {
aux = fscanf(f, "%20s %17s %d\n", emplAux, macAux, &tiempo);
if ((aux==3) && (tiempo<menos)) {
strcpy(empleado, emplAux);
strcpy(mac, macAux);
menos = tiempo;
}
} while (aux==3);
fclose(f);
} else {
printf("Archivo no encontrado\n");
}
return;
}

10. Escribir una función nAleatorias para que genere un archivo de texto,
cuyo nombre se indica como parámetro, con dos calificaciones numéricas
reales aleatorias (dentro del intervalo entre 0 y 10), separadas por
caracteres de coma, para cada uno de los 100 alumnos con nº de matrícula
entre 22900 y 22999 (ambos incluidos), como, a modo de ejemplo, se
muestra en la figura de la derecha para las primeras siete líneas de texto.
Además la función debe retornar el valor 1 si ha conseguido generar el
archivo correctamente y 0 en caso contrario.

int nAleatorias(char *s) {


int i;
FILE *f;
if (NULL!=(f=fopen(s, "w"))) {
for (i=0; i<100; i++) {
fprintf(f, "%d,%.1f,%.1f\n", 22900+i,
rand() % 101 / 10.0, rand() % 101 / 10.0);
}
fclose(f);
} else
return 0;
return 1;
}
B
NOMBRE...................................................................................................................................

NÚM. de MATRÍCULA...............................................................................................................

Examen final de Fundamentos de Programación. Junio de 2023


Instrucciones
• El examen consta de diez preguntas. Las respuestas puntúan cero o un punto excepto en la primera.
• Se calificará con un punto si la respuesta correcta se indica en la forma más simple.
• La duración total del examen será de 2 horas y 15 minutos.
• Las notas se publicarán en AulaWeb (19/06/2023). Revisión (23/06/2023). Actas (26/06/2023).

1. [0.5 puntos por cada apartado] Dado un formato de representación binaria de un valor numérico real en
coma flotante normalizada con 9 bits, 5 para mantisa y 4 para exponente, ambos en complemento a 2:
a) representar en este formato binario el valor decimal -0.125 y 11000 1110
b) indicar, en el sistema numérico decimal, el valor positivo más
grande (el de mayor valor absoluto) que se puede representar. 0.9375· 27 = 120.00

2. Construir una función para que, dado un void aDecimal(int n, int *d) {
parámetro entero que sólo tiene cifras de int i = 1;
ceros y unos (como un número representado *d = 0;
do {
en el sistema binario), calcule y guarde el *d = *d + (n % 10)*i;
valor decimal correspondiente en la variable i = i * 2;
entera cuya dirección de memoria se indica n = n / 10;
en el segundo parámetro. Por ejemplo, la } while (n>0);
}
llamada a la función aDecimal(1110, &d)
deberá guardar el valor 14 en d.

3. Escribir una función asignaCreciente que, al ejecutarse, pida al usuario introducir por teclado valores
estrictamente positivos que sean asignados a los n primeros elementos de un array v de datos de tipo
double. La petición de valor para su asignación a cada elemento del array se debe repetir si el valor
introducido no es estrictamente mayor que el anterior. Por lo tanto, al terminar la ejecución de la función
los n primeros valores del array deben tener valores estrictamente positivos en orden estrictamente
creciente. v y n son los dos parámetros de la función. Nota: se supone que n es siempre mayor que 0.

void asignaCreciente(double * v, int n) {


int i;
do {
printf("Intro valor [0]: ");
scanf("%lf", &v[0]);
} while (v[0]<=0);
for (i=1; i<n; i++) {
do {
printf("Intro valor [%d]: ", i);
scanf("%lf", &v[i]);
} while (v[i]<=v[i-1]);
}
}
4. Luis ha escrito una función nega que retorna el número de valores negativos almacenados en una
submatriz delimitada por las n primeras filas y n primeras columnas de una matriz a de números reales
de dimensiones DIM x DIM. a y n son los dos parámetros de la función. Se supone que n es siempre menor
o igual que DIM. Esta función NO hay que implementarla.
• SE PIDE completar la función main para que compruebe su
correcto funcionamiento en tres casos: siempre con la matriz a de la
figura de la derecha y para tres valores distintos de n (0, 2 y 5).

#include <stdio.h>
#define DIM 5
int nega(double a[][DIM], int n) { /* Funcion ya codificada por Luis */ }
int main () {
int ok;

double a[DIM][DIM] = {{-2.3, -8.5, 0.9, 7.8, 9.6},


{-8.0, -4.2, 4.5, 4.2, 0.4},
{ 2.9, 1.5, -2.8, 4.1, -6.7},
{ 8.8, -5.0, 2.7, -1.3, 0.0},
{-6.3, 8.9, -5.8, 2.0, -2.5}};
ok = (nega(a, 0) == 0) && (nega(a, 2) == 4) && (nega(a, 5) == 11);

if ( ok )
printf("Funciona BIEN en los tres casos\n");
else
printf("NO funciona bien\n");
return 0;
}

5. Construir una función incluidos que indique si todos los caracteres de una cadena s1 se encuentran
en otra s2. En este caso, la función debe retornar el valor 1 y, en caso contrario, debe retornar el valor
0. s1 y s2 son los parámetros de la función. Si s1 está vacía la función debe retornar el valor 1. Por
ejemplo, la llamada a incluidos("ella", "clave") debe retornar el valor 1, mientras que
incluidos("bola", "pelota") debe retornar el valor 0. Nota: puede emplearse la librería string.h.
int incluidos(char *s1, char *s2) {
int i, j, distintos;
for (i=0; i<strlen(s1); i++) {
distintos = 0;
for (j=0; j<strlen(s2); j++)
if (s1[i]!=s2[j])
distintos++;
if (distintos==strlen(s2))
return 0;
}
return 1;
}

6. Escribir una función identicos para que retorne 1 si los valores de todos struct item {
los campos respectivos de dos parámetros de tipo struct item son char id[9];
char clase;
iguales y 0 en caso contrario. La declaración del tipo de dato struct item int un[10];
se facilita a la derecha. Nota: puede emplearse la librería string.h. };

int identicos(struct item a1, struct item a2) {


int aux, i;
aux = !strcmp(a1.id, a2.id) && (a1.clase == a2.clase);
for (i=0; i<10; i++)
aux = aux && (a1.un[i] == a2.un[i]);
return aux;
}
7. Escribir un programa que pida al usuario introducir por teclado una cadena de caracteres (de tamaño
máximo 20) y, a continuación, un carácter. Seguidamente debe mostrar por pantalla el número de
caracteres de la cadena diferentes al carácter introducido y la propia cadena modificada sustituyendo
todas las veces que aparezca dicho carácter dado por '#'. Por ejemplo: si el usuario introduce "Barrida"
y 'a', entonces se mostrará por pantalla 5 y "B#rrid#". Nota: puede emplearse la librería string.h.
#include <stdio.h>
#include <string.h>
#define TAM 21
int main(){
char caracter;
char cadena[TAM];
int i, diferentes=0;
printf("Introduzca la cadena\n");
scanf("%20s", cadena);
fflush(stdin);
printf("Introduzca el caracter\n");
scanf("%c", &caracter);
for (i=0; i<strlen(cadena); i++) {
if(cadena[i]==caracter) {
cadena[i] = '#';
}
else {
diferentes++;
}
}
printf("%d %s", diferentes, cadena);
return 0;
}

8. Construir una función que retorne el elemento que almacene la hora más
tardía de los n primeros elementos de un array t formado con elementos de /* Declaracion
del tipo de
tipo struct hora. El campo hh puede almacenar valores entre 0 y 11, el dato: */
campo mm guarda valores entre 0 y 59 y el campo ap puede almacenar el valor
"AM" (Ante Meridiem) o "PM" (Post Meridiem). t y n son los dos parámetros de la struct hora {
función. Nota 1: Como ejemplo de comparación, la hora {0, 0, "PM"} es int hh;
int mm;
posterior a la hora {11, 59, "AM"}. Nota 2: Si n vale 0 entonces debe char ap[3];
retornar un elemento con el valor {0, 0, "AM"}. Nota 3: si es necesario };
puede emplearse la librería string.h.

struct hora examen(struct hora *t, int n) {


int i;
struct hora aux = {0, 0, "AM"};
for (i=0; i<n; i++) {
if (strcmp(aux.ap, t[i].ap)<0)
aux = t[i];
else if (!strcmp(aux.ap, t[i].ap) && (aux.hh<t[i].hh))
aux = t[i];
else if ((aux.hh==t[i].hh) && (aux.mm<t[i].mm))
aux = t[i];
}
return aux;
}
9. Una empresa desea incentivar la productividad de sus empleados. Para ello, realiza una monitorización
de los equipos para ver el tiempo dedicado a navegar por Internet. Se dispone de un archivo de texto con:
i) el nombre de usuario (máximo, 20 caracteres), ii) identificador MAC del equipo (17 caracteres) y iii)
número de minutos de navegación (valor entero), en cada línea
como, a modo de ejemplo, se muestra en la figura de la derecha.
SE PIDE: construir una función monitorizar que, dada la ruta
o vía de acceso del archivo, devuelva el nombre del usuario y el
MAC del equipo con menos minutos de uso de Internet
mediante otros dos parámetros. Si el archivo no existe o está vacío entonces debe devolver dos cadenas
vacías.

#include <string.h>
void monitorizar(char * ruta, char * empleado, char * mac){
int menos = 9999, aux, tiempo;
FILE * f;
char emplAux[21];
char macAux[18];
strcpy(empleado, "");
strcpy(mac, "");
f = fopen(ruta, "r");
if (f!=NULL) {
do {
aux = fscanf(f, "%20s %17s %d\n", emplAux, macAux, &tiempo);
if ((aux==3) && (tiempo<menos)) {
strcpy(empleado, emplAux);
strcpy(mac, macAux);
menos = tiempo;
}
} while (aux==3);
fclose(f);
} else {
printf("Archivo no encontrado\n");
}
return;
}

10. Escribir una función califica para que genere un archivo de texto, cuyo
nombre se indica como parámetro, con dos calificaciones numéricas reales
aleatorias (dentro del intervalo entre 0 y 10), separadas por caracteres de
coma, para cada uno de los 50 alumnos con nº de matrícula entre 22900
y 22949 (ambos incluidos), como, a modo de ejemplo, se muestra en la
figura de la derecha para las primeras siete líneas de texto. Además la
función debe retornar el valor 1 si ha conseguido generar el archivo
correctamente y 0 en caso contrario.

int califica(char *s) {


int i;
FILE *f;
if (NULL!=(f=fopen(s, "w"))) {
for (i=0; i<50; i++) {
fprintf(f, "%d,%.1f,%.1f\n", 22900+i,
rand() % 101 / 10.0, rand() % 101 / 10.0);
}
fclose(f);
} else
return 0;
return 1;
}
C
NOMBRE...................................................................................................................................

NÚM. de MATRÍCULA...............................................................................................................

Examen final de Fundamentos de Programación. Junio de 2023


Instrucciones
• El examen consta de diez preguntas. Las respuestas puntúan cero o un punto excepto en la primera.
• Se calificará con un punto si la respuesta correcta se indica en la forma más simple.
• La duración total del examen será de 2 horas y 15 minutos.
• Las notas se publicarán en AulaWeb (19/06/2023). Revisión (23/06/2023). Actas (26/06/2023).

1. [0.5 puntos por cada apartado] Dado un formato de representación binaria de un valor numérico real en
coma flotante normalizada con 9 bits, 5 para mantisa y 4 para exponente, ambos en complemento a 2:
a) representar en este formato binario el valor decimal -0.375 y 10100 1111
b) indicar, en el sistema numérico decimal, el valor positivo más
grande (el de mayor valor absoluto) que se puede representar. 0.9375· 27 = 120.00

2. Construir una función para que, dado un void toDecimal(int n, int *d) {
parámetro entero que sólo tiene cifras de int i = 1;
ceros y unos (como un número representado *d = 0;
do {
en el sistema binario), calcule y guarde el *d = *d + (n % 10)*i;
valor decimal correspondiente en la variable i = i * 2;
entera cuya dirección de memoria se indica n = n / 10;
en el segundo parámetro. Por ejemplo, la } while (n>0);
}
llamada a la función toDecimal(1110, &a)
deberá guardar el valor 14 en a.

3. Escribir una función avc que, al ejecutarse, pida al usuario introducir por teclado valores estrictamente
positivos que sean asignados a los n primeros elementos de un array v de datos de tipo double. La
petición de valor para su asignación a cada elemento del array se debe repetir si el valor introducido no
es estrictamente mayor que el anterior. Por lo tanto, al terminar la ejecución de la función los n primeros
valores del array deben tener valores estrictamente positivos en orden estrictamente creciente. v y n son
los dos parámetros de la función. Nota: se supone que n es siempre mayor que 0.

void avc(double * v, int n) {


int i;
do {
printf("Intro valor [0]: ");
scanf("%lf", &v[0]);
} while (v[0]<=0);
for (i=1; i<n; i++) {
do {
printf("Intro valor [%d]: ", i);
scanf("%lf", &v[i]);
} while (v[i]<=v[i-1]);
}
}
4. Sara ha escrito una función ngt que retorna el número de valores negativos almacenados en una
submatriz delimitada por las n primeras filas y n primeras columnas de una matriz a de números reales
de dimensiones DIM x DIM. a y n son los dos parámetros de la función. Se supone que n es siempre menor
o igual que DIM. Esta función NO hay que implementarla.
• SE PIDE completar la función main para que compruebe su
correcto funcionamiento en tres casos: siempre con la matriz a de la
figura de la derecha y para tres valores distintos de n (0, 2 y 5).

#include <stdio.h>
#define DIM 5
int ngt(double a[][DIM], int n) { /* Funcion ya codificada por Sara */ }
int main () {
int ok;

double a[DIM][DIM] = {{-2.3, -8.5, 0.9, 7.8, 9.6},


{-8.0, -4.2, 4.5, 4.2, 0.4},
{ 2.9, 1.5, -2.8, 4.1, -6.7},
{ 8.8, -5.0, 2.7, -1.3, 0.0},
{-6.3, 8.9, -5.8, 2.0, -2.5}};
ok = (ngt(a, 0) == 0) && (ngt(a, 2) == 4) && (ngt(a, 5) == 11);

if ( ok )
printf("Funciona BIEN en los tres casos\n");
else
printf("NO funciona bien\n");
return 0;
}

5. Construir una función contains que indique si todos los caracteres de una cadena s1 se encuentran en
otra s2. En este caso, la función debe retornar el valor 1 y, en caso contrario, debe retornar el valor 0.
s1 y s2 son los parámetros de la función. Si s1 está vacía la función debe retornar el valor 1. Por ejemplo,
la llamada a contains("ella", "clave") debe retornar el valor 1, mientras que contains("bola",
"pelota") debe retornar el valor 0. Nota: puede emplearse la librería string.h.
int contains(char *s1, char *s2) {
int i, j, distintos;
for (i=0; i<strlen(s1); i++) {
distintos = 0;
for (j=0; j<strlen(s2); j++)
if (s1[i]!=s2[j])
distintos++;
if (distintos==strlen(s2))
return 0;
}
return 1;
}

6. Escribir una función gemelos para que retorne 1 si los valores de todos struct item {
los campos respectivos de dos parámetros de tipo struct item son char id[9];
char clase;
iguales y 0 en caso contrario. La declaración del tipo de dato struct item int un[10];
se facilita a la derecha. Nota: puede emplearse la librería string.h. };

int gemelos(struct item a1, struct item a2) {


int aux, i;
aux = !strcmp(a1.id, a2.id) && (a1.clase == a2.clase);
for (i=0; i<10; i++)
aux = aux && (a1.un[i] == a2.un[i]);
return aux;
}
7. Escribir un programa que pida al usuario introducir por teclado una cadena de caracteres (de tamaño
máximo 20) y, a continuación, un carácter. Seguidamente debe mostrar por pantalla el número de
caracteres de la cadena diferentes al carácter introducido y la propia cadena modificada sustituyendo
todas las veces que aparezca dicho carácter dado por '#'. Por ejemplo: si el usuario introduce "Barrida"
y 'a', entonces se mostrará por pantalla 5 y "B#rrid#". Nota: puede emplearse la librería string.h.
#include <stdio.h>
#include <string.h>
#define TAM 21
int main(){
char caracter;
char cadena[TAM];
int i, diferentes=0;
printf("Introduzca la cadena\n");
scanf("%20s", cadena);
fflush(stdin);
printf("Introduzca el caracter\n");
scanf("%c", &caracter);
for (i=0; i<strlen(cadena); i++) {
if(cadena[i]==caracter) {
cadena[i] = '#';
}
else {
diferentes++;
}
}
printf("%d %s", diferentes, cadena);
return 0;
}

8. Construir una función que retorne el elemento que almacene la hora más
tardía de los n primeros elementos de un array t formado con elementos de /* Declaracion
del tipo de
tipo struct hora. El campo hh puede almacenar valores entre 0 y 11, el dato: */
campo mm guarda valores entre 0 y 59 y el campo ap puede almacenar el valor
"AM" (Ante Meridiem) o "PM" (Post Meridiem). t y n son los dos parámetros de la struct hora {
función. Nota 1: Como ejemplo de comparación, la hora {0, 0, "PM"} es int hh;
int mm;
posterior a la hora {11, 59, "AM"}. Nota 2: Si n vale 0 entonces debe char ap[3];
retornar un elemento con el valor {0, 0, "AM"}. Nota 3: si es necesario };
puede emplearse la librería string.h.

struct hora examen(struct hora *t, int n) {


int i;
struct hora aux = {0, 0, "AM"};
for (i=0; i<n; i++) {
if (strcmp(aux.ap, t[i].ap)<0)
aux = t[i];
else if (!strcmp(aux.ap, t[i].ap) && (aux.hh<t[i].hh))
aux = t[i];
else if ((aux.hh==t[i].hh) && (aux.mm<t[i].mm))
aux = t[i];
}
return aux;
}
9. Una empresa desea incentivar la productividad de sus empleados. Para ello, realiza una monitorización
de los equipos para ver el tiempo dedicado a navegar por Internet. Se dispone de un archivo de texto con:
i) el nombre de usuario (máximo, 20 caracteres), ii) identificador MAC del equipo (17 caracteres) y iii)
número de minutos de navegación (valor entero), en cada línea
como, a modo de ejemplo, se muestra en la figura de la derecha.
SE PIDE: construir una función monitorear que, dada la ruta o
vía de acceso del archivo, devuelva el nombre del usuario y el
MAC del equipo con menos minutos de uso de Internet
mediante otros dos parámetros. Si el archivo no existe o está vacío entonces debe devolver dos cadenas
vacías.

#include <string.h>
void monitorear(char * ruta, char * empleado, char * mac){
int menos = 9999, aux, tiempo;
FILE * f;
char emplAux[21];
char macAux[18];
strcpy(empleado, "");
strcpy(mac, "");
f = fopen(ruta, "r");
if (f!=NULL) {
do {
aux = fscanf(f, "%20s %17s %d\n", emplAux, macAux, &tiempo);
if ((aux==3) && (tiempo<menos)) {
strcpy(empleado, emplAux);
strcpy(mac, macAux);
menos = tiempo;
}
} while (aux==3);
fclose(f);
} else {
printf("Archivo no encontrado\n");
}
return;
}

10. Escribir una función randoms para que genere un archivo de texto, cuyo
nombre se indica como parámetro, con dos calificaciones numéricas reales
aleatorias (dentro del intervalo entre 0 y 10), separadas por caracteres de
coma, para cada uno de los 80 alumnos con nº de matrícula entre 22900
y 22979 (ambos incluidos), como, a modo de ejemplo, se muestra en la
figura de la derecha para las primeras siete líneas de texto. Además la
función debe retornar el valor 1 si ha conseguido generar el archivo
correctamente y 0 en caso contrario.

int randoms(char *s) {


int i;
FILE *f;
if (NULL!=(f=fopen(s, "w"))) {
for (i=0; i<80; i++) {
fprintf(f, "%d,%.1f,%.1f\n", 22900+i,
rand() % 101 / 10.0, rand() % 101 / 10.0);
}
fclose(f);
} else
return 0;
return 1;
}
D
NOMBRE...................................................................................................................................

NÚM. de MATRÍCULA...............................................................................................................

Examen final de Fundamentos de Programación. Junio de 2023


Instrucciones
• El examen consta de diez preguntas. Las respuestas puntúan cero o un punto excepto en la primera.
• Se calificará con un punto si la respuesta correcta se indica en la forma más simple.
• La duración total del examen será de 2 horas y 15 minutos.
• Las notas se publicarán en AulaWeb (19/06/2023). Revisión (23/06/2023). Actas (26/06/2023).

1. [0.5 puntos por cada apartado] Dado un formato de representación binaria de un valor numérico real en
coma flotante normalizada con 9 bits, 5 para mantisa y 4 para exponente, ambos en complemento a 2:
a) representar en este formato binario el valor decimal -0.0625 y 11000 1101
b) indicar, en el sistema numérico decimal, el valor positivo más
grande (el de mayor valor absoluto) que se puede representar. 0.9375· 27 = 120.00

2. Construir una función para que, dado un void fromBintoDec(int n, int *d) {
parámetro entero que sólo tiene cifras de int i = 1;
ceros y unos (como un número representado *d = 0;
do {
en el sistema binario), calcule y guarde el *d = *d + (n % 10)*i;
valor decimal correspondiente en la variable i = i * 2;
entera cuya dirección de memoria se indica n = n / 10;
en el segundo parámetro. Por ejemplo, la } while (n>0);
}
llamada a la función fromBintoDec(1110,
&d) deberá guardar el valor 14 en d.

3. Escribir una función ordenCreciente que, al ejecutarse, pida al usuario introducir por teclado valores
estrictamente positivos que sean asignados a los n primeros elementos de un array v de datos de tipo
double. La petición de valor para su asignación a cada elemento del array se debe repetir si el valor
introducido no es estrictamente mayor que el anterior. Por lo tanto, al terminar la ejecución de la función
los n primeros valores del array deben tener valores estrictamente positivos en orden estrictamente
creciente. v y n son los dos parámetros de la función. Nota: se supone que n es siempre mayor que 0.

void ordenCreciente(double * v, int n) {


int i;
do {
printf("Intro valor [0]: ");
scanf("%lf", &v[0]);
} while (v[0]<=0);
for (i=1; i<n; i++) {
do {
printf("Intro valor [%d]: ", i);
scanf("%lf", &v[i]);
} while (v[i]<=v[i-1]);
}
}
4. Laura ha escrito una función nvn que retorna el número de valores negativos almacenados en una
submatriz delimitada por las n primeras filas y n primeras columnas de una matriz a de números reales
de dimensiones DIM x DIM. a y n son los dos parámetros de la función. Se supone que n es siempre menor
o igual que DIM. Esta función NO hay que implementarla.
• SE PIDE completar la función main para que compruebe su
correcto funcionamiento en tres casos: siempre con la matriz a de la
figura de la derecha y para tres valores distintos de n (0, 2 y 5).

#include <stdio.h>
#define DIM 5
int nvn(double a[][DIM], int n) { /* Funcion ya codificada por Laura */ }
int main () {
int ok;

double a[DIM][DIM] = {{-2.3, -8.5, 0.9, 7.8, 9.6},


{-8.0, -4.2, 4.5, 4.2, 0.4},
{ 2.9, 1.5, -2.8, 4.1, -6.7},
{ 8.8, -5.0, 2.7, -1.3, 0.0},
{-6.3, 8.9, -5.8, 2.0, -2.5}};
ok = (nvn(a, 0) == 0) && (nvn(a, 2) == 4) && (nvn(a, 5) == 11);

if ( ok )
printf("Funciona BIEN en los tres casos\n");
else
printf("NO funciona bien\n");
return 0;
}

5. Construir una función includes que indique si todos los caracteres de una cadena s1 se encuentran en
otra s2. En este caso, la función debe retornar el valor 1 y, en caso contrario, debe retornar el valor 0.
s1 y s2 son los parámetros de la función. Si s1 está vacía la función debe retornar el valor 1. Por ejemplo,
la llamada a includes("ella", "clave") debe retornar el valor 1, mientras que includes("bola",
"pelota") debe retornar el valor 0. Nota: puede emplearse la librería string.h.
int includes(char *s1, char *s2) {
int i, j, distintos;
for (i=0; i<strlen(s1); i++) {
distintos = 0;
for (j=0; j<strlen(s2); j++)
if (s1[i]!=s2[j])
distintos++;
if (distintos==strlen(s2))
return 0;
}
return 1;
}

6. Escribir una función twins para que retorne 1 si los valores de todos los struct item {
campos respectivos de dos parámetros de tipo struct item son iguales y char id[9];
char clase;
0 en caso contrario. La declaración del tipo de dato struct item se facilita int un[10];
a la derecha. Nota: puede emplearse la librería string.h. };

int twins(struct item a1, struct item a2) {


int aux, i;
aux = !strcmp(a1.id, a2.id) && (a1.clase == a2.clase);
for (i=0; i<10; i++)
aux = aux && (a1.un[i] == a2.un[i]);
return aux;
}
7. Escribir un programa que pida al usuario introducir por teclado una cadena de caracteres (de tamaño
máximo 20) y, a continuación, un carácter. Seguidamente debe mostrar por pantalla el número de
caracteres de la cadena diferentes al carácter introducido y la propia cadena modificada sustituyendo
todas las veces que aparezca dicho carácter dado por '#'. Por ejemplo: si el usuario introduce "Barrida"
y 'a', entonces se mostrará por pantalla 5 y "B#rrid#". Nota: puede emplearse la librería string.h.
#include <stdio.h>
#include <string.h>
#define TAM 21
int main(){
char caracter;
char cadena[TAM];
int i, diferentes=0;
printf("Introduzca la cadena\n");
scanf("%20s", cadena);
fflush(stdin);
printf("Introduzca el caracter\n");
scanf("%c", &caracter);
for (i=0; i<strlen(cadena); i++) {
if(cadena[i]==caracter) {
cadena[i] = '#';
}
else {
diferentes++;
}
}
printf("%d %s", diferentes, cadena);
return 0;
}

8. Construir una función que retorne el elemento que almacene la hora más
tardía de los n primeros elementos de un array t formado con elementos de /* Declaracion
del tipo de
tipo struct hora. El campo hh puede almacenar valores entre 0 y 11, el dato: */
campo mm guarda valores entre 0 y 59 y el campo ap puede almacenar el valor
"AM" (Ante Meridiem) o "PM" (Post Meridiem). t y n son los dos parámetros de la struct hora {
función. Nota 1: Como ejemplo de comparación, la hora {0, 0, "PM"} es int hh;
int mm;
posterior a la hora {11, 59, "AM"}. Nota 2: Si n vale 0 entonces debe char ap[3];
retornar un elemento con el valor {0, 0, "AM"}. Nota 3: si es necesario };
puede emplearse la librería string.h.

struct hora examen(struct hora *t, int n) {


int i;
struct hora aux = {0, 0, "AM"};
for (i=0; i<n; i++) {
if (strcmp(aux.ap, t[i].ap)<0)
aux = t[i];
else if (!strcmp(aux.ap, t[i].ap) && (aux.hh<t[i].hh))
aux = t[i];
else if ((aux.hh==t[i].hh) && (aux.mm<t[i].mm))
aux = t[i];
}
return aux;
}
9. Una empresa desea incentivar la productividad de sus empleados. Para ello, realiza una monitorización
de los equipos para ver el tiempo dedicado a navegar por Internet. Se dispone de un archivo de texto con:
i) el nombre de usuario (máximo, 20 caracteres), ii) identificador MAC del equipo (17 caracteres) y iii)
número de minutos de navegación (valor entero), en cada línea
como, a modo de ejemplo, se muestra en la figura de la derecha.
SE PIDE: construir una función monitorear que, dada la ruta o
vía de acceso del archivo, devuelva el nombre del usuario y el
MAC del equipo con menos minutos de uso de Internet
mediante otros dos parámetros. Si el archivo no existe o está vacío entonces debe devolver dos cadenas
vacías.

#include <string.h>
void monitorear(char * ruta, char * empleado, char * mac){
int menos = 9999, aux, tiempo;
FILE * f;
char emplAux[21];
char macAux[18];
strcpy(empleado, "");
strcpy(mac, "");
f = fopen(ruta, "r");
if (f!=NULL) {
do {
aux = fscanf(f, "%20s %17s %d\n", emplAux, macAux, &tiempo);
if ((aux==3) && (tiempo<menos)) {
strcpy(empleado, emplAux);
strcpy(mac, macAux);
menos = tiempo;
}
} while (aux==3);
fclose(f);
} else {
printf("Archivo no encontrado\n");
}
return;
}

10. Escribir una función notas para que genere un archivo de texto, cuyo
nombre se indica como parámetro, con dos calificaciones numéricas reales
aleatorias (dentro del intervalo entre 0 y 10), separadas por caracteres de
coma, para cada uno de los 60 alumnos con nº de matrícula entre 22900
y 22959 (ambos incluidos), como, a modo de ejemplo, se muestra en la
figura de la derecha para las primeras siete líneas de texto. Además la
función debe retornar el valor 1 si ha conseguido generar el archivo
correctamente y 0 en caso contrario.
int notas(char *s) {
int i;
FILE *f;
if (NULL!=(f=fopen(s, "w"))) {
for (i=0; i<60; i++) {
fprintf(f, "%d,%.1f,%.1f\n", 22900+i,
rand() % 101 / 10.0, rand() % 101 / 10.0);
}
fclose(f);
} else
return 0;
return 1;
}

También podría gustarte