Partie II : 1) Des nouveautés sur les variables : Tableaux & Cie.

 
Dans ce chapitre nous allons voir quelques nouvelles astuces pour les variables



Les tableaux


Les tableaux sont des variables un peu spéciales. En fait ce sont des variables qui peuvent contenir d'autres variables. Ils portent bien leur nom alors imagez que chaque case du tableau (pas la peinture) soit une variable.
Les tableaux peuvent êtres à une seule dimension, une colonne OU une ligne.
Mais ils peuvent aussi êtres à deux dimensions , plusieurs lignes ET plusieurs colonnes (on peut aussi dire bidimensionnel, ça fait plus classe ^^ )


Création & Utilisation



Tableaux unidimensionnels

Les tableaux nécessitent d'être créés pour que l'ordinateur sache combien il y a des colonnes et de lignes. Ici on créer un tableau à une dimension.



Code :

dim tableau(5)


Quelques explications. DIM sert à dire à l'ordinateur que ce qui suit est un tableau.
Ensuite vient le nom du tableau en question. Si ce nom se termine par un $, le tableau contiendra des variables alphanumériques sinon ce sera des variables numériques.
Un tableau ne peut contenir qu'un seul type de donnée donc vous ne trouverez jamais un tableau contenant à la fois du texte et des nombres.
Enfin, entre les parenthèses se trouve le nombre de case du tableau. En fait ce code créera un tableau de six cases car la première case est 0 et la dernière est 5.
On peut représenté les tableaux unidimensionnel comme l'image sur le coté. Chaque case à un numéro unique appelé "clé" qui permet de récupérer la valeur stockée.

Pour stoker/récupérer la valeur stockée dans la case il suffit d'indiquer la clé de la case dont on souhaite stocker/récupérer la valeur comme suivant :

Code VB :
 
dim tableau(10) 'On indique qu'il s'agit d'un tableau
tableau(5) = 456 'On stocke la valeur du tableau dans la case 5
print tableau(5) 'On récupère la valeur de la case 5


Il faut toutefois faire attention à ne pas essayer de récupérer la valeur d'un case qui n'existe pas. En fait ici la grandeur de notre tableau est de 10 (de 0 à 10). Ainsi il est impossible de stocker ou de récupérer une valeur à la case 11, cela aboutirait inévitablement la fin du programme.

Tableaux bidimensionnels
Les tableaux bidimensionnel sont en réalité des tableaux à double entrée. Chaque case est repéré par le couple colonne/ligne. Chaque case à donc un couple unique qui permettent de récupéré les informations stockées.
Code VB :
 
dim tableau$(5,5)
 

C'est la même chose qu'un tableau unidimensionnel à la différence près que l'on donne le nombre de lignes ET le nombre de colonnes. Ce code ci créera un tableau de 6x6 cases pour les mêmes raisons que le tableau ci dessus.
Ici c'est un tableau de variables alphanumériques à cause du $ à la fin du nom.



Pour stocker ou récupérer la valeur d'un case dans un tableau bidimensionnel c'est exactement la même chose que pour un tableau unidimensionnel sauf qu'il faut indiquer le numéro de la colonne ET le numéro de la ligne.

Code VB :
 
dim tableau(5, 5) 'On indique qu'il s'agit d'un tableau bidimensionnel de 6*6 cases
tableau(2, 3) = 456 'On stocke la valeur du tableau dans la case de la colonne 2 et de la ligne 3
print tableau(2, 3) 'On récupère la valeur de la case de la colonne 2 et de la ligne 3



TP : Petit exercice sur les tableaux




Pour apprendre à maîtriser les tableaux rien de tel que l'entraînement. L'exercice que je vous propose est le suivant : vous allez devoir créer un tableau bidimensionnel de 10*10 cases que vous allez remplir avec des chiffres choisit aléatoirement de 1 à 9. Ce ne serais pas drôle si l'exercice s'arrêtait à ce niveau :-° Après avoir généré notre fameux tableau, vous allez proposer à l'utilisateur de rechercher les positions du nombre de son choix dans le tableau et lui dire le nombre de fois qu'il apparait.

Vous aurez donc besoin d'utiliser les boucles (utilisez celle de votre choix), de vous servir de l'instruction input, et de la fonction rnd(. Pour ne pas que vous perdiez de temps je vous redonne la fonction rand( prête à être utilisée :
Code VB :
 
function rand(min,max)
    rand = int(rnd(1)*(max-min+1))+min
end function
 


Bonne chance, ne passez pas trop de temps, 10 à 15 minutes devrais être amplement suffisantes (chez moi le code tiens en une trentaines de lignes sans les commentaires :-° )

La solution (à ne consulter que lorsque vous ne parvenez vraiment pas à faire un programme fonctionnel, ou pour comparer lorsque fini ;) ):


Code VB :
 
k = 9
n = 9
' N'oubliez pas qu'un tableau commence à 0 donc pour avoir 100 cases il faut faire du 9*9

dim tableau(k,n)
 
 
print "---0-1-2-3-4-5-6-7-8-9--"
print "------------------------"
 
for passageK = 0 to k 'On entre dans la boucle pour les colonnes
    print passageK;"| ";
    for passageN = 0 to n 'maintenant dans celle des lignes
       tableau(passageK, passageN) = rand(1,9) 'On attribut un chiffre aléatoire au couple colonne/ligne
       print tableau(passageK, passageN); " "; 'On affiche
    next
    print "|"
next
 
print "-----------------------"
input "Rechercher le chiffre : "; c 'On demande à l'utilisateur de choisir un numéro

for passageK = 0 to k
    for passageN = 0 to n
       if tableau(passageK, passageN) = c then 'Si le chiffre entré par l'utilisateur correspond a la valeur du couple colonne/ligne on affiche la position
            txtNombreOccurence$ =  txtNombreOccurence$ + chr$(13) + "- [";passageK;",";passageN;"]"
            nombreOccurence = nombreOccurence + 1 'Si le chiffre de l'utilisateur est trouvé alors on augmente le nombre d'occurence de 1
       end if
    next
next
 
if nombreOccurence > 0 then
    print
    print "Chiffre "; c; " aux positions :"; txtNombreOccurence$ 
    print "Le chiffre apparaît "; nombreOccurence; " fois." 'On affiche le nombre d'occurence
else
    print
    print "Le chiffre "; c;" n'apparait pas dans le tableau"
end if
 
end 'Fin du programme

 
 
 
'---------------------------------
'------------ FONCTIONS ----------
'---------------------------------

'Renvoie un nombre aléatoire compris entre min et max
function rand(min,max)
    rand = int(rnd(1)*(max-min+1))+min
end function
 
 
 



Par soucis de lisibilité j'ai ajouté le numéro des colonnes et des lignes respectivement en haut et sur le coté de l'affichage. Notez que ce code crée l'affichage tabulaire par des retours à la ligne, dans la réalité, on affiche pas toute les valeurs du tableau en même temps. C'est juste un moyen de stocker les données. Nous avons fait ça pour que vous compreniez bien comment on créer un tableau et surtout pour que vous visualisiez, en effet c'est un peu abstrait lorsqu'on n'en a pas l'habitude :)

Tableaux tridimensionnel


Pour comprendre cette partie assurez vous de bien comprendre les deux partie précédente et également le chapitre portant sur les subs, en effet nous allons nous en servir ici :)


