Tp7.c 4.54 KB
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ContigueLength 512
#define NbChar 32

typedef struct{
    int jour, mois,annee;
}Date;

typedef struct{
    char nom[NbChar], prenom[NbChar], tel[NbChar];
    Date date;
}Personne;

typedef struct{
    Personne listePers[ContigueLength];
    int dernier;
}Annuaire;


void lireDate(Date *date){
    scanf("%d%d%d",&date->jour,&date->mois, &date->annee);
}

void afficheDate(Date date){
    printf("Jour: %d | Mois: %d | Annee: %d\n",date.jour, date.mois, date.annee);
}

int lirePersonne(Personne *pers){
    if(scanf("%s",pers->nom)!=EOF){
        scanf("%s",pers->prenom);
        lireDate(&pers->date);
         scanf("%s",pers->tel);
        return 1;
    }else {
        return 0;
    }
    
//if(scanf("%s")==EOF);    

}

void affichePers(Personne p){
    printf("Nom: %s | Prenom: %s | Tel: %s\n",p.nom, p.prenom, p.tel);
    afficheDate(p.date);
}

void creerAnnuaire(Annuaire *annuaire){
    annuaire->dernier=-1;
    //tq lecture d'une nouvelle personne est possible -> ajoute pers et +1 à annuaire.dernier 
    while((annuaire->dernier < ContigueLength) && (lirePersonne(&annuaire->listePers[(annuaire->dernier)+1])!=0)){
        annuaire->dernier+=1;
    }
}

void afficheAnnuaire(Annuaire annuaire){
    int i;
    for(i = 0; i <= annuaire.dernier; i++){
        affichePers(annuaire.listePers[i]);
        
    }
}

int compareDate(Date d1, Date d2){
    if(d1.annee == d2.annee){
         if(d1.mois == d2.mois){
              if(d1.jour == d2.jour){
                  return 0;
              }else if(d1.jour < d2.jour){
                  return -1;
              }
              
         }else if(d1.mois < d2.mois){
                  return -1;
         }
             
    }else if(d1.annee < d2.annee){
        return -1;
    }
    return 1;
    
}


int rechDicho(char nomPers[], Annuaire annuaire){
    int debut, fin, milieu, trouve,ind;
    fin = annuaire.dernier;
    debut = 0;
    trouve = 0;
    ind=-1;    
       
    while ( fin >= debut && trouve == 0){
        milieu = (debut+fin)/2;
        if(strcmp(nomPers, annuaire.listePers[milieu].nom)==0){
            trouve=1;
            ind=milieu;
        }else if (strcmp(nomPers, annuaire.listePers[milieu].nom)<0){
            fin=milieu-1;
        }else{
            debut=milieu+1;
        }
    }
    
    return ind;
}

void modifTel(char nomPers[], Annuaire* annuaire, char tel[]){
    int res = rechDicho(nomPers,*annuaire);
    if(res != -1){
        strcpy(annuaire->listePers[res].tel,tel); 
    }
}

void deletePers(char nomPers[], Annuaire* annuaire){
    int res = rechDicho(nomPers,*annuaire);
    if(res != -1){
        int i;
        for(i=res; i <= annuaire->dernier; i++){
            annuaire->listePers[i]=annuaire->listePers[i+1];
        }
        annuaire->dernier -= 1;
    }
}

void ajoutPers(Personne p, Annuaire* annuaire){
    int i=annuaire->dernier;
    annuaire->dernier+=1;
    int trouve = 0;
    while(i>=0 && trouve ==0){
        if((strcmp(p.nom, annuaire->listePers[i].nom)<0)){
            annuaire->listePers[i+1]=annuaire->listePers[i];
        } else if((strcmp(p.nom, annuaire->listePers[i].nom)>=0)){
            trouve =1;
            annuaire->listePers[i+1]=p;
        }
        i--;  
    }
}





int main(int argc, char *argv[]){
  
   /* Date d;
    lireDate( &d);
    afficheDate(d);
    Personne p;
    lirePersonne(&p);
    affichePers(p);*/
   
    Annuaire annuaire;
    creerAnnuaire(&annuaire);
    afficheAnnuaire(annuaire);
    
    
        
    //printf("%d,%d,%d",rechDicho("Benoist",annuaire),rechDicho("Feuille",annuaire),rechDicho("Perreira",annuaire));
    //modifTel("Benoist",&annuaire,"0320198746");
    //deletePers("Cuvelier",&annuaire);
    //afficheAnnuaire(annuaire);
    
    if(argc == 3 && strcmp(argv[1],"rechercher")==0 ){
        printf("%s existe (indice:%d)\n",argv[2], rechDicho(argv[2],annuaire));
    } else if (argc == 4 && strcmp(argv[1],"modifier")==0){
        modifTel(argv[2],&annuaire,argv[3]);
        printf("Le nouveau numero de %s sera: %s\n",argv[2], argv[3]);
    } else if ( argc == 3 && strcmp(argv[1],"supprimer")==0 ){
        deletePers(argv[2],&annuaire);
    } else if ( argc ==8  && strcmp(argv[1],"ajouter")==0 ){
        ///annuaire ajouter Dupont 01 01 2011 0328753542

        Personne p;
        strcpy(p.nom,argv[2]);
        strcpy(p.prenom,argv[3]);
        p.date.jour=atoi(argv[4]);
        p.date.mois=atoi(argv[5]);
        p.date.annee=atoi(argv[6]);
        strcpy(p.tel,argv[7]);
        ajoutPers(p,&annuaire);
    }  
    
    afficheAnnuaire(annuaire);
    return 1;
}