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 :

Probleme avec fonction binaire vers decimale


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut Probleme avec fonction binaire vers decimale
    Bonjour a tous

    Bon, voila, je suis entrain de coder un programme permettant de convertir un decimal en binaire puis vers d'autres bases (on vera ensuite ^^)

    Mais, j'ai un petit probleme lors de la conversion du binaire vers le decimal

    Lorsque, je tape 11 par exemple, j'ai une exception non gere dans ma fonction

    Voici le 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
    #include <stdio.h>
     
    int bin2dec(char *bin)
    {
        int dec = 0;
        while(*bin)
        {
            dec = (2 * dec) + (*bin - '0');
            bin++;
        }
        return dec;
    }
     
    void dec2bin(int dec, char *bin, int size)
    {
     
        int reste = 1, i;
        memset(bin, '0', size);
        for(i = (size-1); reste != 0; i--)
        {
            reste = dec / 2;
            *(bin+i) = (dec % 2) + '0';
            dec = reste;
        }
        *(bin+(size)) = '\0';
        return;
    }
     
    int menu ()
    {
        int choix = 0;
     
        while (choix <1 || choix > 6)
        {
            printf("-== Menu ==-\n\n");
            printf("1 : Decimal --> Binaire\n");
            printf("2 : Binaire --> Decimal\n");
            printf("3 : Decimal --> Hexadecimal\n");
            printf("4 : Hexadecimal --> Decimal\n");
            printf("5 : Binaire --> Hexadecimal\n");
            printf("6 : Hexadecimal --> Binaire\n\n");
            printf("Votre choix ?");
            scanf("%d", &choix);
            system("cls");
        }
        return choix;
     
    }
     
    int main(int argc, char *argv[])
    {
        char buf[256];
        int nb = 0;
        int caractere = 0;
        char binaire = 0;
     
        switch (menu())
        {
        case 1 :
     
            system("cls");
            printf("Choisissez un nombre decimal pour le convertir en binaire?\n\n");
     
            scanf("%d", &nb);
            printf("\n");
            dec2bin(nb, buf, 8);
            printf("%s\n\n", buf);
     
            printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
            getchar(caractere);
            getchar (); // Jusqu'ici
     
            break;
     
        case 2:
     
            system("cls");
            printf("Choisissez un nombre binaire pour le convertir en decimal?\n\n");
     
            scanf("%d", &nb);
            printf("\n");
            binaire = bin2dec(nb);
            printf("%d\n\n", binaire);
     
            printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
            getchar(caractere);
            getchar (); // Jusqu'ici
     
            break;
     
        }
    }
     
    /*Merci a kod32*/
    Les deux fonctions ne sont pas de moi, mais je compte faire celle sur l'hexa tout seul

    Merci de votre aide

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Bah déjà tu peux commencer par régler ce qui ne va pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    main.c:70: error: too many arguments to function 'getchar'
    main.c:82: warning: passing argument 1 of 'bin2dec' makes pointer from integer without a cast
    main.c:86: error: too many arguments to function 'getchar'

    getchar ne prend aucun paramètre, il renvoie le caractère.
    Ta fonction bin2dec attend un char* et toi tu lui envoie un int

  3. #3
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Merci

    Si, j'ai bien compris, la pause doit etre comme sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
    		getchar (); // Jusqu'ici
    Sauf, que dans ce cas là, le programme quitte tout de suite, on ne peut pas voir le resultat

    POur l'histoire de int et de char, je dois envoyer un char pour ma fonction bin2dec, donc int nb devient char nb ?

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Le programme quitte tout de suite car ton buffer clavier n'est pas vide.

    Pour ce qui est du int au lieu du char* :

    On envoie une chaine de caractere au lieu d'un nombre pour traiter (beaucoup) plus facilement la conversion.

    Et ce n'est pas un char (un caractere), mais un char* (une chaine de caractere terminé par '\0').

  5. #5
    Membre chevronné
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2008
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2008
    Messages : 525
    Par défaut
    Merci de ton aide

    Pour vider le buffer, j'ai mis

    avant le getchar();

    Mais pour ce qui est du probleme avec le char, je ne vois pas
    J'ai mis

    à la place de

    Mais se ne marche toujours pas :/

    Voici le code complet

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int bin2dec(char *bin)
    {
        int dec = 0;
        while(*bin)
        {
            dec = (2 * dec) + (*bin - '0');
            bin++;
        }
        return dec;
    }
     
    void dec2bin(int dec, char *bin, int size)
    {
     
        int reste = 1, i;
    	memset(bin, '0', size);
        for(i = (size-1); reste != 0; i--)
        {
            reste = dec / 2;
            *(bin+i) = (dec % 2) + '0';
            dec = reste;
        }
        *(bin+(size)) = '\0';
        return;
    }
     
    int menu ()
    {
    	int choix = 0;
     
    	while (choix <1 || choix > 6)
    	{
    		printf("-== Menu ==-\n\n");
    		printf("1 : Decimal --> Binaire\n");
    		printf("2 : Binaire --> Decimal\n");
    		printf("3 : Decimal --> Hexadecimal\n");
    		printf("4 : Hexadecimal --> Decimal\n");
    		printf("5 : Binaire --> Hexadecimal\n");
    		printf("6 : Hexadecimal --> Binaire\n");
    		printf("Votre choix ?");
    		scanf("%d", &choix);
    		system("cls");
    	}
    	return choix;
     
    }
     
    int main()
    {
    	char buf[256];
    	char* nb;
     
    	switch (menu())
    	{
    	case 1 :
     
    		system("cls");
    		printf("Choisissez un nombre decimal pour le convertir en binaire\n\n");
     
    		scanf("%d", &nb);
    		printf("\n");
    		dec2bin(nb, buf, 8);
    		printf("%s\n\n", buf);
     
    		printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
    		fflush(stdin);
    		getchar (); // Jusqu'ici
     
    		break;
     
    	case 2:
     
    		system("cls");
    		printf("Choisissez un nombre binaire pour le convertir en decimal\n\n");
     
    		scanf("%d", &nb);
    		printf("\n");
    		printf("%d\n\n", bin2dec(nb));
     
    		printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
    		fflush(stdin);
    		getchar (); // Jusqu'ici
     
    		break;
     
    	case 3 :
     
    		system("cls");
    		printf("Choisissez un nombre decimal pour le convertir en hexadecimal\n\n");
     
     
    		printf ("\nAppuyez sur Entrer pour quitter\n");  // Fonction pour mettre en pause, d'ici
    		getchar (); // Jusqu'ici
     
    		break;
    	}
    	return 0;
    }
     
    /*Merci a kod32*/

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonsoir.

    Citation Envoyé par Antoinejdu44 Voir le message
    Pour vider le buffer, j'ai mis

    Mauvaise idée, voir dans la FAQ :
    Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?
    Comment vider le buffer clavier ?

    Quelques petites corrections et commentaires du premier 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
    #include <stdio.h>
    #include <stdlib.h> /* pour system (); */
     
    void clean_stdin (void);
    void clear_screen (void);
    void pause (void);
    int menu (void);
    int bin2dec(char*);
    void dec2bin (int, char*, int);
     
    int main (void) /* void quand main ne prend pas de paramètres */
    {
        char buf[256];
        int nb = 0;
        int caractere = 0;
        char binaire = 0;
        clear_screen ();
        switch (menu())
        {
            case 1 :
                printf("Choisissez un nombre decimal pour le convertir en binaire?\n\n");
                scanf("%d", &nb);
                printf("\n");
                dec2bin(nb, buf, 8);
                printf("%s\n\n", buf);
                break;
            case 2:
                printf("Choisissez un nombre binaire pour le convertir en decimal?\n\n");
                scanf("%d", &nb);
                printf("\n");
                binaire = bin2dec(nb);
                printf("%d\n\n", binaire);
                break;
        }
        clean_stdin ();
        pause ();
        return 0; /* à ne pas oublier */
    }
     
    void clean_stdin (void) /* procédure pour vider la mémoire tampon du clavier (issue de la FAQ) */
    {
        int c;
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    void clear_screen (void)
    {
        system ("cls"); /* pas portable mais au moins, on n'a qu'une seule ligne à modifier */
        /* clear pour Linux */
    }
     
    void pause (void)
    {
        printf ("\nAppuyez sur Entrer pour continuer ...\n");
        getchar ();
        /* getchar (); ne prend pas de paramètres, pour affecter à une variable, on fait comme ceci :
        var = getchar (); */
    }
     
    int bin2dec(char *bin)
    {
        int dec = 0;
        while(*bin)
        {
            dec = (2 * dec) + (*bin - '0');
            bin++;
        }
        return dec;
    }
     
    void dec2bin (int dec, char *bin, int size)
    {
     
        int reste = 1, i;
        /* memset(bin, '0', size); fonction inéxistante */
        for(i = (size-1); reste != 0; i--)
        {
            reste = dec / 2;
            *(bin+i) = (dec % 2) + '0';
            dec = reste;
        }
        *(bin+(size)) = '\0';
        /* pas de return dans une procédure ... */
    }
     
    int menu (void) /* void quand la fonction ne prend pas de paramètres (sinon elle peut prendre une infinité de paramètres) */
    {
        int choix = 0;
     
        while (choix <1 || choix > 6)
        {
            printf("-== Menu ==-\n\n");
            printf("1 : Decimal --> Binaire\n");
            printf("2 : Binaire --> Decimal\n");
            printf("3 : Decimal --> Hexadecimal\n");
            printf("4 : Hexadecimal --> Decimal\n");
            printf("5 : Binaire --> Hexadecimal\n");
            printf("6 : Hexadecimal --> Binaire\n\n");
            printf("Votre choix ?");
            scanf("%d", &choix);
            clean_stdin ();
            pause ();
        }
        return choix;
    }
    Cordialement,
    Idriss

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mail] probleme avec fonction mail() !!!
    Par H-bil dans le forum Langage
    Réponses: 6
    Dernier message: 19/06/2006, 23h45
  2. C++ - Probleme avec fonction virtuelle
    Par vdumont dans le forum C++
    Réponses: 1
    Dernier message: 20/03/2006, 20h49
  3. probleme avec fonctions
    Par Burinho dans le forum C
    Réponses: 8
    Dernier message: 29/12/2005, 21h28
  4. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

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