Ver Mensaje Individual
  #7 (permalink)  
Antiguo 28/07/2016, 13:24
matiri90
 
Fecha de Ingreso: abril-2016
Ubicación: Cordoba
Mensajes: 22
Antigüedad: 8 años
Puntos: 1
Respuesta: Archivos y Listas enlazadas simples en C

Gracias eferion por responder!.
Estuve haciendo el programa, tratando de mejorar un poco el codigo..
Todos los consejos son aceptados!. Gracias!

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ANCHO_PANTALLA 80			//Maximo de caracteres en la pantalla
#define Max 26						//Arreglo Indice Apellido

typedef struct TipoFecha{
	int dia;
	int mes;
	int anio;
}TFecha;

typedef struct TipoAmigo{
	char apellido[17];
	char nombre[17];
	char email[20];
	char celular[12];
	TFecha fecNac;
	char flag;
}Amigo;

typedef struct ElementoLista{
  Amigo  dato;
  struct ElementoLista *sig;
}Persona;

typedef struct ListaIdentificar {
    Persona *inicio;
    Persona *fin;
    int cantidad;
}Lista;

typedef struct {
	char letra;
	int pos;
	int cantidad;
}Indice;


//MENU PRINCIPAL
int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista);
//devuelve la opcion elegido
int mostrarMenu();

//Guarda contacto en el archivo
void guardarContacto(Amigo persona, char *nombreArchivo);



								//----Guarda los datos en el archivo
								
								
								
int actualizarArchivo(char *nombreArchivo,Lista *lista);
//Pasa los datos de la lista al archivo
int listaArchivo(Lista *lista, char *nombreArchivo);
//Pasa los datos del archivo a la lista
void archivoLista(char *NombreArchivo, Lista *lista);
//Une 2 listas y las ordena
void unirListas(Lista *lista,Lista *aux);
//Borra los datos y libera la memoria
void destruir(Lista *lista);
//Suprime un dato de la lista
int suprimirInicio (Lista *lista); //de acuerdo al campo flag=='*'
//devuelve el tamaño del archivo
int tamanioArchivo(char *nombreArchivo);
//Muestra los datos guardados en el archivo
void mostrarAgenda(char *nombreArchivo);



int suprimirAmigo(Lista *lista,Amigo p);
		//REGISTRAR EN EL LOGFILE

/*
						-------FUNCIONES MANEJO DE LISTA DINAMICA (Area de Intercambio)
*/
//Inserta un dato al inicio de la lista en la memoria dinamica
int insertarInicio (Lista *lista,Amigo p);
//devuelve los datos de un amigo que llena el usuario
Amigo pedirAmigo();
//Pide la fecha y la devuelve
TFecha ingresarFecha(Amigo aux);
//agrega un amigo a la lista
int agregarAmigo(Lista *lista,char *nombreArchivo);
//revisa la lista para ver si encuentra datos
int estaAmigoLista(Lista *l,Amigo p);
//revisa el archivo para ver si encuentra datos
int estaAmigoArchivo(char *nombreArchivo,Amigo p);
//actualiza el archivo. Agrega datos de la lista y ordena el archivo
//ordena la lista por apellido y nombre
int ordenar(Lista *l);


						//Funciones de Muestra
//Muestra un titulo con los datos de amigo (tipo Tabla)
void tipoTabla();
//Muestra un titulo con los datos de indice (tipo Tabla)
void tipoTablaIndice();
//Muestra los datos de la Lista
void mostrarDatos(Lista *lista);
//Muestra los datos de un amigo
void mostrarAmigo(Amigo p);
//Muestra un titulo en el medio
void mostrarTituloMenu(char *titulo);
//Muestra un mensaje de error
void mostrarMensajeCentro(char *msj);
//Muestra los datos del archivo indice
void mostrarArchivoIndice(char* nombreArchivoIndice);
//Muestra los datos de un elem del archivo indice
void mostrarLetra(Indice indice);


//Muestra los apellidos que comiencen con una letra "x"
//dados una posicion y la cantidad a mostrar, se mueve en el archivo principal y muestra los datos
void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant);
/*Listar amigos cuyo apellido comienza con una determinada letra.*/
void MostrarApellidoInicial(char *nombreArchivo,char *nombreArchivoIndice,char c);
//Inicializa el arreglo indice
void inicializar(Indice indice[]);
//Pasa del arreglo al arch
void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]);
//Guarda un dato en el archivo INDICE
void guardarIndice(char *nombreArchivoIndice,Indice ind);
/*
Listar amigos que cumplen años un determinado mes: el mes será ingresado por
el usuario. Mostrar los registros en formato tabla.
*/
//falta
void MostrarCumpleMes(Lista *lista,int mes);


int main(){
	char nombreArchivo[12]= "agenda.bin";
	char nombreArchivoIndice[12]= "indice.bin";
	Lista *lista;
	if ((lista = (Lista *) calloc (1,sizeof(Lista))) == NULL){
	    return -1;
	}
	menu (nombreArchivo,nombreArchivoIndice,lista);
	return 0;
}



int mostrarMenu(){
	int opc;
	do{
		mostrarTituloMenu("MENU GENERAL");
		printf("\n1) Agregar Amigo al Area de transacciones.");
		printf("\n2) Mostrar Area de transacciones.");
		printf("\n3) Actualizar Archivo agenda.");
		printf("\n4) Mostrar Archivo agenda.");
		printf("\n5) Mostrar contactos con la inicial ""x"" en el apellido.");
		printf("\n6) Mostrar contactos que cumplan anios determinado mes.");
		printf("\n7) Buscar contacto.");
		printf("\n8) Borrar contacto.");
		printf("\n9) Eliminar Archivos.");
		printf("\n10) Salir.");
		printf("\n\nElige una opcion: ");
		scanf("%d",&opc);
	}while (opc<1 || opc>10);
	return opc;
}

