Logo elrincondelc.com
curso de programación en c
Foros de programación en C
Inicio :: Código fuente
Usuario: Clave: Regístrate

Valoración
5

Array de estructura

codigo enviada por: kropzter (2007-04-13 16:32:32)
Genera un array de estructuras de 500 elementos
/* Programa que genera un array de estructuras de 500 elementos
       en cada estructura se almacenan 4 datos de empleados
		similar a una peque¤a base de datos*/
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>

/*-----------------Definicion de tipo de la estructura---------------------*/

typedef struct datos_empleados{
	float nemp;
	char nombre[30];
	int edad;
	char domicilio[50];
	struct datos_empleados *next;
}DATOS;
/*-----------------------Definicion de funciones---------------------------*/
void agregar(void);
void mostrar(DATOS *ptr);
void pornumero(DATOS *ptr);
void pornombre(DATOS *ptr);
int buscar(DATOS *ptr);
void eliminar(DATOS *ptr);

/*-------------------------Definicion de variables-------------------------*/
int i,j=0,J=0,n=0,z=0;        //Contadores
char opc,op,E;                //Variables de seleccion
DATOS *p,*base, *one,*paux;           //Array de tipo DATOS y puntero a estructura

/*----------------------Inicio de funcion principal------------------------*/
main(){
clrscr();
do{                        //ciclo para menu principal
clrscr();
printf("\t\t *****************MENU*****************");
printf("\n\n\n\n\n\t\t\t A.- Agregar Empleado.");
printf("\n\t\t\t B.- Ordenar Los Empleados.");
printf("\n\t\t\t C.- Mostrar Todos Los Empleados.");
printf("\n\t\t\t D.- Buscar Empleado.");
printf("\n\t\t\t E.- Eliminar Empleado.");
printf("\n\t\t\t S.- Salir.\n");
printf("\n\t\t\tSu opcion es: ");
scanf("%c",&opc);
opc=toupper(opc);
switch(opc){
	     case 'A':fflush(stdin);    // Agrega registro a nuestra base de datos
		  agregar();
		break;
	     case 'B':                   // Ordena los registro
		    p=one;   clrscr();
		     if(one!=NULL){            //valida si hay datos o no
		    do{                  //Ciclo de submenu
			clrscr();
			printf("\n\n\n\t\t Elija El Tipo De Ordenamiento ");
			printf("\n\n\t\t A.- Por Numero De Empleado.");
			printf("\n\t\t B.- Por Nombre De Empleado.");
			printf("\n\t\t C.-(Volver al menu principal).");
			printf("\n\n\t\t Cual es su opcion: ");    fflush(stdin);
			scanf("%c",&op); op=toupper(op);
			switch(op){
				case 'A':
				 /* pornumero(p);       // ordenacion por numero
				  printf("\n LOS ELEMENTOS HAN SIDO ORDENADOS CON EXITO PRESIONE UNA TECLA PARA CONTINUAR...");
				  printf("\n\t\t LUEGO PRESIONE (C) PARA VOLVER AL MENU PRINCIPAL... ");
				getch(); */
				break;
				case 'B':  /*          // ordenacion por nombre
				  pornombre(p);
				  printf("\n LOS ELEMENTOS HAN SIDO ORDENADOS CON EXITO PRESIONE UNA TECLA PARA CONTINUAR...");
				  printf("\n\t\t LUEGO PRESIONE (C) PARA VOLVER AL MENU PRINCIPAL... ");
				  getch();   */
				break;
				   }

			}while(op!='C');
			   }
			 else if(j==1){
				 printf("\n\n\tSolo existe un elemento no es necesario ordenar...");
				 printf("\n\tPresione una tecla par volver...");getch();
				 }
				 else{
				 printf("\n\n\t No existen elementos actualmente, no es posible ordenar...");
				 printf("\n\tPresione una tecla par volver...");  getch();}

			break;

	     case 'C':            //Muestra los datos del registro
	     clrscr();
	     if(one!=NULL){             //valida si hay datos o no
	       J=0;
	       p=one;
	      fflush(stdin);
	      for(i=0;p!=NULL;i++)  {       //ciclo que llama a funcion mostrar()
	      mostrar(p);p=p->next; J++;
	      if(J>=4){    J=0;
	      printf("\t\t VER SIGUIENTES....");
	      getch();
	      clrscr();
	      } }
	      printf("\n\t PRESIONE UNA TECLA PARA CONTINUAR..."); }
	      else{
	      printf("\n\n No existen registros actualmente para mostrar.");
	      }
	      getch();
	      break;
	    case 'D':       //busca un registro en el array base
	     clrscr();
	    if(one!=NULL){       //valida si hay datos o no
	    p=one;
	    buscar(p);}
	    else{
	       printf("\n\n\t No existen registros actualmente para buscar.");
	      getch();
	    }
	    break;

	    case 'E':      //Busca el registro seleccionado y lo elimina de la base
	    clrscr();
	    if(one!=NULL){     //valida si hay datos o no
	   z=buscar(p);
	   fflush(stdin);
	   if(z>=0){
	   printf("\n\n\t Seguro de que desea eliminar este elemento (s/n): "); scanf("%c",&E);
	   if(E=='s'||E=='S'){
	   eliminar(p);
	   printf("\n\t El registro se elimino exitosamente.");
	   printf("\n\t Presione una tecla para volver al menu principal..");  getch();
	   }

	     }  }
	    else{
	    printf("\n\n\t No existen registro que eliminar");
	    printf("\n\t Presione una tecla para volver al menu principal..."); getch();
	    }

	    break;

}
}while(opc!='S');    //fin de ciclo menu principal
return 0;
}
/*----------------------Fin de funcion principal---------------------------*/

/*-----------------------Funcion de agregacion-----------------------------*/
void agregar(void){
char b[21];
//for(i=0;i<1;i++,j++) {       //ciclo para agregar datos y llevar registro de datos introducidos.
clrscr();
base=(DATOS *) malloc(sizeof(DATOS));
printf("Agrege un numero de empleado: ");
gets(b);             //se captura numero de empleado como cadena de char.
base->nemp=atof(b);  fflush(stdin);  //luego se convierte la cadena capturada a un numero real o float.
printf("Agrege el nombre del empleado: ");
gets(base->nombre); fflush(stdin);
printf("Introduzca la edad: ");
scanf("%d",&base->edad); fflush(stdin);
printf("Introduzca el domicilio: ");
gets(base->domicilio);fflush(stdin);
if(one==NULL){
one=base;
base->next=NULL;
}
else
{
base->next=one;
one=base;
}
}
/*-------------------------------------------------------------------------*/

/*---------------------Funcion para mostrar  registros---------------------*/

void mostrar(DATOS *ptr){
printf("\n # empleado: %.0f",ptr->nemp);
printf("\n Nombre: %s",ptr->nombre);
printf("\n Edad: %d",ptr->edad);
printf("\n Domicilio: %s\n\n",ptr->domicilio);
}
/*-------------------------------------------------------------------------*/

/*-------------------Funcion de ordenacion por numero----------------------*/
/*void pornumero(DATOS *ptr){
DATOS baux,*aux;                // variables y punteros auxiliares tipo DATOS
for(J=0;J<=j;J++){              // ciclo para seleccion e intercambio de valores
ptr=one;

aux=ptr->next;
for(i=0;i<j-1;i++,){       //bucle para checar todos los registros
   if((ptr->nemp)<(aux->nemp)){      // seleccion
	     baux=base[i];
	     base[i]=base[i+1];
	     base[i+1]=baux;
	}
}     }
} */
/*---------------------------------------------------------------------------*/

/*-------------------Funcion de ordenacion por nombre-----------------------*/
/*void pornombre(DATOS *ptr){
char *aux,*auxs,*cad1;               //punteros auxiliares
int w,x,y,flag,flag2;          //contadores,centinelas y banderas.
DATOS baux;		    //variable auxiliar de tipo DATOS.
ptr=base;
cad1=ptr->nombre;
for(J=0;J<j;J++,ptr++) {
cad1=ptr->nombre;
		 for(i=0;i<strlen(cad1);i++){
		  cad1=ptr->nombre;
			    if((cad1[i]<97)&&(cad1[i]>64)){     //conversion a minusculas
			  cad1[i]=cad1[i]+32;
			  }         }       }
ptr=base;
aux=ptr->nombre;               //asignacion de un puntero a estructura en un apuntador char
for(w=0;w<j;w++){             //bucles para revisar todas las posibles combinaciones
ptr=base;                     //inicializa
aux=ptr->nombre;
for(x=0;x<j;x++,ptr++){        //ciclo  para checar por cadena
aux=ptr->nombre;
auxs=(ptr+1)->nombre;
		for(y=0,flag=0;flag==0;y++){        //ciclo para checar por caracter
		 if(aux[y]>auxs[y]&&x<j-1){         //si el primer caracter es diferente
		       baux=base[x];
		       base[x]=base[x+1];
		       base[x+1]=baux;
		       flag=1;
		       }
		  if(aux[y]==auxs[y]){
		      for(J=0,flag2=0;J<strlen(aux)||J<strlen(auxs)&&flag2==0;J++){     //ciclo para checar por caracter si los primeros
		      if(aux[J]>auxs[J]&&x<j-1){                                       //caracteres son iguales
		       baux=base[x];
		       base[x]=base[x+1];
		       base[x+1]=baux;
		       flag2=1;
		       }
		      }
		  }
		  else{
		    flag=1;
		  }
		}

}
}
}  */
/*-------------------------------------------------------------------------*/

