Está en la página 1de 12

Boletín de Ejercicios

Informática Aplicada (4º)


Boletín de ejercicios (2)

ESTRUCTURAS DE CONTROL

Ejercicio 1

Escribir un programa en C equivalente al siguiente fragmento de programa:

scanf ("%d", &a);


switch (a) {
case 2:
case 5:
case 8:
case 11: printf ("A");
break;
case 3:
case 6:
case 9:
case 12: printf ("B");
break;
case 4:
case 7:
case 10:
case 13: printf ("C");
break;
}

Ejercicio 2

Dado el siguiente programa en C:

#include <stdio.h>
main(){
int a, b, i, aux, resultado;

printf ("Introduce dos numeros enteros ");


scanf ("%d%d", &a, &b);
if (a>b) {
aux=a;
a=b;
b=aux;
}
resultado = 1;
for (i=a+1; i<=b; i=i+1){
resultado = resultado * i;
}
printf ("El resultado es: %d\n", resultado);
}

responder a las siguientes cuestiones:


a) ¿Cuál sería el resultado del programa si los datos introducidos fuesen 3 y 6?. Demostrarlo con una
traza.
b) ¿Y si los datos introducidos fueran 7 y 7?. No se pide traza.
c) ¿El resultado del programa depende del orden en que se introducen los datos? Explicar por qué.
d) Expresar con una fórmula qué cálculo hace este programa cuando a<=b.
Boletín de ejercicios (3)

Ejercicio 3

Realizar la traza del siguiente programa:

#include <stdio.h>

main(){
int A, B, D, N, M=0, i=0, j, k;

printf ("Introduce un numero entero: ");


scanf ("%d", &N);

A=N;
while ((A/10) != 0) {
A=A/10;
i++;
}
B=N;
for (j=i; j>=0; j--){
D=1;
for (k=0; k<j; k++) D=D*10;
M=M+(B%10)*D;
B=B/10;
}
printf ("El resultado es %d\n", M);
}

Ejercicio 4

Dado el siguiente programa en C

#include <stdio.h>
void main(){
int a,b,i,aux,resultado;

printf (“Introduzca dos numeros enteros: “);


scanf (“%d%d”, &a, &b);
if (a>b) {
aux=a;
a=b;
b=aux;
}
resultado = 1;
for (i=a+1; i<=b; i=i+1){
resultado = resultado * i;
}
printf (“El resultado es : %d \n”, resultado);
}

responde a las siguientes cuestiones:

a) ¿Cuál sería el resultado del programa si los datos introducidos fuesen 3 y 6?. Demuéstralo con una
traza.
b) ¿Y si los datos introducidos fuesen 7 y 7?.
c) ¿El resultado del programa depende del orden en que son introducidos los datos?
d) Expresa con una fórmula qué cálculo hace este programa cuando a<=b
Boletín de ejercicios (4)

Ejercicio 5

#include <stdio.h>
void main() {
float radio, resultado;

resultado = 200;
printf (“Introduzca dato: “);
while (dato>0) {
if (dato < 100) dato = dato + 200;
else if (dato < 200) dato = dato + 100;
if (dato > resultado) resultado = dato;
printf (“Introduzca dato: “);
scanf (“%f”, &dato);
}
printf (“El resultado es: %f\n”, resultado);
}

Dado el anterior programa en C, responde a las siguientes preguntas:


a) ¿Cuál sería el resultado del programa si los datos introducidos fuesen 333.3, 444.4, 777.7, 555.5 y
0 en este orden? Demuéstralo con una traza
b) ¿Y si los datos introducidos fuesen 30, 175, 25, 250 y 0 en este orden?
c) Suponiendo que el último dato introducido es siempre 0, ¿el resultado del programa puede ser
diferente si cambia el orden en que introducidos los restantes datos?

Ejercicio 6

#include <stdio.h>
void main(){
int numeroX, numeroY, misterioA, misterioB, misterioC;

printf (“Introduzca dos numeros: “);


scanf (“%d%d”, &numeroX, &numeroY);
misterioA = numeroX;
misterioB = numeroY;
while (misterioA != misterioB) {
if (misterioA < misterioB) {
misterioC=misterioA;
misterioA=misterioB;
misterioB=misterioC;
}
else misterioA=misterioA-misterioB;
}
printf (“El resultado es: %d \n”, misterioA);
}

Dado el siguiente programa en C responde a las siguientes preguntas:


a) ¿Cuál sería el resultado del programa si todos los datos introducidos son 15 y 21? Demuéstralo con
una traza
b) ¿Y si los datos introducidos fuesen 12 y 7?
c) Si el programa escribiese al final misterioB en vez de misterioA, ¿el resultado sería el
mismo?

Ejercicio 7

Hacer un programa en C que permita determinar la cantidad total a pagar por una llamada telefónica de
N pasos (introducido por el usuario), teniendo en cuenta lo siguiente:
a) toda llamada que sea menor o igual a 5 pasos tiene un coste de 10 pesetas.
b) cada paso adicional a partir de los 5 primeros cuesta 5 pesetas
Boletín de ejercicios (5)

Ejercicio 8

El número de individuos de una población animal afectada por una epidemia se reduce a la quinta parte
cada año. Escribe un programa en C que lea el número de individuos inicial y un número de años N y
escriba el número de individuos que quedarán en cada uno de los siguientes N años (al cabo de 1 año, a
cabo de 2 años, ..., al cabo de N años)

Ejercicio 9

En una industria se fabrican planchas rectangulares que se venden en lotes de 10 planchas. Una plancha
se considera defectuosa si su superficie es inferior a 4.4 metros cuadrados, y se considera buena si es
superior. Un lote se considera defectuoso si tiene una o más planchas defectuosas, y bueno si todas sus
planchas son buenas. Se dispone de los datos sobre el ancho y el largo de 500 planchas correspondientes
a 50 lotes. Escribe un programa en C que lea el ancho y el largo de las planchas y escriba:
- el número de lotes buenos
- la superficie media de todas las planchas de los lotes buenos

Nótese que no se pide la superficie media de todas las planchas buenas. El programa debe diseñarse
para que cuando se detecte que una plancha de un lote es defectuosa, no se incluyan los datos de las
planchas de este lote para calcular la superficie media. No se admite una solución que emplee vectores.

Ejercicio 10

a) Escribe un programa en C que realice el cálculo de la siguiente expresión para valores de x y N


dados:
x2 x3 xN
ex =1+ x + + + ... +
2! 3! N!
b) Modifica el programa anterior para que calcule la expresion anterior para un valor de x dado, hasta
que el último sumando sea inferior a un error máximo deseado.

Ejercicio 11

Los pacientes con síntomas de una cierta enfermedad son ingresados en el hospital si tienen un valor
superior a 0.6 en la medición de un determinado índice, y son operados si el valor es superior a 0.9.
Escribe un programa en C que lea desde teclado el número de pacientes seguido de la edad y el índice
de cada paciente, y calcule la edad media de los pacientes analizados así como de los ingresados y de
los operados.

Ejercicio 12

Una persona dispone de una cantidad de X pesetas que quiere repartir a un conjunto de personas. A
cada persona le da una cantidad de dinero proporcional a la edad de la misma. Por ejemplo, si una
persona tiene 17 años recibirá 17000 ptas y si tiene 32 años recibirá 32000. El problema consiste en
diseñar un algoritmo que devuelva el número de personas que podrán recibir una cantidad de dinero.
Cuando la cantidad de dinero ya no es suficiente para dársela a una persona, suponemos que no existen
más personas y que por tanto el programa finaliza.

Ejercicio 13

Se conocen los gastos en vivienda, alimentación, energía, vestuario y transportes de una familia durante
cada uno de los 12 meses del año. Escribe un programa en C que lea dichos datos y muestre por
pantalla el gasto total en cada trimestre, el gasto total anual y el porcentaje de gasto de cada concepto
sobre el total anual.
Boletín de ejercicios (6)

Ejercicio 14

Escribe un programa que calcule la composición de un capital a interés compuesto, según la fórmula:
Y = X ∗ (1 +1 / 100 ) N
El programa debe solicitar al usuario el capital prestado X y el tipo de interés I (un número real entre 5
y 12), y debe mostrar por pantalla el valor de Y (que es el capital equivalente a interés compuesto) para
N=1,2,...,15 años. El programa debe permitir al usuario repetir los cálculos con otros datos si lo desea,
terminando cuando se introduzca un valor 0 para X.

Ejercicio 15

Un autobús hace un recorrido por una ciudad desde un punto inicial donde suben N personas hasta un
punto final donde descienden todas. El autobús realiza X paradas intermedias. Se sabe que en las
paradas intermedias suben siempre 3 personas más que en la parada anterior y que desciende el 50% de
la gente del autobús (sin contar los que suben en dicha parada). ¿Cuántas personas llegarán hasta el
final del trayecto? Pedir al usuario los valores de N y X. Por ejemplo:
N = 10 X = 3
Inicio : nºpersonas = 10

Parada 1 : bajan = 5
suben = 13
nºpersonas = 18

Parada 2 : bajan = 9
suben = 16
nºpersonas = 25

Parada 3 : bajan = 12
suben = 19
nºpersonas = 32

Final del trayecto : 32 personas

Ejercicio 16

Dada la fecha de hoy, calcular la fecha del día siguiente. (Suponga que el año no es bisiesto).

Ejercicio 17

Una población de bacterias crece diariamente de acuerdo al siguiente patrón:


- Si existen menos de 700 bacterias, la población se triplica
- Si existen entre 700 y 6.000 bacterias, la población disminuye su tasa de crecimiento a un tercio
del existente cada día
- Si hay más de 6.000 y menos de 8.000, la población entra en crisis y empieza a decrecer a una
tasa de 1/32 diario
- Si hay más de 8.000, la población se estabiliza y crece a una tasa de 1/78 diario

Hacer un programa que lea la población inicial de bacterias, un límite de crecimiento deseado y diga
cuántos días se necesitan para alcanzar esa población, teniendo en cuenta los esquemas de crecimiento
especificados.

Ejercicio 18

Construir un programa que calcule y presente por pantalla el signo del zodiaco a partir de la
introducción por teclado del día y mes de nacimiento como números enteros.
Boletín de ejercicios (7)

DATOS

Capricornio del 22 de diciembre al 20 de enero


Acuario del 21 de enero al 19 de febrero
Piscis del 20 de febrero al 20 de marzo
Aries del 21 de marzo al 19 de abril
Tauro del 20 de abril al 20 de mayo
Géminis del 21 de mayo al 21 de junio
Cáncer del 22 de junio al 21 de julio
Leo del 22 de julio al 21 de agosto
Virgo del 22 de agosto al 22 de setiembre
Libra del 23 de setiembre al 22 de octubre
Escorpión del 23 de octubre al 21 de noviembre
Sagitario del 22 de noviembre al 21 de diciembre

Ejercicio 19

Escribir un programa que, dada la hora en un reloj digital de 24 horas, y el tiempo de cocción, calcule a
qué hora estará lista la comida.

VECTORES

Ejercicio 1

Escribe un programa que, dado un vector de N elementos (que se introducen por teclado), almacene en
un vector auxiliar cuántas veces aparecen cada uno de los elementos. Por ejemplo:
- vector leído : 2 5 1 4 2 1 2
- vector obtenido : 2 3 0 1 1
(el valor 1 aparece dos veces en el vector leído y por tanto la componente en la posición 1 del vector
obtenido vale 2; el valor 2 aparece tres veces en el vector leído y por tanto la componente en la
posición 2 del vector obtenido vale 3; el valor 3 no aparece en el vector leído y por tanto la componente
en la posición 3 del vector obtenido vale 0, ...)

Ejercicio 2

