J'apprends à programmer en Pascal

Sur mon smartphone ou ma tablette Android

Alcatîz

Le Pascal est un langage idéal pour apprendre à programmer. Tout en étant très puissant, il est très structuré et simple à appréhender.

Vous n'avez jamais touché à la programmation ? Grâce à ce tutoriel très détaillé, vous pourrez développer vos premiers programmes sans peine.

Qui plus est, vous pourrez le faire à la plage, dans votre divan, dans le train, au petit coin, bref où vous voudrez.

Et si vous tenez à suivre ce cours sur PC… c'est possible aussi !

- Titre : J'apprends à programmer en Pascal

- Auteur : Alcatîz

- Parution : 17 août 2018

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2018 Alcatîz. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Qu'est-ce que programmer ?

- I-B. Comment fonctionne une «  machine » ?

- I-C. Qu'est-ce qu'un langage ?

- I-C-1. Le langage machine

- I-C-2. L'Assembleur

- I-C-3. Langages de haut niveau et de bas niveau

- I-C-4. Le langage Pascal

- I-C-5. Compilateurs et interpréteurs

- II. Conception d'un programme

- III. Installation d'un environnement de développement

- III-A. Sur tablette ou smartphone Android

- III-B. Sur PC

- IV. Premier atelier : les systèmes de numération

- IV-A. Représentation des nombres dans les bases 10 et 2 (et un peu en base 8)

- IV-B. Conversions entre bases 10 et 2

- IV-C. Addition et soustraction en bases 10 et 2

- IV-D. Le système de base 16

- IV-E. Et la base 8 alors ?

- V. Premier programme : affichage à l'écran

- V-A. Mots réservés et symboles

- V-B. Caractères autorisés dans la syntaxe du Pascal

- V-B-1. Le rôle essentiel du point-virgule

- V-C. Structure d'un fichier source principal

- V-D. Affichage à l'écran : Write et WriteLn

- V-E. Lecture au clavier : Read et ReadLn

- V-F. Les chaînes de caractères

- VI. Atelier 2 : taille des données

- VI-A. Le bit

- VI-A-1. Opérations logiques

- VI-A-2. Décalages de bits

- VI-B. L'octet ou byte

- VI-C. Le mot ou word, le double mot ou dword, le quadruple mot ou qword

- VII. Programme 2 : déclaration d'une variable

- VII-A. Type d'une variable

- VII-A-1. Le type chaîne de caractères

- VII-B. L'identificateur d'une variable

- VII-C. Code de l'exemple 2

- VIII. Programme 3 : if … then … else ou structure alternative

- VIII-A. Structures imbriquées

- IX. Programme 4 : case … of … else ou commutateur

- IX-A. Les intervalles

- IX-A-1. Notion de type ordinal

- IX-A-2. Le type intervalle

- X. Appendices

- X-A. Liste des mots réservés

- X-B. Liste des symboles

I - Introduction

I-A - Qu'est-ce que programmer ?

Programmer, c'est appliquer à une machine (ordinateur, tablette, calculatrice…) une chose que nous faisons inconsciemment un peu tous les jours.

« Si j'ai terminé mon travail à midi alors je demanderai une demi-journée de congé à mon patron ; s'il accepte, je me rendrai d'abord à la banque pour retirer du cash puis j'irai chez le coiffeur. »

« Je programme l'enregistrement d'une émission télévisée : s'il y a assez de place sur le disque du décodeur, alors il faut enregistrer avec une marge de sécurité ; sinon, il faut effacer l'émission. »

« Au casino, tant que j'ai de la monnaie et tant que je n'ai pas gagné le jackpot, je mets des pièces dans la machine à sous. »

De tels exemples, vous pourriez en trouver des dizaines dans la vie quotidienne (et non, n'allez pas croire que je vais au casino tous les jours). Vous sentez intuitivement les « si ceci alors cela, sinon autre chose » ? Les « tant que cette condition est vraie, faire cette action » ? Nous allons rencontrer ce genre de raisonnement tout au long de ce tutoriel, mais appliqué à la programmation d'une « machine ».

Programmer, c'est définir des instructions à exécuter, soit dans l'ordre qu'on aura décidé (ce que l'on appelle la programmation séquentielle), soit en réaction à certains événements (ce que l'on appelle la programmation événementielle).

Mais comment ?

Avant de pouvoir répondre à cette question, nous allons devoir nous faire tout petits et aller voir comment fonctionnent ces PC, smartphones, tablettes et autres calculatrices programmables.

I-B - Comment fonctionne une «  machine » ?

Grosso modo, la structure interne d'une tablette, d'un PC, d'une calculatrice ou d'un smartphone est similaire. Toutes ces machines ont en commun :

- une carte-mère : bourrée de circuits imprimés et d'électronique, elle fait en sorte que tous les composants de la machine communiquent et fonctionnent de manière coordonnée et synchronisée ;

- un processeur : c'est le cœur de la machine, chargé d'exécuter les programmes. Il est connecté directement sur la carte-mère ;

- une mémoire centrale : toutes les données à traiter et les programmes en train de s'exécuter y sont stockés, à la disposition du processeur. Elle est également connectée sur la carte-mère ;

- une mémoire de stockage : plutôt disque dur sur un ordinateur, plutôt mémoire flash et carte SD sur une tablette ou un smartphone, c'est là que sont conservés toutes les données et tous les programmes lorsque la machine est éteinte ;

- des périphériques d'entrée : plutôt clavier et souris pour le PC, plutôt écran tactile pour le smartphone et la tablette, mais aussi webcam, microphone, etc. ;

- des périphériques de sortie : l'écran, une imprimante, un haut-parleur, etc.

Tout cela constitue le « hardware ».

Et il ne faut surtout pas oublier :

- un firmware : c'est un ensemble de programmes de base qui permettent à la machine de démarrer, de se tester et qui pilotent le fonctionnement des différents composants matériels. Pour un PC, on parle de « BIOS » et d'« UEFI » (le second ayant remplacé le premier sur les machines récentes). Le firmware est souvent stocké dans une mémoire permanente sur la carte-mère ;

- un système d'exploitation : c'est un ensemble de programmes qui, eux aussi, pilotent le fonctionnement des différents composants de la machine (à la place ou à côté des programmes du firmware) et qui, surtout, s'occupent d'interagir avec l'être humain qui se sert de la machine. Citons : Windows, Linux, Android, BSD, MacOS, iOS, etc., et quelques ancêtres : MS-DOS, UNIX, etc.

Voilà ce que l'on appelle le «software ».

Vous aimez bien les petits dessins ? Allez, en voici un(1) que je trouve pas mal pour représenter ce qui précède, du moins le « hardware » :

Les flèches représentent la circulation des données et des instructions.

Lorsque la machine est en fonction, le système d'exploitation s'occupe d'octroyer du temps d'exécution à un tas de programmes (ou processus), lui appartenant ou pas, à traiter un tas d'événements, déclenchés soit par le matériel soit les processus en cours d'exécution. Alors que l'on a l'impression que tout tourne en même temps, rien n'est moins vrai : en réalité, chaque processus qui tourne reçoit une petite portion du temps d'exécution du processeur et le système d'exploitation s'assure qu'à chaque fois le processus retrouve son « environnement » (ses données, l'état du processeur au moment où il a été interrompu, l'instruction suivante à exécuter, etc.).

La gestion des composants de la machine et des périphériques d'entrée et de sortie est confiée à des pilotes, qui sont des programmes généralement écrits par les fabricants du matériel (il existe aussi des pilotes « libres » pour une bonne partie du matériel existant).

Rassurez-vous, nous n'avons pas besoin d'aller plus en détail pour comprendre la suite. Il vous importe peu de savoir tout ce qui se passe lorsque l'utilisateur de votre programme presse une touche du clavier : ce qui vous intéresse c'est de récupérer le caractère qui a été tapé.

I-C - Qu'est-ce qu'un langage ?

En résumant très très fort, il existe plusieurs sortes de langages en informatique. Lors de la conception d'un logiciel, certains langages sont destinés aux humains (par exemple, UML, qui permet de visualiser graphiquement la conception d'une application), ce sont des langages de conception ; d'autres langages sont destinés aux machines : ce sont les langages de programmation.

Nous nous intéressons ici à l'un d'eux : le Pascal.

Un langage de programmation est une notation (avec une syntaxe particulière) permettant de formuler un ensemble d'instructions constituant un programme.

Avant de passer au Pascal, jetons un œil sur le fameux langage machine, qui est en réalité le seul langage compris par le processeur, et sur l'Assembleur, qui est la version lisible par un humain du langage machine.

Attention, ça fait un peu peur mais ça ne va pas durer longtemps.

I-C-1 - Le langage machine

En réalité, chaque type de processeur est conçu pour exécuter un ensemble assez restreint d'instructions (on parle de jeu d'instructions). Les PC tournent généralement avec des processeurs de type « Intel » ; dans le monde du mobile, c'est plutôt la famille des processeurs de type « ARM » qui prédomine.

Le processeur exécute séquentiellement les instructions qui lui sont transmises, sous la forme d'un flux de nombres binaires (des 0 et des 1). Par exemple, un processeur 64 bits de type « Intel » qui reçoit 0100 1000 1000 0011 0000 0011 0000 0010 : les premiers 0100 1000 l'informent qu'il va traiter une donnée de 64 bits, les 1000 0011 0000 0011 suivants l'informent qu'il va devoir additionner un nombre au contenu d'une zone mémoire de 64 bits dont l'adresse est contenue dans un de ses registres internes, et le nombre en question est 0000 0010, c'est-à-dire… 2.

Voilà ce que comprend le processeur : des 0 et des 1. Si l'on programmait en binaire aux tout débuts de l'informatique, il est vite apparu qu'une version de ces instructions dans un langage lisible par un humain serait un plus : c'est ainsi qu'est apparu le langage Assembleur.

I-C-2 - L'Assembleur

