Agenda Telefonica

Puede dar de alta, baja, modificar registros, ordenar por nombre, apellidos, edad. Guarda los contenidos en un archivos binario y los puede leer también puede exportar en csv. Corre perfecto en linux, pero para que funcione en windows hay que quitar la función sleep.

 
 
# include <stdio.h>
 
# include <string.h>
 
# define FICHERO "datos"
 
# define MAX 25
 
# define ESCAPE ((char)27)
 
FILE *fichero;
 
 
 
struct agenda{                              //*************************
 
         int clave;                         //       Esctructura con   *
 
         char nom[20];                      //       la forma de         *
 
         char ApPat[15];                    //       los datos registro*
 
         char ApMat[15];                    //*************************
 
         int edad;
 
         long int tel;
 
         long int cel;
 
         char calle[15];
 
         char col[15];
 
         char mun[15];
 
         char estado[15];
 
         int sw;
 
         char mail[25];
 
}r[MAX];
 
 
 
int  menu (void);
 
void agregar(void);
 
void mostrar(struct agenda);
 
void buscarnom(char[]);
 
void buscaredad(int);                       //********************
 
void apertura(void);                        //Prototipos de las
 
void m_todo(void);                          //       Funciones
 
void borrar(int);                  //********************
 
void borrartodo(void);
 
void ordena(void);
 
void SaveToDisk(struct agenda);
 
struct agenda ReadToDisk(int);
 
int ReadAllToDisk(void);
 
void OrdenaOnMemory(int,int);
 
void clavesdisponibles(void);
 
void actualizar(struct agenda,int);
 
void exportar(void);
 
 
 
int main (){
 
         int op,opc=0,opcls=0,clave=0,edades=0,i;
 
         int numreg=0;
 
         char expresion[20];
 
         struct agenda reg;
         printf("Creado por Vicente Mendoza");
 
         apertura();
 
         menu:
 
         op = menu();
 
         switch (op){
 
                 case 1:          
 
                          agregar();                                          //*********
 
                          goto menu;                                          //AGREGAR
 
                 break;                                                       //*********
 
                 case 2:
 
                          printf("Dame la clave a borrar: ");
 
                          scanf ("%d",&clave);                                //*********
 
                          borrar(clave);                                      //BORRAR
 
                          printf("tRegistro Borrado: %d",clave);              //*********
 
                          goto menu;
 
                 break;
 
                 case 3:
 
                          printf ("t Como prefiere hacer la busqueda ?");
 
                          printf ("n");
 
                          printf ("tt1. Por Nombre, Apellido Paterno y Materno");
 
                          printf ("n");                                                         //***********
 
                          printf ("tt2. Por Edad");                                    //BUSQUEDA
 
                          printf("ntOpcion: ");                                                 //***********
 
                          scanf("%d",&opc);
 
                          if(opc==1){
 
                                   printf ("Escribe el Nombre o Apellidos a buscar: ");
 
                                   scanf  ("%s",expresion);
 
                                   buscarnom(expresion);
 
                          }else if(opc=2){
 
                                   printf ("Escribe la edad para buscar ");
 
                                   scanf  ("%d",&edades);
 
                                   buscaredad(edades);
 
                          }
 
                          goto menu;
 
                 break;
 
                 case 4:
 
                          m_todo();                 //*************
 
                          goto menu;                //MOSTRAR_TODO
 
                 break;                             //*************
 
                 case 5:
 
                          ordena();
 
                          goto menu;
 
                 break;
 
                 case 6:
 
                          printf("n 1)Nombret2)Ap. Paternot3)Ap. Maternot4)Edadt5)Calle");
 
                          printf("nOpcion: ");
 
                          scanf("%d",&opcls);
 
                          numreg=ReadAllToDisk();                             //******************
 
                          OrdenaOnMemory(numreg,opcls);                       //LISTAR
 
                          for(i=0;i<numreg;i++)                               //******************
 
                                   mostrar(r[i]);
 
                          goto menu;
 
                 break;
 
                 case 7:
 
                          printf("nQue registro va actualizar (clave): ");
 
                          scanf("%d",&clave);                                          //***************
 
                          reg=ReadToDisk(clave);                                       //ACTUALIZAR
 
                          mostrar(reg);                                                //***************
 
                          printf("nQue dato desea actualizar");
 
                          printf("n 1)Nombret2)Ap. Paternot3)Ap. Maternot4)Edadt5)Callet6)Telefonot7)Celulart8)Email ");
 
                          printf("n Opcion: ");
 
                          scanf("%d",&opcls);
 
                          actualizar(reg,opcls);
 
                          printf("nRegistro Actualizado");
 
                          goto menu;
 
                 break;
 
                 case 8:
 
                          exportar();                        //****************
 
                          goto menu;                         //EXPORTAR EN CSV
 
                 break;                                      //****************
 
                 case 9:
 
                          printf("n Ha terminado el programa..n");
 
                 break;
 
         }
 
         fclose(fichero);
 
         return 1;
 
}
 
