Microsoft Small Basic

Program Listing: FCL390-4
'***************************************************************************************
'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("")
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