estructuras y uniones

44
Lenguaje de Programación II Universidad Tecnológica La Salle León, Nicaragua [email protected] Docente: Ing. Carolina Robelo Unidad I: Estructuras y Uniones

Upload: franklin-josue

Post on 07-Nov-2015

34 views

Category:

Documents


0 download

DESCRIPTION

Este documento detalla uno de los principales campos de la programación en C que constituye un mejor arreglo de variables para múltiples tareas.

TRANSCRIPT

  • Lenguaje de Programacin II

    Universidad Tecnolgica La SalleLen, Nicaragua

    [email protected]: Ing. Carolina Robelo

    Unidad I: Estructuras y Uniones

  • Objetivos Generales

    Manipular y procesar las diferentes instrucciones de unlenguaje estructurado.

    Conocer los pasos del diseo y desarrollo de programasorientados a objetos que resuelvan problemas deingeniera.

    Aplicar los tpicos de la programacin orientada a objetosen un lenguaje de programacin, que sirvan de base parael desarrollo de software.

  • Plan Temtico

  • Medios Didcticos

    DEV C/C++

    Visual Studio 2010+

    Gua de Estudios

    Classroom Cdigo: ht3ecin

  • SISTEMA DE EVALUACION

    Clases Prcticas 20

    Laboratorios 20

    Pruebas 20

    Examen Parcial 40+ Asistencia y Participacin 100

    Laboratorios y Clases Prcticas 20

    Pruebas 25

    Proyecto 25

    Examen Parcial 30+ Asistencia y Participacin 100

  • 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 deprogramacin C. Mxico. Ed. Pearson Educacin.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • Prueba Diagnostica

    Desarrolle un programa que tenga la siguiente entrada:

    Primero, el usuario ingresa un nmero entero n, que indicacuntas palabras ingresar a continuacin;

    Despus el usuario ingresa n palabras.

    La salida del programa debe mostrar la palabra ms larga y la mscorta que fueron ingresadas por el usuario.

  • ESTRUCTURAS Diferencia entre Arreglos y Estructuras

    Que es una estructura?

    Un arreglo, que es una estructura de datos cuyos elementos son todos delmismo tipo.

    Una estructura de datos cuyos elementos individuales pueden ser dedistinto tipo

    EnterosComa flotante CaracteresPunterosArrays y otras estructuras

    A los elementos individuales de unaestructura se les denomina miembros.

  • DEFINICIN DE UNA ESTRUCTURA

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

    Una estructura debe ser definida en trminos de sus miembros individualesstruct 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 deseaalmacenar los datos de los vehculos a los que se le realiza inspeccinmecnica.

    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 lacomposicin de la estructura con la de lasvariables 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 unprograma 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 ahoraotra estructura (fecha) como uno de susmiembros.

    La declaracin de fecha debe preceder a ladeclaracin 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 quesern asignados a sus correspondientes miembros de laestructura, 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 deotra estructura, que es a su vez un elemento de unarray.

    Por supuesto, tambin se puede definir cliente en unadeclaracin 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 miembropuede usarse en diferentes estructuras para representardiferentes datos.

    En otras palabras, el mbito de un nombre de miembro estconfinado a la estructura particular dentro de la cual ha sidodefinido. 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 demodo 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 laestructura cuenta. Si queremos acceder al nmero decuenta 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.saldocliente.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 puedecontener hasta 100 elementos.

    Para acceder al nmero de cuenta por ejemplodel 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 lamisma manera que las variables ordinarias de este mismotipo. 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 lamisma manera que los datos ordinarios del mismo tipo.

    Por ejemplo, un miembro de estructura que es un arraypuede 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 deinstrucciones que acceden a miembros individuales deestructura. Todos los miembros de la estructura se definenconforme 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 quesean equivalentes a los tipos de datos existentes. Una vez que eltipo de datos definido por el usuario ha sido establecido,entonces las nuevas variables, arrays, estructuras etc, puedenser 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 definenestructuras, ya que se elimina la necesidad de escribir repetidamentestruct 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 datosdefinido por el usuario.

    La segunda declaracin define anteriorcliente y nuevocliente comovariables 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 odesde una funcin.

    Se pueden transferir los miembros individuales, o

    Transferir las estructuras completas.

    Los miembros individuales de una estructura se pueden pasar auna funcin como argumentos en la llamada a la funcin, y unmiembro de una estructura puede ser devuelto mediante lainstruccin return. Para hacer esto, cada miembro de laestructura 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 quecomponen una unin comparten el mismo rea de almacenamientodentro de la memoria de la computadora, mientras que cadamiembro dentro de la estructura tiene asignada su propia rea dealmacenamiento.

    As, las uniones se usan para ahorrar memoria.

    Son tiles para aplicaciones que involucren mltiplesmiembros donde no se necesita asignar valores a todos losmiembros 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 comotipo-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 hizocon 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, lasestructuras y las uniones pueden ser mezcladas libremente conlos arrays.

    Ejemplo: Un programa en C contiene las siguientesdeclaraciones.

    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 losoperadores .y ->.

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

    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 consentido de acuerdo con la instruccin deasignacin que precede a cada instruccinprintf.

    ULSA- Lenguaje De Programacion II Ing. Carolina Robelo

  • UNIONES

    Una variable de unin puede ser inicializada. Recordar, sinembargo, que slo uno de los miembros de una uninpuede tener un valor asignado en cada momento. Lamayora de los compiladores aceptarn un valor inicial parauno solo de los miembros de la unin y asignarn este valoral 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 comosi fuera una variable ordinaria del mismo tipo de datos, y lospunteros a uniones pueden ser pasados a o desde funciones (porreferencia).

    Adems, la mayora de los compiladores de C permiten asignar unaunin completa a otra unin, siempre que ambas uniones tengan lamisma composicin. Estos compiladores permiten tambin queuniones 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 encoma flotante llamados real e imaginario.

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

    3. Combinar la definicin y la declaracin de la estructura descritas en losProblemas 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 unaestructura 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 Nalumnos de la clase de Lenguaje de Programacin II y que imprima los datosdel 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 correspondacon un numero de carnet especificado. Que el usuario tenga la opcin derealizar las bsquedas que desee, si no desea seguir buscando que tenga laopcin de salir.

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

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

    Crear una funcin que busque los datos de un alumno en la estructura apartir 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 unpuntero 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 actualizarlotan pronto como sea introducido, para reflejar los pagos actuales. Entonces semostrarn todos los registros actualizados con el estado actual de cada cuenta. Elestado de la cuenta se basar en el ltimo pago realizado y el saldo previo delcliente.

  • 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 cientodel 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 deestructuras) 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 Clase3. 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 lasiguiente informacin para cada registro:

    Nombre

    Calle

    Ciudad

    Numero de cuenta

    Saldo Anterior

    Pago Actual

    Nuevo saldo

    Estado de la cuentaULSA- 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