///////////////////////////////////////////////////////////////////////
 
void ordena(void){
 
         int i,c;
 
         c=ReadAllToDisk();
 
         OrdenaOnMemory(c,1);                                //*******************************
 
         borrartodo();                                       //Funcion que Ordena el Archivo 
 
         for(i=0;i<c;i++){                           //Por Nombre
 
                 r[i].clave=i+1;                             //*******************************
 
                 SaveToDisk(r[i]);
 
         }
 
         printf("nArchivo Ordenadon");
 
}
 
///////////////////////////////////////////////////////////////////////
 
void OrdenaOnMemory(int c,int tipo){
 
         int pas,i;
 
         struct agenda aux={0};
 
         for(pas=1;pas<c;pas++)
 
                 for(i=0;i<c-1;i++){
 
                          if(strcmp(r[i].nom,r[i+1].nom)>0 && tipo==1){
 
                                   aux=r[i];
 
                                   r[i]=r[i+1];                                                 //*******************
 
                                   r[i+1]=aux;                                                  //esta funcion
 
                          }else if(strcmp(r[i].ApPat,r[i+1].ApPat)>0 && tipo==2){               //ordena en memoria       
 
                                   aux=r[i];                                                    //recibe el numero de
 
                                   r[i]=r[i+1];                                                 //registros c
 
                                   r[i+1]=aux;                                                  //Y tipo que sirve 
 
                          }else if(strcmp(r[i].ApMat,r[i+1].ApMat)>0 && tipo==3){               //para saber sobre 
 
                                   aux=r[i];                                                    //que campo ordenar
 
                                   r[i]=r[i+1];                                                 //*******************
 
                                   r[i+1]=aux;                        
 
                          }else if(r[i].edad >= r[i+1].edad && tipo==4){
 
                                   aux=r[i];
 
                                   r[i]=r[i+1];
 
                                   r[i+1]=aux;                        
 
                          }else if(strcmp(r[i].calle,r[i+1].calle)>0 && tipo==5){
 
                                   aux=r[i];
 
                                   r[i]=r[i+1];
 
                                   r[i+1]=aux;                        
 
                          }
 
                 }        
 
}
 
///////////////////////////////////////////////////////////////////////
 
void apertura(void){                                                  //*********************************
 
         if((fichero=fopen(FICHERO,"r+"))==NULL)                      //Metodo para abrir el archivo
 
                 fichero=fopen(FICHERO,"w");                         //En caso de error crea el archivo
 
}                                                                     //*********************************
 
///////////////////////////////////////////////////////////////////////
 
int menu(void){
 
         int opmenu=0;
 
         printf("%c[1;34m",ESCAPE);                                   //*********************************
 
         printf ("ntM E N U");                                        //Fucion que muestra el Menu
 
         printf("n");                                                 //retorna un entero con el valor
 
         printf("%c[2;36m",ESCAPE);                                   //de la opcion elegida
 
         printf ("1)Agregar");                                        //*********************************
 
         printf (" 2)Borrar");
 
         printf (" 3)Buscar");
 
         printf (" 4)M.Todo");
 
         printf (" 5)OrdenarArchivo");
 
         printf (" 6)Listar");
 
         printf (" 7)Modificar Registro");
 
         printf (" 8)Exportar");
 
         printf (" 9)Salir");
 
         printf ("n");
 
         printf ("Opcion: ");
 
         scanf("%d",&opmenu);
 
         printf("%c[0m",ESCAPE);
 
         return opmenu;
 
}
 
///////////////////////////////////////////////////////////////////////
 
void SaveToDisk(struct agenda registro){                              //****************************************
 
         fseek(fichero,(registro.clave-1)*sizeof(registro),SEEK_SET);         //Funcion para Salvar 1 registro en disco
 
         fwrite(®istro,sizeof(registro),1,fichero);                   //recibe el registro y lo guarda dependiendo de su
 
}                                                                              //clave en el archivo
 
//////////////////////////////////////////////////////////////////////  //**********************************************
 
