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 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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