Overblog Seguir este blog
Edit post Administration Create my blog
5 febrero 2010 5 05 /02 /febrero /2010 02:54

Arrays de Estructuras

Los ejemplos de estructuras que hemos visto hasta el momento, sólo podemos manejar un conjunto de datos a la vez, o podemos declarar varias variables para manejar, por ejemplo, los datos de 5 alumnos de una institución.

Sin embargo, al igual que los tipos int, float... en c, podemos crear arrays con estructuras.

Por ejemplo, supongamos que ya tenemos declarada una estructura llamada datos, que contiene los datos personales de alumnos de cierta institución, y queremos guardar los datos de 100 alumnos, no necesitamos de crear 100 variables de tipo estructura, sino que hacemos esta declaratoria:

struct datos alumnos[100];

 

Ejemplo 3.

Una biblioteca, desea tener un registro de los libros que en ella se encuentran, se sabe que existe un número no mayor a 100 libros, y que los datos que se necesitan registrar son: el nombre del autor, el título del libro y las existencias del mismo. Diseñe una estructura que sea capaz de guardar esa información y luego mandarla a impresión.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#define N 100

struct info_libro

{

    char autor[20];

    char titulo[30];

    int num_ejemplares;

};

main()

{

   struct info_libro libro[N];

   int i=0;

   clrscr();

   printf("\t\tPROGRAMA QUE CONTROLA UN INVENTARIO DE LIBROS\n\n\n");

 

   for(i=1; i<=N; i++)

   {

            printf("Ingrese los datos del libro %d\n",i);

      printf("Nombre del autor: ");

      scanf("%s", &libro[i].autor);

      printf("El titulo del libro es: ");

      scanf("%s", &libro[i].titulo);

      printf("Las existencias de este libro son:\n");

      scanf("%d", &libro[i].num_ejemplares);

   }

   clrscr();

   printf("\t\t\tLOS DATOS SON LOS SIGUIENTES:\n\n\n");

   for(i=1; i<=N; i++)

   {

      printf("********************************************\n");

      printf("Autor: %s\n", libro[i].autor);

      printf("Titulo: %s\n", libro[i].titulo);

      printf("Existencias: %d\n", libro[i].num_ejemplares);

   }

   getch();

   return 0;

 

}

 

Lo más resaltante que, debo rescatar es que, a diferencia de los vectores y las matrices, las estructuras no identifican su primer elemento con cero, sino con el número uno, es por ello que nuestro contador, inicia con ese número, además que, para diferenciar un registro por otro, debemos incluir siempre el subíndice, [i].

Estructuras y Funciones

Cuando hacemos uso de funciones y de estructuras, debemos tener en cuenta la forma correcta, de cómo enviarle a la función el parámetro deseado, y con las estructuras, no es la excepción, por ejemplo:

 

/*declaración de la estructura*/

struct info_libro

{

    char autor[20];

    char titulo[30];

    int num_ejemplares;

};

 

/*declaración de las funciones */

void impresión (struct info_libro *ptr);

void impresión1 (struct info_libro p);

 

/*definición de la estructura*/

struct info_libro libros;

 

/*llamado de la funcion: envío por referencia*/

impresión(&libros);

 

/*¨llamado de la función: envío por valor*/

impresión (libros);

 

Uso del typedef

Un operador typedef permite al programador crear un sinónimo de tipo definido por el usuario o de un tipo ya exitente. La sintaxis es la siguiente:

 

typedef tipo_de_dato nuevotipodedato;

 

A partir de la declaración hecha por el typedef se puede hacer uso del nuevo sinónimo del tipo de dato para definir variables, en general donde se utilizan los tipos de datos.

Veamos un ejemplo donde matemos dos pájaros de un solo tiro, es decir donde se muestren el uso de funciones y el typedef.

Ejemplo 4.

Un médico almacena la siguiente información de sus paciente en un array de registros (como mucho habrá 100 pacientes): Nombre, teléfono, dirección, y si tiene alergias. Escribir un programa con las siguientes opciones (todas ellas diben realizarse con funciones):

a) Introducir los datos interactivamente. Para saber que ya no se van a introducir más pacientes, el usuario introducirá un 0 al solicitarle el número de teléfono del paciente.

b) Imprimir por pantalla toda la información.

c) Listar todos los pacientes con alergias.
d) Crear una lista con el índice de todos los pacientes que sean de la Comunidad de Madrid (su teléfono comienza por el prefijo 91).
e) Salir.

 #include <stdlib.h>  
 #include <conio.h>  
 #include <stdio.h>  
 #include <string.h>  
   
 #define TAM_NOM 31  
 #define TAM_DIR 41  
 #define TAM_ALE 71  
 #define TAM_PAC 100  
   
 typedef struct { 
  char nombre[TAM_NOM]; 
  double telefono; 
  char direccion[TAM_DIR]; 
  char alergias[TAM_ALE]; 
 } reg_paciente; 
   
 void tecla(); 
 char menu(); 
 void leerdatos(reg_paciente *pacientes, int *tamano); 
 void hayalergias(reg_paciente *pacientes, int tamano); 
 void imprimirtodos(reg_paciente *pacientes, int tamano); 
 void telefono91(reg_paciente *pacientes, int tamano); 
   
 void main() 
 { 
  char opcion; 
  int tamano; 
  reg_paciente pacientes[TAM_PAC]; 
   
  system("color f0"); 
  printf("\n\n\n\n\n\n\n\n\n\t\t\tINICIO DEL PROGRAMA\n\n\n\n\n\n\n\n"); 
  tecla(); 
  leerdatos(pacientes,&tamano); 
  do { 
  opcion=menu(); 
  switch(opcion) { 
  case '1':  
  imprimirtodos(pacientes,tamano); 
  break; 
  case '2':  
  hayalergias(pacientes,tamano); 
  break; 
  case '3':  
  telefono91(pacientes,tamano); 
  break; 
  case '4':  
  leerdatos(pacientes,&tamano); 
  break; 
  case '0': 
  printf("\nSaliendo..."); 
  break; 
  } 
  tecla(); 
  } while (opcion!='0'); 
  printf("\n\n\n\n\n\n\n\t\t\tFIN DEL PROGRAMA\n\n\n\n\n\n\n"); 
  tecla(); 
 } 
   
 void tecla() 
 { 
  printf("\nPresiona cualquier tecla para continuar "); 
  getch(); 
  clrscr(); 
  return; 
 } 
   
 void leerdatos(reg_paciente *pacientes, int *tamano) 
 { 
  char buffer[15]; 
  int i; 
   
  for (i=0;i<TAM_PAC;i++) { 
  printf("\n\n\n****PACIENTE NUMERO %2d****",i+1); 
  printf("\nIntroduzca el nombre (no m…s de %d caracteres)\n\t",TAM_NOM-1); 
  do { 
  gets(pacientes[i].nombre); 
  } while (strlen(pacientes[i].nombre)==0); 
  printf("\nIntroduzca su tel‚fono (o 0 o cualquier letra para no introducir m…s datos)\n\t"); 
  do { 
  gets(buffer); 
  } while (strlen(buffer)==0); 
  pacientes[i].telefono=atof(buffer); 
  if (pacientes[i].telefono==0) { 
  *tamano=i; 
  break; 
  } 
  printf("\nIntroduzca la direccion (no m…s de %d caracteres)\n\t",TAM_DIR-1); 
  do { 
  gets(pacientes[i].direccion); 
  } while (strlen(pacientes[i].direccion)==0); 
  printf("\nIntroduzca la descripcion de la alergias (no m…s de %d caracteres)\n",TAM_ALE-1); 
  printf("\n****Escriba \"NO\" si el paciente no tiene ninguna alergia****\n\t"); 
  do { 
  gets(pacientes[i].alergias); 
  } while (strlen(pacientes[i].alergias)==0); 
   
  } 
  return; 
 } 
   
 char menu() 
 { 
  char respuesta; 
  printf("\n\n\n\n\tMENU DEL PROGRAMA"); 
  printf("\n1.- Imprimir en la pantalla toda la informacion"); 
  printf("\n2.- Listar los pacientes con alergias"); 
  printf("\n3.- Crear una lista de los pacientes con el telefono 91-XXXXXXX"); 
  printf("\n4.- Crear una lista nueva de pacientes"); 
  printf("\n0.- Salir del programa.\n"); 
  do { 
  respuesta=getch(); 
  } while (respuesta<'0' || respuesta>'9'); 
  return respuesta; 
 } 
   
   
 void imprimirtodos(reg_paciente *pacientes, int tamano) 
 { 
  int i,contimpresos=0; 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  if (tamano>0) { 
  for (i=0;i<tamano;i++) { 
  printf("\n\tÛÛ%5d\t%20s\t\t%9.0f\tÛÛ",i+1,pacientes[i].nombre,pacientes[i].telefono); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].direccion); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].alergias); 
  contimpresos++;/*CUENTA EL NUMERO DE LOS QUE SE VAN IMPRIMENDO*/ 
  if ((contimpresos)%10==0) { 
  printf("\n\tÛÛ *** Presione cualquier tecla para continuar. *** ÛÛ"); 
  getch(); 
  } 
  } 
  } 
  if (contimpresos==0) printf("\nÛÛ\t No hay ningun dato que mostrar en la pantalla.\t ÛÛ"); 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  return; 
 } 
   
   
 void telefono91(reg_paciente *pacientes, int tamano) 
 { 
  int i,contimpresos=0; 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  if (tamano>0) { 
  for (i=0;i<tamano;i++) { 
  if (pacientes[i].telefono>=910000000 && pacientes[i].telefono<920000000) { 
  printf("\n\tÛÛ%5d\t%20s\t\t%9.0f\tÛÛ",i+1,pacientes[i].nombre,pacientes[i].telefono); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].direccion); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].alergias); 
  contimpresos++;/*CUENTA EL NUMERO DE LOS QUE SE VAN IMPRIMENDO*/ 
  if ((contimpresos)%10==0) { 
   printf("\n\tÛÛ *** Presione cualquier tecla para continuar. *** ÛÛ"); 
  getch(); 
  } 
  } 
  } 
  } 
  if (contimpresos==0) printf("\nÛÛ\t No hay ningun dato que mostrar en la pantalla.\t ÛÛ"); 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  return; 
 } 
   
 void hayalergias(reg_paciente *pacientes, int tamano) 
 { 
  int i,contimpresos=0; 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  if (tamano>0) { 
  for (i=0;i<tamano;i++) { 
  if (strcmp(pacientes[i].alergias,"NO")!=0 && strcmp(pacientes[i].alergias,"no")!=0 && strcmp(pacientes[i].alergias,"No")!=0) { 
  printf("\n\tÛÛ%5d\t%20s\t\t%9.0f\tÛÛ",i+1,pacientes[i].nombre,pacientes[i].telefono); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].direccion); 
  printf("\n\tÛÛ\t%40s\tÛÛ",pacientes[i].alergias); 
  contimpresos++;/*CUENTA EL NUMERO DE LOS QUE SE VAN IMPRIMENDO*/ 
  if ((contimpresos)%10==0) { 
   printf("\n\tÛÛ *** Presione cualquier tecla para continuar. *** ÛÛ"); 
  getch(); 
  } 
  } 
  } 
  } 
  if (contimpresos==0) printf("\nÛÛ\t No hay ningun dato que mostrar en la pantalla.\t ÛÛ"); 
  printf("\n\tÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ"); 
  return; 
 } 

 

Compartir este post

Repost 0
Published by Prof.Luis Eduardo Aponte
Comenta este artículo

Comentarios

Kenmaios 06/03/2010 01:34


excelente informacion de este blog, me gusto mucho lo de estructuras ya es teoria+ejemplos y asi es mas facil de comprender.
ojala pongan mas contenido y si pueden poner arboles estare agradecido...
saludos.


Presentación

  • : El blog de Luis Eduardo Aponte
  • : Blog, para facilitar del Lenguaje de Programación C
  • Contacto

Enlaces