Repertoire telephonique en C

Fermé
meaoui - 26 oct. 2007 à 15:35
 moi - 26 avril 2008 à 10:05
Bonjour,

j'ai un petit soucis pour finir une application en C , c'est pour cette apres midi a 19h que je vais presenter mon travail comme mini projet .
je demande un coup de main , je suis un debutant en programmation , mais notre prof est DING, ils nous forcent :
voila ce que j'ai reussit a compiler :
ca passe pas lors de la creation du fichier, merci d'avance.
pour tt repense , merci de me contacter sur meaoui2@hotmail.com

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>

#define MAX_NOM 20
#define MAX_PRENOM 20
#define MAX_REP 20

typedef struct{
char prenom[MAX_PRENOM];
char nom[MAX_NOM];
long tel;
}Personne;

typedef enum{FALSE,TRUE} Boolean;
static Personne repertoire[MAX_REP];
static int nbPers=0;

/*remplit le tableau tab de caracteres tapes au clavierjusqu'au
caractere retour chariot exclu.
Au maximum (taille-1) caracteres sont mis dans le tableau tab.
Le caractere null est ajoute … la finpour en faire une chaine.
Parametres: tab un tableau de 'taille ' elements qui sera rempli
avec les caracteres saisis, taille est le nbre d'elements max
du tableau tab*/

void saisieChaine (char tab[], int taille){
char car;
int i=0;
/*on ignore tout les caracteres alphanumeriques*/
while(!isalpha(car=getchar()));
do{
/*on place le caractere dans le tableau*/
tab[i++]=car;
/*et on continue jusqu'a la fin du tableau ou caractere fin de ligne*/
}while ( (i<taille-1)&&((car=getchar())!='\n'));
/*et n'oublie pas le caractere de fin de chaine*/
tab[i]='\0';
if (car!='\n'){
/*il faut vider le buffer car trop de caracteres ont ete saisis par
l'utilisateur. Si on les laisse, ils seraient utilises par le prochain
appel a saisiChaine.*/

while (getchar()!='\n');
}
}
/*Recherche dans le repertoire l'indice du tableau de la personne donnee.
Parametres: nom, prenom(nom et prenom de la personne a rechercher)
retour: l'indice de la personne si elle est dans le repertoire, -1 sinon*/

static int getIndicePersonne (char *nom, char *prenom) {
int i=0;
/*il faut parcourir tout le repertoire*/
for(i=0; i<nbPers; i++)
/*on compare les chaines de caracteres et non pas les adresses des chaines*/
if ((strcmp(nom, repertoire[i].nom)==0)&&
(strcmp(prenom, repertoire[i].prenom)==0))
/*si la solution est trouvee, on retourne l'indice de la personne
dans le tableau*/
return i;
/*si on est arriv‚ la, c'est qu'on n'a pas trouv‚ la personne*/
return -1;
}

/*Ajoute la nouvelle personne au repertoire telephonique
Si le repertoire est plein, affiche un message d'erreur pour l'indiquer
et retourne FALSE.
Parametres: pers (la personne a rajouter dans le repertoire)
retour: TRUE si la personne a ete ajoutee dans le repertoire, FALSE sinon.*/

