Académique Documents
Professionnel Documents
Culture Documents
FSDM
FES
http://j.gs/18042175/smi-s3-2017-2018
TABLEAUX STATIQUES
TABLEAUX
Un tableau est utilisé pour représenter une suite d’éléments de même type
( T = (t1,t2,…,tn)).
Déclaration d’un tableau (à un dimension):
<nom du tableau> : tableau [1 .. max] de <type des éléments>
(exemple T : tableau [1..20] de réel)
où : - max est une constante entière (positive)
- le type des éléments est quelconque (de base ou déclaré).
20
TABLEAUX STATIQUES
21
TABLEAUX STATIQUES
22
TABLEAUX STATIQUES
23
TABLEAUX STATIQUES
24
TABLEAUX STATIQUES
o Remarques :
Le nom du tableau, dans une liste de paramètres
formels, est une référence.
(en C, l’adresse de T[i], notée T + i, est calculée:
adresse(T[i]) = adresse(T[0]) + sizeof(<type des éléments>) * i)
25
STRUCTURE (ENREGISTREMENT)
26
STRUCTURE (ENREGISTREMENT)
27
STRUCTURE (ENREGISTREMENT)
Exemples :
Adresse = structure
numero_rue : entier;
nom_rue : tableau[1..20] de caractère;
code_postal : entier;
fstructure
Point = structure
abscisse : réel;
ordonnee : réel;
fstructure
28
STRUCTURE (ENREGISTREMENT)
29
STRUCTURE (ENREGISTREMENT)
30
Type structurés et enregistrements
La manipulation d'un enregistrement se fait au travers de ses champs. Comme pour les tableaux,
il n'est pas possible de manipuler un enregistrement globalement, sauf pour affecter un enregistrement
à un autre de même type (ou le passer en paramètre). Par exemple, pour afficher un enregistrement il
faut afficher tous ses champs un par un.
Alors que les éléments d'un tableau sont par l’intermédiaire de leur indice, les champs d'un
enregistrement sont accessibles à travers leur nom, grâce à l'opérateur '.'
nom_enregistrement . nom_champ
représente la valeur mémorisée dans le champ de l'enregistrement
? Attention : le nom d'un champ est TOUJOURS précédé du nom de l'enregistrement auquel il
appartient. On ne peut pas trouver un nom de champ tout seul, sans indication de l'enregistrement.
Les champs d'un enregistrement, tout comme les éléments d'un tableau, sont des variables à qui on
peut faire subir les mêmes opérations (affectation, saisie, affichage,… ).
Exemple 1:
Programme de saisie des données concernant les personnes pers1 et pers2, puis affichage de la
différence d'âge entre ces deux personnes
Programme Exemple
Type
Structure tpersonne
nom : chaîne
prénom : chaîne
âge : entier
FinStruct
Var
pers1, pers2 : tpersonne
Début
Aff "Entrez le nom puis l'age de la personne 1"
Saisir pers1.nom, pers1.age // il est impossible d'écrire Saisir pers1
Aff "Entrez le nom puis l'âge de la personne 2"
Saisir pers2.nom, pers2.age
Aff "La différence d'âge entre ", pers1.nom, " et ", pers2.nom, " est de "
Si pers1.age > pers2.age
Alors Aff pers1.age – pers2.age, " ans "
Sinon Aff pers2.age – pers1.age, " ans "
FinSi
Fin
Rappel : il est possible d'affecter un enregistrement à un autre de même type. Là, il serait correct
d'écrire
pers1 <- pers2
32
Type structurés et enregistrements
Supposons que dans le type personne, nous ne voulions plus l'âge de la personne, mais sa date de
naissance. Une date est composée de trois variables (jour, mois, année) indissociables 1. Une date
correspond donc à une entité du monde réel qu'on doit représenter par un type enregistrement à 3
champs.
Si on déclare le type date au préalable, on peut l'utiliser dans la déclaration du type personne pour le
type de la date de naissance.
Un type structuré peut être utilisé comme type pour des champs d'un autre type structuré
TYPE
Structure date
jour: entier
mois: chaîne
année: entier
FinStuct
Structure personne
nom: chaîne
ddn: date
FinStruct
Pour accéder à l'année de naissance d'une personne, il faut utiliser deux fois l'opérateur '.'
pers1.ddn.année
Il faut lire une telle variable de droite à gauche : l'année de la date de naissance de la personne 1.
Exemple Complet
Un produit est livré par un seul fournisseur. Un fournisseur est caractérisé par son code, sa raison sociale
et son numéro de téléphone.
Structure fournisseur
code_frs : chaine
raison_sociale: chaine
tel: chaine
FinStruct
Structure Produit
code: chaîne
lib: chaîne
paht: réel
pvht: réel
txtva: réel
frs: fournisseur
FinStruct
Var
p: produit
Voilà l'instruction qui permet d'afficher le numéro de téléphone du fournisseur du produit p.frs.tel
33
Type structurés et enregistrements
Il est possible aussi qu'un champ de type structuré soit de type tableau, voire tableau structuré !
Exemple d'un type structuré contenant un tableau simple
Imaginons une structure mémorisant des critères géographiques de villes (altitude, type de climat, … ).
Certains de ces critères pourraient pertinemment être mémorisés pour chaque mois de l'année (par
exemple température moyenne, précipitations moyennes, … )
Structure Ville
Nom : chaîne
Alt : entier //Altitude moyenne
Climat : Chaîne //type de climat
Temp : tableau[1..12] de réel //température moyenne par mois
Précip : tableau[1..12] de réel //précipitations moyennes par mois
FinStruct
MaVille : Ville
Si on voulait afficher par exemple la température moyenne au mois de juillet de MaVille, on écrirait
tout simplement :
34
Type structurés et enregistrements
Type
Structure personne
nom: chaîne
age: entier
FinStruct
Var
groupe: tableau[1..NP] de personnes
Chaque élément du tableau est un enregistrement, contenant plusieurs variables de type différent. On
accède à un enregistrement par son indice dans le tableau.
groupe[2] représente la deuxième personne du groupe
groupe[2].nom représente le nom de la deuxième personne du groupe
nom âge nom des champs
1
3 enregistrements
4
indices du tableau
? Attention!
groupe.nom[3] n'est pas valide.
Pour accéder au nom de la troisième personne du tableau, il faut écrire groupe[3].nom
Les tableaux d'enregistrements peuvent aussi être eux même servir de type dans un autre type structuré
Exemple
Contexte : Dans un comité d'entreprise, on veut pouvoir connaître les enfants des employés et leur date
de naissance (pour le petit cadeau!). On suppose que le nombre d'enfant maxi d'un employé est de 10.
Structure Enfant
Nom : chaîne
Prénom : chaîne
Journaiss : entier
Moisnaiss : entier
Anneenaiss :entier
FinStructure
Structure Employé
Nom : chaîne
Prénom : Chaîne
…
Nbenf : entier //nombre d'enfants
Progéniture : tableau[1..10] d'Enfant
FinStruct
35
Et évidemment, on pourrait déclarer un tableau d'Employé. Ce qui ferait des tableaux imbriqués les
uns dans les autres…
Var
TabEmp : tableau[1..MAX] d'Employé
Pour afficher par exemple les anniversaires de tous les enfants de l'employé d'indice i, il faudrait
parcourir le tableau de ses enfants (avec un autre indice que i).
Exemple
Struct hms
heure : entier
minute : entier
seconde : entier
FinStruct
Du coup, la procédure converthms n'a plus qu'un seul paramètre résultat et peut être transformée en
fonction
36
Type structurés et enregistrements
Exemples d'appels
Remarque :
Lors de l'appel d'un sous-programme, un paramètre peut-être représenté par un ou plusieurs champ
d'un enregistrement (tout comme on peut passer la valeur d'une seule case d'un tableau en paramètre)
37