Forum Liberty Basic France

Le 08/12/2018 à 23h42

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
'Bonjour,
'Je me suis fais un programme très rudimentaire,qui permet de fusionner plusieurs cote de paris sportifs en une.
'Exemple les cotes 9,6,5 me donne une cote de 2.09 (une sorte de moyenne)
'j'ai essayé de découper le programme en 7 parties pour que ce soit plus clair
'Dans le programme 1 et 7,une ligne comporte des points d'interrogation afin que vous puissiez les situer
'1°/ Programme 1
'La ligne --print "Rentre cote";r -- me permet de collecter les cotes,en affichant à l'aide de -- for r=1 to 20 --,un numéro chronologique.Ce qui vas donner:
'Pour la première cote:"Rentre cote1"
'Pour la deuxième cote:"Rentre cote2"
'ect...
'2°/ Programme 7
'La ligne -- goto [ENRGCOTE] -- permet de recommencer le programme du début en se repositionnant à l'étiquette [ENRGCOTE]

'Or au lieu de reprendre le programme à:"Rentre cote1" "Rentre cote2" ect ...
'Il démarre à: Rentre cote4" comme si in ne tenait plus compte de la valeur de r qui devrait etre à 1 puisque,le programme recommence à for r=1 to 20.
' Ayant eu souvent par le passé rencontré ce cas de figure,et l'ayant résolu en restructurant mes programme sans passer par des for x=.....,je me suis dis cette fois ci il faut que je me renseigne auprès de connaisseurs.
'Pour ma part j'avais souvent fais des recherches mais en vain.
'Certains de mes programmes contenaient plusieurs séquences for-next,et tout se passait très bien.Par contre d'autres plantaient,et une boucle for-next semblait complètement dans les choux.
'Donc ma question:
'Peut on s'exposer à des risque de plantage si l'on utilise plusieurs séquences for-next dans un même programme,ou bien un paramètre m'échappe ???
'Je me souviens que l'année dernière sur un programme beaucoup plus fourni que celui là,j'étais resté presque 3 jours,en déroulant le programme au pas à pas,avant de comprendre qu'une séquence for-next ne tenait plus compte des valeurs qui lui avaient été attribuées.
'Si un programmeur avait un moment de libre pour m'éclairer un peu,car sur le coup je commence à tourner en boucle..
'A l'avance merci
'Franck
'Ci dessous mon programme


dim tabcote(20)
dim mise(20)

' 1/-------> Je remplis un tableau de cote
[ENRGCOTE]
for r=1 to 20
print "Rentre cote";r '??????????????????????
input " ------->";cote
if cote=0 goto [SUITE] '------> 0 est un indicateur de fin qui permet un débranchement sur [SUITE] s'il est détecté
tabcote(r)=cote
next r

'2/ ----> 'Je repère la cote la plus forte et je la mets dans cotemax
[SUITE]
for x=1 to 20
if tabcote(x) > cotemax then cotemax=tabcote(x)
next x

'3/ -----> A l'aide d'un petit calcul,je crée une mise correspondante à une cote
for y=1 to 20
if tabcote(y)=0 then goto [SUITE2] 'Si le 0 est detecté,débranchement sur [SUITE2]
mise(y)=cotemax/tabcote(y)
next y

'4/ ----> Je cumul les mises dans misetot
[SUITE2]
for c=1 to 20
misetot=misetot+mise(c)
next c
cotefusion=cotemax/misetot ' ----> calcul de cotefusion

'5/ ----> j'edite les cotes et les mises correspondantes
print "Cote";" ";"Mise"
for g=1 to 20
if tabcote(g)=0 then goto [SUITE3] 'Si le 0 est detecté,débranchement sur [SUITE3]
print tabcote(g);" ";mise(g)
next g

'6 ---> edition du resultats + mise a zero des 2 dim et des variable
[SUITE3]
print "La cote est égale à ";cotefusion
if cotefusion <= 1 then print " Impossible de dégager un bénéfice,car inférieur ou égale à 1"

[eff] '-----> effacement des 2 dim et des variables
for x=1 to 20
tabcote(x)=0:mise(x)=0
next x
cotemax=0
misetot=0
cotefusion=0
print "---------------------------------"

'7 ---> Débranchement au début
goto [ENRGCOTE] '??????????????????????????????



Edité par franckbasic Le 09/12/2018 à 11h35

Web    
Le 09/12/2018 à 00h19

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Quand tu veux sortir d'une for next, il faut mettre un : "exit for" et faire ce que tu veux après le next où t'a envoyé le "exit for".
Si tu sors de boucles imbriquées-->Autant de exit for que de boucles (chaque exit for te met sous le next de sa boucle).
Note que l'index de la boucle n'est pas conservé à la sortie, si tu le veux, il faut le stocker dans une variable avant le exit.
Le goto est à utiliser avec prudence (y a rien de tel pour perdre le contrôle de la machine, pense à mettre un "scan" quand tu n'es pas sûr du fonctionnement d'une boucle) il vaut mieux faire avec des gosub..
Je pense que ton problème c'est la sortie de la for next avec le goto.
____________________
Roro

   
Le 09/12/2018 à 12h09

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Merci roland pour tes réponses.
1°/ J'ai essayé d'annuler ma première question erronée.J'ai bien trouvé le crayon,avec l'option editer,mais je n'ai pas trouvé la poubelle.J'ai donc effacé tout le texte en laissant une lettre,car sinon il me remet le texte complètement.


2°/Concernant le exit for,je ne vois pas où il faut le placer.
dans l'exemple:
[PROG1]
for x=1 to 10
if toto(x)=1 then goto [PROG2]
next x

[PROG2]
for z=1 to 10
if toto(z)=1 then goto [PROG1]
next z

Lorsque le prog envoi une seconde fois à prog1,celui ci redemarre à l'endroit où la condition a été remplie la première fois,en l'occurrence 4 pour mon exemple.Il ne tient plus compte du x=1,et comme tu le dis,"exit for" permettrai de le réinitialiser,si j'ai bien compris.Mais par contre je ne vois pas où positionner "exit for".
Peux tu à l'aide de mon exemple prog1/Prog2 me le positionner stp.
J'ai essayé plusieurs variantes,mais sans succès.
Merci Franck

Web    
Le 09/12/2018 à 12h28

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Dans ce bout:
Code VB :
 
  [PROG1]
    for x=1 to 10
       if toto(x)=1 then goto [PROG2]
    next x
 

ça devient:
Code VB :
 
  [PROG1]
     for x=1 to 10
         if toto(x)=1 then oldx=x: exit for
     next x
' ici tu a le choix entre reprendre la boucle en partant de oldx+1; ou aller ailleurs
' par exemple: goto [PROG2]; ou mieux gosub [PROG2] avec un wait en dessous.

Avec:
Code VB :
 
  [PROG2]
     for z=1 to 10
        if toto(z)=1 then return
      next z
  return
 

Je n'ai pas vérifié.
____________________
Roro

   
Le 10/12/2018 à 10h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Y a un truc qui me tracasse; c'est par quel raisonnement tu en arrive à diviser une cote max par le cumul des mises.
____________________
Roro

   
Le 10/12/2018 à 11h15

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Je viens d'essayer avec exit for,et c'est une réussite.Finalement cela va me permettre de m'interesser au autre boucle que for-next,car la programmation c'est comme tout le reste,on a ses petites habitudes,et on s'encroute vite..
Encore merci Roland,et au plaisir

Web    
Le 11/12/2018 à 20h28

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Y a un truc qui me tracasse; c'est par quel raisonnement tu en arrive à diviser une cote max par le cumul des mises.

Roland je ne comprends pas trop ta question.Veux tu dire que que la syntaxe employée n'est peut être pas la plus judicieuse,ou bien alors la raisonnement peut être plus optimisé ?
Au plaisir
Franck

Web    
Le 12/12/2018 à 11h59

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Citation:
je ne comprends pas trop ta question

Si tu clique sur les guillemets du bandeau du message, ça te mets les balises de citation; en ayant copié ce que tu veux citer, tu n'a plus qu'à le coller entre les balises (où t'attend le curseur).

La question: Pourquoi tu divise une cote max par le cumul des mises (y a t'il un but ?) ?
Je crois comprendre que pour définir les mises tu a fait de façon arbitraire.
____________________
Roro

   
Le 12/12/2018 à 18h57

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Salut Roland,
Ok pour le bandeau,je m'en souviendrai pour la prochaine fois.
Pour les cotes,diviser la cote max par le cumul des mises permet d'obtenir une cote optimale
Exemple:tu veux savoir si tu vas dégager un bénéfice en jouant sur un même événement,un pari à 6/1 puis un pari 4/1.En appliquant mon petit programme,tu obtiens 2.4,donc pari potentiellement bénéficiaire,puisqu'il est supérieur à 1.Ensuite pour savoir quelle sont les 2 mises optimales à jouer,tu obtiens 1 mise pour la cote à 6/1,et 1.5 mise pour la cote à 4/1.
C'est vrai que pour des mises aussi simple ça peut se faire de tête,mais quand tu cherches 3 cotes,une à 2.78 une à 3,41 et une à 7,80 ca devient plus long à calculer,et c'est là que mon petit programme intervient.
A +++,et n'hésite pas,si tu veux qu'on discute de cote ...
Franck

Web    
Le 12/12/2018 à 19h08

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Hum...hum...hum.
Et que fais-tu des outsiders ? (quelle est leur fréquence d'ailleurs ? (coefficient de biais))
____________________
Roro

   
Le 12/12/2018 à 19h50

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Je ne m'occupe pas de chevaux,mais uniquement de tennis ou de foot.Ceci dit en passant,je le fais de façon récréative.J'essaye surtout de comprendre les mécanismes de cotation sur des événements,et de trouver les éventuelles cotes sous ou sur éstimées,...bref un pretexte à avoir le plaisir de programmer
A ++++

Web    
Le 13/12/2018 à 00h43

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2081
Ah d'accord. Alors ça a réellement un sens. Que je ne voyais pas.
____________________
Roro

   
Le 13/12/2018 à 10h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 515
Bonjour vous deux, et bonjour à tous,

Franck, ton problème principal a été la détection de la dernière cote saisie, pour pouvoir sortir d'une boucle avant son terme normal.

J'ai tenté une autre approche : je rentre dans une chaine toutes les cotes au fur et à mesure de leur saisie, en même temps que je les compte.

Comme pour ton programme, lorsqu'on entre "0", cela signifie que la saisie des cotes est terminée

Je dispose alors du nombre de cotes saisies, et je peux dimensionner les tableau avec ce nombre de cotes. Du coup il n'y a plus besoin de détecter la fin de cotes.

Une fois les cotes saisies, j'utilise word$ dans une boucle pour transférer une à une les cotes dans le tableau cote()

Voilà ma version :

Code VB :
 
'une autre version, qui permet de dimensionner les tableaux
'   au nombre de cotes saisies
'
[ENRGCOTE]
 
numcote=1
cote$=""
 
print "Entrer les cotes :"
 
boucle=1
while boucle=1    'tant que 'boucle' est 1, la boucle continue

    print "cote n°";numcote;  'le point-virgule permet d'afficher le 'input' à côté de "cote n°"
    input " --> cote = ";cote
 
    'on sort de la boucle si la cote est 0
    if cote=0 then
        boucle=0    'sortir de la boucle while/wend puisque 'boucle' n'est plus 'un'
        numcote=numcote-1   'on retire 1 parceque la cote 0 n'est pas une cote,
                            'mais signifie la fin de la saisie des cotes
    else
        'on ajoute la cote à la chaine cote$, et on y ajoute un espace
        '(dans notre cas, l'espace est important pour la lecture ultérieure de la chaine)
        cote$=cote$+str$(cote)+" "
        'on prépare pour la saisie de la cote suivante
        numcote=numcote+1
    end if
 
wend
 
'dimensionnement des tableaux au nombre de cotes saisies
dim cote(numcote)
dim mise(numcote)
 
'transfert des cotes dans le tableau cote()
for a=0 to numcote-1    'le premier élément d'un tableau porte toujours le numéro 0

    a$=word$(cote$,a+1," ") 'on extrait les cotes de la chaine cote$
    cote(a)=val(a$)         'et on les met en tableau

next
 
'repèrage de la cote la plus forte, cotemax
for x=0 to numcote-1
    if cote(x) > cotemax then cotemax=cote(x)
next x
 
'mise correspondant à la cote
for y=0 to numcote-1
    mise(y)=cotemax/cote(y)
next y
 
'cumul les mises dans misetot
for c=0 to numcote-1
    misetot=misetot+mise(c)
next c
 
'calcul de cotefusion
cotefusion=cotemax/misetot
print "cotefusion=";cotefusion
 
'éditer les cotes et les mises correspondantes
print "Cote";" ";"Mise"
for g=0 to numcote-1
    print cote(g);" ";mise(g)
next g
 
'continuer avec une nouvelle série de cotes, ou arrêter
input "nouvelle saisie de cotes (o ou n)";nouv$
if nouv$="o" or nouv$="O" then goto [ENRGCOTE]
 
'fin du programme
print "fin du programme"
end
 
 


A priori ça fonctionne, mais je n'ai pas vérifié si mes calculs étaient corrects, je me suis concentré sur le fonctionnement du programme



Edité par Christophe Le 16/12/2018 à 00h00
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 14/12/2018 à 12h32

Libertynaute Débutant

Groupe: Membre

Inscrit le: 10/10/2012
Messages: 19
Bonjour Christophe,
Tout dabord merci d'avoir pris la peine de faire ce petit programme.C'est vrai que c'est une approche intéressante,que je vais tester,en la cumulant plusieurs fois dans un même programme.
A bientôt
Franck

Web    
Le 15/12/2018 à 23h57

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 515
Avis à nos distingués lecteurs, je rectifie une probable connerie : j'ai dit dans le précédent listing
Citation:
boucle=1
while boucle 'tant que 'boucle' est "vrai", la boucle continue (vrai=1, faux=0)

Or, j'ai trouvé une boucle while/wend qui s'est mise à fonctionner correctement quand j'ai remplacé "while variable" par "while variable=valeur attendue". A ce sujet l'aide sous-entend qu'il doit y avoir une équation, et ne fournit aucun exemple de while/wend utilisant une valeur logique "vrai" ou "faux" à la place. Donc dans le doute... je rectifie le listing.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie