Partager via


Small Basic: Exemple - Les Tableaux (fr-FR)

Code

Vous pouvez l'importer dans Small Basic avec l'ID FCL390-4 pour avoir les commentaires et les texte du programme en français.

'***************************************************************************************
'Programme d'exemple pour faire la démonstration de l'utilisation des tableaux
'Un tableau est une liste de données connexes qui peuvent être ajoutées, supprimées, modifiées et accessible pour effectuer une tâche
'***************************************************************************************
TextWindow.Show()
'
' Un tableau de nombres, nous voulons enregistrer des nombres aléatoires impairs
'
'La méthode compliquée (difficile à maintenir) sans tableau
num1 = 1+2*Math.GetRandomNumber(100)
num2 = 1+2*Math.GetRandomNumber(100)
num3 = 1+2*Math.GetRandomNumber(100)
num4 = 1+2*Math.GetRandomNumber(100)
num5 = 1+2*Math.GetRandomNumber(100)
output = "Cinq nombres impairs aléatoires enregistrés de manière compliquée"
comment()
TextWindow.WriteLine(num1)
TextWindow.WriteLine(num2)
TextWindow.WriteLine(num3)
TextWindow.WriteLine(num4)
TextWindow.WriteLine(num5)
next()
'La méthode facile avec des tableaux
For i =  1 To 10
  num[i] = 1+2*Math.GetRandomNumber(100)
EndFor
output = "Dix nombres impairs aléatoires enregistrés de manière facile"
comment()
For i =  1 To 10
  TextWindow.WriteLine(num[i])
EndFor
next()
'
'Le nombre d'éléments dans un tableau peut changer ou ne pas être connus, nous pouvons savoir combien il y en a
'
TextWindow.Clear()
For i =  1 To 10+Math.GetRandomNumber(10)
  val[i] = Math.GetRandomNumber(100)
EndFor
output = "Nous avons enregistrés "+Array.GetItemCount(val)+" nombres aléatoires entre 1 et 100"
comment()
TextWindow.WriteLine("Index Valeur")
For i =  1 To Array.GetItemCount(val)
  TextWindow.Write(i+" ") ' nous faisons une séparation entre deux instructions pour éviter l'affichage i+val[i]
  TextWindow.WriteLine(val[i])
EndFor
next()
avg = 0
For i =  1 To Array.GetItemCount(val)
  avg = avg+val[i]
EndFor
avg = 0.01*Math.Floor(100*avg/Array.GetItemCount(val)+0.5) ' arrondi au plus prôche (c'est la réaison du +0.5) à 2 chiffres après la décimale
TextWindow.WriteLine("Leur valeur moyenne est "+avg)
TextWindow.WriteLine("")
'
'Nous pouvons déterminer si un tableau contient une valeur ou non
'
output = "Saisir un nombre pour déterminer si il se trouve dans le tableau"
comment()
num = TextWindow.ReadNumber()
If (Array.ContainsValue(val,num) = "True") Then
  TextWindow.WriteLine(num+" est dans le tableau")
Else
  TextWindow.WriteLine(num+" n'est pas dans le tableau")
EndIf
next()
'
'Nous pouvoins supprimer des entrées dans le tableau - suppression des nombres pairs
'
count = Array.GetItemCount(val) ' Nous définissons cette variable en premier car nous allons modifier le nombre d'éléments dans le tableau depuis la boucle
For i =  1 To count
  If (Math.Remainder(val[i],2) = 0) Then
    val[i] = ""
  EndIf
EndFor
output = "Il reste "+Array.GetItemCount(val)+" nombres impairs dans le tableau"
comment()
TextWindow.WriteLine("")
'
'Nous avons supprimés les nombres pairs mais les index des nombres impairs restants n'ont pas changés
'
output = "Le tableau a désormais des index supprimés qui sont vides"
comment()
TextWindow.WriteLine("Index Valeur")
For i =  1 To count
  TextWindow.Write(i+" ")
  If (Array.ContainsIndex(val,i)) Then
    TextWindow.WriteLine(val[i])
  Else
    TextWindow.WriteLine("Supprimée")
  EndIf
EndFor
next()
'
'Nous avons besoin de réordonner le tableau pour modifier les index afin qu'ils soient séquentiels
'Ce n'est pas évident, alors soyez prudent lorsque vous supprimez des valeurs de tableau, sans se rappeler que les index sont inchangés
' Si les indices sont uniquements des nombres, utilisez le code suivant
'
i = 1 'Index du tableau non trié (original) 
j = 1 'Nouvel index de valeurs pour le tableau trié
While (j <= Array.GetItemCount(val))
  If (Array.ContainsIndex(val,i) = "True") Then
    val[j] = val[i]
    If (i <> j) Then
      val[i] = ""
    EndIf
    j = j+1
  EndIf
  i = i+1
EndWhile
output = "Le tableau complet des nombres impairs après une réorganisation séquentielle des index"
comment()
TextWindow.WriteLine("Index Valeur")
For i =  1 To Array.GetItemCount(val)
  TextWindow.Write(i+" ")
  TextWindow.WriteLine(val[i])
EndFor
next()
'
' Tableaux indexés par des chaînes
'Ils ont l'avantage que nous n'avons pas à nous inquiéter de l'indexation lorsque nous ajoutons ou 
' supprimons des valeurs, mais nous ne pouvons pas boucler sur l'index (For i =1 To...) pour y accéder
'
TextWindow.Clear()
age["Fred"] = 21
age["Mary"] = 28
age["David"] = 36
output = "Les tableaux indexés par des chaînes sont faciles à utiliser, mais moins puissants"
comment()
TextWindow.WriteLine("Mary à "+age["Mary"]+" ans")
TextWindow.WriteLine("Fred à "+age["Fred"]+" ans")
TextWindow.WriteLine("David à "+age["David"]+" ans")
next()
'Tableaux chaînes multi-dimensionnel avec indexation (plus puissant mais difficile à supprimer et à maintenir l'index séquentiel)
'Nom
contact[1]["name"] = "Fred"
contact[2]["name"] = "Mary"
contact[3]["name"] = "David"
contact[4]["name"] = "Sam"
contact[5]["name"] = "Helen"
'Age
contact[1]["age"] = 21
contact[2]["age"] = 28
contact[3]["age"] = 36
contact[4]["age"] = 42
contact[5]["age"] = 18
'Ville
contact[1]["city"] = "Paris"
contact[2]["city"] = "Prague"
contact[3]["city"] = "New York"
contact[4]["city"] = "Mombia"
contact[5]["city"] = "Johannesburg"
'Nous stockons les données dans un tableau contact (comme une base de données)
'et nous accédons aux données en utilisant l'index
output = "Les tableaux shaînes avec quelques index sont plus faciles à utiliser"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'Ajoute quelques entrées
newindex  = Array.GetItemCount(contact)+1
contact[newindex]["name"] = "Rolf"
contact[newindex]["age"] = 73
contact[newindex]["city"] = "Melbourne"
newindex  = Array.GetItemCount(contact)+1
contact[newindex]["name"] = "Bruce"
contact[newindex]["age"] = 51
contact[newindex]["city"] = "Hong Kong"
output = "Quelques entrées ajoutées"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'Supprime quelques entrées
count = Array.GetItemCount(contact) 'nous utilisons le Count() ici car nous allons supprimer plus d'une entrée et Array.GetItemCount(contact) changera dans la boucle
For i =  1 To count
  If (contact[i]["name"] = "Mary"  Or contact[i]["name"] = "Bruce") Then
    contact[i] = ""
  EndIf
EndFor
'Réordonne les index pour boucler de 1 au nombre d'entrées dans le tableau (indexation séquentielle)
i = 1
j = 1
While (j <= Array.GetItemCount(contact))
  If (Array.ContainsIndex(contact,i) = "True") Then
    contact[j] = contact[i]
    If (i <> j) Then
      contact[i] = ""
    EndIf
    j = j+1
  EndIf
  i = i+1
EndWhile
output = "Suppression de Mary et Bruce"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'
'Tri par le nom alphabétiquement
'
var = "name"
sortString()
output = "Tri par le nom alphabétiquement"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'
'Tri par la ville alphabétiquement
'
var = "city"
sortString()
output = "Tri par la ville alphabétiquement"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'
'Tri par l'âge
'
var = "age"
sortNumber()
output = "Tri par l'âge"
comment()
For i =  1 To Array.GetItemCount(contact)
  TextWindow.WriteLine(contact[i]["name"]+" à "+contact[i]["age"]+" ans et vit à "+contact[i]["city"])
EndFor
next()
'
' Retour à quelques de plus simple: tableau de nombres 2D
'Un tableau de carrés dans la fenêtre graphiques - 'Paires'
'
TextWindow.Hide()
GraphicsWindow.BackgroundColor = "LightBlue"
nrow = 2*2 'doit être un nombre paire de boîtes - ce sont des PAIRES
ncol = 2*2
size = 50
For i =  1 To nrow
  For j =  1 To ncol
    Xbox[i][j] = 1.5*size*i
    Ybox[i][j] = 1.5*size*j
    Cbox[i][j] = -1 ' annule la couleur pour le moment
    found[i][j] = 0  'drapeau pour indiquer qu'on a trouvé la paire
  EndFor
EndFor
'Défini les paires de boîtes (cartes) avec une couleur aléatoire
For i1 =  1 To nrow
  For j1 =  1 To ncol
    If (Cbox[i1][j1] < 0) Then
      'i1,j1 isel ne sont pas encore définis alors on le fait ici
      Cbox[i1][j1] = GraphicsWindow.GetRandomColor()
      'recherche une autre boîte aléatoire i2,j2 pas encore défini
      i2 = Math.GetRandomNumber(nrow)
      j2 = Math.GetRandomNumber(ncol)
      While (Cbox[i2][j2] >= 0)
        i2 = Math.GetRandomNumber(nrow)
        j2 = Math.GetRandomNumber(ncol)
      EndWhile
      Cbox[i2][j2] = Cbox[i1][j1]
    EndIf
  EndFor
EndFor
'
'Modifie la couleur de la boîte sélectionnée (on le supprime et on le recréé)
'Voir la démo graphique pour la gestion de l'événement souris
'
GraphicsWindow.MouseDown = OnMouseDown
Sub OnMouseDown
  mx = GraphicsWindow.MouseX
  my = GraphicsWindow.MouseY
  clicked = 1
EndSub
 
'Dessine la vue initiale des carrés colorés (paires), affichage pendant 5 secondes, et les retourne sur le coté blanc
For i =  1 To nrow
  For j =  1 To ncol
    GraphicsWindow.BrushColor = Cbox[i][j]
    Sbox[i][j] = Shapes.AddRectangle(size,size)
    Shapes.Move(Sbox[i][j],Xbox[i][j],Ybox[i][j])
  EndFor
EndFor
Program.Delay(5000)
 
back = "White"
GraphicsWindow.BrushColor = back
For i =  1 To nrow
  For j =  1 To ncol
    Shapes.Remove(Sbox[i][j])
    Sbox[i][j] = Shapes.AddRectangle(size,size)
    Shapes.Move(Sbox[i][j],Xbox[i][j],Ybox[i][j])
  EndFor
EndFor
 
