You are on page 1of 6

EXAMEN 13 de Enero de 2012

FUNDAMENTOS DE INFORMÁTICA– 1ª parte (1,5 puntos)
Nombre y apellidos: ...................................................................................

Grupo: .................... Especialidad: .................................................

NOTA: Tenéis 30 minutos para realizar esta 1ª parte.


1.(0,6 ptos.)Indica si son Verdaderas (V) o Falsas (F) las siguientes afirmaciones:
...V.... Un vector siempre está formado por datos del mismo tipo.
....F.... Toda función siempre debe tener como mínimo una sentencia return.
....F.... En una sentencia switch es obligatorio poner un break al final de cada case.
....F.... El tipo que se le asigna a una función es void siempre que ésta devuelva algo.
.....F... El número binario 101100101 en decimal es 145
....V.... El contenido de la memoria RAM se pierde cada vez que se apaga el ordenador.


2.(0,2 ptos.)¿Cuántos bits son necesarios como mínimo, para representar la edad de una persona?
(Supondremos que nadie vive más de 127 años)

 6
 8
√ 7
 5


3.(0,2 ptos.)Señala con una cruz todas las respuestas correctas, si de lo que se trata es de mostrar 5
asteriscos por pantalla

√ int i; for(i=1;i<32;i=i*2) {printf(“*”); }
√ printf(“*****”);
 int i; for (i=5;i>0;i++) {printf(“*”); }
 int i=0; while (i<5){printf(“*”);}


4.(0,5 ptos.) Rellenar los huecos del siguiente programa de forma que, lea dos números enteros y
muestre en pantalla todos los números comprendidos entre dichos números, ambos incluidos. El
programa no debe suponer que el primero será menor que el segundo, ni viceversa, pero sí que
deberá tenerlo en cuenta para mostrar los números en orden creciente o decreciente según
corresponda.
Los números serán mostrados por filas, de forma que cada fila tenga nPorFila números. El número
de números por fila, nPorFila, será leído al principio del programa. Cada número irá separado del
siguiente por el carácter tabulador ('\t').

#include <stdio.h>
main()
{ int n1,n2,i,nPorFila,contador=0;

printf("Dame el primer número: ");
scanf("%d", &n1);
printf("Dame el segundo número: ");
scanf("%d", &n2);
printf("Dime cuántos números por fila: ");
scanf("%d", &nPorFila);

if (n1<n2) /* orden creciente */
{
for(..i=n1 ; i<= n2 ; i++..........)
{
printf("%d ", i);
contador++;

if (....contador % nPorFila != 0 )
{printf("\t"); /* tabulador */}
else {printf("\n"); /* nueva línea */}
}
}
else /* orden decreciente */
{
for(...i=n1 ; i>=n2 ; i--.....)
{
printf("%d ", i);
contador++;

if (....contador % nPorFila != 0....)
{printf("\t");}
else {printf("\n");}
}
}
}



EXAMEN 13 de Enero de 2012
FUNDAMENTOS DE INFORMÁTICA– 2ª parte (4,5 puntos)
Nombre y apellidos: ...................................................................................
Grupo: ..................... Especialidad: ..............................................
NOTA: Tenéis 2 horas para realizar esta 2ª parte.
1. (2 ptos.) Escribe un programa que lea un número y realice el siguiente proceso, utilizando cómo
mínimo dos funciones:
a. Primeramente presentará en pantalla el número leído, si no tiene 8 dígitos lo indicará y se
ciclará pidiéndolo nuevamente hasta que sea correcto. Supondremos que el valor mas bajo
del número comenzará en el 10000000.
b. A continuación imprimirá la codificación del número respondiendo al siguiente patrón: se
recorrerán los dígitos del número de derecha izquierda y cada dígito se codificará en una
línea con tantos guiones ('-') como el valor del dígito, seguidos al final por un asterisco
('*').

Ejemplo (en negrita los datos introducidos por el usuario):
Dame un número: 1234567
1234567
Error el número debe contener 8 dígitos

Dame un número: 15238467
15238467
-------*
------*
----*
--------*
---*
--*
-----*
-*
SOLUCION
#include<stdio.h>
#include<stdlib.h>
long leerDniCorrecto();
void escribirCaracter(char k, int num);
main()
{
long dni;
int d,i;

dni = leerDniCorrecto(); //recoge el dni correcto

for (i=1; i<=8 ;i++) //separamos los 8 dígitos. También se podría hacer
{ d=dni%10; // con la condición while (dni>0)
dni=dni/10;
escribirCaracter('-', d); // escribe el caracter '-' tantas veces como
// indica el dígito d
printf("*\n");

}

system("PAUSE");
}
//Esta función lee los dni introducidos hasta que sea correcto

#include <stdio.h>
#define MinDni 10000000
#define MaxDni 99999999