Arrivé à ce point vous vous dites sûrement qu'on peut créer un tableau à 50 dimensions avec LB, figurez vous que non :( LB ne supporte nativement que les tableaux à 2 dimensions. Toutefois pour les curieux qui ont feuilleté l'aide (ou cliqueté l'aide pour être plus précis :P) vous remarquerez une section nommée 'Arrays with more than 2 dimensions' c'est à dire 'Tableau à plus de deux dimensions'.
Je vous vois venir avec vos "Quoi :hum ! tu avais dit que LB ne supportait que les tableaux à deux dimensions au maximum !' Rassurez vous ça n'a toujours pas changé :) En fait Carl Gundel (le créateur de LB) nous propose une technique pour créer un tableau à 3 dimensions. On va simuler un tableau à trois dimensions. Comment ? Analysons le code tiré de l'aide légèrement modifié :

Code VB :
 
'On crée un tableau assez grand pour contenir 10x10x10 elements
dim monTableau$(9, 99)
 
'On enregistre "Je suis là !!" dans la case 5,3,1
call setMonTableau$ 5, 3, 1, "Je suis là !!"
 
'Maintenant, on récupère la valeur de la case 5,3,1 et on l'affiche
print getMonTableau$(5, 3, 1)
 
end
 
 
 
'-------------------------------------
'--------------- SUB -----------------
'-------------------------------------

' Sub permetant de mettre valeur$ dans monTableau en x,y,z
sub setMonTableau$ x, y, z, valeur$
    monTableau$(x, y + z * 10) = valeur$
end sub
 
 
'-------------------------------------
'------------ FONCTIONS --------------
'-------------------------------------

' Fonction renvoyant la valeur de monTableau en x,y,z
function getMonTableau$(x, y, z)
    getMonTableau$ = monTableau$(x, y + z * 10)
end function
 


On créer d'abord un tableau (ou array en anglais) assez grand pour avoir un tableau à trois dimension. En fait notre tableau tridimensionnel sera de taille 10*10*10. Comme on ne peut pas faire plus de deux dimensions, on 'écrase' la troisième dimension sur la deuxième.
Notre tableau fait donc 10*10*10. 10 concernera donc la première dimension du tableau, et 10*10 la deuxième ET la troisième. Comme on est obligé de faire fusionner les deux dernières dimension on a donc 10*100. D'où le code suivant :

Code VB :
dim monTableau$(9, 99)


Ensuite nous allons donc créer une fonction qui va dire à notre cher ordinateur quoi faire. On créer donc un sub qui prend les paramètres x, y et z.
Oui mais on met quoi dans la sub ? Très simple ! On prend notre tableau nommé ici monTableau$ et on lui dit de prendre le paramètre x et de le stocker dans la première dimension et ensuite on prend les paramètres y et z, on multiplie un des paramètre par 10 et on additionne le dernier au résultat pour les mettre dans la seconde dimension du tableau. Je vois de là vos mines perplexes. Pourquoi ne pas simplement multiplier y et z ? C'est très simple, on aurait des risque de collisions, en effet yz=zy. Donc du coup, pour avoir une position unique on multiplie un des paramètre par 10 et on additionne le dernier au résultat. Nous avons donc ici notre deuxième dimension du tableau myArray$ qui peut contenir 100 éléments. En effet y+z*10 est différent de z+y*10. N'oubliez pas que la multiplication est prioritaire !

Petit exemple pour vous prouvez que j'ai raison :
On fixe les valeurs x1 = 3, y1 = 4 et z1 = 6. On fixe les valeurs x2 = x1, y2 = z1 et z2 = y1.
Si l'on fait monTableau$(x1, y1+z1*10) => monTableau$(3, 4+(6*10)) => monTableau$(3, 4+60) on a donc monTableau$(3,64). Maintenant faisons monTableau$(x2, y2+z2*10) => monTableau$(3, 6+(4*10)) => monTableau$(3, 6+40) on a donc monTableau$(3,46). La clé de l'élément est donc bel et bien unique ! Notre sub est donc bien fonctionnelle :D

Et pourquoi 10 alors ? Car la seconde dimension de notre tableau monTableau$ doit faire 100. Au maximum x, y et z peuvent au maximum être égales à 9. Si nous avons y et z tels que y = 9 et z = 9 nous avons donc 9+9*10 soit 99. Nos avons donc bien nos 100 valeurs. Rappelez vous bien qu'un tableau comment à 0 !

Code VB :
 
sub setMonTableau$ x, y, z, valeur$
    monTableau$(x, y + z * 10) = valeur$
end sub
 


Pour récupérer la valeur on utilise la même méthode :

Code VB :
 
function getMonTableau$(x, y, z)
    getMonTableau$ = monTableau$(x, y + z * 10)
end function
 


J'espère que vous avez compris la subtilité avec la multiplication qui n'est pas évidente. C'est vrai qu'à première vue la logique peut paraitre tordue, mais en y regardant bien c'est extrêmement logique. Au début lorsque je suis tomber sur ce code je n'est pas compris, et j'espère que mes explications vous ont éclairées. Toutefois si vous n'avez pas compris ce n'est pas grave. On ne se sert presque pas (pour ainsi dire jamais) des tableaux à trois dimensions :) Il m'a semblé toutefois intéressant de vous montrez comment l'on fait, pour au moins que vous voyiez l'ingéniosité de la solution. (et on peut même faire des tableaux à 4 dimensions, essayez pour voir si vous y arrivez ;) )


Les références


