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 funcion 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("Hola mundo");

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);

}

///////////////////////////////////////////////////////////////////////