long leerDniCorrecto()
{ long dni;

printf("Dame tu DNI: ");
scanf("%ld", &dni);
while (dni<MinDni||dni>MaxDni){
printf("Error el DNI debe contener 8 digitos\n");
printf("Dame tu DNI: ");
scanf("%ld", &dni);
}
return dni;
}
//Esta función escribe el caracter recibido en k tantas veces como indique num
#include <stdio.h>
void escribirCaracter(char k, int num)
{ int i;
for (i=1; i<=num; i++){
printf("%c", k);
}
}
2. (1 pto.) Realiza el programa principal para que, dada una secuencia de números reales (no
superior a 100 elementos) terminada en 0, calcule la suma de reales no negativos contiguos y
escriba por pantalla la mayor de la sumas obtenidas, empleando para ello las siguientes
funciones ya implementadas (es decir, nos las dan ya programadas):
int registroValoresR (float v[], int vLong);
/* Registra en la tabla v a lo sumo vLong valores reales, valores que se obtienen por el teclado hasta
que el usuario introduzca el número 0. Y además devuelve el número de elementos introducidos en el
vector v. */

float sumaPositivosContiguos (float v[], int vLong, int &p)
/* Calcula y devuelve la suma de los valores reales positivos contiguos. El parámetro p recibirá la
posición del primer valor positivo a sumar y devolverá la posición del primer negativo o vLong (en
el caso de no haber más datos negativos).*/

void saltarNegativos (float v[], int vLong, int &p)
/* Busca la posición del siguiente valor positivo. El parámetro p recibirá el valor de la posición en la
que se encuentra un número negativo y devolverá la posición del primer valor positivo encontrado o
vLong (en el caso de no haber más datos positivos).

Ejemplo(en negrita los datos introducidos por el usuario):
Dame una secuencia terminada en 0:
-3 2 5 3.1 -2 -1.2 21 12.7 -15 20 0
La suma máxima de los positivos contiguos: 33.7
SOLUCION
int registroValoresR (float v[], int vLong);
float sumaPositivosContiguos (float v[], int vLong, int &p);
void saltarNegativos (float v[], int vLong, int &p);
main()
{ float v[MaxPos], sumaPos, sumaMax;
int p, numElem;

numElem=registroValoresR(v, MaxPos);
p=0;
sumaMax=0;
while (p<numElem)
{ saltarNegativos(v, numElem, p);
sumaPos=sumaPositivosContiguos(v, numElem, p);
if (sumaPos>sumaMax)
{sumaMax=sumaPos;}
}
printf("La suma máxima de enteros positivos contiguos: %.2f\n", sumaMax);

}
3. (1,5 ptos.) Hemos realizado un programa que calcula diversas estadísticas con las notas de los
alumnos de primer curso de la EUPD. Para ello el programa utiliza una matriz en la que se
guardan las notas de todos los alumnos en todas las asignaturas:

float calificacion[NumAsig][NumAlumn];

calificacion[i][j]=X, con 0≤X≤10 recoge la calificación numérica real que ha obtenido en la
asignatura i el alumno j, por ejemplo, 7.35

calificacion[i][j]=-1, indica que en la asignatura i el alumno j no se ha presentado.

Nos han solicitado nuevos datos para lo cuál tendréis que implementar las siguientes funciones:

(1) La función mediaAsignatura que realizará lo siguiente: por cada asignatura calculará
en el vector numAprobadosAsig[] el número de alumnos que la han superado y en el vector
mediaAprobadosAsig[]la nota media de la asignatura con los alumnos aprobados. Para
ello, recibirá como entrada la matriz calificacion[][NumAlumn]con todas la notas.

void mediaAsignatura (float calificacion[][NumAlumn], int asignaturas,
int numAprobadosAsig[], float mediaAprobadosAsig[]);

(2) La función mediaCurso que realizará lo siguiente: calcular la nota media de los
presentados mediaPres y la nota media de los aprobados mediaAprob. Para ello, recibirá
como entrada la matriz calificacion[][NumAlumn]con todas la notas y devolverá por
referencia, al programa principal, las dos medias calculadas: mediaPres y mediaAprob.

SOLUCION 1
void mediaAsignatura(float notas[][NumAlum], int asignaturas, int numAprobadosAsig[], float
mediaAprobadosAsig[])
{ float suma;
int i, j;

for (j=0; j<asignaturas; j++)
{ suma = 0;
numAprobadoAsig[j]=0;
for (i=0; i<NumAlum; i++)
{ if (notas[j][i]>=5)
{ numAprobadosAsig[j]++;
suma=suma+notas[j][i];
}
}
mediaAprobadosAsig[j]=suma/numAprobadosAsig[j];
}
}
SOLUCION 2
void mediaCurso(float notas[][NumAlum], int asignaturas, float &mediaPres, float
&mediaAprob)
{ float sPresentados=0, sAprobados=0;
int nPresentados=0, nAprobados=0;
int i, j;

for(i=0; i<alumnos; i++)
{ for (j=0; j<NumAsig; j++)
{ if (notas[j][i]!=-1)
{ sPresentados = sPresentados+ notas[j][i];
nPresentados = nPresentados+1;
if (notas[j][i]>=5)
{ sAprobados = sAprobados+notas[j][i];
nAprobados = nAprobados+1;
}
}
}
}
if (nPresentados!=0) {mediaPres = sPresentados/nPresentados;}
else{mediaPres=0;}
if (nAprobados!=0) {mediaAprob = sAprobados/nAprobados;}
else{mediaAprob=0;}
}