PRACTICA 4: EJERCICIOS RESUELTOS.

Ejercicio 1: El primer programa.
Ejercicio 2: Una conversación en C.
Ejercicio 3: Una pequeña operación aritmética.
Ejercicio 4: Preguntas indiscratas.
Ejercicio 5: Programa que suma los cinco primeros números naturales.
Ejercicio 6: Modifica el programa mascota.c.
Ejercicio 7: Modifica el programa suma_int.c.
Ejercicio 8: Solución de la ecuación de segundo grado.
Ejercicio 9: Para expertos.



Ejercicio 1: EL PRIMER PROGRAMA. Top

Para que tu debut como programador en C sea todo un éxito, te hemos preparado un sencillo programa de bienvenida.

Solución al Ejercicio 1:


// fichero primero.c 
// Este programa saluda desenfadadamente. 
#include <stdio.h>
void main(void)
{
    printf("¡Hola! ¿Qué tal estás, futuro programador?\n");
}


Comentario: La primera línea de este programa es un comentario, y es ignorado por el compilador. La directiva #include permite utilizar la librería stdio, indispensable para diferentes instrucciones de entrada/salida del lenguaje C. El fichero stdio.h contiene las declaraciones de las funciones de entrada/salida, así como definiciones de constantes simbólicas y algunas otras definiciones de utilidad. La palabra void es opcional; indica que la función main() no tiene valor de retorno ni argumentos.



Ejercicio 2: UNA CONVERSACIÓN EN C. Top

Seguro que el programa del ejercicio anterior te ha dejado con ganas de responder a la pregunta que aparece en la pantalla. Para ello es necesario introducir la función scanf(). Esta función permite leer tanto números como cadenas de caracteres. Pero cuando encuentra blancos, tabuladores o espacios en blanco, termina de leer.

Solución comentada al Ejercicio 2.


// fichero segundo.c
// Este programa saluda más personalmente 
#include <stdio.h>
void main(void)
{
    char nombre[30];
    printf("¡Hola! ¿Cómo te llamas?\n");
    scanf("%s", nombre);
    printf("¿Qué tal estás, %s?\n", nombre);
}


Comentario: La sentencia char nombre[30], declara una variable llamada nombre que es una cadena de 30 caracteres (tipo char). Estos caracteres se numeran del 0 al 29, y deben incluir la marca de fin de cadena '\0'. Con la función scanf(), se lee lo que será el contenido dicha cadena por medio del formato %s, que es propio de las cadenas de caracteres. Como la lectura se detiene al encontrar un blanco, un carácter nueva línea o un tabulador, por medio de este programa no se puede leer una frase sino sólo una palabra.

Obsérvese que a la función scanf() hay que pasarle los argumentos por referencia. Como nombre es de por sí la dirección de nombre[0] no hace falta precederlo por el operador (&).



Ejercicio 3: UNA PEQUEÑA OPERACIÓN ARITMÉTICA. Top

Estarás pensando que el C ha de servir para algo más que mantener una aburrida conversación con tu pantalla (¿amiga?). En el siguiente programa te presentamos un avance de las "complicadas" operaciones que puede realizar el C. Escribe el programa y sálvalo como maraton.c.

Compila el programa y ejecútalo; apuntando el resultado. Después modifica el programa sustituyendo 1760.0 por 1760 en la línea que calcula el número de kilómetros. Vuelve a compilar y a ejecutar. ¿Sale lo mismo que antes? ¿Qué ha podido pasar?

Solución comentada al Ejercicio 3.


// fichero marathon.c 
//    Un marathon tiene 26 millas y 385 yardas. 
//    Calcula la distancia del marathon en kilómetros. 
//    Una milla tiene 1760 yardas. 
#include <stdio.h>
void main(void)
{
    int    millas, yardas;
    float  kilometros;
    millas = 26;
    yardas = 385;
    kilometros = 1.609 * (millas + yardas / 1760.0);
    printf("\nUn marathon tiene %f kilometros.\n\n", kilometros);
}


Comentario: En C las constantes que incluyen un punto decimal son de tipo double. La variable yardas es de tipo int. Si en el denominador se pone sólo 1760, el resultado de yardas/1760 es entero y por tanto incorrecto. Basta poner 1760.0 para que yardas sea promovido a double y todas las operaciones aritméticas de esa sentencia se realicen con precision double.


Ejercicio 4: PREGUNTAS INDISCRETAS. Top