Una agencia de viajes lanza una oferta de 10 viajes para el verano del 99. La agencia desea poner en
marcha sólo aquellos viajes en los que el número de personas menores de 10 años no supere el 10% de
la gente apuntada a dicho viaje. Realiza un programa en C que lea la edad y el número de viaje elegido
por cada persona y diga qué viajes se ponen en marcha.

Ejercicio 3

a) La Escuela de Topografía de Marte dispone de 100 ordenadores para uso de los alumnos. Escribe
un programa en C que permita a los alumnos reservar el número de terminal deseado. Si el terminal
solicitado ya ha sido reservado por otro alumno, se le permitirá al alumno solicitar otro si lo desea.

b) Modificar el programa anterior para que cuando un alumno solicita un terminal se le pida su
número de matricula y se le deniegue la solicitud si ya tiene otra reserva realizada.

MATRICES

Ejercicio 1

Tenemos un tablero de ajedrez de 64 casillas (8*8). Las casillas que se encuentran en fila par y columna
impar tienen un número positivo (por ejemplo, las casillas (2,1), (4,5)) y las casillas de fila impar y
columna par tienen un número negativo (por ejemplo, las casillas (1,2), (3,6)). El problema consiste en
Boletín de ejercicios (8)

diseñar un algoritmo que pida los valores que contendrán las casillas y que diga si la suma de los
números positivos es superior a la de los negativos o viceversa.

Ejercicio 2

Se llama “punto de silla” de una matriz M cuadrada a un elemento Mij que es mínimo en su fila y
máximo en su columna, es decir
Mkj < Mij < Mik ∀k, 1<k<n
Escribe un programa en C que lea una matriz de enteros y determine si tiene puntos de silla,
escribiéndolos en tal caso mediante sus coordenadas i,j.
Nota : Considerar que no hay elementos repetidos en la matriz.

Ejercicio 3

Un cuadrado mágico es una matriz cuadrada con un número impar de filas y columnas, cuyas filas y
columnas (e incluso sus diagonales) suman el mismo valor. Por ejemplo, la matriz siguiente es un
cuadrado mágico de 3 por 3:
6 1 8
7 5 3
2 9 4
La técnica que se utiliza para generar los cuadrados mágicos es la siguiente:
- se comienza fijando un valor de 1 en el elemento central de la primera fila
- luego se van escribiendo los sucesivos valores (2, 3, etc) desplazándose desde la posición anterior
una fila hacia arriba y una columna a la izquierda.
- estos desplazamientos se tratan como si la matriz estuviera envuelta sobre sí misma, de forma que
moverse una posición hacia arriba en la fila superior lleva a la fila inferior y moverse una posición
hacia la izquierda desde la primera columna conduce a la última.
- si una nueva posición ya está ocupada, en lugar de hacer el movimiento habitual, nos desplazamos
una fila hacia abajo en la misma columna.

Escribir un programa que pregunte al usuario qué cuadrado mágico desea generar (introducirá el rango
de la matriz), generarlo y escribirlo en pantalla. Tener en cuenta que el rango de la matriz debe ser
impar.

Ejercicio 4

Escribir un programa que normalice los 20 números almacenados en un vector. Para ello, hay que
averiguar cuál es el mayor de los números y luego dividir cada número por dicho valor máximo, de
forma que los valores resultantes estén comprendidos en el intervalo del 0 al 1.

Ejercicio 5

a) El circuito siguiente es un circuito paralelo. Desarrollar un programa que calcule la resistencia total
de la rama que seleccione el usuario. La resistencia total de una rama es: RT = R1 + R2 + R3.
Permitir al usuario que introduzca los valores correspondientes a cada resistencia.

R11 R21 R31 R41

R12 R22 R32 R42

R13 R23 R33 R43


Boletín de ejercicios (9)

b) Modificar el programa anterior para que calcule la resistencia total de las ramas que seleccione el
usuario. La resistencia total se determina calculando la resistencia de las ramas implicadas y, a
continuación, aplicando la fórmula de la resistencia de un circuito paralelo: RT = 1/(1/Rt1 +
1/Rt2 + ... + 1/Rtn)

