Universidad Carlos III de Madrid

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

6. Ejercicios

Para resolver los siguientes ejercicios te recomendamos que crees un fichero de texto en tu entorno de trabajo y que escribas en él las soluciones. Compila y (si procede) ejecuta el programa para verificar que realiza las operaciones esperadas. Puedes utilizar el siguiente esqueleto:

#include <stdio.h>
int main() 
{

    /* Escribe aquí tu código */

    return 0;
}
  1. Escribe la definición de una estructura que almacene una tabla de 10 enteros, una cadena de 20 letras, un número real de precisión simple y uno de precisión doble. A continuación, en una línea separada, declara dos variables de este tipo. Compila el programa para verificar que la sintaxis es la correcta.

  2. Un programador ha escrito las siguientes definiciones:

    #define SIZE 100
    
    struct map_annotation 
    {
        char note[SIZE];
        struct coordinates point;
    };
    
    struct coordinates 
    {
       float longitude;
       float latitude;
    };
    
    struct map_annotation annotations[SIZE];

    ¿Qué problema tienen? (siempre puedes cortar y pegarlas en tu programa y utilizar el compilador para comprobar)

  3. Incluye en tu programa la variable cadena para almacenar una cadena de texto de 10 letras definida como char cadena[SIZE];, donde SIZE es 11. Se quiere procesar esa cadena de forma que cada letra pase a valer una letra que está cuatro posiciones mas avanzadas en el abecedario. Escribe el código para ejecutar esta operación (no te preocupes por las letras w, x, y y z. Al final del programa incluye la siguiente línea para imprimir la cadena por pantalla:

    printf("%s\n", cadena);
  4. Descarga el programa enum.c en tu entorno de desarrollo Linux. Abre una ventana con un intérprete de comandos, compílalo con el comando gcc -Wall -o enum enum.c y ejecútalo con el comando ./enum.

    #include <stdio.h>
    
    int main(int argc, char *argv[]) 
    {
        enum status { ON = 0, OFF = 1 };
        enum status a, b;
    
        a = 0;
        a++;
        a = 20;
        b = a++;
        
        /* Imprime a y luego b en la misma linea */
        /* Print a and then b in the same line */
        printf("%d %d\n", a, b);
        return 0;
    }
    

    ¿Qué valores imprime por pantalla? A la vista del resultado, ¿qué conclusión se deriva del funcionamiento de los tipos de datos enumerados en C?

  5. Define una estructura de datos para almacenar el resultado de un sorteo de la Lotería Primitiva. Es decir, un grupo de seis números, un número complementario y un número de reintegro, todos ellos diferentes y entre los valores del 1 al 49. Calcula el tamaño que ocupa tu estructura de datos con los tamaños mostrados en la sección 1.5 (ver las Normas del juego).

  6. Declara una tabla de 100 enteros y rellena su contenido con un valor cualquiera. Declara una segunda tabla también de 100 enteros. Escribe el código que almacena en cada elemento de la segunda tabla la suma de elementos hasta esa misma posición de la primera tabla.

  7. Se necesita diseñar una estructura de datos para el buzón de entrada de un teléfono móvil. Los mensajes en ese buzón son de dos tipos, o SMS, o MMS. Los mensajes SMS tiene un remitente (un número de teléfono), una fecha/hora (que es un número entero), un texto de no más de 140 letras y un tipo de mensaje que puede ser SMC o normal. Los mensajes MMS tienen los mismos campos excepto que en lugar del tipo de mensaje tienen una cadena de texto de hasta 200 letras con la ruta a la imagen que contiene. Escribir las definiciones de las estructuras de datos necesarias para tener una tabla de 100 mensajes como buzón de entrada.

  8. Descarga el siguiente programa equal.c en tu entorno de trabajo Linux.

    #include <stdio.h>
    int main(int argc, char *argv[]) 
    {
        struct equal { int x; };
        struct equal e1, e2;
        e1.x = 1;
        e2 = e1; /* SPECIAL LINE */
        e1.x = 2;
        printf("%d\n", e2.x);
        return 0;
    }
    

    Abre un terminal con un intérprete de comando, compila el programa con el comando gcc -Wall -o equal equal.c y ejecútalo con el comando ./equal. ¿Puedes adivinar qué resultado se va a imprimir por pantalla? A la vista del resultado explica qué ocurre exactamente en la línea e2 = e1 y en general con el operando = aplicado a estructuras en C.

    Si tienes curiosidad, el programa Equal.java contiene la versión de este código en Java, y el resultado que aparece en pantalla no es el mismo que el de C. ¿Por qué crees que pasa esto?

    public class Equal {
        int x;
        public Equal() {
    	x = 1;
        }
        public static void main(String args[]) {
    	Equal e1 = new Equal();
    	Equal e2 = e1; /* SPECIAL LINE! */
    	e1.x = 2;
    	System.out.println(e2.x);
        }
    }