[langage C] projet rep.telephonique, help!!!!

Résolu/Fermé
krimo_luv Messages postés 1 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 17 mai 2007 - 11 mai 2007 à 11:09
 meriem - 27 juin 2007 à 02:00
bonjour a tout le monde,

j ai un projet de programmation a faire pour le 22 mai. Il consiste a programmé un repertoire telephonique ou je peux:
-entrer le nom, prénom et numero d une personne
-le retiré si je le souhaite
-et aussi affiché tout le repertoire dans l'ordre alphabetique

je suis en galere car je sui en DUT Réseau&Telecom e on a jamais fait de programmation
si vous pouviez mdonné le code complet sa seré sympatik de votre par

merci beaucoup pour votre aide
A voir également:

6 réponses

//Programme de gestion d'un repertoire telephonique

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

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

typedef struct{
char prenom[MAX_PRENOM];
char nom[MAX_NOM];
unsigned 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 clavier jusqu'au caractere
retour chariot exclu.
Au maximum (taille-1) caracteres sont mis dans le tableau tab. Le caractere
null est ajoute a la fin pour en faire une chaine.
Parametres : tab un tableau de 'taille' elements qui sera rempli avec les
caracteres saisis, taille le nombre d'elements max du tableau tab
*/
void saisieChaine(char tab[], int taille) {
char car;
int i = 0;

//permet d'ignorer tous les caracteres non alphanumeriques
while( !isalpha(car=getchar()));

do {
//permet de placer le caractere dans le tableau
tab[i++] = car;
// permet de continuer jusqu'a la fin du tableau ou caractere fin de ligne
} while ( (i<taille-1)&&( (car=getchar()) != '\n'));

// et on 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 saisieChaine.

while (getchar() != '\n')
;
}
}


// permet de Rechercher 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++)
//permet de comparer 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;
//arrivé à ce stade celà veut dire que la personne demander ne se trouve pas dans le repertoire
return -1;
}


//Ajoute la nouvelle personne au repertoire telephonique
//Si le repertoire est plein, un message d'erreur est affiché pour l'indiquer et retourne FALSE.
// Parametre : 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");
return FALSE;
} else {
repertoire[nbPers++] = pers;
return TRUE;
}
}


//Enlève la personne donnée du répertoire si elle s'y trouve
//sinon affiche un message d'erreur pour avertir l'utilisateur.
//Parametres : nom, prenom (nom et prenom de la personne à enlever)
//Retour : TRUE si la personne a pu être enlevée, FALSE sinon


Boolean enlevePersonneDuRep(char * nom, char * prenom) {
int indice = getIndicePersonne(nom, prenom);

if (indice == -1) { // si (nom, prenom) n'existent pas dans le repertoire */
printf("%s %s n'existe pas dans le repertoire !\n", prenom, nom);
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 correctre mais elle n'est pas optimale car il est couteux de faire des decalages et elle
//n'a de sens que si le repertoire est ordonné.
//le meilleurs à faire c'est de placer la derniere personne dans ce "trou".

repertoire[indice] = repertoire[nbPers-1]; //-1 car on va de 0 a nbPers-1

// on a perdu une personne dans le Repertoire
nbPers --;

return TRUE;
}
}

//Saisie d'un numero de telephone
//si le premier digit du numéro est zéro, il est enlevé)
//Retour : le numero de telephone donné ou un "0" en cas de numero errone

static unsigned long saisieNumeroDeTelephone() {
int numeroOperateur;
unsigned long numTel;

printf("Numero de tel ? ");
//lit le 0 indiquant l'operateur preselectionné
numeroOperateur = getchar();

if (numeroOperateur != '0') {
if (('1' <= numeroOperateur) && (numeroOperateur <= '9'))
// permet de remettre le caractere dans stdin
ungetc(numeroOperateur, stdin);
}

scanf("%lu", &(numTel));
if ((numTel < 10000000) || (numTel > 99999999)) {
printf("Le numero %lu parait errone.\n", numTel);
numTel = 0;
}
return numTel;
}


//permet la Saisie du nom, prenom de la personne.
// aussi la saisie du numero de telephone de la personne
//(si le premier digit du numéro est zéro, il est enlevé)
//si doisSaisirNumTel est VRAI.
//Parametre :
// doisSaisirNumTel indique si le numero de telephone
// doit etre saisie aussi
//Retour : les infos d'une personne

Personne saisiePersonne(Boolean doitSaisirNumTel) {
Personne newPers;

printf("Nom ? ");
saisieChaine(newPers.nom, MAX_NOM);
printf("Prenom ? ");
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 presente dans le repertoire,
//0 sinon.

unsigned 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);
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)
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("%s %s n'est pas dans le repertoire",prenom, nom);
return FALSE;
} else {
unsigned long numero = saisieNumeroDeTelephone();
if (numero != 0) {
repertoire[indicePers].tel = numero;
return TRUE;
} else
return FALSE;
}
}

//Affiche le contenu du repertoire ie la liste des personnes avec leur numero de telephone
//(ajoute le digit indiquant l'operateur telephonique France Telecom devant le numero de
//telephone).
//Si le repertoire est vide, indique que le repertoire est vide.

void afficherRepertoire() {
int i;

// si le repertoire est vide ....
if(nbPers == 0) {
printf("\n\tRepertoire vide !!\n");
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| %-20s\t",repertoire[i].nom);
//puis le prenom
printf("| %-20s\t",repertoire[i].prenom);
// et enfin le tel avant de changer de ligne
printf("| 0%lu |\n", repertoire[i].tel);
}
printf("\t------------------------------------------------------------------\n");
}

//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 sauvegarder !\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 sauve precedemment dans le fichier .repertoire
// Si ce fichier n'existe pas, le repertoire est initialise 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 une 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 tabulation
// (donc un espace est vu comme un separateur). Si on utilise %s, cela signifie
// que l'on ne pourra pas lire des noms/prenoms contenant plusieurs mots et
// donc des espaces.

}
}


//Afficher un menu qui permetera à l'utilisateur de manipuler le repertoire

void afficherMenu() {

printf("\t++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("\tChoisissez une option:\n");
printf("\t++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("\t\t 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");
printf("\t Votre choix : ");
}


//programme principal

void main() {
char car;
Personne pers;
unsigned long numTel;

recupereRep();
do {

afficherMenu();

//ignore tous les caracteres non alphanumeriques
while(!isalnum(car=getchar()));

switch (car) {
case 's': sauvegardeRep(); break;
case '1': afficherRepertoire(); break;
case '2':
pers = saisiePersonne(FALSE);
if((numTel = getNumero(pers.nom, pers.prenom))!=0)
printf("Le numero de telephone de %s %s est: 0%lu\n",
pers.prenom, pers.nom, numTel);
else
printf("%s %s n'a pas de numero enregistre\n",pers.prenom, pers.nom);
break;
case '3': setPersonneDansRep(saisiePersonne(1)); break;
case '4': setPersonneDansRep(saisiePersonne(0)); break;
case '5':
pers = saisiePersonne(FALSE);
if(enlevePersonneDuRep(pers.nom, pers.prenom))
printf("%s %s est enlevé(e) du repertoire\n", pers.prenom, pers.nom);
break;
case '6':
pers = saisiePersonne(FALSE);
if(changeNumero(pers.nom, pers.prenom))
printf("le telephone de %s %s est changé\n", pers.prenom, pers.nom);
break;
default:
fprintf(stderr,"%c: commande inconnue !\n",car);
}
} while (car != 's');

sauvegardeRep();
}
6
krimo_luv Messages postés 1 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 17 mai 2007
14 mai 2007 à 12:28
bonjour

donc voila j ai essayé et voila ce que ca me donne:


dite moi qu'est ce qui faut changer et aussi dite moi ce qu'il faut ajouter pour supprimer un contact ou bien le modifier...MERCI

--------------------------------------------------------------------------------------------


#include <stdio.h>

/* Définition du type de string */
typedef char string[20];

/* Definition du type fiche (ligne) de l'agenda */
typedef struct {
string prenom;
string nom;
string tel; } fiche; // une fiche pèse donc 60 caractères

/* Définition (récursive) du type onglet (liste de cellules) */
typedef struct cellule * onglet;
typedef struct cellule {
fiche * ligne;
onglet suite; } cellule;

/* Définition du type agenda */
typedef onglet agenda[26];

fiche*get_fiche(){
fiche*p=(fiche*)malloc(sizeof(fiche));
int r = scanf("%s %s %s", p->prenom, p->nom, p->tel);
if(r==EOF) { //CTRL-D
free(p);
return(NULL);
}
else return(p);
}

void put_fiche(fiche*f){
printf("%s %s %s", f->prenom, f->nom, f->tel);}
void put_onglet(onglet l){
if(l != NULL){
put_fiche(l->ligne);
put_onglet(l->suite);}
}

void put_agenda(agenda a){
int i;
for(i=0; i<26; i++){
printf("==== %c ====", i+'A');
put_onglet(a[i]);
}
}

int main () {
fiche*get_fiche();
put_onglet(onglet l);
put_agenda(agenda a);
}
1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
15 mai 2007 à 08:42
C'est pas mal.
Mais pour faire un peu plus "objet" tu pourrai utilisé la struc un peu mieux. et plutôt que de définir ton propre type string, utilise string.h
struct fiche{
string prenom;
string nom;
string tel; 
fiche(){};
fiche(string a,string b,string c):prenom(a),nom(b),tel(c){};
string getprenom()const{return prenom;}
string gettel()const {return tel;};
etc.};

la liste chainé c'est bien, mais l'inconvéniant c'est que c'est dure d'effectuer des opérations de trie.
Ensuite tes fonctions put sont etrange. Je ne ferai pas comme ça, mais il est possible que ça fonctionne.
1
Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
11 mai 2007 à 11:12
si vous pouviez mdonné le code complet sa seré sympatik de votre par 
Haha pas mal celle-là
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimo_luv Messages postés 1 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 17 mai 2007
11 mai 2007 à 11:13
je t asssure je plaisante pa
je c rien faire en prog
tu pe pa m aidé?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
11 mai 2007 à 11:33
Bonjour,
Bien sur on peut t'aider. De là à le faire À TA PLACE, il faut pas révé.
Les grandes étapes :
définir une structure personne contenant toutes les informations dont tu as besoin. Définir les méthoide d'acces de modification de création.
Puis faire un conteneur permettant de mettre toute les personnes et éventuellement de les trié.
En C++ c'est facile la STL contient de tel objets. En C c'est plus compliquer, il faut créer toi même.
0