Archive

Turbo Pascal – Les boucles

This entry is part 11 of 24 in the series Turbo Pascal - Tutoriel
  1. For…To…Do et For…DownTo…Do
  2. Repeat…Until
  3. While…Do
  4. Break

Plutôt que d’écrire plusieurs fois les mêmes instructions pour un même résultat,
on peut créer une boucle qui nous évitera bien du travail.


For…To…Do et For…DownTo…Do


Ces deux boucles permettent de répeter un groupe d’instruction tout en
incrémentant ou décrémentant une variable.

Ceci peut être très utile : imaginez que vous vouliez apprendre la table
de 8.

On pourrait écrire 10 fois writeln(’1 x 8 = ‘, 1 * 8); à
chaque fois, mais ce n’est pas très astucieux.

L’alternative proposée ci-dessous permet d’obtenir le même résultat, mais
en une seul et unique ligne, grace à la boucle For…To…Do :

program Table8;

var i : integer;

begin
{ utilisation d’une boucle pour calculer la table de 8 }
For i := 1 To 10 Do writeln(i, ‘ x 8 = ‘, i * 8);
end.


La syntaxe de cette boucle est la suivant :

For var := min To max Do [Instruction];

ou

For var := min To max Do
Begin
[Instruction];
[Instruction];
End;


var représente une variable de type Integer.
min et max peuvent être des variables ou des constantes,
mais doivent aussi être du type Integer.

La boucle va incrémenter la variable d’une unité à chaque fois. Lorque celle
ci va atteindre la valeur spécifiée par max, l’execution de
la boucle s’arrétera et les instructions suivantes seront executées.

La boucle For…DownTo…Do est identique à la précedente. La seule
différence réside dans le fait que la variable n’est pas incrémentée mais
décrémentée.

Si on avait voulu faire la table de 8 à l’envers, on aurrait écrit :

program Table8;

var i : integer;

begin
{ Boucle DownTo pour la table de 8 à rebourd }
For i := 10 DownTo 1 Do writeln(i, ‘ x 8 = ‘, i * 8);
end.


On peut tout à fait imbriquer des boucles les unes dans les autres.

Le court programme ci-dessous permet d’afficher les tables de multiplication
de 1 à 10 :

program Tables;

var i : integer;
j : integer;

begin
For i := 1 To 10 Do
For j := 1 To 10 Do writeln(j, ‘ x ‘, i, ‘ = ‘, j * i);
end.


Repeat…Until


Repeat…Until permet de répeter au moins une fois une ou
plusieurs instructions, juqu’à ce qu’une condition soit évaluée comme
vraie.

Voici la syntaxe :

Repeat
[Instruction];
[Instruction];
Until condition;

Pourquoi au moins une fois ? Parce que comme vous le voyez, la condition
est située à la fin de la boucle, devant Until.

La condition peut être n’importe quel test, comme nous l’avons vu dans
la structure conditionnelle.

Vous remarquez qu’il n’y a pas besoin de définir un bloc d’instructions
avec Begin…End.


var Age : Integer;

begin
Repeat
Writeln(’Quel est votre age ?’);
Readln(Age);
Until Age >= 18;
Writeln(’C »est bon, vous êtes majeur.’);
end.


While…Do


On peut dire que la boucle While…Do est l’inverse de la boucle
Repeat…Until.

En effet, While…Do fait se répeter une ou plusieurs instructions
tant qu’ une condtion est vraie.

Le test se situant en tête de boucle, les instructions ne sont pas obligatoirement
répetées au moins une fois.

Voici la syntaxe :

While condition Do [Instruction];

ou

While condition Do
Begin
[Instruction];
[Instruction];
End;


On peut reprendre l’exemple de la boucle Repeat…Until ainsi :

var Age : Integer;

begin
While Age < 18 Do
Begin
Writeln('Quel est votre age ?');
Readln(Age);
End;
Writeln('C''est bon, vous êtes majeur.');
end.


Break


L’instruction Break permet de sortir de n’importe quel boucle étudiée
plus haut. L’exemple suivant n’affiche rien, puisque l’instruction Break
est appelée tout au début de la boucle :

program Tables;

var i : integer;
j : integer;

begin
For i := 1 To 10 Do
begin
Break;
For j := 1 To 10 Do writeln(j, ‘ x ‘, i, ‘ = ‘, j * i);
end;
end.

Categories: Turbo Pascal Tags:

Turbo Pascal – Procédures et fonctions

This entry is part 12 of 24 in the series Turbo Pascal - Tutoriel
  1. Procédures
  2. Fonctions
  3. Variables globales et variables locales
  4. Imbrication de procédures
  5. Architecture du programme

Les procédures et fonctions sont des morceaux de code qui peuvent être appellés d’à peu près
n’importe quel endroit du programme.

Une procédure se distingue d’une fonction par le fait qu’elle ne renvoi pas de valeur.

À l’inverse, une fonction en renvoi une…


Procédures


Comme on l’a vu, une procédure est constituée de lignes de code. Qui dit lignes de code, dit bloc
d’instruction. On va donc retrouver le désormais très commun begin…end.

Mais ce n’est pas tout! Une procédure posséde un nom. Par exemple, pour écrire sur l’écran, vous
utilisez write ou writeln selon le cas. Et bien write et
writeln sont les noms des procédures.

Ensuite, une procédure est définit par un mot-clef, qui est tout bêtement procedure.

Enfin, il est rare qu’une procédure soit utilisée tel quel. En général, on lui passe un ou plusieurs
arguments, entre parenthèses. Ex: avec write, l’argument transmis est la chaine de
caractères.

Pour bien voir tout ça, nous allons créer une procédure qui calculera la résistance d’un composant
électrique en étant en connaissance de la tension et de l’intensité. Le résultat sera également
affiché par celle-ci. Les arguments à transmettre seront donc : une variable I pour l’intensité,
et une variable U pour la tension. Nous appelerons la procédure LoiOhm

Voici le programme :

program elec;

procedure LoiOhm(I : Real; U : Real); { Début de la procédure }
begin
{ La Loi d’Ohm, c’est U=RxI, donc R=U/I }
write(’La résistance est de ‘, U / I, ‘ Ohms.’);
end; { Fin de la procédure }

begin
LoiOhm(15, 240); { Appel de la procédure. U=220 et I=15 }
end.


Voyons en détails :

  • procedure LoiOhm(I : Real; U : Real); : c’est le début de la procédure. On
    retrouve le mot-clef procedure. Ensuite, c’est le nom de la procédure. Entre
    parenthèses, c’est les arguments. Il ne faut pas oublier de spécifier leurs types. Ils doivent
    être séparés par des points-virgules. En parlant de points-virgules, la ligne doit en comporté
    un à sa fin.

    Remarque : on aurrait pu écrire cette ligne à la place : procedure LoiOhm(I, U : Real);

    Ainsi, on ne sécifie qu’une seule fois le type des variables.

  • Ensuite, il n’y a plus de mystères : on retrouve un bloc d’instruction begin…end;,
    et à l’intérieur, on calcul et on affiche le résultat.


Maintenant, on a encore besoin de la loi d’Ohm à un autre endroit de notre programme. Mais cette
fois, on veut avoit juste le résultat et afficher le résultat à notre guise, mais hors procédure.

Plusieurs méthode sont possibles. Nous allons d’abord voir comment opérer avec une 3ème
variable passée en argument. Nous l’appelerons R, comme Résistance. Elle aussi est
du type Réél. On peut donc écrire :

program elec;

var MonResultat : Real;

procedure LoiOhm(I, U, R : Real);
begin
R := U / I;
end;

begin
writeln(’Avant -> MonResultat = ‘, MonResultat); { Sortie -> 0 }
LoiOhm(15, 250, MonResultat); { On passe notre
variable en argument}
writeln(’Après -> MonResultat = ‘, MonResultat); { Sortie -> 0 }
end.


Vous remarquez que la sortie est toujours égale à 0. Pourquoi ?

Il faut spécifier que R est une variable dans la procédure, à l’aide du mot-clef
var. Notre exemple ainsi modifié devient :

program elec;

var MonResultat : Real;

procedure LoiOhm(I, U : Real; var R : Real); { Utilisation du mot-clef VAR }
begin
R := U / I;
end;

begin
writeln(’Avant -> MonResultat = ‘, MonResultat); { Sortie -> 0 }
LoiOhm(15, 250, MonResultat); { On passe notre
variable en argument }
writeln(’Après -> MonResultat = ‘, MonResultat); { Sortie -> 16.66… }
end.


Cette syntaxe ne vous rappelle rien ? Et oui, il se passe la même chose que lors de l’utilisation
de read : on passe une variable à la procédure et celle-ci nous la renvoi modifiée.


Fonctions


Nous allons maintenant modifier notre exemple précédent pour qu’il fonctionne avec une fonction.

L’utilisation de fonctions n’a rien de plus compliqué : ici, on affectera le résultat non pas
à une variable, mais à la fonction.

Par conséquent, la fonction possédera un type (ici, Real).

program elec;

var MonResultat : Real;

function LoiOhm(I, U : Real) : Real; { LoiOhm est Real }
begin
LoiOhm := U / I; { Affectation du résultat
à la fonction }
end;

begin
writeln(’La résistance est de ‘, LoiOhm(15, 240)); { Appel de la fonction }
end.


Remarques :

  • De la même façon qu’une procédure, une fonction peut aussi modifier des variables transmises
    en arguments

  • Bien qu’une fonction ressemble à une variable, ce n’en est pas une. On ne peut donc pas
    écrire des choses du genre :

    program CalcCercle;

    function Aire(Rayon : Real) : Real;
    begin
    Aire := Rayon; { Pas bon }
    Aire := Aire * Rayon; { Pas bon }
    Aire := Aire * Pi; { Pas bon }
    end;

    begin
    writeln(’L »aire d »un cercle de rayon 5 est de ‘, Aire(5));
    end.



Variables globales et variables locales


Pour l’instant, toutes les variables que nous avons déclarées étaient globales.

Une variable globale, c’est une variable qui peut être accédées par toutes les procédures et
fonctions du programme.

Dans l’exemple si dessous, la variable VarGlob est accessible par la procédure et
le programme principal :

var VarGlob : integer;

procedure SousProg;
begin
VarGlob := VarGlob + 1; { VarGlob = 10 + 1 }
writeln(VarGlob); { Sortie -> 11 }
end;

begin
VarGlob := 10;
writeln(VarGlob); { Sortie -> 10 }
SousProg;
end.


Maintenant, nous allons déclarer cette même variable de façon quel soit inaccessible par la procédure
SousProg :

procedure SousProg;
begin
VarGlob := VarGlob + 1; { Une Erreur se produit ! }
writeln(VarGlob); { Error 3 : Unknow Identifer }
end;

var VarGlob : integer; { VarGlob est maintenant locale }
begin
VarGlob := 10;
writeln(VarGlob); { Sortie -> 10 }
SousProg;
end.


La meilleur preuve qu’elle est inaccessible, c’est qu’une erreur est provoquée si on essaye de
lancer le programme.

On peut aussi faire l’inverse, c’est à dire rendre une variable accessible uniquement par une
procédure, pour que le programme principal ne puisse pas l’utiliser :

procedure SousProg;
var VarLoc : integer; { VarLoc est accessible uniquement par SousProg}
begin
VarLoc := 50;
writeln(VarLoc); { Sortie -> 50 }
end;

begin
SousProg;
writeln(VarLoc); { Error 3 : Unknow Identifer }
end.


Attention! Dans les procédures et les fonctions, les variables sont toujours réinitialisées
à chaque appel de la dite procédure ou fonction.


Imbrication de procédures


De la même façon qu’il est possible d’imbriquer des boucles dans d’autres boucles, il est possible
d’imbriquer des procédures dans des procédures.

Cette sous-procédure ne peut être appellées que par la procédure de niveau supérieur. De la
même façon, une sous-procédure ne peut appeler que d’autres sous-procédures de la procédure de
niveau supérieur, ou des procédures principales.

procedure Proc;
procedure SousProc;
begin
writeln(’Hello! Ici, nous sommes dans la sous procédure de Proc’);
end;
begin
writeln(’On est dans la procédure Proc’);
SousProc;
end;

begin
writeln(’Corps du programme’);
Proc;
end.


Architecture du programme


Il est temps de dresser un squelette d’un programme, avec nos connaissances actuelles :

program nom; {Nom du programme}

label label1, label2; {Labels}

const const1 : Type = valeur; {Constantes}
const2 : Type = valeur;

var gVar1 : Type; {Variables globales}
gVar2 : Type;

procedure procedure1(Arg1,Arg2); {Procédures}
var pVar1 : Type; {Variables locales}
pVar2 : Type;
begin
[Instructions]
end;

function function1(Arg1,Arg2) : Type; {Fonctions}
var pVar1 : Type; {Variables locales}
pVar2 : Type;
begin
[Instructions]
end;

var pVar1 : Type; {Variables locales}
pVar2 : Type;

begin {Procédure principale}
[Instructions]
end.

Categories: Turbo Pascal Tags:

Turbo Pascal – Les unités

This entry is part 13 of 24 in the series Turbo Pascal - Tutoriel
  1. Unités utilisateurs

Une unité, qu’est ce que c’est ? En fait, c’est un fichier où sont regroupées des procédures,
fonctions, variables, constantes et types directements utilisables par le programmeur.

D’ailleurs, on vous l’a caché, mais vous utilisez déjà une unité : system.

Comme son nom l’indique, cette unité est l’unité système de Turbo Pascal. On retrouve des fonctions
comme write, writeln, read, readln

Bien que cette unité soit tout de même très complete (les petits programmes précédents sont là
pour le prouver), on a parfois besoin de fonctions suplémentaires pour pouvoir réaliser des taches
plus évoluées.

C’est pourquoi Turbo Pascal est fourni avec bien d’autres unités permettant de faire face à presque
toutes les situations qu’un programmeur peut rencontrer.

Les voici :


  • Crt : conrôle du mode vidéo, gestion des codes géographiques des touches, des fenêtres
    et du son.

  • Dos : système d’exploitation

  • Graph : fonctions graphiques (cercles, lignes…)

  • Graph3 : fonctions graphiques de Turbo Pascal 3.0 : gestion de la fameuse Tortue

  • Overlay : sert plus ou moins pour la gestion matérielle

  • Printer : gestion du port d’impression (LPT1) à l’aide d’un fichier texte

  • System : couvre la quasi-totalité des opérations d’entrée-sortie (cf. ci-dessus)

  • Turbo3 : permet d’assurer la compatibilité des programmes écrit avec Turbo Pascal
    3.0

  • WinDos : idem à Dos, mais plus complet


Les unités ayant rapport avec Turbo Vision ont été omises volontairement.

Si on choisi d’utiliser une des unités ci-dessus, il faut y faire référence dans le programme,
à l’aide de uses, juste après program, et avant la déclaration des label.
Si on utilise plusieurs unités, on les séparera par des virgules.

Exemple : l’unité Crt comporte la fonction KeyPressed, qui permet de tester
si une touche du clavier à été pressée.

On écrira donc :

Program MyProg;

Uses Crt; { On utilise l’untité Crt }

Begin
Repeat
write(’Appuyez sur une touche pour stopper l »écriture de ce stupide message!’);
Until KeyPressed; { On utilise KeyPressed, de l’unité Crt }
End.


Ormis l’unité system qui est incluse d’office, toutes les unités que vous utiliserez
devront être déclarées ainsi.


Unités utilisateurs


Le Turbo Pascal a comme avantages par rapport au QBasic qu’il est un langage beaucoup plus structuré.
Il permet entre autre de faire de la programmation modulaire.

En d’autres mots, un programeur qui utilise fréquemment certaines fonctions peut les régrouper
dans une unité qu’il pourra appeller dans chacun des programmes qui en aura besoin.

La programmation modulaire n’a que des avantages : imaginez que vous utilisiez pas mal de fonctions
(plus d’une dizaine). Vous les regroupez toutes dans une même unité. Puis, dans plusieurs programmes
vous utilisez cette unité. Déjà, plus besoin de faire des copier/coller pour inclure les même
fonctions. Mais le plus fort arrive : après plusieurs programmes, vous vous rendez compte qu’en fait,
le code que vous utilisez est tout faux! Pas de panique, il suffit juste de corriger l’unité et
de recompiler les programmes dépendents, au lieu de corriger chaque programme comme on l’aurait
fait en Basic…



La création d’une unité n’est pas tellement plus compliquée que celle d’un programme ordinaire.

Voici le squelette d’une unité :

Unit Nom {Nom de l’unité}

Interface {Partie « publique »}
Uses Unité1, Unité2;

Const Const1 : Type = Valeur;
Const2 : Type = Valeur;

Types Type1
Type2

Var Var1 : Type;
Var2 : Type;

Procedure Procedure1(Arg1,Arg2); {Déclarations des procédures & fonctions}
Function Function1(Arg1,Arg2) : Type; {pouvant être utilisées par les programmes}

Implementation {Partie « privée »}
Uses Unité1, Unité2;

Label Label1, Label2;

Const Const1 : Type = Valeur;
Const2 : Type = Valeur;

Types Type1
Type2

Var Var1 : Type;
Var2 : Type;

Procedure Procedure1(Arg1,Arg2);
Var pVar1 : Type;
pVar2 : Type;
Begin
[Instructions]
End;

Function Function1(Arg1,Arg2) : Type;
Var pVar1 : Type;
pVar2 : Type;
Begin
[Instructions]
End;

Begin {Initialisation}
[Instructions]
End.


Quelques petites explications :

  • Unit : c’est le nom de l’unité. Contrairement au program dans un programme,
    Unit est obligatoire

  • Interface : c’est la partie publique de l’unité. C’est à dire que toutes les constantes,
    types, variables, procédures et fonctions seront accessibles par le programme utilisateur.

    En ce qui concerne les procédures et les fonctions, il ne faut spécifier que leurs
    déclarations, les procédures et fonctions proprements dites étant écrites dans la partie
    Implementation

  • Implementation : c’est la partie privée. Les constantes, types, variables, procédures
    et fonctions ne sont utilisables que par l’unité elle même, à part les procédures et fonctions
    déclarées dans la partie Interface.

  • begin…end. : comme pour un programme, c’est le coeur de l’unité. Ça peut
    paraitre étrange, puiqu’une unité n’a pas pour vocation d’être executée. En fait, cette
    partie sert surtout pour une éventuelle initialisation de divers paramêtres.

    Même si vous n’avez pas prévu une telle étape, vous devez quand même l’inclure.


Pour mieux comprendre, voici une unité regroupant quelques fonctions permetant d’effectuer des
calculs concernant la puissance et l’energie :

unit Electro;

Interface
Const PermAir : Real = 1; {Perméabilité relative}
PermFer : Real = 2500;
PermNickel : Real = 250000;
PermVide : Real = Pi * 4E-7;

ChargElec : Real = -1.6E-19; {Charge électron}

Function Puissance(U, I : Real) : Real; {Puissance}
Function EnergiePT(P, T : Real) : Real; {Energie en fonction de la puissance
et du temps}
Function EnergieUIT(U, I, T : Real) : Real; {Energie en fonction de U, I et T }

Implementation
Function Puissance(U, I : Real) : Real;
begin
Puissance := U * I;
end;

Function EnergiePT(P, T : Real) : Real;
begin
EnergiePT := P * T;
end;

Function EnergieUIT(U, I, T : Real) : Real;
begin
{On fait appel aux fonctions déjà établies }
EnergieUIT := EnergiePT(Puissance(U, I), T);
end;

begin
{Pas d’initialisation}
end.


Cette unité n’est pas directement utilisable. Il fois maintenant la compiler, de la même façon
qu’un programme, en appuyant sur la touche F9.

Ici, le fichier pondu ne sera pas du type .EXE, mais .TPU.

En géneral, les fichiers TPU sont regroupés dans un unique répertoire, s’appelant Units.

Le programme ci-dessous montre comment utiliser cette nouvelle unité :

Program TestUnit;

Uses Electro;

Var U : Real;
I : Real;
t : Real;

Begin
writeln(’*** Calcul de l »énergie électrique avec l »unité ELECTRO ***’);
write(’U (en volts) = ‘);
readln(U);
write(’I (en ampères) = ‘);
readln(I);
write(’t (en secondes) = ‘);
readln(t);
writeln(’La puissance dissipée est de ‘, EnergieUIT(U, I, t), ‘ joules.’);
End.

Categories: Turbo Pascal Tags:

Turbo Pascal – Les tableaux

This entry is part 14 of 24 in the series Turbo Pascal - Tutoriel

Les tableaux sont très utiles pour stocker des données, lorque c’est dernières deviennent sur-abondantes.

Au lieu d’utiliser des dizaines (parfois des centaines), on peut créer un tableau qui facilitera
les choses.

Voici commet déclarer un tableau :


Var NomTab : Array[Min..Max] Of Type;

Détaillons :

  • La ligne commence par Var. Il faudra donc déclarer les tableaux en même temps
    que les autres variables.

  • NomTab représente un identificateur. Il doit respecter les rêgles enumérées
    précedement pour les variables.

  • Array permet de créer le tableau. Min définit la dimension inférieur
    et Max la dimension supérieur.

  • Type définit le type du tableau : il peut étre du type String,
    Boolean, Integer


L’exemple suivant créer un tableau de type Real de 10 cases :

Var MyTabl : Array[1..10] Of Real; {Création d’un tableau de type Real}

begin
end.


Ce tableau est un tableau à une dimension, puisqu’il ne s’agit que d’une ligne. On pourait le
représenter ainsi :




























1 2 3 4 5 6 7 8 9 10
                   




Pour stocker des données dans ce tableaux il suffit de spécifier le numéro de la case voulue entre
crochets et d’utiliser l’opérateur d’affectation. Même chose pour le lire :

Var MyTabl : Array[1..10] Of Real;

begin
MyTabl[4] := 46.25; {On affecte la valeur 46.25 à la case 4 du tableau}
writeln(MyTabl[4]); {On affiche la valeur de la case 4}
end.


Maintenant, notre tableau ressemblerait à ceci :





























1 2 3 4 5 6 7 8 9 10
      46.25            




Mainteant, nous allons réaliser un programme qui permetra de calculer le nombre de kilometres et
la distance moyenne parcouru par un cycliste :

program Cyclo;

var tabKilom : Array[1..10] Of Real;
Total : Real;
maxKilom : Real;
minKilom : Real;
moyKilom : Real;
i : Integer;

begin
{Création d’une « base de données »}
for i := 1 To 10 do
begin
writeln(’Kilometres parcouru durant la sortie N°’, i);
readln(tabKilom[i]); {On affecte le résultat dans un tableau}
end;

{Détermination du nombre total de kilometres}
for i := 1 To 10 Do
Total := Total + tabKilom[i];

{Détermination de la plus grande distance}
For i := 1 To 10 Do
if tabKilom[i] > maxKilom Then maxKilom := tabKilom[i];

{Détermination de la plus petite ditance}
minKilom := maxKilom;
for i := 1 To 10 Do
If tabKilom[i] < minKilom Then minKilom := tabKilom[i];

{Détermination du nb de le distance moyenne}
moyKilom := Total / 10;

{Affichage du résultat}
writeln('Nombre de kilométre parcouru : ', Total);
writeln('Plus petite distance : ', minKilom);
writeln('Plus grande distance : ', maxKilom);
writeln('Distance moyenne : ', moyKilom);
end.


Bien sur, on peut faire beucoup plus simple pour le même résultat.

On peut aussi déclarer des tableaux ayant plusieurs dimensions. Le protocole est identique :

var MyTabl : Array[1..5, 1..10] Of Boolean; {Tableau à deux dimensions}

begin
end.


L’allure du tableau devient :




























































































1 2 3 4 5
1          
2          
3          
4          
5          
6          
7          
8          
9          
10          




Pour accéder à une case du tableau, on séparera les coordonnées soit par des virgules, soit par
des crochets :

var MyTabl : Array[1..5, 1..10] Of Boolean; {Tableau à deux dimensions}

begin
MyTabl[1, 2]:=true; {MyTabl[1, 2]}
writeln(MyTabl[1][2]); {MyTabl[1][2]}
end.


On peut ainsi créer des tableaux à 3 dimensions :

var MyTabl : Array[1..5, 1..5, 1..5] Of Char;

Ça donne un cube.

Categories: Turbo Pascal Tags:

Turbo Pascal – Les maths

This entry is part 15 of 24 in the series Turbo Pascal - Tutoriel
  1. Opérateurs relationnels
  2. Méthodes de calcul
  3. Fonctions mathématiques
  4. La logique
    1. NOT
    2. AND
    3. OR
    4. XOR

Le Larousse definit ainsi le langage Pascal : Langage de programmation adapté au traitement
d’applications scientifiques
.

Cette afirmation fait du Pascal un langage riche en fonctions mathématiques.


Opérateurs relationnels


Les opérateurs relationnels permettent d’effectuer des comparaisons entre des variables, des
constantes…

































Opérateurs relationnels
Opérateur Fonction
= Egual
< Inférieur
> Supérieur
<= Inférieur ou égual
>= Supérieur ou égual
<> Différent


Méthodes de calcul


Des malheureses 4 opérations mathématiques que nous avons vu au départ, nous allons rajouter
c’est deux la :























Méthodes de calcul
Opérateur Fonction Exemple de code Résultat
MOD Modulo writeln(19 Mod 4); 3
DIV Division entière writeln(100 Div 3); 33


Fonctions mathématiques


Dans le tableau ci-dessous sont répertoriées les fonctions mathématiques du Turbo Pascal :





























































































































Fonctions mathématiques
Nom Fonction Exemple de code Résultat
Sin(x) Calcul du sinus (Radians) write(sin(0), sin(Pi)); 0 1
Cos(x) Calcul du cosinus (Radians) write(cos(0), cos(Pi)); 1 0
ArcTan(x) Renvoi la cotangente write(ArcTan(4)); .7853982
Sqr(x) Carré write(Sqr(5)); 25
Sqrt(x) Racine carré write(Sqrt(81)); 9
Exp(x) Eleve à une puissance népérienne write(Exp(0)); 1
Ln(x) Logarithme népérien write(Ln(1)); 0
Trunc(x) Tronque la partie entière write(Trunc(Pi)); 3
Int(x) Renvoi la partie entière write(Int(Pi)); 3,000…
Frac(x) Renvoi la partie fractionnaire (après la virgule) write(Frac(45.98765)); 0.98765
Round(x) Arrondi à l’entier le plus proche write(Round(28.7), Round(28.3)); 29 28
Pred(x) Renvoi le prédécesseur d’un nombre ordonné (entier) write(Pred(5)); 4
Succ(x) Renvoi le succésseur d’un nombre ordonné (entier) write(Succ(5)); 6
Odd(x) Renvoi true si le nombre est impair, false si pair write(Odd(3), Odd(2)); TRUE FALSE
Abs(x) Renvoi la valeur absolue write(Abs(-54)); 54
Pi Renvoi la constante Pi write(Pi); 3.14159265358…
Random(x) Renvoi un nombre aléatoire entre 0 et l’argument write(Random(10)); 5.7895415
Inc(x [, i]) Incrémente la variable de i si spécifié, ou de 1 par défaut Inc(MyVar); Inc(MyVar, 5);  
Dec(x, [, i]) Décrémente la variable de i si spécifié, ou de 1 par défaut Dec(MyVar); Dec(MyVar, 5);  


La logique


La logique est surtout utilisée dans les conditions, que se soit avec les boucles ou la structure
conditionnelle.

Le mieux, c’est de lire ceci : Maths appliquées

Il faut savoir que l’informatique ne reconnait que 2 états :

  • TRUE, quand c’est allumé

  • FALSE, lorsque c’est éteint


Lorsque l’on réalise une comparaison avec les opérateurs relationnels, l’ordinateur évalue en
fait l’expression à TRUE si elle se vérifie, et à FALSE dans les autres
cas.

Ainsi, on peut écrire des choses du style :

var blnVar : Boolean; {Une variable du type Boolean}

begin
blnVar := 78 > 35; {blnVar = TRUE}
blnVar := 78 < 35; {blnVar = FALSE}
write(5 = 5); {Affiche TRUE}
write(5 <> 5); {Affiche FALSE}
end.


Voici les opérateurs logiques du Turbo Pascal :

  • NOT : le NON logique. Il inverse le résultat : si FALSE devient TRUE
    et inversement.























    NON logique (NOT)
    Opérande Valeur renvoyée Exemple de code Résultat
    FALSE TRUE write(Not(False)); TRUE
    TRUE FALSE write(Not(True)); FALSE




  • AND : le ET logique. Il renvoi TRUE si et seulement si les deux
    opérandes sont TRUE.








































    ET logique (AND)
    Opérande1 Opérande2 Valeur renvoyée Exemple de code Résultat
    FALSE FALSE FALSE write(False And False); FALSE
    FALSE TRUE FALSE write(False And True); FALSE
    TRUE FALSE FALSE write(True And False); FALSE
    TRUE TRUE TRUE write(True And True); TRUE




  • OR : le OU logique. Il renvoi TRUE si au moins une des deux opérandes
    est à TRUE.








































    OU logique (OR)
    Opérande1 Opérande2 Valeur renvoyée Exemple de code Résultat
    FALSE FALSE FALSE write(False Or False); FALSE
    FALSE TRUE TRUE write(False Or True); TRUE
    TRUE FALSE TRUE write(True Or False); TRUE
    TRUE TRUE TRUE write(True Or True); TRUE




  • XOR : le OU exclusif logique. Il renvoi TRUE si une seule
    des deux opérandes est à TRUE.








































    OU exclusif logique (XOR)
    Opérande1 Opérande2 Valeur renvoyée Exemple de code Résultat
    FALSE FALSE FALSE write(False Xor False); FALSE
    FALSE TRUE TRUE write(False Xor True); TRUE
    TRUE FALSE TRUE write(True Xor False); TRUE
    TRUE TRUE FALSE write(True Xor True); FALSE




Categories: Turbo Pascal Tags:

Turbo Pascal – Le traitement du texte

This entry is part 16 of 24 in the series Turbo Pascal - Tutoriel
  1. Détail d’une chaîne de caractères
    1. Concat
    2. Copy
    3. Delete
    4. FillChar
    5. Insert
    6. Pos
    7. Str
    8. Val
  2. La table de caractères ASCII
  3. La casse
    1. StrUpper
    2. StrLower

On a vu comment afficher du texte avec write et writeln. Nous allons
maintenant voir comment formater ce texte.


Détail d’une chaîne de caractères


On a vu dans les variables qu’une chaîne de caractères est un tableau
du type char.

Ainsi, n’ayons pas peur d’écrire :

var MyTexte : array[1..5] Of Char; {Un tableau de Char}

begin
MyTexte[1] := ‘H’;
MyTexte[2] := ‘e’;
MyTexte[3] := ‘l’;
MyTexte[4] := ‘l’;
MyTexte[5] := ‘o’;
writeln(MyTexte); {Affichage du tableau comme si c’était une chaine}
end. {Sortie -> Hello}


Partant de ce principe, on peut facilement modifier n’importe quel caractère d’une chaîne, du
moment que l’on sait la longueur de la chaîne.

Car rappelons que l’on peut limiter la taille du chaîne de caractères à la déclaration. Si on
indique un index supérieur à sa longueur, une erreur se produit.

L’index 0 de la table correspond à la longueur de la chaîne de caractère. On peut ainsi écrire :

var MyTexte : String;

begin
MyTexte := ‘Bonjour le Web!’;
MyTexte[0] := Chr(7); {La chaîne ne fait plus que 7 caractères}
writeln(MyTexte); {Sortie -> Bonjour}
end.


Il existe une multitude de fonctions permettant de triturer du texte :


Concat


Cette fonction permet de concaténer plusieurs chaînes de caractères en une seule.

Elle est équivalente à ces même chaînes « additionnées » :

var MyTexte1 : String;
MyTexte2 : String;
strM1 : String;
strM2 : String;
strM3 : String;

begin
strM1 := ‘Salut! ‘;
strM2 := ‘Les copains! ‘;
strM3 := ‘C »est moi!’;

MyTexte1 := Concat(strM1, strM2, strM3);
MyTexte2 := strM1 + strM2 + strM3;

writeln(’MyTexte1=MyTexte2 : ‘, MyTexte1=MyTexte2); {Affiche TRUE
si les 2 sont identiques}
end.


Copy


Cette fonction retourne une partie bien précise d’une chaîne de caractères en fonction d’une position
specifiée. Voici la syntaxe :

Copy(Chaine : String, Debut : Integer, Long : Integer) : String;

Chaine représente la chaîne dans laquelle extraire les caractères, Debut
définit le caractère où commencer la copie et Long la longueur de la copie :

var MyTexte : String;

begin
MyTexte := ‘123456789′;
writeln(Copy(MyTexte, 3, 5)); {Sortie -> 34567}
writeln(Copy(MyTexte, 7, 3)); {Sortie -> 789}
end.


Delete


Cette procédure supprime des caractères d’une chaîne de caractères. Voici la syntaxe :

Delete(Chaine : String, Debut : Integer, Long : Integer);

Chaine représente la chaîne dans laquelle supprimer les caractères, Debut
définit le caractère où commencer la suppression et Long la longueur de la suppression :

var MyTexte : String;

begin
{123456789012345678901}
MyTexte := ‘Ceci est un gros trou’;
Delete(MyTexte, 13, 5); {Suppression de 5 caractères}
writeln(MyTexte); {Sortie -> Ceci est un trou}
end.


FillChar


FillChar permet d’inserer un caractère (type Char) ou un chiffre (type Byte)
un nombre de fois spécifiée dans une chaîne de caractères. Voici la syntaxe :

FillChar(Chaine : String, Nombre, Valeur);

FillChar correspond à la chaîne de caractères dans laquelle inserer Nombre
de fois Valeur :

var MyTexte : String[80];

begin
FillChar(MyTexte, 80, ‘$’);
writeln(MyTexte); {80 $}
end.


Insert


Cette procédure insere des caractères dans une chaîne de caractères. Voici la syntaxe :

Insert(Source : String, Destination : String, Debut : Integer);

Source représente la chaîne qui va être insérée dans la chaîne Destination
à partir du caractère Debut :

var MyTexte : String;
MyEnorme : String;

begin
MyTexte := ‘Ceci est un trou’;
MyEnorme := ‘enorme ‘;
Insert(MyEnorme, MyTexte, 13); {Insertion de la chaine MyEnorme dans MyTexte}
writeln(MyTexte); {Sortie -> Ceci est un enorme trou}
end.


Pos


Pos effectue la recherche d’une chaîne de caractère dans une autre. Voici sa syntaxe :

Pos(Recherche : String, Chaine : String) : Byte;

Recherche représente l’ocurence à rechercher dans la chaîne Chaine. La
valeur renvoyée correspond à la position de la chaine Recherche. En cas d’echec,
la valeur renvoyée est 0 :

var MyTexte : String;

begin
MyTexte := ‘Ceci est une phrase de sept mots’;
writeln(Pos(’phrase’, MyTexte)); {Sortie -> 14}
end.


Str


Cette procédure permet de convertir une variable numérique en une chaîne de caractères. Voici
la syntaxe :

Str(Nombre : Real, Chaine : String);

Nombre represente la variable numérique et Chaine, la chaîne de destination :

var MyNumber : Real;
MyTexte : String;

begin
MyNumber := Pi;
Str(MyNumber, MyTexte);
writeln(MyTexte);
end.


Val


Cette procédure effectue l’opération inverse à la procédure Str : elle convertit
une variable numérique en une chaîne de caractères. Voici la syntaxe :

Val(Chaine : String, Nombre : Real, Code : Integer);

Chaine represente la chaîne de caractère et Nombre, la variable de destination.
La variable Code renvoi un code d’erreur corespondant au caractère fautif de la chaîne
de caractères en cas d’erreur :

var MyNumber : Real;
MyTexte : String;
MyCode : Integer;

begin
MyTexte := ‘123456′;
Val(MyTexte, MyNumber, MyCode);
writeln(MyNumber);
end.


La table de caractères ASCII


La table de caractères ASCII est une table où sont regroupés les 256 caractères (numérotés de
0 à 255) pouvant être utilisés.

On peut afficher ces caractères en maintenant la touche Alt enfoncée et en tapant le code
du caractère désirés.

On peut aussi utiliser la fonction Chr. Cette fonction se charge d’afficher le caractère
ASCII correspondant au rang qui lui est transmis en argument.

Le programme suivant affiche les 256 caractères de la table :

var i : integer;

begin
for i := 0 To 255 Do
writeln(Chr(i));
end.


