Soluciones

Anuncio
Soluciones
1. Cálculo área de un rectángulo.
Escribir un programa que haga lo siguiente:
 Solicite por pantalla la base y la altura de un rectángulo.
 Reciba los datos por parte del usuario.
 Muestre por pantalla el área del rectángulo, es decir, el producto de la base
por la altura.
Solución:
#include <stdio.h>
int main ()
{
int base, altura;
printf("\nCálculo del área de un rectángulo");
printf("\nPor favor, introduzca base y la altura: ");
scanf("%d%d", &base, &altura);
printf("\n\nEl área del rectángulo es: %d\n", base*altura);
return 0;
}
Nota: en función del sistema operativo y su conjunto de caracteres visibles por
consola, los acentos y la ñ se mostrarán o no correctamente. Para que se muestren
correctamente independientemente del sistema operativo hemos de sustituir el
conjunto de caracteres por el código que aparece a continuación:
Por ejemplo:
printf(“\n\nEl \240rea del rect\240ngulo es: %d\n”, base*altura);
2. Cálculos empleando funciones.
Escribir las siguientes expresiones en C:
a * pow(x,2) + b * x + c
(-b sqrt(pow(b,2) – 4 * a * c)) / (2 * a)
pow(sin(x + 1),2) - 1
Nótese la importancia de los paréntesis. Por ejemplo, en la segunda expresión, si no
ponemos el paréntesis que rodea a la sub-expresión 2 * a, puesto que los operadores
/ y * tienen la misma precedencia y se aplican de izquierda a derecha (ver diapositivas
de clase), se aplicaría la división y posteriormente se multiplicaría por a, de modo que
se alteraría el sentido de la expresión, pasando la a del denominador al numerador.
3. ¿Por qué es incorrecto esto…?.
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
switch(i){
case (i>0):
printf("i es positivo\n");
case (i<0):
printf("i es negativo\n");
case (i==0):
printf("i es cero\n");
}
}

En primer lugar, los distintos case de la instrucción switch van seguidos de
constantes (1, 2, ‘c’, etc), y no de expresiones booleanas como i>0, i<0 o i==0.
Para comprobar este tipo de condiciones haría falta una instrucción tipo
if/else.
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
if (i > 0)
printf("i es positivo\n");
else if (i < 0)
printf("i es negativo\n");
else
printf("i es cero\n");
return 0;
}

En segundo lugar, si tuviéramos una instrucción switch válida como en el
siguiente programa:
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
switch(i){
case 1:
printf("i es positivo\n");
case -1:
printf("i es negativo\n");
case 0:
printf("i es cero\n");
}
}
El programa seguiría sin comportarse como esperamos, ya que detrás de las
instrucciones printf al final de cada case debemos incluir una instrucción break
para forzar la salida del switch una vez impreso el resultado deseado. Por
último, sería aconsejable contemplar un caso “default” para cuando no se dé
ninguna de las condiciones previstas en el switch, de modo que ofrezcamos
información al usuario. Finalmente este código quedaría así:
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
switch(i){
case 1:
printf("i vale 1\n");
break;
case -1:
printf("i vale -1\n");
break;
case 0:
printf("i vale 0\n");
break;
default:
printf("El valor introducido no se corresponde con
ninguno de los resultados esperados (1, -1, 0).");
}
}
4. Cálculo de años bisiestos.
 Escribir un programa que lea de la entrada estándar valores que representan
años e indique si son o no bisiestos.
 El programa seguirá leyendo años hasta un máximo de 10 o hasta haber leído
3 bisiestos.
#include <stdio.h>
#define MAXANYOS 10
#define MAXBISIESTOS 3
int main()
{
int anyo, nanyos = 0, nbisiestos = 0;
do {
printf("\nIntroduzca el año: ");
scanf("%d",&anyo);
if (anyo%400 == 0 || (anyo%4 == 0 && anyo%100 != 0)){
printf("\nEl año es bisiesto!");
nbisiestos++;
} else
printf("\nEl año no es bisiesto...");
nanyos++;
} while (nanyos < MAXANYOS && nbisiestos < MAXBISIESTOS);
return 0;
}
El programa se podría haber resuelto igualmente con un bucle while o un bucle for,
pero con el do-while garantizamos que al menos se recorra el bucle la primera vez,
cosa que tiene sentido para este ejercicio. Así evitamos hacer una primera lectura de
año antes del while y otra dentro del mismo.
5. Cálculos estadísticos básicos.
 Escribir un programa para calcular estadísticas con una serie de valores (en
este caso, las edades de 15 personas, que solicitaremos al usuario).
 Los datos a calcular serán la media, la desviación típica, la moda y la mediana.
 Los datos obtenidos se mostrarán por pantalla.
