cerhu > comp.lang.* > comp.lang.cpp

ThePoke (02/03/2020, 19h17)
Bonjour, je dois faire un programme avec la boucle for à partir de cette entêt
:
/** 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 plu
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 l
résultat de la somme, des idées svp ?
Michel__D (02/03/2020, 19h44)
Bonjour,

Le 02/03/2020 à 18:17, ThePoke a écrit :
[..]
> if(n>1){
> return s=s+1/k;
> }else{return 0;
> }
> }
> }
> 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.
thepoke (02/03/2020, 20h25)
Le lundi 02 Mars 2020 à 18:17 par ThePoke :
[..]
> if(n>1){
> return s=s+1/k;
> }else{return 0;
> }
> }
> }
> non le résultat de la somme, des idées svp ?

Merci je l'ai remarquer, mais je ne vois pas ou le placer.
thepoke (02/03/2020, 20h27)
Le lundi 02 Mars 2020 à 18:44 par Michel__D :
> Bonjour,
> 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.

Bonjour, vous avez raison mais je vois tout de même pas ou le placer :/
Benoit Izac (02/03/2020, 20h32)
Dans le message <upudnaQr1Ik-osDDnZ2dnUU798zNnZ2d>, le
02/03/2020 à 18:17, j'ai écrit :

[..]
> 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 ?
thepoke (02/03/2020, 21h06)
Le lundi 02 Mars 2020 à 19:32 par Benoit Izac :
[..]
> 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 qu
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'execut
qu'une seule fois.
4) L'argument n ? Je pense pourtant l'utiliser dans la condition car (5) si n<
on doit afficher 0
Olivier Miakinen (02/03/2020, 21h35)
Le 02/03/2020 20:06, thepoke répondait à Benoit Izac :

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.
Benoit Izac (02/03/2020, 21h47)
Bonjour,

Le 02/03/2020 à 20:06, thepoke a écrit dans le message
<QpydnaR_3N66xMDDnZ2dnUU798zNnZ2d> :

> 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;
// ...
}
Michel__D (02/03/2020, 21h50)
Le 02/03/2020 à 19:27, thepoke a écrit :
> Le lundi 02 Mars 2020 à 18:44 par Michel__D :
> 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;
}
thepoke (02/03/2020, 22h06)
Le lundi 02 Mars 2020 à 20:35 par Olivier Miakinen :
[..]
> 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 plu
petit que 1 mais je ne vois pas ou je pourrais déplacer le return 0;
Discussions similaires
Somme avec une date comme condition de calcul

DATEDIF et consort : calcul d'ancienneté avec somme de dates

somme d'une boucle

Calcul (somme) avec VBA


Fuseau horaire GMT +2. Il est actuellement 03h58. | Privacy Policy