void agregar(void){
 
         int clave;
 
         struct agenda registro,aux;
 
         printf("%c[31m",ESCAPE);
 
         clavesdisponibles();
 
         printf("%c[0m",ESCAPE);
 
         do{
 
                 printf (" Dame tu clave: ");                                 //******************************
 
                 scanf  ("%d",&clave);                                        //Codigo para validar la clave
 
                 if(clave>MAX) {                                              //debe de ser menor que MAX
 
                          printf("%c[31m",ESCAPE);                    //Y no puede usar una con datos
 
                          printf("Tu clave debe ser menor que %dn",MAX);      //asociados
 
                          printf("%c[0m",ESCAPE);                              //******************************
 
                 }
 
                 aux=ReadToDisk(clave);
 
                 if(aux.sw==1){
 
                          printf("%c[31m",ESCAPE);
 
                          printf("La clave ya esta en uso n");
 
                          printf("%c[0m",ESCAPE);
 
                 }
 
         }while(clave>MAX || aux.sw==1);
 
         registro.clave=clave;
 
         printf (" Cual es tu nombre ? ");                            //****************************** 
 
         scanf  ("%s",registro.nom);                                           //Metodo para Pedir datos
 
         printf (" Cual es tu Apellido Paterno ? ");                  //y despues agregarlos a disco
 
         scanf  ("%s",registro.ApPat);                                         //******************************
 
         printf (" Cual es tu Apellido Materno ? ");
 
         scanf  ("%s",registro.ApMat);
 
         printf (" Cual es tu edad ? ");
 
         scanf  ("%d",®istro.edad);
 
         printf (" Cual es tu telefono ? ");
 
         scanf  ("%ld",®istro.tel);
 
         printf (" Cual es tu telefono celular? ");
 
         scanf  ("%ld",®istro.cel);
 
         printf (" Cual es tu calle ? ");
 
         scanf  ("%s",registro.calle);
 
         printf (" Cual es tu colonia ? ");
 
         scanf  ("%s",registro.col);
 
         printf (" Cual es tu Municipio ? ");
 
         scanf  ("%s",registro.mun);
 
         printf (" En que Estado vives ? ");
 
         scanf  ("%s",registro.estado);
 
         printf (" Cual es tu e-mail ? ");
 
         scanf  ("%s",registro.mail);
 
         registro.sw=1;
 
         SaveToDisk(registro);
 
         printf ("Se ha agregado otro elemento a la agenda");
 
}
 
///////////////////////////////////////////////////////////////////////
 
void buscarnom(char expresion[20]){                                   //************************************              
 
         int i=2;                                             //Funcion que sirve para buscar una expresion (NOMBRE)
 
         struct agenda registro;                                      //en todos los registros.
 
         registro = ReadToDisk(1);                           //************************************
 
         do{
 
                  if((strcmp(registro.nom,expresion))==0 || (strcmp(registro.ApPat,expresion))==0 || (strcmp(registro.ApMat,expresion))==0)
 
                          mostrar(registro);
 
                 registro=ReadToDisk(i);
 
                 i++;
 
         }while(!feof(fichero));
 
}
 
///////////////////////////////////////////////////////////////////////
 
void buscaredad(int edades){
 
         int i=2;
 
         struct agenda registro;                                               //*********************************
 
         registro=ReadToDisk(1);                                               //Funcion que sirve para buscar
 
         do{                                                                   //una edad en todos los registros
 
                 if(registro.edad == edades)                                  //*********************************
 
                          mostrar(registro);
 
                 registro=ReadToDisk(i);
 
                 i++;
 
         }while(!feof(fichero));
 
}
 
///////////////////////////////////////////////////////////////////////
 
int ReadAllToDisk(void){
 
         struct agenda registro;
 
         int i=2,c=0;
 
         registro=ReadToDisk(1);
 
         do{
 
                 if(registro.sw==1){                                  //*************************************
 
                          r[c]=registro;                              //Funcion que lee todos los registros
 
                          c++;                                        //del archivo 
 
                 }                                                    //*************************************
 
                 registro=ReadToDisk(i);
 
                 i++;
 
         }while(!feof(fichero));
 
         return c;
 
}
 
///////////////////////////////////////////////////////////////////////
 
struct agenda ReadToDisk(int clave){
 
         struct agenda registro;                                      //*********************************************
 
         fseek(fichero,(clave-1)*sizeof(registro),SEEK_SET);         //funcion que recibe una clave ,se diige a ella
 
         fread(®istro,sizeof(registro),1,fichero);            //en el archivo la lee y retorna la estructura
 
         return registro;                                     //*********************************************
 
}
 
///////////////////////////////////////////////////////////////////////
 
void m_todo(void){
 
         int i=2;
 
         struct agenda registro;
 
         registro=ReadToDisk(1);                             //**************************
 
         do{                                                 //Metodo para mostrar todos
 
                 if(registro.sw==1)                          //los registros del archivo
 
                          mostrar(registro);                 //***************************
 
                 registro=ReadToDisk(i);
 
                 i++;
 
         }while(!feof(fichero));
 
}
 
///////////////////////////////////////////////////////////////////////
 