void mostrarTituloMenu(char *titulo){
	system("cls");
    printf("%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(titulo)/2, titulo);
}

void mostrarMensajeCentro(char *msj){
    printf("\n\n\n\n\n%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
}


void presUnaTecla(){
	mostrarMensajeCentro("Presione una tecla para continuar."); 
	getch(); 	
}


int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista){
	int pos,control,opc;
	char car;
    do{
		opc=mostrarMenu();
	    switch (opc){
    	case 1:
    		control=agregarAmigo(lista,nombreArchivo);
    		if(control==0){
    			printf("\n\nSe ha hecho correctamente");
    			ordenar(lista);
			}else if(control==-1){
				mostrarMensajeCentro("Hubo un error. El amigo se encuentra en la lista.");
			}else{
				mostrarMensajeCentro("Hubo un error. El amigo se encuentra en el archivo.");
			}
			break;
		case 2:
			mostrarTituloMenu("AMIGOS EN AREA DE TRANSACCIONES");
			if(lista->cantidad!=0){
				tipoTabla();
				mostrarDatos(lista);
				printf("\n\n\n\n");
			}else
				mostrarMensajeCentro("Lista Vacia.");
			break;
		case 3:
			if (actualizarArchivo(nombreArchivo,lista)!=-1){
				formarIndice(nombreArchivo,nombreArchivoIndice);
				destruir(lista);
			}
			break;
		case 4:
			if(tamanioArchivo(nombreArchivo)!=0){
				mostrarTituloMenu("AMIGOS EN ARCHIVO");
				mostrarAgenda(nombreArchivo);
				printf("\n\n\n\n");
			}else{
				mostrarMensajeCentro("Archivo Vacio.");
			}
			break;
		case 5:
			mostrarTituloMenu("AMIGOS POR INICIAL");
			printf("\nIngrese una letra:");
			do{
				fflush(stdin);
				scanf("%c",&car);
			}while(car<65 || (car>90 && car<97)|| car>122);
			if (car>97 || car<122) car=car-32;					//Si no es mayuscula, la transforma en mayuscula
			printf("\n\n\n");
			MostrarApellidoInicial(nombreArchivo,nombreArchivoIndice,car);
			break;
		case 6:
			printf("\nEn construccion");
			break;
		case 7:
			printf("\nEn construccion");
			break;
		case 8:
			printf("\nEn construccion");
			break;
		case 9:
			remove(nombreArchivo);
			remove(nombreArchivoIndice);
			mostrarMensajeCentro("Los archivos se borraron efectivamente.");
			break;
		case 10:
			printf ("\nAdios");
			break;
		}
		//
		presUnaTecla();
	} while (opc!=10);
	
}



int agregarAmigo(Lista *lista,char *nombreArchivo){
	Amigo amigo=pedirAmigo();
	int encontrado=(estaAmigoLista(lista,amigo));
	if (estaAmigoLista(lista,amigo)==-1){
		return -1;
	}else if((estaAmigoArchivo(nombreArchivo,amigo))==-1)
		return -2;
	else{
		insertarInicio(lista,amigo);
		return 0;
	}
}


Amigo pedirAmigo(){
	Amigo aux;
	system("cls");
	mostrarTituloMenu("MENU DE CARGA DE DATOS");
	do{
		printf("\nIngrese el apellido de su amigo.\n");
		fflush(stdin);
        gets(aux.apellido);
	}while (strlen(aux.apellido)>17);
		do{
		printf("\nIngrese el nombre de su amigo.\n");
		fflush(stdin);
        gets(aux.nombre);
	}while (strlen(aux.nombre)>17);
		do{
		printf("\nIngrese el email de su amigo.\n");
		fflush(stdin);
        gets(aux.email);
	}while (strlen(aux.email)>30);
		do{
		printf("\nIngrese el celular de su amigo.\n");
		fflush(stdin);
        gets(aux.celular);
	}while (strlen(aux.celular)>15);
	printf("\nFecha de nacimiento de su amigo:\n");
	aux.fecNac=ingresarFecha(aux);
	aux.flag=' ';
	return aux;
}

int esBisiesto(int a){
	return (a%4==0 && a%100!=0) || (a%400==0);
}

TFecha ingresarFecha(Amigo aux){
	int d;
	do{	
		printf("\nIngrese el anio de nacimiento: [1900..2016]\n");
		scanf("%i",&aux.fecNac.anio);
	}while ((aux.fecNac.anio>2016)||(aux.fecNac.anio<1900));
	do{	
		printf("\nIngrese el mes de nacimiento:\n");
		scanf("%i",&aux.fecNac.mes);
	}while ((aux.fecNac.mes>12)||(aux.fecNac.mes<1));
	d=(topeDias(aux.fecNac.mes,aux.fecNac.anio));
	do{	
		printf("\nIngrese el dia de nacimiento:[1..%d]\n",d);
		scanf("%i",&aux.fecNac.dia);
	}while ((aux.fecNac.dia>d)||(aux.fecNac.dia<1));
	return aux.fecNac;
}

int topeDias(int mes,int anio){
	if((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12)){
		return 31;
	}else if((mes==4)||(mes==6)||(mes==9)||(mes==11)){
		return 30;
	}else if((mes==2)&&esBisiesto(anio)){
		return 29;
	}else{
		return 28;
	}
}


int estaAmigoLista(Lista *lista,Amigo p){
  int existe = 0;
  Persona *aux;
  for(aux=lista->inicio; aux && !existe; aux=aux->sig){
    existe = (strcmpi(aux->dato.apellido,p.apellido)==0);
    existe &= (strcmpi(aux->dato.nombre,p.nombre)==0);
    existe &= (strcmpi(aux->dato.email,p.email)==0);
    existe &= (strcmpi(aux->dato.celular,p.celular)==0);
    existe &= (aux->dato.fecNac.anio==p.fecNac.anio);
    existe &= (aux->dato.fecNac.mes==p.fecNac.mes);
    existe &= (aux->dato.fecNac.dia==p.fecNac.dia);
  }
  return existe;
}
SIGUE EN OTRO COMENTARIO