OVH Cloud OVH Cloud

[algorythme] Problème...

27 réponses
Avatar
Jean-Philippe Provost
Bonjour,

Dans mon livre, il me demande ceci à écrire, mais il ne me donne pas la
solution donc je demande ici :

"Écrivez un programme qui reçoit trois entiers entrés au clavier et
affiche la somme, la moyenne, le produit, le plus petit et le plus grand
de ces nombres."

Bref, j'ai beau essayé, mais mon code, j'en reste bloqué là :( ..

V'la le code:

// revision p55 no. 1.26
// wibo 2004
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
int nombre1, nombre2, nombre3, somme, moyenne, produit;

cout << "Entrez trois entiers differents: ";
cin >> nombre1 >> nombre2 >> nombre3;

somme = nombre1 + nombre2 + nombre3;
cout << "La somme est " << somme << endl;

moyenne = (nombre1 + nombre2 + nombre3) / 3;
cout << "La moyenne est " << moyenne << endl;

produit = nombre1 * nombre2 * nombre3;
cout << "Le produit est " << produit << endl;

if ( nombre1 < nombre2 or nombre1 < nombre3 )
cout << "Le plus petit nombre est " << nombre1 << endl;

if ( nombre2 < nombre1 or nombre2 < nombre3 )
cout << "Le plus petit nombre est " << nombre2 << endl;

if ( nombre3 < nombre1 or nombre3 < nombre2 )
cout << "Le plus petit nombre est " << nombre3 << endl;

if ( nombre1 > nombre2 or nombre1 > nombre3 )
cout << "Le plus grand nombre est " << nombre1 << endl;

if ( nombre2 > nombre1 or nombre2 > nombre3 )
cout << "Le plus grand nombre est " << nombre2 << endl;

if ( nombre3 > nombre1 or nombre3 > nombre2 )
cout << "Le plus grand nombre est " << nombre3 << endl;

return 0;
}


Merci @ tous.

10 réponses

1 2 3
Avatar
Serge Paccalin
Le lundi 12 juillet 2004 à 05:00, Jean-Philippe Provost a écrit dans
fr.comp.lang.c++ :

Bonjour,

Dans mon livre, il me demande ceci à écrire, mais il ne me donne pas la
solution donc je demande ici :

"Écrivez un programme qui reçoit trois entiers entrés au clavier et
affiche la somme, la moyenne, le produit, le plus petit et le plus grand
de ces nombres."

Bref, j'ai beau essayé, mais mon code, j'en reste bloqué là :( ..

V'la le code:

// revision p55 no. 1.26
// wibo 2004
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
int nombre1, nombre2, nombre3, somme, moyenne, produit;

cout << "Entrez trois entiers differents: ";
cin >> nombre1 >> nombre2 >> nombre3;

somme = nombre1 + nombre2 + nombre3;
cout << "La somme est " << somme << endl;


OK.

moyenne = (nombre1 + nombre2 + nombre3) / 3;
cout << "La moyenne est " << moyenne << endl;


Tu calcules deux fois nombre1 + nombre2 + nombre3, c'est dommage.

Petit problème d'arrondi.
Deux solutions :
1. Faire de moyenne un double (et diviser par 3.0).
2. Augmenter la somme avant de diviser, pour que le troncage de la
division donne un entier plus proche de la réalité.

produit = nombre1 * nombre2 * nombre3;
cout << "Le produit est " << produit << endl;


OK.

if ( nombre1 < nombre2 or nombre1 < nombre3 )
cout << "Le plus petit nombre est " << nombre1 << endl;


Pour que nombre1 soit le plus petit, il faut que nombre1 < nombre2 *ET*
nombre1 < nombre3.

Idem pour les autres.

Avec deux variables plus_petit et plus_grand, tu peux faire moins de
comparaisons, ce serait plus élégant.

--
___________ 2004-07-12 08:23:55
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
Twxs
Jean-Philippe Provost wrote:
Bonjour,
bonjour


Dans mon livre, il me demande ceci à écrire, mais il ne me donne pas la
solution donc je demande ici :

"Écrivez un programme qui reçoit trois entiers entrés au clavier et
affiche la somme, la moyenne, le produit, le plus petit et le plus grand
de ces nombres."

Bref, j'ai beau essayé, mais mon code, j'en reste bloqué là :( ..

V'la le code:



s'il s'agit d'un livre sur le c++, le but est peut etre
d'utiliser le for_each pour utiliser plusieurs effectuer
differentes operation sur un conteneur. Sinon, j'avoue ne pas comprendre
l'interet profond d'un tel exercice...


vector<int> tableau;
struct Somme{
int res;
Somme() :res(0);
void operator(cont int & v){
res += v;
}
}somme;
for_each(tableau.begin(), tableau.end(), somme);
cout << "la somme est : " << somme.res << endl;


pose toi des question sur la scalabilité de ton code si l'on te demande
de saisir 256 nombres, ta strategie avec une variable par entree risque
de te faire perdre qq cheveux pour gerer les tests ;-)

Twxs

Avatar
Loïc Joly
Serge Paccalin wrote:


Pour que nombre1 soit le plus petit, il faut que nombre1 < nombre2 *ET*
nombre1 < nombre3.


Attention aux cas limite. Si n1 = n2 = 10 et n3 = 11, le test ci-dessus
ne trouvera jamais de nombre plus petit.

Personellement j'utiliserais (mais ça dépend beaucoup de l'ordre de
présentation des choses dans le bouquin) soit :

minVal = min (n1, min(n2, n3);

Soit (qui a l'avantage de marcher avec un nombre quelconque de données):
vector <int> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
v.sort();
minVal = v[0];

--
Loïc

Avatar
Loïc Joly
Twxs wrote:

s'il s'agit d'un livre sur le c++, le but est peut etre
d'utiliser le for_each pour utiliser plusieurs effectuer
differentes operation sur un conteneur. Sinon, j'avoue ne pas comprendre
l'interet profond d'un tel exercice...


Ca dépend peut-être si on est chapitre 1 ou chapitre 152.

--
Loïc

Avatar
Franck Branjonneau
Loïc Joly écrivait:

Personellement j'utiliserais (mais ça dépend beaucoup de l'ordre de
présentation des choses dans le bouquin) soit :

minVal = min (n1, min(n2, n3);


Oui. Nous cherchons un minimum.

Soit (qui a l'avantage de marcher avec un nombre quelconque de données):
vector <int> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
v.sort();
minVal = v[0];


Pas std::min_element() ?
--
Franck Branjonneau

Avatar
kanze
Jean-Philippe Provost wrote in message
news:<Z8nIc.33932$...

Dans mon livre, il me demande ceci à écrire, mais il ne me donne pas la
solution donc je demande ici :

"Écrivez un programme qui reçoit trois entiers entrés au clavier et
affiche la somme, la moyenne, le produit, le plus petit et le plus grand
de ces nombres."

Bref, j'ai beau essayé, mais mon code, j'en reste bloqué là :( ..


C'est pourtant tout simple :

#include <istream>
#include <ostream>
#include <iostream>
#include <vector>
#include <numeric>
#include <functional>

int
lireNombre()
{
int result ;
std::cout << "Entrer un nombre : " ;
while ( ! (std::cin >> result) ) {
std::cout << "nJ'ai dit un nombre"
"n Essayer encore : " ;
std::cin.clear() ;
std::cin.ignore( INT_MAX, 'n' ) ;
}
std::cin.ignore( INT_MAX, 'n' ) ;
return result ;
}

int
main()
{
static int const count = 3 ;
std::vector< int > v ;
while ( v.size() < count ) {
v.push_back( lireNombre() ) ;
}
std::sort( v.begin(), v.end() ) ;
std::cout << "somme = "
<< std::accumulate( v.begin(), v.end(), 0 )
<< std::endl ;
std::cout << "moyen = "
<< std::accumulate( v.begin(), v.end(), 0 ) / v.size()
<< std::endl ;
std::cout << "produit = "
<< std::accumulate( v.begin(), v.end(),
1, std::multiplies< int >() )
<< std::endl ;
std::cout << "plus petit = " << v.front() << std::endl ;
std::cout << "plus grand = " << v.back() << std::endl ;
return 0 ;
}

Tu rémarqueras que le fait de ne démander que trois nombres était un
piège. Qu'on en démande 3, ou 300, le code est rigueusement identique.

V'la le code:

// revision p55 no. 1.26
// wibo 2004
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
int nombre1, nombre2, nombre3, somme, moyenne, produit;


Un std::vector me semble plus indiqué pour les entrées.
Quant aux résultats, on ne s'en sert que pour les afficher
immédiatement. Pas besoin de les stocker, alors.

Et sauf des exceptions assez rares (la lecture d'un fichier en est un),
on ne déclare pas les variables sans les initialiser.

cout << "Entrez trois entiers differents: ";
cin >> nombre1 >> nombre2 >> nombre3;


Ce qui ne va pas donner quelque chose de bien si l'utilisateur entre
abc. Il faut gerer les erreurs en cas d'entrée.

somme = nombre1 + nombre2 + nombre3;
cout << "La somme est " << somme << endl;


Un vecteur et accumulate me semble plus indiquer.

moyenne = (nombre1 + nombre2 + nombre3) / 3;
cout << "La moyenne est " << moyenne << endl;


Dans la mésure où tu as sauvegardé la somme, pourquoi pas s'en servir ?

produit = nombre1 * nombre2 * nombre3;
cout << "Le produit est " << produit << endl;

if ( nombre1 < nombre2 or nombre1 < nombre3 )
cout << "Le plus petit nombre est " << nombre1 << endl;

if ( nombre2 < nombre1 or nombre2 < nombre3 )
cout << "Le plus petit nombre est " << nombre2 << endl;

if ( nombre3 < nombre1 or nombre3 < nombre2 )
cout << "Le plus petit nombre est " << nombre3 << endl;

if ( nombre1 > nombre2 or nombre1 > nombre3 )
cout << "Le plus grand nombre est " << nombre1 << endl;

if ( nombre2 > nombre1 or nombre2 > nombre3 )
cout << "Le plus grand nombre est " << nombre2 << endl;

if ( nombre3 > nombre1 or nombre3 > nombre2 )
cout << "Le plus grand nombre est " << nombre3 << endl;


Beaucoup de complexité pour rien. Si tu mettais les nombres dans un
vector, puis utiliser sort, tu aurais tout de suite et le plus grand et
le plus petit.

return 0;
}


À la fin, évidemment, il faut savoir le but de l'exercies. Quelque part,
j'ai une doute que ce soit de t'enseigner que l'addition s'écrit, la
multiplication -, et la sémantique des opérateurs > et <. Je ne peux
voir que deux intérêts possibles de ce genre d'exercise : que tu
apprennes la gestion des erreurs en entrée, ou que tu apprennes
l'utilisation de certaines fonctions de la bibliothèque standard. Ta
réponse a passé de côté des deux. (Le fait qu'on démande des entrées du
clavier suggère en fait très fort que le but, c'est bien la gestion de
l'erreur. Typiquement, pour ce genre de problème, quand ce n'est pas le
but, on prend les entrées des paramètres de la ligne de commande, c-à-d
argc et argv.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Loïc Joly
wrote:
À la fin, évidemment, il faut savoir le but de l'exercies. Quelque part,
j'ai une doute que ce soit de t'enseigner que l'addition s'écrit, la
multiplication -, et la sémantique des opérateurs > et <. Je ne peux
voir que deux intérêts possibles de ce genre d'exercise : que tu
apprennes la gestion des erreurs en entrée, ou que tu apprennes
l'utilisation de certaines fonctions de la bibliothèque standard.


J'en vois un troisième en fait : Avoir un hello world amélioré qui en
plus utilise la notion de variable. Pour quelqu'un débutant la
programmation, ça peut être une notion pas si triviale que ça.

--
Loïc

Avatar
Loïc Joly
Franck Branjonneau wrote:

Loïc Joly écrivait:

Soit (qui a l'avantage de marcher avec un nombre quelconque de données):
vector <int> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
v.sort();
minVal = v[0];



Pas std::min_element() ?


Je considère que sort fait partie de ce qui est vraiment utile, alors
que je vois plus min_element comme une curiosité. Pour ne pas noyer un
débutant, je préfère ne lui montrer que la partie emmergée de la STL,
plutôt que de le noyer en lui demandant de regarder ce qu'il y a en
dessous. De la même façon, dans ce contexte et pour calculer la somme,
j'éviterais accumulate, car si l'on veut faire la même chose avec des
double, il va falloir expliquer la différence entre 0 et 0.0, et donc
les règles d'évalutation des templates.

--
Loïc


Avatar
Alexandre
bonjour,

if ( nombre1 < nombre2 or nombre1 < nombre3 )


en plus de toutes les (très pertinentes) remarques des autres posts, notes
bien que le "OU" logique en C++ ne s'écrit pas "or" mais "||"

Avatar
Serge Paccalin
Le lundi 12 juillet 2004 à 19:59:12, Alexandre a écrit dans
fr.comp.lang.c++ :

if ( nombre1 < nombre2 or nombre1 < nombre3 )


en plus de toutes les (très pertinentes) remarques des autres posts, notes
bien que le "OU" logique en C++ ne s'écrit pas "or" mais "||"


Ne parle pas trop vite...

--
___________ 2004-07-12 20:15:41
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763


1 2 3