IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Annale examen, besoin d'une correction


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut Annale examen, besoin d'une correction
    Bonjour, j'ai un examen en C++ demain midi, et je suis entrain de faire les annales du médian de l'année dernière. Cependant, il n'y a aucune correction, la moyenne de l'année dernière sur ce médian était catastrophique (au alentours de 7).

    Je voulais donc savoir si certains d'entre vous pouvaient m'éclairer en me disant si ce que j'ai fait est bon ou pas, et de me dire pourquoi non le cas échéant. Je n'ai pas pu aller en cours ni TD vu que 2 matières se chevauchaient, donc j'ai appris avec un bouquin de delanoy, enfin, j'ai lu le livre.


    Voici la photo du premier exercice avec l'annexe 1. Je vais séparer en plusieurs parties ce que j'ai fait, pour avoir le temps de tout recopier et d'avoir vos réponses au fur et à mesure.

    Merci pour votre aide en tout cas.

    Les images sont des photos très grande, et la feuille est prise en paysage au lieu de portrait, donc je met les liens, vraiment désolé pour l'inconfort que cela entraine.

    L'intitulé de l'exercice
    L'annexe correspondante


    Concernant mes réponses, je les poste tout de suite, je recopie ce que j'ai fait. Mais c'est vraiment quelquechose dont je ne suis absolument pas sur.

    Merci de votre aide


  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut Ma proposition:
    Question 1:

    J'ai choisi une structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //exo1.h
    struct vect{
    int taille;
    int * tab;
    }
     
     
    //exo1.cpp
     
     explicit vecteur(int n, const int* t){
    vect v = new vect(n);
    for(int i = 0; i< &t.length(); i++){
       vect[i] = &t[i];
    }

    Mais bon, je suis incapable de voir si j'ai bon ou quoi, jamais j'ai eu a proposer une structure. Si quelqu'un a un tuyau a me donner.

    Exlicit signifie je crois que le constructeur ne sera pas appelé a faire des modifications implicites.

    Voila pour la premiere question

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Yssss, tout faux. Il serait peut-être intéressant de tester ton code au compilateur tu ne crois pas?
    Déja, je ne vois pas pourquoi tu ajoutes une nouvelle structure pour contenir tes données, tu es déja dans une classe, tu dois juste ajouter ton int (au passage, un unsigned int ce serait mieux) à la définition de ta classe.
    Ensuite, pour ton constructeur:
    - tu mets un explicit dans la définition de ta fonction?
    - tu n'indiques pas la classe contenant ce constructeur?
    - c'est quoi ce vect v= new vect(n)???
    - c'est quoi ce &t.lenght???
    - et ce &t[i]???

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct vect{
    int taille;
    int * tab;
    }
    Ces membres devraient probablement être privés.
    De toutes façons ça me semble pas du tout être ce qui était demandé... On te demande de faire un vecteur, a priori en 2D.
    Ensuite ce n'est pas du tout dans l'espace de nom demandé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    explicit vecteur(int n, const int* t){
    vect v = new vect(n);
    for(int i = 0; i< &t.length(); i++){
       vect[i] = &t[i];
    }
    Jamais vu un tel concentré d'erreurs dans un code si court.
    Peut-être devrais-tu apprendre le C++.

    Déjà, le mot clé explicit ne s'applique qu'à des constructeurs, pas à des fonctions.
    new vect renvoie un vect*, pas un vect.
    Tu dois initialiser les membres de ta structure, pas en créer n dynamiquement.
    &t.length, je me marre. t est un pointeur, tu ne peux pas appliquer l'opérateur . dessus.
    &t[i] est de type const int*, vect[i] de type vect. Tu n'as donc pas d'opérateur d'affectation défini pour faire vect[i] = &t[i] (si jamais ça avait du sens d'en avoir un).

    Franchement, du grand art.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Merci de ton intervention.

    Je ne peux pas tester ce code au compilateur, car demain, je n'en aurais pas avec moi, je recopie simplement ce que j'ai fait sur ma copie.

    Concernant les immondicités &qqch, je suis vraiment paumé avec les pointeurs, je sais que quand on passe quelque chose par adresse, il faut mettre un & pour avoir la valeur, alors j'en ai mis un là...

    Concernant le fait de la création de la structure, l'énoncé dit:
    Choisir une structure de donnée adéquate pour implémenter cette classe. Je pensais donc qu'il fallait créer une structure vecteur.

    Sinon, pour la définition de la fonction avec explicit, c'est en rapport avec l'annexe. Je dois simplement le mettre dans le fichier .h?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par keumlebarbare
    Je ne peux pas tester ce code au compilateur, car demain, je n'en aurais pas avec moi, je recopie simplement ce que j'ai fait sur ma copie.
    Mais comment veux-tu apprendre un langage de programmation (surtout un aussi compliqué que le C++) si tu n'essaie pas de taper le moindre programme? Sérieusement, ton niveau est tellement bas que si tu veux apprendre en demandant sur des forums, ça va te prendre des siècles. Tapes ton code dans un éditeur (genre DevC++), vois si ça compile, vois si ça fonctionne puis viens nous redemander si il y a un truc précis que tu ne comprends pas. Nous ne sommes pas la pour faire les devoirs, d'autant plus que dans ton cas ce sera inutile puisque ça ne te permettra pas de réussir ton exam.

    Citation Envoyé par keumlebarbare
    Concernant les immondicités &qqch, je suis vraiment paumé avec les pointeurs, je sais que quand on passe quelque chose par adresse, il faut mettre un & pour avoir la valeur, alors j'en ai mis un là...
    Mais non, un & c'est pour avoir l'adresse, il faut un * pour la valeur. Mais la c'est un tableau, c'est spécial. Il faut juste faire t[i] pour avoir une valeur.

    Citation Envoyé par keumlebarbare
    Sinon, pour la définition de la fonction avec explicit, c'est en rapport avec l'annexe. Je dois simplement le mettre dans le fichier .h?
    D'après ce que j'ai compris de l'énoncé, tu dis ce que tu veux rajouter dans la définition de la classe puis tu dis ce que tu veux mettre dans le cpp.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut loufoque
    Ha mais je viens ici pour apprendre, véritablement!

    J'ai vraiment comme tu l'as souligné de gros soucis :s.

    Mais bon, je fais mon meaculpa en venant demander votre aide, je suis déterminé à pas mettre des conneries de ce genre dans ma copie, je préfère les faire ici


    Donc, concernant le ., effectivement, c'est une inattention, il faut mettre ->

    Ensuite, le namespace je ne l'ai juste pas fait figurer ici pour ne pas trop surcharger mes posts.

    cela donnerait donc une classe et pas un struct si j'ai suivi vos remarques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    namespace MEDIAN{
    class Vecteur{
     
    private:
    int longeur;
    int * tab;
     
    public:
    explicit vecteur...
    }
    }
    Et dans le cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "exo1.h"
     
    MEDIAN::Vecteur::vecteur(int n, int * t){
    longueur = n;
    tab = &t; // syntaxe correcte, ou dois-je faire une boucle pour remplir ?
    }

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut zais_ethael
    Concernant le fait que je devrais coder en C++, j'ai essayé de le faire, bien sur, mais le truc, c'est qu'il manque beaucoup de code dans son annexe pour faire fonctionner, et vu que je commence, bah c'est pas facile.

    Mais j'ai fait plusieurs choses en C++.. il y a 8 mois :s

    Après, j'ai eu le java à apprendre, et j'ai trouvé ca un peu plus simple.

    Mais je pense que ce qu'il me faut, ce sont pas des corrections dans le sens, je vous fait faire les annales, ce sont des corrections de penser pour moi, je m'adapte normalement très vite a ce que vous dites, pour progresser, mais là, j'ai pas eu le temps de le faire avant. C'est pour ca que je vous sollicite ce soir.

  9. #9
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Question 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    virtual MEDIAN::Vecteur::~vecteur(vect v){
    if(v.longueur != 0){
    delete[] v;
    }
    }
     
    MEDIAN::Vecteur::vecteur(const vecteur * v):longeur(v.longueur), tab(v.tab){}

    Je pense qu'on n'a pas besoin de l'opérateur d'affectation.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Bon, c'est déja un peu mieux. Mais c'est pas encore ça.
    Tout d'abord, on te passe en argument un const int*, pas un int*, tu ne peux donc pas l'affecter comme ça (chose qu'un compilateur t'aurait très bien expliqué). En plus pourquoi prendre l'adresse de l'adresse de ton tableau??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    longueur = n;
    tab = new int[n];
    for(int i=0;i<n;i++) {
       tab[i]=t[i]
    }
    Mais il y a aussi une subtilité supplémentaire, dans le header le constructeur est déclaré avec la valeur par défaut 0 pour t (donc NULL). Donc il faut tester le cas où ce pointeur est NULL. Si ton pointeur est NULL et que sa longueur ne l'est pas, on peut supposer qu'il faut initialiser un tableau de int avec une valeur par défaut pour chaque élément du vecteur (on va probablement utiliser 0). Et pour le cas où n==0, ha ben la il faut trouver une astuce (probablement mettre tab à NULL).
    Finalement, pour le "explicit", ça sert d'empècher le transtypage implicite d'un int vers un vecteur.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par keumlebarbare
    Question 2:
    ...
    Je pense qu'on n'a pas besoin de l'opérateur d'affectation.
    Si, plein Et puis ne teste pas si ta longueur!=0, on s'en fout, teste si tab!=NULL
    ET COMPILE TON CODE!

  12. #12
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    transtypage implicite d'un int vers un vecteur.
    Celui là, je le met de coté, ca peut toujours servir. Je suis entrain de comprendre la démarche qu'il faut utiliser. C'est vraiment sympa de m'expliquer comme ca, j'avance plus vite que de rester 3 heures comme cet après-midi sur des exos qui ne me parlaient pas. Le compilateur, il me dit mon erreur, mais il m'explique pas pourquoi, alors que là, j'ai l'expérience des autres à ma disposition.



    Concernant l'opérateur d'affectation, ce sont les setter, mais sur l'énoncé, il disait de pas les mettres ^^, enfin, un truc du genre. En effet, je vais donc lancer mon visual studio, et je poste tout à l'heure mon résultat.

    merci en tout cas

  13. #13
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Bon, je pense que je vais pouvoir m'en tirer demain grâce à vos conseils, vous m'avez permis de voir un peu la démarche qu'il fallait utiliser, et je vous en suis très reconnaissant.

    J'aurais cependant quelques questions non pas de code mais d'esprit C++:

    Pour la question 4, pourquoi doit on définir 2 fois operator? Est-ce parce que certaines fois on ne voudra pas changer sa valeur et d'autres fois si...?
    Je sais qu'il y a une histoire d'accéder aux valeurs de l'objet sans les modifier, mais ce n'est pas une réponse acceptable dans une copie


    Merci encore

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    On veut pouvoir faire v[3] = 42. Dans ce cas, comme on veut modifier l'objet v, l'opérateur[] est non constant. Il doit retourner une valeur qui permet de modifier la donnée interne, le plus souvent une référence sur cette donnée interne, parfois une classe proxy, quand on veut contrôler plus finement ce qui se passe.

    Maintenant, on veut pouvoir faire a = v[3], et ce même si v est un vecteur constant. On défini alors une version const de l'opérateur[] qui ne permet pas la modification. Pour y parvenir, la valeur de retour de cette version ne doit pas permettre de modifier les données internes. On retourne alors soit par copie, soit par référence constante.

    Piège : Il est faux de penser que la version const est appelée en lecture, et le non const en écriture. Seul le type de this entre en compte. a = v[3] appellera la version const si v est const, la version non const s'il ne l'est pas.

  15. #15
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Merci pour cette précieuse information, maintenant ca va être à moi de remettre tout ca en ordre dans la copie

    Merci à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'une correction (MCC)
    Par HeraclesAlmelo dans le forum Merise
    Réponses: 2
    Dernier message: 27/10/2010, 21h17
  2. Réponses: 3
    Dernier message: 27/10/2010, 15h47
  3. Réponses: 2
    Dernier message: 06/04/2010, 00h36
  4. Besoin d'une correction sur une requête
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/12/2007, 18h47
  5. besoin d'une correction sur un exercice.
    Par phakso dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 03/03/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo