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

10 réponses

1 2 3 4 5
Avatar
Marcel.berman
Salut !

Salut Benoit !
Ton problème m'a interpellé ce matin ...
Voici une solution qui semble marcher ...

PROCEDURE QuantitéValide(nQty=0,cCond="")
LOCAL
nCond est un entier
tnCond est un tableau de 0 entiers
nLoop est un entier

nResteAlivrer est un entier
nCondMax, nCondMin sont des entiers
nCondStandard est un entier


SI nQty = 0 ALORS
Erreur("Quantitévalide a été invoqué sans quantité à livrer !")
FIN
SI SansEspace(cCond) = "" ALORS
Erreur("Quantitévalide a été invoqué sans conditionnement !")
FIN
nCondMax = 0
nCondMin = 999999999
nCond = ChaîneOccurrence(cCond+"/","/")
POUR nLoop = 1 A nCond
Dimension(tnCond,nLoop)
tnCond[nLoop] = Val(ExtraitChaîne(cCond,nLoop,"/"))
SI nLoop = 1 ALORS
nCondStandard = tnCond[nLoop]
FIN
nCondMin = Min(nCondMin,tnCond[nLoop])
nCondMax = Max(nCondMax,tnCond[nLoop])
SI nQty = tnCond[nLoop] ALORS RENVOYER Vrai
FIN
SI nQty < nCondMin ALORS
// Pas besoin de tester
RENVOYER Faux
SINON
nResteAlivrer = nQty
BOUCLE
// Ici on privilégie les plus grands conditionnements
// Si on veut privilégier les conditionnements standards
// Il suffit d'inverser les conditions ...
SI nResteAlivrer >= nCondMax ALORS
nResteAlivrer = modulo(nResteAlivrer,nCondMax)
SINON
SI nResteAlivrer >= nCondStandard ALORS
nResteAlivrer = modulo(nResteAlivrer,nCondStandard)
SINON
SI nResteAlivrer < nCondMin ALORS
SORTIR
SINON
POUR nLoop = 1 A nCond
SELON tnCond[nLoop]
CAS nCondMax,nCondStandard
// On a déjà testé
AUTRE CAS
nResteAlivrer = modulo(nResteAlivrer,tnCond[nLoop])
FIN
FIN
FIN
FIN
FIN
FIN
FIN
SI nResteAlivrer = 0 ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN

Bien à toi !

--
Marcel Berman
c/o Managing Business SPRL
Allée du Petit Paris, 11
B - 1410 - Waterloo
Tel : +32 2 351.60.64
Fax : +32 2 351.45.78
Gsm : +32 475.799.477
Avatar
farplus
Bonjour,

selon moi la solution la plus simple est la suivante:
paquets est un tableau de 3 entiers
reste est un entier
quantite est un entier
conditionnement est un tableau de 3 entiers

conditionnement[1]@
conditionnement[2]%
conditionnement[3]
idx est un entier
si quantite>@ alors
idx=1
sinon
si quantite>% alors
idx=2
sinon
si quantite> alors
idx=3
sinon
renvoyer Faux
fin
fin
fin
fin
//
x est un entier

paquets[idx]=quantite / conditionnement[idx]
si res=modulo(quantite,conditionnement[idx])=0 alors
renvoyer vrai
sinon
x=idx+1
si x>3 alors
renvoyer faux
sinon
paquets[x]=quantite / conditionnement[x]
si res=modulo(quantite/conditionnement[x])=0 alors
renvoyer vrai
sinon
x++
si x>3 alors
renvoyer faux
sinon
paquets[3]=quantite / conditionnement[3]
si res=modulo(quantite/conditionnement[3])=0 alors
renvoyer vrai
sinon
renvoyer faux
fin
fin
fin
fin
fin

Ca devrait fonctionner pas mal.

"B. Neve" a écrit dans le message de
news:3fb94759$0$15807$
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






Avatar
Firetox
pour 4780
si tu appelle la procedure acec :

"40/25/15" -------------> pas possible (en fait reste 5)

"40/25/15/5" -------------> 119 x 40 / 1 x 5

"25/40/15/5" -------------> 191 x 25 / 1 x 5

voila l'importance des paquets est respecter par leur ordre dans la chaine


Bon dev
@+

"Firetox" a écrit dans le message de news:
bpcnpv$qfh$
si tu rajoute dans l'appel a la procedure /5 pour prendre les colis de 5


car
sinon ca fonctionne pas tu obtient : OK avec 119 x 40 / 1 x 5

ca fonctionne

faites des test avec la deuxieme celle qui donne le resultat et la chaine


en
retour
pour voir le dispatch


"Roumegou" a écrit dans le message de news:
bpcnig$dtv$
> Impressionnant mais comme je ne comprenais pas comment cela marchait
> vraiment, j'ai testé ta proc
>
> > PROCEDURE TestEmballage(emballage est une chaîne, quantite est une
> > chaîne)
> >
> > i = 1
> > TANTQUE i <= Dimension(emb)
> > SI rest = emb[i] ALORS
>
> ici je crois que ce serait plutôt SI rest>=emb[i] ALORS ????
>
>
> > rest = rest - emb[i]
> > i=1
> > FIN
>
> Mais en faisant des tests, Prenons la valeur 4780 qui est renvoyée
> innéligible par ta proc.
> C'est vrai que PartieEntiere(4780/25)= 191 soit 4475 et donc reste 5 et


ça
> le fait plus.
> Pourtant 4780=(5 * 190) + (15 * 2)
>
>
>
> Moralité : la bête n'est pas morte ;-)
> Eric
>
>




Avatar
Roumegou
Ouais il interpelle tout le monde et il nous provoque ;-)
Si cela se trouve il est mort de rire à nous voir nous démener rofl

Désolé Marcel mais avec le test à 4780, cela ne fn pas (ni avec 80 et 45
d'ailleurs)
Bon moi j'arrête de me casser la tête.
Eric


wrote:
Salut !

Salut Benoit !
Ton problème m'a interpellé ce matin ...
Voici une solution qui semble marcher ...

PROCEDURE QuantitéValide(nQty=0,cCond="")
LOCAL
nCond est un entier
tnCond est un tableau de 0 entiers
nLoop est un entier

nResteAlivrer est un entier
nCondMax, nCondMin sont des entiers
nCondStandard est un entier


SI nQty = 0 ALORS
Erreur("Quantitévalide a été invoqué sans quantité à livrer !")
FIN
SI SansEspace(cCond) = "" ALORS
Erreur("Quantitévalide a été invoqué sans conditionnement !")
FIN
nCondMax = 0
nCondMin = 999999999
nCond = ChaîneOccurrence(cCond+"/","/")
POUR nLoop = 1 A nCond
Dimension(tnCond,nLoop)
tnCond[nLoop] = Val(ExtraitChaîne(cCond,nLoop,"/"))
SI nLoop = 1 ALORS
nCondStandard = tnCond[nLoop]
FIN
nCondMin = Min(nCondMin,tnCond[nLoop])
nCondMax = Max(nCondMax,tnCond[nLoop])
SI nQty = tnCond[nLoop] ALORS RENVOYER Vrai
FIN
SI nQty < nCondMin ALORS
// Pas besoin de tester
RENVOYER Faux
SINON
nResteAlivrer = nQty
BOUCLE
// Ici on privilégie les plus grands conditionnements
// Si on veut privilégier les conditionnements standards
// Il suffit d'inverser les conditions ...
SI nResteAlivrer >= nCondMax ALORS
nResteAlivrer = modulo(nResteAlivrer,nCondMax)
SINON
SI nResteAlivrer >= nCondStandard ALORS
nResteAlivrer = modulo(nResteAlivrer,nCondStandard)
SINON
SI nResteAlivrer < nCondMin ALORS
SORTIR
SINON
POUR nLoop = 1 A nCond
SELON tnCond[nLoop]
CAS nCondMax,nCondStandard
// On a déjà testé
AUTRE CAS
nResteAlivrer = modulo(nResteAlivrer,tnCond[nLoop])
FIN
FIN
FIN
FIN
FIN
FIN
FIN
SI nResteAlivrer = 0 ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN

Bien à toi !



--
Eric Roumegou
Avatar
Firetox
essaye avec ca :

PROCEDURE TestEmballage(emballage est une chaine, quantite est une chaine)

// format de emballage : 15/25/40
// format de quantite : 65 ==> dans ce sens 2 x 25 / 1 x
15

// format de emballage : 40/25/15
// format de quantite : 65 ==> dans ce sens 1 x 40 / 1 x
25

rest est un entier
i,j,id est un entier
qte est un entier = Val(quantite)
res,Res2 est une chaîne

emb est un tableau dynamique
Divis est un tableau dynamique

emb = allouer un tableau de 0 entier
Divis = allouer un tableau de 0 entiers

Dimension(emb,ChaîneOccurrence(emballage,"/")+1)
Dimension(Divis,ChaîneOccurrence(emballage,"/")+1)

rest = qte

POUR i = 1 A Dimension(emb)
emb[i] = Val(ExtraitChaîne(emballage,i,"/"))
Divis[i] = PartieEntière(qte/emb[i])
FIN

POUR j = 1 A Dimension(Divis)
rest = qte - ((Divis[j] * emb[j]))
i = 1
SI Divis[j]> 0 ALORS
id=1
res = Divis[j] + " x "+emb[j] + " / "
TANTQUE i <= Dimension(emb)
SI rest >= emb[i] ALORS
Res2 = id+" x "+emb[i] + " / "
id++
rest = rest - emb[i]
i=1
FIN
SI rest = 0 ALORS SORTIR
Res2 = ""
i++
FIN
FIN
SI rest = 0 ALORS SORTIR
res = ""
FIN

ChaineRetour = res +Res2
si rest = 0 alors renvoyer vrai
renvoyer faux


"Roumegou" a écrit dans le message de news:
bpcou5$gnl$
Ouais il interpelle tout le monde et il nous provoque ;-)
Si cela se trouve il est mort de rire à nous voir nous démener rofl

Désolé Marcel mais avec le test à 4780, cela ne fn pas (ni avec 80 et 45
d'ailleurs)
Bon moi j'arrête de me casser la tête.
Eric


wrote:
> Salut !
>
> Salut Benoit !
> Ton problème m'a interpellé ce matin ...
> Voici une solution qui semble marcher ...
>
> PROCEDURE QuantitéValide(nQty=0,cCond="")
> LOCAL
> nCond est un entier
> tnCond est un tableau de 0 entiers
> nLoop est un entier
>
> nResteAlivrer est un entier
> nCondMax, nCondMin sont des entiers
> nCondStandard est un entier
>
>
> SI nQty = 0 ALORS
> Erreur("Quantitévalide a été invoqué sans quantité à livrer !")
> FIN
> SI SansEspace(cCond) = "" ALORS
> Erreur("Quantitévalide a été invoqué sans conditionnement !")
> FIN
> nCondMax = 0
> nCondMin = 999999999
> nCond = ChaîneOccurrence(cCond+"/","/")
> POUR nLoop = 1 A nCond
> Dimension(tnCond,nLoop)
> tnCond[nLoop] = Val(ExtraitChaîne(cCond,nLoop,"/"))
> SI nLoop = 1 ALORS
> nCondStandard = tnCond[nLoop]
> FIN
> nCondMin = Min(nCondMin,tnCond[nLoop])
> nCondMax = Max(nCondMax,tnCond[nLoop])
> SI nQty = tnCond[nLoop] ALORS RENVOYER Vrai
> FIN
> SI nQty < nCondMin ALORS
> // Pas besoin de tester
> RENVOYER Faux
> SINON
> nResteAlivrer = nQty
> BOUCLE
> // Ici on privilégie les plus grands conditionnements
> // Si on veut privilégier les conditionnements standards
> // Il suffit d'inverser les conditions ...
> SI nResteAlivrer >= nCondMax ALORS
> nResteAlivrer = modulo(nResteAlivrer,nCondMax)
> SINON
> SI nResteAlivrer >= nCondStandard ALORS
> nResteAlivrer = modulo(nResteAlivrer,nCondStandard)
> SINON
> SI nResteAlivrer < nCondMin ALORS
> SORTIR
> SINON
> POUR nLoop = 1 A nCond
> SELON tnCond[nLoop]
> CAS nCondMax,nCondStandard
> // On a déjà testé
> AUTRE CAS
> nResteAlivrer = modulo(nResteAlivrer,tnCond[nLoop])
> FIN
> FIN
> FIN
> FIN
> FIN
> FIN
> FIN
> SI nResteAlivrer = 0 ALORS
> RENVOYER Vrai
> SINON
> RENVOYER Faux
> FIN
>
> Bien à toi !

--
Eric Roumegou




Avatar
Roumegou
Firetox wrote:
pour 4780
si tu appelle la procedure acec :

"40/25/15" -------------> pas possible (en fait reste 5)



mais si et c'est là où tout le monde bute 4780=(190*25) + (15*2)
Le pb est que la bonne combinaison ne se fait pas forcément avec les plus
grands diviseurs

"40/25/15/5" -------------> 119 x 40 / 1 x 5



oui mais là tu triches ;-) Si tu veux, on rajoute les paquets de 1 et on est
les rois du monde :o)

"25/40/15/5" -------------> 191 x 25 / 1 x 5

voila l'importance des paquets est respecter par leur ordre dans la
chaine





Eric
Avatar
Eric LAURENT
Petit problème sympa mais somme toute assez facile à résoudre.
Voici ma solution.

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,20)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre commande
d'au moins "+ (15-Reste1)+" produits")
RETOUR
FIN
FIN

Cond20= PartieEntière(Reste1/20)
Reste2=modulo(Cond20,20)

Cond15= PartieEntière(Reste2/15)
Reste3=modulo(Cond15,15)

SI Reste3>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre commande
d'au moins "+ Reste3+" produits")
SINON
Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond20+" cartons de 20"+RC+...
Cond15+" cartons de 15")
FIN

-----------------------------------------------------
Eric LAURENT.






B. Neve wrote:
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



Avatar
Roumegou
Firetox wrote:
essaye avec ca :



Ca marchera pas ...
Le test qui tue c'est 4780 (par ex)
Avatar
Eric LAURENT
Ouups ! petit correctif: (au fait, j'ai gagné quelque chose ? - peut-être
Windev 8 gratuit ou la 7.5 enfin deboggée !)
------------------------------------------------------------

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,20)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre commande
d'au moins "+ (15-Reste1)+" produits")
RETOUR
SINON
Cond15= PartieEntière(Reste1/15)
FIN
SINON
Cond20= PartieEntière(Reste1/20)
FIN

Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond20+" cartons de 20"+RC+...
Cond15+" cartons de 15")
-------------------------------------------------------
Eric LAURENT




Eric LAURENT wrote:
Petit problème sympa mais somme toute assez facile à résoudre.
Voici ma solution.

QuantiteTotale est un entier //A livrer
Cond40 est un entier //Conditionnement par 40
Cond20 est un entier //Conditionnement par 20
Cond15 est un entier //Conditionnement par 15

Reste1 est un entier
Reste2 est un entier
Reste3 est un entier

QuantiteTotaleG80

Cond40= PartieEntière(QuantiteTotale/40)
Reste1= modulo(QuantiteTotale,40)

SI modulo(Reste1,20)>0 ALORS
SI modulo(Reste1,15)>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre
commande d'au moins "+ (15-Reste1)+" produits")
RETOUR
FIN
FIN

Cond20= PartieEntière(Reste1/20)
Reste2=modulo(Cond20,20)

Cond15= PartieEntière(Reste2/15)
Reste3=modulo(Cond15,15)

SI Reste3>0 ALORS
Erreur("Erreur de conditionnement","Vous devez compléter votre
commande d'au moins "+ Reste3+" produits")
SINON
Info("Votre commande sera conditionné avec "+RC+...
Cond40+" cartons de 40"+RC+...
Cond20+" cartons de 20"+RC+...
Cond15+" cartons de 15")
FIN

-----------------------------------------------------
Eric LAURENT.






B. Neve wrote:
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





Avatar
Bob Lamar
Dans l'article <bpcqus$3qq$,
, dit 'Roumegou', a écrit...
Firetox wrote:
> essaye avec ca :
>
Ca marchera pas ...
Le test qui tue c'est 4780 (par ex)



ca me faire peur ce fil...
(vous etes sur que c'est windev qui genere des excutables trop gros ?)

au fait la question est bien :
'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)'

--
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>
1 2 3 4 5