C - menu programme à l'aide de tout et switch/case retourne en double menu avec une sélection non valide

Fichier d'en-tête:

    #include <stdio.h>
    #include <stdlib.h>

    int print_menu(){
      printf ("MENU\n");
      printf ("1. Total of All Top Scores for the Week\n");
      printf ("2. Total of All High Scores for the Week\n");
      printf ("3. Total Machine High Scores for the Week\n");
      printf ("4. Machine High Score for the Week\n");
      printf ("5. EXIT\n");
      printf ("Enter Selection:");

      int selection = getchar();
      return selection;
    }

Principal fichier C:

    #include <stdio.h>
    #include <stdlib.h>
    #include "lab1.h"

    int main(int argc, char *argv[]){
      int selection = print_menu();
      while(1)
      {
        switch (selection)
        {
          case '1':
            printf ("\nselected 1\n");
            break;
          case '2':
            printf ("\nselected 2\n");
            break;
          case '3':
            printf ("\nselected 3\n");
            break;
          case '4':
            printf ("\nselected 4\n");
            break;
          case '5':
            printf ("\nExit\n");
            exit(0);
            break;
          default:
            printf ("Invalid Selection");
            print_menu();
            break;
        };
      };
    }

Mon problème est que lorsque je lance le programme et entrez dans un mauvais caractère le programme est supposer pour la ré-impression du menu et de demander de nouveau la sélection. Sauf qu'il affiche le menu à deux reprises. Exemple:

    [email protected]:~/shared$ ./a.out
    MENU
    1. Total of All Top Scores for the Week
    2. Total of All High Scores for the Week
    3. Total Machine High Scores for the Week
    4. Machine High Score for the Week
    5. EXIT
    Enter Selection:d
    Invalid Selection
    MENU
    1. Total of All Top Scores for the Week
    2. Total of All High Scores for the Week
    3. Total Machine High Scores for the Week
    4. Machine High Score for the Week
    5. EXIT
    Enter Selection:
    Invalid Selection
    MENU
    1. Total of All Top Scores for the Week
    2. Total of All High Scores for the Week
    3. Total Machine High Scores for the Week
    4. Machine High Score for the Week
    5. EXIT
    Enter Selection:

Et puis, vous avez la possibilité d'entrer dans une autre sélection. Quand je suis allé à travers, j'ai remarqué qu'il semble prendre la sélection de " d " et de la sortie correctement, mais en agissant comme un espace vide ou une nouvelle ligne a été inscrit automatiquement et procède à la vérification de la sélection (je ne sais pas si c'est le problème réel bien - c'est juste la façon dont il semble être d'agir). Si quelqu'un a des idées sur la façon de résoudre ce problème et d'expliquer pourquoi ce qui se passe. Toute aide serait super!

+1
2019-09-18 07:15:39
source
3 réponses

Vous devriez considérer que la cible de l'événement est le seul objet, même si la cible comprend une multitude d'éléments:

$('.nav-menu-list ul li').hover(function() {
    var id = $(this).data().id; 
    $("#"+id).fadeIn();
}, function(){
    var id = $(this).data().id; 
    $('#'+id).fadeOut();
});
+0
2019-09-18 07:46:11

Vous ne pouvez utiliser qu'une seule fonction pour le contrôle de tous les d'entre eux.

Mais, pour cela, dans le sélecteur jQuery, vous devez utiliser $('.nav-menu-list ul li').
Avec ce sélecteur, hover() sera le li lui-même, puis, juste obtenir le data-id de l'actuel planait li et ensuite l'utiliser pour sélectionner le div que vous souhaitez cibler.

Voir ci-dessous, je suggère l'utilisation complète de la page ("Expand" Extrait de mode sur le bout de code pour une meilleure visualisation:

$('.nav-menu-list ul li').hover(function() {
  let id = "#" + $(this).data("id")
  $(id).fadeIn();
}, function() {
  let id = "#" + $(this).data("id")
  $(id).fadeOut();
});
.nav-menu-list-details div{
  display:none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span class="nav-menu-list">
    <ul>
        <li data-id="item-01"><h2>home</h2></li>
        <li data-id="item-02"><h2>about us</h2></li>
        <li data-id="item-03"><h2>category</h2></li>
        <li data-id="item-04"><h2>news room</h2></li>
        <li data-id="item-05"><h2>blog</h2></li>
        <li data-id="item-06"><h2>contact us</h2></li>
    </ul>
</span>

<span class="nav-menu-list-details">
    <div id="item-01"><img src="images/home-preview.png" alt="" />ITEM_1</div>
    <div id="item-02"><img src="images/home-preview.png" alt="" />ITEM_2</div>
    <div id="item-03"><img src="images/home-preview.png" alt="" />ITEM_3</div>
    <div id="item-04"><img src="images/home-preview.png" alt="" />ITEM_4</div>
    <div id="item-05"><img src="images/home-preview.png" alt="" />ITEM_5</div>
    <div id="item-06"><img src="images/home-preview.png" alt="" />ITEM_6</div>
</span>

+0
2019-09-18 07:46:11

Vous pouvez utiliser cette requête. Tout d'abord ajouter un champ sur la correspondance de document basé sur la condition et de filtre basé sur l'ajout du champ

db.test.aggregate([ 
    { $match: { type: "Normal", "atr.key":"UDSP" }},
    { $addFields:{ 
        isDocMatched: { 
          $anyElementTrue: { 
              $map:{
                  input: "$atr",
                  as: "grade",
                  in: { $eq: [ "$$grade.value", "$desc" ] }
              }
          }
       }
    }},
    { $match: { isDocMatched: true } }  
])
+0
2019-09-18 08:04:57

Voir d'autres questions sur les étiquettes