CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++]Structures de données

krid-select
krid-select
Niveau 12
13 novembre 2017 à 06:23:06

Coucou,
j'ai un devoir à rendre bientôt et j'en ai déjà fait une partie mais voilà que je me retrouve larguée quand les choses étaient sensées devenir simple [[sticker:p/1kks]]
Bon alors pour faire simple je devais implémenter des structures de donner du type AVLtree et treeMAP.
Ca c'est fait j'ai passé tous les tests du prof RAS de ce côté [[sticker:p/1kki]]

Maintenant on a un fichier fourni avec une liste de requete ainsi que deux fichier à compléter.

Pour commencer il y a le fichier boutique (en fait un fichier boutique.h ainsi qu'un fichier boutique.cpp) qui implémente les classes boutiques ainsi que commande:

boutique.h :
https://pastebin.com/zfie9LRg

boutique.cpp:
https://pastebin.com/fyEHszpK

exo.cpp:
https://pastebin.com/QK5aLTb6 (ici tout fonctionne je dois juste compléter si certains trucs paraissent aberrant c'est juste que j'ai modifié le programme poru éviter le plagiat)

Donc voilà à quoi ça ressemble actuellement.
Je me suis dit que je devais ajouter des constructeurs à Commande mais quand j'essaie d'en ajouter un le programme ne compile plus :( .
Par exempel quand j'ajoute :

Commande(string, int); ~Commande();

dans la partie public de Commande{}
je me retrouve avec cette erreur :

error: no matching function for call to 'Commande::Commande()'
                                   Commande c;
                                            ^

Bon a part ça pour l'ordre Placer je me suis dit que je devait créer une nouvelle boutique avec les valeurs transmises. Du coup je peux appeler le constructeur de boutique (logique je pense) mais je sais aps trop quoi faire avec cette boutique. Devrais-je créer un AVLtree dans la classe exo dans lequel j'ajoute mes boutiques? ou alors dans la classe boutique je devrais avoir une liste de mes boutiques plutot (mais ça me paraitrait bizzare) .

bref je suis un petit peu perdu sur cette partie qui à l'air en apparence simple et mon partenaire ne semble pas plus dégourdi que moi.
Si vous pouviez aiguiller un petit peu notre équipe de bras cassé ce serait super. Merci d'avance

Bonne soirée

ps: en ce moment le programme compile mais renvoie des warnings je comprend pas trop vu que tous les tests donnés par le prof passent sans soucis mais c'est peut etre mon code dans commande qui est mauvais :
https://image.noelshack.com/fichiers/2017/46/1/1510550535-virtualbox-2017-11-13-00-21-34.jpg

godrik
godrik
Niveau 30
13 novembre 2017 à 07:48:52

la definition d'un constructeur desactive le constrcteur par defaut. tu dois le definir explicitement si tu en as besoin

TechnoForce3
TechnoForce3
Niveau 39
13 novembre 2017 à 07:50:40

Déjà pour tes warnings, si je me trompe pas, c'est que l'ordre dans lequel tu initialises tes attributs dans la liste d’initialisation n'est pas le même que celui dans lequel ils sont déclarés dans le .h de arbreavl (en tout cas, à chaque fois que j'ai eu ce warning, ça venait de ça).
Quand tu déclares le constructeur de Commande, tu fais bien un truc du style ?

.h
Commande(string, int);
~Commande();

.cpp
Commande::Commande(string name, int quantity) : 
commandes(name, quantity) //si tu as un constructeur dans ArbreMap de cette forme la
{
} 

Commande::~Commande()
{
}

Pour le reste, je sais pas trop, tu as discuté avec les autres membres de ta promo pour savoir ce qu'ils ont fait?

Message édité le 13 novembre 2017 à 07:52:28 par TechnoForce3
Refeuh
Refeuh
Niveau 28
13 novembre 2017 à 08:00:03

Edit : je simplifie mon post vu que la reponse a deja ete apportee concernant les constructeurs. Je garde juste 2 remarques :

- Tu devrais nommer les parametres dans la signature, car c'est souvent ce qui apparait dans les IDEs pour l'aide syntaxique, les popups de completions et les quick look-up pour facilement naviguer le code

- une bonne pratique consiste a toujours ecrire la forme canonique de chaque classe (constructor, copy constructor, assignment constructor, move constructor et destructor) ; ca evite d'en oublier et ca montre qu'on a reflechi au cycle de vie de son objet. Pour votre exo c'est du detail, mais a garder en tete pour plus tard sur des projets plus gros

TechnoForce3
TechnoForce3
Niveau 39
13 novembre 2017 à 08:16:14

Le 13 novembre 2017 à 08:00:03 Refeuh a écrit :
Edit : je simplifie mon post vu que la reponse a deja ete apportee concernant les constructeurs. Je garde juste 2 remarques :

- Tu devrais nommer les parametres dans la signature, car c'est souvent ce qui apparait dans les IDEs pour l'aide syntaxique, les popups de completions et les quick look-up pour facilement naviguer le code

- une bonne pratique consiste a toujours ecrire la forme canonique de chaque classe (constructor, copy constructor, assignment constructor, move constructor et destructor) ; ca evite d'en oublier et ca montre qu'on a reflechi au cycle de vie de son objet. Pour votre exo c'est du detail, mais a garder en tete pour plus tard sur des projets plus gros

On m'a apprit que la forme canonique c'était surtout pour les classes manipulant dynamiquement la mémoire car dans le cas des pointeurs, la recopie bit à bit que fait le compilateur n'est pas suffisante.

Refeuh
Refeuh
Niveau 28
13 novembre 2017 à 08:53:26

On peut laisser les declarations de constructors/destructor "inutiles" en commentaire si les implementations par defaut suffisent, mais ca reste une bonne pratique generale d'au moins les faire figurer. Ca garanti que le programmeur a pris le temps d'envisager tous les cas d'utilisation de sa classe tout en assurant une meilleure lisibilite par un autre developpeur, et facilite l'evolutivite si on rajoute des fonctionnalites a la classe par la suite.

Apres ce n'est pas une obligation, mais ca revient tres frequemment dans les "coding standards" des entreprises ou frameworks importants.

krid-select
krid-select
Niveau 12
13 novembre 2017 à 21:18:35

Coucou,
déjà merci pour votre aide. Alors j'ai pas tout à fait compris comment supprimer les warning mais voici ce que j'ai fait pour le moment :

boutique.h : 
class Commande{
  public:
    // À compléter
    Commande();
    Commande(const Commande& );
    ~Commande();  
    void ajouter(string, int);
  private:
    // À compléter
    ArbreMap<string,int> commandes;
    friend istream& operator>>(istream& is, Commande& c);
};

et

boutique.c: 
Commande::Commande()
{
}

Commande::Commande(const Commande& c)
{
    commandes = c.commandes;
}

void Commande::ajouter(string nomproduit,int quantite){
    commandes[nomproduit]=quantite;
}

Commande::~Commande()
{
    commandes.vider();
}

istream& operator>>(istream& is, Commande& c){
    string nomproduit;
    is >> nomproduit;
    while(is && nomproduit!=";"){
	int quantite;
        is >> quantite;
        c.ajouter(nomproduit,quantite); 
        is >> nomproduit;
    }
    return is;
}

Du coup j'ai laissé le constructeur vide sans code parce que dans le .h j'initialise déjà un arbre vide au nom commande donc je suppose que je n'ai pas besoin d'en faire plus de ce coté là?

J'ai mis la fonction ajouter qui prend les paramètres passés et ajoute un couple clé/valeur à mon arbre
et donc je l'appel dans ma surcharge d'opérateur.

donc a priori quand on a par exemple la ligne :


entree >> c;

ça va ajouter une liste de produits à ma commande c si je dis pas de betises. Du coup je crois que de ce coté je n'ai pas besoin d'une autre fonction.

Du coté de boutique j'ai un peu de mal a mapper son inventaire.
il est de la forme :

ArbreMap<ArbreMap<string,int>,Date> inventaire; // arbre [nom, quantite, peremption] inventaire

Du coup vu que pour mapper un arbre je fais :


arbre[clé]=valeur; 
logiquement 
arbre[[clé]=valeur]=valeur; // devrait etre la ligne pour mapper mon nouvelle arbre mais ça me parait pas du tout correct 

@refeuh habituellement je nomme mes parametres mais vu que dans le code du prof ils ne sont pas nommés j'ai préféré ne pas le faire vu qu'on nous demande d'adapter notre code pour qu'i lressemble au code existant mais je retient ton conseil, pour ton deuxieme conseil ej vais faire une petite recherche parce que je n'ai appris que le constructeur et le constructeur par copie

Bonne journée à vous

edit: je crois que je vais essayer de me créer un petit programme pour m'aider pour ce tp, si quelqu'un a une petite idée d'un programme simple qui va me faire utiliser l'arbreMap je veux bien ça m'aidera à y voir plus clair très certainement

Message édité le 13 novembre 2017 à 21:20:00 par krid-select
Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment