You are on page 1of 8

EXAMEN 7 de Enero de 2013

FUNDAMENTOS DE INFORMÁTICA– 1ª parte (1,75 puntos)
Nombre y apellidos: ..................................................................................................
Grupo: ........................ Especialidad: ........................................................................
NOTA: Tenéis 40 minutos para realizar esta 1ª parte.

1. (0.3 ptos.)Indica si son Verdaderas (V) o Falsas (F) las siguientes afirmaciones:
....F....Una función en C siempre devuelve un dato.
....V....Una variable de tipo char puede almacenar cualquier tipo de carácter, incluso aquellos que
representen dígitos.
....V....El número menor de bits para almacenar 300 modelos de camisas es de 9 bits.
.....F...La CPU es la parte del sistema operativo que controla el hardware del ordenador.
.....F...Un kilobyte equivale a 1024 MB
….F...Las instrucciones incluidas en un do- while pueden no llegar a ejecutarse.

2. (0.2 ptos.) Indica cuántas iteraciones del bloque se realizan al ejecutar el siguiente bucle:
for (i=0 ; i<6 ; i++)
{
for (j=0 ; j<i; j++)
{/* bloque*/}
}

Rodea con un círculo la respuesta correcta:
• 25
• 15 V
• 36
• 21

3. (0.5ptos.) ¿Qué imprime por pantalla el siguiente programa?
#include <stdio.h>
#include <stdlib.h>

main()
{int serie=1,sw=1;

do
{
printf("%d, ",serie);
if (sw==1)
{serie=serie+4;
sw=0;
}
else
{serie=serie-2;
sw=1;
}
}while (serie<=11);
system("PAUSE");
}

1,5,3,7,5,9,7,11,9,

4. (0.75 ptos.) El cuadrado de un número entero y positivo es igual a la suma de tantos números
impares consecutivos (desde el 1) como unidades tiene el número. Es decir, 3
2
es igual a
1+3+5; 6
2
es igual a 1+3+5+7+9+11

Escribe un programa que, de forma iterativa, haga lo siguiente en cada iteración: solicite un
número entero y si es positivo muestre por pantalla su cuadrado utilizando el algoritmo
indicado, y si es negativo muestre un mensaje de error. El programa finalizará cuando se
introduzca el número 0.

#include <stdio.h>
#include <stdlib.h>
main(){
int n, suma, impar,i;

printf("Dame un número.(Para finalizar introduce 0) :");
scanf("%d", &n);
while (n!=0){
if (n<0)
{printf("Error!!! el número tiene que ser positivo!!!\n");}
else
{
suma=0;
impar=1;
for (i=1; i<=n; i++)
{ suma=suma+impar;
impar=impar+2;
}
printf("Cuadrado: %d\n", suma);
}
printf("Dame un número.(Para finalizar introduce 0) : ");
scanf("%d", &n);
}
system("PAUSE");

}

Otras formas de calcular el cuadrado con la suma de tantos números impares
consecutivos:

suma=0;
for (i=1; i<=n; i++)
{
suma=suma+(2*i-1);

}
printf("Cuadrado: %d\n", suma);


suma=0;
for (i=1; i<n*2; i=i+2)
{
suma=suma+i;

}
printf("Cuadrado: %d\n", suma);


suma=0;
impar=1;
i=1;
while( i<=n)
{
suma=suma+impar;
impar=impar+2;
i++;

}
printf("Cuadrado: %d\n", suma);


EXAMEN 7 de Enero de 2013
FUNDAMENTOS DE INFORMÁTICA– 2ª parte (4,25 puntos)
Nombre y apellidos: .............................................................................................
Grupo: ......................... Especialidad: ..................................................................
NOTA: Tenéis 1 hora 50 minutos para realizar esta 2ª parte.
1. (1.25 puntos) Propiedad: Algunos números puede ser representados por la suma de los cubos de
sus dígitos. Por ejemplo, uno de esos números es el 153 , ya que:
1
3
+5
3
+3
3
=1+125+27=153
Hacer un programa que muestre todos los números comprendidos entre 100 y 500 que
cumplan esta propiedad. Para solucionar este problema debéis utilizar las siguientes
funciones:
• separarEnDigitos: recibirá un número entero y devolverá sus tres dígitos.
• sumaCuboDigitos: recibirá tres dígitos y devolverá la suma de los cubos de dichos
dígitos.

#include <stdio.h>
#include <stdlib.h>
void separarEnDigitos(int x, int &d1, int &d2, int &d3);
int sumaCuboDigitos(int d1, int d2, int d3);

main()
{
int n, d1, d2, d3;

for (n=100; n<=500; n++)
{
separarEnDigitos(n, d1, d2, d3);

if (n==sumaCuboDigitos(d1, d2, d3))
{printf("%d cumple la propiedad\n", n);}
}
system("PAUSE");
}
//FUNCIONES

void separarEnDigitos(int x, int &d1, int &d2, int &d3){

d1=x/100;
d2=(x%100)/10;
d3=x%10;
}

#include <math.h>
int sumaCuboDigitos(int d1, int d2, int d3)
{ int suma;
suma = pow(d1,3) + pow(d2,3) + pow(d3,3);
return suma;
}
2. (1.5 puntos) Realizar un programa que lea dos secuencias de como máximo 100 números
finalizadas en -1. Posteriormente, pedirá un número al usuario e indicará si este número ha
aparecido en las dos secuencias, sólo en una o en ninguna.
Para solucionar este problema deberéis utilizar las siguientes funciones:
• •• • llenarVector: leerá una secuencia de máximo 100 números terminada en -1 y la
guardará en un vector.
• •• • buscarNumero: dado un número y un vector, nos dirá si el número está en el vector o
no.

#include <stdio.h>
#include <stdlib.h>
#define TOPE 100

int llenarVector(int t[], int pos);
int buscarNumero(int z, int t[], int pos);

main()
{
int t1[TOPE], t2[TOPE];
int long1, long2, n, esta1, esta2;

printf("Dame la primera secuencia ...\n");
long1 = llenarVector(t1, TOPE);

printf("Dame la segunda secuencia ...\n");
long2 = llenarVector(t2, TOPE);


printf("Dame el numero a buscar en las secuencias: ");
scanf("%d", &n);

//buscamos el numero n en la primera secuencia
esta1 = buscarNumero(n, t1, long1);
//buscamos el numero n en la segunda secuencia
esta2 = buscarNumero(n, t2, long2);
//escribir la solución
if (esta1 == 1 && esta2 == 1) {
printf(" el numero %d esta en las dos secuencias \n", n);
}
else {
if (esta1 == 0 && esta2 == 0) {
printf("el numero %d no esta en ninguna secuencia \n", n);
}
else {printf("el numero %d esta solo en una de las secuencas \n", n);}
}
system("PAUSE");
}

FUNCIONES:

#include <stdio.h>

int llenarVector(int t[], int topeDatos)
{int i, x;
i = 0;
printf("Dame un numero(para finalizar -1): ");
scanf("%d", &x);
while (x!=-1 && i<topeDatos)
{
t[i] = x;
i++;
printf("Dame un numero(para finalizar -1): ");
scanf("%d", &x);
}
return i;
}


int buscarNumero(int z, int t[], int topeDatos)
{ int i, encontrado;
encontrado=0;
for (i=0; i<topeDatos; i++)
{
if (z == t[i])
{encontrado=1;}
}
return encontrado;
}



3. (0.75 puntos) Escribir una función que nos devuelva un número en el sistema decimal a partir de
un número en binario. Para ello, la función recibe un vector que contiene el número en binario
(en cada posición del vector hay un bit).
Por ejemplo, si en el vector v tenemos el número binario:

Habrá que realizar el siguiente proceso:
0 00 0⋅ ⋅⋅ ⋅2
4
+1 11 1⋅2
3
+0 00 0⋅2
2
+0 00 0⋅2
1
+1 11 1⋅2
0
=9
El prototipo de la función será: int numero_decimal (int v[], int TopeBits);
NOTA: Se recomienda utilizar la función pow()

#include <stdio.h>
#include <stdlib.h>
#define TOPE 10
int numero_decimal(int v[], int topeBits);

main()
{ int binario[TOPE] = {0,1,0,0,1};
printf("es el número decimal %d \n", numero_decimal(binario, 5));
system("PAUSE");
}
//En el examen sólo se pide la función

#include <stdio.h>
#include <math.h>
int numero_decimal(int v[], int topeBits)
{
int suma=0, i;

for (i=0; i<topeBits; i++){
printf("%d - %d\n", v[i], topeBits-i-1);
suma = suma + v[i]*pow (2, topeBits-i-1);
}
return suma;
}

Otra forma de hacerlo:

int numero_decimal(int v[], int topeBits)
{
int suma=0, i, j;
j=topeBits-1; //peso del bit
for (i=0; i<topeBits; i++)
{
printf("%d - %d\n", v[i], j); // mostramos el bit y su peso
suma = suma + v[i]*pow (2, j);
j--;
}
return suma;
}
0 1 2 3 4
0 1 0 0 1
Peso del bit
4. (0.75 puntos) Una empresa tiene los datos de la producción de sus 100 empleados durante 30
días. Realizar una función que calcule y devuelva cuántos empleados no han trabajado
durante los 30 días, es decir, tienen la producción de todos los días a 0.

El prototipo de la función será el siguiente:

int contarEmpleados (int produccionEmpleado[][30],int TopeEmpleados);

#include <stdio.h>
#include <stdlib.h>
#define EMPLEADOS 100
#define DIAS 30

int contarEmpleados ( int produccionEmpleado[][30], int topeEmpleados);

main()
{ //ponemos toda la matriz a cero para probarlo
int produccion[EMPLEADOS][DIAS] = {{0}};
printf("no han trabajado ningun dia %d empleados \n", contarEmpleados(produccion, EMPLEADOS));
system("PAUSE");
}
//En el examen sólo se pide la función

int contarEmpleados(int produccionEmpleado[][30], int topeEmpleados)
{
int contE = 0, contD, t, d;

for (t=0; t<topeEmpleados; t++)
{
contD = 0;
for (d=0; d<30; d++)
{
contD = contD + produccionEmpleado[t][d];
}

if (contD == 0)
{contE++;}
}
return contE;
}