GoodWords (et liste chainées)

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

GoodWords (et liste chainées)

Message par flaith »

Voici un petit prog (le fichier texte est ICI)

Code : Tout sélectionner

; ************************************************************
; * Project Name: GoodWORDS
; * Author(s)   : Nicolas 'Flaith' Djurovic
; * Date Started: 11/20/2005
; * Last Updated: 11/22/2005
; * Website     : http://flaith.free.fr
; * Email       : flaith@wanadoo.fr
; * Version     : 0.13.3
; * Copyright   : CopyLeft 2005 Flaith
; * Licence     : GPL
; * PB Version  : 3.94
; ************************************************************
;
; Librairie extérieure utilisée
; -----------------------------
; PureCOLOR Librairies v8
; Auteur : Philippe 'gnozal' Guntz
; Date   : 02/04/2005

;- Window Constants
;
Enumeration
  #Window
EndEnumeration

;- Gadget Constants
;
Enumeration
  #TheFile
  #ALTF4
  #Button_again
  #Button_quit
  #Titre
  #Texte
EndEnumeration

;- Structures pour liste chainées
;
Structure Title         ;Titre
  num.w                 ;/999
  titre.s               ;après les ":"
EndStructure

Structure Descr
  number.w
  description.s
EndStructure

;- Initialisation des listes chainées
NewList The_Title.Title()
NewList The_Descr.Descr()

;- Fonts
;
Global FontID1
FontID1 = LoadFont(1, "Verdana", 10, #PB_Font_Bold)
Global FontID2
FontID2 = LoadFont(2, "Verdana", 8) ;, #PB_Font_Italic)

;-CallBack pour PureCOLOR
;
Procedure.l WindowCallBack(WindowID.l, message.l, wParam.l, lParam.l) 
  ReturnValue.l = #PB_ProcessPureBasicEvents
  ReturnValue = PureCOLOR_CallBack(WindowID, message, wParam, lParam, ReturnValue)
  ProcedureReturn ReturnValue 
EndProcedure

Procedure Open_Window()
  If OpenWindow(#Window, 216, 0, 511, 300,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered,"Good Words !")
    If CreateGadgetList(WindowID())
    
      AddKeyboardShortcut(0, #PB_Shortcut_F4 | #PB_Shortcut_Alt, #ALTF4)
    
      ButtonGadget(#Button_again, 410, 160, 90, 60, "Again")
        SetGadgetFont(#Button_again, FontID2)
    
      ButtonGadget(#Button_quit, 410, 230, 90, 60, "Quit")
        SetGadgetFont(#Button_quit, FontID2)
        
      TextGadget(#Titre, 10, 10, 390, 50, "TITRE", #PB_Text_Border | #PB_Text_Center)
      SetGadgetFont(#Titre, FontID1)
    
      TextGadget(#Texte, 10, 70, 390, 220, "TEXTE")                ;, #PB_Text_Border)
      SetGadgetFont(#Texte, FontID2)
    
    EndIf
  EndIf
EndProcedure

Procedure aff_random()
  ResetList(The_Title())
  ResetList(The_Descr())

  ;affiche données "au hazard" dans gadgets
  Resultat = CountList(the_descr())
  val_aleatoire = Random(Resultat)+1
  SelectElement(The_Descr(), val_aleatoire)
  SelectElement(The_Title(), The_Descr()\number - 1)               ;pourquoi mettre - 1 ???
  SetGadgetText(#Titre, The_Title()\titre)
  SetGadgetText(#Texte, The_Descr()\description)
EndProcedure

Procedure Make_Color()
  PureCOLOR_SetGadgetColor(#Titre, RGB(127,127,127), BackColor.l)
  PureCOLOR_SetGadgetColor(#Texte, #Black, RGB(160,160,160))
EndProcedure

;- Programme Principal
;
Quit = 0

Open_Window()
SetWindowCallback(@WindowCallBack()) 
Make_Color()

If ReadFile(#TheFile,"fortune.txt")                                ;Si le fichier peut etre lu, on continu
  While Eof(#TheFile) = 0                                          ;Tant que la 'fin de fichier' n'est pas atteinte
    x.s = ReadString()
    If Left(x,1) <> "#" And Left(x,1) <> "" And Left(x,1) <> " "   ;on ne prend que si diff de # ou espace ou ligne vide
      If Left(x,1) = "/"
        num.w = Val(Mid(x,2,3))
        descr.s = Mid(x,6,Len(x))
        descr = ReplaceString(descr, "\n", Chr(13)+Chr(10))        ;si on trouve \n on met un saut de ligne
        descr = ReplaceString(descr, "\t", Chr(9))                 ;même chose (tabulation)
        AddElement(The_Title())
        The_Title()\num = num
        The_Title()\titre = descr
      Else
        String$ = ReplaceString(x, "\n", Chr(13)+Chr(10))
        String$ = ReplaceString(String$, "\t", Chr(9))
        AddElement(The_Descr())
        The_Descr()\number = num
        The_Descr()\description = String$
      EndIf
    EndIf
  Wend
  CloseFile(#TheFile)                                              ;Ferme le fichier
Else
  MessageRequester("Information","Couldn't open the file!")        ;sinon c'est fini
EndIf

aff_random()

Repeat
  Event = WaitWindowEvent()                                        ;on récupère les évènements
  
  If Event = #PB_Event_CloseWindow 
    Quit = 1
  EndIf
  
  If Event = #PB_EventGadget                                       ;si on appuie sur un gadget
    Select EventGadgetID()
      Case #Button_again                                           ;on appuie sur le bouton Again
        aff_random()
      Case #Button_quit                                            ;on appuie sur le bouton Quit
        Quit = 1
    EndSelect
  EndIf
  
  If Event = #PB_EventMenu
    Select EventMenuID()
      Case #ALTF4                                                  ;Alt-F4
        Quit = 1
    EndSelect
  EndIf 
  
Until Quit = 1 
Dans la Procedure Procedure aff_random(), je doit mettre - 1, sinon le numéro est supérieur (alors que je n'incrémente ni ne décrémente ce numéro ???). Une petite expli ? D'avance merci :wink:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Random(80) renvoi un nombre de 0 à 80
Si tu comptes a partir de 0, pour 80 positions on va de 0 à 79

J'aimerais bien pouvoir appeller la fonction Random() sans parametre comme en C, ca éviterais ce probleme...

Dri
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pas tout compris, (pas tout lu le code non plus), mais si tu fais

Resultat = CountList(the_descr())
val_aleatoire = Random(Resultat)+1

Tu vas avoir un nombre compris entre 1 et le nbre d'elements dans la liste +1
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Chris a écrit : Resultat = CountList(the_descr())
val_aleatoire = Random(Resultat)+1

Tu vas avoir un nombre compris entre 1 et le nbre d'elements dans la liste +1
Le random va, par defaut de 0 à Nbre, or dans mon cas, les numéros commencent à "1"
Cette valeur n'est utilisée que pour sélectionner une des phrases de la liste, dans cette phrase je récupère un numéro qui correspond au thème de cette phrase que je recherche à l'aide de la ligne suivante :

Code : Tout sélectionner

  SelectElement(The_Title(), The_Descr()\number - 1)
or, si je ne mets pas "-1" je récupère le thème suivant, ca ne concorde plus !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

parce qu'en PB on commence à compter à partir de 0
(tableaux, listes chainées etc)

Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Dr. Dri a écrit :parce qu'en PB on commence à compter à partir de 0
(tableaux, listes chainées etc)

Dri
Oui je sais, mais les numéros dans les 2 listes chainées sont des numéros récupérés dans le fichier texte
#
/014:Réflexions\net\nsignatures glanées sur quelques forums
, donc ce n'est pas automatique, c'est inscrit en dur via la boucle suivante

Code : Tout sélectionner

If Left(x,1) = "/"
        num.w = Val(Mid(x,2,3)) ;<-- C'est ICI
        descr.s = Mid(x,6,Len(x))
        descr = ReplaceString(descr, "\n", Chr(13)+Chr(10))        ;si on trouve \n on met un saut de ligne
        descr = ReplaceString(descr, "\t", Chr(9))                 ;même chose (tabulation)
        AddElement(The_Title())
        The_Title()\num = num ;<- je l'inscrit en dur dans la liste des themes
        The_Title()\titre = descr
      Else
        String$ = ReplaceString(x, "\n", Chr(13)+Chr(10))
        String$ = ReplaceString(String$, "\t", Chr(9))
        AddElement(The_Descr())
        The_Descr()\number = num ;<- et aussi dans la liste des phrases
        The_Descr()\description = String$
      EndIf
:?: :wink:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

flaith a écrit :
Chris a écrit : Resultat = CountList(the_descr())
val_aleatoire = Random(Resultat)+1

Tu vas avoir un nombre compris entre 1 et le nbre d'elements dans la liste +1
Le random va, par defaut de 0 à Nbre, or dans mon cas, les numéros commencent à "1"
Cette valeur n'est utilisée que pour sélectionner une des phrases de la liste, dans cette phrase je récupère un numéro qui correspond au thème de cette phrase que je recherche à l'aide de la ligne suivante :

Code : Tout sélectionner

  SelectElement(The_Title(), The_Descr()\number - 1)
or, si je ne mets pas "-1" je récupère le thème suivant, ca ne concorde plus !
J'ai l'impression qu'on ne se comprends pas.
Ta liste chainée commence bien à 0, pas à 1

Si tu fais Random(...)+1, tu obtiens une valeur comprise entre 1 et valeur maxi du random +1

Donc, l'élément de ta liste que tu sélectionne va de 1 à countlist()+1. Tu ne sélectionne jamais l'élément 0, c'est pour ça que tu dois mettre -1

Ou alors, c'est moi qui n'ai pas compris
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Chris a écrit :J'ai l'impression qu'on ne se comprends pas.
Je crois plutôt que c'est moi qui ne me comprends pas :lol: je dois surement être en train de délirer grave sur un truc complètement logique
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Code : Tout sélectionner

 val_aleatoire = Random(Resultat)+1
  SelectElement(The_Descr(), val_aleatoire)
  SelectElement(The_Title(), The_Descr()\number - 1)               ;pourquoi mettre - 1 ??? 
dans ton code ci dessus tu donne toi meme la reponse !:D

si tu as un chiffre aleatoire a choisir entre 0 et 80
tu fait : Random(80)

si ton chiffre a choisir est entre 1 et 80
tu fait : Random(79)+1
parceque si sort le chiffre 79 plus 1 ça fait bien 80 !
si tu sort le chiffre 0 plus 1 ça fait bien 1 ! (1----80)

maintenant n'oublie pas que les liste chainée commence a zero !!

donc si tu veux faire correspondre avec un tableau qui commence a 1

t'est obligé pour le tableau de sortir un chiffre entre 1 et 80
donc : Random(79)+1
et faire -1 pour les indice de liste chainée !! :D


ou alors tu ignore l'indice 0 ! <-- c'est une solution que j'utilise de temps en temps !
et considere que ton premier élément de list chainée commence a 1
le zero tu te le garde pour eventuellement faire autre chose :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Un tableau commence aussi à 0, Dobro 8O

Code : Tout sélectionner

Dim Tableau.l(10)

For i = 0 To 10
  Tableau(i) = i*10
Next

For i = 0 To 10
  Debug "Tableau ("+Str(i)+") = "+Str(Tableau(i))
Next
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

A-y-est compris, je savais bien que je me prenais la tête alors que c'était logique, merci à vous tous pour vos explications :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

T'est pas obligé de nous dire ce que c'était, hein.... :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Un tableau commence aussi à 0, Dobro Shocked
oui au moment du dimentionnement !

mais beaucoups n'utilisent pas l'indice 0
car c'est embetant ça decale tout

il manque "OPTION BASE 0 ou 1" qui normalement en Basic
indique si l'indice d'un tableau commence a 1 ou a 0 !!
c'est encore une de ces choses qui sont "negligés" dans les suggestions du Forum Français au détriment d'une poigné d'utilisateurs qui ne nous parlent QUE du 64 bits ! (ya des priorité qui serai plus importante ! a mon sens :D)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Dobro a écrit :t'est obligé pour le tableau de sortir un chiffre entre 1 et 80
donc : Random(79)+1
et faire -1 pour les indice de liste chainée !! :D
Qd je fait un random sur les 200 phrases (par exemple), je récupère la phrase 27, le numéro du thème correspondant est le 2, or si je fait une recherche sur la liste chainées des thèmes avec le n° 2 j'ai
/003:\nSyntax Error !!!
alors que je dois avoir
/002:\nNos lois
Veni, vidi, compris :D et encore merci
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dobro a écrit :
Un tableau commence aussi à 0, Dobro Shocked
oui au moment du dimentionnement !

mais beaucoups n'utilisent pas l'indice 0
car c'est embetant ça decale tout

il manque "OPTION BASE 0 ou 1" qui normalement en Basic
indique si l'indice d'un tableau commence a 1 ou a 0 !!
c'est encore une de ces choses qui sont "negligés" dans les suggestions du Forum Français au détriment d'une poigné d'utilisateurs qui ne nous parlent QUE du 64 bits ! (ya des priorité qui serai plus importante ! a mon sens :D)
Ohhh arrête!!!

Ca décale depuis la nuit des temps, un tableau avec 100 unités, ca va de 0 à 99, je ne vois pas ce qu'il y a d'insoluble la dedans.

Ceux que ça perturbe de compter de 0 à 99 au lieu de 1 à 100, on doit les compter sur les doigts d'une main (de manchot)

C'est du chipotage ça.
(Et encore, j'aurais pu dire "de l'enc..... de mouches, mais je suis poli)
Répondre