Pascal - Guide rapide

Pascal est un langage de haut niveau à usage général qui a été développé à l'origine par Niklaus Wirth au début des années 1970. Il a été développé pour enseigner la programmation en tant que discipline systématique et pour développer des programmes fiables et efficaces.

Pascal est un langage basé sur Algol et comprend de nombreuses constructions d'Algol. Algol 60 est un sous-ensemble de Pascal. Pascal propose plusieurs types de données et structures de programmation. Il est facile de comprendre et de maintenir les programmes Pascal.

Pascal a gagné en popularité dans le domaine de l'enseignement et des universitaires pour diverses raisons:

  • Facile à apprendre.
  • Langage structuré.
  • Il produit des programmes transparents, efficaces et fiables.
  • Il peut être compilé sur une variété de plates-formes informatiques.

Caractéristiques du langage Pascal

Pascal a les caractéristiques suivantes -

  • Pascal est un langage fortement typé.
  • Il offre une vérification complète des erreurs.
  • Il propose plusieurs types de données tels que des tableaux, des enregistrements, des fichiers et des ensembles.
  • Il offre une variété de structures de programmation.
  • Il prend en charge la programmation structurée à travers des fonctions et des procédures.
  • Il prend en charge la programmation orientée objet.

Faits sur Pascal

  • Le langage Pascal a été nommé en l'honneur de Blaise Pascal, mathématicien français et pionnier du développement informatique.

  • Niklaus Wirth a terminé le développement du langage de programmation Pascal original en 1970.

  • Pascal est basé sur le style structuré par blocs du langage de programmation Algol.

  • Pascal a été développé comme un langage adapté à l'enseignement de la programmation en tant que discipline systématique, dont les implémentations pourraient être à la fois fiables et efficaces.

  • La norme ISO 7185 Pascal a été publiée à l'origine en 1983.

  • Pascal était le principal langage de haut niveau utilisé pour le développement dans Apple Lisa et dans les premières années du Mac.

  • En 1986, Apple Computer a publié la première implémentation Object Pascal, et en 1993, le Pascal Standards Committee a publié une extension orientée objet vers Pascal.

Pourquoi utiliser Pascal?

Pascal permet aux programmeurs de définir des types de données structurées complexes et de créer des structures de données dynamiques et récursives, telles que des listes, des arbres et des graphiques. Pascal offre des fonctionnalités telles que des enregistrements, des énumérations, des sous-plages, des variables allouées dynamiquement avec des pointeurs et des ensembles associés.

Pascal autorise les définitions de procédures imbriquées à n'importe quel niveau de profondeur. Cela fournit vraiment un excellent environnement de programmation pour l'apprentissage de la programmation en tant que discipline systématique basée sur les concepts fondamentaux.

Parmi les implémentations les plus étonnantes de Pascal sont -

  • Skype
  • Commandant total
  • TeX
  • Macromedia Captivate
  • Apple Lisa
  • Divers jeux PC
  • Systèmes embarqués

Il existe plusieurs compilateurs et interprètes Pascal disponibles pour une utilisation générale. Parmi ceux-ci sont -

  • Turbo Pascal - fournit un IDE et un compilateur pour exécuter des programmes Pascal sur CP / M, CP / M-86, DOS, Windows et Macintosh.

  • Delphi- fournit des compilateurs pour exécuter Object Pascal et génère du code natif pour les systèmes d'exploitation Windows 32 et 64 bits, ainsi que pour Mac OS X et iOS 32 bits. Embarcadero prévoit de développer la prise en charge du système d'exploitation Linux et Android.

  • Free Pascal- c'est un compilateur gratuit pour exécuter des programmes Pascal et Object Pascal. Le compilateur Free Pascal est un compilateur Pascal 32 et 64 bits compatible avec Turbo Pascal et Delphi pour Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS et plusieurs autres plates-formes.

  • Turbo51 - Il s'agit d'un compilateur Pascal gratuit pour la famille de microcontrôleurs 8051, avec la syntaxe Turbo Pascal 7.

  • Oxygene - Il s'agit d'un compilateur Object Pascal pour les plates-formes .NET et Mono.

  • GNU Pascal (GPC) - C'est un compilateur Pascal composé d'un frontal vers GNU Compiler Collection.

Nous utiliserons Free Pascal dans ces tutoriels. Vous pouvez télécharger Free Pascal pour votre système d'exploitation à partir du lien: Télécharger Free Pascal

Installer Free Pascal sur Linux

La distribution Linux de Free Pascal se présente sous trois formes -

  • une tar.gz version, également disponible sous forme de fichiers séparés.

  • une .rpm (Red Hat Package Manager) version.

  • une .deb (Debian) version.

Code d'installation pour la version .rpm ::

rpm -i fpc-X.Y.Z-N.ARCH.rpm

Où XYZ est le numéro de version du fichier .rpm et ARCH est l'une des architectures prises en charge (i386, x86_64, etc.).

Code d'installation pour la version Debian (comme Ubuntu) -

dpkg -i fpc-XXX.deb

Où XXX est le numéro de version du fichier .deb.

Pour plus de détails, lisez: Guide d'installation gratuit de Pascal

Installer Free Pascal sur Mac

Si vous utilisez Mac OS X, le moyen le plus simple d'utiliser Free Pascal est de télécharger l'environnement de développement Xcode à partir du site Web d'Apple et de suivre les instructions d'installation simples. Une fois que vous avez configuré Xcode, vous pourrez utiliser le compilateur Free Pascal.

Installer Free Pascal sur Windows

Pour Windows, vous téléchargerez le programme d'installation de Windows, setup.exe. Il s'agit d'un programme d'installation habituel. Vous devez suivre les étapes suivantes pour l'installation -

  • Sélectionnez un répertoire.

  • Sélectionnez les parties du package que vous souhaitez installer.

  • Choisissez éventuellement d'associer les extensions .pp ou .pas à l'IDE Free Pascal.

Pour plus de détails, lisez: Guide d'installation gratuit de Pascal

Éditeur de texte

Cela sera utilisé pour taper votre programme. Quelques exemples d'éditeurs incluent le Bloc-notes Windows, la commande d'édition du système d'exploitation, Brief, Epsilon, EMACS et vim ou vi.

Le nom et la version de l'éditeur de texte peuvent varier selon les systèmes d'exploitation. Par exemple, le Bloc-notes sera utilisé sous Windows et vim ou vi peut être utilisé sur Windows ainsi que Linux ou UNIX.

Les fichiers que vous créez avec votre éditeur sont appelés fichiers source et contiennent le code source du programme. Les fichiers source des programmes Pascal sont généralement nommés avec l'extension.pas.

Avant de commencer votre programmation, assurez-vous d'avoir un éditeur de texte en place et que vous avez suffisamment d'expérience pour écrire un programme informatique, l'enregistrer dans un fichier, le compiler et enfin l'exécuter.

Avant d'étudier les blocs de construction de base du langage de programmation Pascal, examinons une structure de programme Pascal minimale afin de pouvoir la prendre comme référence dans les chapitres à venir.

Structure du programme Pascal

Un programme Pascal se compose essentiellement des parties suivantes -

  • Nom du programme
  • Utilise la commande
  • Déclarations de type
  • Déclarations constantes
  • Déclarations de variables
  • Déclarations de fonctions
  • Déclarations de procédures
  • Bloc de programme principal
  • Déclarations et expressions dans chaque bloc
  • Comments

Chaque programme pascal a généralement une instruction d'en-tête, une déclaration et une partie exécution strictement dans cet ordre. Le format suivant montre la syntaxe de base d'un programme Pascal -

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Exemple de Pascal Hello World

Voici un simple code pascal qui afficherait les mots "Hello, World!" -

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

Cela produira le résultat suivant -

Hello, World!

Regardons différentes parties du programme ci-dessus -

  • La première ligne du programme program HelloWorld; indique le nom du programme.

  • La deuxième ligne du programme uses crt; est une commande de préprocesseur, qui indique au compilateur d'inclure l'unité crt avant de passer à la compilation réelle.

  • Les lignes suivantes incluses dans les instructions begin et end constituent le bloc principal du programme. Chaque bloc de Pascal est enfermé dans unbegin déclaration et un enddéclaration. Cependant, l'instruction de fin indiquant la fin du programme principal est suivie d'un point (.) Au lieu d'un point-virgule (;).

  • le begin l'instruction du bloc de programme principal est l'endroit où commence l'exécution du programme.

  • Les lignes à l'intérieur (*...*) sera ignoré par le compilateur et il a été mis pour ajouter un comment dans le programme.

  • La déclaration writeln('Hello, World!');utilise la fonction writeln disponible dans Pascal qui provoque le message "Hello, World!" à afficher à l'écran.

  • La déclaration readkey;permet à l'affichage de se mettre en pause jusqu'à ce que l'utilisateur appuie sur une touche. Il fait partie de l'unité crt. Une unité est comme une bibliothèque en Pascal.

  • La dernière déclaration end. met fin à votre programme.

Compiler et exécuter le programme Pascal

  • Ouvrez un éditeur de texte et ajoutez le code mentionné ci-dessus.

  • Enregistrez le fichier sous hello.pas

  • Ouvrez une invite de commande et accédez au répertoire dans lequel vous avez enregistré le fichier.

  • Tapez fpc hello.pas à l'invite de commande et appuyez sur Entrée pour compiler votre code.

  • S'il n'y a pas d'erreurs dans votre code, l'invite de commande vous amènera à la ligne suivante et générera hello fichier exécutable et hello.o fichier objet.

  • Maintenant, tapez hello à l'invite de commande pour exécuter votre programme.

  • Vous pourrez voir "Hello World" imprimé sur l'écran et le programme attend jusqu'à ce que vous appuyiez sur n'importe quelle touche.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

Assurez-vous que le compilateur pascal gratuit fpc est dans votre chemin et que vous l'exécutez dans le répertoire contenant le fichier source hello.pas.

Vous avez vu une structure de base du programme pascal, il sera donc facile de comprendre les autres blocs de construction de base du langage de programmation pascal.

Variables

Une définition de variable est placée dans un bloc commençant par un var mot-clé, suivi des définitions des variables comme suit:

var
A_Variable, B_Variable ... : Variable_Type;

Les variables Pascal sont déclarées en dehors du corps de code de la fonction, ce qui signifie qu'elles ne sont pas déclarées dans le begin et end paires, mais elles sont déclarées après la définition de la procédure / fonction et avant le beginmot-clé. Pour les variables globales, elles sont définies après l'en-tête du programme.

Fonctions / procédures

Chez Pascal, un procedure est un ensemble d'instructions à exécuter, sans valeur de retour et un functionest une procédure avec une valeur de retour. La définition de la fonction / des procédures sera la suivante -

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

commentaires

Les commentaires multilignes sont placés entre accolades et astérisques sous la forme (* ... *). Pascal autorise les commentaires sur une seule ligne entre accolades {...}.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

Sensibilité à la casse

Pascal est un langage non sensible à la casse, ce qui signifie que vous pouvez écrire vos variables, fonctions et procédure dans les deux cas. Comme les variables A_Variable, a_variable et A_VARIABLE ont la même signification en Pascal.

Déclarations de Pascal

Les programmes Pascal sont constitués d'instructions. Chaque déclaration spécifie un travail défini du programme. Ces tâches peuvent être la déclaration, l'affectation, la lecture de données, l'écriture de données, la prise de décisions logiques, le transfert du contrôle de flux de programme, etc.

Par exemple -

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

Mots réservés en Pascal

Les instructions en Pascal sont conçues avec des mots Pascal spécifiques, appelés mots réservés. Par exemple, les mots program, input, output, var, real, begin, readline, writeline et end sont tous des mots réservés.

Voici une liste de mots réservés disponibles en Pascal.

et tableau commencer Cas const
div faire vers le bas autre fin
fichier pour fonction aller à si
dans étiquette mod néant ne pas
de ou emballé procédure programme
record répéter ensemble puis à
type jusqu'à var tandis que avec

Jeu de caractères et identificateurs en Pascal

Le jeu de caractères Pascal se compose de -

  • Toutes les lettres majuscules (AZ)

  • Toutes les lettres minuscules (az)

  • Tous les chiffres (0-9)

  • Symboles spéciaux - + * /: =,. ;. () [] = {} `espace blanc

Les entités d'un programme Pascal comme les variables et les constantes, les types, les fonctions, les procédures et les enregistrements, etc., ont un nom ou un identifiant. Un identifiant est une séquence de lettres et de chiffres commençant par une lettre. Les symboles spéciaux et les espaces ne doivent pas être utilisés dans un identifiant.

Les types de données d'une entité indiquent la signification, les contraintes, les valeurs possibles, les opérations, les fonctions et le mode de stockage qui lui sont associés.

Les types entier, réel, booléen et caractère sont appelés types de données standard. Les types de données peuvent être classés en types de données scalaires, pointeurs et structurés. Des exemples de types de données scalaires sont entier, réel, booléen, caractère, sous-plage et énuméré. Les types de données structurées sont constitués des types scalaires; par exemple, des tableaux, des enregistrements, des fichiers et des ensembles. Nous discuterons des types de données de pointeur plus tard.

Types de données Pascal

Les types de données Pascal peuvent être résumés comme ci-dessous dans le diagramme suivant -

Déclarations de type

La déclaration de type est utilisée pour déclarer le type de données d'un identifiant. La syntaxe de la déclaration de type est -

type-identifier-1, type-identfier-2 = type-specifier;

Par exemple, la déclaration suivante définit les variables jours et âge comme type entier, yes et true comme type booléen, nom et ville comme type chaîne, frais et dépenses comme type réel.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Types entiers

Le tableau suivant vous donne des détails sur les types d'entiers standard avec ses tailles de stockage et ses plages de valeurs utilisées dans Object Pascal -

Type Le minimum Maximum Format
Entier -2147483648 2147483647 signé 32 bits
Cardinal 0 4294967295 non signé 32 bits
Shortint -128 127 signé 8 bits
Smallint -32768 32767 signé 16 bits
Longint -2147483648 2147483647 signé 32 bits
Int64 -2 ^ 63 2 ^ 63 - 1 signé 64 bits
Octet 0 255 non signé 8 bits
Mot 0 65535 non signé 16 bits
Longword 0 4294967295 non signé 32 bits

Constantes

L'utilisation de constantes rend un programme plus lisible et aide à conserver des quantités spéciales à un seul endroit au début du programme. Pascal autorise les constantes numériques, logiques, chaînes et caractères . Les constantes peuvent être déclarées dans la partie déclaration du programme en spécifiant leconst déclaration.

La syntaxe de la déclaration de type constant est la suivante -

const
Identifier = contant_value;

Voici quelques exemples de déclarations constantes -

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

Toutes les déclarations de constantes doivent être données avant la déclaration de variable.

Types énumérés

Les types de données énumérés sont des types de données définis par l'utilisateur. Ils permettent de spécifier des valeurs dans une liste. Seuls les opérateurs d' affectation et les opérateurs relationnels sont autorisés sur le type de données énuméré. Les types de données énumérés peuvent être déclarés comme suit -

type
enum-identifier = (item1, item2, item3, ... )

Voici quelques exemples de déclarations de types énumérés -

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

L'ordre dans lequel les éléments sont répertoriés dans le domaine d'un type énuméré définit l'ordre des éléments. Par exemple, dans le type énuméré SUMMER, avril vient avant mai, mai avant juin, et ainsi de suite. Le domaine des identificateurs de type énumérés ne peut pas être constitué de constantes numériques ou de caractères.

Types de sous-plages

Les types de sous-plage permettent à une variable de prendre des valeurs comprises dans une certaine plage. Par exemple, si l' âge des électeurs doit être compris entre 18 et 100 ans, une variable nommée âge pourrait être déclarée comme -

var
age: 18 ... 100;

Nous examinerons la déclaration de variable en détail dans la section suivante. Vous pouvez également définir un type de sous-plage à l'aide de la déclaration de type. La syntaxe pour déclarer un type de sous-plage est la suivante -

type
subrange-identifier = lower-limit ... upper-limit;

Voici quelques exemples de déclarations de types de sous-plages -

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

Les types de sous-plage peuvent être créés à partir d'un sous-ensemble d'un type énuméré déjà défini, par exemple -

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

Une variable n'est rien d'autre qu'un nom donné à une zone de stockage que nos programmes peuvent manipuler. Chaque variable en Pascal a un type spécifique, qui détermine la taille et la disposition de la mémoire de la variable; la plage de valeurs pouvant être stockées dans cette mémoire; et l'ensemble des opérations qui peuvent être appliquées à la variable.

Le nom d'une variable peut être composé de lettres, de chiffres et du caractère de soulignement. Il doit commencer par une lettre ou un trait de soulignement. Pascal estnot case-sensitive, donc les lettres majuscules et minuscules signifient la même chose ici. Sur la base des types de base expliqués dans le chapitre précédent, il y aura les types de variables de base suivants -

Variables de base en Pascal

Sr.Non Type et description
1

Character

Généralement un seul octet (un octet). Il s'agit d'un type entier.

2

Integer

La taille entière la plus naturelle de la machine.

3

Real

Valeur à virgule flottante simple précision.

4

Boolean

Spécifie des valeurs logiques vraies ou fausses. C'est également un type entier.

5

Enumerated

Spécifie une liste définie par l'utilisateur.

6

Subrange

Représente des variables dont les valeurs se trouvent dans une plage.

sept

String

Stocke un tableau de caractères.

Le langage de programmation Pascal permet également de définir divers autres types de variables, que nous aborderons dans les chapitres suivants comme Pointer, Array, Records, Sets, and Files, etc. Pour ce chapitre, étudions uniquement les types de variables de base.

Déclaration de variable en Pascal

Toutes les variables doivent être déclarées avant de les utiliser dans le programme Pascal. Toutes les déclarations de variables sont suivies du mot-clé var . Une déclaration spécifie une liste de variables, suivie de deux points (:) et du type. La syntaxe de la déclaration de variable est -

var
variable_list : type;

Ici, type doit être un type de données Pascal valide comprenant un caractère, un entier, un réel, un booléen ou tout type de données défini par l'utilisateur, etc., et variable_list peut être constitué d'un ou plusieurs noms d'identificateurs séparés par des virgules. Certaines déclarations de variables valides sont affichées ici -

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

Dans le tutoriel précédent, nous avons discuté du fait que Pascal permet de déclarer un type. Un type peut être identifié par un nom ou un identifiant. Ce type peut être utilisé pour définir des variables de ce type. Par exemple,

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Maintenant, les types ainsi définis peuvent être utilisés dans les déclarations de variables -

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

Veuillez noter la différence entre la déclaration de type et la déclaration var . La déclaration de type indique la catégorie ou la classe des types tels que entier, réel, etc., tandis que la spécification de variable indique le type de valeurs qu'une variable peut prendre. Vous pouvez comparer la déclaration de type en Pascal avec typedef en C. Plus important encore, le nom de la variable fait référence à l'emplacement mémoire où la valeur de la variable va être stockée. Ce n'est pas le cas avec la déclaration de type.

Initialisation de variable en Pascal

Les variables se voient attribuer une valeur avec deux points et le signe égal, suivi d'une expression constante. La forme générale d'attribution d'une valeur est -

variable_name := value;

Par défaut, les variables en Pascal ne sont pas initialisées avec zéro. Ils peuvent contenir des valeurs de déchets. Il est donc préférable d'initialiser des variables dans un programme. Les variables peuvent être initialisées (affectées d'une valeur initiale) dans leur déclaration. L'initialisation est suivie duvar mot clé et la syntaxe d'initialisation est la suivante -

var
variable_name : type = value;

Quelques exemples sont -

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

Prenons un exemple, qui utilise divers types de variables discutés jusqu'à présent -

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

Variables énumérées

Vous avez vu comment utiliser des types de variables simples comme entier, réel et booléen. Voyons maintenant les variables de type énuméré, qui peuvent être définies comme -

var
var1, var2, ...  : enum-identifier;

Lorsque vous avez déclaré un type énuméré, vous pouvez déclarer des variables de ce type. Par exemple,

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

L'exemple suivant illustre le concept -

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Which drink do you want?
You can drink limejuice

Variables de sous-plage

Les variables de sous-plage sont déclarées comme -

var
subrange-name : lowerlim ... uperlim;

Des exemples de variables de sous-plage sont -

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

Le programme suivant illustre le concept -

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

Une constante est une entité qui reste inchangée pendant l'exécution du programme. Pascal n'autorise que les constantes des types suivants à être déclarées -

  • Types ordinaux
  • Définir les types
  • Types de pointeurs (mais la seule valeur autorisée est Nil).
  • Types réels
  • Char
  • String

Déclaration de constantes

La syntaxe pour déclarer les constantes est la suivante -

const
identifier = constant_value;

Le tableau suivant fournit des exemples de certaines déclarations de constantes valides -

Real type constant

Sr.Non Type de constante et exemples
1

Ordinal(Integer)type constant

valid_age = 21;

2

Set type constant

Voyelles = ensemble de (A, E, I, O, U);

3

Pointer type constant

P = NUL;

4

e = 2,7182818;

velocity_light = 3,0E + 10;

5

Character type constant

Opérateur = '+';

6

String type constant

président = 'Johnny Depp';

L'exemple suivant illustre le concept -

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter the radius of the circle
23
The circumference of the circle is 144.51

Observez le formatage dans l'instruction de sortie du programme. La variable c doit être formatée avec le nombre total de chiffres 7 et 2 chiffres après le signe décimal. Pascal permet un tel formatage de sortie avec les variables numériques.

Un opérateur est un symbole qui indique au compilateur d'effectuer des manipulations mathématiques ou logiques spécifiques. Pascal autorise les types d'opérateurs suivants -

  • Opérateurs arithmétiques
  • Opérateurs relationnels
  • opérateurs booléens
  • Opérateurs de bits
  • Définir les opérateurs
  • Opérateurs de chaîne

Discutons un par un des opérateurs arithmétique, relationnel, booléen et bit. Nous discuterons plus tard des opérateurs d'ensemble et des opérations sur les chaînes.

Opérateurs arithmétiques

Le tableau suivant montre tous les opérateurs arithmétiques pris en charge par Pascal. Supposons une variableA détient 10 et variable B détient 20, alors -

Afficher des exemples

Opérateur La description Exemple
+ Ajoute deux opérandes A + B donnera 30
- Soustrait le deuxième opérande du premier A - B donnera -10
* Multiplie les deux opérandes A * B donnera 200
/ Divise le numérateur par le dénominateur B / A donnera 2
% Opérateur de module et reste après une division entière B% A donnera 0

Opérateurs relationnels

Le tableau suivant montre tous les opérateurs relationnels pris en charge par Pascal. Supposons une variableA détient 10 et variable B détient 20, alors -

Afficher des exemples

Opérateur La description Exemple
= Vérifie si les valeurs de deux opérandes sont égales ou non, si oui, alors la condition devient vraie. (A = B) n'est pas vrai.
<> Vérifie si les valeurs de deux opérandes sont égales ou non, si les valeurs ne sont pas égales, la condition devient vraie. (A <> B) est vrai.
> Vérifie si la valeur de l'opérande gauche est supérieure à la valeur de l'opérande droit, si oui, la condition devient vraie. (A> B) n'est pas vrai.
< Vérifie si la valeur de l'opérande gauche est inférieure à la valeur de l'opérande droit, si oui, la condition devient vraie. (A <B) est vrai.
> = Vérifie si la valeur de l'opérande gauche est supérieure ou égale à la valeur de l'opérande droit, si oui, la condition devient vraie. (A> = B) n'est pas vrai.
<= Vérifie si la valeur de l'opérande gauche est inférieure ou égale à la valeur de l'opérande droit, si oui, la condition devient vraie. (A <= B) est vrai.

Opérateurs booléens

Le tableau suivant montre tous les opérateurs booléens pris en charge par le langage Pascal. Tous ces opérateurs travaillent sur des opérandes booléens et produisent des résultats booléens. Supposons une variableA est vrai et variable B est faux, alors -

Afficher des exemples

Opérateur La description Exemple
et Appelé opérateur booléen AND. Si les deux opérandes sont vrais, la condition devient vraie. (A et B) est faux.
et alors Il est similaire à l'opérateur AND, cependant, il garantit l'ordre dans lequel le compilateur évalue l'expression logique. Les opérandes de gauche à droite et de droite ne sont évalués que lorsque cela est nécessaire. (A puis B) est faux.
ou Opérateur OR booléen appelé. Si l'un des deux opérandes est vrai, la condition devient vraie. (A ou B) est vrai.
ou sinon Il est similaire à Boolean OR, cependant, il garantit l'ordre dans lequel le compilateur évalue l'expression logique. Les opérandes de gauche à droite et de droite ne sont évalués que lorsque cela est nécessaire. (A ou bien B) est vrai.
ne pas Opérateur Boolean NOT appelé. Utilisé pour inverser l'état logique de son opérande. Si une condition est vraie, alors l'opérateur logique NOT la rendra fausse. not (A et B) est vrai.

Opérateurs de bits

Les opérateurs au niveau du bit fonctionnent sur les bits et effectuent des opérations bit par bit. Tous ces opérateurs travaillent sur des opérandes entiers et produisent des résultats entiers. La table de vérité pour les bits et (&), les bits ou (|) et les bits non (~) est la suivante:

p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

Supposons que A = 60; et B = 13; maintenant au format binaire, ils seront comme suit -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Les opérateurs Bitwise pris en charge par Pascal sont répertoriés dans le tableau suivant. Supposons que la variable A a 60 et la variable B 13, alors:

Afficher des exemples

Opérateur La description Exemple
& L'opérateur binaire AND copie un peu le résultat s'il existe dans les deux opérandes. (A & B) donnera 12, soit 0000 1100
| L'opérateur OR binaire copie un bit s'il existe dans l'un ou l'autre des opérandes. (A | B) donnera 61, soit 0011 1101
! L'opérateur OR binaire copie un bit s'il existe dans l'un ou l'autre des opérandes. C'est la même chose que | opérateur. (A! B) donnera 61, soit 0011 1101
~ L'opérateur de complément Binary Ones est unaire et a pour effet de «retourner» les bits. (~ A) donnera -61, soit 1100 0011 sous la forme du complément à 2 en raison d'un nombre binaire signé.
<< Opérateur de décalage binaire gauche. La valeur des opérandes de gauche est déplacée vers la gauche du nombre de bits spécifié par l'opérande de droite. Un << 2 donnera 240, soit 1111 0000
>> Opérateur de décalage binaire vers la droite. La valeur des opérandes de gauche est déplacée vers la droite du nombre de bits spécifié par l'opérande de droite. Un >> 2 donnera 15, soit 0000 1111

Veuillez noter que les différentes implémentations de Pascal diffèrent par les opérateurs bit à bit. Free Pascal, le compilateur que nous avons utilisé ici, prend cependant en charge les opérateurs de bits suivants -

Les opérateurs Opérations
ne pas Pas au niveau du bit
et ET au niveau du bit
ou OU au niveau du bit
xor OU exclusif au niveau du bit
shl Décalage bit à gauche
Shr Décalage binaire à droite
<< Décalage bit à gauche
>> Décalage binaire à droite

Priorité des opérateurs en Pascal

La priorité des opérateurs détermine le regroupement des termes dans une expression. Cela affecte la manière dont une expression est évaluée. Certains opérateurs ont une priorité plus élevée que d'autres; par exemple, l'opérateur de multiplication a une priorité plus élevée que l'opérateur d'addition.

Par exemple x = 7 + 3 * 2; ici, x est attribué à 13, et non à 20 car l'opérateur * a une priorité plus élevée que +, il est donc d'abord multiplié par 3 * 2, puis ajouté en 7.

Ici, les opérateurs avec la priorité la plus élevée apparaissent en haut du tableau, ceux avec la priorité la plus basse apparaissent en bas. Dans une expression, les opérateurs de priorité supérieure seront évalués en premier.

Afficher des exemples

Opérateur Priorité
~, pas, Le plus élevé
*, /, div, mod et, &
|,!, +, -, ou,
=, <>, <, <=,>,> =, dans
ou bien, et puis Le plus bas

Les structures de prise de décision exigent que le programmeur spécifie une ou plusieurs conditions à évaluer ou à tester par le programme, ainsi qu'une ou plusieurs instructions à exécuter si la condition est jugée vraie, et éventuellement d'autres instructions à exécuter si la condition est déterminé comme étant faux.

Voici la forme générale d'une structure de prise de décision typique trouvée dans la plupart des langages de programmation -

Le langage de programmation Pascal fournit les types suivants d'énoncés de prise de décision. Cliquez sur les liens suivants pour vérifier leurs détails.

Sr.Non Déclaration et description
1 if - instruction alors

Un if - then statement se compose d'une expression booléenne suivie d'une ou plusieurs instructions.

2 Instruction If-then-else

Un if - then statement peut être suivi d'une option else statement, qui s'exécute lorsque l'expression booléenne est fausse.

3 instructions if imbriquées

Vous pouvez en utiliser un if ou else if déclaration dans un autre if ou else if déclaration (s).

4 déclaration de cas

UNE case L'instruction permet à une variable d'être testée pour l'égalité par rapport à une liste de valeurs.

5 case - instruction else

Il est similaire au if-then-else déclaration. Ici, unelse terme suit le case statement.

6 instructions de cas imbriquées

Vous pouvez en utiliser un case déclaration dans un autre case déclaration (s).

Il peut arriver que vous deviez exécuter un bloc de code plusieurs fois. En général, les instructions sont exécutées de manière séquentielle: la première instruction d'une fonction est exécutée en premier, suivie de la seconde, et ainsi de suite.

Les langages de programmation fournissent diverses structures de contrôle qui permettent des chemins d'exécution plus compliqués.

Une instruction de boucle nous permet d'exécuter une instruction ou un groupe d'instructions plusieurs fois et voici la forme générale d'une instruction de boucle dans la plupart des langages de programmation -

Le langage de programmation Pascal fournit les types suivants de constructions de boucle pour gérer les exigences de boucle. Cliquez sur les liens suivants pour vérifier leurs détails.

Sr.Non Type de boucle et description
1 boucle while-do

Répète une instruction ou un groupe d'instructions tant qu'une condition donnée est vraie. Il teste la condition avant d'exécuter le corps de la boucle.

2 boucle for-do

Exécute une séquence d'instructions plusieurs fois et abrége le code qui gère la variable de boucle.

3 boucle de répétition jusqu'à

Comme une instruction while, sauf qu'elle teste la condition à la fin du corps de la boucle.

4 boucles imbriquées

Vous pouvez utiliser une ou plusieurs boucles dans n'importe quelle autre boucle while, for ou répéter jusqu'à boucle.

Déclarations de contrôle de boucle

Les instructions de contrôle de boucle modifient l'exécution de sa séquence normale. Lorsque l'exécution quitte une étendue, tous les objets automatiques qui ont été créés dans cette étendue sont détruits.

Pascal prend en charge les instructions de contrôle suivantes. Cliquez sur les liens suivants pour vérifier leurs détails.

Sr.Non Déclaration de contrôle et description
1 déclaration break

Met fin au loop ou case et transfère l'exécution à l'instruction immédiatement après l'instruction de boucle ou de cas.

2 continue déclaration

Force la boucle à ignorer le reste de son corps et à retester immédiatement son état avant de réitérer.

3 déclaration goto

Transfère le contrôle vers l'instruction étiquetée. Bien qu'il ne soit pas conseillé d'utiliser l'instruction goto dans votre programme.

Sous-programmes

Un sous-programme est une unité / module de programme qui exécute une tâche particulière. Ces sous-programmes sont combinés pour former des programmes plus vastes. C'est ce qu'on appelle fondamentalement la «conception modulaire». Un sous-programme peut être appelé par un sous-programme / programme, appelé programme appelant.

Pascal propose deux types de sous-programmes -

  • Functions - ces sous-programmes renvoient une valeur unique.

  • Procedures - ces sous-programmes ne renvoient pas directement de valeur.

Les fonctions

UNE functionest un groupe d'instructions qui exécutent ensemble une tâche. Chaque programme Pascal a au moins une fonction, qui est le programme lui-même, et tous les programmes les plus triviaux peuvent définir des fonctions supplémentaires.

Une fonction declarationindique au compilateur le nom, le type de retour et les paramètres d'une fonction. Une fonctiondefinition fournit le corps réel de la fonction.

La bibliothèque standard Pascal fournit de nombreuses fonctions intégrées que votre programme peut appeler. Par exemple, fonctionAppendStr() ajoute deux chaînes, fonction New() alloue dynamiquement de la mémoire aux variables et à bien d'autres fonctions.

Définition d'une fonction

Chez Pascal, un functionest défini à l'aide du mot-clé function. La forme générale d'une définition de fonction est la suivante -

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

Une définition de fonction en Pascal consiste en une fonction header, local declarations et une fonction body. L'en-tête de la fonction se compose de la fonction mot-clé et d'unnamedonné à la fonction. Voici toutes les parties d'une fonction -

  • Arguments- Le ou les arguments établissent le lien entre le programme appelant et les identificateurs de fonction et également appelés paramètres formels. Un paramètre est comme un espace réservé. Lorsqu'une fonction est appelée, vous transmettez une valeur au paramètre. Cette valeur est appelée paramètre ou argument réel. La liste des paramètres fait référence au type, à l'ordre et au nombre de paramètres d'une fonction. L'utilisation de tels paramètres formels est facultative. Ces paramètres peuvent avoir un type de données standard, un type de données défini par l'utilisateur ou un type de données de sous-plage.

    La liste des paramètres formels apparaissant dans l'instruction de fonction peut être des variables simples ou en indice, des tableaux ou des variables structurées, ou des sous-programmes.

  • Return Type- Toutes les fonctions doivent renvoyer une valeur, toutes les fonctions doivent donc se voir attribuer un type. lefunction-typeest le type de données de la valeur renvoyée par la fonction. Il peut être de type scalaire ou de sous-plage standard, défini par l'utilisateur, mais il ne peut pas être de type structuré.

  • Local declarations - Les déclarations locales font référence aux déclarations d'étiquettes, de constantes, de variables, de fonctions et de procédures, qui s'appliquent uniquement au corps de la fonction.

  • Function Body- Le corps de la fonction contient une collection d'instructions qui définissent ce que fait la fonction. Il doit toujours être placé entre les mots réservés de début et de fin. C'est la partie d'une fonction où tous les calculs sont effectués. Il doit y avoir une instruction d'affectation du type -name := expression;dans le corps de la fonction qui attribue une valeur au nom de la fonction. Cette valeur est renvoyée au fur et à mesure de l'exécution de la fonction. La dernière instruction du corps doit être une instruction de fin.

Voici un exemple montrant comment définir une fonction dans pascal -

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

Déclarations de fonction

Une fonction declarationindique au compilateur un nom de fonction et comment appeler la fonction. Le corps réel de la fonction peut être défini séparément.

Une déclaration de fonction comprend les parties suivantes -

function name(argument(s): type1; argument(s): type2; ...): function_type;

Pour la fonction max () définie ci-dessus, voici la déclaration de fonction -

function max(num1, num2: integer): integer;

La déclaration de fonction est requise lorsque vous définissez une fonction dans un fichier source et que vous appelez cette fonction dans un autre fichier. Dans ce cas, vous devez déclarer la fonction en haut du fichier appelant la fonction.

Appeler une fonction

Lors de la création d'une fonction, vous donnez une définition de ce que la fonction doit faire. Pour utiliser une fonction, vous devrez appeler cette fonction pour exécuter la tâche définie. Lorsqu'un programme appelle une fonction, le contrôle du programme est transféré à la fonction appelée. Une fonction appelée exécute une tâche définie, et lorsque son instruction return est exécutée ou lorsque la dernière instruction end est atteinte, elle renvoie le contrôle du programme au programme principal.

Pour appeler une fonction, vous devez simplement transmettre les paramètres requis avec le nom de la fonction, et si la fonction renvoie une valeur, vous pouvez stocker la valeur renvoyée. Voici un exemple simple pour montrer l'utilisation -

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Max value is : 200

Procedures sont des sous-programmes qui, au lieu de renvoyer une seule valeur, permettent d'obtenir un groupe de résultats.

Définition d'une procédure

En Pascal, une procédure est définie à l'aide du proceduremot-clé. La forme générale d'une définition de procédure est la suivante -

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Une procédure definition en Pascal se compose d'un header, local declarations et un bodyde la procédure. L'en-tête de la procédure se compose du mot-cléprocedureet un nom donné à la procédure. Voici toutes les parties d'une procédure -

  • Arguments- Le ou les arguments établissent le lien entre le programme appelant et les identificateurs de procédure et sont également appelés paramètres formels. Les règles des arguments dans les procédures sont les mêmes que celles des fonctions.

  • Local declarations - Les déclarations locales font référence aux déclarations d'étiquettes, de constantes, de variables, de fonctions et de procédures, qui ne s'appliquent qu'au corps de la procédure.

  • Procedure Body- Le corps de la procédure contient une collection d'instructions qui définissent ce que fait la procédure. Il doit toujours être placé entre les mots réservés de début et de fin. C'est la partie d'une procédure où tous les calculs sont effectués.

Voici le code source d'une procédure appelée findMin () . Cette procédure prend 4 paramètres x, y, z et m et stocke le minimum parmi les trois premières variables dans la variable nommée m. La variable m est passée parreference (nous discuterons des arguments de passage par référence un peu plus tard) -

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

Déclarations de procédure

Une procédure declarationindique au compilateur un nom de procédure et comment appeler la procédure. Le corps réel de la procédure peut être défini séparément.

Une déclaration de procédure a la syntaxe suivante -

procedure name(argument(s): type1, argument(s): type 2, ... );

Veuillez noter que le name of the procedure is not associated with any type. Pour la procédure définie ci-dessus findMin () , voici la déclaration -

procedure findMin(x, y, z: integer; var m: integer);

Appel d'une procédure

Lors de la création d'une procédure, vous donnez une définition de ce que la procédure doit faire. Pour utiliser la procédure, vous devrez appeler cette procédure pour exécuter la tâche définie. Lorsqu'un programme appelle une procédure, le contrôle du programme est transféré à la procédure appelée. Une procédure appelée exécute la tâche définie et lorsque sa dernière instruction de fin est atteinte, elle renvoie le contrôle au programme appelant.

Pour appeler une procédure, il vous suffit de transmettre les paramètres requis avec le nom de la procédure comme indiqué ci-dessous -

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter three numbers:
89 45 67
Minimum: 45

Sous-programmes récursifs

Nous avons vu qu'un programme ou sous-programme peut appeler un autre sous-programme. Lorsqu'un sous-programme s'appelle lui-même, il est appelé appel récursif et le processus est appelé récursivité.

Pour illustrer le concept, calculons la factorielle d'un nombre. La factorielle d'un nombre n est définie comme -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

Le programme suivant calcule la factorielle d'un nombre donné en s'appelant lui-même récursivement.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter a number:
5
Factorial 5 is: 120

Voici un autre exemple, qui génère le Fibonacci Series pour un nombre donné en utilisant un recursive fonction -

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

0 1 1 2	3 5 8 13 21 34

Arguments d'un sous-programme

Si un sous-programme (function or procedure) consiste à utiliser des arguments, il doit déclarer des variables qui acceptent les valeurs des arguments. Ces variables sont appeléesformal parameters du sous-programme.

Les paramètres formels se comportent comme les autres variables locales à l'intérieur du sous-programme et sont créés à l'entrée dans le sous-programme et détruits à la sortie.

Lors de l'appel d'un sous-programme, il existe deux façons de transmettre des arguments au sous-programme -

Sr.Non Type d'appel et description
1 Appel par valeur

Cette méthode copie la valeur réelle d'un argument dans le paramètre formel du sous-programme. Dans ce cas, les modifications apportées au paramètre à l'intérieur du sous-programme n'ont aucun effet sur l'argument.

2 Appel par référence

Cette méthode copie l'adresse d'un argument dans le paramètre formel. À l'intérieur du sous-programme, l'adresse est utilisée pour accéder à l'argument réel utilisé dans l'appel. Cela signifie que les modifications apportées au paramètre affectent l'argument.

Par défaut, Pascal utilise call by valuepour passer des arguments. En général, cela signifie que le code dans un sous-programme ne peut pas modifier les arguments utilisés pour appeler le sous-programme. L'exemple de programme que nous avons utilisé dans le chapitre 'Pascal - Fonctions' a appelé la fonction nommée max () en utilisantcall by value.

Alors que l'exemple de programme fourni ici ( exProcedure ) appelle la procédure findMin () en utilisantcall by reference.

Une portée dans toute programmation est une région du programme où une variable définie peut avoir son existence et au-delà de cette variable ne peut pas être accédée. Il y a trois endroits où les variables peuvent être déclarées en langage de programmation Pascal -

  • À l'intérieur d'un sous-programme ou d'un bloc appelé variables locales

  • En dehors de tous les sous-programmes appelés variables globales

  • Dans la définition des paramètres de sous-programme, appelés paramètres formels

Expliquons ce que sont local et global variables et paramètres formels.

Variables locales

Les variables déclarées dans un sous-programme ou un bloc sont appelées variables locales. Ils ne peuvent être utilisés que par des instructions qui se trouvent à l'intérieur de ce sous-programme ou bloc de code. Les variables locales ne sont pas connues des sous-programmes en dehors des leurs. Voici l'exemple utilisant des variables locales. Ici, toutes les variables a , b et c sont locales au programme nommé exLocal .

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

value of a = 10 b = 20 c = 30

Maintenant, étendons un peu plus le programme, créons une procédure nommée display, qui aura son propre ensemble de variables a , b et c et affichera leurs valeurs, directement depuis le programme exLocal .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

Variables globales

Les variables globales sont définies en dehors d'une fonction, généralement au-dessus du programme. Les variables globales conserveront leur valeur pendant toute la durée de vie de votre programme et elles peuvent être accédées à l'intérieur de l'une des fonctions définies pour le programme.

UNE globalvariable est accessible par n'importe quelle fonction. Autrement dit, une variable globale est disponible pour une utilisation dans tout votre programme après sa déclaration. Voici un exemple d'utilisationglobal et local variables -

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

Veuillez noter que l'affichage de la procédure a accès aux variables a, b et c, qui sont des variables globales par rapport à l'affichage ainsi qu'à ses propres variables locales. Un programme peut avoir le même nom pour les variables locales et globales mais la valeur de la variable locale à l'intérieur d'une fonction aura la préférence.

Modifions un peu l'exemple précédent, maintenant les variables locales pour l'affichage de la procédure ont les mêmes noms que a , b , c -

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

La chaîne en Pascal est en fait une séquence de caractères avec une spécification de taille facultative. Les caractères peuvent être numériques, lettres, blancs, caractères spéciaux ou une combinaison de tous. Extended Pascal fournit de nombreux types d'objets chaîne en fonction du système et de l'implémentation. Nous discuterons des types de chaînes plus courants utilisés dans les programmes.

Vous pouvez définir une chaîne de plusieurs manières -

  • Character arrays - Il s'agit d'une chaîne de caractères qui est une séquence de zéro caractères ou plus de la taille d'un octet entre guillemets simples.

  • String variables - La variable de type String, telle que définie dans Turbo Pascal.

  • Short strings - La variable de type String avec spécification de taille.

  • Null terminated strings - La variable de pchar type.

  • AnsiStrings - Les réponses sont des chaînes sans limite de longueur.

Pascal fournit un seul opérateur de chaîne, l'opérateur de concaténation de chaînes (+).

Exemples

Le programme suivant imprime les quatre premiers types de chaînes. Nous utiliserons AnsiStrings dans l'exemple suivant.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

L'exemple suivant utilise quelques fonctions supplémentaires, voyons -

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

Fonctions et procédures Pascal String

Pascal prend en charge un large éventail de fonctions et de procédures qui manipulent des chaînes. Ces sous-programmes varient d'un outil à l'autre. Ici, nous listons divers sous-programmes de manipulation de chaînes fournis par Free Pascal -

Sr.No. Fonction et objectif
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

Compare deux chaînes

2

function AnsiCompareText(const S1: ; const S2:):Integer;

Compare deux chaînes, insensible à la casse

3

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

Supprime les guillemets de la chaîne

4

function AnsiLastChar(const S:):PChar;

Obtient le dernier caractère de la chaîne

5

function AnsiLowerCase(const s:):

Convertit la chaîne en minuscules

6

function AnsiQuotedStr(const S: ; Quote: Char):;

Cite une chaîne

sept

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

Compare les chaînes sensibles à la casse

8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

Compare les chaînes insensibles à la casse

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Compare les caractères L des chaînes sensibles à la casse

dix

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Compare les caractères L des chaînes insensibles à la casse

11

function AnsiStrLastChar(Str: PChar):PChar;

Obtient le dernier caractère de la chaîne

12

function AnsiStrLower(Str: PChar):PChar;

Convertit la chaîne en minuscules

13

function AnsiStrUpper(Str: PChar):PChar;

Convertit la chaîne en majuscules

14

function AnsiUpperCase(const s:):;

Convertit la chaîne en majuscules

15

procedure AppendStr(var Dest: ; const S:);

Ajoute 2 chaînes

16

procedure AssignStr(var P: PString; const S:);

Attribue la valeur des chaînes sur le tas

17

function CompareStr(const S1: ; const S2:):Integer; overload;

Compare deux chaînes sensibles à la casse

18

function CompareText(const S1: ; const S2:):Integer;

Compare deux chaînes insensible à la casse

19 procedure DisposeStr(S: PString); overload;

Supprime la chaîne du tas

20

procedure DisposeStr(S: PShortString); overload;

Supprime la chaîne du tas

21

function IsValidIdent( const Ident:):Boolean;

La chaîne est-elle un identifiant pascal valide

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

Dernière occurrence de caractère dans une chaîne

23

function LeftStr(const S: ; Count: Integer):;

Obtient les N premiers caractères d'une chaîne

24

function LoadStr(Ident: Integer):;

Charge la chaîne à partir des ressources

25

function LowerCase(const s: ):; overload;

Convertit la chaîne en minuscules

26

function LowerCase(const V: variant ):; overload;

Convertit la chaîne en minuscules

27

function NewStr(const S:):PString; overload;

Alloue une nouvelle chaîne sur le tas

28

function RightStr(const S: ; Count: Integer):;

Obtient les N derniers caractères d'une chaîne

29

function StrAlloc(Size: Cardinal):PChar;

Alloue de la mémoire pour la chaîne

30

function StrBufSize(Str: PChar):SizeUInt;

Réserve de la mémoire pour une chaîne

31

procedure StrDispose(Str: PChar);

Supprime la chaîne du tas

32

function StrPas(Str: PChar):;

Convertit PChar en chaîne pascal

33

function StrPCopy(Dest: PChar; Source:):PChar;

Copie la chaîne pascal

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

Copie N octets de chaîne pascal

35

function UpperCase(const s:):;

Convertit la chaîne en majuscules

Pascal fournit le type de données Boolean qui permet aux programmeurs de définir, stocker et manipuler des entités logiques, telles que des constantes, des variables, des fonctions et des expressions, etc.

Les valeurs booléennes sont essentiellement de type entier. Les variables de type booléen ont deux valeurs possibles prédéfiniesTrue et False. Les expressions résolvant en une valeur booléenne peuvent également être affectées à un type booléen.

Free Pascal prend également en charge le ByteBool, WordBool et LongBoolles types. Ceux-ci sont de type Byte, Word ou Longint, respectivement.

La valeur False est équivalente à 0 (zéro) et toute valeur différente de zéro est considérée comme True lors de la conversion en valeur booléenne. Une valeur booléenne de True est convertie en -1 au cas où elle serait affectée à une variable de type LongBool.

Il est à noter que les opérateurs logiques and, or et not sont définis pour les types de données booléens.

Déclaration des types de données booléens

Une variable de type booléen est déclarée à l'aide du mot clé var.

var
boolean-identifier: boolean;

par exemple,

var
choice: boolean;

Exemple

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

Le langage de programmation Pascal fournit une structure de données appelée tableau, qui peut stocker une collection séquentielle de taille fixe d'éléments du même type. Un tableau est utilisé pour stocker une collection de données, mais il est souvent plus utile de considérer un tableau comme une collection de variables du même type.

Au lieu de déclarer des variables individuelles, telles que nombre1, nombre2, ... et nombre100, vous déclarez une variable de tableau telle que des nombres et utilisez les nombres [1], les nombres [2] et ..., les nombres [100] pour représenter variables individuelles. Un élément spécifique d'un tableau est accessible par un index.

Tous les tableaux sont constitués d'emplacements de mémoire contigus. L'adresse la plus basse correspond au premier élément et l'adresse la plus élevée au dernier élément.

Veuillez noter que si vous voulez un tableau de style C à partir de l'index 0, il vous suffit de démarrer l'index à partir de 0, au lieu de 1.

Déclaration de tableaux

Pour déclarer un tableau en Pascal, un programmeur peut soit déclarer le type puis créer des variables de ce tableau, soit déclarer directement la variable tableau.

La forme générale de la déclaration de type d'un tableau à une dimension est -

type
   array-identifier = array[index-type] of element-type;

Où,

  • array-identifier - indique le nom du type de tableau.

  • index-type- spécifie l'indice du tableau; il peut s'agir de n'importe quel type de données scalaires sauf réel

  • element-type - spécifie les types de valeurs qui vont être stockées

Par exemple,

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

Maintenant, la vitesse est un tableau variable de type vectoriel, qui est suffisant pour contenir jusqu'à 25 nombres réels.

Pour démarrer le tableau à partir de 0 index, la déclaration serait -

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

Types d'indice de tableau

En Pascal, un indice de tableau peut être de n'importe quel type scalaire comme, entier, booléen, énuméré ou sous-intervalle, sauf réel. Les indices de tableau peuvent également avoir des valeurs négatives.

Par exemple,

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

Prenons un autre exemple où l'indice est de type caractère -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

L'indice peut être de type énuméré -

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

Initialisation des tableaux

En Pascal, les tableaux sont initialisés par affectation, soit en spécifiant un indice particulier, soit en utilisant une boucle for-do.

Par exemple -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

Accès aux éléments de la baie

Un élément est accessible en indexant le nom du tableau. Cela se fait en plaçant l'index de l'élément entre crochets après le nom du tableau. Par exemple -

a: integer;
a: = alphabet['A'];

L'instruction ci-dessus prendra le premier élément du tableau nommé alphabet et affectera la valeur à la variable a.

Voici un exemple, qui utilisera tous les trois concepts mentionnés ci-dessus à savoir. déclaration, affectation et accès aux tableaux -

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

Pascal Arrays en détail

Les tableaux sont importants pour Pascal et devraient avoir besoin de beaucoup plus de détails. Voici quelques concepts importants liés au tableau qui devraient être clairs pour un programmeur Pascal -

Sr.Non Concept et description
1 Tableaux multidimensionnels

Pascal prend en charge les tableaux multidimensionnels. La forme la plus simple du tableau multidimensionnel est le tableau à deux dimensions.

2 Tableau dynamique

Dans ce type de tableaux, la longueur initiale est zéro. La longueur réelle du tableau doit être définie avec la normeSetLength fonction.

3 Tableau emballé

Ces tableaux sont remplis de bits, c'est-à-dire que chaque caractère ou valeur de vérité est stocké dans des octets consécutifs au lieu d'utiliser une unité de stockage, généralement un mot (4 octets ou plus).

4 Passer des tableaux à des sous-programmes

Vous pouvez passer à un sous-programme un pointeur vers un tableau en spécifiant le nom du tableau sans index.

Les pointeurs en Pascal sont faciles et amusants à apprendre. Certaines tâches de programmation Pascal sont exécutées plus facilement avec des pointeurs, et d'autres tâches, telles que l'allocation de mémoire dynamique, ne peuvent pas être effectuées sans l'utilisation de pointeurs. Il devient donc nécessaire d'apprendre les pointeurs pour devenir un parfait programmeur Pascal. Commençons à les apprendre par étapes simples et faciles.

Comme vous le savez, chaque variable est un emplacement de mémoire et chaque emplacement de mémoire a son adresse définie qui peut être accédée en utilisant le nom de la variable de pointeur, qui désigne une adresse en mémoire.

Que sont les pointeurs?

Un pointeur est une variable dynamique, dont la valeur est l'adresse d'une autre variable, c'est-à-dire l'adresse directe de l'emplacement mémoire. Comme toute variable ou constante, vous devez déclarer un pointeur avant de pouvoir l'utiliser pour stocker une adresse de variable. La forme générale d'une déclaration de variable de pointeur est -

type
   ptr-identifier = ^base-variable-type;

Le type de pointeur est défini en préfixant la flèche vers le haut du symbole caret (^) avec le type de base. Le type de base définit les types des éléments de données. Une fois qu'une variable de pointeur est définie comme étant d'un certain type, elle ne peut pointer que des éléments de données de ce type. Une fois qu'un type de pointeur a été défini, nous pouvons utiliser levar déclaration pour déclarer des variables de pointeur.

var
   p1, p2, ... : ptr-identifier;

Voici quelques déclarations de pointeur valides -

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

Les variables de pointeur sont déréférencées à l'aide du même symbole d'insertion (^). Par exemple, la variable associée référencée par un pointeur rptr , est rptr ^ . Il peut être consulté comme -

rptr^ := 234.56;

L'exemple suivant illustrera ce concept -

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

Impression d'une adresse mémoire en Pascal

En Pascal, nous pouvons affecter l'adresse d'une variable à une variable pointeur en utilisant l'opérateur d'adresse (@). Nous utilisons ce pointeur pour manipuler et accéder à l'élément de données. Cependant, si pour une raison quelconque, nous devons travailler avec l'adresse mémoire elle-même, nous devons la stocker dans une variable de type mot.

Prolongeons l'exemple ci-dessus pour imprimer l'adresse mémoire stockée dans le pointeur iptr -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

Pointeurs NIL

Il est toujours bon d'attribuer un NILvaleur à une variable de pointeur au cas où vous n'avez pas d'adresse exacte à attribuer. Cela se fait au moment de la déclaration des variables. Un pointeur attribuéNILne pointe nulle part. Considérez le programme suivant -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

The value of ptr is 0

Pour vérifier un nil pointeur, vous pouvez utiliser une instruction if comme suit -

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Pascal Pointers en détail

Les pointeurs ont des concepts nombreux mais simples et ils sont très importants pour la programmation Pascal. Voici quelques concepts de pointeurs importants, qui devraient être clairs pour un programmeur Pascal -

Sr.Non Concept et description
1 Pascal - Arithmétique du pointeur

Il existe quatre opérateurs arithmétiques qui peuvent être utilisés sur les pointeurs: incrémenter, décrémenter, +, -

2 Pascal - Tableau de pointeurs

Vous pouvez définir des tableaux pour contenir un certain nombre de pointeurs.

3 Pascal - Pointeur vers pointeur

Pascal vous permet d'avoir un pointeur sur un pointeur et ainsi de suite.

4 Passer des pointeurs vers des sous-programmes en Pascal

Le passage d'un argument par référence ou par adresse permet tous deux de modifier l'argument passé dans le sous-programme appelant par le sous-programme appelé.

5 Renvoyer le pointeur des sous-programmes en Pascal

Pascal permet à un sous-programme de renvoyer un pointeur.

Les tableaux Pascal vous permettent de définir le type de variables pouvant contenir plusieurs éléments de données du même type, mais un enregistrement est un autre type de données défini par l'utilisateur disponible dans Pascal qui vous permet de combiner des éléments de données de différents types.

Les enregistrements se composent de différents champs. Supposons que vous souhaitiez garder une trace de vos livres dans une bibliothèque, vous souhaiterez peut-être suivre les attributs suivants pour chaque livre -

  • Title
  • Author
  • Subject
  • ID du livre

Définition d'un enregistrement

Pour définir un type d'enregistrement, vous pouvez utiliser l'instruction de déclaration de type. Le type d'enregistrement est défini comme -

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Voici la façon dont vous déclareriez l'enregistrement du livre -

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Les variables d'enregistrement sont définies de la manière habituelle comme

var
   r1, r2, ... : record-name;

Vous pouvez également définir directement une variable de type d'enregistrement comme -

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Accès aux champs d'un enregistrement

Pour accéder à n'importe quel champ d'un enregistrement, nous utilisons l'opérateur d'accès aux membres (.). L'opérateur d'accès aux membres est codé comme un point entre le nom de la variable d'enregistrement et le champ auquel nous souhaitons accéder. Voici l'exemple pour expliquer l'utilisation de la structure -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Enregistrements en tant qu'arguments de sous-programme

Vous pouvez transmettre un enregistrement en tant qu'argument de sous-programme de la même manière que vous transmettez toute autre variable ou pointeur. Vous accéderiez aux champs d'enregistrement de la même manière que vous avez accédé dans l'exemple ci-dessus -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Pointeurs vers des enregistrements

Vous pouvez définir des pointeurs vers des enregistrements de la même manière que vous définissez le pointeur vers n'importe quelle autre variable comme suit -

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Vous pouvez maintenant stocker l'adresse d'une variable de type d'enregistrement dans la variable de pointeur définie ci-dessus. Pour déclarer une variable du type pointeur créé, vous utilisez le mot-clé var -

var
   r1, r2, ... : record-ptr;

Avant d'utiliser ces pointeurs, vous devez créer un stockage pour une variable de type de nom d'enregistrement, qui sera manipulée par ces pointeurs.

new(r1);
new(r2);

Pour accéder aux membres d'un enregistrement à l'aide d'un pointeur vers cet enregistrement, vous devez utiliser ^. opérateur comme suit -

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Enfin, n'oubliez pas de jeter le stockage utilisé, lorsqu'il n'est plus utilisé -

dispose(r1);
dispose(r2);

Réécrivons le premier exemple en utilisant un pointeur vers l'enregistrement Books. J'espère que ce sera facile pour vous de comprendre le concept -

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

La déclaration With

Nous avons discuté du fait que les membres d'un enregistrement sont accessibles à l'aide de l'opérateur d'accès aux membres (.). De cette façon, le nom de la variable d'enregistrement doit être écrit à chaque fois. leWith La déclaration fournit une autre façon de le faire.

Regardez l'extrait de code suivant extrait de notre premier exemple -

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

Le même devoir peut être rédigé en utilisant le With déclaration comme -

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal prend en charge un type unique de stockage nommé variants. Vous pouvez affecter n'importe quel type simple de valeurs dans une variable variant. Le type d'une valeur stockée dans une variante n'est déterminé qu'au moment de l'exécution. Presque tous les types simples peuvent être affectés à des variantes: types ordinaux, types chaîne, types int64.

Les types structurés tels que les ensembles, les enregistrements, les tableaux, les fichiers, les objets et les classes ne sont pas compatibles avec les affectations avec une variante. Vous pouvez également affecter un pointeur à une variante.

Free Pascal prend en charge les variantes.

Déclarer une variante

Vous pouvez déclarer un type de variante comme tout autre type en utilisant le varmot-clé. La syntaxe pour déclarer un type variant est -

var
   v: variant;

Maintenant, cette variable variable v peut être affectée à presque tous les types simples, y compris les types énumérés et vice versa.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Exemple

L'exemple suivant illustre le concept -

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

Un ensemble est une collection d'éléments du même type. Pascal permet de définir le type de données défini. Les éléments d'un ensemble sont appelés ses membres. En mathématiques, les ensembles sont représentés en entourant les membres entre accolades {} . Cependant, en Pascal, les éléments set sont placés entre crochets [], qui sont appelés constructeur d'ensemble.

Définition des types et des variables d'ensemble

Les types d'ensemble Pascal sont définis comme

type
set-identifier = set of base type;

Les variables de type set sont définies comme

var
s1, s2, ...: set-identifier;

ou,

s1, s2...: set of base type;

Des exemples de déclaration de type d'ensemble valide sont -

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

Définir les opérateurs

Vous pouvez effectuer les opérations d'ensemble suivantes sur les ensembles Pascal.

Sr.Non Opérations et descriptions
1

Union

Cela joint deux ensembles et donne un nouvel ensemble avec des membres des deux ensembles.

2

Difference

Obtient la différence de deux ensembles et donne un nouvel ensemble avec des éléments qui ne sont communs à aucun des ensembles.

3

Intersection

Obtient l'intersection de deux ensembles et donne un nouvel ensemble avec des éléments communs aux deux ensembles.

4

Inclusion

Un ensemble P est inclus dans l'ensemble Q, si tous les éléments de P sont également dans Q mais pas l'inverse.

5

Symmetric difference

Obtient la différence symétrique de deux ensembles et donne un ensemble d'éléments, qui se trouvent dans l'un des ensembles et non dans leur intersection.

6

In

Il vérifie l'adhésion.

Le tableau suivant montre tous les opérateurs d'ensemble pris en charge par Free Pascal. Suppose queS1 et S2 sont deux jeux de caractères, tels que -

S1: = ['a', 'b', 'c'];

S2: = ['c', 'd', 'e'];

Opérateur La description Exemple
+ Union de deux ensembles

S1 + S2 donnera un ensemble

['a', 'b', 'c', 'd', 'e']

- Différence de deux ensembles

S1 - S2 donnera un ensemble

['un B']

* Intersection de deux ensembles

S1 * S2 donnera un ensemble

['c']

> < Différence symétrique de deux ensembles S1> <S2 donnera un ensemble ['a', 'b', 'd', 'e']
= Vérifie l'égalité de deux ensembles S1 = S2 donnera la valeur booléenne False
<> Vérifie la non-égalité de deux ensembles S1 <> S2 donnera la valeur booléenne True
<= Contient (vérifie si un ensemble est un sous-ensemble de l'autre) S1 <= S2 donnera la valeur booléenne False
Comprendre Comprend un élément dans l'ensemble; au fond c'est l'union d'un ensemble et d'un élément du même type de base

Inclure (S1, ['d']) donnera un ensemble

['a B c d']

Exclure Exclut un élément d'un ensemble; c'est fondamentalement la différence d'un ensemble et d'un élément du même type de base

Exclude (S2, ['d']) donnera un ensemble

['c', 'e']

Dans Vérifie l'appartenance à un ensemble d'un élément dans un ensemble ['e'] dans S2 donne la valeur booléenne True

Exemple

L'exemple suivant illustre l'utilisation de certains de ces opérateurs -

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal traite un fichier comme une séquence de composants, qui doivent être de type uniforme. Le type d'un fichier est déterminé par le type des composants. Le type de données de fichier est défini comme -

type
file-name = file of base-type;

Où, le type de base indique le type des composants du fichier. Le type de base peut être n'importe quoi comme, entier, réel, booléen, énuméré, sous-plage, enregistrement, tableaux et ensembles sauf un autre type de fichier. Les variables d'un type de fichier sont créées à l'aide de la déclaration var -

var
f1, f2,...: file-name;

Voici quelques exemples de définition de certains types de fichiers et variables de fichier -

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

Création et écriture dans un fichier

Écrivons un programme qui créerait un fichier de données pour les dossiers des étudiants. Cela créerait un fichier nommé étudiants.dat et y inscrirait les données d'un étudiant -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

Une fois compilé et exécuté, le programme créait un fichier nommé étudiants.dat dans le répertoire de travail. Vous pouvez ouvrir le fichier à l'aide d'un éditeur de texte, comme le bloc-notes, pour consulter les données de John Smith.

Lecture à partir d'un fichier

Nous venons de créer et d'écrire dans un fichier nommé étudiants.dat. Maintenant, écrivons un programme qui lirait les données de l'étudiant à partir du fichier -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name: John Smith
Address: United States of America
Batch Code: Computer Science

Fichiers en tant que paramètre de sous-programme

Pascal permet aux variables de fichier d'être utilisées comme paramètres dans les sous-programmes standard et définis par l'utilisateur. L'exemple suivant illustre ce concept. Le programme crée un fichier nommé rain.txt et stocke certaines données de pluie. Ensuite, il ouvre le fichier, lit les données et calcule les précipitations moyennes.

Veuillez noter que, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

Fichiers texte

Un fichier texte, en Pascal, est constitué de lignes de caractères où chaque ligne se termine par un marqueur de fin de ligne. Vous pouvez déclarer et définir de tels fichiers comme -

type
file-name = text;

La différence entre un fichier normal de caractères et un fichier texte est qu'un fichier texte est divisé en lignes, chacune terminée par un marqueur de fin de ligne spécial, automatiquement inséré par le système. L'exemple suivant crée et écrit dans un fichier texte nommé contact.txt -

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Enter the file name:
contact.txt 
Completed writing

Ajout à un fichier

Ajouter à un fichier signifie écrire dans un fichier existant qui contient déjà des données sans écraser le fichier. Le programme suivant illustre cela -

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Fonctions de gestion de fichiers

Free Pascal fournit les fonctions / procédures suivantes pour la gestion des fichiers -

Sr.No. Nom et description de la fonction
1

procedure Append(var t: Text);

Ouvre un fichier en mode ajout

2

procedure Assign(out f: file; const Name:);

Attribue un nom à un fichier

3

procedure Assign(out f: file; p: PChar);

Attribue un nom à un fichier

4

procedure Assign(out f: file; c: Char);

Attribue un nom à un fichier

5

procedure Assign(out f: TypedFile; const Name:);

Attribue un nom à un fichier

6

procedure Assign(out f: TypedFile; p: PChar);

Attribue un nom à un fichier

sept

procedure Assign(out f: TypedFile; c: Char);

Attribue un nom à un fichier

8

procedure Assign(out t: Text; const s:);

Attribue un nom à un fichier

9

procedure Assign(out t: Text; p: PChar);

Attribue un nom à un fichier

dix

procedure Assign(out t: Text; c: Char);

Attribue un nom à un fichier

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

Lit les données d'un fichier en mémoire

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

Lit les données d'un fichier en mémoire

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Lit les données d'un fichier en mémoire

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

Lit les données d'un fichier en mémoire

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

Lit les données d'un fichier en mémoire

16

procedure BlockRead(var f: file; var Buf; count: Int64);

Lit les données d'un fichier en mémoire

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

Écrit des données de la mémoire dans un fichier

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

Écrit des données de la mémoire dans un fichier

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Écrit des données de la mémoire dans un fichier

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

Écrit des données de la mémoire dans un fichier

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

Écrit des données de la mémoire dans un fichier

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

Écrit des données de la mémoire dans un fichier

23

procedure Close(var f: file);

Ferme un dossier

24

procedure Close(var t: Text);

Ferme un dossier

25

function EOF(var f: file):Boolean;

Vérifie la fin du fichier

26

function EOF(var t: Text):Boolean;

Vérifie la fin du fichier

27

function EOF: Boolean;

Vérifie la fin du fichier

28

function EOLn(var t: Text):Boolean;

Vérifie la fin de la ligne

29

function EOLn: Boolean;

Vérifie la fin de la ligne

30

procedure Erase(var f: file);

Supprime le fichier du disque

31

procedure Erase(var t: Text);

Supprime le fichier du disque

32

function FilePos( var f: file):Int64;

Position dans le fichier

33

function FileSize(var f: file):Int64;

Taille du fichier

34

procedure Flush(var t: Text);

Écrit les tampons de fichiers sur le disque

35

function IOResult: Word;

Renvoie le résultat de la dernière opération d'E / S de fichier

36

procedure Read(var F: Text; Args: Arguments);

Lit un fichier dans une variable

37

procedure Read(Args: Arguments);

Lit un fichier dans une variable

38

procedure ReadLn(var F: Text; Args: Arguments);

Lit le fichier dans la variable et passe à la ligne suivante

39

procedure ReadLn(Args: Arguments);

Lit le fichier dans la variable et passe à la ligne suivante

40

procedure Rename(var f: file; const s:);

Renomme le fichier sur le disque

41

procedure Rename(var f: file; p: PChar);

Renomme le fichier sur le disque

42

procedure Rename(var f: file; c: Char);

Renomme le fichier sur le disque

43

procedure Rename(var t: Text; const s);

Renommer le fichier sur le disque

44

procedure Rename(var t: Text; p: PChar);

Renomme le fichier sur le disque

45

procedure Rename( var t: Text; c: Char);

Renomme le fichier sur le disque

46

procedure Reset(var f: file; l: LongInt);

Ouvre le fichier pour lecture

47

procedure Reset(var f: file);

Ouvre le fichier pour lecture

48

procedure Reset(var f: TypedFile);

Ouvre le fichier pour lecture

49

procedure Reset(var t: Text);

Ouvre le fichier pour lecture

50

procedure Rewrite(var f: file; l: LongInt);

Ouvre le fichier pour l'écriture

51

procedure Rewrite(var f: file);

Ouvre le fichier pour l'écriture

52

procedure Rewrite(var f: TypedFile);

Ouvre le fichier pour l'écriture

53

procedure Rewrite(var t: Text);

Ouvre le fichier pour l'écriture

54

procedure Seek(var f: file; Pos: Int64);

Définit la position du fichier

55

function SeekEOF(var t: Text):Boolean;

Définit la position du fichier à la fin du fichier

56

function SeekEOF: Boolean;

Définit la position du fichier à la fin du fichier

57

function SeekEOLn(var t: Text):Boolean;

Définit la position du fichier à la fin de la ligne

58

function SeekEOLn: Boolean;

Définit la position du fichier à la fin de la ligne

59

procedure SetTextBuf(var f: Text; var Buf);

Définit la taille du tampon de fichier

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

Définit la taille du tampon de fichier

61

procedure Truncate(var F: file);

Tronquer le fichier à la position

62

procedure Write(Args: Arguments);

Écrit la variable dans le fichier

63

procedure Write(var F: Text; Args: Arguments);

Ecrire une variable dans un fichier

64

procedure Writeln(Args: Arguments);

Écrit la variable dans le fichier et ajoute une nouvelle ligne

65

procedure WriteLn(var F: Text; Args: Arguments);

Écrit la variable dans le fichier et ajoute une nouvelle ligne

Ce chapitre explique la gestion dynamique de la mémoire dans Pascal. Le langage de programmation Pascal fournit plusieurs fonctions pour l'allocation et la gestion de la mémoire.

Allocation dynamique de la mémoire

Lors de la programmation, si vous connaissez la taille d'un tableau, c'est facile et vous pouvez le définir comme un tableau. Par exemple, pour stocker le nom de n'importe quelle personne, il peut comporter au maximum 100 caractères afin que vous puissiez définir quelque chose comme suit -

var
name: array[1..100] of char;

Mais maintenant, considérons une situation dans laquelle vous n'avez aucune idée de la longueur du texte que vous devez stocker, par exemple, vous souhaitez stocker une description détaillée d'un sujet. Ici, nous devons définir un pointeur vers une chaîne sans définir la quantité de mémoire requise.

Pascal fournit une procédure newpour créer des variables de pointeur.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Maintenant, si vous avez besoin de définir un pointeur avec un nombre spécifique d'octets à référencer ultérieurement, vous devez utiliser le getmem fonction ou le getmem procédure, qui a la syntaxe suivante -

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Dans l'exemple précédent, nous avons déclaré un pointeur vers une chaîne. Une chaîne a une valeur maximale de 255 octets. Si vous n'avez vraiment pas besoin de beaucoup d'espace, ou d'un espace plus grand, en termes d'octets, le sous-programme getmem permet de le spécifier. Réécrivons l' exemple précédent, en utilisant getmem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Ainsi, vous avez un contrôle total et vous pouvez transmettre n'importe quelle valeur de taille tout en allouant de la mémoire contrairement aux tableaux, où une fois que vous avez défini la taille ne peut pas être modifiée.

Redimensionner et libérer la mémoire

Lorsque votre programme sort, le système d'exploitation libère automatiquement toute la mémoire allouée par votre programme, mais comme une bonne pratique lorsque vous n'avez plus besoin de mémoire, vous devez libérer cette mémoire.

Pascal fournit la procédure dispose pour libérer une variable créée dynamiquement à l'aide de la procédure new. Si vous avez alloué de la mémoire à l'aide du getmem sous-programme, vous devez alors utiliser le sous-programme freemempour libérer cette mémoire. Les sous-programmes freemem ont la syntaxe suivante -

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Vous pouvez également augmenter ou diminuer la taille d'un bloc de mémoire alloué en appelant la fonction ReAllocMem . Vérifions à nouveau le programme ci-dessus et utilisons les sous-programmes ReAllocMem et freemem . Voici la syntaxe de ReAllocMem -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Voici un exemple qui utilise les sous-programmes ReAllocMem et freemem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Fonctions de gestion de la mémoire

Pascal fournit une foule de fonctions de gestion de la mémoire qui sont utilisées pour implémenter diverses structures de données et implémenter la programmation de bas niveau en Pascal. Beaucoup de ces fonctions dépendent de l'implémentation. Free Pascal fournit les fonctions et procédures suivantes pour la gestion de la mémoire -

SN Nom et description de la fonction
1

function Addr(X: TAnytype):Pointer;

Renvoie l'adresse de la variable

2

function Assigned(P: Pointer):Boolean;

Vérifie si un pointeur est valide

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

Compare 2 octets de mémoire tampon par octet

sept

function Cseg: Word;

Renvoie le segment de code

8

procedure Dispose(P: Pointer);

Libère la mémoire allouée dynamiquement

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Libère la mémoire allouée dynamiquement

dix

function Dseg: Word;

Renvoie le segment de données

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Remplit la région mémoire avec un motif 8 bits

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Remplit la région mémoire avec un certain caractère

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Remplit la région mémoire avec un motif 32 bits

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Remplit la région mémoire avec un modèle 64 bits

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Remplit la région mémoire avec un motif 16 bits

16

procedure Freemem( p: pointer; Size: PtrUInt);

Libère la mémoire allouée

17

procedure Freemem( p: pointer );

Libère la mémoire allouée

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Alloue une nouvelle mémoire

19

procedure Getmem( out p: pointer);

Alloue une nouvelle mémoire

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Renvoie le gestionnaire de mémoire actuel

21

function High( Arg: TypeOrVariable):TOrdinal;

Renvoie l'indice le plus élevé du tableau ouvert ou énuméré

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Recherche une valeur de la taille d'un octet dans une plage de mémoire

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Recherche une valeur de la taille d'un caractère dans une plage de mémoire

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Recherche une valeur DWord (32 bits) dans une plage de mémoire

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Recherche une valeur de taille QWord dans une plage de mémoire

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Recherche une valeur de la taille d'un mot dans une plage de mémoire

27

function IsMemoryManagerSet: Boolean;

Le gestionnaire de mémoire est-il défini

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Renvoie l'indice le plus bas du tableau ouvert ou énuméré

29

procedure Move( const source; var dest; count: SizeInt );

Déplace les données d'un emplacement de la mémoire à un autre

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Déplace les données jusqu'au premier caractère zéro

31

procedure New( var P: Pointer);

Allouer dynamiquement de la mémoire pour la variable

32

procedure New( var P: Pointer; Cons: TProcedure);

Alloue dynamiquement de la mémoire pour la variable

33

function Ofs( var X ):LongInt;

Renvoie le décalage de la variable

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Combine le segment et le décalage avec le pointeur

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Redimensionne un bloc de mémoire sur le tas

36

function Seg( var X):LongInt;

Renvoie le segment

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Définit un gestionnaire de mémoire

38

function Sptr: Pointer;

Renvoie le pointeur de pile actuel

39

function Sseg: Word;

Renvoie la valeur du registre du segment de pile

Un programme Pascal peut être constitué de modules appelés unités. Une unité peut être constituée de certains blocs de code, qui à leur tour sont constitués de variables et de déclarations de type, d'instructions, de procédures, etc. Il existe de nombreuses unités intégrées dans Pascal et Pascal permet aux programmeurs de définir et d'écrire leurs propres unités à utiliser plus tard dans divers programmes.

Utilisation d'unités intégrées

Les unités intégrées et les unités définies par l'utilisateur sont incluses dans un programme par la clause uses. Nous avons déjà utilisé l'unité des variantes dans le didacticiel Pascal - Variantes . Ce didacticiel explique la création et l'inclusion d'unités définies par l'utilisateur. Cependant, voyons d'abord comment inclure une unité intégréecrt dans votre programme -

program myprog;
uses crt;

L'exemple suivant illustre l'utilisation du crt unité -

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

C'est le même programme que nous avons utilisé au tout début du tutoriel Pascal, compilez-le et exécutez-le pour trouver les effets du changement.

Créer et utiliser une unité Pascal

Pour créer une unité, vous devez écrire les modules ou sous-programmes que vous souhaitez y stocker et l'enregistrer dans un fichier avec .pasextension. La première ligne de ce fichier doit commencer par le mot-clé unité suivi du nom de l'unité. Par exemple -

unit calculateArea;

Voici trois étapes importantes pour créer une unité Pascal -

  • Le nom du fichier et le nom de l'unité doivent être exactement les mêmes. Ainsi, notre unité CalculateArea sera enregistrée dans un fichier nommé CalculateArea.pas.

  • La ligne suivante doit être constituée d'un seul mot-clé interface. Après cette ligne, vous écrirez les déclarations pour toutes les fonctions et procédures qui viendront dans cette unité.

  • Juste après les déclarations de fonction, écrivez le mot implementation, qui est à nouveau un mot-clé. Après la ligne contenant l'implémentation du mot-clé, fournissez la définition de tous les sous-programmes.

Le programme suivant crée l'unité nommée CalculateArea -

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

Ensuite, écrivons un programme simple qui utiliserait l'unité que nous avons définie ci-dessus -

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

La plupart des logiciels que vous écrivez doivent implémenter une forme de fonction de date renvoyant la date et l'heure actuelles. Les dates font tellement partie de la vie quotidienne qu'il devient facile de travailler avec elles sans réfléchir. Pascal fournit également des outils puissants pour l'arithmétique des dates qui facilitent la manipulation des dates. Cependant, le nom et le fonctionnement réels de ces fonctions sont différents pour différents compilateurs.

Obtenir la date et l'heure actuelles

La fonction TimeToString de Pascal vous donne l'heure actuelle sous une forme délimitée par deux points (:). L'exemple suivant montre comment obtenir l'heure actuelle -

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

Lorsque le code ci-dessus a été compilé et exécuté, il produit le résultat suivant -

Current time : 18:33:08

le Date La fonction renvoie la date actuelle dans TDateTimeformat. Le TDateTime est une valeur double, qui nécessite un certain décodage et formatage. Le programme suivant montre comment l'utiliser dans votre programme pour afficher la date actuelle -

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

Lorsque le code ci-dessus a été compilé et exécuté, il produit le résultat suivant -

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

La fonction Now renvoie la date et l'heure actuelles -

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

Lorsque le code ci-dessus a été compilé et exécuté, il produit le résultat suivant -

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal fournit une structure d'horodatage simple nommée TTimeStamp, qui a le format suivant -

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

Diverses fonctions de date et d'heure

Free Pascal fournit les fonctions de date et d'heure suivantes -

Sr.No. Nom et description de la fonction
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

Convertit le type DateTime en date du fichier.

2

function DateTimeToStr( DateTime: TDateTime):;

Construit une représentation sous forme de chaîne de DateTime

3

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Construit une représentation sous forme de chaîne de DateTime

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

Construit une représentation sous forme de chaîne de DateTime

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Construit une représentation sous forme de chaîne de DateTime

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

Convertit DateTime en heure système

sept

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;Convertit DateTime en horodatage

8

function DateToStr(Date: TDateTime):;

Construit une représentation sous forme de chaîne de date

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

Construit une représentation sous forme de chaîne de date

dix

function Date: TDateTime;

Obtient la date actuelle

11

function DayOfWeek(DateTime: TDateTime):Integer;

Obtient le jour de la semaine

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

Décode DateTime en année mois et jour

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

Décode DateTime en heures, minutes et secondes

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

Encode l'année, le jour et le mois en DateTime

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

Encode les heures, les minutes et les secondes en DateTime

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

Renvoie une représentation sous forme de chaîne de DateTime

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Renvoie une représentation sous forme de chaîne de DateTime

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

Ajoute 1 au mois

19

function IsLeapYear(Year: Word):Boolean;

Détermine si l'année est bissextile

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

Convertit le nombre de millisecondes en horodatage

21

function Now: TDateTime;

Obtient la date et l'heure actuelles

22

function StrToDateTime(const S:):TDateTime;

Convertit la chaîne en DateTime

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

Convertit la chaîne en DateTime

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

Convertit la chaîne en DateTime

25

function StrToDate(const S: ShortString):TDateTime;

Convertit la chaîne en date

26

function StrToDate(const S: Ansistring):TDateTime;

Convertit la chaîne en date

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

Convertit la chaîne en date

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

Convertit la chaîne en date

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

Convertit la chaîne en date

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

Convertit la chaîne en date

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

Convertit la chaîne en date

32

function StrToTime(const S: Shortstring):TDateTime;

Convertit la chaîne en temps

33

function StrToTime(const S: Ansistring):TDateTime;

Convertit la chaîne en temps

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

Convertit la chaîne en temps

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

Convertit la chaîne en temps

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

Convertit la chaîne en temps

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

Convertit la chaîne en temps

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

Convertit l'heure système en date / heure

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

Convertit l'horodatage en DateTime

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

Convertit l'horodatage en nombre de millisecondes

41

function TimeToStr(Time: TDateTime):;

Renvoie une représentation sous forme de chaîne de Time

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

Renvoie une représentation sous forme de chaîne de Time

43

function Time: TDateTime;

Obtenir l'heure actuelle

L'exemple suivant illustre l'utilisation de certaines des fonctions ci-dessus -

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

Lorsque le code ci-dessus a été compilé et exécuté, il a produit le résultat suivant:

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

Nous pouvons imaginer notre univers fait de différents objets comme le soleil, la terre, la lune, etc. De même, nous pouvons imaginer notre voiture faite de différents objets comme le volant, la direction, l'équipement, etc. assumer tout comme un objet et implémenter un logiciel en utilisant différents objets. Dans Pascal, il existe deux types de données structurelles utilisées pour implémenter un objet du monde réel -

  • Types d'objets
  • Types de cours

Concepts orientés objet

Avant d'entrer dans les détails, définissons les termes Pascal importants liés au Pascal orienté objet.

  • Object- Un objet est un type spécial d'enregistrement qui contient des champs comme un enregistrement; cependant, contrairement aux enregistrements, les objets contiennent des procédures et des fonctions faisant partie de l'objet. Ces procédures et fonctions sont conservées comme des pointeurs vers les méthodes associées au type de l'objet.

  • Class- Une classe est définie presque de la même manière qu'un objet, mais il y a une différence dans la manière dont elles sont créées. La classe est allouée sur le tas d'un programme, tandis que l'objet est alloué sur la pile. C'est un pointeur vers l'objet, pas l'objet lui-même.

  • Instantiation of a class- L'instanciation signifie la création d'une variable de ce type de classe. Puisqu'une classe n'est qu'un pointeur, lorsqu'une variable d'un type de classe est déclarée, de la mémoire est allouée uniquement pour le pointeur, pas pour l'objet entier. Uniquement lorsqu'il est instancié à l'aide de l'un de ses constructeurs, la mémoire est allouée à l'objet. Les instances d'une classe sont également appelées «objets», mais ne les confondez pas avec les objets Object Pascal. Dans ce didacticiel, nous écrirons 'Object' pour les objets Pascal et 'object' pour l'objet conceptuel ou l'instance de classe.

  • Member Variables - Ce sont les variables définies à l'intérieur d'une classe ou d'un objet.

  • Member Functions - Ce sont les fonctions ou procédures définies à l'intérieur d'une classe ou d'un objet et sont utilisées pour accéder aux données d'objet.

  • Visibility of Members- Les membres d'un objet ou d'une classe sont également appelés les champs. Ces domaines ont des visibilités différentes. La visibilité fait référence à l'accessibilité des membres, c'est-à-dire exactement là où ces membres seront accessibles. Les objets ont trois niveaux de visibilité: public, privé et protégé. Les classes ont cinq types de visibilité: publique, privée, strictement privée, protégée et publiée. Nous discuterons de la visibilité dans les détails.

  • Inheritance- Lorsqu'une classe est définie en héritant des fonctionnalités existantes d'une classe parent, on dit qu'elle est héritée. Ici, la classe enfant héritera de toutes ou de quelques fonctions membres et variables d'une classe parent. Les objets peuvent également être hérités.

  • Parent Class- Une classe héritée par une autre classe. Ceci est également appelé une classe de base ou une super classe.

  • Child Class- Une classe qui hérite d'une autre classe. Ceci est également appelé une sous-classe ou une classe dérivée.

  • Polymorphism- Il s'agit d'un concept orienté objet où la même fonction peut être utilisée à des fins différentes. Par exemple, le nom de la fonction restera le même, mais il peut prendre un nombre d'arguments différent et effectuer différentes tâches. Les classes Pascal implémentent le polymorphisme. Les objets n'implémentent pas le polymorphisme.

  • Overloading- C'est un type de polymorphisme dans lequel certains ou tous les opérateurs ont des implémentations différentes selon les types de leurs arguments. De même, les fonctions peuvent également être surchargées avec une implémentation différente. Les classes Pascal implémentent la surcharge, mais pas les objets.

  • Data Abstraction - Toute représentation de données dans laquelle les détails d'implémentation sont masqués (abstraits).

  • Encapsulation - Fait référence à un concept où nous encapsulons toutes les données et les fonctions membres ensemble pour former un objet.

  • Constructor - Fait référence à un type spécial de fonction qui sera appelée automatiquement chaque fois qu'il y a une formation d'objet à partir d'une classe ou d'un objet.

  • Destructor - Fait référence à un type spécial de fonction qui sera appelée automatiquement chaque fois qu'un objet ou une classe est supprimé ou hors de portée.

Définition des objets Pascal

Un objet est déclaré à l'aide de la déclaration de type. La forme générale d'une déclaration d'objet est la suivante -

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

Définissons un objet Rectangle qui a deux membres de données de type entier - length et width et certaines fonctions membres pour manipuler ces données membres et une procédure pour dessiner le rectangle.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Après avoir créé vos objets, vous pourrez appeler des fonctions membres liées à cet objet. Une fonction membre pourra traiter la variable membre de l'objet associé uniquement.

L'exemple suivant montre comment définir des longueurs et des largeurs pour deux objets rectangle et les dessiner en appelant les fonctions membres.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Voici un exemple complet pour montrer comment utiliser des objets en Pascal -

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Visibilité des membres de l'objet

La visibilité indique l'accessibilité des membres de l'objet. Les membres d'objet Pascal ont trois types de visibilité -

Sr.Non Visibilité et accessibilité
1

Public

Les membres peuvent être utilisés par d'autres unités en dehors de l'unité de programme

2

Private

Les membres ne sont accessibles que dans l'unité actuelle.

3

Protected

Les membres ne sont disponibles que pour les objets descendants de l'objet parent.

Par défaut, les champs et méthodes d'un objet sont publics et sont exportés en dehors de l'unité courante.

Constructeurs et destructeurs pour les objets Pascal -

Constructorssont des méthodes de type spécial, qui sont appelées automatiquement chaque fois qu'un objet est créé. Vous créez un constructeur en Pascal simplement en déclarant une méthode avec un constructeur de mot-clé. Par convention, le nom de la méthode est Init, cependant, vous pouvez fournir tout identifiant valide de votre choix. Vous pouvez passer autant d'arguments que vous le souhaitez dans la fonction constructeur.

Destructorssont des méthodes appelées lors de la destruction de l'objet. Les méthodes destructrices détruisent toute allocation de mémoire créée par les constructeurs.

L'exemple suivant fournira un constructeur et un destructeur pour la classe Rectangle qui initialisera la longueur et la largeur du rectangle au moment de la création de l'objet et le détruira lorsqu'il sortira de la portée.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Héritage des objets Pascal

Les objets Pascal peuvent éventuellement hériter d'un objet parent. Le programme suivant illustre l'héritage dans les objets Pascal. Créons un autre objet nomméTableTop, qui hérite de l'objet Rectangle.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Voici les points importants à noter -

  • L'objet Tabletop a hérité de tous les membres de l'objet Rectangle.

  • Il existe également une méthode de dessin dans TableTop . Lorsque le tirage méthode est appelée à l' aide d' un TableTop objet, le tirage au sort de TableTop s'invoqué.

  • Il existe une instance implicite nommée self qui fait référence à l'instance actuelle de l'objet.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Vous avez vu que les objets Pascal présentent certaines caractéristiques du paradigme orienté objet. Ils implémentent l'encapsulation, le masquage des données et l'héritage, mais ils ont également des limites. Par exemple, les objets Pascal ne participent pas au polymorphisme. Ainsi, les classes sont largement utilisées pour implémenter un comportement orienté objet approprié dans un programme, en particulier le logiciel basé sur l'interface graphique.

Une classe est définie presque de la même manière qu'un objet, mais est un pointeur vers un objet plutôt que vers l'objet lui-même. Techniquement, cela signifie que la classe est allouée sur le tas d'un programme, alors que l'objet est alloué sur la pile. En d'autres termes, lorsque vous déclarez une variable de type objet, elle prendra autant d'espace sur la pile que la taille de l'objet, mais lorsque vous déclarez une variable de type classe, elle prendra toujours la taille d'un pointeur sur la pile. Les données de classe réelles seront sur le tas.

Définition des classes Pascal

Une classe est déclarée de la même manière qu'un objet, en utilisant la déclaration de type. La forme générale d'une déclaration de classe est la suivante -

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

Il vaut la peine de noter les points importants suivants -

  • Les définitions de classe doivent relever de la partie déclaration de type du programme uniquement.

  • Une classe est définie à l'aide du class mot-clé.

  • Les champs sont des éléments de données qui existent dans chaque instance de la classe.

  • Les méthodes sont déclarées dans la définition d'une classe.

  • Il existe un constructeur prédéfini appelé Createdans la classe Root. Chaque classe abstraite et chaque classe concrète est un descendant de Root, donc toutes les classes ont au moins un constructeur.

  • Il existe un destructeur prédéfini appelé Destroydans la classe Root. Chaque classe abstraite et chaque classe concrète est un descendant de Root, donc toutes les classes ont au moins un destructeur.

Définissons une classe Rectangle qui a deux membres de données de type entier - longueur et largeur et certaines fonctions membres pour manipuler ces membres de données et une procédure pour dessiner le rectangle.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

Écrivons un programme complet qui créerait une instance d'une classe de rectangle et dessinerait le rectangle. C'est le même exemple que nous avons utilisé lors de la discussion des objets Pascal. Vous constaterez que les deux programmes sont presque identiques, avec les exceptions suivantes -

  • Vous devrez inclure la directive {$ mode objfpc} pour utiliser les classes.

  • Vous devrez inclure la directive {$ m +} pour utiliser les constructeurs.

  • L'instanciation de classe est différente de l'instanciation d'objet. La seule déclaration de la variable ne crée pas d'espace pour l'instance, vous utiliserez le constructeur create pour allouer de la mémoire.

Voici l'exemple complet -

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

Visibilité des membres du groupe

La visibilité indique l'accessibilité des membres de la classe. Les membres de la classe Pascal ont cinq types de visibilité -

Sr.Non Visibilité et accessibilité
1

Public

Ces membres sont toujours accessibles.

2

Private

Ces membres ne sont accessibles que dans le module ou l'unité contenant la définition de classe. Ils sont accessibles depuis l'intérieur des méthodes de classe ou depuis l'extérieur d'elles.

3

Strict Private

Ces membres ne sont accessibles qu'à partir des méthodes de la classe elle-même. Les autres classes ou classes descendantes de la même unité ne peuvent pas y accéder.

4

Protected

C'est la même chose que private, sauf que ces membres sont accessibles aux types descendants, même s'ils sont implémentés dans d'autres modules.

5

Published

C'est la même chose qu'un Public, mais le compilateur génère des informations de type qui sont nécessaires pour le streaming automatique de ces classes si le compilateur est dans l'état {$ M +}. Les champs définis dans une section publiée doivent être de type classe.

Constructeurs et destructeurs pour les classes Pascal

Les constructeurs sont des méthodes spéciales, qui sont appelées automatiquement chaque fois qu'un objet est créé. Nous profitons donc pleinement de ce comportement en initialisant de nombreuses choses via des fonctions de constructeur.

Pascal fournit une fonction spéciale appelée create () pour définir un constructeur. Vous pouvez passer autant d'arguments que vous le souhaitez dans la fonction constructeur.

L'exemple suivant créera un constructeur pour une classe nommée Books et initialisera le prix et le titre du livre au moment de la création de l'objet.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Comme le constructeur implicite nommé create, il existe également une méthode destructrice implicite destroy à l'aide de laquelle vous pouvez libérer toutes les ressources utilisées dans la classe.

Héritage

Les définitions de classe Pascal peuvent éventuellement hériter d'une définition de classe parent. La syntaxe est la suivante -

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

L'exemple suivant fournit une classe de romans, qui hérite de la classe Books et ajoute plus de fonctionnalités en fonction de l'exigence.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Il vaut la peine de noter les points importants suivants -

  • Les membres de la classe Livres ont protected visibilité.

  • La classe Novels a deux constructeurs, donc le overload L'opérateur est utilisé pour la surcharge de fonction.

  • La procédure Books.Display a été déclarée virtual, afin que la même méthode de la classe Novels puisse override il.

  • Le constructeur Novels.Create appelle le constructeur de classe de base à l'aide du inherited mot-clé.

Interfaces

Les interfaces sont définies pour fournir un nom de fonction commun aux implémenteurs. Différents développeurs peuvent implémenter ces interfaces en fonction de leurs besoins. Vous pouvez dire que les interfaces sont des squelettes, qui sont implémentés par les développeurs. Voici un exemple d'interface -

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

Veuillez noter que, lorsqu'une classe implémente une interface, elle doit implémenter toutes les méthodes de l'interface. Si une méthode d'une interface n'est pas implémentée, alors le compilateur donnera une erreur.

Classes abstraites

Une classe abstraite est une classe qui ne peut pas être instanciée, seulement héritée. Une classe abstraite est spécifiée en incluant le mot symbole abstract dans la définition de classe, comme ceci -

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

Lors de l'héritage d'une classe abstraite, toutes les méthodes marquées abstract dans la déclaration de classe du parent doivent être définies par l'enfant; de plus, ces méthodes doivent être définies avec la même visibilité.

Mot-clé statique

Déclarer des membres de classe ou des méthodes comme statiques les rend accessibles sans avoir besoin d'une instanciation de la classe. Un membre déclaré comme statique n'est pas accessible avec un objet de classe instancié (bien qu'une méthode statique le puisse). L'exemple suivant illustre le concept -

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

12
31
31
51
51

Vous devez utiliser la directive {$ static on} pour utiliser les membres statiques.