Problème calcul de somme avec boucle for [HELP PLZ]
Le
Bonjour, je dois faire un programme avec la boucle for à partir de cette entête :
/** Fonction maSomme
* @param n un entier
* @return un réél qui est la somme des 1/k pour k entre 1 et n si n est plus grand que 1, 0 sinon
**/
Voila ce que j'ai fais :
Code :
float maSomme(int n){
int s=0;
cout << "Entrer votre entier"<<endl;
cin>>n;
for(int k=1; k<=n; k++){
if(n>1){
return s=s+1/k;
}else{return 0;
}
}
}
Le problème est que le prgm me donne à chaque fois en sortie 1 et non le résultat de la somme, des idées svp ?
/** Fonction maSomme
* @param n un entier
* @return un réél qui est la somme des 1/k pour k entre 1 et n si n est plus grand que 1, 0 sinon
**/
Voila ce que j'ai fais :
Code :
float maSomme(int n){
int s=0;
cout << "Entrer votre entier"<<endl;
cin>>n;
for(int k=1; k<=n; k++){
if(n>1){
return s=s+1/k;
}else{return 0;
}
}
}
Le problème est que le prgm me donne à chaque fois en sortie 1 et non le résultat de la somme, des idées svp ?
Le 02/03/2020 à 18:17, ThePoke a écrit :
Je ne suis pas spécialiste mais il me semble que return te fais sortir de la fonction.
Merci je l'ai remarquer, mais je ne vois pas ou le placer.
Bonjour, vous avez raison mais je vois tout de même pas ou le placer :/
[J'ai réindenté ton code pour que ce soit lisible.]
1. Tu dois retourner un réel mais tu retournes s qui est un int.
2. Tu lances une boucle qui n'est exécutée qu'une fois puisque quoi qu'il
arrive tu fais un return à la première itération.
3. 1 / k avec k == 1, ça fait toujours 1 donc s + 1 ça fait 1.
4. Ta fonction prend un argument mais tu ne l'utilises pas.
5. Que ce passe-t-il si n < 1 ?
--
Benoit Izac
1) Je dois donc changer la nature de mon S car je l'ai mis en entier alors que l'on demande un réel.
2)Oui je l'avais compris je dois déplacer ce return mais je ne vois pas ou :/
3)Oui dans ce cas ci c'est logique à cause de mon return la boucle s'execute qu'une seule fois.
4) L'argument n ? Je pense pourtant l'utiliser dans la condition car (5) si n<1 on doit afficher 0
Quelle horreur ! Benoît avait réindenté le code pour qu'il soit
lisible. Comment se fait-il que tout ce travail soit perdu ?
Oui.
Ce sont les deux « return » qui doivent être mis hors de la boucle.
Tu dois avoir un « return 0; » *avant* d'entrer dans la boucle si n est plus
petit que 1.
Et un « return s; » *après* avoir terminé toute la boucle qui calcule la
valeur de s.
--
Olivier Miakinen
Le 02/03/2020 à 20:06, thepoke a écrit dans le message
Oui.
Tu calcules la somme dans la boucle. Tu fais ton return une fois que la
boucle est finie (au passage ça réglera le problème 5 auquel tu n'as
pas répondu).
Oui.
float maSomme(int n)
^^^^^
Je parle du n quand tu appelles ta fonction :
cout << maSomme(-3) << endl; // -3 est écrasé par la saisie
cout << maSomme(42) << endl; // 42 est écrasé par la saisie
En fait il peut être utilisé si l'utilisateur saisie autre chose qu'un
nombre, ainsi « cin >> n; » ne modifiera pas n. Mais c'est quand même
tordu.
Donc soit :
float maSomme()
{
int n;
// ...
cin >> n;
}
Soit :
foat maSomme(int n)
{
// pas de cin >> n;
// ...
}
--
Benoit Izac
Un truc dans ce genre :
float maSomme() {
int n=0;
float s=0;
cout << "Entrer votre entier"<<endl;
cin>>n;
for(int k=1; k<=n; k++) s += (float) 1/k;
return s;
}
Pour le return s; je l'ai mis après la boucle for (avant la dernière {)
mais je n'ai pas bien compris pour le return 0; …
Car j'ai une boucle si n plus grand que 1, ensuite j'ai mon else pour si n plus petit que 1 mais je ne vois pas ou je pourrais déplacer le return 0;