IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

crée agenda telephonique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par défaut crée agenda telephonique
    je ss vouveau est je veut develloper mes connaissance en C voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    //Bibliothèques à inclure
        #include <stdio.h> //pour printf(),scanf(),gets(),fflush()
        #include <stdlib.h> //utilisé pour malloc() et free()
        #include <conio.h> //utilisé pour clrscr(), textcolor() et getch()
     
     
        //Constantes
        #define TAILLE_PRENOM 30
        #define NB_CONTACT_MAX 30
     
        //Structure
        typedef struct p_maillon maillon;
        struct p_maillon {
        char prenom[TAILLE_PRENOM];
        char tel[15];
        maillon *suivant; //pointeur sur le maillon suivant
        };
     
        //Prototypes des fonctions
        maillon* InsereNom(maillon *precedent); //Insere un nouveau contact à l'agenda
        maillon* InsereTete(void); //Insere le premier contact
        void Affiche(maillon* tete,int cmpt); //Affiche tout votre agenda
         void main(void)
         {
         maillon *liste[NB_CONTACT_MAX]; //Tableau de pointeur sur les différents maillons
         char choix, quitter; //Caractère utilisé dans le menu
         int C_contact=0,i; //C_contact est le compteur de contact cad qu'il indique le nbre de personne enregistre dans la liste
     
     
         do
         {
         do
         {
     
         fflush(stdin); //On vide le tampon du clavier
         printf("\t - AGENDA TELEPHONIQUE -\n\n\n");
         printf(" Que voulez faire :\n\n");
         printf(" 1-Ajouter un nouveau contact à lagenda.\n");
         printf(" 2-Afficher les contacts de lagenda.\n");
         printf(" 3-Quitter l'agenda telephonique.\n");
         printf("\tVotre choix : \n");
         scanf("%c",&choix);
         }
         while(choix!='1' && choix!='2' && choix!='3'); //on ne sort pas de la boucle tant que le choix n'est pas valide
     
         //Selon le choix de l'utilisateur
         switch(choix)
         {
         case '1' : if(C_contact==0) //Si c'est le premier contact a etre inserer
         {
         liste[0]=InsereTete(); //on utilise la fonction InsereTete()
         C_contact++; //on incremente le nb de contact
         }
         else
         {
         liste[C_contact]=InsereNom(liste[C_contact-1]); //On utilise la fonction InsereNom
         C_contact++; //on incrément le nb de contacts
         }
         break;
     
         case '2' : Affiche(liste[0],C_contact); //AFFICHAGE COMPLET DE L'AGENDA
         break;
     
         case '3' : quitter=1; //on met la variable quitter à 1 pour sortir de la grande boucle
         break;
     
         default : quitter=0; //on met la variable quitter à 0 pour eviter de sortir de la boucle
         break;
         }
         } while(quitter!=1);
     
     
         printf("\n\n Au revoir!!!!!!!");
         if(C_contact!=0) //On libère seulement la memoire que lon a alloué
         for(i=0;liste[i]->suivant!=NULL;i++)
         free(liste[i]);
         getch();
     
         }
         // AJOUTE UN NOUVEAU CONTACT DANS L'AGENDA
        maillon* InsereNom(maillon *precedent)
         {
         //Variables locales
         char prenom[TAILLE_PRENOM];
         char tel[15];
         maillon *p; //pointeur sur maillon qui sera renvoyé par la fonction
     
     
         printf("\t - AJOUT DUN CONTACT A LAGENDA-\n\n");
         p=(maillon *)malloc(sizeof(maillon)); //on alloue un espace memoire à p de la taille d'un maillon
         if(p!= NULL) //si p est different de NULL donc si la memoire a pu etre allouée
         {
         fflush(stdin);
         printf("Entrer le nom :\n ");
         gets(p->prenom); //on demande le prenom et on le stock dans le champ prenom du maillon p
         printf("Entrer le numero de telephone :\n ");
         gets(p->tel); //on demande le numero de telephone et on le stock dans le champ tel du maillon p
         p->suivant=NULL; //Le maillon suivant n'existe pas encore donc on met l'addresse NULL dans le champ *suivant du maillon p
         precedent->suivant=p; //On met l'addresse de p dans le champ *suivant du maillon precedent mis en paramètre
         }
         return p; //et on retourne le pointeur sur maillon p
         }
     
     
     
         // CREE LE PREMIER CONTACT DE l'AGENDA
         maillon* InsereTete(void)
         {
         maillon *p; //pointeur sur maillon qui sera renvoyé par la fonction
         char prenom[TAILLE_PRENOM];
         char tel[15];
     
     
         fflush(stdin); //on vide le tampon du clavier au cas ou
         printf("\t - AJOUT DUN CONTACT A LAGENDA-\n\n");
         p=(maillon*)malloc(sizeof(maillon)); //on alloue un espace memoire a p de la taille d'un maillon
         if(p!=NULL)
         {
         printf("Entrer le nom du nouveau contact :\n ");
         gets(p->prenom);
         printf("Son numero de telephone :\n ");
         gets(p->tel);
         p->suivant=NULL;
         }
         return p; //on retourne le pointeur
         }
     
     
     
         // AFFICHE LE CONTENU DE L'AGENDA
        void Affiche(maillon* tete,int cmpt) //*tete correspond à l'adresse du premier maillon et cmpt au nombre de contact dans l'agenda
        {
         maillon* temp; //pointeur temporaire pour naviguer entre les differents maillons
         int i;
     
     
         printf("\t - AFFICHAGE D UN CONTACT -\n\n");
         printf("Voici tous vos contact : \n\n");
         if(cmpt==0) printf("Il n'y a aucun contact de sauvegarder dans l'agenda");
         else
         {
         temp=tete; //le pointeur temp pointe le meme maillon que tete
         while(i!=0)
         {
         if(temp->suivant==NULL) //si le maillon d'apres n'existe pas
         {
         printf("%s\t",temp->prenom); //on affiche quand meme les different champ du maillon
         printf("%s\n",temp->tel);
         i=0; //on affecte 0 à i pour sortir de la boucle
         }
        else
         {
         printf("%s\t",temp->prenom);
         printf("%s\n",temp->tel);
         temp=temp->suivant; //temp prend l'adresse du maillon suivant
         }
         }
         }
         getch(); //pour avoir le temps de voir s'afficher lagenda
         }


    question :je veut ajouté des fonction comme clrsc() pour effacer l'ecran ms marche pas avec visuel c++est le mode graphic càd graphics.h

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Ucom-C++
    je ss vouveau est je veut develloper mes connaissance en C voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    //Bibliothèques à inclure
        #include <stdio.h> //pour printf(),scanf(),gets(),fflush()
        #include <stdlib.h> //utilisé pour malloc() et free()
        #include <conio.h> //utilisé pour clrscr(), textcolor() et getch()
     
     
        //Constantes
        #define TAILLE_PRENOM 30
        #define NB_CONTACT_MAX 30
     
        //Structure
        typedef struct p_maillon maillon;
        struct p_maillon {
        char prenom[TAILLE_PRENOM];
        char tel[15];
        maillon *suivant; //pointeur sur le maillon suivant
        };
     
        //Prototypes des fonctions
        maillon* InsereNom(maillon *precedent); //Insere un nouveau contact à l'agenda
        maillon* InsereTete(void); //Insere le premier contact
        void Affiche(maillon* tete,int cmpt); //Affiche tout votre agenda
         void main(void)
         {
         maillon *liste[NB_CONTACT_MAX]; //Tableau de pointeur sur les différents maillons
         char choix, quitter; //Caractère utilisé dans le menu
         int C_contact=0,i; //C_contact est le compteur de contact cad qu'il indique le nbre de personne enregistre dans la liste
     
     
         do
         {
         do
         {
     
         fflush(stdin); //On vide le tampon du clavier
         printf("\t - AGENDA TELEPHONIQUE -\n\n\n");
         printf(" Que voulez faire :\n\n");
         printf(" 1-Ajouter un nouveau contact à lagenda.\n");
         printf(" 2-Afficher les contacts de lagenda.\n");
         printf(" 3-Quitter l'agenda telephonique.\n");
         printf("\tVotre choix : \n");
         scanf("%c",&choix);
         }
         while(choix!='1' && choix!='2' && choix!='3'); //on ne sort pas de la boucle tant que le choix n'est pas valide
     
         //Selon le choix de l'utilisateur
         switch(choix)
         {
         case '1' : if(C_contact==0) //Si c'est le premier contact a etre inserer
         {
         liste[0]=InsereTete(); //on utilise la fonction InsereTete()
         C_contact++; //on incremente le nb de contact
         }
         else
         {
         liste[C_contact]=InsereNom(liste[C_contact-1]); //On utilise la fonction InsereNom
         C_contact++; //on incrément le nb de contacts
         }
         break;
     
         case '2' : Affiche(liste[0],C_contact); //AFFICHAGE COMPLET DE L'AGENDA
         break;
     
         case '3' : quitter=1; //on met la variable quitter à 1 pour sortir de la grande boucle
         break;
     
         default : quitter=0; //on met la variable quitter à 0 pour eviter de sortir de la boucle
         break;
         }
         } while(quitter!=1);
     
     
         printf("\n\n Au revoir!!!!!!!");
         if(C_contact!=0) //On libère seulement la memoire que lon a alloué
         for(i=0;liste[i]->suivant!=NULL;i++)
         free(liste[i]);
         getch();
     
         }
         // AJOUTE UN NOUVEAU CONTACT DANS L'AGENDA
        maillon* InsereNom(maillon *precedent)
         {
         //Variables locales
         char prenom[TAILLE_PRENOM];
         char tel[15];
         maillon *p; //pointeur sur maillon qui sera renvoyé par la fonction
     
     
         printf("\t - AJOUT DUN CONTACT A LAGENDA-\n\n");
         p=(maillon *)malloc(sizeof(maillon)); //on alloue un espace memoire à p de la taille d'un maillon
         if(p!= NULL) //si p est different de NULL donc si la memoire a pu etre allouée
         {
         fflush(stdin);
         printf("Entrer le nom :\n ");
         gets(p->prenom); //on demande le prenom et on le stock dans le champ prenom du maillon p
         printf("Entrer le numero de telephone :\n ");
         gets(p->tel); //on demande le numero de telephone et on le stock dans le champ tel du maillon p
         p->suivant=NULL; //Le maillon suivant n'existe pas encore donc on met l'addresse NULL dans le champ *suivant du maillon p
         precedent->suivant=p; //On met l'addresse de p dans le champ *suivant du maillon precedent mis en paramètre
         }
         return p; //et on retourne le pointeur sur maillon p
         }
     
     
     
         // CREE LE PREMIER CONTACT DE l'AGENDA
         maillon* InsereTete(void)
         {
         maillon *p; //pointeur sur maillon qui sera renvoyé par la fonction
         char prenom[TAILLE_PRENOM];
         char tel[15];
     
     
         fflush(stdin); //on vide le tampon du clavier au cas ou
         printf("\t - AJOUT DUN CONTACT A LAGENDA-\n\n");
         p=(maillon*)malloc(sizeof(maillon)); //on alloue un espace memoire a p de la taille d'un maillon
         if(p!=NULL)
         {
         printf("Entrer le nom du nouveau contact :\n ");
         gets(p->prenom);
         printf("Son numero de telephone :\n ");
         gets(p->tel);
         p->suivant=NULL;
         }
         return p; //on retourne le pointeur
         }
     
     
     
         // AFFICHE LE CONTENU DE L'AGENDA
        void Affiche(maillon* tete,int cmpt) //*tete correspond à l'adresse du premier maillon et cmpt au nombre de contact dans l'agenda
        {
         maillon* temp; //pointeur temporaire pour naviguer entre les differents maillons
         int i;
     
     
         printf("\t - AFFICHAGE D UN CONTACT -\n\n");
         printf("Voici tous vos contact : \n\n");
         if(cmpt==0) printf("Il n'y a aucun contact de sauvegarder dans l'agenda");
         else
         {
         temp=tete; //le pointeur temp pointe le meme maillon que tete
         while(i!=0)
         {
         if(temp->suivant==NULL) //si le maillon d'apres n'existe pas
         {
         printf("%s\t",temp->prenom); //on affiche quand meme les different champ du maillon
         printf("%s\n",temp->tel);
         i=0; //on affecte 0 à i pour sortir de la boucle
         }
        else
         {
         printf("%s\t",temp->prenom);
         printf("%s\n",temp->tel);
         temp=temp->suivant; //temp prend l'adresse du maillon suivant
         }
         }
         }
         getch(); //pour avoir le temps de voir s'afficher lagenda
         }


    question :je veut ajouté des fonction comme clrsc() pour effacer l'ecran ms marche pas avec visuel c++est le mode graphic càd graphics.h
    Salut et bienvenue sur le forum C de developpez,

    Pour commencer, je crois que ton code serait plus lisible si tu prenais la peine de l'indenter correctement. Tel quel, il ne donne pas envie de lire autrement qu'en diagonale, et j'ai noté les choses suivantes:

    1) Tout d'abord, le nom que tu as choisi pour ta structure struct p_maillon me derrange un peu. En effet, beaucoup de programmeurs utilisent comme convention de préfixer par p_ les noms de variables de type pointeur. Cela peut porter à confusion...

    2) void main(): cette forme n'est pas autorisée par la norme du langage qui spécifie que main() doit retourner un entier de type int. TOUJOURS! Par conséquent, le type de retour doit être int. Par convention, main() retourn 0 ou EXIT_SUCCESS (déclarée dans stdlib.h) en cas d'execution correcte et EXIT_FAILURE dans le cas contraire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
        /* ton code */
        return 0;
    }
    scanf("%c", &choix) te permet bien de saisir un caractère. Toutefois, tu risques d'avoir des soucis si l'utilisateur maladroit entre par erreur un espace avant sa saisie. scanf(" %c", &choix) (notez l'espace avant %c) résoud ce problème. Pour apprendre à utiliser scanf() correctement, je recommande: http://xrenault.developpez.com/tutoriels/c/scanf/. Personnellement, je n'utilise pas scanf() pour la raison expliquée dans la FAQ C, et préfère fgets() couplée à sscanf() ou strtol()/strtod().
    Toutefois, comme tu l'as noté, il restera des caractères dans le tampon du flux d'entrée standard. Il faut donc vider ce tampon et fflush(stdin) n'est pas la bonne façon de faire, et la FAQ C te dit pourquoi (comportement indéfini). fflush() n'a pas été prévue pour fonctionner avec des flux entrant. Voici une manière portable de vider le buffer d'un flux entrant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void purger(FILE *stream)
    {
        int c;
        while ((c = fgetc(stream)) != '\n' && c != EOF)
        {
            continue;
        }
    }
    C'était d'ailleurs également expliqué dans la FAQ C: http://c.developpez.com/faq/c/?page=...buffer_clavier

    Pour terminer avec main(), la fonction getch() n'est en général pas nécessaire avec les EDIs modernes comme Code::Blocks, Eclipse ou Visual-C++ Express Edition (pour ne parler que des EDIs gratuis). Si toutefois, tu as besoin d'une astuce de ce style pour empêcher la fermture de la console dès la fin du programme, utilise plutôt getchar() qui a l'avantage d'etre standard, donc portable.

    3) Il n'est pas nécessaire (et même déconseillé) de caster la valeur de retour de malloc comme tu le fais dans ta fonction InsereNom(), à moins de compiler ton code à l'aide d'une compilateur C++, ce qui est évidamment déconseillé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    p = malloc(sizeif *p)
    if (p != NULL)
    {
        /* initialisation des champs de p */
    }
    else
    {
        fprintf(stderr, "Allocation impossible!\n");
    }
    4) Pour terminer ce tour rapide, j'ai vu passer un appel à gets() dans ta fonction InsereNom(). gets() ne doit jamais être utilisée (voir la FAQ C). On peut systématiquement la remplacer par fegts() dont voici la documentation.

    En espérant que mes commentaires t'aiderons un peu. Le manque d'indentation me décourage d'aller plus en profondeur dans le code.

    Cordialement

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/07/2004, 21h00
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. PB de tables créées sous Windev
    Par Reynald dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/04/2004, 10h22
  4. Test table créée
    Par Fabsou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2004, 15h08
  5. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo