Probleme pour compiler et probleme semantique de code [Résolu]

Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
- - Dernière réponse : cptpingu
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
- 24 févr. 2012 à 13:37
bonjour

je suis débutant dans le c++
voila mon code pour faire un convertisseur base 10 en hexa et inversement mais je n'arrive a faire de compilation , de plus lorsque j’enlève cette partie du code qui bloque ma première fonction (la conversion entier => hexa ne me donne pas nom plus de bon résultat.
Je suis bloquer help please !

mon code :

#include
#include <math.h>
#include <string>
#include <sstream>

using namespace std;

int main()
{
char choix ;
string hexa ;
int nb ;
int val ;
int res ;
char v[5] ;
int i ;
char h ;

v[0] = 'a';
v[1] = 'b';
v[2] = 'c';
v[3] = 'd';
v[4] = 'e';
v[5] = 'f';
// boucle sur le menu
choix = 'A' ;
while (choix != 'Q' && choix != 'q')
{

// afficher le menu
cout << endl << "conversion entier vers hexadecimal ........ 1" ;
cout << endl << "conversion hexadecimal vers entier ........ 2" ;
cout << endl << "quitter ............................... Q" ;
cout << endl << "votre choix ........................... " ;
cin >> choix ;

// conversion entier vers hexa
if (choix == '1')
{
hexa = ' ' ;
h = ' ' ;
cout << "saisir un nombre entier = " ;
cin >> nb ;
while (nb != 0)
{
// récupération du reste et conversion en caractère
res = 0 ;
res = (nb%16) ;
// si le reste supérieur a 10 , recherche et remplacement par le caractère hexa correspondant
if (res > 9) {
res = res - 10 ;
for (i = 0 ; i <= 5 ; i++ ){
if (res == i) {
res = v[i] ;
h = res ;
}
}
}else{
h = res ;
}
nb = (nb/16) ;
hexa = h + hexa ;
}
cout << "conversion en hexadecimal = " + hexa ;
}
else
{

// conversion binaire vers entier
if (choix == '2')
{
nb = 0 ;
int k = 0 ;
cout << "entrer un nombre hexadecimal (sans majuscules) = " ;
cin >> hexa ;
while (hexa.size() > 0)
{
// extration du dernier caractère de hexa
string s = hexa.substr(hexa.size()-1, 1) ;
istringstream h(s);
if ( (h 'a') | (h 'b') | (h =='c') | (h =='d') | (h =='e') | (h =='f') ) {
for ( i = v[0] ; i <= v[5] ; i++) {
if (h == v[i]) {
int val ;
val == i ;
}
}
}

// conversion du caractère en entier
h>>val ;
// ajout dans nb du bit récupéré multiplié par la puissance de 16
nb += val * pow(16, k) ;
// on enlève le dernier caractère
hexa = hexa.substr(0, hexa.size()-1) ;
k++ ;
}
cout << "conversion en decimale = " << nb ;
}

}

}


return 0;
}


cordialement
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
3
Merci
Bonjour.

(Merci d'indenter ton code et d'utiliser les balises de code sur ce forum).

Il y a un nombre incalcul d'erreurs et de maladresses techniques. On va essayer de les voir une à une (il est possible que j'en oublie).
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- En C++ on inclu <cmath> plutôt que <math.h>. Ici, cmath ne te sert de toute façon à rien.
- char v[5] ;
v[0] = 'a';
v[1] = 'b';
v[2] = 'c';
v[3] = 'd';
v[4] = 'e';
v[5] = 'f';
Tu as 5 éléments, et tu en mets 6 dedans... Donc il faut que ton tableau est 6 éléments et non 5.
On peut directement écrire: char v[6] = {'a', 'b', 'c', 'd', 'e', 'f'};

- Tu peux directement enchaîner les std::cout. Ex:
    cout << endl << "conversion entier vers hexadecimal ........ 1" ;
    cout << endl << "conversion hexadecimal vers entier ........ 2" ;
    cout << endl << "quitter ............................... Q" ;
    cout << endl << "votre choix ........................... " ;
    cin >> choix ;

Devient:
    std::cout << std::endl << "conversion entier vers hexadecimal ........ 1" << std::endl
              << "conversion hexadecimal vers entier ........ 2" << std::endl
              << "quitter ............................... Q" << std::endl
              << "votre choix ........................... " << std::endl
    std::cin >> choix;


- Fait des fonctions au lieu de tout mettre dans le main. Une fonction ne devrait pas excéder 50 lignes.
- Les "ou" en C/C++ c'est "||" et non "|" (qui est un "ou" logique, dont le comportement diffère).
- Tu n'est pas obligé de déclarer toutes tes variables d'un coup. Tu peux les déclarer au fur et à mesure.
- Il y a encore trop de petites maladresses. Je t'invite à refaire ton code au propre, en faisant des fonctions !

Tes erreurs:
- std::istringstream h(s);
Tu créer un stream appelé h, alors que tu as déjà un caractère de ce nom (char h, un peu plus haut).
Donc forcément, quand tu fais h == 'a', ça ne fonctionne pas.
Un: "char h = s[0];" serait peut être plus judicieux, non ? D'ailleurs pourquoi utiliser un std::istringstream ?

- val i;, au lieu de val i; Mais même en le corrigeant, ça n'a pas de sens de mettre i dans val, si val n'est pas utilisé derrière... (Le "int val" déclaré ligne 84, sera détruit en sortant du scope dans lequel il est. C'est-à-dire que cette variable cessera d'exister après la ligne 86).
- h>>val; idem. Peut être h = h >> val ?

A noter: Si c'est un exercice scolaire, je comprends ta démarche.
En revanche, si veux "juste" afficher en héxa, il y a "std::hex".
Ex: std::cout << std::hex << 42 << std::endl; // Affichera 2A

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
3
Merci
Je suis vraiment au tous début je pense que tous le monde est déjà passé par la.. :)

Oui, oui, moi le premier :). Il n'y avait pas de critique de ma part, je pointait juste le fait qu'il y avait quelques parties à revoir.

Je te propose un programme "plus propre". Je n'ai pas corrigé tes erreurs techniques, juste la syntaxe et l'architecture du code. J'ai découpé ton code en petites fonctions.
#include 
#include <string>
#include <sstream>
#include <cmath>

static const char v[6] = {'a', 'b', 'c', 'd', 'e', 'f'};

char menu()
{
  char choix = 'A';
  while (choix != 'Q' && choix != 'q' && choix != '1' && choix != '2')
  {
    std::cout << std::endl << "conversion entier vers hexadecimal ........ 1" << std::endl
              << "conversion hexadecimal vers entier ........ 2" << std::endl
              << "quitter ............................... Q" << std::endl
              << "votre choix ........................... ";
    std::cin >> choix ;
  }

  return choix;
}

std::string toHexa(int nb)
{
  std::string hexa;
  int res = 0;
  char h;

  while (nb != 0)
  {
    // récupération du reste et conversion en caractère
    res = nb % 16;
    // test du reste si celui est superieur a 10
    if (res > 9)
    {
      // soustraction de 10 du nombre superieur a 10
      res = res - 10;
      // boucle pour la recherche de la lettre associé au nombre en hexa
      for (int i = 0 ; i < 6; ++i)
      {
        if (res == i)
        {
          // Le nombre etant trouvé association de la lettre et incrementation dans la variable h
          h = v[i] ;
        }
      }
    }
    else
    {
      // si le reste n'est pas superieure a 10 alors h est incrementé de la valeur converti de res
      h = res;
    }
    // on ajoute le caractère a la chaine hexa
    hexa = h + hexa ;
    // on divise nb par 16
    nb = nb / 16;
  }

  return hexa;
}

int toDec(std::string hexa)
{
  int nb = 0;
  int k = 0 ;

  // boucle sur ma taille de hexa
  while (!hexa.empty())
  {
    // extration du dernier caractère de hexa
    std::string s = hexa.substr(hexa.size()-1, 1) ;
    char t = s[0];
    int val = 0;
    // comparatif de t si celui ci est une lettre en hexa
    if ((t 'a') || (t 'b') || (t =='c') || (t =='d') || (t =='e') || (t =='f'))
    {
      for (int i = v[0]; i <= v[5]; ++i)
      {
        if (t == v[i])
        {
          val = i + 10;
        }
      }
    }

    // conversion du caractère en entier si celui si n'est pas une lettre en hexa
    t = t >> val;
    // ajout dans nb du bit récupéré multiplié par la puissance de 16
    nb += val * pow(16, k);
    // on enlève le dernier caractère
    hexa = hexa.substr(0, hexa.size() - 1);
    k++;
  }

  return nb;
}

int main()
{
  bool stop = false;
  while (!stop)
  {
    switch (menu())
    {
      case 'q':
      case 'Q':
        stop = true;
        break;
      case '1':
        {
          int nb = 0;
          std::cout << "Saisir un nombre entier = " ;
          std::cin >> nb;
          std::cout << "Conversion en hexadecimal = " << toHexa(nb) << std::endl;
          break;
        }
      case '2':
        {
          std::string hexa;
          std::cout << "Entrez un nombre hexadecimal (sans majuscules) = ";
          std::cin >> hexa;
          std::cout << "Conversion en decimale = " << toDec(hexa) << std::endl;
          break;
        }
    }
  }

  return 0;
}


Je te propose de repartir sur cette base, et d'essayer de corriger au moins le "toHexa". Je t'aiderais, si tu bloques vraiment.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
0
Merci
// conversion binaire vers entier => se commentaire possede une erreur , il faut lire //conversion hexa vers entier

a++
Commenter la réponse de nicolai08
Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
0
Merci
bonjour

merci de tes réponses , je fais les corrections nécessaire et je vois si ça marche , en effet c'est un exercice , je ne suis pas étudiant en info je fais juste des exos que l'on ma donné que je fais comme ça pour ma culture informatique.

Je suis vraiment au tous début je pense que tous le monde est déjà passé par la.. :)

a bientot
Commenter la réponse de nicolai08
Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
0
Merci
Revoici mon code modifier , les erreurs de compilation on disparut par contre les erreur semantique son toujours presentent , pas moyen de trouver de solution avec mes connaissance je reste bloqué.
J'ai du mal avec les conversion de char en int c'est peu être pour ça que ça beug.

#include <stdio.h>
#include <stdlib.h>
#include 
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

int main()
{
    char choix ;
    string hexa ;
    int nb ;
    int val ;
    int res ;
    char v[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
    int i ;


    // boucle sur le menu
    choix = 'A' ;
    while (choix != 'Q' && choix != 'q')
    {

        // afficher le menu
        cout << endl << "conversion entier vers hexadecimal ........ 1" ;
        cout << endl << "conversion hexadecimal vers entier ........ 2" ;
        cout << endl << "quitter ............................... Q" ;
        cout << endl << "votre choix ........................... " ;
        cin >> choix ;

        // conversion entier vers hexa
        if (choix == '1')
        {

            hexa = ' ' ;

            cout << "saisir un nombre entier = " ;
            cin >> nb ;
            while (nb != 0)
            {
                char h ;
                // récupération du reste et conversion en caractère
                res = 0 ;
                res = (nb%16) ;
                // test du reste si celui est superieure a 10
                 if (res > 9) {
                     // soustration de 10 du nombre superieure a 10
                  res = res - 10 ;
                      // boucle pour la recherche de la lettre associé au nombre en hexa
                     for (i = 0 ; i <= 6 ; i++ ){
                      if (res == i) {
                          // le nombre etant trouver association de la lettre et incrementation dans la variable h
                       h = v[i] ;
                     }
                    }
                  }else{
                      // si le reste n'est pas superieure a 10 alors h est incrementé de la valeur converti de res
                       h = res;
                  }
                // on ajoute le caractère a la chaine hexa
                hexa = h + hexa ;
                 // on divise nb par 16 
                nb = (nb/16) ;
            }
            cout << "conversion en hexadecimal = " + hexa ;
        }
        else
        {

            // conversion hexa vers entier
            if (choix == '2')
            {
                nb = 0 ;
                int k = 0 ;
                cout << "entrer un nombre hexadecimal (sans majuscules) = " ;
                cin >> hexa ;
                 // boucle sur ma taille de hexa
                while (hexa.size() > 0)
                {
                    // extration du dernier caractère de hexa
                    string s = hexa.substr(hexa.size()-1, 1) ;
                    char t = s[0];
                     int val ;
                     val = 0 ;
                     // comparatif de t si celui ci est une lettre en hexa
                     if ( (t 'a') || (t 'b') || (t =='c') || (t =='d') || (t =='e') || (t =='f') ) {
                       for ( i = v[0] ; i <= v[5] ; i++) {
                        if (t == v[i]) {

                          val = i + 10 ;
                        }
                       }
                     }

                    // conversion du caractère en entier si celui si n'est pas une lettre en hexa
                    t>>val ;
                    // ajout dans nb du bit récupéré multiplié par la puissance de 16
                    nb += val * pow(16, k) ;
                    // on enlève le dernier caractère
                    hexa = hexa.substr(0, hexa.size()-1) ;
                    k++ ;
                }
                cout << "conversion en decimale = " << nb ;
            }

        }

     }


    return 0;
}




voila même avec plusieurs modification tous mes résultats sont faux .
merci de vos réponses.
Commenter la réponse de nicolai08
Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
0
Merci
salut

merci de ta réponse encore une fois très complète ! je repart sur cette base cela fait deja plus propre

a+
Commenter la réponse de nicolai08
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
0
Merci
Bonjour.

Je viens aux nouvelles, est-ce que tu t'en sors ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
6
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
0
Merci
bonjour ,

du mieu avec l'aide que tu m'as donné mais j'ai encore du mal avec la conversion de l'int du reste de la division en char ou string pour pouvoir l'ajouter a hexa et inversement dans la partis 2 .
Commenter la réponse de nicolai08
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
0
Merci
Poste moi le code de tes fonctions toDec et toHexa, je vais jeter un coup d'oeil.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu