Convertir un langage C en C++

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. 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
    1. 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
      1. 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. 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
      2. 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
        1. 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
          1. 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
            1. 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
              1. 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
                1. 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
                  1. > 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
                    1. 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
                      1. 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