Chaque type de processeur possède un jeu d'instructions particulier, et donc aussi un Assembleur. Pour représenter l'instruction ci-dessus (qui signifie donc « additionner le nombre 2 au contenu de la zone mémoire de 64 bits dont l'adresse est contenue dans le registre RBX ») on écrira :

ADD    QWORD PTR [RBX], 2

C'est déjà nettement plus lisible que le binaire, non ?

Là il s'agissait d'Assembleur « Intel x86_64 ». Voici l'équivalent pour un processeur « ARM-7 » :

LDR    X0, [X3]
ADD    X0, #2
STR    X0, [X3]

Je vous l'avais dit : autre famille de processeur, autre jeu d'instructions. Vous comprenez aussi qu'un programme écrit pour une machine à processeur « Intel » ne pourra jamais être exécuté sur une machine à processeur « ARM ».

Mais cela, nous n'en avons cure, parce que nous allons encore remonter d'un cran et utiliser un langage qui s'abstrait du type de processeur : un langage de haut niveau.

I-C-3 - Langages de haut niveau et de bas niveau

Parmi les langages de programmation, on distingue généralement ceux que l'on qualifie de haut niveau de ceux de bas niveau.

Les langages de haut niveau permettent de faire abstraction du type de processeur et de la façon dont fonctionne le matériel de la machine, contrairement à ceux de bas niveau.

La frontière est même un peu plus floue que cela car nombre de langages de haut niveau offrent des fonctionnalités de bas niveau. C'est ainsi que la plupart des systèmes d'exploitation (Windows, Android, etc.) et des pilotes de périphériques sont maintenant écrits dans des langages de haut niveau (surtout en C).

Nous situerons clairement le langage machine et l'Assembleur dans les langages de bas niveau.

Nous situerons le Pascal (et le C) dans les langages de haut niveau, même s'ils permettent tous les deux du traitement de bas niveau. D'ailleurs, nous n'aborderons absolument pas les fonctionnalités de bas niveau du Pascal dans cet ouvrage.

I-C-4 - Le langage Pascal

Le Pascal a été inventé dans les années 1970 à Zürich par Niklaus Wirth(2). Il s'est tout de suite révélé adapté à l'enseignement de la programmation, par sa clarté, sa structuration claire et sa rigueur. Mais le Pascal initial était relativement limité et il s'est rapidement vu greffer des extensions qui en ont fait un langage puissant.

Si vous parcourez, par curiosité, des forums de discussion sur la programmation, vous risquez de tomber sur des réflexions pas très positives sur le langage Pascal. Car il a longtemps été enseigné comme langage de base de programmation dans les écoles et il est resté, dans l'esprit de beaucoup, un langage pour débutants ou pour développeurs amateurs.

Et bien c'est totalement faux ! Sachez que les premières versions du système Macintosh et des logiciels comme Photoshop, Skype, Kaspersky, Jabber, SpyBot ou Everest ont été écrits en Pascal.

Dans le monde du développement professionnel, le Pascal navigue toujours dans les dix à quinze langages les plus utilisés ; citons les plus courants :

- le C, avec ses dérivés C++, C# (« C sharp »), Objective-C ;

- le Java ;

- le PHP ;

- le Basic et le Visual Basic ;

- Python ;

- Perl ;

- Ruby ;

- le Lisp ;

- l'Assembleur ;

- et une multitude d'autres !

Python, le C et ses dérivés, et Java sont prédominants en parts de marché des langages. Donc, si vous rêvez de devenir un jour développeur professionnel, vous savez déjà que vous devrez apprendre le C, Python et sans doute aussi le Java.

Mais commencer par apprendre le Pascal pourra vous donner de très bonnes bases et vous aider à éviter de nombreux pièges tendus par des langages moins rigoureux. De plus, lorsque l'on apprend à concevoir des algorithmes (c'est-à-dire mettre en place les étapes permettant de résoudre un problème), leur traduction en programme est plus naturelle et plus lisible en Pascal que, par exemple, en C.

I-C-5 - Compilateurs et interpréteurs

Si vous faites une recherche sur le langage Pascal, vous verrez systématiquement cités : Turbo Pascal, Free Pascal, Lazarus et Delphi.

Le premier est en quelque sorte l'ancêtre des trois autres : Turbo Pascal, édité par Borland, a fait les beaux jours du langage Pascal sur MS-DOS puis sur les premières versions de Windows.

Le successeur de Turbo Pascal fut (et est toujours, malgré les rachats successifs de Borland) Delphi. Des extensions ont été ajoutées au langage (le Pascal est devenu « objet » - vous comprendrez ce terme beaucoup plus tard dans ce cours – et s'appelle désormais Pascal Objet), et la conception des applications se fait à présent visuellement et plus rapidement (on parle de « RAD », pour « Rapid Application Development »). Delphi est à présent inclus dans la suite RAD Studio.

Parallèlement au développement de Turbo Pascal, au début des années 1990, une équipe de développeurs a créé une alternative libre et gratuite au produit phare de Borland : FPK Pascal, devenu Free Pascal. Et lorsque Delphi s'est installé sur le marché des outils de développement, s'est bâtie sur Free Pascal l'alternative libre et gratuite Lazarus.

Tous ces outils de développement permettent de compiler du langage Pascal. Avec Turbo Pascal et Free Pascal, on l'écrit soi-même ; avec Lazarus et Delphi, une partie est automatiquement écrite lorsque l'on dépose et modifie des composants tout faits sur des formes (et c'est ce gain de temps qui justifie l'appellation « Rapid Application Development »).

Dans ce cours, nous parlerons de « code source », de « fichier source » ou de « source » tout court. Pour fonctionner, le compilateur a besoin que le code en langage Pascal se trouve dans un (ou plusieurs) fichier(s) texte. Cela a son importance : si vous écrivez un programme dans un document Word, LibreOffice ou OpenOffice, par exemple, le compilateur ne pourra pas le lire car le fichier sera rempli de données de formatage.

Le code source (ou source(3)) est le code écrit en langage Pascal.

Un fichier source est un fichier texte qui contient du code source.

Que les instructions aient été écrites à la main ou générées automatiquement, elles seront traduites en langage machine.

La plupart du temps, la compilation consiste en la lecture du code source en langage Pascal et en sa traduction en langage machine dans un fichier exécutable.(4)

Avec le principe de la compilation, on crée donc une seule fois un fichier exécutable (ou plusieurs, tout dépend de la taille et de la nature du logiciel que l'on crée(5)). Ce ou ces fichier(s) exécutables pourront ensuite être distribués et installés sur d'autres machines. Il n'y aura pas besoin d'installer le compilateur sur ces machines pour exécuter le logiciel !

Il existe une alternative à cette manière de procéder : au lieu de créer une fois pour toutes un exécutable que l'on peut distribuer, on installe sur toutes machines un interpréteur, qui va lire le source en Pascal et en exécuter les instructions au fur et à mesure.

Pour fixer les idées :

Compilateur

Interpréteur

Le code source est traduit une fois pour toutes en langage machine

Le code source est traduit en langage machine à chaque exécution

Le compilateur ne doit pas être présent pour faire fonctionner le programme

L'interpréteur et le code source doivent être présents pour exécuter le programme

Les toutes premières versions du Pascal étaient interprétées ; il existe encore actuellement des interpréteurs Pascal mais l'immense majorité des outils de développement d'aujourd'hui sont basés sur des compilateurs. On peut donc affirmer sans crainte que le Pascal est un langage compilé.

II - Conception d'un programme

Je suis sûr que vous avez hâte de passer à l'action ! Et bien pas encore. Concevoir un logiciel, ce n'est pas se jeter tête baissée et commencer à coder tout de suite, même si on en a très envie.

Hou le vilain rabat-joie ! Je sais, mais vous me remercierez un jour.

Avant toute chose, il faut prendre le temps de la réflexion :

- Que doit faire exactement mon logiciel ? Ai-je bien analysé tous les besoins exprimés par mon client ? Lui ai-je bien, avant cela, posé les bonnes questions pour qu'il les exprime ?

- Quelles plate-formes et quelles technologies suis-je obligé d'utiliser, ou puis-je éventuellement choisir ?

- Existe-t-il du code tout fait ou des composants utilisables, pour me permettre de gagner du temps ?

- Comment vais-je organiser mon code source, comment vais-je le découper en blocs logiques ? Il existe des modèles de conception, par exemple regrouper l'accès aux données dans un module, tous les traitements dans un autre module, et tout ce qui concerne l'interaction avec l'utilisateur dans un troisième module.

- Comment faciliter une évolution future du logiciel, l'ajout de nouvelles fonctionnalités ?

Une fois que vous aurez une idée précise de la conception de votre logiciel, vous pourrez commencer à écrire du code. Mais le processus de réflexion sera loin d'être terminé : pour chaque traitement, il faudra chercher le meilleur algorithme, peut-être regrouper certaines actions, identifier les endroits où il sera primordial d'optimiser la vitesse de traitement, etc.

D'accord, toutes ces considérations vous concerneront beaucoup plus tard, mais il ne sera pas inutile de les garder dans un coin de votre esprit durant la réalisation des petits exercices de cet ouvrage. Faites-moi plaisir et efforcez-vous de suivre ce conseil :

Avant d'écrire du Pascal :

1. formuler le problème en français ;

2. le traduire en « pseudo-code(6) » et le coucher sur papier.

Le passage au Pascal ne sera plus qu'une formalité.

III - Installation d'un environnement de développement

III-A - Sur tablette ou smartphone Android

Allez, lançons-nous dans l'inconnu (« Enfin ! » vous dites-vous sûrement) et installons sur notre mobile un environnement de développement Pascal. Lancez Google Play et tapez « pascal » dans le champ de recherche :

Immédiatement, un environnement s'offre à l'installation, mais ne cédez pas au chant de la première sirène venue. Faites défiler la liste des apps jusqu'à voir apparaître le « Pascal Compiler – Mobile IDE » :

« IDE » est l'acronyme de « Integrated Development Environment ». On rencontre également la version française « EDI », pour « Environnement de Développement Intégré ».

Cet environnement de développement s'installe avec le compilateur Free Pascal(7), donc il nous permettra de parcourir toutes les fonctionnalités du langage.

Sélectionnez-le et touchez le bouton « Installer » :

Le logo de notre environnement de développement vient se ranger sagement dans nos applications :

Lors du premier lancement de l'application, le système vous demande les autorisations d'usage, que vous acceptez bien évidemment :

Voici l'écran d'accueil :

Avec la première faute d'orthographe : « codding » au lieu de « coding ». La première d'une longue liste, hélas, puisque l'interface a été traduite dans un anglais assez approximatif, et la traduction en français est inachevée. Votre serviteur s'est fendu d'une traduction complète en français, mais sa mise en production devra peut-être attendre la prochaine version.

Mais qu'importe, puisqu'il ne s'agit que d'un outil de travail, et que nous allons faire du Pascal, dont la syntaxe est en anglais.

Touchez donc le bouton mal orthographié et découvrez pour la toute première fois l'interface de l'application :

Vous le voyez tout de suite, l'éditeur essaie de vous aider. Ici, par exemple, il propose une série de mots-clés, mais au cours de la frappe, il vous fera régulièrement des propositions afin de compléter les mots que vous commencez à taper. Avouez que c'est sympathique de sa part !

III-B - Sur PC

Si vous souhaitez suivre ce cours sur un bon vieux PC, il vous faudra installer un environnement de développement complet, ou bien un bon éditeur et le compilateur Free Pascal.

Vous pouvez suivre les conseils de ce petit tutoriel destiné aux débutants : y sont présentés Lazarus et Dev-Pascal, et vous pouvez même y ajouter Geany :

- Lazarus est fourni avec le compilateur ;

- Dev-Pascal est fourni avec une vieille version de Free Pascal, et le tutoriel vous explique comment installer une version à jour du compilateur ;

- Geany nécessite d'installer Free Pascal, et vous pouvez utiliser pour cela la méthode détaillée pour Dev-Pascal.

IV - Premier atelier : les systèmes de numération

De loin en loin dans cet ouvrage, vous trouverez de petits ateliers au sein desquels nous allons travailler sur certaines notions. Rassurez-vous, vous n'allez pas devoir engloutir une théorie indigeste : le but d'un atelier est la mise en pratique de ces notions.

Les ateliers sont facultatifs : vous pouvez décider de les passer, définitivement ou pour y revenir plus tard.

Bienvenue dans le premier atelier ! Il est consacré aux systèmes de numération.

Laissons la théorie des systèmes de numération dans les classes et les amphithéâtres, penchons-nous sur les systèmes utilisés en informatique : les systèmes numériques de bases 2, 8, 10 et 16.

La base d'un système numérique est le nombre de signes (généralement des chiffres) qui le composent.

- base 2, deux chiffres : 0 et 1 ;

- base 8, huit chiffres : 0 à 7 ;

- base 10, dix chiffres : 0 à 9 ;

- base 16, seize chiffres… Comment cela seize chiffres ? Ah ah, vous allez voir.

IV-A - Représentation des nombres dans les bases 10 et 2 (et un peu en base 8)

Le système en base 10 vous le connaissez bien : c'est notre système décimal. Il est très pratique dans notre vie de tous les jours, mais vous allez voir qu'il est très peu adapté à l'informatique.

Comptons : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Avec un seul signe, nous pouvons écrire dix nombres. Au-delà, nous devons écrire des nombres à deux chiffres : 10, 11, 12… jusque 19, puis 20, 21, 22… 29, puis 30, 31… jusqu'à 98, 99. Au-delà, nous devons passer à trois signes : 100, 101, 102, etc. Vous comprenez bien sûr le principe !

Faisons la même chose en binaire, c'est-à-dire en base 2 : 0, 1… c'est déjà terminé, avec un seul signe on ne peut écrire que deux nombres. Passons à deux signes : 10, 11. À trois signes : 100, 101, 110, 111. Quatre signes : 1000, 1001, 1010, 1011, 1100, 1101, 1110 et 1111. Et ainsi de suite.

Petit exercice : à votre tour, faites le comptage en octal, c'est-à-dire en base 8. Rappelez-vous que les signes utilisables vont de 0 à 7.(8)

Établissons un tableau comparatif avec la représentation des nombres entiers dans les systèmes en bases 10 et 2 :

Base 10

Base 2

0

0

1

1

2

10

3

11

4

100

5

101

6

110

7

111

8

1000

9

1001

10

1010

11

1011

12

1100

13

1101

14

1110

15

1111

16

1 0000

17

1 0001

Continuons avec des valeurs entières « remarquables » en informatique :

Base 10

Base 2

126

111 1110

127

111 1111

128

1000 0000

…

…

254

1111 1110

255

1111 1111

256

1 0000 0000

…

…

32 766

111 1111 1111 1110

32 767

111 1111 1111 1111

32 768

1000 0000 0000 0000

…

…

65 534

1111 1111 1111 1110

65 535

1111 1111 1111 1111

65 536

1 0000 0000 0000 0000

Vous voyez ce que ces valeurs ont de remarquable ? En binaire, elles ne sont constituées que de 1. Ce sont en quelque sorte des « valeurs-charnières », puisque l'entier immédiatement supérieur nécessite un signe binaire de plus.

Voyons cela depuis un autre angle : inventorions toutes les puissances de 2.

Puissance de 2

Décimal

Binaire

2^0

1

1

2^1

2

10

2^2

4

100

2^3

8

1000

2^4

16

1 0000

2^5

32

10 0000

2^6

64

100 0000

2^7

128

1000 0000

2^8

256

1 0000 0000

2^9

512

10 0000 0000

2^10

1 024

100 0000 0000

Continuons avec des puissances de 2 « remarquables » en informatique :

Puissance de 2

Décimal

Binaire

2^15

32 768

1000 0000 0000 0000

2^16

65 536

1 0000 0000 0000 0000

2^32

4 294 967 296

Trop de chiffres !

Vous comprendrez pourquoi ces puissances de 2 sont remarquables dans le prochain atelier.

Petit exercice : représentez en binaire les puissances de 2 suivantes :

- 2^20 ;

- 2^24 ;

- 2^25.

Facile !(9)

IV-B - Conversions entre bases 10 et 2

Nous allons voir comment passer facilement du binaire au décimal et vice-versa.

Pour convertir un nombre décimal en nombre binaire, il faut le diviser successivement par 2 ; les restes successifs constituent les chiffres binaires (de la droite vers la gauche).

Vite, un exemple va clarifier les choses : convertissons le nombre décimal 12 en binaire. La méthode est de « diviser successivement le nombre par 2 », allons-y (sur une feuille de papier pour vous) :

- 12 divisé par 2 = 6, reste 0 ;

- 6 divisé par 2 = 3, reste 0 ;

- 3 divisé par 2 = 1, reste 1 ;

- 1 divisé par 2 = 0, reste 1 ;

- c'est terminé, nous sommes à 0.

Ensuite, on récolte les restes successifs et on les accumule de droite à gauche : 1100. C'est facile, non ? À votre tour.

Petit exercice : convertissez en binaire, avec cette méthode, les nombres décimaux suivants :

- 15 ;

- 32 ;

- 16 331 ;

- 1 ;

- 2.(10)

Passons à la conversion inverse : du binaire vers le décimal.

Pour convertir un nombre binaire en nombre décimal, il faut additionner les puissances de 2 correspondant au rang de chaque chiffre (de droite à gauche, 0 étant la puissance de 2 du chiffre le plus à droite).

Un exemple est nécessaire pour comprendre : soit à convertir le nombre binaire 1 0110. Comme écrit ci-dessus, nous travaillons de droite à gauche, et le chiffre le plus à droite correspond à la zéroième puissance de 2 :

- 0 fois 2^0 + 1 fois 2^1 + 1 fois 2^2 + 0 fois 2^3 + 1 fois 2^4, soit

- 0 + 2 + 4 + 0 + 16 = 22.

Je suis sûr que vous vous y attendiez : c'est votre tour !

Petit exercice : convertissez en décimal les nombres binaires suivants :

- 101 1100 ;

- 1 1111 ;

- 1101 0001 1011.(11)

IV-C - Addition et soustraction en bases 10 et 2

Je ne vais pas vous faire l'affront de vous faire faire des opérations sur les nombres décimaux. Simplement, rappelez-vous comment cela se passe sur papier :

Pour additionner deux nombres entiers, on additionne les chiffres de même puissance et, si le total atteint ou dépasse la base du système numérique, on reporte une unité à la puissance supérieure.

Dans la pratique, en décimal, on aligne donc les deux nombres à droite et on additionne les chiffres correspondants de la droite vers la gauche ; si le total atteint ou dépasse 10, on ajoute 1 à la colonne juste à gauche.

Exemple : additionnons 177 et 43. Commençons par les aligner :

Et c'est parti, de droite à gauche :

- 7 + 3 = 10, on note 0 et on reporte 1 ;

- 1 (reporté) + 7 + 4 = 12, on note 2 et on reporte 1 ;

- 1 (reporté) + 1 = 2, on note 2 et c'est terminé.

Voilà donc notre calcul manuel :

Appliquons la même technique à des nombres binaires : additionnons 101 et 1100. Première étape, les aligner :

De droite à gauche :

- 1 + 0 = 1, que l'on note ;

- 0 + 0 = 0, que l'on note ;

- 1 + 1 = 10 (c'est du binaire !), on note 0 et on reporte 1 ;

- 1 (reporté) + 1 = 10, on note 0 et on reporte 1 ;

- 1 (reporté) = 1, que l'on note et c'est terminé.

Le calcul :

Voyons si vous avez compris, prenez un quart de feuille.

Petit exercice : exécutez manuellement les additions binaires suivantes :

- 1 1011 + 10 1011 ;

- 1 + 1111 1111.

Appliquez la technique à l'octal (ah ah, je vous ai eu(e) par surprise, je n'avais pas cité la base 8 dans le titre !) :

- 63 + 5 ;

- 5440 + 57.(12)

Vous tenez le coup ? Après les plus, les moins.

Pour soustraire un nombre entier d'un autre, on effectue la soustraction des chiffres de la même puissance, de droite à gauche. Si le chiffre soustrait est plus grand, on ajoute la base au chiffre de départ, et on compense en ajoutant une unité au nombre soustrait de la colonne de gauche.

C'est du moins le principe de la soustraction sur papier. Illustration en décimal : 124 – 72. On aligne les nombres :

Allons-y :

- 4 – 2 = 2, que l'on note ;

- 2 – 7 : impossible alors on ajoute 10 ; 12 – 7 = 5, que l'on note. On reporte -1 à la colonne de gauche ;

- 1 – 1 (reporté) = 0.

Voici le calcul :

Tout cela est élémentaire ! Mais saurez-vous l'appliquer à la soustraction binaire ? Je vais faire un exemple avec vous : 101 1100 – 11 0110. De droite à gauche, comme toujours :

- 0 – 0 = 0, que l'on note ;

- 0 – 1 impossible, on ajoute 2 à la colonne et on reporte -1 à celle de gauche ; 2 – 1 = 1 ;

- 1 – 2 (1 + 1 reporté) impossible, ajout de 2 et report de -1 ; 3 – 2 = 1 ;

- 1 – 1 (reporté) = 0 ;

- 1 – 1 = 0 ;

- 0 – 1 impossible, ajout de 2 et report de -1 ; 2 – 1 = 1 ;

- 1 – 1 (reporté) = 0.

Et voilà :

Petit exercice : allez, vous êtes presque au bout ! Effectuez la soustraction binaire suivante à la main :

- 1101 0111 0000 1010 – 1101 0110 1111 1101.(13)

IV-D - Le système de base 16

Le système de base 16, appelé hexadécimal, est une manière très commode de représenter les nombres binaires :

Un chiffre hexadécimal représente quatre chiffres binaires.

Les seize signes du système hexadécimal sont, dans l'ordre :

- les chiffres de 0 à 9 ;

- les lettres de A à F.

Ah voilà comment on arrive à totaliser seize « chiffres » hexadécimaux : on utilise les lettres de A à F !. Ajoutons une colonne à notre tableau de correspondance entre les systèmes :

Base 10

Base 2

Base 16

0

0

0

1

1

1

2

10

2

3

11

3

4

100

4

5

101

5

6

110

6

7

111

7

8

1000

8

9

1001

9

10

1010

A

11

1011

B

12

1100

C

13

1101

D

14

1110

E

15

1111

F

16

1 0000

10

17

1 0001

11

Puis celui des valeurs entières « remarquables » :

Base 10

Base 2

Base 16

126

111 1110

7E

127

111 1111

7F

128

1000 0000

80

…

…

…

254

1111 1110

FE

255

1111 1111

FF

256

1 0000 0000

100

…

…

…

32 766

111 1111 1111 1110

7FFE

32 767

111 1111 1111 1111

7FFF

32 768

1000 0000 0000 0000

8000

…

…

…

65 534

1111 1111 1111 1110

FFFE

65 535

1111 1111 1111 1111

FFFF

65 536

1 0000 0000 0000 0000

10000

Vous voyez comme la représentation des nombres est plus compacte et plus lisible qu'en binaire ? Retenir par cœur la représentation binaire des signes de 0 à F peut faciliter la vie d'un informaticien.

Vous constatez également que le système décimal est peu adapté à une machine fondée sur le système binaire. Tous les traitements s'effectuent en binaire, sur des données de tailles multiples de 8 (vous verrez cela dans l'atelier n° 2), donc la base 10 n'est là que pour les humains.

IV-E - Et la base 8 alors ?

L'octal n'a été cité dans cet atelier que pour vous permettre d'appliquer à un autre système de numération les différentes explications.

Le système octal n'est plus guère utilisé de nos jours. Il a quand même l'avantage, à l'instar de l'hexadécimal, d'être une représentation simple du binaire, puisqu'un chiffre octal représente trois chiffres binaires – sans nécessiter l'ajout de signes supplémentaires comme les lettres de A à F.

Voilà, vous n'entendrez plus parler de l'octal jusqu'à la fin de cet ouvrage. Au moins vous saurez ce que c'est !

V - Premier programme : affichage à l'écran

Désolé pour les aficionados du PC, les copies d'écran et les manipulations qui suivent seront toutes réalisées sur tablette ou smartphone Android.

Mais normalement, vous devriez pouvoir trouver sans trop de difficultés les menus correspondants dans l'environnement de développement que vous aurez installé.

Depuis les débuts de la programmation, une tradition s'est installée : le tout premier programme que l'on conçoit, lorsque l'on découvre un nouveau langage ou un nouveau compilateur, salue le monde entier avec un joyeux « Hello World! ».

Il faut bien avouer qu'avec nos outils actuels, l'affichage de ce petit message ne requiert pas plus de trente secondes ; mais pensez qu'à l'aube de l'informatique, quand les langages de haut niveau n'existaient pas encore, la réalisation d'un tel programme était beaucoup moins évidente – et la satisfaction d'y parvenir en était d'autant plus grande !

Nous allons sacrifier à la tradition et créer un premier petit programme qui va saluer le monde.

Touchez les trois barres horizontales en haut et à gauche :

Il s'agit de l'explorateur de fichiers. Pressez le bouton « + » pour afficher le menu de création :

Nous allons commencer par créer un nouveau dossier, dans lequel iront se loger les fichiers sources que nous créerons tout au long du tutoriel. Touchez donc le bouton « Créer un nouveau dossier » :

Nommez-le comme bon vous semble ; je l'ai appelé « Tutoriel ».

Le dossier vient s'insérer dans l'explorateur de fichiers :

Touchez-le, puis pressez à nouveau le bouton « + » :

Cette fois, créez un nouveau fichier source, le premier d'une longue série, et nommez-le « Hello » :

Le squelette d'un programme est automatiquement créé par l'éditeur :

La signification de ce squelette de programme va venir juste après. Le curseur (la barre verticale clignotante) est automatiquement mis au bon endroit pour que vous tapiez l'instruction suivante :

1. WriteLn('Hello World!');

Vous voyez que l'éditeur essaie tout de suite de vous aider, lorsque vous tapez le début du premier mot :

Sachez pour l'instant que les majuscules et minuscules n'ont guère d'importance mais que, par contre, la ponctuation est primordiale : mettez bien le point-virgule à la fin de la ligne et ne remplacez surtout pas les apostrophes par des guillemets. Vous voyez que les parenthèses sont entourées automatiquement d'un rectangle coloré, c'est encore une aide de l'éditeur (car il peut y avoir plusieurs paires de parenthèses imbriquées) :

Il s'agit maintenant de sauvegarder votre fichier source. Car si vous fermez l'application, il ne sera pas sauvegardé automatiquement. Cela se fait en touchant l'icône « Fichier », à droite sur le bandeau de menu :

Dans le menu déroulant, choisissez « Sauvegarder ».

À présent, voyons si vous avez bien recopié le code sans erreur. Nous allons demander à Free Pascal de compiler le source, en effleurant le bouton rond du bandeau :

Le message « Compilez avec succès » (jolie faute d'orthographe encore) apparaît fugacement – si fugacement même que je ne suis pas arrivé à le saisir sur une copie d'écran.

Par contre, si vous avez fait une erreur, Free Pascal vous l'indiquera. J'ai fait exprès d'effacer le point-virgule à la fin de la ligne, et voici le message du compilateur :

C'est bien un point-virgule qui était attendu.

Il est temps de saluer le monde. Exécutez le programme, à l'aide du bouton en forme de triangle :

Bardaf ! Que se passe-t-il ? Un message inquiétant apparaît :

Vous savez quoi ? C'est de la pub ! Le système reporte soi-disant un problème de clavier, et vous recommande d'installer une application. Touchez « OK » et, enfin, voilà votre premier programme Pascal qui affiche son message :

Pressez la touche « Entrée » du clavier (le rond vert) : l'exécution est terminée. Dans le dialogue qui apparaît, choisissez « Quitter » :

Et vous retournez au code source.

Il est important de savoir que des erreurs peuvent aussi se produire à l'exécution d'un programme, même si le compilateur n'en a détecté aucune. Rassurez-vous, nous apprendrons à les éviter.

Voyons en détail le code source de ce petit programme :

program Hello;
uses crt;
begin
WriteLn('Hello World!');
readln;
end.

V-A - Mots réservés et symboles

Tout d'abord, le Pascal (comme tous les autres langages) possède une liste de mots réservés, qui sont les « mots-clés » qui forment l'ossature du langage. Nous en rencontrons déjà plusieurs : program, uses, begin et end.

Un mot réservé est un mot qui a une signification précise en langage Pascal. Il est dit « réservé » parce qu'il ne peut être utilisé à autre chose dans un code source (par exemple, on ne peut appeler une variable « begin »).

Une liste des mots réservés du Pascal est disponible à la fin de cet ouvrage.

Ceux que nous venons de rencontrer sont intuitifs, si on les traduit en français : program signifie tout simplement « programme », begin et end signifient « début » et « fin », et uses se traduit par « utilise ».

Comme tout langage, le Pascal possède une grammaire. Outre des mots réservés, le Pascal a des signes de ponctuation, les symboles. Sont présents dans notre petit code source : « ; », « ( », « ) », « ' » et « . ».

Un symbole est un caractère (ou une paire de caractères) permettant de délimiter des éléments du langage : par exemple, délimiter une chaîne de caractères, terminer une instruction, encadrer un bloc d'instructions, délimiter un commentaire, etc.

Une liste des symboles du Pascal se trouve également à la fin de cet ouvrage.

V-B - Caractères autorisés dans la syntaxe du Pascal

La syntaxe du Pascal étant en langue anglaise, les caractères accentués ne sont pas les bienvenus.

Seuls les caractères suivants sont autorisés dans les éléments du langage :

- les lettres de « A » à « Z » et de « a » à « z » ;

- les chiffres de 0 à 9 ;

- les symboles dont vous trouvez la liste à la fin du cours.

Pourquoi ai-je précisé « dans les éléments du langage » ? Parce que vous pouvez inclure n'importe quel caractère dans une chaîne de caractères ou dans un commentaire (vous allez très bientôt voir ce que c'est).

V-B-1 - Le rôle essentiel du point-virgule

En Pascal, comme dans beaucoup d'autres langages d'ailleurs, le point-virgule est un symbole extrêmement important.

En Pascal, le point-virgule sépare deux instructions.

Vous allez en voir partout et je peux déjà vous dire qu'à vos débuts, l'absence de point-virgule sera une erreur très courante.

V-C - Structure d'un fichier source principal

Le code source d'un programme Pascal peut être constitué de plusieurs fichiers sources. L'un d'entre eux est le fichier source principal. Notre mini-programme ne possède qu'un seul fichier source, qui est forcément le principal.

Un fichier source principal doit avoir les caractéristiques suivantes :

- il doit commencer par le mot réservé program, suivi du nom du programme, et terminé par un point-virgule ;

- viennent ensuite une série de déclarations. Nous allons voir ce que c'est un peu plus tard – pour l'instant, nous ne nous occupons pas de la ligne uses crt; ;

- le bloc d'instructions principal, appelé programme principal (« main » dans plusieurs langages), commence par begin et finit par end ;

- il se termine par un point.

Donc à la suite du mot réservé program se trouve le nom du programme : « Hello ». C'est vous qui avez donné ce nom au programme, vous avez (sans le savoir) créé votre premier identificateur.

Retenez ce mot pour la suite.

V-D - Affichage à l'écran : Write et WriteLn

Continuons l'étude de notre premier programme, et voyons cette ligne :

WriteLn('Hello World!');

Vous savez plus que probablement(14) que le verbe « to write » se traduit en français par « écrire ». L'instruction ci-dessus signifie intuitivement « écrire Hello World! ». Oui mais le « Ln » à la fin de « Write » alors ? Il signifie qu'il faut passer à la ligne après avoir écrit le texte.

Donc si vous aviez écrit :

Write('Hello World!');

Le curseur ne serait pas passé à la ligne. Faites l'essai : remplacez WriteLn par Write dans le code source, réexécutez le programme et voyez la différence à l'affichage :

Le curseur reste sur la même ligne que le « Hello World! ».

Write écrit une chaîne de caractères sur le périphérique de sortie par défaut.

WriteLn également, plus un retour à la ligne.

Vous avez remarqué ? J'ai indiqué « sur le périphérique de sortie par défaut ». Ce n'est pas toujours l'écran qui est le périphérique de sortie du programme, même si c'est la plupart du temps le cas : ce pourrait être un fichier, une imprimante, etc. De même, le clavier virtuel de l'écran tactile n'est pas non plus obligatoirement le périphérique d'entrée par défaut.

V-E - Lecture au clavier : Read et ReadLn

Je suis sûr que vous savez déjà ce que je vais vous raconter dans ce paragraphe : Read et ReadLn sont en quelque sorte les pendants de Write et WriteLn, mais pour l'entrée de caractères. Gagné !

Read lit une chaîne de caractères sur le périphérique d'entrée par défaut.

ReadLn le fait aussi, et la lecture s'achève par un caractère « Entrée ».

En réalité, vous ne verrez pas beaucoup Read sans le « Ln », car il peut poser des problèmes lors de la lecture au clavier de chaînes de caractères dans un programme, étant donné qu'il n'interprète pas le caractère « Entrée ».

Sachez que l'utilisation de ReadLn qui est faite dans notre petit programme est un cas particulier : tel quel, il n'attend que le caractère « Entrée », et se borne à afficher tous les autres caractères que vous pouvez entrer sans les traiter. Nous verrons très bientôt une utilisation plus standard de ReadLn.

V-F - Les chaînes de caractères

J'ai cité plusieurs fois les chaînes de caractères dans ce qui précède, il est temps de voir ce que c'est.

Une chaîne de caractères est une suite de caractères entourée d'apostrophes :
'Je suis une chaîne de caractères'.

Une chaîne avec zéro caractère ('') est une chaîne vide.

Dans un code source, une chaîne ne peut faire plus d'une ligne.

Je vous l'ai dit précédemment : une chaîne de caractères peut contenir des caractères accentués et des symboles autres que ceux réservés aux éléments du langage.

Je vous pose une colle : comment fait-on pour qu'une chaîne contienne une apostrophe, étant donné que l'apostrophe est justement le symbole qui encadre une chaîne de caractères ?

Faisons l'expérience : dans le code source, remplacez le « Hello World! » par « Bonjour, je m'appelle Pascal ! ». Déjà, mauvais signe, la phrase reste en rouge dans l'éditeur, et le texte qui suit l'apostrophe s'affiche dans une autre couleur :

Mais demandons quand même au compilateur ce qu'il en pense, en pressant comme tout à l'heure le bouton rond en haut à droite :

Il dit que nous avons oublié de fermer la parenthèse. Pourquoi ? Parce que pour lui, l'apostrophe dans « m'appelle » termine la chaîne, et il n'attend rien d'autre ensuite que la parenthèse fermante.

Allez, je vous donne la solution :

Pour inclure une apostrophe dans une chaîne de caractères, il faut la doubler.

VI - Atelier 2 : taille des données

Dans ce second atelier, nous allons parler de bits, d'octets, de mots et autres, autant de termes dont il est important de connaître la signification en informatique.

VI-A - Le bit

Prononcez le « t », comme dans le mot « bitte » (d'amarrage!).

Nous avons abondamment parlé de bits dans le premier atelier, lorsque nous avons vu le système binaire. Le mot « bit » est en réalité la contraction de deux mots anglais : « binary digit », qui signifie « chiffre binaire ».

Pourquoi le système binaire a-t-il un rôle si prépondérant en informatique ? Tout simplement parce que tout est basé sur des composants électroniques pouvant être dans deux états : ouvert ou fermé (comme un interrupteur). Fermé, le courant passe : valeur 1 ; ouvert, le courant ne passe pas : valeur 0.

Attention, on parle ici d'informatique classique, qui est globalement restée dans la lignée des toutes premières machines de l'après-guerre. Dans les laboratoires des grands constructeurs et des universités, de nombreuses recherches mettent au point des systèmes à plus de deux états possibles, voire quantiques (à plusieurs états superposés).

Dans l'unité arithmétique et logique d'un processeur, les instructions agissent sur les données au niveau du bit. Dans le premier atelier, vous avez additionné et soustrait des nombres en binaire mais en fait, au niveau le plus bas du fonctionnement du processeur, ces opérations reposent sur des opérations plus basiques encore :

- des opérations logiques « non », « et », « ou », « ou exclusif » ;

- des décalages de bits.

VI-A-1 - Opérations logiques

L'opération not agit sur un seul bit, tandis que les trois autres donnent un résultat en fonction de la valeur de deux bits :

- not (« non ») inverse un bit ;

- and (« et ») renvoie 1 si les deux bits sont à 1 ;

- or (« ou ») renvoie 1 si au moins un des deux bits vaut 1 ;

- xor (« ou exclusif ») renvoie 1 si un seul des deux bits vaut 1.

C'est plus simple en image :

Petit exercice : complétez les trois tables de vérité suivantes :(15)

VI-A-2 - Décalages de bits

Les opérations de décalage de bits permettent notamment d'effectuer très simplement des multiplications et des divisions par 2. Il existe deux sortes de décalages :

- les décalages logiques ;

- les décalages algébriques.

Pour un décalage logique vers la droite, on injecte un 0.

Pour un décalage algébrique vers la droite, on injecte une copie du bit le plus à gauche.

Les décalages logique et algébrique vers la gauche sont identiques : on injecte un 0.

Prenons un exemple : le nombre binaire 1011 0111 :

- décalage logique vers la droite : 1011 0111 donne 0101 1011 (le 1 de droite est expulsé) ;

- décalage algébrique vers la droite : 1011 0111 donne 1101 1011 (le 1 de droite est expulsé) ;

- décalage logique vers la gauche : 1011 0111 donne 0110 1110 (le 1 de gauche est expulsé) ;

- décalage algébrique vers la gauche : c'est strictement la même chose.

Pourquoi deux sortes de décalages ? Parce que, nous le verrons plus loin, le bit le plus à gauche peut représenter le signe d'un nombre : 0 signifie que le nombre est positif, 1 qu'il est négatif. Le décalage (à droite) algébrique réinjecte le bit de signe, et donc un nombre positif reste positif et un nombre négatif reste négatif.

Mais n'allons pas trop vite, et arrêtons-nous sur la plus grande utilité des décalages : la multiplication (et la division) par 2. Et oublions pour l'instant les nombres négatifs.

Appliquons plusieurs décalages vers la gauche au nombre binaire 11 (3 en décimal, si vous vous rappelez du premier atelier) :

Nombre de décalages

Binaire

Décimal

0 (le nombre de départ)

11

3

1

110

6

2

1100

12

3

1 1000

24

Et ainsi de suite.

Un décalage d'un bit vers la gauche multiplie un nombre par 2.

Appliquons plusieurs décalages logiques vers la droite au nombre binaire 10 1000 (40 en décimal) :

Nombre de décalages

Binaire

Décimal

0 (le nombre de départ)

10 1000

40

1

01 0100

20

2

00 1010

10

3

00 0101

5

4

00 0010

2(16)

5

00 0001

1

Un décalage d'un bit vers la droite divise un nombre par 2.

VI-B - L'octet ou byte

Nous avons établi que les opérations réalisées par le processeur s'effectuaient au niveau des bits. Mais il est important de savoir que les bits des données ne sont pas accessibles directement : ils sont toujours traités par groupes dont le nombre est une puissance de 8 (8, 16, 32, 64…).

Un octet est une unité de mesure en informatique équivalant à huit bits.

En effet, depuis que les processeurs possèdent une unité arithmétique et logique d'une largeur de 8 bits (vers la fin des années 1970), la plus petite unité de taille d'une donnée est l'octet.

Le terme byte désigne, depuis l'aube de l'informatique, « la plus petite unité logiquement adressable par un programme ». Depuis la fin des années 1970, le byte de 8 bits est devenu un standard, au point qu'on le considère aujourd'hui comme un synonyme du terme octet.

Un octet étant composé de huit bits, il peut contenir 256 valeurs allant de 0000 0000 à 1111 1111 (représentation binaire).

Cependant, il y a deux manières d'interpréter la valeur d'un octet, selon qu'on considère qu'il contient un nombre strictement positif (entier non signé) ou bien un nombre pouvant être négatif (entier signé). Et cela change tout !

Si un octet contient un nombre entier signé, le bit le plus à gauche est celui du signe :

- 0 pour un nombre positif ;

- 1 pour un nombre négatif.

Cela signifie que le nombre signé « perd » un bit, celui de gauche, puisque celui-ci est utilisé pour renseigner le signe.

À partir de maintenant, je vais utiliser un suffixe pour indiquer le système dans lequel un nombre est représenté :

- « b » pour le binaire (exemple : 1001b) ;

- « h » pour l'hexadécimal (exemples : 1405h, F14Ah(17)) ;

- Pas de suffixe pour le décimal.

Comparons l'interprétation du nombre contenu dans un octet, selon qu'il est signé ou non signé :

Nombre

Entier non signé

Entier signé

0000 0000b / 00h

0

0

0000 0001b / 01h

1

1

…

…

…

0111 1110b / 7Eh

126

126

0111 1111b / 7Fh

127

127

1000 0000b / 80h

128

-128

1000 0001b / 81h

129

-127

…

…

…

1111 1110b / FEh

254

-2

1111 1111b / FFh

255

-1

Vous remarquez tout de suite que la représentation des nombres négatifs ne consiste pas seulement à mettre le bit de gauche à 1 et à utiliser les sept autres bits pour mettre la valeur positive :

Un nombre négatif est obtenu par le complément à 2 du nombre positif.

Calculer le complément à 2 d'un nombre consiste à soustraire celui-ci du nombre 0.

Prenons un exemple : le nombre 14 est représenté en binaire par 0000 1110b. Pour représenter -14 en binaire, il faut calculer le complément à 2, c'est-à-dire effectuer la soustraction : 0000 0000b – 0000 1110b. Vous savez très bien faire cela depuis le premier atelier :

Résultat : 1111 0010b.

Petit exercice : calculez par complément à 2 la représentation binaire des nombres suivants :

- -3 ;

- -72.(18)

VI-C - Le mot ou word, le double mot ou dword, le quadruple mot ou qword

L'essentiel de ce qu'il faut savoir sur le mot, le double et le quadruple mot vient d'être dit pour l'octet, nous allons donc aller beaucoup plus vite.

Un mot est une unité de mesure en informatique correspondant à seize bits ;

Le double mot correspond à 32 bits ;

Le quadruple mot correspond à 64 bits.

Les premiers processeurs 32 bits pour PC datent de la fin des années 1980 et ceux pour mobiles du milieu des années 1990 ; ils ont régné jusqu'au début des années 2010, définitivement supplantés à présent par les processeurs 64 bits.

L'appellation « processeurs 32 ou 64 bits » signifie que leurs composants internes sont construits et optimisés pour travailler sur des données respectivement de 32 ou 64 bits. Ils peuvent bien entendu également traiter des données de 8 ou 16 bits.

Faisons un inventaire des valeurs possibles de ces tailles de données :

Taille

Entier non signé

Entier signé

16 bits

0 à 65 535
(2^16 - 1)

-32 768 (-2^15)
à 32 767 (2^15 - 1)

32 bits

0 à 4 294 967 295
(2^32 - 1)

-2 147 486 648 (-2^31)
à 2 147 486 647 (2^31 - 1)

64 bits

0 à (2^64 – 1) soit plus de 18 milliards de milliards !

-9 milliards de milliards (-2^63)
à 9 milliards de milliards (2^63 - 1)

Saurez-vous appliquer à des nombres de 16, 32 et 64 bits ce que nous avons vu pour les nombres de 8 bits ?

Exercices :

1. Représentez en binaire sur 8, 16 et 32 bits le nombre -23. Que remarquez-vous ?

2. Quelle taille de donnée minimale (octet, mot, double mot ou quadruple mot) est nécessaire pour représenter les nombres non signés suivants : 256, 38 133, 5 000 0000, et le nombre signé suivant : 38 133 ?(19)

VII - Programme 2 : déclaration d'une variable

Nous allons réaliser un second programme, où il s'agira de demander son nom à l'utilisateur, et ensuite de le saluer nommément :

« Comment t'appelles-tu ? »

- Pascal.

- Bonjour Pascal !

Nous allons pouvoir utiliser ce que nous venons de voir : Write et WriteLn pour l'affichage à l'écran, et ReadLn pour la lecture au clavier. Le souci va être que le WriteLn connaisse le nom qu'aura lu le ReadLn. Comment faire ?

Nous n'avons pas le choix : le nom, il va falloir le mémoriser quelque part. Nous allons donc réserver un emplacement dans la mémoire de la machine, nous allons créer une variable.

Une variable est un emplacement de stockage en mémoire, désigné par un identificateur, et qui possède un type particulier.

Le mot réservé var annonce la déclaration d'une variable (ou de plusieurs variables).

Syntaxe : var identificateur : type;

Il est important de savoir que le système d'exploitation ne permet pas à un programme d'aller stocker des variables un peu partout : chaque programme se voit attribuer une zone mémoire déterminée, et toute tentative d'aller farfouiller ailleurs se soldera par un gros doigt du système et la mise à mort du programme fautif.

Avant de parler de l'identificateur de la variable, voyons un peu ce qu'est le « type » dont il est fait mention dans la définition.

VII-A - Type d'une variable

La notion de type est un pilier fondamental du langage Pascal ; on dit d'ailleurs que le Pascal est un langage fortement typé. Aucune variable ne peut être déclarée sans son type.

Un type définit la nature d'une variable, et détermine sa taille et l'intervalle de valeurs possibles qu'elle peut prendre(20).

Le Pascal possède des types prédéfinis, mais le programmeur peut aussi créer ses propres types.

Il existe plusieurs sortes de types, et nous aurons tout le temps de les rencontrer : des types « numériques », entiers ou réels, des types « littéraux », comme les chaînes de caractères (tiens donc, ça nous intéresse ça), des types « structurés », comme les tableaux, etc.

L'avantage d'un langage où les types sont obligatoires est que cela élimine en grande partie une source d'erreur : le programmeur est obligé de prendre en compte en permanence le type des données qu'il manipule, et le compilateur va détecter les mauvais choix de tailles de données – ce qui est nettement plus pratique que d'essayer de trouver la cause d'un problème quand le programme est en cours d'exécution(21).

Grâce aux bonnes habitudes prises en Pascal, vous pourrez aborder plus sereinement des langages plus permissifs (et donc plus dangereux).

Mais revenons à nos moutons, ou plutôt à nos chaînes de caractères.

VII-A-1 - Le type chaîne de caractères

N'allons pas trop dans le détail pour l'instant, car il en existe plusieurs sortes : contentons-nous des plus simples, les « chaînes courtes » ou short strings.

Une chaîne de caractères de type short string est constituée d'un octet contenant sa longueur, suivi du contenu de la chaîne (chaque caractère étant contenu dans un octet). La longueur maximale d'une chaîne est de 255 caractères(22).

En réalité, la déclaration d'une variable de type String peut avoir plusieurs significations pour le compilateur Free Pascal(23). Si on laisse inchangées les options par défaut (nous y toucherons beaucoup, beaucoup plus loin dans cet ouvrage), la variable sera bien une short string.

Lors de la déclaration d'une variable de type short string, il est possible de lui imposer une longueur maximale ; si on ne précise rien, la longueur par défaut est de 255 caractères.

Voici un exemple : deux chaînes de caractères, la première de longueur maximale 10 et la seconde de longueur maximale 255 (puisque rien n'est précisé).

var
Chaine1 : String[10];
Chaine2 : String;

Notez bien comment est notée la taille de la première chaîne : entre deux crochets.

Dans cet exemple, la variable appelée Chaine1 a une longueur maximale de 10 caractères. Imaginons qu'elle contienne le mot « Bonjour » ; voici comment cette variable est stockée dans la mémoire :

Le premier octet contient la longueur du mot « Bonjour », c'est-à-dire 7 (le nombre 7, pas le caractère « 7 »!). Ensuite vient le mot lui-même, chaque caractère occupant un octet. Et les trois derniers octets, que contiennent-ils ? N'importe quoi.

Essayez de deviner à quoi ressemblerait la variable chaine2 si elle contenait le mot « Bonjour » ? À la même chose, sauf qu'au lieu de trois ce seraient 248 octets qui contiendraient n'importe quoi.

VII-B - L'identificateur d'une variable

La notion d'identificateur s'applique à d'autres éléments que les variables. Je vous les cite mais nous les rencontrerons plus tard :

Un identificateur est un nom donné par le programmeur à un élément du langage : une variable, une constante, un type, une procédure, une fonction, une unité, un programme…

Un identificateur est composé des lettres non accentuées de « a » à « z » (minuscules et majuscules), des chiffres de 0 à 9 et du caractère souligné « _ » (en anglais « underscore »).

Sa taille est de maximum 127 caractères et il ne peut pas commencer par un chiffre.

Rappelons qu'un mot réservé ne peut être utilisé comme identificateur.(24)

Vous avez donc la possibilité de nommer vous-même les variables que vous utilisez. Cependant, un choix judicieux d'identificateur peut grandement aider à la compréhension d'un code ! Par exemple, si vous appelez « Moyenne » une variable dans laquelle est stockée la moyenne d'une série de valeurs, ce sera beaucoup plus parlant que si vous l'appelez « Tartempion », surtout si vous relisez votre code après six mois. De même, l'utilité des variables appelées « Dividende », « Diviseur », « Quotient » et « Reste » sera beaucoup plus évidente que « a », « b », « c » et « d ».

Petit exercice : les identificateurs suivants sont-ils corrects ?

1. a ;

2. A ;

3. a! ;

4. Début ;

5. debut ;

6. division_entiere ;

7. var ;

8. 12heures ;

9. _12heures ;

10. reste-division.(25)

VII-C - Code de l'exemple 2

Mettons en application toutes ces notions. Pressez les trois barres horizontales du menu, sélectionnez le dossier « Tutoriel », pressez le bouton rond vert « + » et choisissez de créer un nouveau fichier source : nommez-le « Salut ». Un squelette de programme est automatiquement créé :

Vous voyez en passant que l'identificateur du programme a automatiquement été complété avec le nom du fichier :

program Salut;

Il s'agit de créer une variable dans laquelle le nom tapé par l'utilisateur sera stocké.

Le terme exact est déclarer une variable.

L'endroit où déclarer la variable est avant le programme principal, donc juste au-dessus du mot réservé begin. Allez-y :

var
Nom : string[40];

Le mot réservé var permettant de déclarer plusieurs variables, prenez l'habitude d'aller à la ligne et de décaler les variables de quelques caractères vers la droite. Vous pouvez utiliser le bouton de tabulation qui est présent sur le bandeau du bas, et qui ressemble à ceci :

Le fait de décaler et d'aligner verticalement des éléments d'un code source s'appelle indenter le code. Vous devez absolument prendre cette habitude : cela améliore la lisibilité de votre code source, et cela peut grandement vous aider à le structurer.

Voici le code source complet du programme :

program Salut;
uses crt;
var
Nom : string[40];
begin
writeln('Comment t''appelles-tu ?');
readln(Nom);
writeln('Bonjour ', Nom);
readln;
end.

Étudions-le. Le premier writeln affiche la question – rappelez-vous qu'il faut doubler l'apostrophe pour afficher celle-ci.

Le premier readln reçoit l'identificateur de la variable entre parenthèses : il sait ainsi où stocker ce qui est tapé au clavier par l'utilisateur.

On dit que le readln reçoit un paramètre. Il peut d'ailleurs en recevoir plusieurs, séparés par des virgules.

Et tout de suite après, vous voyez que writeln reçoit deux paramètres séparés par une virgule :

- une chaîne de caractères à afficher, « Bonjour  » (terminée par une espace) ;

- l'identificateur de notre variable.

Vous pouvez passer d'autres paramètres au writeln, par exemple un point d'exclamation pour terminer la phrase :

writeln('Bonjour ', Nom, ' !');

Le dernier readln, auquel on ne passe aucun paramètre, se contente d'attendre la touche « Entrée ».

Vous venez de déclarer votre première variable et de la passer comme paramètre à readln et writeln. Voici ce que donne ce programme à l'exécution (à l'aide du bouton triangle) :

VIII - Programme 3 : if … then … else ou structure alternative

Niklaus Wirth, l'inventeur du Pascal, a été le principal chantre de la programmation structurée(26) ; il est donc logique que le Pascal soit un langage structuré.

Nos deux premiers programmes consistaient en une simple suite d'instructions. Parmi les types de structures de programmes, on parle de structure séquentielle. Dans ce chapitre, nous allons voir un autre type de structure : la structure alternative, à l'aide d'un exemple très simple : on demande à l'utilisateur s'il est un homme ; s'il répond oui alors on affiche « Bonjour Monsieur ! », sinon on affiche « Bonjour Madame ! ».

Voici donc la structure alternative : si (la condition est remplie) alors (faire quelque chose) sinon (faire autre chose).

En anglais, si … alors … sinon se dit if … then … else.

Créez un nouveau fichier source dans le dossier « Tutoriel » et appelez-le « MmeMr » :

Fort(e) de ce que vous avez appris dans les deux premiers programmes, vous pouvez tout de suite écrire l'instruction qui va poser la question à l'utilisateur :

program MmeMr;
uses crt;
begin
write('Etes-vous un homme ? [O/N] : ');
readln;
end.

Entre crochets, vous donnez à l'utilisateur une indication sur ce qu'il doit taper comme réponse : « O » pour oui ou « N » pour non. Comme un seul caractère suffit, au lieu se mémoriser la réponse de l'utilisateur dans une chaîne de caractères, nous allons le faire dans une variable de type… caractère :

var
Reponse : char;

En anglais, « caractère » se traduit par « character », raccourci en char.

Par défaut dans Free Pascal, le type char a une taille de un octet et il contient un caractère.

Il n'aurait pas été faux de déclarer une variable de type chaîne de caractères de taille 1 (string[1]), mais rappelez-vous que le type chaîne de caractères commence par un octet, qui en indique la longueur effective : par conséquent, une variable de ce type prendrait en mémoire deux octets, tandis que le type caractère n'occupe qu'un seul octet.

Complétons le programme avec la lecture de la réponse de l'utilisateur :

write('Etes-vous un homme ? [O/N] : ');
readln(Reponse);

Mettons en place la structure alternative autour de la réponse donnée par l'utilisateur :

Program MmeMr;
uses crt;
var
Reponse : char;
begin
write('Etes-vous un homme ? [O/N] : ');
readln(Reponse);
if Reponse = 'O' then
writeln('Bonjour Monsieur !')
else
writeln('Bonjour Madame !');
readln;
end.

Première exécution du programme et première surprise :

Vous voyez sur la copie d'écran ? Malgré la réponse « o », le programme déduit que l'utilisateur est une dame. Avez-vous deviné pourquoi ?

Dans le code source, la condition testée est if Reponse = 'O', avec un « O » majuscule. Ce n'est pas grave, me direz-vous, il suffit de remplacer « O » majuscule par « o » minuscule pour que ça fonctionne. Oui mais, vous répondré-je, et si l'utilisateur répond avec un « O » majuscule ? Pour nous mettre d'accord, la solution sera de tester les deux possibilités.

La condition testée dans l'instruction if peut être la combinaison logique de plusieurs conditions, avec les opérateurs logiques que nous avons déjà rencontrés dans l'atelier 2 : not (« non »), and (« et »), or (« ou ») et xor (« ou exclusif »).

Pour notre programme, la condition sera donc « si la réponse est 'O' ou 'o' alors … ». En Pascal, on écrira :

if (Reponse = 'O') or (Reponse = 'o') then

Si une condition est composée de plusieurs expressions(27), chacune d'entre elles doit être entourée de parenthèses.

S'il n'y a qu'une seule expression, les parenthèses peuvent être omises.

Modifiez le code source et ré-exécutez le programme :

C'est mieux à présent !

Étudions plus attentivement la structure alternative :

if (Reponse = 'O') or (Reponse = 'o') then
writeln('Bonjour Monsieur !')
else
writeln('Bonjour Madame !');

Le mot réservé then introduit l'instruction à exécuter si la condition testée est vraie, et le mot réservé else introduit l'instruction à exécuter si la condition est fausse. Notez qu'il n'y a qu'un seul point-virgule tout à la fin : le bloc if … then … else doit être considéré comme un tout.

Alors que le then est obligatoire, le else est facultatif.

Par exemple :

write('Voulez-vous quitter ? ');
readln(Reponse);
if (Reponse = 'O') or (Reponse = 'o') then
Halt(0);

Vous voyez que le point-virgule termine la structure sans qu'il y ait de bloc else.

VIII-A - Structures imbriquées

Montrons à présent que l'on peut imbriquer plusieurs structures alternatives. Si l'utilisateur répond qu'il est une femme, demandons-lui si elle est mariée : dans la négative, nous l'appellerons « Mademoiselle » au lieu de « Madame ». Cela se fera donc à la suite du else du programme que nous venons de faire.

S'il y a plus d'une instruction à exécuter après le then ou le else, il faut débuter le bloc d'instructions à exécuter par begin et le terminer par end.

Cet encadré est important, voyez comment les instructions à exécuter à la suite du else sont encadrées par begin et end :

Program MmeMr;
uses crt;
var
Reponse : char;
begin
write('Etes-vous un homme ? [O/N] : ');
readln(Reponse);
if (Reponse = 'O') or (Reponse = 'o') then
writeln('Bonjour Monsieur !')
else
begin
write('Etes-vous mariée ? [O/N] : ');
readln(Reponse);
if (Reponse = 'O') or (Reponse = 'o') then
writeln('Bonjour Madame !')
else
writeln('Bonjour Mademoiselle !');
end;
readln;
end.

Soit dit en passant, même si ce programme est minuscule, vous voyez l'importance de l'indentation du code ? Les deux structures if … then … else sont bien visibles, et le bloc encadré par begin et end est discernable au premier coup d’œil. Pour achever de vous convaincre, voici le même programme sans indentation :

Program MmeMr;
uses crt;
var
Reponse : char;
begin
write('Etes-vous un homme ? [O/N] : ');
readln(Reponse);
if (Reponse = 'O') or (Reponse = 'o') then
writeln('Bonjour Monsieur !')
else
begin
write('Etes-vous mariée ? [O/N] : ');
readln(Reponse);
if (Reponse = 'O') or (Reponse = 'o') then
writeln('Bonjour Madame !')
else
writeln('Bonjour Mademoiselle !');
end;
readln;
end.

Essayez à présent de mettre en pratique la structure if … then … else en réalisant l'exercice suivant.

Exercice : Réalisez le programme Couleur.pas, qui demande à l'utilisateur sa couleur préférée, en lui demandant de taper un caractère :

- '1' : sa couleur préférée est le noir ;

- '2' : c'est le blanc ;

- '3' : c'est le rouge ;

- '4' : le vert ;

- '5' : le bleu ;

- '6' : le jaune ;

- '0' : sa couleur préférée n'est pas dans la liste, demandez-la lui et stockez-la dans une variable de type chaîne de caractères ;

- 'X' (majuscule ou minuscule) : il n'a pas de préférence.

Vous allez devoir imbriquer plusieurs structures if … then … else, faites bien attention à l'indentation.

Ne regardez pas trop vite la solution ci-dessous !

program Couleur;
uses crt;
var
Reponse : char;
MaCouleur : string[25];
begin
writeln('Quelle est votre couleur préférée : ');
writeln('1 Noir');
writeln('2 Blanc');
writeln('3 Rouge');
writeln('4 Vert');
writeln('5 Bleu');
writeln('6 Jaune');
writeln('0 Une autre couleur');
writeln('X Je n''ai pas de préférence');
readln(Reponse);
if Reponse = '1' then
writeln('Noir')
else
if Reponse = '2' then
writeln('Blanc')
else
if Reponse = '3' then
writeln('Rouge')
else
if Reponse = '4' then
writeln('Vert')
else
if Reponse = '5' then
writeln('Bleu')
else
if Reponse = '6' then
writeln('Jaune')
else
if Reponse = '0' then
begin
write('Ecrivez votre couleur préférée : ');
readln(MaCouleur);
end
else
if (Reponse = 'X') or (Reponse = 'x')
then
writeln('Vous n''avez pas de préférence');
readln;
end.

Imaginez-vous si au lieu de huit, l'utilisateur avait le choix entre quinze ou vingt possibilités ? Que de if … then … else imbriqués ! Heureusement, il existe une autre structure qui peut remplacer toute cette série d'alternatives : le commutateur.

IX - Programme 4 : case … of … else ou commutateur

Dans plusieurs langages, la structure que nous allons voir porte le nom de « switch », que nous traduisons par commutateur.

Repartons de l'exercice proposé à la fin du chapitre précédent, avec une série de if … then … else imbriqués. Juste après la lecture du caractère tapé par l'utilisateur, plaçons un commutateur qui va énumérer toutes les valeurs de la variable Reponse à traiter :

program Couleur;
uses crt;
var
Reponse : char;
MaCouleur : string[25];
begin
writeln('Quelle est votre couleur préférée : ');
writeln('1 Noir');
writeln('2 Blanc');
writeln('3 Rouge');
writeln('4 Vert');
writeln('5 Bleu');
writeln('6 Jaune');
writeln('0 Une autre couleur');
writeln('X Je n''ai pas de préférence');
readln(Reponse);
case Reponse of
'1' : writeln('Noir');
'2' : writeln('Blanc');
'3' : writeln('Rouge');
'4' : writeln('Vert');
'5' : writeln('Bleu');
'6' : writeln('Jaune');
'0' : begin
write('Ecrivez votre couleur préférée : ');
readln(MaCouleur);
end;
'X', 'x' : writeln('Vous n''avez pas de préférence');
end;
readln;
end.

Le commutateur case (expression ou variable) of … else … évalue la valeur de l'expression ou de la variable et la compare successivement à chacune des valeurs énumérées. Dès qu'il y a égalité, le bloc de code correspondant est exécuté et ensuite le programme sort de la structure(28).

S'il n'y a d'égalité avec aucune des valeurs, c'est le bloc else qui est exécuté. S'il n'y a pas de bloc else, le programme sort tout simplement de la structure.

Notez que la structure doit être terminée par un end.

Prenons le temps de parcourir pas à pas ce qui se passe lorsque, par exemple, l'utilisateur a tapé « 3 » :

1. la valeur de la variable Reponse ('3' donc) est d'abord comparée avec la première valeur énumérée, '1' ;

2. il n'y a pas d'égalité, la valeur de la variable est comparée avec la valeur énumérée suivante, '2' ;

3. il n'y a pas d'égalité, la valeur de la variable est comparée avec la valeur suivante, '3' ;

4. il y a égalité ! Le bloc d'instructions correspondant (writeln('Rouge');) est exécuté ;

5. on sort de la structure et l'instruction suivante, c'est-à-dire le readln à la fin du programme, est exécutée.

Puisque nous en avons parlé, ajoutons à notre petit programme un bloc else après la dernière valeur testée. Nous indiquerons ainsi à l'utilisateur qu'il a tapé un caractère qui n'est pas pris en compte :

case Reponse of
'1' : writeln('Noir');
'2' : writeln('Blanc');
'3' : writeln('Rouge');
'4' : writeln('Vert');
'5' : writeln('Bleu');
'6' : writeln('Jaune');
'0' : begin
write('Ecrivez votre couleur préférée : ');
readln(MaCouleur);
end;
'X', 'x' : writeln('Vous n''avez pas de préférence');
else
writeln('Erreur : caractère inattendu.')
end;

Avez-vous remarqué que le « X » majuscule et « x » minuscule sont côte à côte, séparés par une virgule ? C'est ainsi que l'on peut associer un bloc d'instructions à plusieurs valeurs. Comme dans l'exemple suivant :

program Voyelle;
uses crt;
var
Lettre : char;
begin
write('Tapez une lettre : ');
readln(Lettre);
case Lettre of
'a','A','e','E','i','I','o','O','u','U','y','Y' : writeln('C''est une voyelle');
else
writeln('C''est une consonne');
end;
readln;
end.

IX-A - Les intervalles

C'est le moment de parler d'un type particulier en Pascal : l'intervalle ou subrange.

Auparavant, il faut expliquer ce qu'est un type ordinal.

IX-A-1 - Notion de type ordinal

Un type est dit ordinal si ses valeurs peuvent être dénombrées (comptées) et ordonnées.

Les nombres entiers répondent à cette définition :

- on peut les dénombrer : il y a 18 valeurs entre et y compris -4 et 13 ;

- on peut les ordonner : -4, -3, -2, -1, 0, 1, etc. jusque 13.

Cela va peut-être vous surprendre mais les caractères répondent également à la définition, puisque chaque caractère a un numéro (un nombre entier, donc) dans la table des caractères. Je ne vais pas m'attarder sur ce point, juste vous donner quelques exemples :

Caractère

Numéro

…

…

Espace

32

!

33

…

…

/

47

0

48

1

49

…

…

8

56

9

57

:

58

…

…

A

65

B

66

…

…

Y

89

Z

90

…

…

a

97

b

98

…

…

y

121

z

122

…

…

Et les nombres réels ? Si on peut généralement les ordonner (on peut déterminer si l'un est plus grand que l'autre, jusqu'à la limite de précision), on ne peut les dénombrer : combien y a-t-il de valeurs entre 1,4 et 1,8(29) ?

Les nombres réels ne sont donc pas ordinaux.

IX-A-2 - Le type intervalle

Un intervalle est une série de valeurs d'un type ordinal, comprises entre deux bornes. L'intervalle se note par deux points (« .. ») encadrés par la limite inférieure et la limite supérieure.

Les deux limites sont comprises dans l'intervalle.

Quelques exemples d'intervalles :

- -128..127 : les entiers signés sur un octet ;

- 'a'..'z' : toutes les lettres minuscules.

Ne confondez pas :

- 1..9 : les neuf premiers nombres entiers positifs ;

- '1'..'9' : les caractères de '1' à '9'.

Le type intervalle peut être utilisé dans un commutateur, par exemple :

program Chiffre;
uses crt;
var
UnCaractere : char;
begin
write('Tapez un chiffre : ');
readln(UnCaractere);
case UnCaractere of
'0'..'9' : writeln('C''est bien un chiffre');
else
writeln('Ce n''est pas un chiffre');
end;
readln;
end.

Exercice : Réalisez le programme TestCaractere.pas, dans lequel il est demandé à l'utilisateur de taper un caractère, puis est affichée de quelle sorte de caractère il s'agit :

- une lettre majuscule ;

- une lettre minuscule ;

- un chiffre ;

- un signe de ponctuation ;

- autre chose.

La solution :

program TestCaractere;
uses crt;
var
UnCaractere : char;
begin
write('Tapez un caractère : ');
readln(UnCaractere);
case UnCaractere of
'0'..'9' : writeln('C''est un chiffre');
'a'..'z' : writeln('C''est une lettre minuscule');
'A'..'Z' : writeln('C''est une lettre majuscule');
',','?',';','.',':','!','''','"','(',')','-' : writeln('C''est un signe de ponctuation');
else
writeln('C''est un autre caractère');
end;
readln;
end.

X - Appendices

X-A - Liste des mots réservés

Voici la liste des mots réservés du langage Pascal :

Mot réservé

Signification

absolute

and

Opérateur logique « et »

array

as

asm

begin

Début d'un bloc d'instructions

case

class

const

constructor

destructor

dispinterface

div

do

downto

else

Dans une structure si … alors … sinon (if … then … else), introduit le bloc d'instructions exécuté si la condition est fausse

end

Fin d'un bloc d'instructions

except

exports

file

finalization

finally

for

function

goto

if

Introduit une structure si … alors … sinon (if … then … else)

implementation

in

inherited

initialization

inline

interface

is

label

library

mod

nil

not

Opérateur logique unaire de négation

object

of

on

operator

or

Opérateur logique « ou »

out

packed

procedure

program

Débute le fichier source principal d'un programme, et est suivi de l'identificateur du nom du programme

property

raise

record

reintroduce

repeat

resourcestring

self

set

shl

Opérateur de décalage logique d'un bit vers la gauche

shr

Opérateur de décalage logique d'un bit vers la droite

string

then

Dans une structure si … alors … sinon (if … then … else), introduit le bloc d'instructions exécuté si la condition est vraie

threadvar

to

try

type

unit

until

uses

var

Déclaration d'une ou plusieurs variable(s)

while

with

xor

opérateur logique « ou exclusif »

X-B - Liste des symboles

Voici la liste des symboles du langage Pascal :

Symbole

Signification

+

Opérateur d'addition

-

Opérateur de soustraction

*

Opérateur de multiplication

/

Opérateur de division en virgule flottante (pour la division entière : div)

=

Opérateur d'égalité

<

Plus petit que

>

Plus grand que

[

Débute un indice dans un tableau ou une chaîne de caractères, ou la taille d'un tableau ou d'une chaîne de caractères.
Débute la définition d'un ensemble.

]

Termine un indice dans un tableau ou une chaîne de caractères, ou la taille d'un tableau ou d'une chaîne de caractères.
Termine la définition d'un ensemble.

.

;

Sépare deux instructions

,

(

)

:

^

@

{

}

$

#

&

%

<<

>>

**

<>

×

<=

>=

:=

+=

-=

*=

/=

(*

*)

(.

.)

//

(1) Source : harti-info.
Retour à l'article

(2)Photo : Wikipedia
Retour à l'article

(3)Tenez-vous bien : « source » est ici un mot masculin ! Dites « le source ».
Retour à l'article

(4)Sachez qu'il existe des solutions intermédiaires entre le langage Pascal et le langage machine : c'est ainsi qu'il est par exemple possible de compiler le Pascal en « bytecode » destiné à tourner sur une machine virtuelle Java, ou en langage intermédiaire pour .NET.
Retour à l'article

(5)Il s'agira souvent d'un fichier exécutable principal et de plusieurs bibliothèques (des fichiers qui contiennent des portions du logiciel, ou des images, etc.).
Retour à l'article

(6)Le pseudo-code est une façon d'écrire un algorithme dans un langage proche du langage courant. Nous en ferons tout de suite lorsque les choses sérieuses débuteront.
Retour à l'article

(7)Voyez la fiche de Pascal Compiler – Mobile IDE sur Google Play.
Retour à l'article

(8)Vérification : 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20 à 27, 30 à 37… 70 à 77 puis 100, 101… jusque 777, etc.
Retour à l'article

(9)Oui, facile si vous êtes observateur(trice) : il suffit d'écrire 1 suivi d'un nombre de 0 correspondant à la puissance de 2. Donc :
2^20 en binaire : 1 0000 0000 0000 0000 0000 ;
2^24 : 1 0000 0000 0000 0000 0000 0000 ;
2^25 : 10 0000 0000 0000 0000 0000 0000.
Retour à l'article

(10)Vérification :
15 donne 1111 ;
32 donne 10 0000 ;
16 331 donne 11 1111 1100 1011 ;
détaillons pour 1 : 1 divisé par 2 donne 0, reste 1 – donc le résultat est 1 ;
et pour 2 : 2 divisé par 2 donne 1, reste 0 – puis 1 divisé par 2 donne 0, reste 1 – le résultat est donc 10.
Retour à l'article

(11)Vérification :
92 ;
31 ;
3 355.
Retour à l'article

(12)Vérification :
100 0110 ;
1 0000 0000 ;
détaillons : 3 + 5 = 10 (octal), on note 0 et on reporte 1 ; 1 + 6 = 7, résultat 70 ;
5517.
Retour à l'article

(13)Vérification : 1101.
Retour à l'article

(14)Si l'anglais vous est totalement inconnu, cela va constituer pour vous une difficulté supplémentaire. Je vous conseille alors de vous faire un petit lexique, que vous compléterez au fur et à mesure de votre rencontre avec de nouveaux termes.
Retour à l'article

(15)Vérification :

Retour à l'article

(16)Il s'agit de division entière : 5 divisé par 2 donne 2 et un reste de 1.
Retour à l'article

(17)Bien que la présence des lettre A à F indique forcément qu'il s'agit d'un nombre hexadécimal, j'indiquerai systématiquement le suffixe « h ».
Retour à l'article

(18)Vérification :
1111 1101b ;
1011 1000b.
Retour à l'article

(19)1. 1110 1001 (octet) ;
1111 1111 1110 1001 (mot) ;
1111 1111 1111 1111 1111 1111 1110 1001 (double mot).
On remarque que le bit représentant le signe (en rouge) est étendu.

2. 256 : un mot (9 bits nécessaires) ;
38 133 non signé : un mot (16 bits nécessaires) ;
5 000 000 : un double mot (23 bits nécessaires) ;
38 133 signé : un double mot (17 bits nécessaires).
Retour à l'article

(20)La taille d'une variable détermine souvent elle-même l'intervalle de valeurs que celle-ci peut prendre. Par exemple, un nombre entier signé de taille 8 bits (un octet) peut prendre les valeurs de -128 à +127.
Retour à l'article

(21)Si vous essayez d'assigner la valeur 1 000 à un nombre entier signé de taille 8 bits (dont les valeurs possibles vont, rappelons-le, de -128 à +127), le compilateur va vous indiquer une erreur. C'est nettement plus pratique que d'essayer de trouver, au moment de l'exécution du programme, pourquoi votre nombre entier contient une valeur erronée.
Retour à l'article

(22)Forcément, puisque sa longueur est contenue dans le premier octet : un entier non signé d'une taille d'un octet peut prendre une valeur de 0 à 255.
Retour à l'article

(23)Oui, je sais, vous êtes curieux(se) ! Je cite les deux autres possibilités :
AnsiString ;
UnicodeString.
Non, je ne vous donne pas plus de détail pour l'instant. Restons concentrés.
Retour à l'article

(24)Le compilateur Free Pascal l'autorise depuis peu, moyennant l'utilisation d'un préfixe, mais je n'y vois que peu d'intérêt, et surtout j'y vois un très bon moyen de s'emmêler inutilement les pinceaux. Oubliez !
Retour à l'article

(25)Vérification :
1. correct ;
2. correct ;
3. faux : le point d'exclamation est interdit ;
4. faux : pas de caractères accentués dans un identificateur ;
5. correct ;
6. correct ;
7. faux : c'est un mot réservé ;
8. faux : un identificateur ne peut commencer par un chiffre ;
9. correct ;
10. faux : le tiret n'est pas autorisé.
Retour à l'article

(26)La programmation structurée est un sous-ensemble de la programmation impérative. Elle consiste en l'organisation du code source en blocs d'instructions, et en l'utilisation de structures de contrôle telles que si … alors … sinon, tant que … faire …, répéter … jusqu'à ce que …, etc.
Retour à l'article

(27)On appelle expression la composition d'opérateurs et d'opérandes. Une expression produit un résultat, donc elle a obligatoirement un type.
Les opérateurs sont soit logiques (not, or, etc.), mathématiques (+, -, etc.), d'égalité (=, plus petit que, etc.) ou d'ensemble (appartient à, etc.).
Les opérandes peuvent être des variables, des fonctions, d'autres expressions…
Ces notions peuvent vous paraître obscures pour l'instant mais patience, cela s'éclaircira petit à petit.
Retour à l'article

(28)Une différence avec plusieurs autres langages est que lorsque la valeur de l'expression ou de la variable correspond à une des valeurs énumérées dans le commutateur, on exécute le bloc de code, on quitte la structure et on continue l'exécution. En C, par exemple, les valeurs énumérées suivantes continuent à être testées, sauf si le bloc de code se termine par l'instruction break;.
Retour à l'article

(29)Une infinité !
Retour à l'article