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

Algorithmes et structures de données Discussion :

Afficher la moyenne des multiple de 3 et la moyenne des nombres pairs, à partir des nb entrés


Sujet :

Algorithmes et structures de données

  1. #1
    Invité
    Invité(e)
    Par défaut Afficher la moyenne des multiple de 3 et la moyenne des nombres pairs, à partir des nb entrés
    Voici la consigne de mon formateur :
    "Ecrire un algorithme qui affiche la moyenne des nombres pairs et la moyenne des multiples de 3 d'un tableau d'entiers initialisés par des nombres entrés au clavier par l'utilisateur.
    L'utilisateur entrera un maximum de 15 nombres et signifiera la fin de ses entrées en tapant -1 au clavier.
    0 n'est pas considéré comme un nombre pair ou un multiple de 3."

    Voici notre 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
    // initialisation des variables indice j, longeur effective, le nombre lu...
    tableau tab[15] :entier
    var j, lgEff, nbLu, multiple2, multiple3, cptMultiple2, cptMultiple3
    
    lgEff <- 0
    multiple2 <- 0
    multiple3 <- 0
    cptMultiple2 <- 0
    cptMultiple3 <- 0
    
    lire nbLu
    TANT QUE nbLu <> -1 FAIRE    // -1 signifiera la fin de ses entrées
    	lgEff <- lgEff + 1
    	tab[j] <- nbLu
    		SI tab[j] <> 0 ALORS //0 n'est pas considéré comme un nombre pair ou un multiple de 3.
    			
    			SI tab[j] mod2 = 0 ALORS   // si nbLu est un nb pair
    				multiple2 <- multiple2 + 1
    				cptMultiple2 <- cptMultiple2 + 1
    			FSI
    
    			SI tab[j] mod3 = 0 ALORS   // si nbLu est un multiple de 3
    				multiple3 <- multiple3 + 1
    				cptMultiple3 <- cptMultiple3 + 1
    			FSI
    		FSI
    	j <- j + 1
    FTANT
    
    SI cptMultiple2 = 0 ALORS
              ecrire 'pas de nombre pair'
    SINON
              ecrire multiple2/cptMultiple2  //affiche la moyenne des nombres pairs
    FSI
    
    SI cptMultiple3 = 0 ALORS
              ecrire 'pas de nombre multiple de 3'
    SINON
              ecrire multiple3/cptMultiple3  //affiche la moyenne des multiples de 3
    FSI

    Avez-vous des avis sur la construction de cet algorithme svp ? J'ai effetué cet algo avec des collègues et nous nous demandons s'il y aurait moyen de l'améliorer... On débute en algo et nous ne devons pas encore programmer en C pour le moment.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    Bonjour

    "Lire" n'est pas dans une boucle. Dès lors, le code affiché ne répondra pas à la question puisqu'un seul nombre sera lu.

  3. #3
    Invité
    Invité(e)
    Par défaut
    "Lire" n'est pas dans une boucle. Dès lors, le code affiché ne répondra pas à la question puisqu'un seul nombre sera lu.[/QUOTE]


    Merci beaucoup pour cette remarque pertinente. J'imagine que la ligne ' lire nbLu ' devrait se situer entre les lignes 27 et 28 (entre j <- j + 1 et FTANT ). J'y réfléchirai et je reviens sur ce forum dès que possible.
    Dernière modification par dourouc05 ; 24/10/2022 à 04h02. Motif: Inutile de citer l'intégralité du message

  4. #4
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Bonjour,
    Pour alimenter tes réflexions, tu as plusieurs solutions :

    - relire un nouveau nombre avant de reboucler,
    - décaler ta lecture tout de suite après le début de ta boucle mais il faudra penser à ce que ta boucle soit bien traitée la première fois et gérer la réponse -1 à la première question.
    - ne faire le test de rebouclage qu'à la fin

    A toi de jauger la meilleure solution.

    Tu dois aussi penser à limiter le nombre d'entrées...

    Autre chose, essaies de séparer l'entrée de tes données de leur traitement, ce sera plus facile à écrire, à lire, à debugguer mais aussi à améliorer
    - Entrée des données : Dialogue avec l'utilisateur
    - Traitement des données et calcul des résultats
    - Affichage des résultats. Dialogue avec l'utilisateur.
    Beaucoup de traitement sont gérés de cette manière : Données => Traitement => Résultats...

    Belle journée,

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 244
    Par défaut
    Autre point, tu as ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiple2 <- multiple2 + 1
    cptMultiple2 <- cptMultiple2 + 1
    Et à la fin, tu divises multiple2 par cptmultiple2 ; ok.
    Mais je pense que tu as fait un copier/coller, et que tu as oublié de changer un petit truc.

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 710
    Par défaut
    Bonjour

    Comme signalé par tbc92, idem pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          multiple3 <- multiple3 + 1
          cptMultiple3 <- cptMultiple3 + 1
    D'où l'intérêt de bien nommer les variables : peut être sumMultiple2 et sumMultiple3 au lieu de multiple2 et multiple3.

    Salutations

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous,
    Tout d'abord Merci beaucoup pour vos retours car cela me donne à réfléchir. Voici les modifications que j'ai apportées dans l'algorithme car il manquait certaines choses que j'ai mises en rouge pour mieux visualiser ici en bas, les choses telles que 1) l'importance de correctement nommer les variables, 2) relire un nouveau nombre avant de reboucler, 3) initialiser la variable j, 4) mettre un espace entre mod et 3 par exemple car mod est un opérateur,

    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
    // initialisation des variables indice j, longeur effective, le nombre lu...
    tableau tab[15] :entier
    var j, lgEff, nbLu, sumMultiple2, sumMultiple3, cptMultiple2, cptMultiple3
    
    lgEff <- 0
    sumMultiple2 <- 0
    sumMultiple3 <- 0
    cptMultiple2 <- 0
    cptMultiple3 <- 0
    j <- 0
    
    lire nbLu
    TANT QUE nbLu <> -1 FAIRE    // -1 signifiera la fin de ses entrées
    	lgEff <- lgEff + 1
    	tab[j] <- nbLu
    		SI tab[j] <> 0 ALORS //0 n'est pas considéré comme un nombre pair ou un multiple de 3.
    			
    			SI tab[j]  mod 2  = 0 ALORS   // si nbLu est un nb pair
    				sumMultiple2 <- sumMultiple2 + tab[j] 
    				cptMultiple2 <- cptMultiple2 + 1
    			FSI
    
    			SI tab[j]  mod 3 = 0 ALORS   // si nbLu est un multiple de 3
    				sumMultiple3 <- sumMultiple3 + tab[j] 
    				cptMultiple3 <- cptMultiple3 + 1
    			FSI
    		FSI
    	j <- j + 1
    	 lire nbLu  
    FTANT
    
    SI cptMultiple2 = 0 ALORS
              ecrire 'pas de nombre pair'
    SINON
              ecrire sumMultiple2 /cptMultiple2  //affiche la moyenne des nombres pairs
    FSI
    
    SI cptMultiple3 = 0 ALORS
              ecrire 'pas de nombre multiple de 3'
    SINON
              ecrire sumMultiple3/cptMultiple3  //affiche la moyenne des multiples de 3
    FSI
    Cependant, l'internaute Galet m'a fait réfléchir sur une façon de procéder qui m'intrigue et dans le même temps je dois admettre que je ne comprends/visualise pas très bien comment couper le code en 3 morceaux pour respectivement traiter les données de cette manière : Données => Traitement => Résultats... Quelqu'un pour m'éclaircir à ce sujet svp ? (S'agit-il par exemples 1) d'opter pour un autre boucle, 2) ou bien de changer les conditions dans les SI FSI ? car pour moi le traitement se fait en dehors de la boucle TANT QUE (c'est-à-dire à la ligne 11 lire nbLu et ensuite, dans la boucle, c'est du chipotage et des conditions...)

    Citation Envoyé par Galet Voir le message
    Bonjour,
    Pour alimenter tes réflexions, tu as plusieurs solutions : [...]

    Tu dois aussi penser à limiter le nombre d'entrées...

    Autre chose, essaies de séparer l'entrée de tes données de leur traitement, ce sera plus facile à écrire, à lire, à debugguer mais aussi à améliorer
    - Entrée des données : Dialogue avec l'utilisateur
    - Traitement des données et calcul des résultats
    - Affichage des résultats. Dialogue avec l'utilisateur.
    Beaucoup de traitement sont gérés de cette manière : Données => Traitement => Résultats...
    Dernière modification par Invité ; 23/10/2022 à 18h44.

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 244
    Par défaut
    A priori, ce que tu as fait correspond parfaitement à l'attente de ton prof. Quasi parfait. Sauf détail qui m'aurait échappé.
    Presque parfait en fait.
    Tu as une variable lgEff. Tu l'initialises à 0, puis tu l'incrémente de 1 à chaque boucle.... puis tu ne l'utilises jamais. A quoi sert cette variable ? Si le nom de la variable était plus clair, ce serait mieux, mais de toutes façons les 2 lignes avec lgEff ne servent à rien.
    Edit : J'y suis : l'énoncé demandait de limiter le nombre de saisies à 15, et cette variable lgEff pourrait servir à ça. Sauf que tu ne le fais pas.

    La proposition de galet, c'est un truc que tu apprendras un jour, c'est une stratégie générale d'organisation des programmes.

    Par exemple, tu peux avoir souvent des exercices où l'utilisateur doit entrer une série de valeurs, puis (puis ... notion de chronologie), ton programme doit faire certains traitements, des calculs.

    Du coup, pour faire d'une pierre 2 coups, tu peux faire un module spécialisé sur une tache précise :
    Module n°1 : demander à l'utilisateur une série de données, en limitant le nombre de saisies à un certain plafond. Et renvoyer au programme principal un Tableau avec la liste des données saisies par l'utilisateur.
    Module n°2 : Calculer les indicateurs demandés
    Module n°3 : afficher les résultats.

    Si tu as plein d'exercices à faire qui demandent une saisie de plusieurs données, tu as ton module n°1, une fois pour toute. Tu as juste à réutiliser le même module dans chaque exercice.
    Les modules n°2 et n°3 par contre, c'est un peu plus délicat de séparer ces 2 parties. Les données affichées sont forcément intimement liées aux données calculées.

    Si demain tu as un exercice similaire, mais les données doivent être lues dans un fichier, bingo, les modules 2 et 3 peuvent être réutilisés, il suffit de refaire le module de lecture des données.

    Un programme est très souvent organisé comme ça. C'est un assemblage de petites briques qui ont chacune un rôle très précis.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    A priori, ce que tu as fait correspond parfaitement à l'attente de ton prof. Quasi parfait. Sauf détail qui m'aurait échappé.
    Presque parfait en fait.
    Tu as une variable lgEff. Tu l'initialises à 0, puis tu l'incrémente de 1 à chaque boucle.... puis tu ne l'utilises jamais. A quoi sert cette variable ? Si le nom de la variable était plus clair, ce serait mieux, mais de toutes façons les 2 lignes avec lgEff ne servent à rien.
    Edit : J'y suis : l'énoncé demandait de limiter le nombre de saisies à 15, et cette variable lgEff pourrait servir à ça. Sauf que tu ne le fais pas.

    La proposition de galet, c'est un truc que tu apprendras un jour, c'est une stratégie générale d'organisation des programmes.

    Par exemple, tu peux avoir souvent des exercices où l'utilisateur doit entrer une série de valeurs, puis (puis ... notion de chronologie), ton programme doit faire certains traitements, des calculs.

    Du coup, pour faire d'une pierre 2 coups, tu peux faire un module spécialisé sur une tache précise :
    Module n°1 : demander à l'utilisateur une série de données, en limitant le nombre de saisies à un certain plafond. Et renvoyer au programme principal un Tableau avec la liste des données saisies par l'utilisateur.
    Module n°2 : Calculer les indicateurs demandés
    Module n°3 : afficher les résultats.

    Si tu as plein d'exercices à faire qui demandent une saisie de plusieurs données, tu as ton module n°1, une fois pour toute. Tu as juste à réutiliser le même module dans chaque exercice.
    Les modules n°2 et n°3 par contre, c'est un peu plus délicat de séparer ces 2 parties. Les données affichées sont forcément intimement liées aux données calculées.

    Si demain tu as un exercice similaire, mais les données doivent être lues dans un fichier, bingo, les modules 2 et 3 peuvent être réutilisés, il suffit de refaire le module de lecture des données.

    Un programme est très souvent organisé comme ça. C'est un assemblage de petites briques qui ont chacune un rôle très précis.

    Un grand merci pour ces précieuses informations.

Discussions similaires

  1. Afficher une moyenne de nombre entier avec 2 décimales
    Par samos99 dans le forum Power BI
    Réponses: 5
    Dernier message: 30/05/2021, 23h17
  2. Réponses: 2
    Dernier message: 14/09/2016, 22h17
  3. Script shell : afficher le contenu des variables entre simple quote
    Par mualki dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 23/01/2010, 01h14
  4. [VB6] Datagrid afficher ou cacher des colonnes par code
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 06/02/2003, 18h19

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