#include #include #include #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; }