Ejercicio 6

La siguiente figura muestra los movimientos válidos del caballo de ajedrez. Escribir un programa que,
dadas la posición actual del caballo (fila, col) y la posición a la que se desea mover (filanue, colnue),
valide el movimiento devolviendo 1 si es correcto y 0 en caso contrario.

Ok Ok
Ok Ok
Caballo
Ok Ok
Ok Ok

VECTORES DE CARACTERES

Ejercicio 1

Dado un vector de N caracteres (letras y blancos), escribe un programa en C que sustituya en el mismo
vector los caracteres “ny” que encuentre por una “ñ”.

Ejercicio 2

Dadas dos cadenas S y T, cuyos caracteres se encuentran en orden alfabético, hacer una función en C
que pasándole como argumento ambas cadenas, almacene en otro vector la cadena resultante al ordenar
alfabéticamente los caracteres de las dos cadenas S y T.

Ejercicio 3

Escribir un programa que lea un vector de caracteres y calcule:


- cuántas palabras hay
- cuántas letras tiene cada palabra
- la palabra de longitud máxima
- la media de letras de todas las palabras

Ejercicio 4

Se tiene una matriz de N*M caracteres que contiene los nombres de N países, pudiendo éstos estar
repetidos. Los países NO están ordenados alfabéticamente y sus nombres pueden contener varias
palabras (es decir, espacios en blanco en el medio). Se pide un programa en C que realice las siguientes
funciones:
Boletín de ejercicios (10)

- Escribir todos los países que comienzan con una determinada letra.
- Obtener el nombre del país de mayor longitud y situarlo en la última fila de la matriz,
desplazando el resto de los países que estén situados después del país encontrado.
- Devolver el número de países que están repetidos. Un país sólo puede estar repetido una vez.

Ejercicio 5

Se tiene una matriz de caracteres que tiene ya almacenados los nombres de 100 países (máximo 50
caracteres) que están ordenados por orden alfabético. Se pide un programa en C que realice tantas veces
como sea requerido por el usuario la siguiente operación: buscar un país en la matriz de caracteres
(aplicar búsqueda binaria) y añadir al final del nombre del país el prefijo telefónico de dicho país (2
caracteres para el prefijo de teléfono) dejando un espacio en blanco entre el nombre y el código
telefónico. Si el país no existe, dar un mensaje de error.

ESTRUCTURAS DE DATOS

Ejercicio 1

Se dispone de un vector con información relativa a un conjunto de ciudades. Cada elemento del vector
contiene los siguientes datos:
 nombre de la ciudad : 40 caracteres
 número de habitantes : entero largo
 código de la provincia a la que pertenece la ciudad : entero
Se pide definir las estructuras de datos necesarias y funciones que desempeñen estas tareas:
 generar los datos del vector leyendo la información desde teclado, suponiendo que hay 100
ciudades.
 la suma total de habitantes de todas las ciudades que pertenecen a una provincia determinada
(identificada por su código)

Ejercicio 2

Se pretende gestionar el padrón de habitantes de un pequeño pueblo de 300 habitantes. De cada uno de
ellos se tiene:
 nombre y apellidos : cadena de 50 caracteres
 dirección : cadena de 40 caracteres
 edad : entero
 DNI : cadena de 8 caracteres
 estado civil : carácter (‘c’/’s’/’v’/’d’)
Se pide:
a) definir las estructuras de datos necesarias
b) una función de lectura de habitantes (que lea hasta 300 lecturas o hasta que el usuario escriba un
blanco cuando se pida el nombre). Esta función debe devolver un entero que será el número de
habitantes introducidos.
c) una función que, dada una dirección, nos liste en pantalla el nombre de los habitantes que viven en
la misma.
d) una función que cambie el estado civil de un habitante, del que conocemos su DNI, a un nuevo
estado dado (suponiendo el vector ordenado por DNI, la búsqueda debe ser lo más eficiente posible)

Ejercicio 3