#include <stdio.h>
#include <math.h>
#define PERSONAS 15
int main(void)
{
int edad[PERSONAS], i, j, aux , suma_edad;
float suma_desviacion, media, desviacion;
int moda, frecuencia, frecuencia_moda, mediana ;
/* Lectura de edades */
for (i=0; i<PERSONAS; i++)
{
printf ("Por favor, introduce edad de la persona número %d: ", i+1);
scanf ("%d", &edad[i]);
}
/* Cálculo de la media */
suma_edad = 0;
for (i=0; i<PERSONAS; i++)
suma_edad += edad[i];
media = suma_edad / (float) PERSONAS;
/* Cálculo de la desviacion típica */
suma_desviacion = 0.0;
for (i=0; i<PERSONAS; i++)
suma_desviacion += (edad[i] - media) * (edad[i] - media);
desviacion = sqrt( suma_desviacion / PERSONAS );
/* Cálculo de la moda */
/* Para el cálcula de la moda, vamos a ordenar el vector de edades y
* contar la longitud de cada secuencia de edades iguales. La edad
* cuya secuencia sea más larga es la moda */
for (i=0; i<PERSONAS-1; i++) // Ordenación mediante burbuja.
for (j=0; j<PERSONAS-i; j++)
if (edad[j] > edad[j+1])
{
aux = edad[j];
edad[j] = edad[j+1];
edad[j+1] = aux;
}
frecuencia = 0;
frecuencia_moda = 0;
moda = -1;
for (i=0; i<PERSONAS-1; i++) // Búsqueda de la serie
if (edad[i] == edad[i+1])
{
frecuencia++;
if (frecuencia > frecuencia_moda)
{
frecuencia_moda = frecuencia;
moda = edad[i];
}
}
else
frecuencia = 0;
/* Cálculo de la mediana */
mediana = edad[PERSONAS/2];
/* Impresión de resultados */
printf ("Edad media : %f\n",
printf ("Desv. típica: %f\n",
printf ("Moda
: %d\n",
printf ("Mediana
: %d\n",
return 0;
}
media);
desviacion);
moda);
mediana);
de valores idénticos más larga.
6. Cálculo del factorial de un nº.
 Escribir un programa para calcular el factorial de un número:
(5!=5 ∗4 ∗3 ∗2 ∗1)
 El programa deberá leer el número por pantalla, calcular el factorial y devolver
el resultado.
 Los datos obtenidos se mostrarán por pantalla.
#include <stdio.h>
int main ()
{
int numero;
long factorial = 1;
printf("\nIntroduzca el número: ");
scanf("%d", &numero);
for ( ;numero > 1; numero--) {
factorial = factorial * numero; //Igual: factorial *= numero;
}
printf("\nEl factorial vale: %ld\n",factorial);
return 0;
}
Acerca del cálculo del factorial…
 ¿Qué tipo de solución ha dado?  Solución iterativa, usando un bucle for.
 ¿Toda la funcionalidad en el main?  Sí, así se ha implementado.
 ¿Y si necesitamos utilizar la definición del factorial en otra funcionalidad?
 Necesitaríamos definir el factorial dentro de una función, para evitar
duplicar el código y permitir la reutilización de la funcionalidad aportada
por la función. De la siguiente forma:
#include <stdio.h>
long calcula_factorial (int);
int main ()
{
int numero;
printf("\nIntroduzca el número: ");
scanf("%d", &numero);
printf("\nEl factorial vale: %ld\n",calcula_factorial(numero));
return 0;
}
long calcula_factorial (int n) {
long factorial = 1;
for ( ; n > 1; n--) {
factorial = factorial * n; //Igual: factorial *= n;
}
return factorial;
}


¿Ha empleado una función iterativa?  Sí, la solución ha sido de nuevo
iterativa.
¿Podríamos haber optado por una solución recursiva?  Sí, sustituyendo la
función factorial anterior por la siguiente:
long calcula_factorial (int n) {
long factorial = 1;
if (n > 1)
factorial = n * calcula_factorial(n - 1);
return factorial;
}

¿Y si necesitáramos acceder a la funcionalidad desde otros ficheros? ¿sería
deseable que creáramos un módulo nuevo?  Lo veremos más adelante…
La idea:
o Declarar el prototipo de la función calcula_factorial en otro archivo (de
cabecera) factorial.h.
o Trasladar el código de la función (su definición) a un archivo factorial.c,
incluyendo en este archivo como segunda línea: #include “factorial.h”.
o Incluir en el archivo main la misma directiva #include “factorial.h”.
o A la hora de generar el programa, en la fase de enlazado incluir los
archivos compilados main.o y factorial.o.
Descargar