Demande d'aide pour un carnt d'adresses avec liste chaînée

cs_titoune85 Messages postés 3 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 21 novembre 2005 - 21 nov. 2005 à 22:16
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011 - 23 nov. 2005 à 18:22
bonsoir à tous!

je vous demande un peu de temps et beaucoup d'aide pour ce pg qui consiste a creer un carnet d'adresse classé par ordre alphabetique. J'utilise un fichier de contacts en entree que je dois convertir en liste chaînée simple, modifier, puis ré-enregistrer dans un autre fichier.

Le pb est que je débute en lg C et que j'ai bcp de mal à manipuler ce genre de fonctins malgré les nombreuses indications du site et les très nombreux pgs type "carnet d'adresse" auxquels je ne comprends rien....

j'ai ecris ce code très incomplet (et sans doute très faux aussi) qui ne ient pas compte de ces fichier en entree-sortie... quelqu'un peut-il m'aider à le compléter ?

je vous remercie énormément de votre aide qui me sera très précieuse vu les quelques jours qui me restent pour rendre mon pg !! :(

bonne soirée à tous
#include<stdio.h>
#include<string.h>


typedef struct contact
{
char Nom[20];
char Prenom[20];
char Tel1[20];
char Tel2[20];
char Adresse[70];
struct contact *suivant;
} CONTACT;



CONTACT *liste;


//la declaration des fonctions


CONTACT *ajouter_en_debut(char *Nouveaunom, char *Nouveauprenom, char *Nouveautel1, char *Nouveautel2, char *Nouveauadresse, CONTACT *liste);
CONTACT *ajouter(void);
void lister(CONTACT *liste);
int supprimer(void);
void rechnom(void);
void rechprenom(void);
void modifier(void));




int main(void)

{
char b;


printf("Bienvenue dans votre carnet d'adresses personnalise\n");

do
{

printf("que souhaitez-vous faire ? Voici le menu :\n");
printf("\n\n\t\t\t\tmenu:\n");
printf("\t\t\t\t----\n\n");
printf("\n '2' : ajout d'un etudiant.\n\n '1' : affichage.\n\n '3' : suppression.\n\n '4' : recherche d'un contact par son nom.\n\n\ '5' : recherche d'un contact par son prenom.\n\n '6' : modifier un contact.\n\n '7' : quitter.\n\n");
scanf("%d",&b);
switch (b)
{
case '1': lister(liste);break;
case '2': ajouter();break;
case '3': supprimer(); ;break;
case '4': rechnom();break;
case '5': rechprenom();break;
case '6': modifier();break;
case '7': exit(1);
}
}while (b!='7');
}




/*Dans le cas particulier où le contact vient se mettre en début de liste chaînée, on doit créer une sous-fonction, ajouter_en_debut, appelée dans la fonction ajouter*/


CONTACT *ajouter_en_debut(char *Nouveaunom, char *Nouveauprenom, char *Nouveautel1, char *Nouveautel2, char *Nouveauadresse, CONTACT *liste)


{
CONTACT *nouveau;
nouveau = (CONTACT *)malloc(sizeof(CONTACT));
if (nouveau == NULL)
{
exit(1);
}

nouveau -> suivant = liste;
return(nouveau);
}






CONTACT *ajouter(void)


{
CONTACT *nouveau, *p, *q;
FILE *f;



f=fopen("classe.dat","a");

if(f==NULL)
printf("probleme d'ouverture du fichier, verifiez son existence svp");
else
{

printf("Veuillez entrer le nom de famille de votre nouveau contact\n");
gets(Nouveaunom);
printf("Veuillez entrer le prenom de votre nouveau contact\n");
gets(Nouveauprenom);
printf("Veuillez entrer son premier numero de telephone\n");
gets(Nouveautel1);
printf("Veuillez entrer son second numero de telephone\n");
gets(Nouveautel2);
printf("Veuillez entrer l'adresse de votre nouveau contact\n");
gets(Nouveauadresse);



if ((liste == NULL) || (strcmp(liste -> Nom, Nouveaunom)>0))
return(ajouter_en_debut(Nouveaunom, Nouveauprenom, Nouveautel1, Nouveautel2, Nouveauadresse, liste));



else
{
nouveau=(CONTACT *)malloc(sizeof(CONTACT));
strcpy(nouveau -> Nom, Nouveaunom);
strcpy(nouveau -> Prenom, Nouveauprenom);
strcpy(nouveau -> Tel1, Nouveautel1);
strcpy(nouveau -> Tel2, Nouveautel2);
strcpy(nouveau -> Adresse, Nouveauadresse);


p=liste;
q=p->suivant;


while ((q!=NULL) && (strcmp(Nouveaunom, q -> Nom)>0))



{
p = p->suivant;
q = q->suivant;


}


nouveau -> suivant = q;
p -> suivant = nouveau;
return(liste);
}



while(CONTACT -> suivant != NULL)
{
fprintf(f,"%s%s%s%s%s\n", CONTACT->Nom, CONTACT->Prenom, CONTACT->Tel1, CONTACT->Tel2, CONTACT->Adresse) ;
CONTACT->suivant ;
}

fclose(f);

}


}