clicked  = 0
nclicked  = 0
nfound = 0
While (nfound  < nrow*ncol)
  If (clicked  = 1) Then
    For i =  1 To nrow
      For j =  1 To ncol
        'On ne prend en compte que les boîtes qui n'ont pas été trouvées
        If (mx  >= Xbox[i][j] And mx  <= Xbox[i][j]+size And my  >= Ybox[i][j] And my  <= Ybox[i][j]+size) Then
          If (found[i][j] = 0  And nclicked  < 2) Then
            Sound.PlayClickAndWait()
            'Retourne la carte du coté coloré et enregistre sa position dans isel,jsel
            Shapes.Remove(Sbox[i][j])
            GraphicsWindow.BrushColor = Cbox[i][j]
            Sbox[i][j] = Shapes.AddRectangle(size,size)
            Shapes.Move(Sbox[i][j],Xbox[i][j],Ybox[i][j])
            nclicked = nclicked+1
            isel[nclicked] = i
            jsel[nclicked] = j
          Else
            ' On ne clic pas sur une pair déjà trouvée
            Sound.PlayBellRingAndWait()
          EndIf
        EndIf
      EndFor
    EndFor
    'Deux cartes sont retournées - on les laisse affichée si elles sont identiques, sinon on attends 2 secondes et on le retourne de nouveau
    If (nclicked  = 2) Then
      If (Cbox[isel[1]][jsel[1]] <> Cbox[isel[2]][jsel[2]]) Then
        Program.Delay(2000)
        For k =  1 To 2
          i = isel[k]
          j = jsel[k]
          Shapes.Remove(Sbox[i][j])
          GraphicsWindow.BrushColor = back
          Sbox[i][j] = Shapes.AddRectangle(size,size)
          Shapes.Move(Sbox[i][j],Xbox[i][j],Ybox[i][j])
        EndFor
      Else
        For k =  1 To 2
          i = isel[k]
          j = jsel[k]
          found[i][j] = 1
        EndFor
        nfound = nfound+2
      EndIf
      nclicked = 0
    EndIf
    clicked = 0
  EndIf
EndWhile
Program.Delay(2000)
'
'Terminé
'
GraphicsWindow.Clear()
GraphicsWindow.BackgroundColor = "Black"
gw = GraphicsWindow.Width
gh = GraphicsWindow.Height
GraphicsWindow.FontSize = 80
While (clicked  = 0)
  For i =  1 To 100 ' Répète 100 fois ceci pour chaque modification du texte en noir pour accélerer
    GraphicsWindow.SetPixel(Math.GetRandomNumber(gw),Math.GetRandomNumber(gh),GraphicsWindow.GetRandomColor())
  EndFor
  GraphicsWindow.BrushColor = "Black"
  GraphicsWindow.DrawBoundText(20,20,gw-20,"C'est fini pour les TABLEAUX. Cliquer pour QUITTER.")
EndWhile
 
Program.End()
'
'Utilitaire pour afficher un commentaire
'
Sub comment
  TextWindow.ForegroundColor = "Yellow"
  TextWindow.WriteLine(output)
  TextWindow.ForegroundColor = "White"
EndSub
'
'Sous-routine utilitaire pour avancer dans la TextWindow
'
Sub next
  TextWindow.ForegroundColor = "Red"
  TextWindow.WriteLine("<Entrée>")
  TextWindow.Read()
  TextWindow.ForegroundColor = "White"
EndSub
'
'Tri le tableaux des contacts alphabétiquement
'
Sub sortString
  For i =  1 To Array.GetItemCount(contact)-1
    For j =  i+1 To Array.GetItemCount(contact)
      iVar = contact[i][var]
      jVar = contact[j][var]
      iValue = 0
      jValue = 0
      char = 0
      While (iValue  = jValue)
        char = char+1
        iValue = Text.GetCharacterCode(Text.GetSubText(iVar,char,1))
        jValue = Text.GetCharacterCode(Text.GetSubText(jVar,char,1))
      EndWhile
      If (jValue  < iValue) Then
        store = contact[i]
        contact[i] = contact[j]
        contact[j] = store
      EndIf
    EndFor
  EndFor
EndSub
'
'Tri le tableau des contacts par un nombre
'
Sub sortNumber
  For i =  1 To Array.GetItemCount(contact)-1
    For j =  i+1 To Array.GetItemCount(contact)
      iVar = contact[i][var]
      jVar = contact[j][var]
      If (jVar  < iVar) Then
        store = contact[i]
        contact[i] = contact[j]
        contact[j] = store
      EndIf
    EndFor
  EndFor
EndSub
 

Voir Aussi

Autres Langues