Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Personne disparue

Javascool

14 septembre 2019 à 14:49:12

Bonjour,

Me revoilà avec un nouveau problème!

Un personnage important de la cité n'est pas rentré chez lui hier soir et tout le monde est à sa recherche. Or tout habitant de la ville a un numéro unique qui lui est associé et doit signer une sorte de registre quand il sort de la ville. Vous souhaitez savoir si le registre a été signé, auquel cas il faudra étendre les recherches à l'extérieur de la ville.

Ce que doit faire votre programme :

On vous donne un entier, le numéro d'une personne recherchée, puis un entier tailleListe, et enfin tailleListe entiers parmi lesquels vous devez chercher le numéro de la personne. Si le numéro est présent dans la liste (il peut l'être plusieurs fois) vous devez afficher le texte "Sorti de la ville" sinon "Encore dans la ville".

Exemple

entrée :

42
5
1
7
172
2
41

sortie :

Encore dans la ville

Les booléens

En JavaScool le programme suivant :

if (prix < 10)
{
   println("Pas cher");
}

peut aussi s'écrire

boolean estPasCher = (prix < 10);
if (estPasCher)
{
   println("Pas cher");
}

On a donc stocké dans la variable estPasCher la valeur de la comparaison prix < 10 pour la réutiliser plus tard dans un if.

La variable estPasCher est appelée une variable booléenne ou un booléen car elle ne peut être que vraie ou fausse, ce qui correspond en JavaScool aux valeurs true (pour vrai) et false (pour faux).

On a déclaré la variable estPasCher comme étant de type boolean pour bien indiquer qu'il s'agit d'une variable booléenne.

Ainsi en JavaScool, (3 < 10) vaut true et (11 == 7) vaut false . true et false sont donc des constantes du langage, au même titre que 0, 1 ou encore 42.

On peut donc affecter directement la valeur true ou false à une variable :

boolean toujoursVraie = true;
if (toujoursVraie)
{
   println("La variable toujoursVraie vaut 'true'");
}

On peut également utiliser les opérateurs && et || comme le montre l'exemple suivant :

boolean estSenior = (âge >= 60);
boolean estJeune = (âge <= 25) && (age >= 12);
boolean réductionPossible = (estSenior || estJeune);
if (réductionPossible)
{
   println("Réduction!");
}

Avec ces explications, que je ne trouve pas vraiment claire, surtout pour les booléens, voilà mon code:

void main()
{
   int numeroPerso=readInt();
   int tailleListe=readInt();
   boolean numCherchee=(numeroPerso==tailleListe);
   if(numCherchee)
   {  
      println("Sorti de la ville");
   }
   else
   {
      println("Encore dans la ville");
   }
}

Mon programme affiche toujours des "Encore dans la ville" et jamais de "Sorti de la ville"... Une petite explication sur ce bug?

Merci!

-
Edité par Trust_28 14 septembre 2019 à 14:49:56

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2019 à 21:01:50

Bonjour,

Tu lis le numéro à chercher et la taille de la liste mais tu ne lis pas les nombres de la liste.

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2019 à 21:59:40


void main()
{
   int numeroPerso=readInt();
   int tailleListe=readInt();
   int nombreListe=readInt();
   if(numeroPerso==nombreListe)
   { 
      println("Sorti de la ville");
   }
   else
   {
      println("Encore dans la ville");
   }
   
}

Lorsque j'ajoute les nombres des listes, voilà les résultats:

Test 1 Succès

Exécuté en 0,02 seconde.

100 %
Test 2 Erreur

Erreur d'exécution. Voici ce qui a été affiché :

-------------------
Erreur lors de l'exécution de la proglet
java.util.NoSuchElementException
-------------------

0 %
Test 3 Succès

Exécuté en 0,02 seconde.

100 %

J'ai tenté de faire ça pour taille de la liste comme ça:

void main()
{
   int numeroPerso=readInt();
   int tailleListe=readInt();
   int nombreListe=readInt();
   repeat(tailleListe)
   {
      if(numeroPerso==nombreListe)
      {
         println("Sorti de la ville");
      }
      else
      {
         println("Encore dans la ville");
      }
   }
}

Mais voilà le résultat:

Test 1 Échec

La réponse donnée par votre programme est incorrecte. Il a affiché :

Encore dans la ville
Encore dans la ville
Encore dans la ville
Encore dans la ville
Encore dans la ville

au lieu de :

Encore dans la ville
0 %
Test 2 Erreur

Erreur d'exécution.

0 %
Test 3 Échec

La réponse donnée par votre programme est incorrecte.

0 %

Mon erreur doit sans doute venir du fait que je ne comprends pas ces histoires de "Boolean blabla=true"

Est-ce que je pourrais avoir une explication de l'explication que nous donne France IoI sur les booléens?

Merci!

  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2019 à 9:02:46

Qu'est ce que tu comprends dans

      boolean blabla = true ;

?

  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2019 à 10:27:58

Que "blabla" vaut toujours true.

Mais je ne vois pas l'utilité de mettre "true" en fait.

Quel est l'intérêt qu'une variable booléenne vaut "true"? A quoi correspond "true"?

Et je ne comprends pas pourquoi mettre "boolean"? Qu'est-ce que cela change de mettre

boolean estSenior = (âge >= 60);
boolean estJeune = (âge <= 25) && (age >= 12);
boolean réductionPossible = (estSenior || estJeune);
if (réductionPossible)
{
   println("Réduction!");
}

Au lieu de

int estSenior
int estJeune

?

Est-ce que les boolean servent uniquement à faire des opérations/comparaisons/etc. entre différentes variables?

Franchement, l'utilité des boolean est un mystère pour moi :euh: Mais j'ai vraiment besoin de comprendre pour la suite!

  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2019 à 12:12:59

Non, pas toujours. Il vaut true au moment de l'affectation. Et dans estSenior = ( age >= 60);  c'est toujours true ?

Ce que ça change, c'est qu'un int n'est pas un boolean . Reviens à la définition de ces types.

Et personne ne t empêche d'essayer de mettre int dans ton code, pour voir ce que ca fait. Vaut mieux essayer que de se poser des questions en l'air.

-
Edité par michelbillaud 15 septembre 2019 à 12:17:45

  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2019 à 18:58:07

Pour le moment, j'en suis là

void main()
{ 
   int numeroPerso=readInt();
   int tailleListe=readInt();
   boolean numeroTrouve=(numeroPerso==numeroListe);
   repeat(tailleListe)
   {
   int numeroListe=readInt();
      if(numeroTrouve)
      {
         println("Encore dans la ville");
      }
      else
      {
         println("Sorti de la ville");
      }
   }
}

Je sais que boolean ne lira après "numeroListe", parce qu'il est est déclaré après dans la boucle mais je suis bloqué à ce niveau-là.

Je sais que j'arrive au bout mais je n'arrive pas à mettre le doigt sur ce qui gêne...

  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2019 à 23:38:06

Si tu sais que ça  bloque quand il est là, pourquoi tu ne le mets pas ailleurs ?

-
Edité par michelbillaud 15 septembre 2019 à 23:38:33

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 8:09:51

Un booléen, c'est juste le résultat d'une condition et il a juste deux valeurs possibles : true si la condition est vérifiée et false si elle ne l'est pas.

C'est bien sûr le programmeur qui choisit la ou les conditions et ce que true/false signifie.

Dans ton code, tu affiches une réponse pour chaque personne de la liste. Ce n'est pas le résultat attendu.

Ce qu'il faut faire :

Dans ce problème, on veut savoir si la personne est sortie de la ville ou non. Ca fait deux possibilités, parfait pour être représenté par un booléen.

Donc logiquement, on va choisir que true signifie "la personne est sortie de la ville" et false signifie "la personne est encore dans la ville". Ou le contraire, à toi de choisir.

Il y a énormément de façon de résoudre ce problème, je t'en propose une.

Dans ton programme, il faut créer une variable booléenne et te débrouiller pour qu'elle ait une valeur si on trouve la personne dans la liste et la valeur opposée si elle n'y est pas.

Ensuite tu pourras utiliser la valeur de cette variable pour afficher le bon texte (une fois seulement).

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 13:12:16

Je ne comprends vraiment pas le problème, ce sujet commence à rendre fou...

boolean numeroTrouve=(numeroPerso==numeroListe);

N'équivaut pas déjà à dire "true"?

Je comprends le programme comme ça, peut-être que le problème est là:

void main()
{
   int numeroPerso=readInt(); //Numéro que l'on cherche
   int tailleListe=readInt(); //Nombre numéro dans la liste
   boolean numeroTrouve=(numeroPerso==numeroListe) // Numéro que l'on cherche correspond exactement au numéro de la personne dans les numéros de la liste donc vaut TRUE
   repeat(tailleListe)//Répéter pour tous les numéros dans la liste
   {
   int numeroListe=readInt();//Numéro dans la liste
      if(numeroTrouve) // S'il y a le numéro que l'on cherche, donc si TRUE
      {
         println("Encore dans la ville"); // Imprime ce texte
      }
      else // Si le numéro que l'on cherche ne correspond pas, FALSE
      {
         println("Sorti de la ville"); // Imprime ce texte
      }
   }
}



-
Edité par Trust_28 16 septembre 2019 à 13:13:05

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 13:31:23

Non ça ne correspond pas à true.

Il faudrait peut être que tu abandonnes ce que tu penses savoir des booléens, et que tu rembobines au début de l'épisode.

-
Edité par michelbillaud 16 septembre 2019 à 13:32:05

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 13:34:54

Tout ce que je sais des booléens se trouve dans mon premier post à "Les Booléens"
  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 15:04:47

Ok, alors explique, en détail et avec tes propres mots, ce que tu veux que les lignes 3 à 5 fassent.

On ne peut pas dire ce qui ne va pas dans ton raisonnement si tu ne le présentes pas en detail

-
Edité par michelbillaud 16 septembre 2019 à 15:07:33

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 20:58:29

OK, je fais faire ça en langage humain:

On a le numéro de la personne que l'on cherche (int numeroPerso=readInt();)

et la quantité de numéros dans la liste (int tailleListe=readInt();)

Le numéro de la personne que l'on cherche correspond à un des numéros dans la liste (boolean numeroTrouve=(numeroPerso==numeroListe)

Dans la quantité de numéros dans la liste (int numeroListe=readInt();)

Si on trouve le numéro de la personne parmi les auxtres numéros (int numeroListe=readInt();)

on écrit "Sorti de la ville" (if(numeroTrouve){println("Encore dans la ville");})

s'il n'y est pas, "Encore dans la ville" (else {println("Sorti de la ville");}

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 22:26:37

Premier problème, tu lit pas ce qu' on écrit. J'avais demandé  volontairement seulement les lignes 3 à 5, pas les autres.

Pour la ligne 5 c'est pas ça.

Lire : on met dans numeroTrouvé la valeur true si les valeurs ACTUELLES  des deux variables  numeroPerso et numeroListe sont égales, et faux sinon.

Y a pas de "Si on trouve" dans cette histoire. On compte les valeurs quand on passe ligne 5,  et c'est tout

-
Edité par michelbillaud 16 septembre 2019 à 22:30:44

  • Partager sur Facebook
  • Partager sur Twitter