IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Open source et architecture logicielle

[Actualité] Un panier en C++

Note : 4 votes pour une moyenne de 3,00.
par , 15/06/2015 à 09h08 (2461 Affichages)
Devant me plonger dans le C++ pour maintenir un logiciel écrit dans les années 90, je propose dans ce post une implémentation d'un panier avec la STL.
je ne pense pas que ce type de developpment merite que d'être publié sur les sources DVP C++. Si quelq'un pense que je devrais au contraire le publier je leferai alors.

Voici le main.cpp pour que tout le monde comprenne ce que peut faire ce panier basique :
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#include "Panier.h"
 
int main(int argc, char* argv[])
{
	Panier * panier = new Panier();
	panier->ajouterArticle(1, 2, 50);
	panier->ajouterArticle(2, 2, 100);
	panier->ajouterArticle(3, 1, 150);
	panier->ajouterArticle(1, 3, 50);
	cout << panier->calculerPanier() << endl;
	cout << panier->supprimerArticle(2) << endl;;
	cout << panier->calculerPanier() << endl;
	return 0;
}
j'ai opté comme je l'aurai fait en PHP pur une ligne panier et un panier dont voici les sources:
LignePanier.h
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
 
class LignePanier
{
private:
	int codeArticle;
	int qteArticle;
	int prixArticle;
public:
	LignePanier(int code, int qte, int prix);
	int getCode(void);
	int ajouterQte(int qte);
	int calculerLigne(void);
	LignePanier(const LignePanier &ligne);
public:
	~LignePanier(void);
};
LignePanier.cpp
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "LignePanier.h"
 
LignePanier::LignePanier(int code, int qte, int prix)
{
	this->codeArticle = code;
	this->qteArticle = qte;
	this->prixArticle = prix;
}
 
LignePanier::~LignePanier(void)
{
}
int LignePanier::calculerLigne(void)
{
	return (this->qteArticle * this->prixArticle);
}
LignePanier::LignePanier(const LignePanier &ligne)
{
	this->codeArticle = ligne.codeArticle;
	this->prixArticle = ligne.prixArticle;
	this->qteArticle = ligne.qteArticle;
}
int LignePanier::ajouterQte(int qte)
{
	this->qteArticle += qte;
	return 0;
}
int LignePanier::getCode(void)
{
	return this->codeArticle;
}
Panier.h
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "LignePanier.h"
#include <list>
#include <iostream>
#include <string>
using namespace std ;
class Panier
{
private:
	list<LignePanier> listeArticles; 
public:
	Panier(void);
	int ajouterArticle(int code, int qte, int prix);
	LignePanier getArticle(int code);
	int supprimerArticle(int code);
	int calculerPanier(void);
 
public:
	~Panier(void);
};
Panier.cpp
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
#include "Panier.h"
 
Panier::Panier(void)
{
}
 
Panier::~Panier(void)
{
}
 
int Panier::ajouterArticle(int code, int qte, int prix)
{
	LignePanier ligne = this->getArticle(code);
	if (ligne.getCode() == code) 
	{
		ligne.ajouterQte(qte);
		this->supprimerArticle(code);
	}
	else  ligne = LignePanier(code, qte, prix);
	this->listeArticles.push_back(ligne);
	return 0;
}
 
LignePanier Panier::getArticle(int code)
{
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter) 
	{
		if  (code == iter->getCode())
			return (*iter);
	}
	LignePanier li = LignePanier(0, 0, 0);
	return li;
 
}
int Panier::calculerPanier(void)
{
	int total = 0;
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter) 
	{
		total += iter->calculerLigne();
	}
	return total;
}
int Panier::supprimerArticle(int code)
{
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter) 
	{
		if  (code == iter->getCode())
		{
			this->listeArticles.erase(iter);
			return 0;
		}
	}
	return 0;
}

Envoyer le billet « Un panier en C++ » dans le blog Viadeo Envoyer le billet « Un panier en C++ » dans le blog Twitter Envoyer le billet « Un panier en C++ » dans le blog Google Envoyer le billet « Un panier en C++ » dans le blog Facebook Envoyer le billet « Un panier en C++ » dans le blog Digg Envoyer le billet « Un panier en C++ » dans le blog Delicious Envoyer le billet « Un panier en C++ » dans le blog MySpace Envoyer le billet « Un panier en C++ » dans le blog Yahoo

Mis à jour 15/07/2015 à 20h35 par autran

Tags: c++, stl
Catégories
Programmation , C++

Commentaires

  1. Avatar de ambroise_petitgenet
    • |
    • permalink
    Bonjour ,

    Alors tout d'abord c'est un code simple et fonctionnel. C'est déjà pas mal voir énorme.

    Après je ne suis pas sur que ce code soit robuste aux évolutions, même si en soit ce code ne demande pas à évoluer.
    Je m'explique, mon soucis est sur les lignes de type :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    LignePanier li = LignePanier(0, 0, 0);

    En fait ca marche bien parce que dans LignePanier il n'y a que des membres simples : int
    Mais si on avait un pointeur sur quelque chose genre
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int codeArticle;
    int qteArticle;
    int prixArticle;
    char *designationArticle;

    Je grossis le trait car on aurait plutôt utiliser une std::string, mans dans ce cas la ligne "LignePanier li = LignePanier(0, 0, 0);" pose soucis car on va recopier le pointeur et non refaire une allocation mémoire et y copier les données.
    Ce qui veut dire avec
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    LignePanier Panier::getArticle(int code)
    {
    	for (list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter)
    	{
    		if (code == iter->getCode())
    			return (*iter);
    	}
    	LignePanier li = LignePanier(0, 0, 0);
    	return li;
     
    }
    A la sortie de la fonction, si le destructeur de LignePanier libére la mémoire, on a designationArticle qui pointe sur une zone mémoire non disponible et donc lors de l'acces crash mémoire.

    Autre exemple lors du egal
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LignePanier li1 = LignePanier(0, 0, 0);
    LignePanier li2 = li1;
    Le faut de modifier designationArticle de li2, modifie designationArticle de li1.

    Ce qu'il faudrait rajouter dans LignePanier c'est la surcharge de l'opérateur =.

    Après c'est juste un point de vu personnel. Ce code fonctionne bien et il est lisible et c'est bien pour cela que j'ai vu le "possible" problème. Donc moi ça me va.

    Allez je vais chipoter encore un peu
    Je rajouterais des const pour éviter des modifications qui ne devrait pas exister

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    class LignePanier
    {
    private:
    	int codeArticle;
    	int qteArticle;
    	int prixArticle;
    public:
    	LignePanier( const int code, const int qte, const int prix);
    	int getCode(void) const;
    	int ajouterQte( const int qte);
    	int calculerLigne(void) const;
    	LignePanier(const LignePanier &ligne);
    public:
    	~LignePanier(void);
    };

    Par exemple, mais bon c'est du chipotage

    En tout cas je le redis code simple et efficace, c'est good

    Ambroise
  2. Avatar de G.castelain
    • |
    • permalink
    Je me dis que ce genre de code c'est un truc qui peut être très puissant dans un arduino avec un petit jeu de led adressable. On a vite une petite caisse de préparation de commande ou d'enregistrement de stock marchandise.
  3. Avatar de autran
    • |
    • permalink
    Oui Castelain, tu as raison il y a une opportunité.
    Je n'y avais pas pensé.
    Dommage que je n'ai jamais eu le courage de me pencher sur Arduino