Boolean setPersonneDansRep (Personne pers) {
if (nbPers>= MAX_REP) {
printf("impossible d'ajouter une nouvelle personne :le

repertoire est plein");
getch();
return FALSE;
} else {
repertoire[nbPers++]=pers;
return TRUE;
}
}
/* EnlŠve la personne du repertoire si elle est pr‚sente;
sinon affiche un message d'erreur pour avertir l'utilisateur.
Parametres: nom, prenom (nom et prenom de la personne qu'on veut enlever
Retour: TRUE si la personne a pu ˆtre enlev‚, FALSE sinon */

Boolean enlevePersonneDuRep (char *nom, char *prenom) {
int indice=getIndicePersonne (nom, prenom);
if (indice==-1) {
/* si (nom, prenom)n'est pas ds le repertoire*/
printf("%s %s n'est pas ds le repertoire!! \n", prenom, nom);
getch();
return FALSE;
} else {
/*sinon, on a trouve la personne a indice et il faut
decaler les cases du repertoire
for (i= indice; i<nbPers - 1; i++)
repertoire[i]=repertoire[i+1];
Cette solution est ok mais elle n'est pas la meilleur car c'est couteux
de faire des d , elle n'a de sens que si le repertoire est
ordonne.
Il est meilleur de mettre la derniŠre personne ds ce "trou".*/
repertoire[indice]= repertoire[nbPers-1];
/* -1car on va de 0 … nbPers-1*/
/*on a perdu une personne dans le repertoire*/
nbPers --;
return TRUE;
}
}

/* Saisie d'un numero de telephone
(si le premier digit du numero est z‚ro, il est enlev‚)
Retour: le numero de telephone donne ou 0 en cas de numero errone*/

static long saisieNumeroDeTelephone() {
long numTel;
printf ("Numero de tel?\n");
/* lit le 0 indiquant l'operateur preselectionne*/
scanf("%ld",&numTel);
if ((numTel <0) || (numTel> 999999999)) {
printf ("\nle numero de tel %ld parait erron‚!!\n");
getch();
numTel=0;
}
return numTel;
}

/*Saisie du nom, prenom de la personne.
Saisie aussi le numero de telephone de la personne
(si le premier digit du num‚ro est z‚ro, il est enlev‚)
si doisSaisirNumTel est vrai.
Parametres:
doisSaisirNumTel indique si le numero de telephone doit etre saisie aussi.
Retour: Les infos d'une personne. */


Personne saisiePersonne(Boolean doitSaisirNumTel) {
Personne newPers;
printf ("\nVeuillez commencer la saisie:\n\n");
printf ("Nom?\n");
saisieChaine (newPers.nom, MAX_NOM);
printf("Prenom?\n");
saisieChaine (newPers.prenom, MAX_PRENOM);
if (doitSaisirNumTel)
newPers.tel=saisieNumeroDeTelephone();
else
newPers.tel=0;

return newPers;
}


/*Retourne le numero de telephone (sur 9 chiffres normalement ie sans
le digit indiquant l'operateur telephonique) de la personne donnee.
Si la personne n'est pas dans le repertoire, retourne 0
Parametres: nom, prenom (nom et prenom de la personne recherchee)
Retour: le numero de la personne recherchee si elle est presente
dans le repertoire, 0 sinon. */

long getNumero (char *nom, char *prenom) {
int indice;
if ( (indice= getIndicePersonne(nom, prenom)) ==-1) {
printf("%s %s n'est pas dans le repertoire!!\n", prenom, nom);
getch();
return 0;
}
return repertoire[indice].tel;
}

/* Si le (nom, prenom) est dans le repertoire, demande a l'utilisateur
le nouveau numero de telephone.
Retour: FALSE si la modification n'a pas pu se faire car (nom, prenom)
n'existe pas dans le repertoire ou numero saisi errone.
TRUE sinon.
Parametres: nom,prenom (nom et prenom de la personne pour laquelle on
souhaite changer le numero de telephone) */

Boolean changeNumero (char *nom, char *prenom) {
int indicePers = getIndicePersonne (nom, prenom);
if (indicePers ==-1) {
printf("\n%s %s n'est pas dans le repertoire!!", prenom,nom);
getch();
return FALSE;
} else {
unsigned long numero = saisieNumeroDeTelephone();
if (numero!=0){
repertoire[indicePers].tel=numero;
return TRUE;
} else
return FALSE;
}
}
/* Affiche le contenu du repertoire de la liste des personnes avec
leur numero de tel (ajoute le digit indiquant l'op‚rateur telephonique
France telecom devant le numero de tel)
Si le repertoire est vide, indique que le repertoire est vide. */

void afficherRepertoire() {
int i;
/*si le repertoire est vide*/
clrscr();
if (nbPers==0) {
printf ("\n\tReperoire vide!!\n");
getch();
return;
}

printf("\n\t---------NOM-------------------PRENOM------------------

TELEPHONE\n");
/*pour chaque Personne (chaque case du repertoire)*/
for (i=0; i<nbPers; i++) {
/*imprimer le nom*/
printf ("\t|\t%-20s", repertoire[i].nom);
/*puis le prenom*/
printf ("|\t%-20s", repertoire[i].prenom);
/*et enfin le tel avant de changer de ligne*/
printf ("|\t%ld |\n", repertoire[i].tel);
}
printf("\t------------------------------------------------------------

--\t");
getch();

}
/*Sauvegarde le repertoire telephonique dans un fichier de nom .repertoire
Si ce fichier ne peut pas etre ouvert, indique un message d'erreur*/
void sauvegardeRep() {
FILE *fd;
int i;
if ((fd=fopen (".repertoire", "w"))==NULL)
fprintf(stderr, "ATTENTION: le repertoire n'a pas pu etre

sauvegard‚!\n");
else {
for(i=0; i<nbPers; i++) {
/*tabulation comme separation d'elements*/
fprintf(fd, "%s\t", repertoire[i].nom);
fprintf(fd, "%s\t", repertoire[i].prenom);
fprintf(fd, "%lu\n", repertoire[i].tel);
}
fclose (fd);
}
}

/*Recupere le repertoire sauv‚ precedement dans le fichier .repertoire
si ce fichier n'existe pas, le repertoire est initialis‚ vide*/

void recupereRep() {
FILE *fd;
printf("recupere Rep \n");
if ( (fd=fopen(".repertoire", "r"))==NULL)
fprintf(stderr, "Attention: le repertoire n'a pas pu etre

charge!\n");
else {
while((nbPers<MAX_REP)&&
(fscanf(fd, "%[^\t\n]\t%[^\n\t]\t%lu\n", &(repertoire

[nbPers].nom),
&(repertoire[nbPers].prenom), &(repertoire[nbPers].tel))

==3) )
nbPers++;
}
}
/* %[^\t\n] permet de pouvoir lire toute un chaine de caractere jusqu'a une
tabulation ou un retour chariot (des espaces peuvent etre contenus dans la

chaine)
%s lit une chaine jusqu'a un espace, retour chariot ou tab(donc un espace est

vu
comme un separateur).
Si on utilise %s, cela c'est que l'on ne pourra pas lire des noms/prenoms
contenant plusieurs mots donc des espaces. */

/*Affiche un menu permettant d'effectuer des operations sur le repertoire*/

void afficherMenu() {
printf

("\n########################################################################");
printf("\n##################### Lajili Amina & Lahyani Majdi

################");
printf("\n########################## Mini projet

#########################");
printf("\n######################## Repertoire Telephonique

#######################");
printf

("\n########################################################################");
printf

("\t\n****************************************************************\t");
printf("\t\n\n Choisissez une option:\n");
printf

("\t\n****************************************************************\t");
printf("\t\t\n\n s sort du programme\n");
printf("\t\t 1- affiche le repertoire courant\n");
printf("\t\t 2- recherche le numero de telephone \n");
printf("\t\t 3- ajoute une personne dans le repertoire\n");
printf("\t\t 4- ajoute une personne sans telephone\n");
printf("\t\t 5- enleve une personne du repertoire\n");
printf("\t\t 6- changer le numero de telephone\n");
printf

("\t\n****************************************************************\t");
printf("\t\n Votre choix:");

}
/*PROGRAMME PRINCIPAL*/
void main() {
char car;
Personne pers;
long numTel;
recupereRep();
do{
clrscr();
afficherMenu();
/*ignore tous les caracteres non alphanumeriques*/
scanf("%c",&car);
switch (car) {
case 'S':sauvegardeRep();
case '1':
afficherRepertoire(); break;
case '2':printf ("\n***********RECHERCHE DU NUMERO DE TELEPHONE

D'UNE PERSONNE**********\n");
pers=saisiePersonne(FALSE);
if((numTel=getNumero(pers.nom, pers.prenom))!=0)
printf("Le numero de telephone de %s %s est: %lu\n",
pers.prenom, pers.nom, numTel);
else
printf("%s%s n'a pas de numero enregistre!! \n",

pers.prenom, pers.nom);
getch(); break;
case '3':printf ("\n**************AJOUT D'UNE PERSONNE DANS LE

REPERTOIRE*************\n");
setPersonneDansRep(saisiePersonne(TRUE)); break;
case '4':printf ("\n********AJOUT DE PERSONNE DANS LE

REPERTOIRE SANS TELEPHONE********\n");
setPersonneDansRep(saisiePersonne(FALSE)); break;
case '5':printf ("\n******************ENLEVER UNE PERSONNE DU

REPERTOIRE***************\n");
pers=saisiePersonne(FALSE);
if(enlevePersonneDuRep(pers.nom, pers.prenom))
printf("j'ai enlev‚ %s%s du repertoire\n", pers.prenom,

pers.nom); break;
case '6':printf ("\n************CHANGER LE NUMERO DE TELEPHONE

D'UNE PERSONNE**********\n");
pers=saisiePersonne(FALSE);
if(changeNumero(pers.nom, pers.prenom))
printf("j'ai change le telephone de %s %s\n",

pers.prenom, pers.nom);
getch(); break;
default:
fprintf(stderr,"%c:commande inconnue!\n",car);

}
}while (toupper(car!='S'));
sauvegardeRep();
}
A voir également:

3 réponses

meaoui Messages postés 1 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 29 octobre 2007 1
29 oct. 2007 à 09:29
Merci pour la reponse ,
Ce code est fonctionnel sur Turbo C , que notre prof nous obligent a l'utiliser , mais le problem reside dans la partie de creation du fichier , ajouter l'enregistrement dedans , et comment extraire ses enregistrments lors du prochains apel du programme !
1
SmallFitz Messages postés 351 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 21 juin 2013 185
26 oct. 2007 à 23:56
Bonjour.
Ton code est trop longet illisible.
Pas le temps de compiler.
Tu aurais pu marquer les erreurs que ton compilo affichait !
En survolant j'ai vu que tu ne mettait pas de break; dans tes switch {}
Ensuite pourquoi mets tu
case '1':
et pas
case 1:
?
0
g fai un repertoire telephonique mai le problem c ke les gestiones ds fichiers ne veule pa fonctionner ,a chaque foi ke je ferme le programme,il ne memorise pa les contactes ke j ai ajoute!!je veu savoir le problem de fichier ke g fai!!merci de me repondre le plu to possible!!#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<graphics.h>

int Initialize()
{
int GraphDriver=DETECT;
int ErrorCode;
int GraphMode=0;
initgraph(&GraphDriver,&GraphMode,"");
ErrorCode=graphresult();
if (ErrorCode!=grOk)
{
printf("erreur syst‚me graphique:%s\n",grapherrormsg(ErrorCode));
return 1;
}
return 0;
}

typedef struct cellule{ char nom[20];
char num_tel[15];
cellule *lien;
}*CONTACT;


CONTACT creerC(char Nom[], char Tel[]) /*fonction cree un contact a partir des parametre d entrer et renvoi son pointeur)*/

{
CONTACT nouveau;
nouveau=(CONTACT)malloc(sizeof(cellule));
strcpy(nouveau->nom,Nom);
strcpy(nouveau->num_tel,Tel);
(nouveau->lien)=NULL;

return nouveau;

}

void affichecontact(CONTACT con,FILE *F) /*affiche le contact telque son reference est passer en argument*/

{
fprintf(F,"Nom du contact est %s et le Numero du contact est %s\n",con->nom,con->num_tel);
}

CONTACT rechercheC(CONTACT c, CONTACT con) /*rechercheC le contact et renvoi le pointeur de l'elet precedent si il existe sinon null*/
{
CONTACT tamp1;
CONTACT tamp2;
CONTACT p=NULL;
tamp1=c;
if(tamp1)
{ if(! strcmp(tamp1->nom,con->nom)) p=tamp1;
else
{

tamp2=(tamp1->lien);

while(tamp2)
{
if(strcmp(tamp2->nom,con->nom))
{
tamp1=tamp2;
tamp2=(tamp1->lien);


}
else
{
p=tamp1;
tamp2=NULL;
}
}


}

}
return p;
}




int ajoutC(CONTACT *car, CONTACT con) /*ajoutCer un contact au annuaire si il n'existe pas et renvoi 1 sinon renvoie o*/

{ int ok=0;
CONTACT t;
if(*car)
{ t=rechercheC(*car,con);
if(! t)
{ ok=1;
(con->lien)=(*car);
(*car)=con;
}
}
else {*car=con; ok=1;}

return ok;

}


int supprimerC(CONTACT *car, CONTACT con) /*supprimerC un contact si il existe et renvoie 1 sinon renvoie 0*/

{ int ok=0;
CONTACT t,r;
t=rechercheC(*car,con);
if (t)
{ ok=1;
if(strcmp(t->nom,con->nom))
{ r=(t->lien);

(t->lien)=(r->lien);
free(r);
}
else { *car=(t->lien); free(t);}

}


return ok;


}


void affiche_carnet(FILE *F,CONTACT car) /*affiche le carne de annuaire*/

{
CONTACT tamp=car;

while(tamp)
{
affichecontact(tamp,F);
tamp=(tamp->lien);
}

}


void restaurer(FILE *F,CONTACT *annu)
{
CONTACT abonne;
char noum[20],phone[15];

while(! feof(F))
{
fscanf(F,"Nom du contact est %s et le Numero du contact est %s\n",noum,phone);
abonne=creerC(noum,phone);
if(ajoutC(annu,abonne)) puts("elements ajouter");
else puts("element existe deja");

}

}


void main()

{ int x,k;
char noum[20];
char phone[15];
CONTACT annuaire=NULL;
CONTACT abonne;
char choix='o';
FILE *fic;
if (Initialize())
{
printf("impossible de passer au mode graphique");
getche();
}
else
{
flushall();

setcolor(1);
setbkcolor(8);
settextstyle(4,0,4);
outtextxy(70,175,"REPERTOIRE TELEPHONIQUE ");
outtextxy(70,200," VOICI LE MENU ");
getche();
clrscr();
while (choix!='Q')
{
flushall();
setcolor(1);
setbkcolor(8);
settextstyle(1,0,2);
outtextxy(75,150,"******************** menu **************************");
outtextxy(80,170,"A- Ajouter de contact");
outtextxy(85,190,"S- Supprimer contact");
outtextxy(90,210,"a- Affiche annuaire");
outtextxy(95,230,"s- Sauvegarder");
outtextxy(100,250,"R- restaurer");
outtextxy(105,270,"Q- Quitter");
getche();
clrscr();

choix=getchar();





switch(choix)
{
case 'A': puts("donner le nombre de contact a ajouter entre 1 et 100");
scanf("%i",&x);

puts("************************ajout des contact********************************");


for(k=0;k<x;k++)
{
printf("\n donner le nom et le telephone de contact %i",k+1);
scanf("%s %s",noum,phone);
abonne=creerC(noum,phone);

if(ajoutC(&annuaire,abonne)) puts("elts ajoutCer");
else puts("elet existe deja");
}

break;


case 'S': printf("\n donner le nom et le telephone de contact a supprimer");
scanf("%s %s",noum,phone);
abonne=creerC(noum,phone);
if(supprimerC(&annuaire,abonne)) puts("suppression reussie");
else puts("elements non existant");

break;
case 'a': affiche_carnet(stdout,annuaire); break;
case 's': fic=fopen("c:\\annuaire.txt","w");
affiche_carnet(fic,annuaire); fclose(fic); break;
case 'R': fic=fopen("c:\\annuaire.txt","r");
restaurer(fic,&annuaire); fclose(fic); break;
}
}

puts("fin du programme");
getch();
}






}
0