Bonjour,
Je commencerais par l'éternel :
« faire une boucle, c'est écrire 3 choses (en plus du corps de la boucle) :
1) initialiser une variable (indice de boucle)
2) mettre un test pour savoir si on continue ou arrête la boucle
3) mettre à jour la variable
»
À partir de là, que tu fasses des while ou des for en C++, ça ne change rien à part l'endroit où tu mets ces trois choses.
Cela étant dit, je préfère les for car :
de part la syntaxe, ça t'évite d'oublier l'une des trois choses (typiquement le 3) qu'on zape trop souvent avec un while)
en C++, l'indice de boucle peut être déclaré (sans surplus de code) dans le for pour avoir une portée limitée au corps de boucle, ce qui est nettement plus propre.
le C++ regorge de structures de données fournissant des itérateurs pour lesquels tout regrouper dans le for permet de rendre le code plus clair/compréhensible.
« J'ai l'impression qu'on peut tout le temps lui substituer une boucle while adéquate. »
ça c'est vrai. L'inverse (changer un while en for) est vrai en C++, faux dans d'autres langages.
« Est-ce une question d'optimisation ? »
à ton niveau (mais ça concerne la majorité des gens ici), cette question ne se pose pas. La micro-optimisation, tu es 1000 ans trop jeune pour la faire mieux que ton compilateur (surtout si tu utilises l'option -O2 comme il se doit, en supposant que c'est bien un gcc-like qui compile).
En prime, ici, le code assembleur généré est (sauf cas tordus) parfaitement équivalent que tu mettes for ou while. Au final, tu finis avec des jump (le goto de l'assembleur).
Conséquence direct, il n'y a pas de différence dans la rapidité d'exécution.
« Bien que mon prof m'ait fortement déconseillé d'utiliser break »
bah c'est un con. </manque de diplomacie>
Le break (tout comme le continue pour sauter à l'itération suivante), c'est super utile à condition de l'utiliser à bon escient.
« Tandis que pour sortir d'une boucle for, je ne connais pas d'autre solution que de mettre l'indice plus haut que la valeur dernière de la boucle. »
break. Il n'y a pas de raisons pour que ça soit différent.
« y'a-t-il plus élégant pour ce faire que de copier coller ma trèèès longue fonction, »
éventuellement, un template (mais ça t'embarque loin si tu n'as jamais vu ça, et il faut voir le code pour savoir si c'est applicable).
Une autre solution serait de convertir ton double en string (par exemple en passant par un istreamstring) puis d'appeler la variante qui prend en entrée un string. C'est cinq ligne de code, et ça marchera très bien (modulo la légère perte de précision lors de la conversion, dont je suppose qu'elle n'aura pas d'impact dans ton cas).
Pour finir, une question de ma part :
pourquoi "void texte(std::string val);" et non "void texte(const std::string& val);" qui est plus rapide et probablement plus propre ? Tu modifies vraiment ta chaîne dans ta fonction ?