i unidad estructuras y uniones

Upload: bayron-chamorro

Post on 16-Oct-2015

36 views

Category:

Documents


1 download

TRANSCRIPT

  • Lenguaje de Programacin II

    Universidad Tecnolgica La Salle Len, Nicaragua

    [email protected]

    Docente: Ing. Carolina Robelo

    Unidad I: Estructuras y Uniones

  • Bibliografa

    Joyanes Aguilar, Luis. Programacion en C: Metodologia, Algoritmos y Estructuras de Datos. Segunda Edicin. Editorial McGraw-Hill, 2005.

    Kernighan Brian, R. (1991). El lenguaje de programacin C. Mxico. Ed. Pearson Educacin.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • SISTEMA DE EVALUACION

    Clases Prcticas 20

    Laboratorios 20

    Pruebas 20

    Examen Parcial 40 + Asistencia y Participacin 100

  • ESTRUCTURAS Diferencia entre Arreglos y Estructuras

    Que es una estructura?

    Un arreglo, que es una estructura de datos cuyos elementos son todos del mismo tipo. Una estructura de datos cuyos elementos individuales pueden ser de distinto tipo

    Enteros Coma flotante Caracteres Punteros Arrays y otras estructuras

    A los elementos individuales de una estructura se les denomina miembros.

  • DEFINICIN DE UNA ESTRUCTURA

    Una vez que la composicin de la estructura ha sido definida, las variables individuales de este tipo de estructura pueden declararse como sigue:

    Una estructura debe ser definida en trminos de sus miembros individuales struct nombre-estructura

    {

    miembro 1;

    miembro 2;

    miembro m;

    } ;

    Struct nombre-estructura variable1, variable2,

    variable n;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • DEFINICIN DE UNA ESTRUCTURA

    Supongamos que el taller de mecnica del Tcnico La Salle desea almacenar los datos de los vehculos a los que se le realiza inspeccin mecnica.

    Declaracin tpica de estructura.

    struct datos-vehiculo {

    char marca[20] ;

    char estilo[15] ;

    int anio;

    float motor;

    char fecha-insp[8];

    } veh1, veh2, veh3; Es posible combinar la declaracin de la composicin de la estructura con la de las variables de estructura, como se muestra.

    Otra forma de declarar las variables de la estructura:

    struct datos-vehiculo veh1, veh2, veh3;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • DEFINICIN DE UNA ESTRUCTURA Una variable de estructura puede ser definida como miembro de

    otra estructura.

    Supongamos que el Taller de Mecanica del Tecnico La Salle requiere un programa para manejar la informacion de sus clientes.

    struct fecha

    { int mes;

    int dia;

    int anio;

    };

    struct cuenta

    { int num_cuenta;

    char tipo_cuenta;

    char nombre[80];

    float saldo;

    struct fecha ultimopago;

    } antiguocliente, nuevocliente

    La segunda estructura (cuenta) contiene ahora otra estructura (fecha) como uno de sus miembros. La declaracin de fecha debe preceder a la declaracin de cuenta.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • ESTRUCTURAS A los miembros de una variable de estructura se le pueden

    asignar valores iniciales de la misma forma que a los arrays.

    Los valores iniciales deben aparecer en el orden en que sern asignados a sus correspondientes miembros de la estructura, encerrados entre llaves y separados por comas. La forma general es : tipo-almacenamiento struct nombre variable =

    {valor 1, valor 2, ., valor m};

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Estructuras Ejemplo: Asignacin de valores iniciales a los miembros de una

    variable estructura.

    struct fecha { int mes; int dia; int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre [80]; float saldo; struct fecha ultimopago;

    } ; static struct cuenta cliente = {12345, 'R', Juan Perez", 586.30, 5, 24, 90};

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Estructuras Tambin es posible definir un array de estructuras; esto es, un array

    en el que cada elemento sea una estructura.

    struct fecha { int mes; int da; int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; struct fecha ultimopago;

    } cliente[100];

    Tenemos un array y una estructura incluidas dentro de otra estructura, que es a su vez un elemento de un array. Por supuesto, tambin se puede definir cliente en una declaracin separada

    struct cuenta cliente [100];

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Estructuras Cada estructura, con respecto a las definiciones de miembros,

    es una entidad autnoma. As, el mismo nombre de miembro puede usarse en diferentes estructuras para representar diferentes datos.

    En otras palabras, el mbito de un nombre de miembro est confinado a la estructura particular dentro de la cual ha sido definido. struct primera {

    float a; int b; char c;

    } ; struct segunda {

    char a; float b, c;

    } ;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Procesamiento de una Estructura

    Los miembros de una estructura se procesan generalmente de modo individual, como entidades separadas.

    Un miembro de una estructura puede ser accedido escribiendo: variable.miembro

    struct fecha { int mes; int dia; int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; struct fecha ultimopago;

    } cliente;

    En este ejemplo cliente es una variable de la estructura cuenta. Si queremos acceder al nmero de cuenta del cliente, debemos escribir:

    cliente.num_cuenta

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Procesamiento de una Estructura Ejemplo:

    struct fecha { int mes; int dia; int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; struct fecha ultimopago;

    } cliente;

    ++cliente.saldo cliente.saldo++ --cliente.num_cuenta &cliente &cliente.num_cuenta

    Expresiones que involucran a la variable de estructura cliente y a sus miembros

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Procesamiento de una Estructura

    struct fecha { int mes; int dia; int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; struct fecha ultimopago;

    } cliente[100];

    En este ejemplo cliente es un array que puede contener hasta 100 elementos. Para acceder al nmero de cuenta por ejemplo del cliente 14:

    cliente[13].num_cuenta

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Procesamiento de una Estructura

    Los miembros de una estructura pueden procesarse de la misma manera que las variables ordinarias de este mismo tipo. Los miembros de una estructura:

    Pueden aparecer en expresiones

    Pueden pasarse y ser devueltos por funciones

    Se pueden tratar como variables ordinarias.

    Los miembros complejos de estructuras se procesan de la misma manera que los datos ordinarios del mismo tipo.

    Por ejemplo, un miembro de estructura que es un array puede procesarse del mismo modo que un array ordinario, y con las mismas restricciones.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Procesamiento de una Estructura

    Ejemplo: A continuacin se muestran varios grupos de instrucciones que acceden a miembros individuales de estructura. Todos los miembros de la estructura se definen conforme a la declaraciones anteriores.

    cliente.saldo=0; cliente.ultimopago.mes = 12; printf("Nombre: %s\n", cliente.nombre); if (cliente.tipo_cuenta == 'P') printf ("Cuenta preferente No.: %d\n", cliente.num_cuenta); e1se printf (Cuenta regular No.: %d\n, cliente.num_cuenta);

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Tamano de una Estructura Puede obtenerse mediante el uso del operador sizeof: Determina el

    numero de bytes asociados con una variable de estructura.

    #include main( ) /* determinar el tamao de una estructura */ { Struct fecha{

    Int mes; Int dia; Int anio;

    }; struct cuenta {

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; struct fecha ultimopago;

    } cliente; printf ("%d\n", sizeof cliente); printf("%d", sizeof (struct cuenta)); }

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Tipo de Datos Definidos por el usuario

    Typedef: Permite a los usuarios definir nuevos tipos de datos que sean equivalentes a los tipos de datos existentes. Una vez que el tipo de datos definido por el usuario ha sido establecido, entonces las nuevas variables, arrays, estructuras etc, pueden ser declaradas en trminos de este nuevo tipo de datos.

    Ejemplo:

    typedef tipo nuevo-tipo;

    typedef int edad; edad varon, hembra; int varon, hembra;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Tipo de Datos Definidos por el usuario

    La caracterstica typedef es particularmente til cuando se definen estructuras, ya que se elimina la necesidad de escribir repetidamente struct cuando se referencia una estructura.

    typedef struct {

    miembro 1;

    miembro 2;

    miembro m;

    } nuevo-tipo;

    Donde nuevo-tipo es el tipo de estructura definida por el

    usuario.

    Las variables de estructura pueden definirse en trminos del

    nuevo tipo de datos.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Tipo de Datos Definidos por el usuario

    typedef struct { int num_cuenta; char tipo_cuenta;

    char nombre [80]; float saldo;

    } registro; registro anteriorcliente, nuevocliente;

    La primera declaracin define registro como un tipo de datos definido por el usuario. La segunda declaracin define anteriorcliente y nuevocliente como variables de estructura de tipo registro.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • PASO DE ESTRUCTURAS A UNA FUNCIN

    Hay varias maneras de pasar informacin de una estructura a o desde una funcin.

    Se pueden transferir los miembros individuales, o

    Transferir las estructuras completas.

    Los miembros individuales de una estructura se pueden pasar a una funcin como argumentos en la llamada a la funcin, y un miembro de una estructura puede ser devuelto mediante la instruccin return. Para hacer esto, cada miembro de la estructura se trata como una variable ordinaria.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Ejemplo de paso de estructuras a o desde una funcion

    float ajustar(char nombre[]; int num_cuenta, float saldo); /* Prototipo de funcion */ main () { typedef struct { /* declaracion de estructura */

    int mes; int dia; int anio;

    } fecha; struct { /* declaracion de estructura */

    int num_cuenta; char tipo_cuenta; char nombre[80]; float saldo; fecha ultimopago;

    } cliente; cliente.saldo = ajustar(cliente.nombre, cliente.num_cuenta, cliente.saldo); } float ajustar(char nombre[], int num_cuenta, float saldo) { float nuevosaldo; /* declaracin de variable local */ Nuevosaldo = .. ; /* ajustar el valor de saldo */ Return(nuevosaldo); }

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES Las uniones, como las estructuras, contienen miembros cuyos tipos

    de datos pueden ser diferentes. Sin embargo, los miembros que componen una unin comparten el mismo rea de almacenamiento dentro de la memoria de la computadora, mientras que cada miembro dentro de la estructura tiene asignada su propia rea de almacenamiento.

    As, las uniones se usan para ahorrar memoria.

    Son tiles para aplicaciones que involucren mltiples miembros donde no se necesita asignar valores a todos los miembros a la vez.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES En trminos generales, la composicin de una unin puede

    definirse como:

    Las variables de unin individuales pueden ser declaradas como tipo-almacenamiento union marca

    variable 1, variable 2, . , variable n;

    union marca { miembro 1; miembro 2; miembro m; } ;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES

    Las dos declaraciones pueden ser combinadas, como se hizo con las estructuras. As, se puede escribir: union marca {

    miembro 1;

    miembro 2;

    miembro m;

    } variable 1, variable 2, . , variable n;

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES Una unin puede ser un miembro de una estructura y una

    estructura puede ser un miembro de una unin. Adems, las estructuras y las uniones pueden ser mezcladas libremente con los arrays.

    Ejemplo: Un programa en C contiene las siguientes declaraciones.

    Otra forma para declarar las variables de estructura camisa y blusa es combinar las dos declaraciones.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES Un miembro individual de una unin puede ser accedido de la

    misma manera que un miembro de una estructura, usando los operadores .y ->.

    As, si variable es una variable de unin, entonces variable.miembro refiere al miembro de la unin. Anlogamente, si ptvar es una variable puntero que apunta a una unin, entonces ptvar->miembro refiere al miembro de esa unin.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Ejemplo de UNIONES #include main () { union id { char color; int talla; } ; struct { char fabricante[20]; float coste; union id descripcion; } camisa, blusa; printf ("%d\n", sizeof (union id)); / * asignar un valor a color * / camisa.descripcion.color = B; printf (" %c %d\n", camisa. descripcion.color, camisa.descripcion.talla); / * asignar un valor a talla * / camisa.descripcion.talla = 12; printf (" %c %d\n", camisa. descripcion.color, camisa.descripcion.talla) ; }

    La ejecucin del programa produce la siguiente salida:

    Cada lnea de salida tendra un valor con sentido de acuerdo con la instruccin de asignacin que precede a cada instruccin printf.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES

    Una variable de unin puede ser inicializada. Recordar, sin embargo, que slo uno de los miembros de una unin puede tener un valor asignado en cada momento. La mayora de los compiladores aceptarn un valor inicial para uno solo de los miembros de la unin y asignarn este valor al primer miembro dentro de la unin.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES En todos los otros aspectos, las uniones se procesan de la misma

    manera y con las mismas restricciones que las estructuras.

    As, un miembro individual de una unin puede ser procesado como si fuera una variable ordinaria del mismo tipo de datos, y los punteros a uniones pueden ser pasados a o desde funciones (por referencia).

    Adems, la mayora de los compiladores de C permiten asignar una unin completa a otra unin, siempre que ambas uniones tengan la misma composicin. Estos compiladores permiten tambin que uniones completas sean pasadas a o desde funciones (por valor)

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Ejercicios

    1. Definir una estructura llamada complejo que conste de dos miembros en coma flotante llamados real e imaginario.

    2. Declarar las variables x1, x2 y x3 como estructuras del tipo complejo, descrita en el problema anterior.

    3. Combinar la definicin y la declaracin de la estructura descritas en los Problemas anteriores en una sola declaracin.

    4. Crea un tipo de dato (estructura) definido por el usuario llamado registro, que contenga los siguientes tres miembros:

    a) una cantidad entera llamada ganados

    b) una cantidad entera llamada perdidos

    C) una cantidad en coma flotante llamada porcentaje

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Ejercicios

    5. Definir una estructura del tipo hms que contenga tres miembros enteros, llamados hora, minuto y segundo, respectivamente.

    Despus definir una unin con dos miembros, cada uno de ellos una estructura del tipo hms. Llamar a los miembros de la unin local y hogar, respectivamente.

    Declarar una variable de la union llamada hora.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase

    Realizar un programa en C que lea en un array de estructuras los datos de los N alumnos de la clase de Lenguaje de Programacin II y que imprima los datos del alumno con mayor y menor nota.

    Crear una estructura con los los datos de un alumno (nombre, sexo, edad, carrera)

    Solicitar los datos.

    Mostrarlo en pantalla.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase

    Escribir un programa que encuentre un registro de alumno que corresponda con un numero de carnet especificado. Que el usuario tenga la opcin de realizar las bsquedas que desee, si no desea seguir buscando que tenga la opcin de salir.

    Definir un tipo de datos estructura llamado registro cuyos miembros serian los datos de un alumno Nombre (arreglo tipo char de 50 caracteres), Carnet y Nota tipo enteros.

    Declarar una variable alumno (array donde N=5) de la estructura registro que e inicializar los miembros de la estructura.

    Crear una funcin que busque los datos de un alumno en la estructura a partir de un nmero de carnet introducido por el usuario.

    Mostrar en pantalla la informacin del alumno.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase

    Recordar:

    Una estructura se puede pasar a una funcin:

    Envindole los miembros individuales como argumentos.

    Envindole la estructura completa (en este caso se debe pasar un puntero a la estructura como argumento)

  • Trabajo en Casa

    El Tecnico La Salle requiere un Sistema de Facturacion de clientes muy simple. Necesita que se almacenen los siguientes datos:

    Nombre del cliente

    Direccin con calle, ciudad y estado, nmero de cuenta, estado de la cuenta (al da, atrasada o moroso), saldo previo, nuevo saldo y fecha de pago.

    El sistema debe permitir introducir cada registro en la computadora, y actualizarlo tan pronto como sea introducido, para reflejar los pagos actuales. Entonces se mostrarn todos los registros actualizados con el estado actual de cada cuenta. El estado de la cuenta se basar en el ltimo pago realizado y el saldo previo del cliente.

  • Actividad en Clase

    El estado de cada cuenta ser determinado de la siguiente manera:

    Si el pago actual es mayor que cero pero menor que el diez por ciento del saldo previo, la cuenta ser atrasada.

    Si hay un saldo previo y el pago actual es cero, la cuenta ser moroso.

    En otro caso, la cuenta estar al da.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase

    La estrategia global ser la siguiente:

    1. Especificar el nmero de cuentas de clientes (nmero de estructuras) a procesar.

    2. Para cada cliente, leer los siguientes elementos:

    Nombre

    Calle

    Ciudad

    Nmero de cuenta

    saldo anterior

    Pago actual

    Fecha de pago

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase 3. Cada vez que se lee un registro en la computadora, actualizarlo de la siguiente

    manera:

    a) Comparar el pago actual con el saldo anterior y determinar el estado apropiado de la cuenta.

    b) Calcular el nuevo saldo restando el pago actual del saldo anterior (un saldo negativo indicara un crdito).

    4. Una vez que todos los registros han sido introducidos y procesados, escribir la siguiente informacin para cada registro:

    Nombre

    Calle

    Ciudad

    Numero de cuenta

    Saldo Anterior

    Pago Actual

    Nuevo saldo

    Estado de la cuenta ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Actividad en Clase

    struct fecha { int mes; int dia; int anio;

    } ; struct cuenta {

    char nombre [80] ; char calle[80]; char ciudad[80]; int num_cuenta; int tipo_cuenta; float anteriorsaldo; float nuevosaldo; float pago; struct fecha ultimopago;

    } cliente [100];

    Declaracion de las estructuras a utilizar

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo