# QuickBasic

QuickBasic (QB) est un langage de programmation interprété, et désigne aussi l'environnement de développement intégré de Microsoft permettant l'édition, le débogage, l'exécution et la compilation de ce même langage sous MS-DOS. Il s'agit d'une variante du langage BASIC, destiné aux programmeurs débutants, qui reprend sa syntaxe et une grande partie de ses instructions, en général très proches de l'anglais.
L’environnement permet de générer des fichiers exécutables (.exe) MS-DOS 16 bits à l'aide d'un compilateur optimisé pour le 8088 (sauf dans les dernières versions où des optimisations spéciales 286 peuvent être choisies) et d'un lieur.
Il existe une version intitulée Professional Development System (PDS) Quick Basic Extended (QBX), dont les numéros de version sont supérieurs ou égaux à 7.x.
Une version allégée, basée sur la version 4.5 de la version complète et nommée QBasic, était fournie dans sa version 1.0 avec le système MS-DOS et disponible sur le CD-Rom de Windows 95 et de Windows 98. Avec cette version, le code source ne peut être qu'interprété, et non compilé en fichier exécutable. Ainsi, pour exécuter un tel programme, l'environnement QBasic est nécessaire.
QuickBasic est une application DOS 16-bits et n’est donc pas compatible avec les systèmes Windows 64-bits. On peut cependant le faire fonctionner à l'aide d'un émulateur DOS, tel que DosBox.

## Raccourcis utiles

Les raccourcis-clavier suivants sont utilisables dans l'éditeur QuickBasic :
* Ctrl + Pause pour stopper l'exécution du programme,
* F5 pour continuer l'exécution du programme à partir de l'endroit où il s'est arrêté,
* Shift + F5 pour redémarrer le programme depuis le début,
* F1 pour accéder à la page d'aide de l'instruction sous le curseur,
* Shift + F1 pour accéder au sommaire de l'aide,
* F2 pour naviguer entre le programme principal et les procédures/fonctions,
* F8 pour exécuter le programme instruction par instruction,
* F9 pour placer un point d'arrêt (l'exécution s'interrompt à cet endroit).
Lors de l'exécution d'un programme par l'interpréteur QuickBasic, il est possible d'utiliser la combinaison Ctrl + Pause pour interrompre son exécution, puis F5 pour la reprendre.
Enfin, le caractère ? en début de ligne est automatiquement remplacé par l'instruction PRINT.

## Instructions et fonctions

L'environnement QuickBasic, à la différence de nombreux autres langages de programmation, fait la différence entre une instruction et une fonction.
Un programme écrit en QuickBasic peut être qualifié comme une suite d'instructions, chacune donnant un ordre particulier à la machine. Deux instructions doivent être séparées par un retour à la ligne, ou par le caractère « : » (double-point) si elles se trouvent à la suite sur une même ligne. Il est à noter que le retour à la ligne est un héritage du BASIC, ancêtre du QuickBasic, qui nécessitait de numéroter chaque ligne d'instruction. Cette numérotation est maintenant facultative, et a tendance à surcharger le code d'un programme, mais peut encore être utilisée pour placer des étiquettes dans le programme, afin de gérer son déroulement.
Une fonction, en revanche, doit être incluse dans une expression mathématique et a pour principal rôle de renvoyer une valeur lorsqu'elle est appelée. Une fonction peut cependant avoir une incidence sur l'exécution du programme (par exemple en bloquant celle-ci dans l'attente d'une donnée).

### Quelques instructions usuelles

* CLS efface l'écran
* PRINT sert à afficher du texte ou des données sur l'écran (ou dans un fichier)
* INPUT permet d'obtenir une donnée de la part de l'utilisateur (ou d'un fichier)
* LOCATE place le curseur d'écriture à l'écran aux coordonnées spécifiées
* GOTO continue l'exécution du programme à partir de l'étiquette indiquée
* GOSUB a le même rôle que GOTO, mais permet de reprendre l'exécution à l'endroit où elle s'était arrêtée lorsque l'instruction RETURN est rencontrée
* REM ou ' (apostrophe) insère un commentaire qui n'est pas pris en compte lors de l'exécution
* COLOR permet de mettre en couleur l'arrière-plan et le texte

### Quelques fonctions courantes

* RND génère un nombre aléatoire dans l'intervalle [0;1[
* INT tronque un nombre et retourne sa partie entière
* INKEY$ renvoie le caractère correspondant à la dernière touche enfoncée
* CHR$ renvoie un caractère spécifié de la table ASCII
* UCASE$ et LCASE$ retournent une chaîne de caractères donnée, respectivement en majuscules ou en minuscules

## Données et opérateurs

Un programme complet et souple nécessite forcément l'utilisation de variables (des mots auxquels on associe une valeur). Leur utilisation en QuickBasic est très simplifiée et est décrite dans les points suivants.

### Noms de variable

En QuickBasic, un nom de variable doit respecter les règles suivantes :
* Il ne doit être composé que de caractères ou de chiffres (aucun caractère spécial ni lettre accentuée),
* Le premier caractère du nom doit être une lettre,
* Si nécessaire, le dernier caractère doit préciser le type de variable (voir ci-dessous),
* Les majuscules n'influent pas.

### Types de données

Afin de définir le type d'une variable en QuickBasic, il faut ajouter un caractère particulier à la fin de son nom. Voici les trois types de données les plus importants de ce langage :
* Le type par défaut est le nombre réel (aussi appelé nombre à virgule flottante en informatique), représenté par « ! » (point d'exclamation). On peut cependant omettre ce caractère si on ne spécifie pas d'autre type par défaut. Il est à noter au passage que le QuickBasic est un langage de programmation américain, et que par conséquent le séparateur décimal est un point : « . ».
* On peut aussi utiliser le type nombre entier, représenté par « % » (symbole pour cent) ; ce type permet notamment de gagner en rapidité lorsqu'un programme fait de nombreux calculs sur des nombres entiers.
* Le type chaîne de caractères est aussi très important, et est représenté par « $ » (symbole dollar). Une chaîne de caractères est une succession de caractères de toutes natures, ne faisant pas de distinction entre les lettres, les chiffres et les caractères spéciaux. Lorsqu'on écrit un programme, on doit représenter les chaînes de caractères entre des guillemets anglais : « " ».
Il existe aussi deux autres types numériques : les entiers longs et les réels à double précision, qui sont en fait l'équivalent des deux types numériques cités ci-dessus, mais dont la taille en mémoire est doublée, ce qui a tendance à ralentir le programme.
Enfin, le type booléen n'existe pas en soi, mais peut être reproduit en utilisant des types numériques prenant la valeur 0 pour FAUX et toute autre valeur non nulle pour VRAI.
Au vu des règles précédentes, les exemples suivants sont des noms de variables incorrects : Votre_Nom$, Pierre&Paul, 7aqui2jouer%, réponse$.
En revanche, les noms suivants sont valables : VotreNom$, PierreEtPaul, aqui2jouer%, reponse$.
Il faut aussi noter que les noms suivants : Variable, VARIABLE, variable, vArIaBlE sont entièrement équivalents et renvoient à la même variable. Si vous tapez le même nom avec une casse différente, l'éditeur QuickBasic modifiera automatiquement toutes les occurrences de ce nom afin de ne garder que la dernière version que vous aurez tapée.

### Assignation

Dans le langage QuickBasic, il n'est pas nécessaire de déclarer une variable pour l'utiliser. Ainsi, si une variable est utilisée dans une formule alors qu'elle n'avait pas été déclarée ni utilisée avant, elle prendra automatiquement la valeur nulle qui correspond à son type, sans déclencher d'erreur. Afin de déclarer une variable ou en modifier la valeur, on peut utiliser la syntaxe suivante :
Lorsqu'une telle ligne s'exécute au sein du programme, la variable portant le nom NomDeLaVariable prendra la valeur située à droite du (signe égal), qui peut être une valeur brute comme une expression mathématique aussi complexe que nécessaire. Il est aussi possible de réutiliser le nom de la variable dans le membre de droite (et donc de faire appel à sa valeur), comme dans l'exemple suivant :
Le membre de droite est alors calculé (il s'agit de la somme des variables Total et Taxes) puis assigné à la variable Total. Il est important de noter aussi que les variables ne sont jamais modifiées en dehors des lignes d'assignation. Ainsi, dans cet exemple, même si la variable Taxes est modifiée plus loin, Total ne sera pas automatiquement modifiée en conséquence.
Les versions plus anciennes dérivées du langage BASIC nécessitaient l'emploi de l'instruction LET en début de ligne pour effectuer une assignation, mais cette instruction est devenue facultative en QuickBasic.

### Opérateurs

Le langage QuickBasic dispose d'opérateurs basiques que l'on peut classer en quatre catégories. Leur priorité peut être précisée à l'aide de parenthèses.

#### Opérateurs numériques

Il s'agit des opérateurs mathématiques standards : « + » pour l'addition, « - » pour la soustraction, « * » pour la multiplication, « / » pour la division, « \ » pour la division entière, et « ^ » pour la puissance. Leur priorité est la priorité normale de ces opérations en mathématiques.

#### Opérateurs relationnels

Ces opérateurs permettent de tester une relation entre deux données numériques, cette relation étant : « = » pour égal (à ne pas confondre avec l'assignation, qui utilise le même symbole), « <> » pour différent, « < » pour strictement inférieur, « <= » pour inférieur ou égal, « > » pour supérieur, et « >= » pour supérieur ou égal.

#### Opérateurs sur les chaînes de caractères

Les deux seuls opérateurs disponibles pour les chaînes de caractères sont l'opérateur de concaténation (qui permet de placer bout à bout deux chaînes de caractères), représenté par le symbole « + », et l'opérateur d'égalité (qui permet de tester si deux chaînes sont égales), représenté par le symbole « = ».

#### Opérateurs booléens

Les opérateurs booléens permettent de tester des relations entre les opérateurs relationnels. Les principaux sont : « AND » pour le ET, « NOT » pour le NON, « OR » pour le OU inclusif, et « XOR » pour le OU exclusif.

## Structures

Il est nécessaire de structurer un programme afin qu'il adopte différents comportements selon son déroulement passé, ou selon les choix de l'utilisateur. Les structures de contrôle permettent ainsi de contrôler les parties du code qui ne doivent pas s'exécuter dans certaines circonstances, ou qui au contraire doivent se répéter. Les structures utilisées en QuickBasic sont des structures standard dont on retrouve des variantes dans la plupart des langages de programmation.

### IF

Un bloc IF, ou bloc conditionnel, est de la forme : IF … THEN … ELSE … END IF. Un tel bloc peut prendre deux syntaxes. La première est la suivante :
Cette syntaxe peut être utilisée dans le cas où les blocs d'instructions sont assez courts pour ne pas perturber la lisibilité du programme. La seconde syntaxe est de la forme qui suit :
Cette seconde syntaxe, plus aérée, permet de plus d'utiliser le mot-clef ELSEIF sans limitation.
Dans les deux cas, la condition qui suit le IF doit être vérifiée afin que le bloc d'instructions correspondant soit exécuté. Si ce n'est pas le cas, il en est de même avec chacun des ELSEIF qui se trouvent après. Si aucune condition n'est vérifiée, les instructions suivant le ELSE sont exécutées.

### DO … LOOP

La boucle DO … LOOP permet de réaliser tous les types de boucles conditionnelles possibles. Sa syntaxe la plus largement utilisée est la suivante :
Le bloc conditionnel qui suit le mot-clef DO débute soit par le mot-clef WHILE, dans quel cas la boucle doit se répéter TANT QUE la condition est vraie ; ou par le mot-clef UNTIL, qui indique à l'inverse que la boucle doit se répéter JUSQU'À CE QUE la condition soit vraie. Ce bloc conditionnel peut aussi être placé après le mot-clef LOOP, ce qui force la boucle à s'exécuter au moins une fois. Il peut aussi être omis, ce qui crée une boucle infinie qui doit être quittée par l'instruction EXIT DO.

### FOR … NEXT

La boucle FOR … NEXT répète un bloc d'instructions un nombre prédéfini de fois, tout en maintenant à jour une variable-compteur. Sa syntaxe est la suivante :
La variable-compteur (appelée variable ci-dessus) prendra dans l'ordre toutes les valeurs comprises entre début et fin, avec le pas précisé, qui peut être négatif, et qui vaut 1 par défaut s'il est omis.

## Exemple de programme

Voici un petit programme abondamment commenté, codant une sorte de loto en QuickBasic. Il est volontairement assez simpliste et lacunaire, pour en faciliter la compréhension. Pour les commentaires, on a préféré utiliser l'apostrophe plutôt que l'instruction REM, car cette dernière ne permet pas de placer un commentaire à la fin d'une ligne d'instruction. Afin de mieux les reconnaître, les commentaires sont ici affichés en gris.
Il est possible d'ouvrir ce programme au sein de l'éditeur QuickBasic afin de le tester, ou de le modifier. Pour cela, il suffit de le copier et de l'enregistrer dans un fichier .BAS (pour cela, il suffit par exemple de le coller dans un fichier texte dont on pourra modifier l'extension après l'avoir enregistré). Il ne reste alors qu'à retrouver ce fichier à l'aide de la commande Ouvrir du menu de l'éditeur.
Deux points importants sont à noter. Tout d'abord, l'éditeur n'affiche aucune coloration syntaxique, ce qui signifie que tout le code sera d'une seule couleur dans l'éditeur. Celui-ci met les instructions en valeur uniquement en les affichant toujours en majuscules, et ne colore pas les commentaires ou les chaînes de caractères. De plus, l'ouverture sous DOS d'un fichier texte créé sous Windows par exemple aura pour conséquence une mauvaise gestion des caractères accentués, qui seront remplacés par d'autres caractères. Il suffit alors de les retaper pour que tout rentre dans l'ordre.
Ce programme n'est naturellement qu'un aperçu du langage. Il faudrait lui ajouter de nombreuses fonctionnalités pour le rendre complet, telles que :
* la possibilité de jouer autant de fois que l'on veut, et non une seule,
* l'impossibilité de miser plus que le disponible,
* l'utilisation de la couleur pour agrémenter l'affichage,
* la possibilité de jouer à deux.
L'ajout de ces fonctionnalités est relativement simple et pourrait faire l'objet d'un exercice intéressant.