Aide pour calcul float

Résolu/Fermé
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014 - Modifié par mrquebec13 le 4/12/2014 à 20:06
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014 - 14 déc. 2014 à 18:12
Bonjour,
Je suis présentement en apprentissage de la programmation en C++ et j'utilise Visual Studio 2013. Je voudrais savoir pourquoi j'ai ce message d'erreur lorsque je viens pour déboguer mon programme: "IntelliSense : l'expression doit être de type intégral ou enum non délimité". Je comprend qu'il me dit que la variable de mon calcul doit être de type "int" ou "enum" mais est-ce possible de pouvoir faire un calcul avec des nombres decimaux (variable de type "float" ou "double")? Voici mon code:
#include <iostream>
using namespace std;
int main()
{
 int form;
 float const pi = 3.14159;
 cin >> form;
 do {
  float [/contents/91-radius radius];
  float surface;
  cin >> radius;
  do {
   surface = pi * radius ^ 2; //C'est ici qu'il m'indique le problème
   cout << endl << surface << endl;
   system ("pause");
  } while (0 <= radius);
 } while (form = 0);
 do {
  float b, h;
  float square(0.0);
  cin >> h;
  cin >> b;
  do {
   float square(b * h);
   system ("pause");
  } while (b >= 0 && h >= 0);
 } while (form = 1);
 do {
  exit(0);
 } while (form = 2);
 return 0;
}


J'aimerais aussi savoir si il y a un moyen pour qu'à la fin du programme il retourne au début. Si vous voyez une autre erreur ou si vous avez des conseil a me donner ce serait apprécié de me le dire.

Merci d'avance!
mrquebec13
A voir également:

5 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
5 déc. 2014 à 18:34
Bonsoir
avant d'allé plus loin dans le code , c'est quoi ça
 float [/contents/91-radius radius];
  float surface;
  cin >> radius;

0
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014
Modifié par mrquebec13 le 8/12/2014 à 16:59
Le "copier coller" a buggé. La vrai ligne de code est:
float radius;
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
10 déc. 2014 à 20:53
Bonsoir
La ligne
 float const pi = 3.14159; 
est correct et cela veut dire que la valeur de la variable doit reste inchangé donc constant de plus en a la possibilité de l'écrire de plusieurs manières exemple:
const float pi = 3.14;
float const pi = 3.14;
const float const pi = 3.14;

Mais, il faut comprendre également et je pense que c'est important, qu'une variable déclarée constante n'est pas vraiment constante.
On peut tout à fait remplacer la valeur d'une constante en passant par un alias ( une variable pointeur) voici un exemple concret:
  
#include <cmath>
#include <iostream>
#define PI 3.14159

int main( void ){

	/***
	* Définition de constante
	***/
	const float pi = 3.14;
	//float const pi = 3.14;
	//const float const pi = 3.14;

	std::cout << "Valeur pi origine = " << pi << std::endl;

	//Manip pointeur alias
	float *px = &(float)pi;
	*px = 100;

	//Affiche résultat
	std::cout << "Nouvelle valeur pi = " << pi << std::endl;
	std::cout << "Valeur px = " << *px << std::endl;

	/***
	* pi reste une constante et ne peut être
	* modifier. à la compilation il aura une
	* erreur donc pas de compilation
	* METTRE EN COMMENTAIRE POUR FAIRE LA SUITE DES TESTE
	***/
	//pi = 3.14;  //Erreur a la compilation
	//std::cout << "Valeur pi = " << pi << std::endl;
	//std::cout << "Valeur px = " << *px << std::endl;

	/***
	* pi à été modifier par alias
	* grace à px qui pointe à l'adresse
	* de pi le compilateur accepte et modifie
	* la valeur qui ce trouve à l'adresse de pi
	***/
	*px = PI;
	std::cout << "Valeur pi = " << pi << std::endl;
	std::cout << "Valeur px = " << *px << std::endl;

	//Conclusion
	std::cout << "#define inchanger et préférable (PI) = " << PI << std::endl;
	std::cout << "Variable constante & potentiellement modifiable (pi) = " << pi << std::endl;
	std::cout << "Variable pointeur (px) permettant la modification de (pi) = " << *px << std::endl;

	return ( 0 );
}

Bref, pour viser la constante complète il est préférable de la définir comme ceci
  #define PI 3.14159 

Et enfin mise à part d'autres soucis de variable et fonction il y a également des soucis d'algorithmes tout est à revoir et diable pourquoi ?
do {
  exit(0);
 } while (form = 2);
et ça sert à quoi ?

Pour la ligne
 surface = pi * radius ^ 2; 
moi je comprends l'utilisation des puissances enfin si c'est ce que tu compte faire et pour faire ça, sois on écris la fonction sois-même ou on utilises les fonctions mathématiques en langage C/C++ en utilisant :
#include <cmath> 

et des fonctions comme:
float powf (float base, float power);
float sqrtf (float x);
etc..

Bref, c'est tout le programme qu'il faut revoir et si tu n'es pas trop en accord avec le langage C ou langage C++ je te conseille le langage python qui est beaucoup plus simple.
à bientôt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2014 à 22:23
Bonjour,

Plusieurs remarques :
1/ Il vaut mieux utiliser des doubles sauf cas particulier (ce dont je doute ici ;-)).

2/ surface = pi * radius ^ 2;
^ n'est pas l'opérateur de puissance en C++. D'ailleurs, l'opérateur de puissance n'existe pas en C++. Pour réaliser des puissances de flottants, il y a une bibliothèque standard. Mais pour un simple carré, il te suffit de mettre : surface=pi*radius*radius;

3/ system ("pause");
Tu n'as pas inclus le header cstdlib. Attention ce comportement n'est pas standard et dépend de l'OS...

4/ while (form = 0);
Attention l'opérateur de comparaison est le double égal. De plus, on ne fait pas la comparaison entre deux flottants. On calcule plutôt la valeur absolue de la différence entre les deux et on vérifie que cela est très petit.
Ici :
std::abs(form) < std::numeric_limits<T>::epsilon() * std::abs(form) * 2 || std::abs(x-y) < std::numeric_limits<T>::min();

Note : il faut inclure cmath
Je te conseille de faire une fonction compare(double n1,double n2, int precision) qui renverrait true si les flottants sont très proches.

5/ Attention à tes while. Beaucoup sont inutiles... Si aucune variable ne change dans la boucle, soit elle ne sera jamais exécutée soit cela partira en boucle infinie (sauf si bug ou appel explicite de fin).

Cdlt,
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
10 déc. 2014 à 22:43
Je confirme la conclusion de @fiddy
:)
0
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014
14 déc. 2014 à 05:39
Merci a tous!
J'ai corrigé mes erreurs et maintenant mon programme fonctionne à merveille, mais pour ce qui est de ma deuxième question je n'ai toujours pas trouver de réponse:
"J'aimerais aussi savoir si il y a un moyen pour qu'à la fin du programme il retourne au début"
Autrement dit, j'aimerais savoir si il y a un moyen de refaire le code en entier ou seulement une partie du code en boucle comme pour la commande "goto" en langage DOS(batch).
Merci!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 déc. 2014 à 15:26
Il suffit de mettre une boucle while.
Au pire, tu peux créer des fonctions et l'appeler quand bon il te semble.
0
mrquebec13 Messages postés 8 Date d'inscription jeudi 4 décembre 2014 Statut Membre Dernière intervention 14 décembre 2014 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
14 déc. 2014 à 18:12
je n'y avais pas penser merci!
0

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

Posez votre question
Bonjour,

ligne 6:
const float pi = 3.14159; // mettre const avant le type de variable

ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =

ligne 27:
while (form == 1); // operateur de comparaison == et non d'affectation =

ligne 30
while (form == 2); // operateur de comparaison == et non d'affectation =

Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
-4
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 déc. 2014 à 22:07
ligne 6:
const float pi = 3.14159; // mettre const avant le type de variable

Non, pas nécessairement.

ligne 17:
while (form == 0); // operateur de comparaison == et non d'affectation =

Yes, mais on évite la comparaison avec 0 lorsque l'on a affaire à des flottants.

Les déclarations float b,h,square, ...etc... devraient être placées à l'extérieur des boucles do ... while ( avant les boucles).
Non au contraire. Ils sont très bien placés. Pour une fois que la portée des variables est respectée...
0