Can't have more than 2 in 5
Résolu/FerméUtilisateur anonyme - 7 oct. 2022 à 09:02
- Can't have more than 2 in 5
- Supercopier 2 - Télécharger - Gestion de fichiers
- 2 ecran pc - Guide
- Gto saison 2 - Forum Cinéma / Télé
- Word numéro de page 1/2 - Guide
- Tableau de combinaison loto 5/90 - Forum Excel
8 réponses
5 oct. 2022 à 21:09
"Dans le cas où quelqu'un tomberait sur le même problème que moi"
Et bien pour lui, voici ce qu'il pourrait faire :
System.out.print("Entrez le nombre de nuits que vous comptez rester : "); int nbTotal = scanner.nextInt(); int base = (nbTotal / 7) * 2; int mod = nbTotal % 7; int min = (mod == 6) ? base + 1 : base; int max = (mod < 2) ? base + mod : base + 2; System.out.print("Entrez le nombre de nuits qui tombent le week-end (entre " + min + " et " + max + ") : "); int nbWeekEnd = scanner.nextInt(); if (nbWeekEnd < min) { System.err.println("Pas assez de nuits qui tombent le week-end"); } else if (nbWeekEnd > max) { System.err.println("Trop de nuits qui tombent le week-end"); } else { System.out.println("Ok"); }
Petite explication : on a forcément 2 nuits de week-end pour chaque semaine complète (c'est la base du calcul), auquel on peut rajouter 0, 1 ou 2 nuits selon le nombre de jours restants.
Le nombre minimum de nuits à rajouter est 0 (car on peut tomber sur des nuits dans la semaine), sauf s'il y a 6 jours restants, dans ce cas il y a toujours au moins 1 nuit qui tombe sur le week-end.
Quand au nombre maximum de nuits à rajouter c'est 2, sauf bien sûr s'il y a moins de 2 nuits restantes.
1 oct. 2022 à 21:59
Je poste aussi le code complet, question que les plus braves d'entre vous compreniez peut-être mieux :)
do{ sousTotal=0; //Réinitialiser nos variable de prix total=0; //Reset prices variable System.out.println("Bien le bonjour, bienvenue chez HotelHub."); do{ try {//try catch pour éviter les erreurs de variable type. Scanner scanner = new Scanner(System.in); System.out.println("Entrez le nombre de nuit que vous comptez rester : "); jourS = scanner.nextInt(); System.out.println("Entrez le nombre de nuit de fin de semaine : "); jourFds = scanner.nextInt(); //Verif du nombre de jourFDS ne dépasse pas par tranche de 7jours if(jourFds >= 2 || jourS >= 5 || jourS > 0 || jourFds > 0){ if(jourFds > jourS){ System.out.println("Pas OK"); continue; } else if(jourFds > 2 && !(jourFds > jourS)){ jourOK=true; break; }else if (jourFds <= 2 || jourS > 0 || jourFds >= 2){ jourOK=true; break; }else if(jourS == 0 && jourFds == 0){ System.out.println("Pas OK"); continue; }else{ System.out.println("Pas OK"); continue; } }else{ System.out.println("Pas Ok"); continue; } //Catch except } catch (Exception e) { System.out.println("Il semble que vos demande soient invalide. veuillez réessayer..."); } }while(true);
1 oct. 2022 à 22:37
Bonsoir
commençons par ton premier if
if(jourFds >= 2 || jourS >= 5 || jourS > 0 || jourFds > 0)
Je change l'ordre pour que ça soit plus parlant (et comme ce sont des OU ça donne le même résultat)
if(jourFds >= 2 || jourFds > 0 || jourS >= 5 || jourS > 0)
Si jourFds vaut
- 3, la première condition est valide, c'est un OU, donc le résultat sera vrai peu importe la suite.
- 2, idem
- 1, la première condition est invalide, on passe à la suivante, qui elle est valide, donc le résultat sera vrai peu importe la suite, par contre, on constate que:
- 3 aurait aussi validé cette condition
- 2 de même
Donc tester si une valeur est >= 2 ou >0 revient à tester si elle est > 0.
Donc, sans même réfléchir à l'énoncé, ce if peut se simplifier de cette façon
if(jourFds > 0 || jourS > 0)
Ensuite, on te demande de vérifier que pour X jours de semaine, il y a toujours au maximum Y jours de fin de semaine.
Et que ce rapport est 2 pour 5.
Je pense qu'en divisant un nombre de jours par l'autre tu devrais arriver à vérifier cette hypothèse.
2 oct. 2022 à 01:13
Salut, certaines de tes précisions ont été très utile, par contre je crois que tu à mal lus l'énoncé, dans lequel j'explique le X et Y peuvent être n'importe quel nombre et que l'Exemple X (25) et y (10) n'est qu'un exemple et non un maximum ;)
2 oct. 2022 à 08:12
Non non, j'ai très bien lu l'énoncé.
Si pour 5 jours "normaux" tu ne peux pas avoir plus de 2 jours de fin de semaine, alors pour 25 jours "normaux" tu je peux pas avoir plus de 10 jours de fin de semaine.
Or avec ton code actuel, si je saisis 25 jours normaux, 11 jours de fin de semaine est accepté, par ce que tes if secondaires ne vérifient pas le rapport et c'est bien ce rapport qui est demandé dans ton énoncé.
2 oct. 2022 à 12:38
Bonjour,
"Je me doute bien que c'est à 90% inutile et que la réponse doit être très simple"
En effet, ça ressemble à un problème de maths niveau collège.
Dans ton exemple, tu restes 25 jours, soit 3 semaines et 4 jours. Donc tu auras obligatoirement 3 week-end, éventuellement un 4è selon le jour d'arrivée, soit entre 6 et 8 jours.
On pourrait affiner mais en gros il faut juste diviser par 7 et accepter une tolérance de 2 jours.
5 oct. 2022 à 00:04
Salut, sa doit être moi qui est débile mais je ne comprend ta réponse :/
pourrais-tu expliquer un peu plus s'il te plaît ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question2 oct. 2022 à 14:34
public static boolean jours(int y, int x){ //Methods to verify that there is maximum of Y(2) per X(5) + exceptions. if(y < 0 && x < 0 || x == 0 && y > 2 || x > 0 && y == 0){ if(x > 0 && y == 0){ return true; }else{ return false; } }else if(x%5==0 && y%2==0){ return true; }else if(x > 0 && x <= 5 && y > 0 && y <= 2){ return true; }else{ return false; } }
Voici la solution à laquelle je suis arrivé, dit moi ce que tu en pense ! :)
2 oct. 2022 à 15:29
Je ne comprends pas la logique.
Par exemple tu prends n'importe quel x supérieur à 5 mais non multiple de 5 (6, 7, 8, 9, 11, 12, 13, 14...) et bien peu importe la valeur de y tu auras toujours false (c'est ton dernier cas), ce qui est de toute évidence incorrect.
Nb. Est-ce que tu aurais l'énoncé exact ? Car dans ta question tu expliques avec tes mots ce que tu as compris que tu devrais faire, mais ça ajoute une complexité à notre compréhension du sujet, alors que la consigne originale nous serait sûrement plus accessible.
5 oct. 2022 à 00:00
oui bien sur, voici l'énoncé :
• Nombre de jours de fin de semaine -> Maximum 2 nuits de fin de semaine par tranche de 7 jours
5 oct. 2022 à 00:50
mais par exemple, ont pourrais avoir 8 jours de semaine, et 3 jours de fin de semaine.
5 oct. 2022 à 00:51
et ainsi de suite, donc 10 jours de semaine pour 4 jours de fin de semaine
Modifié le 5 oct. 2022 à 08:03
"voici l'énoncé : Nombre de jours de fin de semaine -> Maximum 2 nuits de fin de semaine par tranche de 7 jours"
C'est donc bien ce que je disais dans ma réponse :
"On pourrait affiner mais en gros il faut juste diviser par 7 et accepter une tolérance de 2 jours."
Pour calculer le nombre de jours de week-end possibles il faut commencer par connaître le nombre de semaines.
Donc si dans ton algorithme tu n'as pas de division par 7 c'est que tu t'es trompé quelque part. Or dans les différents codes que tu as proposé tu n'as jamais ni de division, ni de 7...
5 oct. 2022 à 16:38
merci beaucoup !
5 oct. 2022 à 08:02
Bonjour
donc KX avait raison, tu n'avais pas donné ton énoncé mais ton interprétation de celui-ci.
Et du coup, je t'ai proposé de diviser par 5 alors que non.
L'idée est que tu découpes ton nombre total de jours en paquets de 7.
Si tu n'as que des paquets de 7, alors tu as des semaines entières et donc le nombre de jours de week-end est fixe.
Si tu as un paquet incomplet, il faut que tu détermines combien tu peux avoir de jours de week-end dans ce paquet. Ces jours viendront en plus des semaines complètes.
5 oct. 2022 à 16:38
merci beaucoup !
5 oct. 2022 à 18:11
Dans le cas où quelqu'un tomberait sur le même problème que moi, je poste ici la solution que j'ai trouvé et qui est fonctionnelle :)
public static boolean jours(int y, int x){ //Methods to verify that there is maximum of Y(2) per 7d - X(5)... + exceptions. int z = 0; //Variable de calcul if ((x%5>=0) && y > 2 && !(y >= x)){ //Verifie que x est divisable par 5 et supérieur à 0, y est supérieur a 2 et que y n'est pas supérieur a x z = x / 5; if(y%2==0){ //Divise y par 2 pour faire une comparaison plus tard avec z. if((z * 2)==y){ return true; } }else{ if((z+2)==y){ return true; } return false; } }else{ if(x <= 5 && y <= 2){ return true; }else{ return false; } } return false; }
6 oct. 2022 à 13:57
le but n'est pas que se soit divisible, ici je veut seulement vérifier qu'il y aura plus que 5 jours de semaine, qui complète donc une fin de semaine, comme l'expliquer KX ont chercher d'abord et avant tous le nombre de semaine, puis ont appliqué une règle de 3 plutôt simple, pour finalement accepter une tolérance de 2, sa ne veut pas dire que ma solution est la plus optimisé, loin de là, et si tu y trouve des améliorations, libre à toi d'en faire part, mais j'ai tester l'algo sur une vingtaine de composition et toute sont retourner true ;)
6 oct. 2022 à 14:07
le but n'est pas que se soit divisible, ici je veut seulement vérifier qu'il y aura plus que 5 jours
Sauf que ce n'est pas ce que tu as codé...
Par exemple 2 % 5 = 2, y'a moins que 5 jours pourtant il y a un modulo
comme l'expliquer KX ont chercher d'abord et avant tous le nombre de semaine,
oui en divisant par 7 et non par 5.
Ton problème principal c'est les maths.
Il s'agit d'une division euclidienne, avec quotient et reste, ni plus ni moins.
Le modulo c'est le reste.
Et pour connaître le nombres de semaines qui font 7 jours, c'est par 7 qu'on divise.
6 oct. 2022 à 15:06
Petit détail quand même : (x%5 >= 0) est toujours vrai
Par définition, un modulo ne peux jamais être négatif...
Donc la condition ((x%5>=0) && y > 2 && !(y >= x))
Peut se simplifier en (y > 2 && y < x)
5 oct. 2022 à 22:20
ça c'est fonctionnel ;)