28/07/2016, 13:24
|
| | Fecha de Ingreso: abril-2016 Ubicación: Cordoba
Mensajes: 22
Antigüedad: 8 años, 7 meses 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 |