Convertir un langage C en C++

louis34__ -  
 PierrotLeFou -

Bonjour,

Je suis élève en terminale et j'aborde le langage C (j'ai pris la spécialité NSI) . J'ai un exercice à rendre qui consiste à transformer un programme C en C++, or je n'y arrive absolument pas. J'ai appris les bases mais je n'arrive pas à trouver le bon résultat car il y a des erreurs .

J'ai exécuté le programme en C ci-dessous sur divers logiciel, il me renvoie une valeur : a = 10000000000000000.000000 . 

#include <stdio.h>

int main(){
   double a = 1;
   double b = 2;
   while (b - a == 1) {
        a = 10 * a;
        b = a + 1;
   }
   printf("%s %lf", "a= ", a);
   return 0;
}

Pourriez-vous m'aider, s'il vous plait ? 

Merci 

12 réponses

  1. PierrotLeFou
     

    Quel est le but supposé de cet exercice?
    Avec les doubles, au delà d'une certaine valeur, on n'a pas asez de précision pour comparer b-a à 1
    Il faut plutôt faire  fabs(b-a-1) < 1e-15 par exemple ...

    De plus ajouter 1 à quelque chose de trop grand ne changera rien.
    Et que vient faire le C++ dans cet exercice?

    1
  2. PierrotLeFou
     

    Tu avais mis un ';' au lieu de '{' sur la ligne du main.
    Le reste n'était pas considéré comme faisant partie du main.
    C++ s'attend à ce que ça soit des fonctions.

    Tu as fait la même erreur avec main() et while (...). Ce sont des énoncés de bloc ou de contrôle. Le ';' dit qu'il n'y a aucune instruction dans le bloc en question.

    1
  3. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     

    Avec std::cout par défaut les flottants sont affichés comme si on avait fait un printf("%g") pour avoir l'affichage équivalent à "%f", il faut préciser std::fixed; Pour plus "ressembler" à du C++, ça donne:

    #include <iostream>
    int  main() {
    	auto  a{1.};
    	auto  b{2.};
    	while ( b - a == 1 ) {
    		a = 10 * a;
    		b = a + 1;
    	}
    	std::cout << "a= " << ' ' << std::fixed << a;
    }

    Mais en fait, ton premier code est tout à fait compilable en C++. Ici on est dans le cas où le C++ ne semble rien changer (à part un cout remplaçant vaguement le printf). C'est donc le pire de l'anti-pédagogie de comparer les langages avec cet exemple. Le C et le C++ sont en fait extrêmement différents!

    1
    1. louis34__ Messages postés 7 Statut Membre
       

      D'accord, je comprends mieux . Merci beaucoup . 

      Et par exemple, si on transformait ce langage en d'autres langages comme Python par exemple, cela serait il pareil ? 

      C'est en dehors de l'exercice de base, mais si je le transforme en Python , cela donnerait : 

      a = 1
      b = 2
      while b-a==1:
           a = 10*a
           b = a+1
      print(a)
      

      Est il juste ? 

      0
  4. louis34__ Messages postés 7 Statut Membre
     

    Bonjour,

    Merci de m'avoir répondu . 

    Le but de cet exercice est de transformer un langage C en C++, car ma classe et moi travaillons sur les langages informatiques et comment les traduire .

    Je suis réellement désolé mais je ne comprends pas . Le code que vous avez donné, il faut le placer où ? 

    J'ai essayé de faire le programme C en C++, mais il y a de nombreuses erreurs que je n'arrive pas à résoudre :

    #include <iostream>
    int main();
        double a = 1;
        double b = 2;
        while (b-a ==1);
        {
            a = 10 * a;
            b = a + 1;
        }
    cout<<("%s%lf","a",a);
    return 0;
    

    Du coup, je ne sais pas quoi taper pour que ça affiche le bon résultat .

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

    Posez votre question
  6. PierrotLeFou
     

    En C++, on n'a pas besoin du format à la base.
    Il faut écrire :

    std::cout << a << std::endl;

    Il me semble que ça donnait 1.0e+16

    Je viens de voir que le while se termine par ';'. il faut l'enlever.

    0
  7. louis34__ Messages postés 7 Statut Membre
     

    J'ai recommencé le code avec vos indications. Il semble bon mais il y a toujours des erreurs :

    main.cpp:13:5: error: expected unqualified-id before ‘while’
       13 |     while (b-a ==1)
          |     ^~~~~
    main.cpp:18:10: error: ‘cout’ in namespace ‘std’ does not name a type
       18 |     std::cout<<a<< std::endl;
          |          ^~~~
    In file included from main.cpp:8:
    /usr/include/c++/9/iostream:61:18: note: ‘std::cout’ declared here
       61 |   extern ostream cout;  /// Linked to standard output
          |                  ^~~~
    main.cpp:19:5: error: expected unqualified-id before ‘return’
       19 |     return 0;
          |     ^~~~~~
    main.cpp:20:1: error: expected declaration before ‘}’ token
       20 | }
          | ^

    J'ai essayé de multiples façons et elles sont toujours présentes . Je n'arrive pas à avoir la bonne valeur .

    0
  8. PierrotLeFou
     

    Tu as sans doute enlevé le ';' sur la ligne avant le while. Peux-tu poster ton code?


    Voici le mien:

    #include <iostream>
    
    int main() {
        double a = 1;
        double b = 2;
        while (b - a == 1) {
            a = 10 * a;
            b = a + 1;
        }
        std::cout << a << std::endl;
        return 0;
    }
    0
  9. louis34__ Messages postés 7 Statut Membre
     

    Mon code était : 

    #include <iostream>
    
    int main();
        double a = 1;
        double b = 2;
        while(b - a == 1)
        {
            a = 10 * a;
            b = a + 1;
        }
        std::cout << a << std::endl;
        return 0;
    

    Je comprends pourquoi il y avait des erreurs .

    Merci beaucoup . Cela signifie donc que le programme en C au début est correctement traduit en C++ maintenant ? 

    0
  10. louis34__ Messages postés 7 Statut Membre
     

    Bonjour, merci beaucoup pour vos explications, je comprends mieux mes erreurs . 

    J'avais une dernière question à vous poser :

    Les deux programmes sont bons, certes, mais ce ne sont pas les mêmes résultats en C et C++ . Cela signifie t-il que pour chaque langages différents, comme Python, Java, etc. les résultats ne sont pas les mêmes ? Et donc, qu'est ce que cela signifie ? 

    0
  11. PierrotLeFou
     

    > il me renvoie une valeur : a=  10000000000000000.000000
    Et tu reçois 1e+16 en C++. Mystère? Il y a combien de 0 après le 1 dans la forme en C? Justement 16 ...
    La valeur est la même. C'est le format d'affichage qui change.
    Ça veut dire qu'à partir de 10^16, ça ne sert plus à rien d'ajouter 1. C'est trop petit par rapport au nombre.

    0
  12. louis34__ Messages postés 7 Statut Membre
     

    D'accord, je comprends mieux . Merci beaucoup . 

    Et par exemple, si on transformait ce langage en d'autres langages comme Python par exemple, cela serait il pareil ? 

    C'est en dehors de l'exercice de base, mais si je le transforme en Python , cela donnerait : 

    a = 1
    b = 2
    while b - a == 1:
         a = 10 * a
         b = a + 1
    print(a)
    

    Est-il juste ? 

    0
  13. PierrotLeFou
     

    Le code en Python est correct. Le problème est que la précision en Python est beaucoup plus grande.
    J'ai fait le test et je dois l'arrêter à 10**1000 ...

    0