En este programa vas a utilizar la función scanf() con distintos tipos de variables. De paso podrás contestar a algunas preguntas indiscretas, pero de indudable interés social. El siguiente programa debe ser almacenado en un fichero llamado mascota.c.

Si tu mascota favorita es una boa, una ardilla o una gacela, tendrás que cambiar el artículo "un" por "una", para respetar la concordancia.

Solución comentada al Ejercicio 4.


// fichero mascota.c 
#include <stdio.h>
void main(void)
{
    int   edad;
    float sueldo;
    char  cachorro[30];
    printf("Confiesa tu edad, sueldo y mascota favorita.\n");
    scanf("%d %f",&edad, &sueldo);
    scanf("%s", cachorro);
    printf("%d %.0f pts. %s\n",edad, sueldo, cachorro);
    printf("Un ¡¡%s!!", cachorro);
    printf("¿Cómo te puede gustar un %s?\n", cachorro);
}


Comentario: En la función scanf(), se incluye el operador dirección (&) delante de las variables escalares para pasar a la función las direcciones de dichas variables (paso de argumentos por referencia). De esta forma la función scanf() puede depositar en las direcciones de memoria correctas los valores que lee desde teclado. Recordemos que para leer cadenas de caracteres basta poner el nombre de la cadena, que de por sí ya es una dirección.



Ejercicio 5: PROGRAMA QUE SUMA LOS CINCO PRIMEROS NÚMEROS NATURALES. Top

Se presenta a continuación un programa que utiliza la sentencia while para definir un bucle. El programa sumará de forma automática los cinco primeros números naturales. Sálvalo con el nombre suma_int.c.

Solución comentada al Ejercicio 5.


// fichero suma_int.c 
// Programa para calcular la suma de los enteros del 1 al 5 
#include  <stdio.h>
void main(void)
{
    int i = 1, suma = 0;
    while (i <= 5) {       // se ejecuta el bloque mientras i<=5 
        suma += i;         // equivale a  suma=suma+i; 
        ++i;               // equivale a  i=i+1; 
    }
    printf("suma = %d\n", suma);
}


Comentario: El bucle while realiza la sentencia simple o compuesta que le sigue mientras la condición definida entre paréntesis sea verdadera (es decir distinta de cero). El bucle while del programa anterior podía también haberse escrito en la siguiente forma (más compacta):

    while (i <= 5)        // se ejecuta el bloque mientras i<=5 
        suma += i++;      // equivale a  suma=suma+i e i=i+1; 

No hacen falta las llaves porque sólo hay una sentencia simple detrás del while.



Ejercicio 6: MODIFICA EL PROGRAMA mascota.c. Top

En este ejercicio se te pide una modificación del programa del Ejercicio 4. Edita el programa mascota.c y guardado con el nombre pregunta.c, modificándolo de manera que una vez ejecutado nos pregunte el número de calzado, peso y color favorito.

Solución comentada del Ejercicio 6.


// fichero pregunta.c 
#include <stdio.h>
void main(void)
{
    int   calzado;
    float peso;
    char  color[20];
    printf("Confiesa tu calzado, peso y color favorito:\n");
    printf("\n       Calzado: ");
    scanf("%d", &calzado);
    printf("\n          Peso: ");
    scanf("%f", &peso);
    printf("\nColor favorito: ");
    scanf("%s", color);
    printf("¡El %s!\n", color);
    printf("¿Cómo puede gustarte el %s\n", color);
    printf("Calzando un %d y pesando %6.2f Kg.?\n", calzado, peso);
}


Comentario: En la función printf() hay que utilizar diferentes formatos de salida para las variables que deseamos imprimir en pantalla. Así, el formato %6.2f: mostrará peso en 6 espacios, de los cuales dos serán para los decimales y uno para el punto decimal. Observa cómo se pide el peso, calzado y color favorito de forma que los dos puntos (:) queden alineados en la pantalla.



Ejercicio 7: MODIFICA EL PROGRAMA suma_int.c. Top

Se trata del programa que suma los cinco primeros enteros que se presentó en el Ejercicio 5. En primer lugar se deberá editar este programa y salvarlo con el nombre suma_for.c.

Se te pide que modifiques la copia (suma_for.c) para que el programa realice lo mismo (sumar los cinco primeros enteros), pero empleando un bucle for en lugar de un bucle while.

Solución comentada del Ejercicio 7.


// fichero suma_for.c 
#include <stdio.h>
void main(void)
{
    int i, suma;
    suma = 0;
    for(i=0; i<=5; i++)
        suma += i;
    printf("La suma de los cinco primeros números es: %d\n", suma);
}


