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 :

[AC++] Chapter 3: Problème de compréhension des vector


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut [AC++] Chapter 3: Problème de compréhension des vector
    Bonjour à tous,

    suite à de bonnes critiques sur AC++, je m'y met, avec mon anglais pas terrible, j'avance peut être un peu moins vite, mais ça va.

    J'en suis au chapitre III, le chapitre ou ils introduisent la notion de vector. tout d'abord, voici le code fourni pour exemple (et expliqué) :

    Code : 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
    57
    58
    59
    60
    #include <iostream>
    #include <iomanip>
    #include <ios>
    #include <string>
    #include <vector>
    #include <algorithm>
     
    using std::cin;
    using std::cout;
    using std::endl;
    using std::setprecision;
    using std::string ;
    using std::streamsize;
    using std::vector;
    using std::sort;
     
    int main()
    {
     
    cout <<"Entre ton nom : ";
    string name;
    cin >> name;
    cout << "Hello, "  << name << "!" << endl;
     
    cout << "entre ton midterm et final exam grades:";
    double midterm, final;
    cin >> midterm >> final ;
     
    cout << "Enter all your homework grades, "
            "followed by end of file" ;
     
    vector<double> homework;
    double x;
     
    while (cin >> x) {
        homework.push_back(x);
    }
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
     
    if (size == 0) {
        cout << endl << "You must enter your grades. "
                        "Please try again" ;
                        return 1;
    }
     
    sort(homework.begin(), homework.end());
     
    vec_sz mid = size / 2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid - 1]) / 2
                            : homework[mid];
     
    streamsize prec = cout.precision();
    cout << "Your final grades is " << setprecision(3)
        << 0.2 * midterm + 0.4 * final + 0.4 * median
        << setprecision(prec) << endl;
     
        return 0;
    }
    Voilà, alors tout d'abord, je récapitule ce que j'ai compris :

    Un vector, sert à stocker des valeurs, un peu comme un tableau ?

    Seulement voilà: quand on déclare un vector on fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<type>::nom_vector;
    Quand on enregistre les valeurs dedans à l'aide d'une boucle, je ne comprend pas pourquoi dans le code en haut, on rajoute une partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (cin >> x) {
        homework.push_back(x);
    }
    Pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (cin >> x) {
        homework(x);
    }
    ?

    push_back, signifie quelque chose de préderterminée, comme par exemple .size() ?( pour déterminer la taille d'un string ou vector...etc)
    Si la réponse est négative,, alors on peut en créer autant qu'on en souhaite ? Mais quel interêt ?

    Encore une petite incompréhension de cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    median = size % 2 == 0 ? (homework[mid] + homework[mid - 1]) / 2
                            : homework[mid];
    J'ai bien compris la syntaxe de la structure conditionelle ! ( x == x ? y : z c'est ce qui a à l'intérieur,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (homework[mid] + homework[mid - 1]) / 2
    , a ma souvenance, mid, on l'a déclaré nul part , à quoi sert t'il ?, lorsqu'on prend un vector et qu'on ajoute un paramètre entre crochets, que signifie ça ?
    Pour là, on ne prend pas le .push_back() au lieu de homework ?

    Merci beaucoup, et désolé du gro pavé, j'espère avoir été assez claire !

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Oui un vector est bien un tableau,, une collection d'objets. Mais il est dynamique, c'est à dire que tu peux rajouter des éléments en fin _via push_back() mais j'y reviendrais plus tard_ sans avoir à t'occuper de faire des allocations / réallocations dynamiques. (t'a l'air de venir du C..)

    push_back() est une méthode de la class vector. Vu que t'a pas encore vu la notion d'objet tu ne sais pas ce qu'est une méthode, t'inquiétes pas ça viendra vite avec AC++. En gros le push_back() est une fonction qui te permet de rajouter un élément à la fin de ton vector, et c'est cette fonction qui s'occupe de réallouer le tableau si sa taille ne suffit pas pour contenir le nouveau nombres d'éléments. la notation vector.méthode(T x) est une notation de l'orienté objet, en suivant le livre tu n'a pas pour l'instant à t'en préocuppé, juste retenir que ça marche comme ça .


    Pour le mid il est définit ici :
    sachant que vec_sz est en fait un typedef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef vector<double>::size_type vec_sz;
    Enfin l'opérateur [] te permet d'accéder aux éniémes élément de cette façon vector[n] tout comme avec un tableau C-style. (petite précaution toutefois le vector commence comme les tableaux à 0 et non à 1, donc le dernier élément est fourni par size()-1.


    Si j'ai oublié des choses hésite pas à poser d'autres questions.

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Citation Envoyé par devatt Voir le message
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    //...
    vec_sz mid = size / 2;
    C'est une truc de puriste ça.
    Si tu comprends bien ces deux lignes, parfait, sinon sache qu'on peut aussi écrire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Directement, sans avoir à écrire le typedef
    unsigned int size = homework.size(); // conversion implicite en unsigned int, c'est à dire entier positif ou nul
    unsigned int mid = size / 2;
    C'est une affaire de gout. Je me souviens d'un collègue qui mettait un point d'honneur à n'utiliser que des size_type partout et qui enrageait de voir le reste des programmeurs se contenter d'unsigned int.

    Citation Envoyé par devatt Voir le message
    Seulement voilà: quand on déclare un vector on fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<type>::nom_vector;
    Pas tout à fait.
    On déclare un vecteur comme une variable classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //type nom_variable;
    int a; // le type de a est int
    vector<float> mon_vecteur; // le type de mon_vecteur est vector<float>
    Citation Envoyé par devatt Voir le message
    push_back, signifie quelque chose de préderterminée, comme par exemple .size() ?
    Tout à fait, push_back ça veut dire "pousser à l'arrière"
    C'est une fonction membre de la classe vector, comme la fonction size(), qui permet d'insérer des éléments un par un à l'arrière (la fin) du vecteur. L'avantage de la STL, c'est qu'elle est assez uniforme, donc on retrouve cette fonction souvent (pour les string, les listes etc.). Accelerated C++ introduit la notion de classe et fonction membre un peu plus loin.

    Citation Envoyé par devatt Voir le message
    Encore une petite incompréhension de cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    median = size % 2 == 0 ? (homework[mid] + homework[mid - 1]) / 2
                            : homework[mid];

    J'ai bien compris la syntaxe de la structure conditionelle ! ( x == x ? y : z
    Mmm tu es bien sûr ? Juste au cas ou, voici le code sous une forme moins condensé, car la forme ternaire ? : n'est pas tellement évidente à lire (l'œil doit faire des aller-retour pour tout comprendre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(size % 2 == 0)
    {
       median = homework[mid] + homework[mid-1]) / 2;
    }
    else
    {
       median = homework[mid];
    }

    Citation Envoyé par devatt Voir le message
    c'est ce qui a à l'intérieur,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (homework[mid] + homework[mid - 1]) / 2
    , a ma souvenance, mid, on l'a déclaré nul part , à quoi sert t'il ?
    Ben si, deux lignes plus haut.
    En fait c'est une règle assez générale, contrairement au C on déclare les variables juste avant de les utiliser, comme ici.

    Citation Envoyé par devatt Voir le message
    Merci beaucoup, et désolé du gro pavé, j'espère avoir été assez claire !
    Pas de problème!
    Continue à t'accrocher, Accelerated C++ est vraiment un bon bouquin. Il me semble qu'il est surtout important de faire les exercices, histoire de faire des pauses franches dans la lecture et de bien assimiler les notions, car sinon on est vite noyé sous le flot de nouveauté introduit à chaque chapitre (pour être accéléré, c'est accéléré). Si tu as des soucis avec un des exos on pourra t'aider.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Merci à vous, goten et Arzar

    Juste quelque chose encore :

    cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    On définit un typedef d'un vector de type double et ayant pour nom size_type et on peut après l'appeler avec vec_sz ? mais si on veut (pour bien comprendre) ne pas faire de typedef, mais faire exactement la même chose que le code ci-dessus, comment si prends t'on ?

    Merci, ça m'a déjà bien aidé ! et j'ai commencé par apprendre les bases (rien de plus) du C.

    Autre question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(e1, e2); // définit dans algorithm
    J'ai pas tout à fait compris la définition de AC++, pouvez vous m'aider ?

    J'ai commencé à m'exercer en faisant un programme qui fait ça :

    Demande des noms
    Stockage dans un vector de type string
    Boucle pour autant de prénoms entrer et boucle pour les note
    Calcul moyenne de chacun et affichage

    Je commence, et le test, ma boucle pour entrer les noms, s'execute normal, mais ne fini pas comme je le souhaitais, par exemple, elle ne s'arrête pas ! Malgré le end, rien à faire ! est-ce dû au fait, que j'enregistre un type string, donc end est considéré comme caractère ?
    Merci

    Voici mon début de code :
    Code : 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
    #include <iostream>
    #include <iomanip>
    #include <ios>
    #include <string>
    #include <vector>
    #include <algorithm>
     
    using std::cin;
    using std::cout;
    using std::endl;
    using std::setprecision;
    using std::string ;
    using std::streamsize;
    using std::vector;
    using std::sort;
     
    int main()
    {
        vector<string> names;
        string x;
     
        cout << "Enter your names, followed by \'end\' ";
     
        while (cin >> x) {
            names.push_back(x);
        }
     
        unsigned int size_names = names.size(), i = 0;
     
        if (size_names == 0) {
            cout << "Please restart this programm" << endl;
            return 1;
        }
     
        double grades;
     
        vector<double> grades_students;
     
        while (i < size_names) {
     
            cout << "Hello " << names[i] << endl << "Please enter your grades followed by end" ;
     
            while (cin >> grades) {
                grades_students.push_back(grades);
                }
            ++i;
        }
     
     
        return 0;
    }

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par devatt Voir le message
    Merci à vous, goten et Arzar

    Juste quelque chose encore :

    cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    On définit un typedef d'un vector de type double et ayant pour nom size_type et on peut après l'appeler avec vec_sz ? mais si on veut (pour bien comprendre) ne pas faire de typedef, mais faire exactement la même chose que le code ci-dessus, comment si prends t'on ?
    Non! la déclaration d'un vector est sous la forme
    (il n'y a pas de :: entre le vector et le nom de la variable.)

    Ici l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<double>::size_type
    sert à récupéré la variable size_type correspondant à un vector de double... (je sais c'est pas clair, mais ça fait appel à des concepts que tu ne verras que plus loin.)

    Ce qui est important c'est que tu retiennes qu'un vector se déclare comme ça :

    Comme pour un objet string :
    à la différence que vector prend en paramètre le type d'objet que tu veux stocker dedans.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Ok goten pour l'introduction au vector (parce que je pense que c'est bien plus complexe, mais par la suite je verrais), et mon code (cf post au dessus ) qu'en penses tu ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    ah j'ai réussi à combler le problème, mais un autre intervient ,et je crois bien qu'il s'agit d'utiliser les structures que je n'ai pas vu, donc je reprendrais une fois les connaissances requises apprises.

    Merci pour votre aide et à bientôt (je pense)

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

Discussions similaires

  1. Problème de compréhension des Iterator
    Par ToTo13 dans le forum C++
    Réponses: 5
    Dernier message: 31/03/2010, 09h46
  2. Problème de compréhension des CSocket
    Par olator dans le forum MFC
    Réponses: 4
    Dernier message: 05/11/2008, 09h52
  3. Réponses: 3
    Dernier message: 16/06/2008, 17h15
  4. Réponses: 2
    Dernier message: 14/12/2007, 01h47
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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