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 dun 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 dun 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 dun contact déjà enregistré dans le carnet dadresse*/
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 lensemble des contacts du carnet dadresses*/
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...