Se quiere llevar el control de las medallas de los JJ.OO. Para cada uno de los 192 países se desea
guardar:
- nombre del país : 20 caracteres
- número de participantes
- número de medallas de oro
Boletín de ejercicios (11)

- número de medallas de plata


- número de medallas de bronce

a) definir las estructuras de datos necesarias


b) realizar una función para leer los datos. Como máximo debe leer 192 países o hasta que se le
indique que no se desea leer más. Debe devolver el número de países leídos.
c) una función que calcule el país con más medallas en total y que imprima el nombre de dicho país
d) una función que dado el nombre de un país incremente el número de medallas de cada clase que
tiene, según la cantidad que se le indique. Por ejemplo, si a la función se le pasa (“España”, 0, 1,
3), debería buscar a España y entonces incrementar el número de medallas de plata que tiene en
una y las de bronce en tres, miestras que dejaría las de oro con el número que tuviera.

Ejercicio 4

Se quiere realizar un programa para almacenar en un vector las quinielas jugadas por un aficionado al
fútbol. Para cada quiniela la información a guardar será:
- la columna jugada : 15 caracteres (por ejemplo, 1X121XX212X2121)
- el número de aciertos
- fecha del día al que corresponde

Suponiendo que el número de jornadas de quiniela es 20:


a) definir las estructuras de datos necesarias
b) escribir una función para introducir los datos de una quiniela
c) escribir una función que lea una fecha desde teclado, busque la quiniela jugada en esta fecha e
imprima los datos correspondientes

Ejercicio 5

Se quiere guardar información sobre una guardería a la que acuden 20 niños y lo que se desea es
mantener una ficha sobre cada uno de ellos con los siguientes datos: nombre y apellidos, sexo y edad.
Además se dispondrá de dos campos, que indicarán la hora en la que vino y la hora en la que recogieron
al niño.
El programa deberá tener una función para leer los datos de todos los niños, otra que sirva para dejar al
niño en la guardería (se deberá indicar nombre y apellidos del niño y hora) y otra función para saber,
dada una hora determinada, cuántos niños han llegado a la guardería antes de la hora indicada. Una
última función visualizará todos los datos almacenados.
El programa principal deberá tener un menú que permita llamar a cada una de las funciones
especificadas. El menú dispondrá de una opción para salir del programa.

Ejercicio 6

Se desea realizar un programa para mantener la clasificación de la liga de fútbol. El número de


participantes es 20. Por cada uno de ellos, se desea almacenar: el nombre del equipo, goles a favor,
goles en contra y número de puntos.

El programa debe tener una función para introducir los datos iniciales, otra para actualizar los datos por
jornada, indicando los goles encajados y marcados por cada equipo (el programa deducirá si ha ganado
(3 puntos), empatado (1 punto) o perdido (0 puntos)) y una última función que permita mostrar la
clasificación (ordenada, por supuesto)

Ejercicio 7

Una casa de subastas sólo admite 15 compradores por sesión. Por cada comprador se guarda su nombre,
dirección, cantidad total comprada y puja por el producto actual. Se pide un programa que primero
pedirá los datos de los compradores. Luego a partir de un menú se llamará a una serie de funciones:
visualizar toda la información, realización de una puja por un objeto (cada comprador introducirá
cuánto ofrece) y finalmente, una función que determine quién ha ofrecido más y adjudique el objeto a
Boletín de ejercicios (12)

ese comprador incrementando su cuenta de gastos. El menú dispondrá de una opción para salir del
programa.

Ejercicio 8

En una aerolínea muy conocida desean tener una ayuda con sus vuelos. Todos sus aviones tienen una
capacidad de 100 pasajeros y de cada uno se tiene la siguiente información:
- Nombre: máximo se almacenan 30 caracteres.
- Fumador o no
- Precio que pagó por el pasaje
- Peso del equipaje
-
La aerolínea desea que le entregue los siguientes informes:
- Información completa de todos los pasajeros
- Cuántos fumadores hay
- Total recaudado con los pasajes
- Peso total del equipaje