Repertoire telephonique en langage C

Fermé
noussa - 22 janv. 2008 à 16:26
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 - 22 janv. 2008 à 17:52
Bonjour,voila j'ai un probleme en langage C pour créer une repertoire telephonique ,j'ai essayé avec ce code mais il ne retourne pas.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#include <string.h>

#define T 10
#define N 40

//declaration des structures

struct date

{
char jour[2];
char mois [T+1];
char annee [4];
};


struct adresse

{
char rue[N+1];
char cod_postal [4];
char ville [N+1];
};


struct personne

{
char nom [N+1];
char tel [T+1];
struct adresse adress;
struct date dat_naiss;
char mail [N+1];
char cod_depart [T+1];
};


//on va imbriquer une structure dans l'autre et ajouter un pointeur vers la fiche suivante


struct fiche
{
struct personne p;
struct fiche *p_suivant;
};


int comp(char *s, char *t)
{
int i;
int cmpt=0;
for(i=0;i<N+1;i++)
{
if((s[i]==t[i])||((s[i]<0)&&(t[i]<0)))
cmpt++;
}
if (cmpt==N+1)
return(1);
else return(0);
}



//voici la fonction qui va efecter le tri alphab‚tique

void trier (struct fiche **pp_liste)
{
int i=0,j,k,h=0,fin=0;

//on declare des ptrs vers des structures de type fiche

struct fiche *ptr,*tmp;

//et un tableau de pointeur sur lequel on va effectuer le tri

struct fiche *tab[100];

//ptr sera egal a *pp_liste cad l adresse de la premiere structure de la pile

// ptr= *pp_liste;
tab[0]= *pp_liste;

//on remplit le tableau avec toutes les strucures

while ((*tab[i]).p_suivant!=0)
{
tab[i+1]=(*tab[i]).p_suivant;
i++;
}

for(j=0;j<i;j++)

{
for(k=j+1;k<=i;k++)

{
fin=0;
h=0;

while(fin==0){

if((*tab[j]).p.nom[h]>(*tab[k]).p.nom[h])

{
tmp=tab[j];
tab[k]=tab[j];
tab[k]=tmp;
fin=1;

}else{

if((*tab[j]).p.nom[h]==(*tab[k]).p.nom[h])

{
//tri par rapport a la valeur du departement

if((*tab[j]).p.cod_depart[h]>(*tab[k]).p.cod_depart[h])
tmp=tab[j];
tab[j]=tab[k];
tab[k]=tmp;
fin=1;

}else{

if((*tab[j]).p.cod_depart[h]==(*tab[k]).p.cod_depart[h])

{
//tri par rapport au tel

if((*tab[j]).p.tel[h]>(*tab[k]).p.tel[h])
tmp=tab[j];
tab[j]=tab[k];
tab[k]=tmp;
fin=1;

// } else
h++;
}else{
fin=1;
}
}
}

h++;
}
}
}
//on modifie le chainage avec les pointeurs tries

for(k=0;k<i;k++)
{
(*tab[k]).p_suivant=tab[k+1];
}

(*tab[k]).p_suivant=NULL;
*pp_liste=tab[0];

printf("\n repertoire trie.....\n");

}




//fction servant a enlever une personne du repertoire

void retirer (struct fiche **pp_liste)
{ char tel [T+1];
char cod_depart[T+1];
char nom[N+1];
struct fiche *ptr,*ptr2;
int fin=0;
int r;

//on initialise ptr avec l'adresse de la 1ere structure

ptr=*pp_liste;

printf("\n entrer le nom de la personne a retirer: ");
scanf("%s",nom);
// if(nom!=" ")
{
r=comp(nom,(*ptr).p.nom);
if(r==1) fin=1;
//on va maintenant cherché si la personne est présente dans l'agenda
while(fin==0){
if((*ptr).p_suivant==NULL)
{
fin=1;
r=comp(nom,(*ptr).p.nom);
}else{
r=comp(nom,(*ptr).p_suivant->p.nom);

if (r==1)
fin=1;
else
//on passe à la structure suivante...
ptr=(*ptr).p_suivant;
}
}

if(r==1)
{
r=comp(nom,(*ptr).p.nom);
if(r==1)
{
ptr2=(*ptr).p_suivant;
free(ptr);
*pp_liste=ptr2;
}else{

//on relie la fiche précedente à la suivante
//pour conserver un chaînage cohérent

ptr2=(*ptr).p_suivant->p_suivant;

//on libère la mémoire...
free((*ptr).p_suivant);
(*ptr).p_suivant=ptr2;

}

printf("\nEntree supprimee...\n");

}else{
printf("\nAucune entree correspondante...\n");

}
}


/* if(nom!=" ")
{
if(r==1) fin=1;

//on va chercher si la personne est presente dans le repertoire

while(fin==0){
if((*ptr).p_suivant==NULL)
{
fin=1;
r=comp(nom,(*ptr).p.nom);

}else{
r=comp(nom,(*ptr).p_suivant->p.nom);

if(r==1)
fin=1;

else

//on passe a la structure suivante

ptr=(*ptr).p_suivant;
}
}

if(r==1)
{
r=comp(nom,(*ptr).p.nom);

if(r==1)
{
ptr2=(*ptr).p_suivant;
free(ptr);
*pp_liste=ptr2;

}else{

//on relie la fiche precedente a la suivante

ptr2=(*ptr).p_suivant->p_suivant;

//onlibere la memoire

free((*ptr).p_suivant);
(*ptr).p_suivant=ptr2;


*/


printf("\nentrer le tel de la personne a retirer");
scanf("%s",tel);

r=comp(tel,(*ptr).p.tel);

{
if(r==1) fin=1;
//on va chercher si la personne est presente dans le repertoire

while(fin==0){
if((*ptr).p_suivant==NULL)
{
fin=1;
r=comp(tel,(*ptr).p.tel);

}else{

r=comp(tel,(*ptr).p_suivant->p.tel);
if(r==1)
fin=1;

else
//on passe a la structure suivante

ptr=(*ptr).p_suivant;

}
}

if(r==1)
{
r=comp(tel,(*ptr).p.tel);
if(r==1)
{
ptr2=(*ptr).p_suivant;
free(ptr);
*pp_liste=ptr2;

}else{
//on relie la fiche precedente a la suivante
ptr2=(*ptr).p_suivant->p_suivant;
//onlibere la memoire
free((*ptr).p_suivant);
(*ptr).p_suivant=ptr2;

}

printf("\n entree suprimee...... \n");

}else{

printf("\naucune entree correspondante.... \n");
}
}
}



//ajouter un contacte


void ajouter (struct fiche **pp_liste)

{

char nom [N+1];
char tel [T+1];
char rue[N+1],cod_postal[4],ville[N+1];
char jour[2],mois[2],annee[4];
struct date dat_naiss;
struct adresse adress;
char mail [N+1];
char cod_depart [T+1];
int fin=0;
int r;

//ce pointeur designera la nouvelle fiche

struct fiche *p_nouv;
struct fiche *ptr;
fin=0;
printf("\n entrer le nom de la personne: ");
scanf("%s",nom);
printf("\n entrer son numero de telephone: ");
scanf("%s",tel);
printf("\n entrer son adresse: \n rue: ");
scanf("%s",adress.rue);
printf("\n code postal: ");
scanf("%s",adress.cod_postal);
printf("\n ville: ");
scanf("%s",adress.ville);
printf("\n entrer sa date de naissanse: \njour/mois/annee: ");
scanf("%s/%s/%s",dat_naiss.jour,dat_naiss.mois,dat_naiss.annee);
printf("\n entrer son email: ");
scanf("%s",mail);
printf("\n entrer son code de departement: ");
scanf("%s",cod_depart);

//initialisation

ptr=*pp_liste;

//on cherche si la personne n'est pas deja dans le repertoire

while (fin==0)
{
if(ptr==NULL) fin=1;
else {
r=comp(nom,(*ptr).p.nom);
if(r==1) fin=1;
else {
if ((*ptr).p_suivant==0) fin=1;
ptr=(*ptr).p_suivant;
}

}

}
if(r==1)
{
printf("\n entree deja presente \n");
}
else{
//on alloue de la memoire pour une nouvelle fiche

p_nouv=new(struct fiche);

//on relie cette vouvelle fiche a la suivante et on change *pp_liste qui doit rester au sommet

(*p_nouv).p_suivant=*pp_liste;
*pp_liste=p_nouv;

strcpy((*p_nouv).p.nom,nom);
strcpy((*p_nouv).p.tel,tel);
strcpy((*p_nouv).p.adress.rue,rue);
strcpy((*p_nouv).p.adress.cod_postal,cod_postal);
strcpy((*p_nouv).p.adress.ville,ville);
strcpy((*p_nouv).p.dat_naiss.jour,jour);
strcpy((*p_nouv).p.dat_naiss.mois,mois);
strcpy((*p_nouv).p.dat_naiss.annee,annee);
strcpy((*p_nouv).p.cod_depart,cod_depart);

}

}




void afficher (struct fiche *p_liste)
{
int fin=0;
char nom [N+1];
char tel [T+1];
char rue[N+1],cod_postal[4],ville[N+1];
char jour[2],mois[2],annee[4];
struct date dat_naiss;
struct adresse adress;
char mail [N+1];
char cod_depart [T+1];
struct fiche *ptr;
// printf("\n " );
ptr=p_liste;
if(p_liste==NULL)
{printf("aucune entree.....\n");
fin=1;
}
while (fin==0)
{ // {printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n",(*ptr).p.nom,(*ptr).p.tel,(*ptr).p.adress,(*ptr).p.dat_naiss,(*ptr).p.cod_depart);
printf("\n%s",(*ptr).p.nom);
printf("\t%s",(*ptr).p.tel);
printf("\t%s",(*ptr).p.adress.rue,rue);
printf("\t%s",(*ptr).p.adress.cod_postal,cod_postal);
printf("\t%s",(*ptr).p.adress.ville,ville);
printf("\t%s",(*ptr).p.dat_naiss.jour,(*ptr).p.dat_naiss.mois,(*ptr).p.dat_naiss.annee,jour, mois, annee);
// printf("\t%s",(*ptr).p.dat_naiss.mois,mois);
// printf("\t%s",(*ptr).p.dat_naiss.annee,annee);
printf("\t%s",(*ptr).p.mail,mail);
printf("\t%s",(*ptr).p.cod_depart);

if((*ptr).p_suivant==0) fin=1;

//on passe a la fiche suivante

ptr=(*ptr).p_suivant;
}
}




void quitter (struct fiche **pp_liste)
{int fin=0;
int cntfree=0;
struct fiche *ptr;
struct fiche *ptr2;
ptr=*pp_liste;
if(*pp_liste==NULL)
{//aucune entree
fin=1;
}
while(fin==0)
{//on va liberer tout les espace memoires allouees
if ((*ptr).p_suivant==0) fin=1;
ptr2=(*ptr).p_suivant;
free(ptr);
ptr=ptr2;
cntfree++;
}
printf("\n\n le nombre des zones liberee: %d \n\n A bientot....",cntfree);
getchar();
getchar();
}

void main()
{
int fin=0;
int rep;

//ce pointeur va pointer vers la 1ere fiche de la pile donc la derniere

struct fiche *p_liste=NULL;
clrscr();
while(fin==0)
{ printf("\n Que voulez vous faire?\n\t1-ajouter une personne\n\t2-Afficher le repertoire\n\t3-retirer une entree\n\t4-Trier les entrees\n\t0-Quitter\nvotre choix: ");
scanf("%d",&rep);
switch(rep)
{
case 1:ajouter(&p_liste);
break;
case 2:afficher(p_liste);
break;
case 3:retirer(&p_liste);
break;
case 4:trier(&p_liste);
break;

case 0 :quitter(&p_liste);
fin=1;
break;
}
}
}
A voir également:

1 réponse

tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
22 janv. 2008 à 17:52
Tu as pompé ce code je ne sais où et tu t'attends à ce qu'il fonctionne du premier coup ! Tu as de l'espoir !!

Pour résoudre ton problème, qu'as tu essayé de faire. Ainsi on pourra t'aider à le résoudre.

En tous cas ce n'est pas moi qui résoudrai tes problèmes à ta place.
0