Can't have more than 2 in 5

Résolu/Fermé
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 - 1 oct. 2022 à 21:54
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 - 7 oct. 2022 à 09:02

Salut, en tant qu'étudiant nous avons reçu un petit devoir qui consiste à vérifier que le nombre de nuit de fin de semaine 2 (Y) n'arrive jamais plus qu'une fois par 5 (X) jour de semaine, et ce peu importe l'entrée, exemple : Ont pourrais avoir 25 jours de semaine, mais pas plus que 10 jours de fds, ou alors X(25) pour Y(10), j'ai essayé beaucoup de combinaison et pour l'instant voici le mieux que j'ai réussi à faire. 

 

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;
                    }

Je me doute bien que c'est à 90% inutile et que la réponse doit être très simple, mais j'ai eu beau rechercher sur Google, je n'ai absolument rien trouver. Votre aide serait extrêmement apprécié ! 

8 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
5 oct. 2022 à 22:20

ça c'est fonctionnel ;)

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
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);
0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
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.


0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
1 oct. 2022 à 22:43

D'ailleurs, ton code ne vérifie même pas l'exemple donné.

Si je tape 25 et 11, il valide, alors que l'énoncé dit que c'est 10 maxi.

1
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
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 ;)

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022
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é.

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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.


0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
2 oct. 2022 à 13:07

Salut, dans l'absolue je suis d'accord avec toi, mais ce n'est même pas ce que demande l'énoncé.

Enfin selon ma lecture.

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
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 ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
2 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 ! :)

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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.

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
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

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3 > willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022
5 oct. 2022 à 00:50

mais par exemple, ont pourrais avoir 8 jours de semaine, et 3 jours de fin de semaine.

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3 > willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022
5 oct. 2022 à 00:51

et ainsi de suite, donc 10 jours de semaine pour 4 jours de fin de semaine

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
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...

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
5 oct. 2022 à 16:38

merci beaucoup !

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
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.


0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
5 oct. 2022 à 16:38

merci beaucoup ! 

0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3
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;
    }
0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
5 oct. 2022 à 18:28

Heu, non pas fonctionnelle....

Tu divises par 5, il ne faut pas.

Ça

if ((x%5>=0) 

ça ne veut pas dire au contraire, si le reste est différent de 0, alors x n'est pas divisible par 5.

Par exemple

  • 25 % 5 = 0 => 25 est divisible par 5
  • 32 % 5 = 2 => 32 n'est pas divisible par 5
0
willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022 3 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
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 ;)

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > willi_4185 Messages postés 41 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 6 octobre 2022
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.

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
Modifié le 6 oct. 2022 à 14:09

Et puis quand même, ce commentaire dans le code

//Verifie que x est divisable par 5

C'est bien toi qui l'a mis sur la ligne où tu as codé un modulo qui vérifie que x n'est pas divisible par 5....

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
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)

0