OVH Cloud OVH Cloud

Casse-Tête

43 réponses
Avatar
B. Neve
Bonsoir à tous,

Petit casse-tête entre amis...

Je voudrais dans une appli obliger de choisir une quantité qui doit être une
combinaison d'emballages possibles.

Comme chacun sait qu'un bon exemple vaut tous les discours...

J'ai des assiettes que je peux conditionner par 15, 25, 40. Dans une
rubrique texte, on met alors
25/15/40 pour dire que 25 sera la quantité par défaut et les autres des
alternatives.
On peut bien évidemment mélanger plusieurs emballages...

Quels quantités sont valides ?

10 non... ne correspond à aucun conditionnement
15 oui facile
20 non, 1 x 15 puis ???
30 oui, 2 x 15
45 oui, 3 x 15
48 non
50 oui, 2 x 25
55 oui, 2 x 15 + 1 x 25
60 oui, 4 x 15
65, oui 1 x 40 + 1 x 25 ou 2 x 25 + 1 x 15
69, non
... Et ainsi de suite

Comment feriez vous une fonction qui me renverrait Vrai/Faux en lui envoyant
2 paramètres : "Quantité" (60) et "chaine de conditionnement" (25/15/40)

Des remerciements en pagaille au premier qui trouve la sympathique fonction.

B. Nève
nospam-bne@dagico.com

3 réponses

1 2 3 4 5
Avatar
Bob Lamar
Dans l'article <3fba1bc8$0$16840$,
, dit 'B. Neve', a écrit...
La bête n'est pas morte !
Avec ta procédure,
110 donne impossible pourtant 2x40 + 2x150
130 donne 2 x 40 + 1 x 25 ... Paaas booon !

;-)




si tu veux du dynamique tu peux adapter mon algo de ce matin en faisant
du recursif (avec les pb de performances que ca represente...),
On va voir si la pile windev est costaud(e) :)
voila ce que ca donne en WD5.5 (jai fait l'effort de tester cette fois,
c'est finalement ta chaine d'emballage le truc le plus penible a gerer
;)

fonction FB_TST_EMB( LN_QUA , LT_EMB )
i est entier
LN_EMB est entier = extraitchaine( LT_EMB , 1 , "/" )

si modulo ( LN_QUA , LN_EMB ) = 0 alors
renvoyer vrai
fin

si extraitchaine( LT_EMB , 2 , "/" ) = EOT alors
renvoyer faux
fin

pour i = ( LN_QUA / LN_EMB ) a 0 pas -1
si FB_TST_EMB( LN_QUA - i * LN_EMB , ...
LT_EMB[[position( LT_EMB , "/" ) + 1 à taille(LT_EMB) ]] )
alors
renvoyer vrai
fin
FIN
renvoyer faux

--
o laisser la ligne contenant la mention de la personne à qui l'on répond
o ne citer que le strict nécessaire, mais citer quelque chose
o répondre point par point, en dessous du texte cité
o répondre sur usenet:<http://www.giromini.org/usenet-fr/repondre.html>
Avatar
Discret
Bonjour,

Essayez ça :

// C1 C2 et C3sont les conditionnements (15 25 40 par exemple)
// Attention il faut C3 > C2 > C1
// Q est la quantité commandée

mReste est un entier

Q1 est un entier // Nombre de C1
Q2 est un entier // Nombre de C2
Q3 est un entier // Nombre de C3

mReste = Q

CestBon est un booleen
CestBon = faux

BOUCLE
// Calcul du nombre de C3 possible
si mReste >= C3
// Max de C3 possible
Q3 = partieentiere(mReste / C3)
mReste = mReste - (Q3 * C3)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
// mReste < C3
si mReste >= C2
// Max de C2 possible
Q2 = partieentiere(mReste / C2)
mReste = mReste - (Q2 * C2)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si mReste >= C1
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si Q3 + Q2 = 0
bip
erreur("Conditionnement impossible.")
RETOUR
sinon
SORTIR
FIN
FIN
FIN
FIn
FIN

si CestBon = faux
BOUCLE
si Q2 > 0
Q2 = Q2 - 1
mReste = Q - Q3*C3 - Q2*C2
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si Q3 > 0
Q3 = Q3 - 1
mReste = Q - Q3*C3
// Max de C2
Q2 = partieentiere(mReste / C2)
mReste = mReste - (Q2 * C2)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
FIN
FIN
FIN
FIN

SI CestBon = Vrai
bip
info(Q3 + "*" + C3 + " + " + Q2 + "*" + C2 + " + " + Q1 + "*" + C1)
sinon
bip
erreur("Impossible à conditionner.")
FIN

@+ Laurent
Avatar
Discret
Oups petite modif sur la fin :

// C1 C2 et C3sont les conditionnements (15 25 40 par exemple)
// Attention il faut C3 > C2 > C1
// Q est la quantité commandée

mReste est un entier

Q1 est un entier // Nombre de C1
Q2 est un entier // Nombre de C2
Q3 est un entier // Nombre de C3

mReste = Q

CestBon est un booleen
CestBon = faux
stop
BOUCLE
// Calcul du nombre de C3 possible
si mReste >= C3
// Max de C3 possible
Q3 = partieentiere(mReste / C3)
mReste = mReste - (Q3 * C3)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
// mReste < C3
si mReste >= C2
// Max de C2 possible
Q2 = partieentiere(mReste / C2)
mReste = mReste - (Q2 * C2)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si mReste >= C1
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si Q3 + Q2 = 0
bip
erreur("Conditionnement impossible.")
RETOUR
sinon
SORTIR
FIN
FIN
FIN
FIn
FIN

si CestBon = faux
BOUCLE
si Q2 > 0
Q2 = Q2 - 1
mReste = Q - Q3*C3 - Q2*C2
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
si Q3 > 0
Q3 = Q3 - 1
mReste = Q - Q3*C3
// Max de C2
Q2 = partieentiere(mReste / C2)
mReste = mReste - (Q2 * C2)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
// Max de C1
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
sinon
Q1 = partieentiere(mReste / C1)
mReste = mReste - (Q1 * C1)
si mReste = 0
CestBon = Vrai
SORTIR
FIN
si Q3 + Q2 = 0
SORTIR
FIN
FIN
FIN
FIN
FIN

SI CestBon = Vrai
bip
info(Q3 + "*" + C3 + " + " + Q2 + "*" + C2 + " + " + Q1 + "*" + C1)
sinon
bip
erreur("Impossible à conditionner.")
FIN

@+ Laurent
1 2 3 4 5