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

[debutant] vector, variable globale, fonctions

7 réponses
Avatar
Olivier BURELLI
Bonjour,

suite =C3=A0 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=C3=A9 des activit=C3=A9s pour s'entrain=
er.

succinctement, je me propose de vous donner les instructions ayant
abouti =C3=A0 l'=C3=A9criture du code situ=C3=A9 en fin de post :

*Ecrire un programme consistant en une boucle while o=C3=B9 =C3=A0 chaque
it=C3=A9ration il doit =C3=AAtre lu deux entiers. *Modifier le programme af=
in
qu'il affiche "la plus petite valeur est : " petiteVal, de m=C3=AAme pour la
plus grande. *Ajouter ce qu'il faut pour que le programme affiche les
nombres sont =C3=A9gaux, 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 =C3=A9gaux, apr=C3=A8s av=
oir
affich=C3=A9 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 =C3=A0 chaque
passage. Pour chaque it=C3=A9ration, d=C3=A9finir deux variables, m=C3=A9mo=
riser la
plus petite valeur lue et la plus grande. Afficher "le plus petit
double lu est :" minLue, de m=C3=AAme pour le plus grand. *Ajouter une unit=
=C3=A9
=C3=A0 chaque double saisie, autrement dit, saisissez des valeurs comme
10cm, 2.5po, 5 pi les unites accept=C3=A9es sont (m)=C3=A8tres, (c)entim=C3=
=A8tres,
(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=C3=A8s le test des unit=C3=A9s =
si, la
valeur entr=C3=A9e ne correspond pas, il y aura quand m=C3=AAme une inserti=
on
dans le vector. Il me faudrait donc :

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


Hormis d=C3=A9clarer le vector en globale, mais tr=C3=A8s in=C3=A9l=C3=A9g=
ant
selon moi, je suis oblig=C3=A9 de passer des arguments (=C3=A9l=C3=A9ments =
de vector
pas de pb pour cela) aux fonctions.Il serait m=C3=AAme tentant pour moi de
passer un vector en argument, surtout pour le traitement de la boucle
for testant les =C3=A9galit=C3=A9 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=C3=A9der ?
Certes c'est un exercice, n=C3=A9anmoins, cela peut =C3=AAtre in=C3=A9l=C3=
=A9gant,
imaginons un vector de lignes de compte... que pr=C3=A9coniseriez vous ?

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

Voici mon code (std_lib_facilities.h regroupe les librairies necessaire
=C3=A0 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)=C3=A8tres, (c)entim=C3=A8tres, (p)ieds =
ou en
(P)ouces : ";

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

nombres.push_back(saisieLenght);

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

cout << "Le nombre saisie est\t: "=20
<< nombres[nombres.size() - 1] << endl << endl;

cout << "Le nombre de mots est\t: " << nombres.size()=20
<< endl;

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

cout << "La plus petite valeur lue jusqu'=C3=A0 pr=C3=A9sent est\t : "=20
<< min_Lue << endl;
cout << "La plus grande valeur lue jusqu'=C3=A0 pr=C3=A9sent est\t : "=20
<< max_Lue << endl;
cout << endl;

for (unsigned int i =3D 0; i < nombres.size(); ++i)
{
if (i !=3D 0)
{
if (nombres[i - 1] =3D=3D nombres[i])
{
cout << "Les nombres,\tnombres["=20
<< i - 1 << "] =3D " << nombres[ i - 1]
<< " et\tnombres[" << i << "] =3D "=20
<< nombres[i] << " sont =C3=A9gaux" << endl;
}
if (nombres[i] - nombres[i - 1] <=3D 0.01
&& nombres[i] - nombres[i - 1] >=3D -0.01)
{
cout << "Les nombres,\tnombres["=20
<< i - 1 << "] =3D " << nombres[i - 1]=20
<< " et\tnombres[" << i << "] =3D " << nombres[i]
<< " sont presque =C3=A9gaux" << endl;=20
}
}
}

cout << endl << "Resaisir un nombre\t: " ;
}

return 0;
}
[/code]

7 réponses

Avatar
Michael Doubez
On 14 juin, 01:51, Olivier BURELLI wrote:
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
Avatar
espie
In article ,
Olivier BURELLI wrote:
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...
Avatar
Lucas Levrel
Le 14 juin 2011, Michael Doubez a écrit :

On 14 juin, 01:51, Olivier BURELLI wrote:
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
Avatar
Olivier BURELLI

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.
Avatar
Olivier BURELLI
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.
Avatar
Olivier BURELLI
Le Tue, 14 Jun 2011 11:02:01 +0200,
Lucas Levrel a écrit :

Le 14 juin 2011, Michael Doubez a écrit :

> On 14 juin, 01:51, Olivier BURELLI wrote:
>> 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.
Avatar
Olivier BURELLI
Le Tue, 14 Jun 2011 11:02:01 +0200,
Lucas Levrel a écrit :

Le 14 juin 2011, Michael Doubez a écrit :

> On 14 juin, 01:51, Olivier BURELLI wrote:
>> 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.