Comentario: En este fichero se ha utilizado la equivalencia directa entre los bucles for y while. Por lo demás, este programa no tiene nada de particular.



Ejercicio 8: SOLUCIÓN DE LA ECUACIÓN DE SEGUNDO GRADO. Top

Dada la ecuación de segundo grado:

hay que calcular el discriminante:

Se pueden presentar tres casos distintos:

Teclea y compila el siguiente programa para resolver la ecuación de segundo grado. Llámalo ec2.c. Compila y ejecuta este programa cambiando los valores de a, b y c, de modo que se prueben las tres opciones del programa.

Solución comentada al Ejercicio 8.


// fichero ec2.c 
// resolución de la ecuación de segundo grado 
#include <stdio.h>
#include <math.h>       // incluye decl. de la función sqrt() 
void main(void)
{
    double a, b, c;
    double discr, x1, x2, xd, xr,xi;
    printf("Escribe los valores de los coeficientes A, B y     C\n");
    scanf("%lf%lf%lf", &a, &b, &c);
    discr = b*b - 4.0*a*c;
    if (discr>0.0) {
        x1 = (-b+sqrt(discr))/(2.0*a);
        x2 = (-b-sqrt(discr))/(2.0*a);
        printf("\nLas dos raíces reales son: %12.6e y %12.6e  \n",
            x1, x2);
    }
    else if (discr<0.0) {
        xr = -b/(2.0*a);
        xi = sqrt(-discr)/(2.0*a);
        printf("\nRaices complejas:\n");
        printf("(%12.6e, %12.6ei) y (%12.6e,   %12.6ei)\n", 
            xr, xi, xr, -xi);
    }
    else {
        x1 = -b/(2.0*a);
        printf("\nLas dos raíces son iguales y valen: %12.6e \n", x1);
    }
}


Comentario: Incluyendo la librería math.h se puede usar las funciones matemáticas tales como sqrt(), para la raíz cuadrada; cos() para calcular el coseno de un ángulo, etc. La instrucción if...else permite hacer una bifurcación, dependiendo de la cual se realizarán diferentes actividades.

Merece la pena observar la forma utilizada para partir en varias líneas las distintas llamadas a la función printf(). La idea fundamental es que, en el fichero *.c la cadena de control (lo que va entre comillas como primer argumento de la función printf()) no se puede partir entre dos o más líneas



Ejercicio 9: PARA EXPERTOS. Top

Realiza un programa en C que escriba una tabla de dos columnas para la conversión entre las temperaturas en grados Fahrenheit -comprendidas entre 0 ºF y 300 ºF, según incrementos de 20 ºF- y su equivalente en grados centígrados. Se realizarán dos versiones de este programa: una llamada temp1.c que empleará un bucle while. La otra versión se llamará temp2.c y utilizará un bucle for. La conversión entre grados Centígrados y grados Fahrenheit sigue la regla:

Siendo ºC la temperatura en grados Centígrados y ºF en grados Fahrenheit.

Solución comentada al Ejercicio 9.


// fichero temp1.c 
#include <stdio.h>
void main(void)
{
    double grados_fahr;
    double grados_cent;
    printf("grados Fahrenheit      grados Centígrados\n");
    printf("-----------------      ------------------\n\n");
    grados_fahr = 0.0;
    while (grados_fahr <= 300.0 ) {
        grados_cent = (5*(grados_fahr-32.0))/ 9.0;
        printf("%17.2lf%17.2lf\n", grados_fahr, grados_cent);
        grados_fahr += 20.0;
    }
}


// fichero temp2.c 
#include <stdio.h>
void main(void)
{
    double grados_fahr;
    double grados_cent;
    printf("grados Fahrenheit      grados Centígrados\n");
    printf("-----------------      ----------------\n\n");
    for (grados_fahr=0.0; grados_fahr<=300.0; grados_fahr += 20.0 ) {
        grados_cent = (5*(grados_fahr-32.0))/9.0;
        printf("%17.2lf%17.2lf\n", grados_fahr, grados_cent);
    }
}


Comentario: Como podrás observar la diferencia entre los dos programas está fundamentalmente en la forma de utilizar los bucles respectivos, a diferencia del while, en los parámetros del bucle for está incluidas todas las condiciones necesarias para su ejecución, es decir se encuentran: la inicialización, la condición a cumplir y además el incremento del contador, lo cual simplifica mucho el programa.