On peut aussi écrire le caractère en utilisant le caractère dièse (#) comme préfixe :

begin
writeln(#177);
end.

La fonction Ord effectue l’opération inverse et renvoi le code correspondant d’un caractère :

begin
writeln(Ord(’A')); {Renvoi 65}
end.


La casse


On peut modifier facilement la casse (MAJUSCULES/minuscules) d’une chaîne de caractères à l’aide
des fonctions suivantes :


StrUpper


Renvoi la chaîne de caractères transmise en argument en majuscules. Nécessite l’unité Strings :

uses strings;

begin
writeln(StrUpper(’bonjour’)); {Sortie -> BONJOUR}
end.


StrLower


Renvoi la chaîne de caractères transmise en argument en minuscules. Nécessite l’unité Strings :

uses strings;

begin
writeln(StrLower(’BONJOUR’)); {Sortie -> bonjour}
end.

Categories: Turbo Pascal Tags:

Turbo Pascal – Affichage du texte

This entry is part 17 of 24 in the series Turbo Pascal - Tutoriel
  1. ClrEol
  2. ClrScr
  3. DelLine
  4. GotoXY
  5. HighVideo
  6. InsLine
  7. LowVideo
  8. NormVideo
  9. TextBackground
  10. TextColor
  11. TextMode
  12. WhereX
  13. WhereY
  14. Window
  15. Les couleurs
  16. Les modes d’écran

On a vu à la page précédente comment traiter les chaînes de caractères avec Turbo Pascal. Nous
allons maintenant voir les différentes possibilités que nous offre ce langage pour les afficher
à l’écran.
Toutes ces procédures et fonctions nécessitent l’utilisation de l’unité crt. Vous
devez donc l’inclure en début de programme.

ClrEol

ClrEol efface la ligne où le curseur est placé, à partir de lui jusqu’à la fin de la ligne.
Exemple :

uses crt;

begin
writeln('Une ligne au dessus');
writeln('Une ligne au milieu');
writeln('Une ligne en dessous');
gotoXY(5, 2);{Voir ci-dessous pour gotoXY}
ClrEol; {On efface la ligne}
end.

ClrScr

ClrScr permet d’effacer l’écran.
Exemple :

uses crt;

begin
ClrScr;{On efface l'écran}
end.

DelLine

DelLine efface la totalité de la ligne du curseur, et décale toutes les lignes positionnées
en bas d’une ligne vers le haut
Exemple :

uses crt;

begin
writeln('1er ligne');
writeln('2ème ligne');
writeln('3ème ligne');
gotoXY(5, 2);{Voir ci-dessous pour gotoXY}
DelLine; {On efface la 2ème ligne}
end.

GotoXY

La syntaxe de GotoXY est la suivante :

GotoXY(X, Y : Byte);

GotoXY déplace le curseur à la Xème colonne et à la Yème
colonne.
Exemple :

uses crt;

begin
GotoXY(40, 12);{40ème colonnes et 12ème lignes}
write('*');
end.

HighVideo

HighVideo active la surbrillance, c’est à dire que le texte sera écrit avec une couleur
plus brillante que la normale.
Exemple :

uses crt;

begin
writeln('Texte ecrit normalement');
HighVideo;{On active la surbrillance}
writeln('Texte en surbrillance');
end.

InsLine

InsLine produit l’effet inverse de DelLine : InsLine insére une
ligne à partir de la ligne du curseur et décale toutes d’un cran vers le bas.
Exemple :

uses crt;

begin
writeln('1er ligne');
writeln('2ème ligne');
writeln('3ème ligne');
gotoXY(5, 2);
InsLine; {On insére une ligne}
end.

LowVideo

LowVideo produit l’effet contraire de HighVideo : au lieu d’activer la surbrillance,
LowVideo active une « sous-brillance ».
Exemple :

uses crt;

begin
writeln('Texte écrit normalement');
LowVideo;{On active la "sous brillance"}
writeln('Texte écrit moins fort');
end.

NormVideo

NormVideo permet de revenir au mode normal.
Exemple :

uses crt;

begin
HighVideo;
writeln('Texte écrit en surbrillance');
NormVideo;{Retour à la normale}
writeln('Texte normal');
end.

TextBackground

TextBackGround permet de définir la couleur de fond du texte. Voir ci-dessous pour le choix
des couleurs. Attention! Seul les 8 premières couleurs (0 à 7) sont possibles.
Exemple :

uses crt;

begin
TextBackground(Red);{Fond rouge}
writeln('Texte sur fond rouge');
end.

TextColor

TextColor définit la couleur du texte.
Exemple :

uses crt;

begin
TextColor(LightGreen);{Texte vert clair}
writeln('Ceci est un texte vert clair');
end.

TextMode

TextMode sélectionne un mode texte. Voir ci-dessous pour les différents modes disponibles.
Exemple :

uses crt;

begin
TextMode(CO40);{40 colonnes et 25 lignes}
writeln('Ceci est du texte');
end.

WhereX

WhereX renvoit la colonne où est placé le curseur.
Exemple :

uses crt;

begin
gotoXY(27, 1);
writeln('Le curseur est sur la ', WhereX, 'ème colonne');
{Renvoi 27}
end.

WhereY

WhereY est similaire à WhereY dans la mesure où celui-ci renvoi la ligne
où est placé le curseur et non pas la colonne.
Exemple :

uses crt;

begin
gotoXY(1, 12);
writeln('Le curseur est sur la ', WhereY, 'ème ligne');
{Renvoi 12}
end.

Window

Window crée une nouvelle fenêtre à l’écran. Voici la syntaxe :

Window(X1, Y1, X2, Y2 : Byte);

X1 et Y1 représentent les coordonnées du coin supérieur gauche, et
X2 et Y2 le coin inférieur droit.
Exemple :

uses crt;

begin
Window(10, 10, 25, 25);{Création d'une fenêtre}
Writeln('Ceci est du texte dans la fenêtre');
end.

Les couleurs

Si on ce limite à son utilisation classique, Turbo Pascal est limité à l’utilisation de 16 couleurs.
On peut alors utiliser son Index (son numéro), ou bien sa constante. Cette deuxième solution est
recommandée.
Voici les différentes couleurs :

Index Constante Aperçu
0 Black  
1 Blue  
2 Green  
3 Cyan  
4 Red  
5 Magenta  
6 Brown  
7 LightGray  
8 DarkGray  
9 LightBlue  
10 LightGreen  
11 LightCyan  
12 LightRed  
13 LightMagenta  
14 Yellow  
15 White  

À noter que l’on peut faire clignoter une couleur en ajoutant 128 à son index, ou bien la constante
Blink.
Exemple :

uses crt;

begin
TextColor(Red + Blink);{Texte rouge clignotant}
writeln('Ce texte est rouge et il clignote');
end.

Les modes d’écran

5 modes textes sont disponibles. Comme pour les couleurs, ils est possibles d’utiliser l’index
ou la constante.

Index Constante Description
0 BW40 Noir et blanc, 40×25
1 CO40 ou C40 Couleur, 40×25
2 BW80 Noir et blanc, 80×25
3 CO80 ou C80 Couleur, 80×25
7 Mono Monochrome, 80×25
Categories: Turbo Pascal Tags:

Turbo Pascal – Le son

This entry is part 18 of 24 in the series Turbo Pascal - Tutoriel
  1. Bip
  2. Sound

Il existe plusieurs façons de faire du son avec Turbo Pascal. Les méthodes qui vont suivrent permettent d’utiliser le haut-parleur interne du PC.
Pour la carte son, il faut employer des moyens détournés.

Bip

Pour faire un bip, une méthode bien connue est d’utiliser le caractère de controle de la table ASCII correpondant, qui est le 7.
On peut dont écrire :

begin
write(chr(7));{BIP!}
write(#7);{Re-BIP!}
end.

Sound

Une seconde possibilité plus souple est l’appel à Sound, qui demande l’emploi de l’unité crt.
Sound demande un argument qui représente la fréquence en Hertz du son à émmetre.
Voici un tableau qui permet de se retrouver entre les différentes vibrations :





























































NOTE Octaves
1 2 3 4
Do 131 262 523 1047
147 294 587 1175
Mi 165 330 659 1319
Fa 176 349 698 1397
Sol 196 392 784 1568
La 220 440 880 1720
Si 247 494 988 1976

Le La du diapason est, parait-il, situé sur la 2ème octave.
Donc, on peut écrire :

uses crt;

begin
Sound(440);{LAAAAAAAA}
end.

Oui, mais là (:-)), problème : le haut-parleur ne s’arrête plus!
Il faut alors recourir à une seconde instruction : NoSound.
NoSound arrete tout bêtement le haut-parleur :

uses crt;

begin
Sound(440);{LAAAAAAAA}
NoSound;{On arrete}
end.

Cette fois-ci, ça s’arrete. Mais ça se passe tellement vite que l’on a même plus le temps d’entendre.
Il existe alors plusieurs possibilité de temporiser : avec des boucles, avec un readln
On peut aussi utiliser Delay (qui est aussi compris dans l’unité crt). Delay suspend l’execution du programme pendant
le nombre de mili-secondes qui lui sont transmises en arguments.
Donc, pour faire un la de 1,5 s, on écrira :

uses crt;

begin
Sound(440);{LAAAAAAAA}
Delay(1500);{Pendant 1.5s}
NoSound;{On arrete}
end.
Categories: Turbo Pascal Tags:

Turbo Pascal – Graphismes

This entry is part 19 of 24 in the series Turbo Pascal - Tutoriel
  1. Initialisation
  2. Dessiner
  3. Styles de lignes
  4. Couleurs et remplissage
  5. Obtenir les états

Turbo Pascal n’est pas limité au seul affichage de texte. Il peut également utiliser des fonctions graphiques
qui lui permettent de réaliser des dessins plus ou moins sophistiqués.
La totalité de ces fonctions sont situées dans l’unité graph.

Initialisation

Avant toute utilisation des fonctions graphiques, il faut initaliser le système avec l’instruction InitGraph.
La syntaxe est la suivante :

InitGraph(Pilote, Mode, Chemin);
  • Pilote représente le pilote graphique de la machine
  • Mode correspond au mode graphique
  • Chemin est l’emplacement du répertoire BGI sur votre machine

Les 2 premiers arguments doivent être des variables. Les valeurs que peut prendre Pilote sont les suivantes :

Constantes Valeurs Constantes Valeurs
Detect 0 IBM8514 6
CGA 1 HercMono 7
MCGA 2 ATT400 8
EGA 3 VGA 9
EGA64 4 PC3270 10
EGAMono 5

Detect permet de réaliser une auto-détéction (voir plus loin).
Pour les modes graphique, ce peut être une des valeurs suivantes :

Constantes Valeurs Résolutions Constantes Valeurs Résolutions
CGAC0 0 320 x 200 EGALo 0 640 x 200
CGAC1 1 320 x 200 EGAHi 1 640 x 350
CGAC2 2 320 x 200      
CGAC3 3 320 x 200 EGA64Lo 0 640 x 200
CGAHi 4 640 x 200 EGA64Hi 1 640 x 350
           
MCGAC0 0 320 x 200 ATT400C0 0 320 x 200
MCGAC1 1 320 x 200 ATT400C1 1 320 x 200
MCGAC2 2 320 x 200 ATT400C2 2 320 x 200
MCGAC3 3 320 x 200 ATT400C3 3 320 x 200
MCGAMed 4 640 x 200 ATT400Med 4 640 x 200
MCGAHi 5 640 x 480 ATT400Hi 5 640 x 400
           
EGAMonoHi 3 640 x 350 IBM8514Lo 0 640 x 480
HercMonoHi 0 720 x 348 IBM8514Hi 1 1024 x 768
           
VGALo 0 640 x 200 PC3270Hi 0 720 x 350
VGAMed 1 640 x 350
VGAHi 2 640 x 480

Le mode utilisé doit correspondre au pilote utilisé (logique), sauf si vous utiliser l’auto-détéction (voir plus loin).
Voici un exemple :

Uses Graph;
VarPilote : Integer;{Variable pour le pilote}
Mode : Integer;{Variable pour le mode}
begin
Pilote := VGA;
Mode := VGAHi;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
CloseGraph;
end.

Vous remarquez que l’on a utiliser l’instruction CloseGraph. CloseGraph doit être appelé à chaque fois en fin de programme.
Il désactive le mode graphique et permet de libérer les divers secteur de mémoire occupés par les méthodes graphques.
Pour réaliser une auto-détection, il suffit d’utiliser Detect pour le pilote. La variable Mode n’a plus besoin d’être
initialisée :

Uses Graph;
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
CloseGraph;
end.

Dessiner

Après avoir initialisé le système, il devient enfin possible d’utiliser les fonctions graphiques.
Les fonctions regroupées dans le tableau ci-dessous sont celles permettant de tracer des formes quelconques
à l’écran.

Fonctions de dessin
Fonction Description
Arc Dessine un arc de cercle à l’écran.
X et Y representent le centre de l’arc,
AngleDeb est l’angle de départ de l’arc, AngleFin
celui de fin et Rayon le rayon de l’arc.
Les angles sont exprimés en degrès.
Syntaxe :

Arc(X, Y: Integer; AngleDeb, AngleFin, Rayon: Word);
Bar Dessine un rectangle plein.
x1 et y1 represente le coin supérieur gauche et
x2 et y2 le coin inférieur droit.
La couleur et le style de remplissage est défini par SetFillStyle
ou SetFillPattern (voir plus loin).
Syntaxe :

Bar(x1, y1, x2, y2: Integer);
Bar3D Réalise la même chose que Bar, mais en 3D.
Profond represente la taille en pixel du contour.
Les valeurs possible pour Top sont les constantes TopOn (true)
et TopOff (false).
Si Top vaut TopOn, alors une face supérieure est dessinée.
Syntaxe :

Bar3D(x1, y1, x2, y2: Integer; Profond: Word; Top: Boolean);
Circle Dessine un cercle de centre X et Y, et de rayon Rayon.
Syntaxe :

Circle(X, Y: Integer; Rayon: Word);
DrawPoly Dessine un polygone vide de NbPoints sommets.
Les coordonnées de ces sommets sont définis dans la variable PolyPoints du type
PointType.
Syntaxe :

DrawPoly(NbPoints: Word; var PolyPoints);

Exemple :

Uses Graph;
ConstFrance : array[1..9] of PointType = ((X:0; Y:20),
(X:100; Y:0), (X:200; Y:20), (X:150; Y:150),
(X:200; Y:280), (X:100; Y:300),(X:0; Y:280),
(X:50; Y:50), (X:0; Y:20));
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
DrawPoly(SizeOf(France) div SizeOf(PointType), France);
CloseGraph;
end.
Ellipse Dessine une ellipse de centre X et Y.
AngleDeb et AngleFin representent les angles de début et de fin, en degrès.
XRayon et YRayon representent la distance entre le centre et la tangente verticale
et la tangente horizontale.
Syntaxe :

Ellipse(X, Y: Integer; AngleDeb, AngleFin: Word; XRayon, YRayon: Word);
FillEllipse Réalise la même chose que Ellipse, mais remplit la forme.
Il n’y a donc pas d’angles de départ et de fin.
Syntaxe :

FillEllipse(X, Y: Integer; XRayon, YRayon: Word);
FillPoly Réalise la même chose que DrawPoly, mais remplit le polygone.
Syntaxe :

FillPoly(NbPoints: Word; var PointsPoly);
Line Trace une ligne du point x1 et y1 au point x2 et y2.
Syntaxe :

Line(x1, y1, x2, y2: Integer);
LineRel Trace à une ligne à partir de la position du curseur graphique (voir plus loin).
Dx et Dy represente la distance sur X et sur Y à parcourir à partir de la
position du curseur graphique.
Syntaxe :

LineRel(Dx, Dy: Integer);
LineTo Trace à une ligne à partir de la position du curseur graphique, jusqu’au point de
coordonnées X et Y.
Syntaxe :

LineTo(X, Y: Integer);
MoveRel Déplace le curseur graphique de Dx pixels sur l’axe des X et de Dy pixels
sur l’axe des Y.
Syntaxe :

MoveRel(Dx, Dy: Integer);
MoveTo Déplace le curseur graphique à la positon X et Y.
Syntaxe :

MoveTo(X, Y: Integer);
PieSlice Réalise la même chose que Arc, mais remplit la forme.
Syntaxe :

PieSlice(X, Y: Integer; AngleDeb, AngleFin, Rayon: Word);
PutPixel Dessine un point au coordonnées X et Y de couleur Pixel.
Syntaxe :

PutPixel(X, Y: Integer; Pixel: Word);
Rectangle Trace un rectangle du coin supérieur gauche de coordonnées x1 et y1, au
coin inférieur droit de coordonnées x2 et y2.
Syntaxe :

Rectangle(x1, y1, x2, y2: Integer);
Sector Réalise la même chose que Ellipse, mais remplit la forme. Contrairement à FillEllipse,
il est possible de spécifier un angle.
Syntaxe :

Sector(x, y: Integer; AngleDeb, AngleFin, XRayon, YRayon: Word);

Styles de lignes

Par défaut, les figures énoncées ci-dessus sont tracées avec des lignes pleines. Mais il est possible de modifier
ce comportement. Il faut pour cela utiliser SetLineStyle, dont voici la syntaxe :

SetLineStyle(Style, Motif, Epaisseur: Word);

Style represente le style de ligne à appliquer. Ce peut être une des valeurs suivantes :

Styles de lignes
Index Constante Description
0 SolidLn Trait plein
1 DottedLn Pointillés
2 CenterLn Trait mixte
3 DashedLn Trait tireté
4 UserBitLn Définit par l’utilisateur

Motif n’est utilisé que si le parametre Style est à UserBitLn.
Dans ce cas, il vous faudra fournir un entier codé sur 16 bits (Word). Chaque bit
de ce nombre représentera alors un pixel. Si le bit est à 1, le pixel sera affiché, si il est
à 0 il sera eteint.
Ainsi, si Motif vaut 61901, on aura :

1111000111001101

Ce qui pourai être symbolisé grossierement par :

____   ___  __ _

Epaisseur represente…l’épaisseur de la ligne. Ce peut être une des valeurs suivantes :

Constantes d’épaisseur
Index Constante Description
1 NormWidth Trait normal
3 ThickWidth Trait épais

Couleurs et remplissage

Toutes ces fonctions tracent des formes suivant les couleurs et le style de remplissage sélectionné. Pour séléctionner
une couleur, on utilise la procédure SetColor, associée à l’index de la couleur séléctionnée.
Voici un rappel des couleurs disponibles :

Index Constante Aperçu
0 Black  
1 Blue  
2 Green  
3 Cyan  
4 Red  
5 Magenta  
6 Brown  
7 LightGray  
8 DarkGray  
9 LightBlue  
10 LightGreen  
11 LightCyan  
12 LightRed  
13 LightMagenta  
14 Yellow  
15 White  

Par exemple, pour tracer un cercle rouge, on écrira :

Uses Graph;
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
SetColor(Red);{Premier plan rouge}
Circle(50, 50, 50);
CloseGraph;
end.

Il est également possible de définir une couleur de fond avec SetBkColor :

Uses Graph;
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
SetColor(Red);{Premier plan rouge}
SetBkColor(LightGreen);{Arrière plan vert-pale}
Circle(50, 50, 50);
CloseGraph;
end.

Comme vu dans le tableau plus haut, certaines fonctions autorisent le remplissage des figures, comme par
exemple FillPoly ou FillEllipse.
Avant de faire appel à l’une de ces fonctions, il faut d’abord définir le style de remplissage. On utilise
alors SetFillStyle.
Voici la syntaxe de SetFillStyle :

SetFillStyle(Pattern, Couleur: Word);

Couleur represente la couleur de remplissage et Pattern le motif, qui peut être une des valeurs
ci-dessous :

Motifs de remplissage
Index Constante Description
0 EmptyFill Couleur du fond (transparent)
1 SolidFill Couleur du tracé
2 LineFill Lignes horizontales
3 LtSlashFill Slashs
4 SlashFill Slashs épais
5 BkSlashFill Anti-Slashs épais
6 LtBkSlashFill Anti-Slashs
7 HatchFill Quadrillage
8 XHatchFill Quadrillage en diagonales
9 InterleaveFill Ecailles de poissons
10 WideDotFill Points espacés
11 CloseDotFill Points sérés
12 UserFill Motif définit par l’utilisateur (voir plus loin)

Par exemple, pour tracer un rectangle bleu clair en ecailles de poisson, on écrira :

Uses Graph;
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
SetFillStyle(InterLeaveFill, LightBLue);
Bar(0, 0, 300, 100);
CloseGraph;
end.

Vous remarquez que le dernier motif UserFill peut-être personalisé. Pour créer un motif utilisateur,
il faut utiliser SetFillPattern dont la syntaxe est la suivante :

SetFillPattern(Pattern: FillPatternType; Couleur: Word);

Pour Couleur, pas de problèmes. Pour FillPatternType en revanche, ça se complique.
Le type FillPatternType est le suivant :

FillPatternType = ARRAY[1..8] OF BYTE;

On voit que c’est un tableau de 8 octets (BYTE).
Un motif est en fait un carré de 8×8 pixels. Selon le motif
sélectionné, on affiche ou non un pixel.
Chaque octet de FillPatternType represente une ligne de ce carré de 8×8. Et dans un octet, il y a
8 bits (voir la numération). Chaque bit de cet octet représente un pixel de la ligne :
quand il est à 1, on affiche le pixel, quand il est à 0, on l’éteint.
Par exemple, essayons de créer comme motif le symbole @ (ça va pas être si dur que ça :-) ). Tout
d’abord écrivons nos 8 octets :

0 0 1 1 1 1 0 0-> 60
0 1 0 0 0 0 1 0-> 66
1 0 1 1 1 1 0 1-> 189
1 0 1 0 0 1 0 1-> 165
1 0 1 0 0 1 1 0-> 166
1 0 1 1 1 1 0 0-> 188
0 1 0 0 0 0 1 0-> 66
0 0 1 1 1 1 0 0-> 60

Nous pouvons donc maintenant définir notre motif et le tester :

Uses Graph;
Const
Arob : FillPatternType = (60, 66, 189, 165, 166, 188, 66, 60);
VarPilote : Integer;
Mode : Integer;
begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
SetFillPattern(Arob, White);
Bar(0, 0, 300, 100);
CloseGraph;
end.

Ok, ce n’est pas très joli. Si vous en faites des plus beau, envoyez les moi.

En dehors des fonctions qui permettent un remplissage automatique, il est aussi possible de remplir des formes
fermées, un peu comme avec un logiciel d’infographie.
Pour cela, il faut utiliser FloodFill. FloodFill remplit une surface du point X et Y
jusqu’à ce que la couleur Bord soit rencontrée.
Voici la syntaxe :

FloodFill(X, Y: Integer; Bord: Word);

Obtenir les états

Pour programmer plus facilement, le Turbo Pascal dispose de plusieurs fonctions permettant au programmeur
de connaitre les états de plusieurs parametres. Voici ces fonctions :

Fonction Description
GetArcCoords Modifie la variable ArcCoords du type ArcCoordsType transmise en argument
avec les coordonnées transmises à Arc lors de son dernier appel.
Voici le type ArcCoordsType :

ArcCoordsType = RECORD
  X, Y,
  Xstart, Ystart,
  Xend, Yend : INTEGER;
END;
GetBkColor Renvoi l’index de la couleur de fond d’écran utilisée.
GetColor Renvoi l’index de la couleur de premier plan utilisée.
GetDriverName Renvoi une chaîne de caractères renvoyant le nom du pilote graphique utilisé.
GetFillPattern Modifie la variable FillPattern transmise en argument avec le motif de remplissage
defini par l’utilisateur avec SetFillPattern.
GetFillSettings Modifie la variable FillInfo transmise en argument avec les informations de remplissage
courant.
Voici le type FillSettingsType :

FillSettingsType = RECORD
  Pattern : WORD;
  Color   : WORD;
END;
GetGraphMode Renvoi l’index du mode graphique utilisé.
GetLineSettings Modifie la variable LineInfo transmise en arguments avec les informations de style de
ligne courant.
GetMaxColor Renvoi l’index de la couleur la plus haute pouvant être utilisé.
GetMaxMode Renvoi l’index du mode graphique le plus haut pouvant être utilisé avec le pilote courant.
GetMaxX Renvoi le numéro de la colonne le plus à droite (autrement dit, la largeur de l’écran).
GetMaxY Renvoi le numéro de la ligne la plus basse (autrement dit, la hauteur de l’écran).
GetModeName Renvoi une chaîne de caractère représentant le nom du mode graphique correspondant à l’index
transmis en argument.
GetModeRange Modifie les variables ModeInf et ModeSup transmises en argument avec respectivement
le plus petit et le plus grand index utilisables par le pilote spécifié comme mode graphique.
Syntaxe :

GetModeRange(PiloteGraph: Integer; var ModeInf, ModeSup:Integer);
GetPixel Renvoi la couleur du pixel situé aux coordonnées X et Y.
Syntaxe :

GetPixel(X, Y: Integer): Word;
GetX Renvoi la position X du curseur graphique
GetY Renvoi la position Y du curseur graphique
Categories: Turbo Pascal Tags:

Turbo Pascal – L’unité Graph et le texte

This entry is part 20 of 24 in the series Turbo Pascal - Tutoriel
  1. Ecrire
  2. Changement de style d’écriture
  3. Taille des caractères
  4. Justification
  5. Retrouver les parametres

Vous aurez certainement remarqué que le texte écrit par les méthodes standards comme write ou
writeln n’est pas des plus présentable.
L’unité Graph permet de remedier à ce détail de mise en forme et de pouvoir utiliser plusieurs
style de polices.

Pour utiliser ces fonctions et procédures, il faut initialiser le système pour le mode graphique, comme précisé
à la page précédente.
Petit rappel :

uses graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
CloseGraph;
end.

Ecrire

Ensuite, pour écrire, on utilise la procédure OutText, qui ne prend qu’un seul argument : la chaîne
de caractères à afficher :

uses graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
OutText('Hello! It''s me!');{Affiche Hello! It's me! à l'écran}
CloseGraph;
end.

Une alternative à OutText est OutTextXY. OutTextXY prend 2 arguments supplémentaires
qui sont les coordonnées X et Y de l’endroit où afficher la chaîne de caractères.
Ainsi :

uses graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
OutTextXY(100, 200, 'Hello! It''s me!');{X = 100, Y = 200}
CloseGraph;
end.

Changement de style d’écriture

Pour changer de style d’écriture, c’est à dire changer de police, de taille de caractères, de direction d’écriture,
il faut utiliser la procédure SetTextStyle.
Voici la syntaxe :

SetTextStyle(Police, Direction, TailleCar : Word);

Police represente la police de caractère à utiliser. Ce peut être l’une des constantes suivantes :

Polices de caractères
Index Constante Description
0 DefaultFont La police par défaut
1 TriplexFont Triplex (style Impact)
2 SmallFont Petite police
3 SansSerifFont Sans serif
4 GothicFont Gothic

Il existe bien d’autres polices que celles citées plus haut. Les polices de caractères sont contenues dans des
fichiers dont l’extension est .chr. Il sont situés dans le repertoire bgi de Turbo
Pascal.
Pour les installer, il faut faire appel à la fonction InstallUserFont. InstallUserFont reçoit
un argument qui represente le nom de la police à installé et renvoi un Integer qui correspond à l’index
de la police. Vous pouvez ensuite utiliser cette index comme si vous utilisier une constante :

var Index : Integer;

begin
Index := InstallUserFont('euro');
end.

Direction caractèrise le sens d’affichage du texte. De gauche à droite ou de bas en haut. Les
valeurs possibles sont les suivantes :

Constantes de direction
Index Constante Description
0 HorizDir Sens horizontal, de gauche à droite
1 VertDir Sens vertical, de bas en haut

Et pour finir, l’argument TailleCar represente la taille du texte à afficher. Cette dimension
ne correspond à rien de précis, puisque la taille du texte affiché différe sensiblement d’une police à une
autre.
Si TailleCar vaut 0 (ou bien à la constante UserCharSize), la taille des caractères pourront
être définis par le programmeur (voir plus loin).
Voici un exemple d’utilisation de SetTextStyle :

uses graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'c:\outils\tp\bgi');
SetTextStyle(GothicFont, VertDir, 4);{Police Gothic, vertical, taille 4}
OutTextXY(100, 200, 'Hello! It''s me!');
CloseGraph;
end.

Taille des caractères

Pour savoir quelles dimensions occupe une chaîne de caractères (par exemple, pour la centrer), on utilise
les fonctions TextWidth et TextHeight.
Ces deux fonctions renvoient respectivement la largeur et la hauteur en pixels de la chaîne de caractères qui leur
est passée en argument.
Donc, pour centrer un texte à l’écran, on écrira par exemple :

uses Graph;

varPilote : Integer;
Mode : Integer;
LeTexte : String;

begin
Write('Entrer le texte à afficher : ');
Read(LeTexte);

Pilote := Detect;
InitGraph(Pilote, Mode, 'C:\outils\Tp\BGI');
SetTextStyle(GothicFont, HorizDir, 4);

OutTextXY((GetMaxX - TextWidth(LeTexte)) div 2,
(GetMaxY - TextHeight(LeTexte)) div 2, LeTexte);

CloseGraph;
end.

Si vous avez donné la valeur UserCharSize à l’attribut TailleCar de la procédure
SetTextStyle, vous pouvez faire varier la taille des caractères des polices vectorielles à l’aide
de la procédure SetUserCharSize.
Voici la syntaxe de cette procédure :

SetUserCharSize(MultX, DivX, MultY, DivY : Word);

MultX et DivX represente le rapport à appliquer à la largeur de la police, et
MultY et DivY le rapport vertical.
En clair, il s’agit d’une échelle MultX/DivX comme pour les cartes IGN et le guide Michelin.
Pour doubler la largeur, on donnera la valeur de 2 à MultX et de 1 à DivX, ce qui dera 2/1.
À l’inverse, pour avoir la moitié, on inversera les valeur pour avoir un rapport de 1/2.
Voici un exemple :

uses Graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'C:\outils\tp\bgi');
SetTextStyle(GothicFont, HorizDir, UserCharSize);
SetUserCharSize(2, 1, 1, 2);{Largeur * 2, Hauteur / 2}
OutText('Hello! It''s me !');
CloseGraph;
end.

Justification

Lorsque l’on spécifie des coordonnées à OutTextXY, le point transmis est considéré comme étant
le coin supérieur gauche où débuter le texte. Il est cependant possible de modifier ce comportement en faisant
appel à la procédure SetTextJustify. Cet procédure prend 2 arguments, le premier pour la justification
horizontale, et le deuxième pour la justification verticale. Les valeurs possibles sont les suivantes :

Constantes de justification
Index Constante Signification
0 LeftText Gauche, axe horizontal
1 CenterText Centre, axe horizontal
2 RightText Droite, axe horizontal
0 BottomText Bas, axe vertical
1 CenterText Centre, axe vertical
2 TopText Haut, axe vertical

Ainsi, pour écrire dans le coin inférieur droit sans difficultés, il suffira d’écrire :

uses graph;

varPilote : Integer;
Mode : Integer;

begin
Pilote := Detect;
InitGraph(Pilote, Mode, 'C:\outils\tp\bgi');
SetTextJustify(RightText, BottomText);{Coin inférieur droit}
OutTextXY(GetMaxX, GetMaxY, 'Ce coin est le coin inférieur droit');
CloseGraph;
end.

Retrouver les parametres

Il est possible de retrouver très facilement les valeurs des parametres transmis à SetTextStyle
et à SetTextJustify à l’aide de la procédure GetTextSettings. On passe à cette procédure une variable
du type TextSettingsType qui sera modifiée par référence.
Voici le type TextSettingsType :

TextSettingsType = RECORD
  Font      : WORD;
  Direction : WORD;
  CharSize  : WORD;
  Horiz     : WORD;
  Vert      : WORD;
END;
Categories: Turbo Pascal Tags: