Comment construire mon algorithme ?

Résolu/Fermé
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - Modifié par lml-mike le 2/09/2010 à 16:45
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 8 sept. 2010 à 13:39
Bonjour,

Je suis en train de m'arracher la tête sur une problématique d'algorithme que je n'arrive pas à concevoir...Toute aide sur sa construction est la bienvenue !

Je vous explique la situation et les contraintes :
____________________________________________

J'ai un tableau de l'historique de mes consommations (Sandwich, boisson, chips etc...) de plusieurs colonnes et de 2 lignes constitué :
1°ligne : la nature de ma consommation
2°ligne : Son prix.

Lorsque le total de mes consommations est supérieur à 6, 15 ou 28 €, une formule est applicable mais sous certaines conditions :
6€ : Je dois avoir pris un Repas*
15€ : Je dois avoir pris un Repas*
28€ : Je dois avoir pris 2 Repas*

*Un Repas =
- une boisson d'une valeur de 1,30€ (ou moins) et un sandwich d'une valeur de 3,50€ (ou moins),
OU
- 4 boissons d'une valeur de 1,30€ (ou moins)

J'ai dans mes consommations :
Des sandwichs de 2,50€ à 4,50€
des boissons de 1€ à 2,50€

Pour les suppléments :
- Tous les sandwichs de plus de 3,50€ peuvent être utilisé dans un repas, mais un supplément correspondant à la différence du prix moins 3,50€ doit être appliqué.
- Toutes les boissons de plus de 1,30€ peuvent être utilisé dans un repas, mais un supplément correspondant à la différence du prix moins 1,30€ doit être appliqué.

J'ai 2 problématiques, une pas facile et l'autre infaisable :

1°) par quel moyen je peux calculer le prix total en appliquant les formules (ou pas) à mon tableau en quête d'un (pour la formule 6€) ou plusieurs repas (15€,28€) (sachant que 2 maximum me suffisent), sachant que les consommations les plus proches de 3,50€ (ou 1,30 s'il s'agit de 4 boissons) doivent être utilisées ?
2°) Comment je peux informer le client s'il lui manque une boisson ou un sandwich pour bénéficier d'une offre plus intéressante que ce qu'il doit payer actuellement ?

_________________________________

je pose cela si jamais un amateur de sujet d'algorithmes passe par là. Mon problème est vraiment casse-tête ^^'

Merci en tout cas pour votre attention !

Mike.
A voir également:

4 réponses

Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
2 sept. 2010 à 22:15
Bonsoir,
Peux-tu détailler ce que tu appelles formule : je ne vois pas quelle est la différence entre 6 et 15€
@+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
3 sept. 2010 à 10:25
Il y a un service de cybercafé associé à ces consommations, mais j'ai pas voulu le préciser pour ne pas vous embrouiller...

J'ai trouvé une idée d'algorithme, je le publie d'ici 5mn le temps de le vérifier...
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 3/09/2010 à 11:22
Voilà l'algorithme quasi-incompréhensible que j'ai fais suivant mon problème.

Je suis désolé mais je suis pas développeur à la base, désolé si certaines fonctions de l'algorithme s'écrivent pas réellement comme ça...
(désolé, l'indentation ne fonctionne pas sur CCM sur les dernières lignes je sais pas pourquoi ...)


Pour les plus tordus, bonne chance, j'espère que vous arriverez à suivre :

___________________________________


Début 
Case tableau(Colonne1,Ligne1) 
Tant que .active <> « » 
 Si .active = « Salade » alors 
  Nbsandwich <- nbsandwich + 1 
  Sandwich <- 1 
 Sinon si .active = « Sandwich » alors 
  Nbsandwich <- nbsandwich + 1 
  Sandwich <- 1 
 Sinon si .active = « Pizza » alors 
  Nbsandwich <- nbsandwich + 1 
  Sandwich <- 1 
 Sinon si .active = « Pâtes » alors 
  Nbsandwich <- nbsandwich + 1 
  Sandwich <- 1 
 Sinon si .active = « Frites » alors 
  Nbsandwich <- nbsandwich + 1 
  Sandwich <- 1 
 Sinon si .active = « boisson » alors 
  Nbboisson <- nbboisson + 1 
  Boisson <- 1 
Fin si 
 Case suivante 
 Prix_conso <- .active  

 Si sandwich = 1 alors 
  Si prix_formule < prix_conso alors 
   Prix_formule <- prix_conso 
  Sinon si prix_formuleb < prix_conso alors 
   Prix_formuleb <- prix_conso 
  Fin si 
 Fin si 
 Si boisson = 1 alors 
  Si prix_formule2 < prix_conso alors 
   Prix_formule2 <- prix_conso 
  Sinon si prix_formule2b < prix_conso alors 
   Prix_formule2b <- prix_conso 
  Sinon si prix_formule2c < prix_conso alors 
   Prix_formule2c <- prix_conso 
  Sinon si prix_formule2d < prix_conso alors 
   Prix_formule2d <- prix_conso 
  Fin si 
Sandwich <- 0 
Boisson <- 0 
Colonne suivante 
Case -1 
Fin tant que 

Si prix_formule > 3.5 alors 
 Diff_Prix_formule <- Diff_prix_formule - 3.5 
Fin si 
Si prix_formuleb > 3.5 alors 
 Diff_prix_formule2 <- Diff_prix_formule2 - 3.5 
Fin si 
Si prix_formule2 > 1.3 alors 
 Diff_prix_formule2 <- Diff_prix_formule2 - 1.3 
Fin si 
Si prix_formule2b > 1.3 alors 
 Diff_prix_formule2b  <- Diff_prix_formule2b - 1.3 
Fin si 
Si prix_formule2c > 1.3 alors 
 Diff_prix_formule2c  <- Diff_prix_formule2c - 1.3 
Fin si 
Si prix_formule2b > 1.3 alors 
 Diff_prix_formule2d  <- Diff_prix_formule2d - 1.3 
Fin si 

 Si prix_formule2 <> « » et prix_formule2b <> « » et prix_formule2c <> « » et prix_formule2d <> « » et repas < 2 alors 
  Déduction_repas = Déduction_repas + prix_formule2 + prix_formule2b + prix_formule2c + prix_formule2d 
  Supp_repas = supp_repas + Diff_prix_formule2 + Diff_prix_formule2b + Diff_prix_formule2c + Diff_prix_formule2d 
  Repas <- Repas + 1 
 Fin si 
 Si prix_formule <> « » et prix_formule2 <> « » et repas < 2 alors 
  Déduction_repas = Déduction_repas + prix_formule + prix_formule2 
  Supp_repas = Supp_repas + diff_prix_formule + diff_prix_formule2 
  Repas <- Repas + 1 
 Fin Si 
 Si prix_formuleb <> « » et prix_formule2b <> « » < 2 alors 
  Déduction_repas = Déduction_repas + prix_formuleb + prix_formule2b 
  Supp_repas = Supp_repas + diff_prix_formuleb + diff_prix_formule2b 
  Repas <- Repas + 1 
 Fin si 

Si prix_total_conso > 28 alors 
Si repas = 2 alors 
Prix_total_conso = prix_total_conso - Déduction_repas 
Prix_total_conso = prix_total_conso + 28 
Prix_total_conso = prix_total_conso + Supp_repas 
Afficher « Formule 28€ appliquée ! » 
Sinon 
Afficher « Il vous manque » & 2 - Repas & « Repas pour valider une formule journée ! » 
Fin si 
Sinon si prix_total_conso > 15 alors 
Si repas  = 1 alors 
Prix_total_conso = prix_total_conso - Déduction_repas 
Prix_total_conso = prix_total_conso + 15 
Prix_total_conso = prix_total_conso + Supp_repas 
Afficher « Formule 15€ appliquée ! » 
Sinon 
Afficher « Il vous manque un repas pour valider une formule Demi-journée ! » 
Fin si 
Sinon si prix_total_conso > 6 alors 
Si repas = 1 alors 
Prix_total_conso = prix_total_conso - Déduction_repas 
Prix_total_conso = prix_total_conso + 6 
Prix_total_conso = prix_total_conso + Supp_repas 
Afficher « Formule 15€ appliquée ! » 
 Sinon 
Afficher « Il vous manque un repas pour valider une formule à toute heure ! » 
Fin si 
Fin si 

Afficher « Vous devez payer » & prix_total_conso & « euros » 

Fin 




________________________________________

J'ai deux problèmes insolubles avec cet algorithme :

- Si un client prends 8 boissons seulement, ils ne seront pas comptabilisés comme 2 repas, mais comme un seul
- Si un client prends 4 boissons et un sandwich, ils seront comptabilisés comme 2 repas alors qu'il manque une boisson.

Si un casse-cou est prêt à m'aider à régler ce problème, je lui en serait vraiment reconnaissant !!

Merci pour votre attention !
0
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
3 sept. 2010 à 18:09
Bonjour,
L'application des formules n'est pas très clair (en tout cas pour moi) :
si le client prend 2 sandwichs et 4 boissons : a-t-il deux repas et deux boissons ou un repas et deux sandwichs?
@+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 3/09/2010 à 21:16
Pour ton exemple de 2 sandwichs et 4 boissons :

Selon la logique de l'algorithme, il a 2 repas, composé d'un repas de 4 boissons, et d'un sandwich avec...une boisson déjà utilisé pour le repas...

Mon algorithme est faux, il faut que je trouve un moyen de faire sauter le ou les boissons dans la boucle tant que lorsqu'elle(s) est ou sont déjà utilisée(s) dans un repas ....

Rahhhhh c'est dûr ...
0
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
3 sept. 2010 à 21:27
Oui, mais quel résultat souhaiterais-tu dans ce cas ? Est-ce que tu as une logique ou des priorités (le plus rentable par exemple)

@+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
6 sept. 2010 à 10:17
En fait c'est pas le plus rentable que je veux, c'est le plus profitable pour le client (4 boissons font 5.20€, 1 sandwich et une boisson fait 3.50+1.3 = 4.80€).

Avec ton exemple, si le gars prends deux sandwichs et 4 boissons, il faut que ce soit comptabilisé comme 2 repas (Sandwich + boisson)+ les deux boissons restantes comptabilisées.
Dans mon algorithme qui est faux, cela compte comme 2 repas mais sous forme 1 repas 4 boissons et 1 repas Sandwich + boisson, alors que les 4 boissons sont déjà comptabilisées en tant que repas. Il y a donc une boisson qui est comptée comme double.

Ma nouvelle problématique serait : comment faire pour que quand une boisson est utilisée dans une formule elle ne puisse pas etre réutilisée pour une autre ?

plusieurs exemples :
- 2 sandwichs et 4 boissons = 2 repas + 2 boissons
- 1 sandwich et 4 boissons = 1 repas (4 boissons) + 1 sandwich
- 1 sandwich et 5 boissons = 2 repas (4 boissons + Sandwich&boisson)
- 2 sandwichs et 6 boissons = 2 repas (4 boissons + Sandwich&boisson) +1 sandwich + 1 boisson

Vous avez compris la logique ? Je suis désolé, je vous l'ai dis c'est vraiment pas facile ...
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
6 sept. 2010 à 16:27
J'ai trouvé un moyen plutôt long mais qui est sûr pour pouvoir gérer ça... Le code est en VB mais c'est plutôt simple à comprendre (il s'agit juste de la partie contrôle pour les boissons :

If nbboisson = 8 Then
    déduction_repas = déduction_repas - prix_formuleb - prix_formuleb2 _
                                      - prix_formuleb3 - prix_formuleb4 _
                                      - prix_formuleb5 - prix_formuleb6 _
                                      - prix_formuleb7 - prix_formuleb8
    Supp_repas = Supp_repas + diff_prix_formuleb + diff_prix_formuleb2 + diff_prix_formuleb3 _
                            + diff_prix_formuleb4 + diff_prix_formuleb5 + diff_prix_formuleb6 _
                            + diff_prix_formuleb7 + diff_prix_formuleb8
    Repas = Repas + 2
ElseIf nbboisson > 4 And Repas < 2 Then
    If nbsandwich >= 1 Then
    déduction_repas = déduction_repas - prix_formule - prix_formuleb _
                                      - prix_formuleb2 - prix_formuleb3 _
                                      - prix_formuleb4 - prix_formuleb5
    Supp_repas = Supp_repas + diff_prix_formule + diff_prix_formuleb + diff_prix_formuleb2 _
                            + diff_prix_formuleb3 + diff_prix_formuleb4 + diff_prix_formuleb5
    Repas = Repas + 2
    Else
    déduction_repas = déduction_repas - prix_formuleb - prix_formuleb2 _
                                      - prix_formuleb3 - prix_formuleb4
    Supp_repas = Supp_repas + diff_prix_formuleb + diff_prix_formuleb2 _
                            + diff_prix_formuleb3 + diff_prix_formuleb4
    Repas = Repas + 1
    End If
ElseIf nbboisson = 4 And Repas < 2 Then
    If nbsandwich >= 2 Then
        déduction_repas = déduction_repas - prix_formule - prix_formule2 _
                                          - prix_formuleb - prix_formuleb2
        Supp_repas = Supp_repas + diff_prix_formule + diff_prix_formule2 _
                                + diff_prix_formuleb + diff_prix_formuleb2
        Repas = Repas + 2
    Else
        déduction_repas = déduction_repas - prix_formuleb - prix_formuleb2 _
                                          - prix_formuleb3 - prix_formuleb4
        Supp_repas = Supp_repas + diff_prix_formuleb + diff_prix_formuleb2 _
                                + diff_prix_formuleb3 + diff_prix_formuleb4
        Repas = Repas + 1
    End If
ElseIf nbboisson >= 2 And Repas < 2 Then
    If nbsandwich >= 2 Then
        déduction_repas = déduction_repas - prix_formule - prix_formule2 _
                                          - prix_formuleb - prix_formuleb2
        Supp_repas = Supp_repas + diff_prix_formule + diff_prix_formule2 _
                                + diff_prix_formuleb + diff_prix_formuleb2
        Repas = Repas + 2
    ElseIf nbsandwich = 1 Then
        déduction_repas = déduction_repas - prix_formule - prix_formuleb
        Supp_repas = Supp_repas + diff_prix_formule + diff_prix_formuleb
        Repas = Repas + 1
    End If
End If
0
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
Modifié par Gord21 le 8/09/2010 à 12:48
Bonjour,
Est-ce une erreur dans le dernier exemple : ne devrait-il pas y avoir 3 repas ?
A quoi correspondent tes formules (formule, formuleb, formule2, ...) ?
Est-ce que tu travailles sur Excel ?
@+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 8/09/2010 à 13:42
Le problème est résolu !

Il ne faut pas qu'il y ai 3 repas, car 2 repas sont nécessaires seulement pour valider une formule journée.

formule et formule2 sont le prix des sandwich les plus chers
formuleb a b8 sont les prix des boissons.

En fait l'algorithme récupère le prix de toutes les consommations et garde pour la formule seulement les plus chers, qui seront utilisées dans le cadre de cette formule. Ensuite, il regarde s'ils sont dans le prix, sinon ils extraient le supplément par rapport au plafond (3,50 pour le sandwich, 1,30 pour la boisson) et le rajoute dans le prix final. Enfin, il privilégie le type de repas en fonction du plus intéressant, soit 4 boissons en premier choix, ou sandwich+boisson en deuxième.

Le soucis venait de là, car en fonction du nombre de boissons et de l'ordre dont il les prenait, l'algorithme agissait différemment.

Exemple : (B pour boisson commandée, S pour sandwich commandé)
B B B B B B B B = 2 repas, jusque là simple.
B B S B B B = là il faut privilégier le repas 4 boissons + le repas Sandwich/boisson = 2 repas
B B B S B = Plus dur, là seul les 4 boissons sont compabilisées, il manque une boisson pour faire un deuxième repas en complément du sandwich.
S S B B B B = Ici, si on comptabilise les 4 boissons on a qu'un repas. Par contre, si on comptabilise 2 sandwichs+2 boissons, on en a deux...

C'est ce que le programme au dessus vérifie :-)

Oui je travaille sous excel :)

Merci de m'avoir aidé dans mon raisonnement, et de t'être pris la peine de lire mes pavés ! Je suis à ta disposition si t'as d'autres questions.

Mike.

P.S.: j'ai rajouté dans le code la partie elseif nbboisson > 0 et nbsandwich > 0 pour comptabiliser un repas, et j'ai toutes mes possibilités :)
0