Verification si il'ya une faute dans cette program
chdoula22
Messages postés
2
Statut
Membre
-
null -
null -
Bonjour,
je veux savoir s'il ya des fautes dans ce program car j'arrive pas a faire l'exécution correctement ( surtt dans l'enregistrement des contacts dans un fichier )
merci d'avance
mon code :
je veux savoir s'il ya des fautes dans ce program car j'arrive pas a faire l'exécution correctement ( surtt dans l'enregistrement des contacts dans un fichier )
merci d'avance
mon code :
/*************************
*Répértoire téléphonique*
*************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Les structures utilisées dans ce program */
typedef struct
{ char nom[20];
char prenom[20];
char cin[8];
} abonne;
typedef struct
{ int num;
char rue [25];
char ville [20];
char code[4];
} adresse;
typedef struct
{
int numtel;
abonne abonne;
adresse adresse;
}contact ;
int taille ;
/* Prototype des fonctions utilisées dans ce program */
int rechercher (contact* tabcontact);
void ajout_contact(contact* tabcontact);
void modifie_contact(contact* tabcontact,int pos);
void supprime_contact(contact* tabcontact,int pos);
void affiche_tableau(contact*tabcontact1);
void affiche_contact(contact* tabcontact,int pos);
void quitter(contact* tabcontact);
/* Program principal */
int main()
{
int a ;
char x ;
contact tabcontact [50];
do{
printf("\t******************************************************************\n");
printf("\t\t\t Menu Principal \n");
printf("\t******************************************************************\n");
printf("\t 1 pour ajouter un nouveau contact \n");
printf("\t 2 pour afficher un contact \n");
printf("\t 3 pour modifier les information d'un contact \n");
printf("\t 4 pour supprimer un contact \n");
printf("\t 5 pour quitter \n");
printf("\t******************************************************************\n");
printf("\t\n");
printf(" \t Veuillez entrer votre choix\n\n") ;
fflush(stdin);
x=getchar();
switch (x)
{
case '1' : {ajout_contact (tabcontact ),affiche_tableau(tabcontact);} break ;
case '2' :{ a = rechercher (tabcontact);
affiche_contact (tabcontact, a);break;};
case '3' : { a = rechercher (tabcontact);
modifie_contact (tabcontact, a) ; break;} ;
case '4' : { a = rechercher (tabcontact);
supprime_contact (tabcontact, a) ; break;} ;
case '5' : {quitter(tabcontact);break;}
default : printf("choix inconnue");
}
}while (x=='1' || x=='2'|| x=='3'||x=='4' );
return 0;
}
/* Fonction permettant de quitter le program*/
void quitter(contact* tabcontact)
{int i;
FILE* fichier =fopen("contact.txt","ab");
for (i=0 ; i< taille;i++)
{
fwrite(&tabcontact[i],sizeof(contact),1,fichier);
}
fclose(fichier);
}
/* Fonction permettant d'ouvrir un fichier enregistré*/
void init(contact* tabcontact)
{ FILE*fichier;
contact clt ;
fichier=fopen("contact.txt","rb");
if (fichier!=NULL)
{
while (!feof(fichier))
{
fread(&clt,sizeof(contact),1,fichier);
tabcontact[taille]=clt;
taille++;
}
} else printf("le fichier n'existe pas");
}
/* Fonction permettant d'afficher un contact*/
void affiche_contact(contact* tabcontact,int pos)
{
printf("\t\n");
printf( "\tle nom du contact \t %s \n ",tabcontact[pos].abonne.nom);
printf( "\tle prenom du contact \t %s\n ",tabcontact[pos].abonne.prenom);
printf( "\tle cin du contact \t %s\n ",tabcontact[pos].abonne.cin);
printf( "\tle rue du contact est \t %s\n ",tabcontact[pos].adresse.rue);
printf( "\tla ville du contact est \t %s\n ",tabcontact[pos].adresse.ville);
printf( "\tle code postale du contact est \t %s\n ",tabcontact[pos].adresse.code);
printf( "\tle numero de la maison est \t %d\n ",tabcontact[pos].adresse.num);
printf( "\tle numéro téléphonique du contact est\t %d\n ",tabcontact[pos].numtel);
printf("\t\n");
}
/* Fonction permettant d'afficher le tableau de contact */
void affiche_tableau(contact* tabcontact)
{
int i ;
for (i=0;i< taille;i++)
affiche_contact(tabcontact,i);
}
/* Fonction permettant de rechercher un contact et de rendre son indice de tableau */
int rechercher (contact* tabcontact)
{
char y;
int i;
int num;
char nomm[25];
char prenomm[25];
char cinn[25];
printf( " \t tapez 1 pour lancer une recherche par numéro \t \n ");
printf( "\t tapez 2 pour lancer une recherche par abonnée \t\n");
fflush(stdin);
y=getchar();
switch(y)
{ case '1' : {printf("donner le numéro \t");
scanf("%d",&num);
for (i=0;i<taille+1;i++)
if (tabcontact[i].numtel == num)
return i;
else
return -1;
break;
}
case '2' :
{
printf("\tdonner le nom du contact\t");
scanf("%s",nomm);
printf("\tdonner le prénom du contact\t");
scanf("%s",prenomm);
printf("\tdonner le numero de cin du contact\t\n\n");
scanf("%s",cinn);
for (i=0;i<taille+1;i++)
{
if ((strcmp(tabcontact[i].abonne.nom , nomm)==0) && (strcmp(tabcontact[i].abonne.prenom , prenomm)==0)&& (strcmp(tabcontact[i].abonne.cin , cinn)==0))
return i;
else
return -1 ;
}
break;
}
}
return -1;
}
/* Fonction permettant d'ajouter un nouveau contact*/
void ajout_contact(contact* tabcontact)
{ do
{ printf( "\tintroduire le nom \t ") ;
scanf("%s",tabcontact[taille].abonne.nom) ;
printf( "\tintroduire le prenom \t") ;
scanf("%s",tabcontact[taille].abonne.prenom) ;
printf( "\tintroduire le num de cin \t") ;
scanf("%s",tabcontact[taille].abonne.cin);
printf( "\tintroduire la rue \t ") ;
scanf("%s",tabcontact[taille].adresse.rue);
printf( "\tintroduire la ville \t ");
scanf("%s",tabcontact[taille].adresse.ville);
printf( "\tintroduire le numero de la maison\t ") ;
scanf("%d",&tabcontact[taille].adresse.num);
printf( "\tintroduire le code postal \t ");
scanf("%s",tabcontact[taille].adresse.code);
printf( "\tintroduire le numero de telephone \t ") ;
scanf("%d",&tabcontact[taille].numtel);
taille ++;
} while (printf("\n \tvoulez vous ajouter un autre contact O/N \t"),fflush(stdin),getchar()=='O');
}
/* Fonction permettant de modifier un contact enregistré*/
void modifie_contact(contact* tabcontact,int pos)
{ printf( "\tintroduire le nouveau nom\n ") ;
scanf("%s",tabcontact[pos].abonne.nom) ;
printf( "\tintroduire le nouveau prenom\n ") ;
scanf("%s",tabcontact[pos].abonne.prenom) ;
printf( "\tintroduire le nouveau num de cin\n ") ;
scanf("%s",tabcontact[pos].abonne.cin);
printf( "\tintroduire la nouvelle rue\n ") ;
scanf("%s",tabcontact[pos].adresse.rue);
printf( "\tintroduire la nouvelle ville\n ");
scanf("%s",tabcontact[pos].adresse.ville);
printf( "\tintroduire le nouveau code postal \n");
scanf("%s",tabcontact[pos].adresse.code);
printf( "\tintroduire le nouveau numero du maison \n\n") ;
scanf("%d",&tabcontact[pos].adresse.num);
printf( "\tintroduire le nouveau numero de téléphone \n\n") ;
scanf("%d",&tabcontact[pos].numtel);
}
/* Fonction permettant de supprimer un contact */
void supprime_contact(contact* tabcontact,int pos)
{
int i;
for (i=pos ; i< taille-1 ;i++ )
{
tabcontact[i]= tabcontact[i+1];
taille-- ;
}
}
A voir également:
- Verification si il'ya une faute dans cette program
- Verification lien internet - Guide
- Verification windows 11 - Guide
- Device harddiskvolume3 program files bonjour mdnsnsp.dll - Forum Virus
- Invalid configuration information please run setup program ✓ - Forum Windows XP
- Program files - Forum Jeux vidéo
2 réponses
Bonjour,
compile ton programme, tu verras bien si ça marche, le debugger te trouvera les éventuelles fautes. Il sert à ça.
Cordialement.
compile ton programme, tu verras bien si ça marche, le debugger te trouvera les éventuelles fautes. Il sert à ça.
Cordialement.
Salut chdoula22,
Quelques indications générales, parce que ton code est trop long.
Tu devrais créer le fichier en mode texte, et non binaire, et y stocker des chaînes de caractères seulement, même pour les données ayant des types numériques.
Si tu tiens à utiliser des types numériques, il te faudra les sérialiser, par exemple, comme cela : http://troydhanson.github.io/tpl/index.html mais ce n'est vraiment pas nécessaire dans ton projet, à mon sens.
Tes %s dans tes scanf ne vont prendre qu'un mot, alors si à "rue", je tape "rue de la Liberté", tu n'auras que "rue", et "de", ira à "ville", etc. Utilise fgets avec stdin avec l'indication du nombre maximal de caractères à prendre en compte, ou un spécificateur de taille au %s dans ton scanf (par exemple
Tu devrais retirer tes fflush(stdin), ce n'est pas du C standard et ce n'est pas portable.
Pour vider le flux stdin après un scanf, tu fais comme cela :
http://c-faq.com/stdio/stdinflush2.html
Dal
Quelques indications générales, parce que ton code est trop long.
Tu devrais créer le fichier en mode texte, et non binaire, et y stocker des chaînes de caractères seulement, même pour les données ayant des types numériques.
Si tu tiens à utiliser des types numériques, il te faudra les sérialiser, par exemple, comme cela : http://troydhanson.github.io/tpl/index.html mais ce n'est vraiment pas nécessaire dans ton projet, à mon sens.
Tes %s dans tes scanf ne vont prendre qu'un mot, alors si à "rue", je tape "rue de la Liberté", tu n'auras que "rue", et "de", ira à "ville", etc. Utilise fgets avec stdin avec l'indication du nombre maximal de caractères à prendre en compte, ou un spécificateur de taille au %s dans ton scanf (par exemple
scanf("%24s", tabcontact[taille].adresse.rue);).
Tu devrais retirer tes fflush(stdin), ce n'est pas du C standard et ce n'est pas portable.
Pour vider le flux stdin après un scanf, tu fais comme cela :
while((c = getchar()) != '\n' && c != EOF) /* discard */ ;
http://c-faq.com/stdio/stdinflush2.html
Dal
Oui, au temps pour moi, je l'utilise rarement (au profit de fgets). Il faut donc encore compliquer l'expression de la façon suivante :
Dal
scanf("%24[^\n]",tabcontact[taille].adresse.rue); pour que scanf prenne tous les caractères jusqu'au '\n', à l'exclusion de ce caractère, et dans la limite de 24 caractères.
Dal