Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème calcul de somme avec boucle for [HELP PLZ]

9 réponses
Avatar
ThePoke
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 ?

9 réponses

Avatar
Michel__D
Bonjour,
Le 02/03/2020 à 18:17, ThePoke a écrit :
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 ?

Je ne suis pas spécialiste mais il me semble que return te fais sortir de la fonction.
Avatar
thepoke
Le lundi 02 Mars 2020 à 18:17 par ThePoke :
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 ?
Merci je l'ai remarquer, mais je ne vois pas ou le placer.
Avatar
thepoke
Le lundi 02 Mars 2020 à 18:44 par Michel__D :
Bonjour,
Le 02/03/2020 à 18:17, ThePoke a écrit :
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 ?
Je ne suis pas spécialiste mais il me semble que return te fais sortir
de la fonction.
Bonjour, vous avez raison mais je vois tout de même pas ou le placer :/
Avatar
Benoit Izac
Dans le message , le
02/03/2020 à 18:17, j'ai écrit :
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 ?

[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
Avatar
thepoke
Le lundi 02 Mars 2020 à 19:32 par Benoit Izac :
Dans le message
02/03/2020 à 18:17, j'ai écrit :
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 ?
[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
Avatar
Olivier Miakinen
Le 02/03/2020 20:06, thepoke répondait à Benoit Izac :
[...]
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;
}
}
}



Quelle horreur ! Benoît avait réindenté le code pour qu'il soit
lisible. Comment se fait-il que tout ce travail soit perdu ?
[...]


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.

Oui.
2)Oui je l'avais compris je dois déplacer ce return mais je ne vois pas ou :/

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
Avatar
Benoit Izac
Bonjour,
Le 02/03/2020 à 20:06, thepoke a écrit dans le message
 :
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 ?

[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 ?

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.

Oui.
2)Oui je l'avais compris je dois déplacer ce return mais je ne vois pas ou :/

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).
3)Oui dans ce cas ci c'est logique à cause de mon return la boucle
s'execute qu'une seule fois.

Oui.
4) L'argument n ? Je pense pourtant l'utiliser dans la condition car
(5) si n<1 on doit afficher 0

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
Avatar
Michel__D
Le 02/03/2020 à 19:27, thepoke a écrit :
Le lundi 02 Mars 2020 à 18:44 par Michel__D :
Bonjour,
Le 02/03/2020 à 18:17, ThePoke a écrit :
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 ?

Je ne suis pas spécialiste mais il me semble que return te fais sortir
de la fonction.

Bonjour, vous avez raison mais je vois tout de même pas ou le placer :/

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;
}
Avatar
thepoke
Le lundi 02 Mars 2020 à 20:35 par Olivier Miakinen :
Le 02/03/2020 20:06, thepoke répondait à Benoit Izac :
[...]
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;
}
}
}


Quelle horreur ! Benoît avait réindenté le code pour qu'il
soit
lisible. Comment se fait-il que tout ce travail soit perdu ?
[...]

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.
Oui.
2)Oui je l'avais compris je dois déplacer ce return mais je ne vois pas
ou :/
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
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;