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 :

Besoin d'aide sur les tableaux en C++


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut Besoin d'aide sur les tableaux en C++
    Bonjour, j'ai un problème sur un exercice, plus précisément sur les tableaux j'aurais besoin de vos conseil.. j'ai besoin de votre aide!
    Le code ci dessous concerne un tableau qui affiche des entiers aléatoires avec lesquels on dois effectuer différent calcul malheureusement je bug sur les calculs il m'affiche des valeurs complètement absurdes (Il m'affiche par exemple le calcul de la somme en Hexadécimal (0x6dfea8).

    OUI CE N'EST ABSOLUMENT PAS ESPACE AVEC LES ACCOLADES.. mais c'est le copié coller merci de ne pas en prendre compte svp.


    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    int main(int argc, char *argv[])
    {
     
        char choix=0;
        const int TAILLE=10;
        int tabEntiers[TAILLE];
        const int MAX=20;
        const int MIN=1;
        int i,somme;
        float moyenne;
     
     
        srand (time(NULL));
     
        for (i=0; i<TAILLE; i++)
        {
            tabEntiers[i] = (rand() % (MAX - MIN + 1)) + MIN;
        }
        while (choix!='7')
        {
     
     
            cout <<"**********MENU**********\n\n";
            cout <<"Afficher le contenu du tableau à l'ecran \t\t:1\n\n";
            cout <<"Calculer la somme des valeurs contenue dans le tableau \t\t:2\n\n";
            cout <<"Calculer la moyenne des valeurs contenues dans le tableau \t\t:3\n\n";
            cout <<"Rechercher le minimum dans le tableau et l’afficher à l'ecran \t\t:4\n\n";
            cout <<"Rechercher le maximum dans le tableau et l’afficher à l’ecran \t\t:5\n\n";
            cout <<"Decaler de une place vers la droite toutes les valeurs du tableau \t\:6\n\n";
            cout <<"Quitter l'application' \t\t\t:7\n\n\n";
     
     
            cout <<"Quel est votre choix?\n";
            cin >>choix;
                switch (choix)
                 {
                    case '1':
                        cout <<"Vous avez choisi l'option 1\n";
     
                        for (i=0;i<TAILLE;i++)
                        {
                            cout <<tabEntiers[i] <<"\n";
                        }
                        break;
     
                    case '2':
                        somme=0;
                        cout <<"Vous avez choisi l'option 2\n";
     
                        for (i=0 ; i<tabEntiers ; i++)
                        {
                        somme+=tableau[i];
                        }
                        break;
     
                    case '3':
                        cout <<"Vous avez choisi l'option 3\n";
                        moyenne /=tabEntiers;
                        cout <<"Votre moyenne est:"<<moyenne <<"\n";
                        break;
     
                    case '4':
                        cout <<"Vous avez choisi l'option 4\n";
                        break;
     
                    case '5':
                        cout <<"Vous avez choisi l'option 5\n";
                        break;
     
                    case '6':
                        cout <<"Vous avez choisi l'option 6\n";
                        break;
                    case '7':
                    cout <<"Vous avez choisi de quitter l'application\n";
                        break;
     
                    default: cout <<"erreur\n";
     
                }
        }
     
    }
    comme vous pouvez le voir c'est le bordel dans mes calculs j'aurais besoin d'aide! et d'ailleurs par la même occasion est-ce normal que le cout ne fonctionne pas ici ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Je ne vois pas comment t'aider sur des affichages qui seraient invalides. Le code que tu présentes ne peut pas compiler en C++ donc ne peut rien afficher du tout.
    Les lignes 55 et 63 n'ont aucun sens en C++, elles ne correspondent pas à ta question.

    Juste un tout petit commentaire. Le C++ est sorti au début des années 80, et dès cette date il était déconseillé de faire comme C en déclarant ses variables au début des fonctions, le langage C a fini par suivre l'idée du C++ longtemps après. C'était il y a 20 ans.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Salut, et bienvenue sur le forum.

    J'ai une très mauvaise nouvelle pour toi: bien que ton code utilise cout il ressemble d'avantage à du C (et encore, pas de première fraicheur) qu'à du C++. Et, du coup, c'est le parfait exemple de ce qu'il ne fallait déjà plus faire en ... 1998!!!

    Alors, tu penses bien qu'à l'orée de 2020 (qui nous offrira une nouvelle mise à jour de la norme), alors que nous avons reçus un tas de nouvelles fonctionnalités en 2011, 2014 et 2017, ce n'est vraiment pas le genre de code que l'on devrait t'apprendre pour faire du C++ "moderne"

    Voici, vite fait, les remarque que ton code m'inspire:

    1- Concernant les fichiers d'en-tête:

    Les fichiers d'en-tête (ceux que tu indiques avec la directive #include) fournit par la bibliothèque standard ne porte aucune extension: ceux qui portent l'extension .h (comme stdio.h, stdlib.h ou time.h) sont, typiquement, des fichiers issus du C.

    A priori, tu ne devrais jamais les utiliser, mais, si tu tiens vraiment à disposer d'une fonctionnalité issue du C (ce qui est une très mauvaise idée dans la plupart des cas), tu devrais te tourner vers la version C++ de ces fichiers. Ils se reconnaissent facilement parce qu'ils portent presque le même nom (on ajoute juste un c au début du nom) et qu'il ne comportent pas d'extension.

    Pour ceux que tu utilises (à tord, selon moi), tu aurais donc du inclure les fichiers <cstdio>, cstdlib et ctime

    2- concernant la directive using namespace std;

    Saches que l'on n'utilise JAMAIS cette directive.

    Comme cela n'a pas vraiment de lien avec la discussion actuelle, je te conseille vivement d'aller lire ==>cette intervention de ma part<==, qui explique en long en large et en travers pourquoi il ne faut pas l'utiliser

    (si cette intervention laisse planer des incompréhensions de ta part, n'hésite pas à demander des éclaircissement )

    3- A propos de la déclaration des variables et des constantes.

    Une bonne habitude à prendre est de déclarer les variables et les constantes aux plus près de l'endroit du code où on les utilise pour la première fois.

    Sans rien changer au reste, voici à peu près à quoi devrait ressembler ton 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    int main(int argc, char *argv[])
    {
     
        srand (time(NULL)); // ca ne doit être fait qu'une seule fois, 
                            // autant le faire tout de suite, comme cela,
                            // on peut l'oublier :D
        /* GRRRRR...  Une règle simple à suivre:
         * une ligne == une instruction ou la déclaration d'UNE SEULE VARIABLE
         * d'autant plus que i va servir de compteur pour les boucles
         * et que somme ne sera utilisé qu'à un endroit particulier
         *
         * int i,somme;
         */
     
     
        const int TAILLE=10;
        int tabEntiers[TAILLE];
        const int MAX=20;
        const int MIN=1;
        for (int i=0; i<TAILLE; i++)   // comme il ne sert qu'à cela, autant ne le déclarer que pour 
                                       // cette boucle for (!!! faudra le faire un peu plus bas itou ;)
                                       // cela t'évitera de réutiliser ce compteur pour autre chose
                                       // et de te retrouver avec, parfois, des valeurs incohérentes
        {
            tabEntiers[i] = (rand() % (MAX - MIN + 1)) + MIN;
        }
     
        char choix=0;
        while (choix!='7') 
        {
             cout <<"**********MENU**********\n\n";
            cout <<"Afficher le contenu du tableau à l'ecran \t\t:1\n\n";
            cout <<"Calculer la somme des valeurs contenue dans le tableau \t\t:2\n\n";
            cout <<"Calculer la moyenne des valeurs contenues dans le tableau \t\t:3\n\n";
            cout <<"Rechercher le minimum dans le tableau et l’afficher à l'ecran \t\t:4\n\n";
            cout <<"Rechercher le maximum dans le tableau et l’afficher à l’ecran \t\t:5\n\n";
            cout <<"Decaler de une place vers la droite toutes les valeurs du tableau \t\:6\n\n";
            cout <<"Quitter l'application' \t\t\t:7\n\n\n";
     
     
            cout <<"Quel est votre choix?\n";
            cin >>choix;
                switch (choix)
                 {
                    case '1':
                        cout <<"Vous avez choisi l'option 1\n";
     
                        for (i=0;i<TAILLE;i++)
                        {
                            cout <<tabEntiers[i] <<"\n";
                        }
                        break;
     
                    case '2':
                        int somme{0};  // une des nouveautés dont je te parais (apparue en 2011)
                        cout <<"Vous avez choisi l'option 2\n";
     
                        for (inti=0 ; i<TAILLE; i++)
                        {
                            somme+=tabEntiers[i];
                        }
                        break;
     
                    case '3':
                        cout <<"Vous avez choisi l'option 3\n";
                        /* diviser un double par un pointeur sur un tableau, ca ne risque pas
                         * de fonctionner 
                         * moyenne /=tabEntiers;
                         */
     
                        /* pour avoir la moyenne, il faudra :
                         *  calculer la somme du tableau (il faudra penser à en faire une fonction)
                         *  la diviser par le nombre d'éléments dans le tableau
                         */
                        float moyenne = static_cast<float>(calculerSomme(tabEntiers)) / TAILLE; // (*)
                        cout <<"Votre moyenne est:"<<moyenne <<"\n";
                        break;
     
                    /* je supprime les case 4,5 et 6 vu qu'elle ne font rien d'intéressant ;) */
                    case '7':
                    cout <<"Vous avez choisi de quitter l'application\n";
                        break;
     
                    default: cout <<"erreur\n";
     
                }
        }
        return 0; // Ben oui, main doit renvoyer une valeur au système d'exploitation
                  // 0 indique que tout s'est bien déroulé.  Toute autre valeur indiquera
                  // qu'il y a eu un problème
    }
    (j'ai rajouté quelques commentaires pour que tu comprenne ce que je fais, et pourquoi )

    4- Passer au C++ "moderne"

    4.a- Depuis 1995, on dispose d'une classe, std::vector qui permet de représenter un tableau dont le nombre d'éléments ne sera connu qu'à l'exécution.

    De manière générale, elle sera beaucoup plus sécurisante à l'emploi que tout ce que tu pourrais faire (surtout en temps que débutant) pour la gestion de tableau (de taille dynamique ou non)

    Tu aurais eu donc largement intérêt utiliser cette classe pour ta variable tabEntiers entre 1995 et 2011. Voici le lien vers ==>la documentation qui concerne la classe std::vector<==.

    4.b- Depuis 2011, on dispose également d'une classe appelée std::array qui permet de définir un tableau d'éléments dont le nombre est connu à la compilation. Etant donné que tu es parti sur un tableau de taille fixe, elle pourrait s'avérer être "plus intéressante" à l'usage que la classe std::vector. Voici le lien vers ==>la documentation qui concerne la classe std::array<==.

    4.c- Les fonctions C srand et (sourtout) rand sont de très vieilles fonctions, qui viennent avec de sérieux problèmes, entre autres parce que:
    1. la distribution des valeurs obtenues avec rand est très loin d'être uniforme
    2. bien que cela ne poserait pas de problème pour toi, la valeur maximale renvoyée par rand est 216-1 ( soit, de tête, quelque chose comme 65535)


    Depuis 2011, on dispose du fichier d'en-tête <random> qui propose "tout ce qu'il faut" pour avoir des tirages pseudo aléatoires efficaces, dont les nombres sont choisi dans des intervalles bien définis, et qui présentent l'énorme avantage de fournir une distribution uniforme des valeurs (autrement dit: chaque valeur de l'intervalle a réellement le même nombre de chances de sortir lors d'un tirage multiple ).

    Je te conseillerais très fortement de t'intéresser à ce fichier d'en-tête, si tu aimes jouer avec les nombres pseudo aléatoires. Voici le lien vers ==>la documentation relative au fichier d'en-tête <random> <==.

    Concernant la taille des fonctions

    Il y a très longtemps de cela, les écrans étaient tout juste capables d'afficher 25 lignes de 80 colonnes. On considérait, à l'époque, qu'une fonction qui utilisait plus de cinquante lignes (soit deux fois le nombre de ligne affichables sur un écran) était "trop longue" et méritait amplement de se voir "découper en fonctions plus simple".

    A l'heure actuelle, la plupart des écrans sont sans doute capable d'afficher 100 lignes et plus, mais on va se baser sur un principe connu sous le nom de SRP (pour Single Responsability Principle, ou, si tu préfère en français, le ==>principe de la responsabilité unique<==) pour estimer qu'une fonction de plus d'une vingtaine de lignes (on peut rester coulant sur le nombre de lignes, mais "jusqu'à un certain point" quand même ) est sans doute une fonction qui en fait trop.

    Dans le cas présent, ta fonction main prend ... jusqu'à neuf responsabilités différentes, à savoir:
    1. créer le tableau qu'elle utilise
    2. remplir le tableau avec des valeurs aléatoire
    3. afficher un menu proposant le choix à l'utilisateur
    4. récupérer le choix de l'utilisateur (!!! sans vérifier ce que l'utilisateur introduit, ce qui est souvent source d'erreurs !!!)
    5. calculer le total des éléments contenus dans le tableau
    6. calculer la moyenne des éléments contenus dans le tableau
    7. rechercher le minimum des éléments du tableau
    8. rechercher le maximum des éléments du tableau
    9. décaler les éléments du tableau
    Bref, elle prend (idéalement 8, mais on peut raisonnablement parler de) ... setp responsabilités de trop, qui devraient être prises en charge par des fonctions tierces

    Si tu créais une fonction spécifique pour chacun des points (2), (3), (4), (5), (6), (7), (8) et (9), la fonction la plus longue de ton programme (le point 3, en l'occurrence) ne nécessiterait sans doute que ... 9 lignes!!! Tu vois que tu aurais encore de la marge en voulant te limiter à 20
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut
    Merci beaucoup pour ton aide, je suis actuellement en BTS SN 1ere année et nous on nous apprend dans chaque programme à mettre using namespace std;
    On dev actuellement que dans le main sous logiciel Qt Creator.
    Autant te dire que je suis loin d'être le meilleur programmeur aha!

    Mon case 2 ressemble désormais à sa et sa fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    case '2':
                        somme =0;
     
                        for (i=0;i<TAILLE;i++)
                        {
                            somme= somme+tabEntiers[i];
                        }
                        cout<< "La somme de ces entier est: " <<somme <<"   ";

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Citation Envoyé par william.rodde Voir le message
    Merci beaucoup pour ton aide, je suis actuellement en BTS SN 1ere année et nous on nous apprend dans chaque programme à mettre using namespace std;
    C'est souvent le cas... Mais tu devrais donner le lien de l'intervention que j'ai citée à ton prof, et lui dire qu'il serait peut-être temps de se mettre à jour
    On dev actuellement que dans le main sous logiciel Qt Creator.
    C'est un excellent logiciel, qui évolue très rapidement

    Mais, comme tous les logiciels, ce n'est jamais qu'un outil qu'il faut apprendre à utiliser correctement , et qui ne changera rien au fait que ton prof vous apprend à coder comme on l'aurait fait avant 1995!!!
    Autant te dire que je suis loin d'être le meilleur programmeur aha!
    Ca, c'est toi qui le dit

    Mais, vu que tu es en BTS SN, je présume que tu éprouve malgré tout une tendresse particulière pour les systèmes numériques. Or, un ordinateur n'est rien d'autre qu'un système numérique . N'aurais tu pas envie de pouvoir t'adresser à lui plus facilement et d'une manière plus maintenable
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Débutant] besoin d'aide sur les web services
    Par Diangelita dans le forum Services Web
    Réponses: 3
    Dernier message: 20/01/2006, 08h41
  2. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00
  3. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 15h43
  4. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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