[debutant] vector, variable globale, fonctions

Le
Olivier BURELLI
Bonjour,

suite à vos conseils, je poursuis mon apprentissage du C++ avec un
livre : Programmation, principes et pratiques avec C++ de Bjarne
Stroustrup. Accelerated C++, mon anglais est insuffisant :)

En fin de chapitre, il y est proposé des activités pour s'entrain=
er.

succinctement, je me propose de vous donner les instructions ayant
abouti à l'écriture du code situé en fin de post :

*Ecrire un programme consistant en une boucle while où à chaque
itération il doit être lu deux entiers. *Modifier le programme af=
in
qu'il affiche "la plus petite valeur est : " petiteVal, de même pour la
plus grande. *Ajouter ce qu'il faut pour que le programme affiche les
nombres sont égaux, si et seulement si, ils le sont. *Modifier le
programme pour qu'il utilise des doubles. *Modifier le programme pour
que le programme affiche les nombres sont presque égaux, après av=
oir
affiché le plus grand et le plus petit (au 1.0/100 eme) *Modifier le
corps de la boucle pour qu'elle ne lise qu'un seul double à chaque
passage. Pour chaque itération, définir deux variables, mémo=
riser la
plus petite valeur lue et la plus grande. Afficher "le plus petit
double lu est :" minLue, de même pour le plus grand. *Ajouter une unit=
é
à chaque double saisie, autrement dit, saisissez des valeurs comme
10cm, 2.5po, 5 pi les unites acceptées sont (m)ètres, (c)entimÃ=
¨tres,
(pi)eds et (po)uces. Supposez les facteurs de conversions. Placez les
symboles de l'unite dans une string.


Je bloque ici, je me rends bien compte, après le test des unités =
si, la
valeur entrée ne correspond pas, il y aura quand même une inserti=
on
dans le vector. Il me faudrait donc :

*Isoler les affichages dans des fonctions
*Isoler les traitement dans des fonctions


Hormis déclarer le vector en globale, mais très inélég=
ant
selon moi, je suis obligé de passer des arguments (éléments =
de vector
pas de pb pour cela) aux fonctions.Il serait même tentant pour moi de
passer un vector en argument, surtout pour le traitement de la boucle
for testant les égalité du vector. Cette boucle for me cause un g=
ros
soucis pour l'externaliser dans une fonction, puisque elle fait partie
de la boucle while.

Peut on simplement passer un vector en argument d'une fonction ?

ex : void Afficher(vector<double> mon_Vector);

Cela, est il une bonne facon de procéder ?
Certes c'est un exercice, néanmoins, cela peut être inélÃ=
©gant,
imaginons un vector de lignes de compte que préconiseriez vous ?

Y a t'il des choses que j'aurai mal apprehendé et qu'il faudrait que je
corrige ?

Voici mon code (std_lib_facilities.h regroupe les librairies necessaire
à la partie "base" du livre) :

[code]
// activites.cpp - Exercices de fin de chapitre
#include "std_lib_facilities.h"

int main()
{
vector<double> nombres;
double saisieLenght;
string saisieUnite;
// vector<string> unite;
double min_Lue;
double max_Lue;

cout << "Saisir une longueur en (m)ètres, (c)entimètres, (p)ieds =
ou en
(P)ouces : ";

while (cin >> saisieLenght >> saisieUnite) // >> saisieUnite)
{

nombres.push_back(saisieLenght);

if (saisieUnite == "cm")
{
cout << "vous avez saisie : " << saisieLenght << " Centimètres" << end=
l;
}
else if (saisieUnite == "m")
{
cout << "Vous avez saisie : " << saisieLenght << " Mètres" << endl;
}
else if (saisieUnite == "pi")
{
cout << "Vous avez saisie : " << saisieLenght << " Pieds" << endl;
}
else if (saisieUnite == "po")
{
cout << "Vous avez saisie : " << saisieLenght << " Pouces" << endl;
}
else cout << "Vous n'avez pas saisie la bonne unite" << endl;

cout << "Le nombre saisie estt: "
<< nombres[nombres.size() - 1] << endl << endl;

cout << "Le nombre de mots estt: " << nombres.size()
<< endl;

sort(nombres.begin(), nombres.end()); // trions le vector
min_Lue = nombres[0]; // valeur minimale lue
max_Lue = nombres[nombres.size() - 1]; // valeur maximale lue

cout << "La plus petite valeur lue jusqu'à présent estt : "
<< min_Lue << endl;
cout << "La plus grande valeur lue jusqu'à présent estt : "
<< max_Lue << endl;
cout << endl;

for (unsigned int i = 0; i < nombres.size(); ++i)
{
if (i != 0)
{
if (nombres[i - 1] == nombres[i])
{
cout << "Les nombres,tnombres["
<< i - 1 << "] = " << nombres[ i - 1]
<< " ettnombres[" << i << "] = "
<< nombres[i] << " sont égaux" << endl;
}
if (nombres[i] - nombres[i - 1] <= 0.01
&& nombres[i] - nombres[i - 1] >= -0.01)
{
cout << "Les nombres,tnombres["
<< i - 1 << "] = " << nombres[i - 1]
<< " ettnombres[" << i << "] = " << nombres[i]
<< " sont presque égaux" << endl;
}
}
}

cout << endl << "Resaisir un nombret: " ;
}

return 0;
}
[/code]
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michael Doubez
Le #23459431
On 14 juin, 01:51, Olivier BURELLI
suite à vos conseils, je poursuis mon apprentissage du C++ avec un
livre : Programmation, principes et pratiques avec C++ de Bjarne
Stroustrup. Accelerated C++, mon anglais est insuffisant... :)

En fin de chapitre, il y est proposé des activités pour s'entrainer.

succinctement, je me propose de vous donner les instructions ayant
abouti à l'écriture du code situé en fin de post :

*Ecrire un programme consistant en une boucle while où à chaque
itération il doit être lu deux entiers. *Modifier le programme afin
qu'il affiche "la plus petite valeur est : " petiteVal, de même pour la
plus grande. *Ajouter ce qu'il faut pour que le programme affiche les
nombres sont égaux, si et seulement si, ils le sont. *Modifier le
programme pour qu'il utilise des doubles. *Modifier le programme pour
que le programme affiche les nombres sont presque égaux, après avoir
affiché le plus grand et le plus petit (au 1.0/100 eme) *Modifier le
corps de la boucle pour qu'elle ne lise qu'un seul double à chaque
passage. Pour chaque itération, définir deux variables, mémoriser l a
plus petite valeur lue et la plus grande. Afficher "le plus petit
double lu est :" minLue, de même pour le plus grand. *Ajouter une unit é
à chaque double saisie, autrement dit, saisissez des valeurs comme
10cm, 2.5po, 5 pi les unites acceptées sont (m)ètres, (c)entimètres ,
(pi)eds et (po)uces. Supposez les facteurs de conversions. Placez les
symboles de l'unite dans une string.

Je bloque ici, je me rends bien compte, après le test des unités si, la
valeur entrée ne correspond pas, il y aura quand même une insertion
dans le vector. Il me faudrait donc :

*Isoler les affichages dans des fonctions
*Isoler les traitement dans des fonctions



Ou inserer dans le vector après la vérification de l'unité.

Je ne comprends pas en quoi le fait de faire appel à des fonctions
résoudrait le problème. Même si mettre en sous fonctions est une bonn e
idée pour la clarté.

Hormis déclarer le vector en  globale, mais très inélégant



Dans la mesure où tu n'as pas encore accès à toutes le notions et
techniques, ça peut être une solution. Surtout dans le cas d'une
fonction qui aurait deux informations à renvoyer: le succès de la
lecture et la valeur lue.

selon moi, je suis obligé de passer des arguments (éléments de vect or
pas de pb pour cela) aux fonctions.Il serait même tentant pour moi de
passer un vector en argument, surtout pour le traitement de la boucle
for testant les égalité du vector. Cette boucle for me cause un gros
soucis pour l'externaliser dans une fonction, puisque elle fait partie
de la boucle while.

Peut on simplement passer un vector en argument d'une fonction ?

ex : void Afficher(vector<double> mon_Vector);



C'est possible. A noter que tu ton vector<> sera copié pour être pass é
à la fonction.

Si tu as déjà vu cette notion dans le livre, tu peux aussi passer le
vector en paramètre par référence.

Cela, est il une bonne facon de procéder ?



De manière générale, il est bien de séparé les responsabilités en sous-
fonctions. Si tu as deux nombres à lire par itération, ça permet en
particulier de ne pas dupliquer le code.

Certes c'est un exercice, néanmoins, cela peut être inélégant,
imaginons un vector de lignes de compte... que préconiseriez vous ?

Y a t'il des choses que j'aurai mal apprehendé et qu'il faudrait que je
corrige ?



J'ai l'impression que l'énoncé de l'exercice ne fait pas intervenir de
vector<> mais seulement deux valeurs à comparer.

[snip: code]

--
Michael
espie
Le #23459591
In article Olivier BURELLI
Peut on simplement passer un vector en argument d'une fonction ?

ex : void Afficher(vector<double> mon_Vector);

Cela, est il une bonne facon de procéder ?
Certes c'est un exercice, néanmoins, cela peut être inélégant,
imaginons un vector de lignes de compte... que préconiseriez vous ?



C'est entre autres a ca que servent les references, a eviter de copier
inutilement des gros trucs comme des vecteurs.
Je propose

void Afficher(const vector<double>& mon_Vector);

Il y a des chances qu'Afficher n'ai pas a modifier mon_Vector, donc en
le passant par const ref, tu evites les copies, qui sont inefficaces, et
en plus tu t'assures que ta fonction ne fera pas de betise, comme modifier
l'objet qui lui est passe.

Ca revient bien sur a n'avoir qu'un seul objet vector, puisque celui-ci n'est
pas copie, mais ce qui est problematique dans les globales, c'est la facon
d'acceder a l'objet, qui est visible de la totalite du programme. A partir
du moment ou cet acces est limité (ce qui est le cas ici, puisque tu dois
passer le bon vecteur en parametre a ta fonction), tout va bien.

Mais bon, tout ceci est explique au chapitre 8...
Lucas Levrel
Le #23459581
Le 14 juin 2011, Michael Doubez a écrit :

On 14 juin, 01:51, Olivier BURELLI
Je bloque ici, je me rends bien compte, après le test des unités si, la
valeur entrée ne correspond pas, il y aura quand même une insertion
dans le vector. Il me faudrait donc :

*Isoler les affichages dans des fonctions
*Isoler les traitement dans des fonctions



Ou inserer dans le vector après la vérification de l'unité.



et finir ce test par

else {cout<<"Erreur d'unité, saisissez à nouveau :" ; continue ;}


--
LL
Olivier BURELLI
Le #23459741

J'ai l'impression que l'énoncé de l'exercice ne fait pas interv enir de
vector<> mais seulement deux valeurs à comparer.

[snip: code]

--
Michael





En fait, ces exercices font suite à un chapitre où y est abordà © les
six points suivants :

* Traitement des données
* Objectifs et outils (1 donner des resultats juste, 2 simples, 3
efficace)
* Expressions
* Instructions
* fonctions
* vector

Ne sachant pas comment trier hormis avec les élémnts acquis dans ce
chapitre avec un vector et la fonction sort, il me semblait évident que
je devais utiliser un vector.

effectivement, je me penche plus avant sur la mise en place de fonction.

Les références ne sont pas acquises, même si j'en ai une con naissance
par une autre lecture.

merci pour vos conseils.

Apparement il est necessaire que j'épure mon code... :p

en mode texte, le copier coller n'est pas bon dans le client de
messagerie.

Merci beaucoup.
Olivier BURELLI
Le #23459731
Le Tue, 14 Jun 2011 08:51:06 +0000 (UTC),
(Marc Espie) a écrit :

void Afficher(const vector<double>& mon_Vector);

Il y a des chances qu'Afficher n'ai pas a modifier mon_Vector, donc en
le passant par const ref, tu evites les copies, qui sont inefficaces,
et en plus tu t'assures que ta fonction ne fera pas de betise, comme
modifier l'objet qui lui est passe.

Ca revient bien sur a n'avoir qu'un seul objet vector, puisque
celui-ci n'est pas copie, mais ce qui est problematique dans les
globales, c'est la facon d'acceder a l'objet, qui est visible de la
totalite du programme. A partir du moment ou cet acces est limité (ce
qui est le cas ici, puisque tu dois passer le bon vecteur en
parametre a ta fonction), tout va bien.

Mais bon, tout ceci est explique au chapitre 8...



Merci beaucoup, effectivement je m'encombre de préceptes déjà   lu, mais
non abordé.

Je vais donc essayé de finir cet exercice sans ces
connaissances, et de le reprendre avec l'idee des références dans un
second temps.

Cdt,

Zolive.
Olivier BURELLI
Le #23459721
Le Tue, 14 Jun 2011 11:02:01 +0200,
Lucas Levrel
Le 14 juin 2011, Michael Doubez a écrit :

> On 14 juin, 01:51, Olivier BURELLI >> Je bloque ici, je me rends bien compte, après le test des unità ©s
>> si, la valeur entrée ne correspond pas, il y aura quand même une
>> insertion dans le vector. Il me faudrait donc :
>>
>> *Isoler les affichages dans des fonctions
>> *Isoler les traitement dans des fonctions
>
> Ou inserer dans le vector après la vérification de l'unità ©.

et finir ce test par

else {cout<<"Erreur d'unité, saisissez à nouveau :" ; continue ;}





Je vais tenter cette aproche, merci beaucoup pour les conseils.


cdt,

Zolive.
Olivier BURELLI
Le #23459991
Le Tue, 14 Jun 2011 11:02:01 +0200,
Lucas Levrel
Le 14 juin 2011, Michael Doubez a écrit :

> On 14 juin, 01:51, Olivier BURELLI >> Je bloque ici, je me rends bien compte, après le test des unità ©s
>> si, la valeur entrée ne correspond pas, il y aura quand même une
>> insertion dans le vector. Il me faudrait donc :
>>
>> *Isoler les affichages dans des fonctions
>> *Isoler les traitement dans des fonctions
>
> Ou inserer dans le vector après la vérification de l'unità ©.

et finir ce test par

else {cout<<"Erreur d'unité, saisissez à nouveau :" ; continue ;}





Je test en premier :

if (saisieUnite != "cm" && saisieUnite != "m"
&& saisieUnite != "pi" && saisieUnite != "po")
{
cout << "Vous n'avez pas saisie la bonne unite !!!" << endl;
cout << "Ressaisissez un nombre et son unité : " ;
}

else
{
if ( cm )
(...)
else if (m)
(...)


le reste de mon code (...)

}

là effectivement je n'ai pas besoin de fonctions.

Merci beaucoup pour l'orientation.
Publicité
Poster une réponse
Anonyme