elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Uso de Ficheros y LSE en C en: 8 Agosto 2016, 15:57 pm
Hola gente. Hace poco que estoy en esto de C.. Leyendo, trate de juntar todo ese conocimiento e hice una agenda.. Creo que se pude mejorar, pero me gustaria saber si las practicas utilizadas estan bien encaminadas.. Desde ya, muchas gracias.. Cualquier consejo, sera tomado como tal..

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.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 año;
}TFecha;

typedef struct TipoAmigo{
char apellido[18];
char nombre[18];
char email[21];
char celular[13];
TFecha fecNac;
bool flag;
}Amigo;

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

typedef struct ListaIdentificar {
    Persona *inicio;
}Lista;

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

const char *arrMes[12]={"ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"};
//const char arrMes[12]={'enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'};


//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
int unirListas(Lista *lista,Lista *aux);
//Borra los datos y libera la memoria
int 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 borrarContactoArchivo(char *nombreArchivo, int pos);

Amigo pedirAmigoBuscar();

void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo);



/*
-------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);
//Duvuelve el maximo de dias que se pueden ingresar, dado un mes y un año
int topeDias(int mes,int año);
//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
void ordenar(Lista *lista);

int borrarContactoLista(Lista *lista, int pos);

void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo);


//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);
//Se forma el archivo indice
void formarIndice(char *nombreArchivo,char *nombreArchivoIndice);
/*
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(){
//boolean toReturn=true;
char nombreArchivo[12]= "agenda.bin";
char nombreArchivoIndice[12]= "indice.bin";
Lista *lista;
if ((lista = (Lista *) calloc (1,sizeof(Lista))) == NULL){
    return false;
}
menu (nombreArchivo,nombreArchivoIndice,lista);
return true;
}



int mostrarMenu(){
int opc;
char cadena[10];
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 años determinado mes.");
printf("\n7) Buscar contacto.");
printf("\n8) Borrar contacto.");
printf("\n9) Eliminar Archivos.");
printf("\n10) Salir.");
printf("\n\nElige una opcion: ");
fgets(cadena,10,stdin);
        sscanf(cadena,"%i",&opc);
        //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 mostrarMensajeAviso(char *msj){
    printf("\n\n%*s\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
}

void presUnaTecla(){
mostrarMensajeCentro("Presione ENTER para continuar.");
while(getchar() != '\n');
    setbuf(stdin, NULL);
}


int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista){
int pos,opc,mes;
char car;
Amigo amigoBuscar;
    do{
opc=mostrarMenu();
    switch (opc){
    case 1:
    if(!agregarAmigo(lista,nombreArchivo)){
mostrarMensajeCentro("Hubo un error. Elemento duplicado");
}else{
printf("\n\nSe ha hecho correctamente");
    ordenar(lista);
}
break;
case 2:
mostrarTituloMenu("AMIGOS EN AREA DE TRANSACCIONES");
if(lista->inicio!=NULL){
tipoTabla();
mostrarDatos(lista);
printf("\n\n\n\n");
}else
mostrarMensajeCentro("Lista Vacia.");
break;
case 3:
if (actualizarArchivo(nombreArchivo,lista)!=false){
formarIndice(nombreArchivo,nombreArchivoIndice);
(destruir(lista)) ? mostrarMensajeAviso("Se actualizo el archivo y se borro la lista.") : mostrarMensajeAviso("Hubo un problema");
}
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:
    //pedirMes
mes=pedirNombreMes();
mostrarTituloMenu("CUMPLEN AÑOS EN EL MES");
            printf("\nDE %s:\n\n",arrMes[mes-1]);
            printf("\n\nAmigos del archivo:\n\n\n");
tipoTabla();
MostrarCumpleMesArchivo(nombreArchivo,mes);
printf("\n\nAmigos del archivo:\n\n\n");
MostrarCumpleMesLista(lista,mes);
break;
case 7:
amigoBuscar=pedirAmigoBuscar();
printf("\nAmigos del archivo:\n\n\n");
tipoTabla();
mostrarBuscadoArchivo(nombreArchivo,amigoBuscar);
printf("\n\n\nAmigos de la lista:\n\n\n");
(lista->inicio!=NULL) ? mostrarBuscadoLista(lista,amigoBuscar) : mostrarMensajeAviso("Lista Vacia.");
break;
case 8:
    mostrarTituloMenu("BORRAR AMIGO");
if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio==NULL)){
                mostrarMensajeCentro("No hay elementos.");
}else if((tamanioArchivo(nombreArchivo)!=0)&&(lista->inicio==NULL)){
    printf("\nAmigos en el archivo: \n");
                mostrarAgenda(nombreArchivo);
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarMensajeAviso("Lista Vacia");
                printf("Ingrese el numero de contacto: ");
                scanf("%d",&pos);
                if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
}else if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio!=NULL)){
    tipoTabla();
    printf("\nAmigos en el archivo: \n");
    mostrarMensajeAviso("Archivo Vacio");
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarDatos(lista);
                printf("Ingrese el numero de contacto: ");
                scanf("%d",&pos);
                borrarContactoLista(lista,pos);
}else{
    //CONTROLAR LOS MAXIMOS Y MINIMOS
    printf("\nAmigos en el archivo: \n");
                mostrarAgenda(nombreArchivo);
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarDatos(lista);
                int eleccion;
                printf("\n\n\n\n\nDe que lugar quiere eliminar el amigo?");
                printf("\nIngrese \t1.)Agenda. \t2)Transaccion. \t3)Salir\n");
                scanf("%d",&eleccion);
                if (eleccion==1){
                    printf("Ingrese el numero de contacto: ");
                    scanf("%d",&pos);
                    if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
                }else if(eleccion==2){
                    printf("Ingrese el numero de contacto: ");
                    scanf("%d",&pos);
                    borrarContactoLista(lista,pos);
                }
}
break;
case 9:
remove(nombreArchivo);
remove(nombreArchivoIndice);
mostrarMensajeCentro("Los archivos se borraron efectivamente.");
break;
case 10:
printf ("\nAdios");
break;
}
//
presUnaTecla();
} while (opc!=10);
return 0;
}



int agregarAmigo(Lista *lista,char *nombreArchivo){
Amigo amigo=pedirAmigo();
bool toReturn=true;
if ((estaAmigoLista(lista,amigo)||(estaAmigoArchivo(nombreArchivo,amigo))))
        toReturn=false;
else{
insertarInicio(lista,amigo);
}
return toReturn;
}

void limpiar (char *cadena)
{
  char *p;
  p = strchr (cadena, '\n');
  if (p)
    *p = '\0';
}

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

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

TFecha ingresarFecha(Amigo aux){
int limDias;
char cadena[10];
do{
printf("\nIngrese el año de nacimiento: [1900..2016]\n");
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.año);
}while ((aux.fecNac.año>2016)||(aux.fecNac.año<1900));
do{
printf("\nIngrese el mes de nacimiento:\n");
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.mes);
}while ((aux.fecNac.mes>12)||(aux.fecNac.mes<1));
limDias=(topeDias(aux.fecNac.mes,aux.fecNac.año));
do{
printf("\nIngrese el dia de nacimiento:[1..%d]\n",limDias);
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.dia);
}while ((aux.fecNac.dia>limDias)||(aux.fecNac.dia<1));
return aux.fecNac;
}

int topeDias(int mes,int año){
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(año)){
return 29;
}else{
return 28;
}
}


int estaAmigoLista(Lista *lista,Amigo p){
  bool existe = false;
  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.año==p.fecNac.año);
    existe &= (aux->dato.fecNac.mes==p.fecNac.mes);
    existe &= (aux->dato.fecNac.dia==p.fecNac.dia);
  }
  return existe;
}

//revisa el archivo para ver si encuentra datos
int estaAmigoArchivo(char *nombreArchivo,Amigo p){
FILE *file=fopen(nombreArchivo,"rb");
bool existe =false;
Amigo amigo;
while(!existe && fread(&amigo, sizeof(Amigo), 1, file)){
    existe = (strcmpi(amigo.apellido,p.apellido)==0);
    existe &= (strcmpi(amigo.nombre,p.nombre)==0);
    existe &= (strcmpi(amigo.email,p.email)==0);
    existe &= (strcmpi(amigo.celular,p.celular)==0);
    existe &= (amigo.fecNac.año==p.fecNac.año);
    existe &= (amigo.fecNac.mes==p.fecNac.mes);
    existe &= (amigo.fecNac.dia==p.fecNac.dia);
}
fclose(file);
return existe;
}





int insertarInicio(Lista *lista, Amigo amigo){
  int toReturn = false; // error
  Persona *aux = (Persona *) malloc (sizeof (Persona));
  if (aux != NULL){
    aux->dato=amigo;
    aux->sig=lista->inicio;
    lista->inicio=aux;
    toReturn = true; // error
  }
  return toReturn;
}

void tipoTabla(){
printf("%-4s %-15s %-15s %-15s %-12s %-10s\n\n","NUM","APELLIDO","NOMBRE","EMAIL","CELULAR","DD/MM/AAAA");
}


void mostrarAmigo(Amigo p){
printf("%-2s %-15s %-15s %-15s %-12s %i/%i/%i\n","",p.apellido,p.nombre,p.email,p.celular,p.fecNac.dia,p.fecNac.mes,p.fecNac.año);
}


void mostrarDatos(Lista *lista){
Persona *aux=lista->inicio;
int i=1;
while (aux){
printf(" %i ",i);
mostrarAmigo(aux->dato);
aux=aux->sig;
i++;
}
}


int tamanioLista(Lista *lista){
Persona *aux=lista->inicio;
int cant=0;
while (aux){
mostrarAmigo(aux->dato);
aux=aux->sig;
cant++;
}
return cant;
}

void ordenar(Lista *lista){
Amigo cam;
Persona *aux,*aux2,*min;
min=lista->inicio;
while(min){
aux=min;
aux2=min->sig;
while(aux2!=NULL){
if((strcmpi(aux->dato.apellido,aux2->dato.apellido))>0){ //se comparan apellidos
aux=aux2; //se compara el nombre
}else if(((strcmpi(aux->dato.apellido,aux2->dato.apellido))==0)&&((strcmpi(aux->dato.nombre,aux2->dato.nombre))>0)){
aux=aux2;
}
aux2=aux2->sig;
}
cam=min->dato;
min->dato=aux->dato;
aux->dato=cam;
min=min->sig;
}

}


int destruir (Lista *lista){
    bool toReturn=false;
    while (lista->inicio){
        suprimirInicio (lista);
    }
    if(lista->inicio==NULL) toReturn=true;
    return toReturn;
}



/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
// ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
bool   toReturn = false;
if (lista->inicio){
Persona *sig = lista->inicio->sig;
free(lista->inicio);
lista->inicio = sig;
toReturn = true; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
}
return toReturn;
}


int listaArchivo(Lista *lista, char *nombreArchivo){
    bool toReturn=false;
if(lista->inicio){
Persona *aux=lista->inicio;
while (aux){
if(aux->dato.flag){
guardarContacto(aux->dato,nombreArchivo);
aux=aux->sig;
}
}
toReturn=true;
}
return toReturn;
}


int unirListas(Lista *lista,Lista *aux){
    bool toReturn=false;
if(aux){
Persona *recorrer=aux->inicio;
while(recorrer){
insertarInicio(lista,recorrer->dato);
recorrer=recorrer->sig;
}
ordenar(lista);
toReturn=true;
}
return toReturn;
}

int tamanioArchivo(char *nombreArchivo){
FILE *file=fopen(nombreArchivo,"ab");
fseek(file, 0, SEEK_END);
int tamanio=ftell(file)/sizeof(Amigo);
fclose(file);
return tamanio;
}


int actualizarArchivo(char *nombreArchivo,Lista *lista){
bool toReturn=true;
if(tamanioArchivo(nombreArchivo)!=0){
Lista *aux;
if ((aux = (Lista *) calloc (1,sizeof(Lista))) == NULL){
mostrarMensajeCentro("Error de Memoria.");
    toReturn=false;
}
archivoLista(nombreArchivo,aux);
if(remove(nombreArchivo)!=-1){
unirListas(lista,aux); //une, ordena
listaArchivo(lista,nombreArchivo);
destruir(aux);
}
}else if(tamanioArchivo(nombreArchivo)==0){
if (listaArchivo(lista,nombreArchivo)==-1){
mostrarMensajeCentro("No hay elementos para guardar.");
toReturn=false;
}
}
return toReturn;
}

//CORREGIR ESTO

void archivoLista(char *nombreArchivo, Lista *aux){
FILE* file= fopen(nombreArchivo, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }else{
        Amigo amigo;
        rewind(file);
        while(fread(&amigo, sizeof(Amigo), 1, file)){
            if(amigo.flag){
insertarInicio(aux,amigo);
        }
}
        fclose(file);
    }
}


void guardarContacto(Amigo persona, char* nombreArchivo){
    FILE* file= fopen(nombreArchivo, "ab");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        fwrite(&persona, sizeof(Amigo), 1, file);
        fclose(file);
    }
}


void mostrarAgenda(char* nombreArchivo){
    FILE* file= fopen(nombreArchivo, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
    int i=1;
    tipoTabla();
        Amigo persona;
        while (fread(&persona, sizeof(Amigo), 1, file)){
            if(persona.flag){
            printf(" %i ",i);
mostrarAmigo(persona);
i++;
}
        }
        fclose(file);
    }
}


void inicializar(Indice indice[]){
int i;
for (i=0;i<Max;i++){
indice[i].letra=(17+i)+48;
indice[i].pos=-1;
indice[i].cantidad=0;
}
}


int tamanioArchivoIndice(char *nombreArchivoIndice){
FILE *file=fopen(nombreArchivoIndice,"ab");
fseek(file, 0, SEEK_END);
int tamanio=ftell(file)/sizeof(Indice);
fclose(file);
return tamanio;
}


void formarIndice(char *nombreArchivo,char *nombreArchivoIndice){
Indice indice[Max];
inicializar(indice);
Amigo persona;
char inic;
int j=0,encontrado,i=0;
FILE *file=fopen(nombreArchivo,"rb");
while(fread(&persona, sizeof(Amigo), 1, file)){
inic=persona.apellido[0];
if (inic>97 || inic<122) inic=inic-32; //Si no es mayuscula, la transforma en mayuscula
encontrado=0;
while(i<Max && encontrado!=1){
if((indice[i].letra==inic)&&(indice[i].pos==-1)){
indice[i].pos=j;
indice[i].cantidad=indice[i].cantidad+1;
encontrado=1;
}else if((indice[i].letra==inic)&&(indice[i].pos!=-1)){
indice[i].cantidad++;
encontrado=1;
}else{
i++;
}
}
j++;
}
fclose(file);
remove(nombreArchivoIndice);
arregloArchivoIndice(nombreArchivoIndice,indice);
}

void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]){
int i;
for (i=0;i<Max;i++){
guardarIndice(nombreArchivoIndice,indice[i]);
}
}

void guardarIndice(char *nombreArchivoIndice,Indice ind){
    FILE* file= fopen(nombreArchivoIndice, "ab");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        fwrite(&ind, sizeof(Indice), 1, file);
        fclose(file);
    }
}


void tipoTablaIndice(){
printf("%-10s %-15s %-15s\n\n","LETRA","POSICION","CANTIDAD");
}

//Muestra uno
void mostrarLetra(Indice ind){
if(ind.cantidad!=0) printf("%-10c %-15d %-15d\n\n",ind.letra,ind.pos,ind.cantidad);
}

//Muestra el arreglo indice (No se usa, solo era para probar)
void mostrarArregloIndice(Indice indice[]){
int i;
tipoTablaIndice();
for (i=0;i<Max;i++){
mostrarLetra(indice[i]);
}
}

//Muestra el archivo indice (No se usa, solo era para probar)
void mostrarArchivoIndice(char* nombreArchivoIndice){
    FILE* file= fopen(nombreArchivoIndice, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        Indice indice;
        while (fread(&indice, sizeof(Indice), 1, file)){
mostrarLetra(indice);
    }
        fclose(file);
    }
}

//Dada una pos y una cantidad, muestra contactos desde una posicion avanzando tanto como cant haya
void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant){
FILE *file=fopen(nombreArchivo,"rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
    int i,elem;
    if (cant!=0){
    elem=pos;
    tipoTabla();
    for (i=pos;i<pos+cant;i++){
    Amigo amigo;
    fseek (file, (elem)*sizeof(Amigo), SEEK_SET);
        fread(&amigo, sizeof(Amigo), 1, file);
mostrarAmigo(amigo);
elem++;
}
}else{
mostrarMensajeCentro("No hay amigos con esa inicial.");
}
        fclose(file);
        printf("\n\n");
}
}

//Muestra los contactos dependiendo de la letra inicial
void mostrarApellidoInicial(char *nombreArchivo,char *nombreArchivoIndice,char c){
c=c-65;
FILE *file=fopen(nombreArchivo,"rb");
if (tamanioArchivo(nombreArchivo)==0){
mostrarMensajeCentro("Archivo Vacio");
fclose(file);
}else{
FILE *fileInd=fopen(nombreArchivoIndice,"rb");
if (fileInd==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo");
    }else{
Indice ind;
fseek(fileInd,(c)*sizeof(Indice),SEEK_SET);
fread(&ind,sizeof(Indice),1,fileInd);
fclose(fileInd);
mostrarArchivoApellido(nombreArchivo,ind.pos,ind.cantidad);
}
}
}

int borrarContactoArchivo(char *nombreArchivo, int pos){
    bool toReturn=true;
    if((tamanioArchivo(nombreArchivo)<pos)||(pos<1)){
        printf("La posicion indicada es invalida");
        toReturn=false;
    }else{
        FILE *file=fopen(nombreArchivo,"r+b");
        Amigo amigo;
        fseek (file, (pos-1)*sizeof(Amigo), SEEK_SET);
        fread(&amigo, sizeof(Amigo), 1, file);
        mostrarAmigo(amigo);
        presUnaTecla();
        amigo.flag=false;
        fseek (file, -1*sizeof(Amigo), SEEK_CUR);
        fwrite(&amigo,sizeof(Amigo),1,file);
        fclose(file);
    }
    return toReturn;
}

int borrarContactoLista(Lista *lista, int pos){
    Persona *aux=lista->inicio, *elemEliminar;
    bool toReturn=false;
    int i;
    if(pos!=1){
        for(i=1;i<pos-1;i++){
            aux=aux->sig;
        }
        elemEliminar=aux->sig;
        aux->sig=elemEliminar->sig;
        free(elemEliminar);
        toReturn=true;
    }else{
        suprimirInicio(lista);
        toReturn=true;
    }
    return toReturn;
}

void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo){
FILE *file=fopen(nombreArchivo,"rb");
Amigo amigo;
int i=1;
while(fread(&amigo, sizeof(Amigo), 1, file)){
        if (estaApellidONombre(amigo,buscoAmigo)){
            printf(" %i ",i);
            mostrarAmigo(amigo);
            i++;
        }
}
fclose(file);
    if(i==1)mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
}

void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo){
    Persona *aux=lista->inicio;
    int i=1;
while(aux){
        if(estaApellidONombre(aux->dato,buscoAmigo)){
                printf(" %i ",i);
                mostrarAmigo(aux->dato);
                i++;
        }
        aux=aux->sig;
}
if(i==1) mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
}

int estaApellidONombre(Amigo amigo, Amigo buscoAmigo){
    bool existe =false;
    existe = (strcmpi(amigo.apellido,buscoAmigo.apellido)==0);
    existe |= (strcmpi(amigo.nombre,buscoAmigo.nombre)==0);
    return existe;
}

Amigo pedirAmigoBuscar(){
    Amigo amigoBuscar;
    do{
printf("\nIngrese el apellido de su amigo.\n");
        fgets(amigoBuscar.apellido,17, stdin);
        limpiar(amigoBuscar.apellido);
}while (strlen(amigoBuscar.apellido)>17);
do{
printf("\nIngrese el nombre de su amigo.\n");
        fgets(amigoBuscar.nombre,17, stdin);
        limpiar(amigoBuscar.nombre);
}while (strlen(amigoBuscar.nombre)>17);
return amigoBuscar;
}


int pedirNombreMes(){
    char mes[12];
    do{
        printf("\nIngrese el nombre: \n");
        fgets(mes,12, stdin);
        limpiar(mes);
    } while ((strlen(mes)>12) || (esMes(mes))==0);
}

int esMes(char *mes){
    int toReturn=-1;
    int i=0;
    while((i<12) && (toReturn==-1)){
        if(strcmpi(arrMes[i],mes)==0){
            toReturn=i+1;
        }
        i++;
    }
    return toReturn;
}

void MostrarCumpleMesLista(Lista *lista,int mes){
    Persona *aux=lista->inicio;
    int i=1;
    while(aux){
        if(aux->dato.fecNac.mes==mes){
            printf(" %i ",i);
            mostrarAmigo(aux->dato);
            i++;
        }
        aux=aux->sig;
    }
}

void MostrarCumpleMesArchivo(char *nombreArchivo,int mes){
    FILE *file=fopen(nombreArchivo,"rb");
    if(file==NULL){
        mostrarMensajeAviso("Hubo un error al abrir el archivo");
    }else{
        Amigo amigo;
        int i=1;
        while(fread(&amigo,sizeof(Amigo),1,file)){
            if(amigo.fecNac.mes==mes){
                printf(" %i ",i);
                mostrarAmigo(amigo);
                i++;
            }
        }
    }
    fclose(file);
}
[code=c]
[/code]
2  Programación / Programación C/C++ / ERROR en C process returned -10737441819 en: 14 Abril 2016, 14:22 pm
Buenas gente.. Soy nuevo en esto, hace poco empece a usar C para programas simples..
Tengo un problema "process returned -10737441819"
Esto al terminar todo, no se que sera..
Desde ya, muchas gracias..

DEJO EL CODIGO (espero se entienda), no tiene nada de interesante el programa, pero no quiero que salga ese error..



Código:
[i]
#include<stdio.h>
#define Max 255

void EjDiez (int num[],int lim);
void CargarDatos (int num[], int lim);
void MostrarDatos (int num[],int lim);
void ordenarMenAMay(int num[], int lim);
void ordenarMayAMen (int num[],int lim);
void intercambiar(int *a, int *b);
void organizarParEImpar (int num[],int lim);

int main(){
    int numero[Max];
    int marca,largo,cant;
    printf("ingrese el maximo de numeros: ");
    scanf("%i",&cant);
    CargarDatos(numero[Max], cant);
    EjDiez(numero[Max],cant);
//    system("pause");
    ordenarMenAMay(numero[Max],cant);
    MostrarDatos(numero[Max], cant);
//    system("pause");
    ordenarMayAMen(numero[Max],cant);
    MostrarDatos(numero[Max], cant);
 //   system("pause");
    organizarParEImpar(numero[Max], cant);
    MostrarDatos(numero[Max], cant);
    printf("Paso por aca?");
//    system("pause");
}


void CargarDatos (int num[],int lim){ //Carga el arreglo desde el teclado
    int a,i;
    for(i=0;i<lim;i++){
        printf("\n\nIngrese un numero: ");
        scanf("%i",&a);
        num[i]=a;
    }
    printf("\n");
}


void EjDiez (int num[],int lim){     //Si la cantidad de elemtos es par, muestra el 1er num del arreglo
    int i=0;                           //sino, muestra el numero que esta en la mitad del arreglo
    if ((lim % 2)==0){ //Se fija si es PAR
        printf("\n\nEl numero es PAR: (muestro el primer num del arreglo)  %i",num[i]);
    }
    else{
        i = (lim / 2); //Busca la mitad del arreglo
 //       printf("\n\n el div %i",i);
        printf("\n\nEl numero es IMPAR: (muestro el num de la mitad del arreglo) %i",num[i]);
    }
}

void MostrarDatos (int num[],int lim){  //Muestra los datos del arreglo
    int i;
    for(i=0;i<lim;i++){
        printf("\n\nMostrar un numero:%i \n",num[i]);
    }
}



void ordenarMayAMen (int num[],int lim){ //Ordena los elem del arreglo de Mayor a Menor
    int j,i;
    for (i=0;i<lim;i++){
        for (j=i;j<lim;j++){
            if (num[i]<num[j]){
                intercambiar(&num[i],&num[j]);
            }
        }
    }
}

void intercambiar(int *a, int *b){ //Intercambia 2 valores
    *b=*a+*b;
    *a=*b-*a;
    *b=*b-*a;
}

void ordenarMenAMay(int num[],int lim){ ////Ordena los elem del arreglo de Mayor a Menor
    int j,i;
    for (i=0;i<lim;i++){
        for (j=i;j<lim;j++){
            if (num[i]>num[j]){
                intercambiar(&num[i],&num[j]);
            }
        }
    }
}

void organizarParEImpar (int num[],int lim){ //Organiza la lista, primero los numeros pares y despues los impares
    int i=0,j=0,k=0;
    int cantPar,cantImpar;
    int par[Max];
    int impar[Max];
    for (i=0;i<lim;i++){
        if ((num[i] % 2)==0){
            par[j]=num[i];
            j++;
            printf("\nPAR\n");
        }
        else {
            impar[k]=num[i];
            k++;
            printf("\nIMPAR\n");
        }
    }

    cantImpar=k;
    cantPar=j;
    i=0;
    for(j=0;j<cantPar;j++){
        num[i]=par[j];
        i++;
    }
    for (k=0;k<cantImpar;k++){
        num[i]=impar[k];
        i++;
    }
 //   system("pause");
}
[/i]
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines