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.
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>
Dans l'article <3fba1bc8$0$16840$ba620e4c@reader3.news.skynet.be>,
bne@dagico.com, 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>
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>
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
// 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
// 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
// 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
// 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
// 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