Initiation à QuickBasic / QBasic

      Nous allonc voir dans cet article les fonctions du langage Microsoft Quick Basic. Il existe deux versions du Basic de Microsoft: Quick Basic et QBasic. QBasic est livré avec le DOS à partir de la version 5.0. Il propose les mêmes fonctions que QuickBasic, exceptée la compilation, c'est à dire qu'il n'est pas possible avec QBasic de créer des bibliothèques ou des fichiers .EXE.

      QuickBasic est un bon langage pour commencer dans le monde de la programmation. C'est le langage le plus simple. Il est très peu utilisé par les professionnels, car ses fonctions systèmes sont limitées, et sa vitesse d'éxecution est très lente.

      Pour démarrer QuickBasic, allez dans le répertoire correspondant, et tapez "QB". Pour QBasic, allez dans le repertoire du DOS (>=5.0), et tapez QBASIC. Un écran bleu avec menus devrait apparaître.

    Les variables:

      Comme dans tous langages de programmation, QuickBasic permet de définir des variables. On différencie deux grand types de variables: les variables de nombres et les variables de chaînes de caractères. Des distinctions sont faites entre les différents types de nombres; mais il n'est pas nécessaire de s'en occuper pour le moment. Une variable est en fait un nom donnée pour représenter un nom ou un mot, une phrase. En mathématiques, vous allez utiliser la variable x pour désigner le temps ou l'abscisse. Sans connaître la valeur exacte de l'abscisse, vous allez pouvoir travailler dessus. C'est en quelque sorte une inconnue.

      On peut donner n'importe quel nom à une variable pourvu qu'il ne contienne pas d'espaces, de "-", de "_" et d'accents.

      Vous voulez par exemple désigner votre année de naissance. Vous pourrez donner comme nom à cette variable aussi bien DataDeNaissance, que datanaissance, que dtn, que Date.Naissance, que a. Pour affecter votre variable à un valeur, il suffit de mettre le signe "=" suivit de la valeur. Par exemple DateDeNaissance=1981.

      Les variables de chaînes s'écrivent suivies du signe "$". Elles sont affectées de la manière suivante: Nom$="Gol / Discase". Le Basic à besoin de savoir où commence et se termine la chaîne de caractère, pour cela, vous devez délimiter la chaîne avec des guillemets. Pour différiencer les chaînes des nombres, le Basic utilise cette notation du "$".

    L'instruction PRINT:

      L'instruction PRINT est l'instruction de base en Basic, elle permet la sortie sur l'écran d'une chaîne, d'un nombre ou de la valeur d'une variable. Pour afficher un nombre à l'écran, faîtes préceder ce nombre par PRINT. Pour afficher une chaîne, de la même façon que leur affectation, vous devez délimiter cette chaîne entre guillemets. Pour afficher la valeur d'une variable, fâites simplement préceder ce nom de variable par PRINT.

      Nom$="discase"
      A=3
      PRINT 4.52
      PRINT A
      PRINT Nom$

      Après avoir tapé ce programme, éxecutez-le à l'aide du menu Exécution-Exécuter. (Vous pouvez aussi utiliser le raccourci clavier Shift-F5). Vous devriez voir apparaitre à l'écran les lignes suivantes:

      4.52
      3
      discase

      Le PRINT 4.52 à afficher la valeur directement. PRINT A a été cherché la valeur de A et l'a affichée (3). PRINT Nom$ a été cherché la valeur de Nom$ et l'a affichée ("discase").

    Chaînage de l'instruction PRINT:

      Il est possible d'afficher plusieurs variables, nombres, chaînes sur une même ligne. Chaque argument de PRINT est séparé des autres par le signe ";". Vous pouvez mélanger tous les types de données.

      Exemple:

      Nom$="discase"
      A=32
      B=365
      PRINT Nom$; A; B; 512

      Vous devriez voir apparaître sur l'écran la ligne suivante:

      discase 32 365 512

    La fonction INPUT:

      INPUT est une instruction permettant l'entrée de caractères au clavier. La fonction PRINT affiche à l'écran une chaîne ou un nombre contenu dans une ou plusieurs variables. INPUT va attendre des touches de l'utilisateur jusqu'au moment où celui-ci aura tapé la touche ENTREE. Ce que l'utilisateur a tapé au clavier sera d'abord affiché caractère par caractère à l'écran puis transféré dans une variable de type numérique ou de type alphanumérique (chaîne).

      La syntaxe de cette commande est très simple: INPUT suivit du ou des noms de variables séparés par un ";". Par exemple: INPUT A$ attendra l'entrée au clavier d'une chaîne par l'utilisateur jusqu'à ce que celui-ci tape la touche ENTREE. La variables A$ contiendra désormais la chaîne rentrée au clavier.

      La commande INPUT A attendra non plus une chaîne de caractères, mais un nombre. Si l'utilisateur tape des lettres, le programme lui demandera de recommencer et de retaper un nombre.

    Affichage d'une chaîne avec la fonction INPUT:

      Il est possible avec la fonction INPUT d'afficher une petite chaîne avant d'attendre que l'utilisateur tape quelque chose. Il suffit pour cela de précder les noms de variables par la chaîne à afficher entre guillemets.

      INPUT "Entrez votre nom:", Nom$
      PRINT "Bonjour "; Nom$; ", comment ça va ?"

      Ce petit exemple montre comment récupérer un nom entré par l'utilisateur et de s'en reservir lors d'un PRINT. Notez la chaîne à coté de INPUT. Le programme affichera "Entrez votre nom" et attendra que l'utilisateur est appuyé sur ENTREE. Après l'appuie sur cette touche, le programme affichera "Bonjour discase, comment ça va ?" (si vous avez rentré "discase" comme nom, bien sûr :-))

    Les opérations arithmétiques:

      Le Basic est un outil de calcul très poussé. Il est possible d'effectuer des opérations mathématiques aussi simplement que sur une calculatrice graphique.

    Les opérateurs:

      +: addition
      -: soustraction
      *: multiplication
      /: division
      \: division entière (arrondie)
      MOD: modulo (reste d'une division)
      ( ): parenthèses
      ^: puissance

      Par exemple "A=(10 / 2)+3" affectera A à 8. "B=(A / 2) +3" affectera B à 7

      Attention! Seul le membre de droit peut-être un composé de fonctions. Il est impossible donc de faire "A/2+56=B-30"

    Les fonctions / procédures:

      Les fonctions de QuickBasic sont des instructions qui renvoient des valeurs. Un programme interne est éxecuté, il manipule des variables et renvoie leurs nouvelles valeurs. Ces valeurs devront êtres affectées à des variables. Un exemple simple de fonctions sont les opérations mathématiques plus "complexes" comme sin(angle) ou cos(angle) qui renvoient les valeurs des sinus et cosinus des angles passés en paramètres.

      Exemple d'un programme calculant le sinus de Pi/2:

      Pi = 3.1415
      A = SIN(Pi / 2)
      PRINT A

      Note: les fonctions sin() et cos() de QuickBasic attendent des angles en radians, pour calculer des sinus d'angles en degrés, il faudra procéder à une conversion

      Les procédures éxecutent un programme interne qui manipule la mémoire, l'écran, le clavier ... mais ne renvoie aucune valeur.

      Exemple de la procédure LOCATE:

      LOCATE 12,5
      PRINT "Bonjour tout le monde"

      Ce petit programme va afficher à l'écran la chaîne "Bonjour tout le monde" à la position d'écran y=12 et x=5.

      Nous n'allons pas détailler ici les différentes fonctions / procédures de QuickBasic, le fichier d'aide étant très bien fait, mais simplement citer le rôle d'un bon nombre de fonctions / procédures.

      Différentes fonctions:

      ASC()

      Renvoie le caractère ASCII du caractère pasé en paramètre

      CHR$()

      Renvoie le caractère dont le code ASCII est passé en paramètre

      Command$

      Renvoie les arguments de la ligne de commande du programme appelé

      CLOSE

      Ferme un fichier

      DATE$

      Renvoie une chaîne indiquant la date actuelle

      EOF

      Renvoie si la fin du fichier a été atteinte ou non

      Inkey$

      Renvoie le caractère présent dans le buffer clavier (voir input$)

      Instr$()

      Cherche une chaîne dans une autre

      INPUT

      Permet de récupérer une chaîne, un nombre entré au clavier

      Lcase$()

      Renvoie une chaîne convertit en minuscules

      Left$()

      Renvoie une chaîne contenant une partie (par rapport à la gauche) de la chaine passée en paramètre.

      Len()

      Renvoie la longueur d'une chaîne passée en paramètre

      Lof()

      Renvoie la taille du fichier ouvert dont le numéro est passé en paramètre

      LPRINT

      Même effet que PRINT mais sur une imprimante

      Ltrim$()

      Renvoie une chaîne dont les espaces placés à gauches de la châine passée en paramètre ont été éliminés

      Mid$()

      Renvoie une partie d'une chaîne passé en paramètre

      OPEN

      Ouvre un fichier

      Right$()

      Renvoie une partie d'une chaîne (par rapport à la droite) d'une chaîne passée en paramètre

      Rtrim$()

      Renvoie une chaîne dont les espaces placés à droite de la chaîne passée en paramètre ont été éliminés

      Space$()

      Renvoie une chaîne remplie d'espaces

      Str$()

      Renvoie une chaîne contenant un nombre (33 -> "33")

      Time$

      Renvoie une chaîne contenant l'heure actuelle

      Ucase$()

      Renvoie la chaîne passée en paramètre convertie en majuscules

      Val()

      Renvoie un nombre contenu dans une chaîne ("33" -> 33)

      Différentes procédures:

      Beep

      Fait un simple "biiip"

      Call

      Appelle un sous-programme personnel

      Circle

      Trace un cercle graphique

      Color

      Change la couleur du texte

      Kill

      Efface un fichier

      Line

      Affiche une ligne graphique

      Paint

      Peint une zone graphique

      Pset

      Affiche un point graphique

      Screen

      Active un ecran

      Shell

      Execute une commande DOS

      Sound

      Sort un son (fréquence et durée paramètrables)

    Structures conditionnelles:

      Les structures conditionnelles présentent le meilleur atout d'un langage de programmation, quelqu'il soit. C'est avec ces structures que vous allez pouvoir donner de l'interactivité à vos programmes. Sans quoi, un simple fichier .BAT serait suffisant à vos programmes (quoiqu'il y a un peu d'interactivité quand même).

      La commande principale est IF. On parle de bloc IF - ENDIF, car il faut délimiter d'abord une partie du programme à n'executer que dans un cas. Cette partie du programme (nommée bloc) sera entouré par les instructions IF et ENDIF.

      Pour que le compilateur sache s'il doit éxecuter ou non un bloc d'instructions, il doit d'abord procéder à un test. Il doit savoir si une variable est égale à une autre par exemple. Aussi bien les chaînes de caractères que les nombres peuvent être comparés.

      INPUT "Combien avez-vous de poules dans votre ferme ?", NbPoule
      IF NbPoule=0 THEN
      PRINT "Donc, ... vous n'avez pas de ferme."
      ELSE
      PRINT "Vous devriez acheter des moutons, c'est plus joli !"
      ENDIF

      Cet exemple est complètement débile, mais illustre bien comment marche les structures en IF. On pourrait lire le programme comme ça:

      SI (IF) le nombre de poule est 0 ALORS (THEN)
      affichage de " Donc,...."
      SINON (ELSE)
      affichage de "Vous devriez ... moutons ..."
      FIN DE SI (ENDIF).

      Les mots IF, THEN et ENDIF sont obligatoires pour former un bloc IF - ENDIF. Le mot ELSE est facultatif.

      Il est très facile d'utiliser des tests de supériorité, infériorité, etc ... IF NbPoule>15 THEN PRINT "Vous avez une grande ferme ..."

      Il existe différents tests:

      =

      Execution si égalité

      <>

      Execution si différence

      >

      Execution si supériorité

      <

      Execution si infériorité

      >=

      Execution si supériorité ou égalité

      <=

      Execution si infériorité ou égalité

    Chaînage de conditions:

      Il est possible de tester plusieurs conditions en une seule fois. Par exemple éxecuter un bloc SI le Nombre de poule est > à 5 ET < 15. Le "ET" se traduit en Basic par "AND". Il est aussi possible de tester une condition OU une autre par "OR".

      IF NbPoule>5 AND NbPoule<15 THEN
      PRINT "Vous avez une ferme de taille moyenne."
      ENDIF

      Note: remarquez les espaces utilisés à chaque bloc d'instructions. Ils servent à indiquer qu'on se trouve dans une structure spéciale. Cette notation est facultative, mais permet une meilleure lisibilité de vos programmes.

    Les boucles inconditionnelles:

      On appelle boucle inconditionnelle un bloc (eh oui, encore un) qui s'éxecute "en boucle" comme son nom l'indique sans jamais s'arrêter. C'est le cas du bloc DO - LOOP. Cette boucle ne fera que répeter et répeter encore un bloc d'instructions jusqu'à sortie de cette boucle (par la commande EXIT DO).

      Son utilisation est on ne peut plus simple: le bloc est précédé par "DO" et terminé par "LOOP"

      DO
      PRINT "Coucou"
      LOOP

      A l'éxécution de ce programme, vous allez voir qu'il est affiché la chaîne "Coucou" sur chaque ligne sans arrêt. Le programme ne peut pas s'arrêter d'une façon normale, il faudra le forcer à s'arrêter. Pour cela, appuyez sur CTRL - Arrêt Défil. Cette option de terminaison sert dans tous les cas où votre programme fonctionne mal.

    FOR - NEXT:

      La boucle FOR - NEXT permet de répéter un bloc d'instructions un nombre de fois paramètrable. Il est en fait affecté à une variable choisie une valeur incrémentée à chaque boucle. La syntaxe est FOR variable=départ TO fin [STEP pas]. variable représente la variable à affecter; départ le nombre de départ; fin le nombre de fin et pas le pas d'incrémentation. Il n'est pas nécessaire de spécifier le STEP, le pas par défaut est 1. La boucle doit être terminée par NEXT suivie de la variable utilisée.

      FOR i=1 to 15
      PRINT "Coucou"
      NEXT i

      Ce programme affichera 15 fois la chaîne "Coucou" à l'écran.

    Les boucles conditionnelles:

      Les boucles conditionnelles servent à répeter un bloc d'instructions sous une certaine condition.

    DO - LOOP:

      Le bloc DO - LOOP peut être paramètré pour devenir une boucle conditionnelle. Il y a deux options: une condition au DO OU une condition au LOOP (mais pas les deux).

      Pour le DO, il faut utiliser l'instruction WHILE suivie d'un test (comme avec les IF). Le bloc d'instruction va être répété TANT QUE la condition est respéctée.

      Pour le LOOP, il faut utiliser l'instruction UNTIL suivie aussi d'un test. Les bloc d'instructions sera répété JUSQU'A CE QUE la condition soie respéctée.

      DO
      INPUT "Entrez mon nom:",Nom$
      LOOP UNTIL Nom$="discase"

      ' Le bloc suivant est équivalent:
      DO WHILE Nom$<>"discase"
      INPUT "Entrez mon nom:",Nom$
      LOOP

    WHILE - WEND:

      Le bloc WHILE - WEND éxécute un bloc d'instructions TANT QU' une condition est respéctée. Ce bloc conditionnel a la même attitude qu'un DO WHILE - LOOP

    Les tableaux:

      Imaginons que vous vouliez faire un programme qui affiche une chaîne différente suivant l'heure de la journée. Avec vos connaissances actuelles, ce programme va ressembler à peu près à ça:

      ...
      IF Heure=0 THEN
      PRINT "Il est minuit"
      ELSEIF Heure=1 THEN
      PRINT "Il est 1 heure: c'est tôt"
      ELSEIF Heure=2 THEN
      PRINT "Il est 2 heures: c'est encore tôt"
      ELSEIF HEURE=3 THEN
      ...
      ...
      ENDIF
      ...

      Note: La commande ELSEIF permet d'enchaîner les IF sans pour autant fermer le bloc IF .. ENDIF

      Cette méthode est très longue si vous avez 24 heures à définir. Mais pour résoudre ce problème, il existe des variables spéciales appelées tableaux. C'est en fait une variable qui contient plusieurs valeurs. On donne un numéro pour accéder à une valeur.

      La déclaration d'une telle variable se fait de la manière suivante: DIM nom_variable(taille) AS type où nom_variable est le nom du tableau, taille, sa taille et type le type de donnée qui peut être STRING pour une chaîne de caractères, INTEGER pour un nombre entier, SINGLE pour un nombre à virgule flottante simple précision, DOUBLE pour un nombre à virgule flottante double précision, etc ... (voir types de données dans l'aide de QB).

      Pour notre petit programme, nous allons déclarer un tableau de chaînes de caractères appelé Message de taille 24 et de type STRING. Cette déclaration doit se faire impérativement dans les premières lignes du programme. On accède ensuite aux différentes chaînes contenues dans le tableau par Message(n). On devra avant utilisation les initialiser.

      DIM Message(24) AS STRING
      Message(1)="Il est tôt"
      Message(2)="Il est encore tôt"
      Message(3)="Il est toujours tôt"
      ....
      Message(23)="Il est onze, il se fait tard"

      ...
      PRINT "Il est "; Heure; "heure(s)"; Message(Heure)
      ...

      Cette méthode ne raccourcit pas le programme, mais permet d'être plus clair. Dans de petits programmes comme celui-ci, on ne voit pas bien la différence, mais utilisez au maximum les tableaux, cela permet une grande lisibilité.

      Note: remarquez l'utilisation de la variable Message sans le signe '$'. Ceci est normale car ce tableau a été déclarée de type chaîne; il est possible de déclarer toute variable avant utilisation, cela permet d'éviter l'utilisation du signe '$' dans les chaînes et d'éviter la confusion.

    Le mois prochain, l'initiation au QB continue avec la gestion des fichiers. Si vous n'avez pas tout compris, n'hésitez pas à m'écrire.

    Informations sur l'auteur:

    E-mail: discase@mygale.org
    Page Web: http://www.home.ch/~spaw1372/