/* fonction de suppression d'un contact*/


int supprimer(void)



{


CONTACT *u, *p, *q;
p= liste;
char nomasuppr[20], prenomasuppr[20];



FILE *f;
f=fopen("classe.dat","a");


printf("tapez le nom du contact a supprimer\n");
scanf("%s", nomasuppr);
printf("tapez le prenom du contact a supprimer\n");
scanf("%s", prenomasuppr);


if (p==NULL)
{
printf("desole, la liste est vide\n");
break;
}

else
{

if ((strcmp(p->Nom, nomasuppr)== 0) && (strcmp(p->Prenom, prenomasuppr)== 0))
{

u=p;
p=p->suivant;
*liste=p;
free(u); /*libère la place mémoire qui était allouée pour ce contact*/
return(1);

}


else
{


q = p->suivant;


while ((q!=NULL) && ((strcmp(nomasuppr, q->Nom)>0) || (strcmp(prenomasuppr, q->Prenom) != 0)))
{
p = p->suivant;
q= q->suivant;
}


if (q == NULL)
{
printf("desole, ce contact ne figure pas dans votre carnet d'adresses\n");
return(0);
}


else
if ((strcmp(nomasuppr,q->Nom)==0) && (strcmp(prenomasuppr,q->Prenom)>0))
{

p->suivant = q->suivant;
free(q);


return(1);
}
else
{
printf("desole, ce contact ne figure pas dans votre carnet d'adresses\n");
return(0);
}



}
fclose(f);
}
}



/*fonction de recherche d’un contact par son nom de famille*/


void rechnom(void)


{


CONTACT *u, *p, *q;
p= liste;
char nomachercher[20];


FILE *f;



f=fopen("classe.dat","r");


printf("tapez le nom de faille du contact cherche\n");
scanf("%s", nomachercher);


if (strcmp(p->Nom, nomachercher)== 0) /* test de comparaison des 2 chaînes de caractères*/
{
do
{
printf("%s %s %s %s %s\n", p->Nom, p->Prenom, p->Tel1, p->Tel2, p->Adresse);
p= p->suivant ;
}
while (strcmp(p->Nom,nomachercher)== 0);


/* on prévoit cette boucle dans le cas où plusieurs contacts auraient le même nom de famille */


}

else
{
q = p->suivant;
while ((q!=NULL) && (strcmp(nomachercher, q->Nom)>0))
{
p = p->suivant;
q = q->suivant;
}


if (q == NULL)
{
printf("desole, ce contact ne figure pas dans votre carnet d'adresses\n");
}


else
if (strcmp(nomachercher,q->Nom)>0)
do
{
printf(" %s %s %s %s %s\n ", p->Nom, p->Prenom, p->Tel1, p->Tel2, p->Adresse);
p= p->suivant;
}
while (strcmp(p->Nom, nomachercher)== 0);


/* on prévoit cette boucle dans le cas où plusieurs contacts auraient le même nom de famille */


else
{
printf("desole, ce contact ne figure pas dans votre carnet d'adresses\n");
}


fclose(f);
}



/*fonction de recherche d’un contact par son prénom*/



void rechprenom(void)


{
CONTACT *u, *p, *q;
p= *liste;
char prenomachercher[20];


FILE *f;
f=fopen("classe.dat","r");



printf("tapez le prenom a rechercher\n");
scanf("%s", prenomachercher);


if (strcmp(p->Prenom, prenomachercher)== 0)
{
do
{
printf(" %s %s %s %s %s\n ", p->Nom, p->Prenom, p->Tel1, p->Tel2, p->Adresse);
p= p->suivant ;
}
while(strmp(p->Prenom, prenomachercher)==0);


}


else
{
q=p->suivant;
while ((q!=NULL) && (strcmp(prenomachercher, q->Prenom)!=0))
{
p = p->suivant;
q = q->suivant;
}


if (q == NULL)
{
printf("desole, ce prenom ne figure pas dans votre carnet d'adresses\n");
}


else

if (strcmp(prenomachercher, q->Prenom)>0)
{
do
{
printf("%s %s %s %s %s\n ", p->Nom, p->Prenom, p->Tel1, p->Tel2, p->Adresse);
p = p->suivant;
}
while (strcmp(p->Prenom, prenomachercher)==0);
}


else
{
printf("desole, ce prenom ne figure pas dans votre carnet d'adresses\n");
}


}
fclose(f);
}



/*modification d’un contact déjà enregistré dans le carnet d’adresse*/


void modifier(void)


{


FILE *f;
f=fopen("classe.dat","a");


char nomamodifier[20], prenomamodifier[20], nouveautel1[20], nouveautel2[20], nouveauadresse[70];


printf("tapez le nom de famille du contact a modifier\n");
scanf("%s", nomamodifier);


printf("tapez le prenom du contact a modifier\n");
scanf("%s", prenomamodifier);


CONTACT *u, *p, *q;
p= *liste;



CONTACT A;
CONTACT nouveau;



A=(CONTACT *)malloc(sizeof(CONTACT));


rewind(f);


while ((strcmp(p->Nom, nomamodifier)> 0) && (strcmp(p->Prenom,prenomamodifier)!= 0))

{
q = p->suivant;
}



if (q == NULL)
{
printf("desole, ce contact ne figure pas dans votre carnet d'adresses\n");
}

else

{

if (strcmp(p->Nom, nomamodifier)== 0) && (strcmp(p->Prenom,prenomamodifier)== 0))

printf("%s %s %s %s %s\n", p->Nom, p->Prenom, p->Tel1, p->Tel2, p->Adresse);



printf("quel est son nouveau numero de tel 1 ? \n");
gets(nouveautel1);
strcpy(A->Tel1, nouveautel1);


printf("quel est son nouveau numero de tel 2 ? \n");
gets(nouveautel2);
strcpy(A->Tel2, nouveautel2);


printf("quelle est sa nouvelle adresse ?\n");
gets(nouveauadresse);
strcpy(A->Adresse, nouveauadresse);




/* suppression de l'ancien contact*/




u=q;
q=q->suivant;
*liste=q;
free(u); /*libère la place mémoire qui était allouée pour ce contact*/



nouveau=(CONTACT *)malloc(sizeof(CONTACT));
strcpy(nouveau -> Nom, A->Nom);
strcpy(nouveau -> Prenom, A->Prenom);
strcpy(nouveau -> Tel1, A->Tel1);
strcpy(nouveau -> Tel2, A->Tel2);
strcpy(nouveau -> Adresse, A->Adresse);


rewind(f);
p=liste;
q=p->suivant;


while ((q!=NULL) && (strcmp(A->Nom, p -> Nom)>0))



{
p = p->suivant;
q = q->suivant;


}


nouveau -> suivant = q;
p -> suivant = nouveau;


fprintf(f,"%s%s%s%s%s\n", CONTACT->Nom, CONTACT->Prenom, CONTACT->Tel1, CONTACT->Tel2, CONTACT->Adresse) ;
nouveau->suivant = q->suivant;

}


printf("modifications effectuees\n");



fclose(f);
}


/*lister l’ensemble des contacts du carnet d’adresses*/


void lister(CONTACT *liste)


{
CONTACT *debut, *t;
char *chaine1, *chaine2;


FILE *f;
f=fopen("classe.dat","r");


printf("voici votre liste de contacts\n");


rewind(f); /*PAS SUR..................... PAS SUR DU TOUT*/


t = liste;


while (t != NULL)
{
chaine1 = fgets(t->Nom, 20, f);
printf("Nom : %s ", chaine1);
chaine2 = fgets(t->Prenom, 20, f);
printf("Prenom : %s ", chaine2);
t = t->suivant;
}


fclose(f);


}


et voici une ebauche de fonction de conversion

/* fonction pour acquerir les donnees du fichier et recreer une liste chainee a parti de ceux-ci*/

CONTACT *acquerir(FILE *f)

{
int c;
c = getc(f);

CONTACT *p, *q;

CONTACT nouveau_maillon;
if (c == EOF)
{
printf("le fichier est vide pour l'instant\n");
liste = NULL;
return(liste);
exit(1);
}

else
{
rewind(f);
p=liste;
q = p->suivant;

while (c != EOF)

{
nouveau_maillon = (CONTACT *)malloc(sizeof(CONTACT));
fgets(nouveau_maillon.Nom, 20, f);
fgets(nouveau_maillon.Prenom, 20, f);
fgets(nouveau_maillon.Tel1, 20, f);
fgets(nouveau_maillon.Tel2, 20, f);
fgets(nouveau_maillon.Adresse, 20, f);
nouveau_maillon.suivant = q;
p->suivant = nouveau_maillon;

}

return (liste);

}


Programmer, C pas si facile...

1 réponse

dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
23 nov. 2005 à 18:22
peut être devrais tu passer aux jois du C++ et des classes, le code sera déjà une goute plus clair.
Ensuite, scinde tes problèmes, parce que balancer le code comme ça c'est pas joli joli, et faudrais passer 20 minutes à tous regarder et comprendre ou serait ton erreur.
0
Rejoignez-nous