Les références sont très pratiques, et pour tout vous dire je ne les connaissais pas en JB avant d'écrire ces lignes.
Les références sont un croisement entre les variables globales et les variables locales.
Je ne sais pas trop comment vous expliquer alors je vais vous donner deux exemples qui ne font pas la même chose puis deux autres qui font la même chose :
Les deux codes qui ne font pas la même chose :
  • Code VB :
     
    nombre = 1
    print nombre
    call add nombre
    print nombre
     
     
     
    sub add chiffre
        chiffre = chiffre + 1
    end sub
     
  • Code VB :
     
    nombre = 1
    print nombre
    call add nombre
    print nombre
     
     
     
    sub add byref chiffre
        chiffre = chiffre + 1
    end sub
     


La seule différence entre ces deux codes c'est la présence de byref devant le paramètre chiffre de add.
Et pourtant c'est une différence de taille. Je vais vous expliquer vite fait comment fonctionne les fonctions (et les Sub, c'est pareil) sans et avec byref :
  • Sans byref : Lors du passage des paramètres c'est la VALEUR et uniquement la valeur de la variable qui est transmise à la fonction (ou à la Sub).
  • Avec byref : C'est l'adresse où est la variable en mémoire qui est transmise à la fonction donc en gros c'est la même variable mais avec un nom différent.


Maintenant voici les deux codes qui font la même chose :
  • Code VB :
     
    global nombre
     
    nombre = 1
    print nombre
    call add
    print nombre
     
     
     
    sub add
        nombre = nombre + 1
    end sub
     
  • Code VB :
     
    nombre = 1
    print nombre
    call add nombre
    print nombre
     
     
     
    sub add byref nombre
        nombre = nombre + 1
    end sub
     


Dans le premier cas j'utilise une variable globale et dans le deuxième une référence.
Je vous ai dit qu'il fallait le moins possible utiliser les variables globales et ça reste toujours vrai. Il est préférable d'utiliser les références car vous avez un plus grand contrôle.

Pour finir, je voulais vous signaler que chaque paramètre peut-être une référence, ou pas.
Voici une Sub qui prend deux paramètres. Le premier c'est un nombre quelconque qu'elle doit arrondir. Le deuxième c'est où elle va mettre le résultat :
Code VB :
 
sub arrondie nombre, byref resultat
    tps = int(nombre)
    if nombre >= tps + 0.5 then
        resultat = tps+1
    else
        resultat = tps
    end if
end sub
 


Comme vous le voyez, le premier paramètre est un paramètre normal - seule la valeur est transmise - et le deuxième paramètre est une référence - l'adresse de la variable est transmise.
J'aurais pu mettre le premier paramètre en référence mais ce n'était pas la peine, on ne change pas cette valeur.

Et voici comment utiliser ma Sub :
Code VB :
 
resultat = 0
print resultat
 
call arrondie 15.5,resultat
 
print resultat
 
end
 

Certain me diront que c'est bien beau les référence, mais si par exemple on ne met pas une variable dans les paramètres et que l'on met ça par exemple pour appeler ma Sub arrondie :
Code VB :
 
call arrondie 15.245, 0
 

Et bien je vous rassure, ça ne plante pas, le code se déroule comme si de rien était.


Alors n'utilisez pas les références n'importe comment, si vous ne voulez pas changer la valeur de la variable, pas de référence. Sinon, oui.


Les booléens


Les booléens sont utilisés par les conditions pour savoir si elles sont vraies ou fausses.
En théorie, un booléens ne peut prendre que deux valeurs : 0 -> c'est faux et 1 -> c'est vrai.
Mais en JB il n'existe pas de variable spéciale pour les booléens alors la règle devient : 0 -> c'est faux et tout autre nombre -> c'est vrai.
Tous ça pour vous dire que dans vos conditions vous n'êtes pas obligé de mettre un condition, vous pouvez très bien mettre :
Code VB :
 
variable = 8
if variable then
    print variable
end if
 
variable = 0
if variable then
    print variable
end if
 


Maintenant encore plus fort.
Vous pouvez stocker le booléens d'une condition dans une variable :
Code VB :
 
a = 12
b = 13
 
bolleens = (a < b)
 
print bolleens
 
bolleens = (a > b)
 
print bolleens
 


Voila pour les booléens.
Les boucles aussi utilisent les booléens sauf la boucle for..next.




Et voila, tout plein de petites nouvelles choses qui peuvent se révélées bien utiles.
Et maintenant direction les fichiers :clap


 
Cette page a été consultée 3439 fois