Convertir un langage C en C++

Fermé
louis34__ - Modifié le 1 déc. 2022 à 12:31
 PierrotLeFou - 28 nov. 2022 à 18:00

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

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

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
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
27 nov. 2022 à 13:04

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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
27 nov. 2022 à 16:31

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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
Modifié le 26 nov. 2022 à 11:25

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

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

Posez votre question

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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
Modifié le 26 nov. 2022 à 17:13

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

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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
Modifié le 1 déc. 2022 à 12:29

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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
Modifié le 27 nov. 2022 à 10:46

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
PierrotLeFou
27 nov. 2022 à 18:27

> 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
louis34__ Messages postés 7 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 28 novembre 2022
Modifié le 1 déc. 2022 à 12:33

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

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