/*-----------------------Funcion de busqueda-------------------------------*/
int buscar(DATOS *ptr){
int busca, caux,r=5,z;
float m;
ptr=one;
char *cax,*cad1,*cad2;
DATOS buscanom;
do{
clrscr();
ptr=one;
z=-1;
printf("\n\n\t\t ELIJA LA FORMA DE BUSQUEDA...");
printf("\n\t\t A.- Por numero de empleado.");
printf("\n\t\t B.- Por nombre de empleado.");
printf("\n\t\t C.-(Volver al menu principal).");
printf("\n\n\t\t Cual es su opcion: ");
scanf("%c",&op); op=toupper(op);
switch(op){
	      case 'A': clrscr();
		ptr=one;  r=0;
		printf("\n\n\t Buscar por numero de empleado.");
		 printf("\n\n\t\t Introdusca el numero del empleado a buscar: ");  scanf("%i",&busca);
		 caux=ptr->nemp;          fflush(stdin);

		 for(i=0;ptr!=NULL;i++){
		       // ciclo que busca en todos los registros  de la base
		  caux=ptr->nemp;

		  if(caux==busca){            // seleccion si es identica
		      z=i;
		       printf("\n\nEl elemento actualmente se encuentra en la posicion [%i].\n\n",i+1); i=j;
			mostrar(ptr);    r=1;  // r es bandera o centinela
			printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
			if(op=='n'||op=='N') {op='C'; break;}
			else{op='a';}
			}
		  else{ r=0;}             //  bandera o centinela
		 ptr=ptr->next;
		 }
		 if(r==0){
		 printf("\n\n\n El elemento que busca no se encuentra actualmente en la lista...");
			printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
		 if(op=='n'||op=='N') {op='C'; break; }
			else{op='a';}

		 }

	      break;
	      case 'B':
	      clrscr();

		ptr=one;  r=0;    fflush(stdin);
		printf("\n\n\t Buscar por nombre de empleado.");
		printf("\n\n\t\t Introdusca el nombre del empleado a buscar: ");  gets(buscanom.nombre);
		cad2=buscanom.nombre;
		cad1=ptr->nombre;
		for(J=0;ptr!=NULL;J++) {

		for(i=0;i<strlen(cad2);i++){
		  cad2=buscanom.nombre;
			    if((cad2[i]<97)&&(cad2[i]>64)){     // conversion a minusculas
			  cad2[i]=cad2[i]+32;
			  }                }
		 for(i=0;i<strlen(cad1);i++){
		  cad1=ptr->nombre;
			    if((cad1[i]<97)&&(cad1[i]>64)){     //conversion a minusculas
			  cad1[i]=cad1[i]+32;
			  }         }
			  ptr=ptr->next;
			  }
		  ptr=one;

		for(i=0;ptr!=NULL;i++){           // for para seleccion de elementos iguales
		cad2=buscanom.nombre;
		cad1=ptr->nombre;
		m=strcmp(cad1,cad2);
		if(m==0){                        z=i;
		printf("\n\nEl elemento actualmente se encuentra en la posicion [%i].\n\n",i+1); i=j;
			mostrar(ptr);    r=1;      i=j;
				printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
		 if(op=='n'||op=='N') {op='C'; break; }
			else{op='a';}

		}

		 else{ r=0;}
		ptr=ptr->next;
		}
		if(r==0&&op){
		printf("\n\n\n El elemento que busca no se encuentra actualmente en la lista...");
		printf("\n Compruebe que: ");printf("\n *El nombre este correctamente escrito.");printf(" (No importan mayusculas o minusculas.)");
		printf("\n *El nombre no contenga caracteres extra¤os.(ejemplo: %,&,$,?,etc..)");
		printf("\n *El nombre este dado de alta.");
		printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
		if(op=='n'||op=='N') {op='C'; break;}
		else{op='a';}
		}
	      break;

  }
}while(op!='C');
return z;
}
/*-------------------------------------------------------------------------*/

/*-----------------------Funcion para eliminacion--------------------------*/
void eliminar(DATOS *ptr){
paux=one;
ptr=one;
for(i=0;i<z;i++){
paux=ptr;
ptr=ptr->next;
}
	if(paux!=NULL)
	{
	if(paux==one)
		one=paux->next;
	else
		paux->next=ptr->next;
}}
/*--------------------------------------------------------------------------*/

/*********************************************»
°   PROGRAMA ELABORADO EN COMPILADOR:         °
°  		 TURBO C++                    °
°   	       VERSION 3.0                    °
°         BORLAND INTERNATIONAL               °
°---------------------------------------------°
°            CODIGO FUENTE POR:               °
°      DANIEL ALBERTO RIVERA PERALES.         °
°            MATRICULA.- 185154               °
°	         GRUPO: 4§K                   °
È**********************************************/


/*********************************************»
°   Cualquier duda o comentario sobre este    °
°   programa por favor mandalo a mi correo    °
°   electronico.                              °
°    ->    kropzter@yahoo.com                 °
°    ->    a185154@uach.mx                    °
°                                             °
È**********************************************/

Para enviar comentarios debes estar registrado.

(c) ElRincondelC.com, 1999-2007

Un proyecto de Urlan Heat : proyectos de Internet y soporte para el comercio electrónico.