void mostrar(struct agenda registro){
 
         printf ("n");
 
         printf (" Clave: tt %d ",registro.clave);
 
         printf ("n");
 
         printf (" Nombre: tt %s",registro.nom);
 
         printf ("n");
 
         printf (" Apellido Paterno: t %s",registro.ApPat);
 
         printf ("n");
 
         printf (" Apellido Materno: t %s",registro.ApMat);  //*******************************
 
         printf ("n");                                                //Funcion que recibe un registro
 
         printf (" Edad: ttt %d",registro.edad);             //y muestra sus campos
 
         printf ("n");                                                //*******************************
 
         printf (" Telefono: tt %ld",registro.tel);
 
         printf ("n");
 
         printf (" Telefono Celular:t %ld",registro.cel);
 
         printf ("n");
 
         printf (" Calle: tt %s",registro.calle);
 
         printf ("n");
 
         printf (" Colonia: tt %s",registro.col);
 
         printf ("n");
 
         printf (" Municipio: tt %s",registro.mun);
 
         printf ("n");
 
         printf (" Estado: tt %s",registro.estado);
 
         printf ("n");
 
         printf (" Mail: ttt %s",registro.mail);
 
         printf ("n");
 
         sleep(1);
 
}
 
///////////////////////////////////////////////////////////////////////
 
void borrar(int clave){
 
         struct agenda aux={0,"","","",0,0,0,"","","","",0,""};                //******************************
 
         fseek (fichero,(clave-1)*sizeof(aux),SEEK_SET);                       //Funcion que guarda un registro
 
         fwrite(&aux,sizeof(aux),1,fichero);                                   //vacio para borrar el anterior
 
}                                                                              //******************************
 
///////////////////////////////////////////////////////////////////////
 
void borrartodo(void){
 
int i;                                              //*****************************
 
for (i=1;i<=MAX;i++)                                //Metodo que deja el Archivo       
 
         borrar(i);                                  //en blanco (borra todo)
 
}                                                   //*****************************
 
///////////////////////////////////////////////////////////////////////
 
void clavesdisponibles(void){
 
         struct agenda registro;
 
         int i=2;
 
         registro=ReadToDisk(1);
 
         printf("Las claves disponibles son: ");                      //***********************
 
         do{                                                          //Metodo que visualiza
 
                 if(registro.sw!=1)                                  //todas las claves 
 
                          printf("%d ",i-1);                          //disponibles
 
                 registro=ReadToDisk(i);                             //***********************
 
                 i++;
 
         }while(!feof(fichero));
 
         for(;i<=MAX+1;i++)
 
                 printf("%d ",i-1);
 
         printf("n");
 
}
 
///////////////////////////////////////////////////////////////////////
 
void actualizar(struct agenda registro,int opcion){
 
         switch(opcion){
 
                 case 1:
 
                          printf (" Nombre ? ");
 
                          scanf  ("%s",registro.nom);
 
                 break;
 
                 case 2:
 
                          printf (" Apellido Paterno ? ");
 
                          scanf  ("%s",registro.ApPat);
 
                 break;                                              //**********************************
 
                 case 3:                                             //Funcion que recibe un registro 
 
                          printf (" Apellido Materno ? ");   //y modifica segun "opcion"
 
                          scanf  ("%s",registro.ApMat);               //el campo correspondiente
 
                 break;                                              //**********************************
 
                 case 4:
 
                          printf (" Edad ? ");
 
                          scanf  ("%d",®istro.edad);
 
                 break;
 
                 case 5:
 
                          printf (" Calle ? ");
 
                          scanf  ("%s",registro.calle);
 
                 break;
 
                 case 6:
 
                          printf (" Telefono ? ");
 
                          scanf  ("%ld",®istro.tel);
 
                 break;
 
                 case 7:
 
                          printf (" Telefono celular? ");
 
                          scanf  ("%ld",®istro.cel);
 
                 break;
 
                 case 8:
 
                          printf (" Cual es tu e-mail ? ");
 
                          scanf  ("%s",registro.mail);
 
                 break;
 
         }
 
         SaveToDisk(registro);
 
}
 
///////////////////////////////////////////////////////////////////////
 
void exportar(void){
 
         FILE *archivo;
 
         char nombre[20];                            //********************************
 
         int c,i;                                    //Metodo que sirve para 
 
         c=ReadAllToDisk();                                  //crear un archivo de texto
 
         OrdenaOnMemory(c,1);                                //con valores separados por comas
 
         printf("Nombre del Archivo: ");                     //********************************
 
         scanf("%s",nombre);
 
         if((archivo=fopen(nombre,"w"))==NULL)
 
                 archivo=fopen(nombre,"w");
 
         for(i=0;i<c;i++)
 
                  fprintf(archivo,"%d,%s,%s,%s,%d,%d,%d,%s,%s,%s,%s,%s,n",r[i].clave,r[i].nom,r[i].ApPat,r[i].ApMat,r[i].edad,r[i].tel,r[i].cel,r[i].calle,r[i].col,r[i].mun,r[i].estado,r[i].mail);
 
         fclose(archivo);
 
}