Algorithme BE
Algorithme BE
Un algorithme sert à transmettre un savoir faire. Il décrit les étapes à suivre pour
réaliser un travail. Il permet d'expliciter clairement les idées de solution d'un
problème indépendamment d'un langage de programmation. L'utilisateur d'un
algorithme n'aura qu'à suivre toutes les instructions, dans l'ordre (en séquence)
pour arriver au résultat que doit donner l'algorithme.
Un algorithme, c’est une suite d’instructions, qui une fois exécutée correctement,
conduit à un résultat donné.
La notion de base est celle d’instruction , définie comme étant la description non
ambiguë d’une ou plusieurs actions élémentaires à effectuer dans un ordre
déterminé.
Algorithme NomAlgorithme
Debut
Instructions
Fin
Selon les besoins une suite d’instructions formera un bloc délimité par
les mots Début et Fin :
Début
Instruction 1.
Instruction 2.
Instruction 3.
…
…
Instruction n.
Fin
2- Organigramme :
Les symboles utilisés dans un organigramme pour décrire un algorithme sont les
suivants :
Début
Instruction 1
Instruction 2
Instruction n
Fin
L’organigramme donne une impression de déroulement successif des instructions plus grandes,
mais ne met pas en évidence la notion de bloc.
Les variables et les constantes
Le type chaîne :
Une chaîne est une séquence de plusieurs caractères. Les opérations
élémentaires réalisables sont les comparaisons : <, >, =, ... selon l'ordre
lexicographique.
Contrairement aux variables dont les valeurs diffèrent souvent, les constantes
ont des valeurs fixes. Mais tout comme les variables, on affecte aux constantes, un nom
et une valeur qui est elle, fixe. De plus, les constantes se définissent de la même façon
que les variables. Tout dépend donc de l'endroit où est défini la constante.
Le mot Const est utilisé pour la déclaration des constantes
2- Instruction d'écriture
L'instruction de restitution de résultats sur le périphérique de sortie (en
général l'écran) est :
Ecrire (liste d'expressions)
Cette instruction réalise simplement l'affichage des valeurs des expressions
décrites dans la liste. Ces instructions peuvent être simplement des variables ayant
des valeurs ou même des nombres ou des commentaires écrits sous forme de chaînes
de caractères.
Ecrire "Entrez votre nom : "
Lire (NomFamille)
Écrire (x, y+2, "bonjour")
Exemple d'algorithme
On désire écrire un algorithme qui lit sur l'entrée standard une valeur
représentant une somme d'argent et qui calcule et affiche le nombre de billets de 100
Euros, 50 Euros et 10 Euros, et de pièces de 2 Euros et 1 Euro qu'elle représente.
Principe :
L'algorithme commence par lire sur l'entrée standard l'entier qui représente
la somme d'argent et affecte la valeur à une variable somme. Pour obtenir la
décomposition en nombre de billets et de pièces de la somme d'argent, on procède
par des divisions successives en conservant chaque fois le reste.
Exemple d'algorithme
Algorithme Calcul
Var somme : entier {la somme d'argent à décomposer}
b100 : entier {le nombre de billets de 100 Euros}
b50 : entier {le nombre de billets de 50 Euros}
b10 : entier {le nombre de billets de 10 Euros}
p2 : entier {le nombre de pièces de 2 Euros}
p1 : entier {le nombre de pièces de 1 Euro}
r100 : entier {reste de la division entière de somme par 100}
r50 : entier {reste de la division entière de r100 par 50}
r10 : entier {reste de la division entière de r50 par 10}
r2 : entier {reste de la division entière de r10 par 2}
Début
somme ← lire()
b100 ← somme ÷ 100
r100 ← somme mod 100
b50 ← r100 ÷ 50;
r50 ← r100 mod 50
b10 ← r50 ÷ 10
r10 ← r50 mod 10
p2 ← r10 ÷ 2
r2 ← r10 mod 2
p1 ← r2
écrire (b100, b50, b10, p2, p1)
fin
Instructions conditionnelles
Conditions composées
Certains problèmes exigent parfois de formuler plusieurs conditions reliées
par ce qu’on appelle un opérateur logique, l’informatique met à notre disposition
quatre opérateurs logiques : ET, OU, NON, et XOR.
On représente fréquemment tout ceci dans des tables de vérité (C1 et C2
représentent deux conditions, et on envisage à chaque fois les quatre cas possibles)
Exemple 1
Écrire un algorithme qui permet d'imprimer le résultat d'un étudiant à un
module sachant que ce module est sanctionné par une note d'oral de coefficient 1 et
une note d'écrit de coefficient 2. La moyenne obtenue doit être supérieure ou égale à
10 pour valider le module.
Instructions conditionnelles
Algorithme Moyenne
Var ne : réel {note d'écrit (cœfficient 2)}
no : réel {note d'oral (coefficient 1)}
moy : réel {moyenne du module}
Début
Lire(ne)
Lire(no)
moy ← (2 * ne + no)/3
Si moy < 10 alors
écrire ("reç")
sinon
écrire ("refusé")
fsi
fin
* Editer le plus grand des 2 nombres X et Y.
Algorithme SUP
Var X , Y : entier
Début
Lire (X ,Y)
Si X >Y alors
Ecrire (X)
Sinon
Ecrire (Y)
Fsi
Fin
Les itérations
Il arrive souvent dans un algorithme que dans la même action soit répétée plusieurs fois,
avec éventuellement quelques variations dans les paramètres qui précisent le déroulement
de l'action. Il est alors fastidieux d'écrire un algorithme qui contient de nombreuses fois la
même instruction. De plus, ce nombre peut dépendre du déroulement de l'algorithme. Il est
alors impossible de savoir à l'avance combien de fois la même instruction doit être décrite.
Pour gérer ces cas, on fait appel à des instructions en boucle qui ont pour effet de répéter
plusieurs fois une même instruction.
Deux formes existent : la première, si le nombre de répétitions est connu avant l'exécution
de l'instruction de répétition, la seconde s'il n'est pas connu. On appellera itération
l'exécution de la liste des instructions.
Répétitions inconditionnelles
Il est fréquent que le nombre de répétitions soit connu à l'avance, et que l'on ait besoin
d'utiliser le numéro de l'itération afin d'effectuer des calculs ou des tests. Le mécanisme
permettant cela est la boucle Pour.
Forme de la boucle Pour :
La variable dont on donne le nom va prendre successivement toutes les valeurs entières entre
valeur initiale et valeur finale. Pour chaque valeur prise par la variable, la liste des
instructions est exécutée. La valeur utilisée pour énumérer les itérations est appelée valeur
d'itération, indice d'itération ou compteur. L'incrémentation par 1 de la variable est
implicite.
Algorithme
Var i : Entier {indice d'itération}
début
écrire (1*9)
écrire (2*9)
écrire (3*9)
écrire (4*9)
écrire (5*9)
écrire (6*9)
écrire (7*9)
écrire (8*9)
écrire (9*9)
écrire (10*9)
fin
Il est plus simple d'utiliser une boucle avec un compteur prenant d'abord la
valeur 1, puis augmentant peu à peu jusqu'à atteindre 10.
Répétitions inconditionnelles
Algorithme
Var i : entier {indice d'itération}
début
pour i ← 1 Jusqu’à 10 faire
écrire (i*9)
fpour
fin
Exemple 2
Compte à rebours : écrire l'algorithme de la fonction qui, à partir d'un nombre
entier positif n, affiche tous les nombres par ordre décroissant jusqu'à 0.
Algorithme compteARebours
Var n : entier
i : entier {indice d'itération}
début
Lire (n)
pour i décroissant de n à 0 faire
écrire (i)
fpour
fin
Algorithme
Début
Var s : entier {somme des carré des n premiers entiers}
n : entier
i : entier {indice d'itération}
lire (n)
s← 0
pour i ← 1 à n faire
s ← s + i2
Fpour
écrire (s)
Fin
Schéma de l'évolution de l'état des variables instruction par instruction :
Instructions n s i
1 4
2 0
3 1
4 1
3 2
4 5
3 3
4 14
3 4
4 30
3 (Fin)
5 Ecrire()
Répétitions inconditionnelles
Comment initialiser la suite maximum ? Il faut que maximum1 prenne la valeur nombre1.
Il suffit alors de choisir une valeur de maximum0 plus petite que tout entier positif, par
exemple maximum0 = -1, de manière à assurer que maximum1 aura bien nombre1 pour
valeur. Il s'agit d'une initialisation à un terme artificiel.
Répétitions inconditionnelles
Algorithme
Début
Var n : entier {nombre d'entiers positifs donné}
maximum : entier {maximum des i premiers entiers}
nombre : entier {ième nombre lu}
i : entier {indice d'itération}
Lire (n)
maximum ← -1
pour i de 1 à n faire
lire (nombre)
si nombre > maximum alors
maximum ← nombre
fsi
Fpour
écrire (maximum)
Fin
On suppose que les valeurs introduites par l'utilisateur sont : 4 (nombre d'entiers à comparer),
2, 0, 8, 7.
Répétitions inconditionnelles
1 4
2 -1
3 1
4 2
5 Vrai
6 2
3 2
4 0
5 Faux
3 3
4 8
5 Vrai
6 8
3 4
4 7
5 Faux
3 (Fin)
7 Ecrire()
Répétitions inconditionnelles
L'initialisation a un terme artificiel n'est plus possible ici car les valeurs ne sont
plus bornées inférieurement. Une solution consiste alors à initialiser au premier terme et à
commencer la formule générale de récurrence à 2. Il s'agit d'une initialisation à un terme utile.
Répétitions inconditionnelles
Algorithme
Var n : entier {nombre d'entiers positifs donné}
maximum : entier {maximum des i premiers entiers}
nombre : entier {ième entier positif donné}
i : entier {indice d'itération}
Début
lire (n)
lire (maximum)
Pour i de 2 à n faire
lire (nombre)
si nombre > maximum alors
maximum ← nombre
Fsi
Fpour
écrire (maximum)
Fin
Répétitions inconditionnelles
1 4
2 2
3 2
4 0
5 Faux
3 3
4 8
5 Vrai
6 8
3 4
4 7
5 Faux
3 (Fin)
7 Ecrire()
Répétitions conditionnelles
L'utilisation d'une boucle pour nécessite de connaître à l'avance le nombre d'itérations désiré,
c'est-à-dire la valeur finale du compteur. Dans beaucoup de cas, on souhaite répéter une
instruction tant qu'une certaine condition est remplie, alors qu'il est à priori impossible de
savoir à l'avance au bout de combien d'itérations cette condition cessera d'être satisfaite. Le
mécanisme permettant cela est la boucle Tant que.
Cette instruction a une condition de poursuite dont la valeur est de type booléen et une liste
d'instructions qui est répétée si la valeur de la condition de poursuite est vraie : la liste
d'instructions est répétée autant de fois que la condition de poursuite a la valeur vraie. Le
déroulement pas à pas de cette instruction équivaut à :
Si condition alors
liste d'instructions
si condition alors
liste d'instructions
si condition alors
liste d'instructions ...
Répétitions conditionnelles
Étant donné que la condition est évaluée avant l'exécution des instructions à
répéter, il est possible que celles-ci ne soient jamais exécutées. Il faut que la liste des
instructions ait une incidence sur la condition afin qu'elle puisse être évaluée à faux et que la
boucle se termine. Il faut toujours s'assurer que la condition devient fausse au bout d'un temps
fini.
Exemple 1
On veut laisser un utilisateur construire des rectangles de taille quelconque, à condition que
les largeurs qu'il saisit soient supérieures à 1 pixel. On peut utiliser une répétition
conditionnelle qui permet de redemander à l'utilisateur de saisir une nouvelle valeur tant que
celle-ci n'est pas valide.
Algorithme saisirLargeurRectangle
Var largeur : entier {largeur courante saisie}
Début
écrire ("indiquez la largeur du rectangle :")
Lire (largeur)
Tant que largeur < 1 faire
écrire (« Erreur : indiquez une valeur strictement positive")
écrire ("indiquez la largeur du rectangle :")
Lire (largeur)
ftant
Fin
Répétitions conditionnelles
Étant donné que la condition est évaluée avant l'exécution des instructions à
répéter, il est possible que celles-ci ne soient jamais exécutées. Il faut que la liste des
instructions ait une incidence sur la condition afin qu'elle puisse être évaluée à faux et que la
boucle se termine. Il faut toujours s'assurer que la condition devient fausse au bout d'un temps
fini.
Exemple 2
Un poissonier sert un client qui a demandé 1Kg de poisson. Il pèse successivement différents
poissons et s'arrête dès que le poids total égale ou dépasse 1Kg. Donner le nombre de
poissons servis.
Remarque sur la terminaison :
Ce problème est typique des cas où le dernier terme (celui qui fait basculer le test)
doit être retenu.
Répétitions conditionnelles
Algorithme
Var poids_total : réel {poids total des i premiers poissons}
poids_poisson : réel {poids du ième poisson en grammes}
nb_poisson : entier {nombre de poissons vendus après la ième itération}
Début
poids_total <- 0
nb_poisson <- 0
tant que poids_total < 1000 faire (itération i)
lire (poids_poisson)
poids_total <- poids_total + poids_poisson
nb_poisson <- nb_poisson + 1
ftant
écrire (nb_poisson)
Fin
Répétitions conditionnelles
1 0
2 0
3 Vrai
4 350
5 350 Faux
6 1
3 Vrai
4 280
5 630
6 2
3 Vrai
4 375
5 1005
6 3
3 Faux
7 Ecrire()
Boucles imbriquées
Le corps d'une boucle est une liste d'instructions. Mais cette boucle est elle-même
une instruction. Donc le corps d'une boucle peut contenir une boucle dite imbriquée, qui
utilise un compteur différent. Il faut alors faire attention à l'ordre d'exécution des
instructions : à chaque passage dans le corps de la boucle principale, la boucle imbriquée va
être exécutée totalement.
Exemple
Ecrire l'algorithme permettant d’éditer le triangle suivant, le nombre de lignes
étant donné par l'utilisateur :
1 12 123 1234 12345 ...
Boucles imbriquées
Algorithme
Var nblignes : entier {nombre de lignes à éditer}
i : entier {indice d'itération sur les lignes}
j : entier {indice d'itération sur les éléments de la ième ligne}
Début
Lire (nblignes)
Pour i de 1 à nblignes faire
Pour j de 1 à i faire
écrire (j)
Fpour
Fpour
Fin
Les Fonctions Prédéfinies
Exemples :
Len("Bonjour, ça va ?") vaut
16
Len("")
vaut 0
Mid("Zorro is back", 4, 7) vaut
"ro is b"
Mid("Zorro is back", 12, 1) vaut
"c"
Left("Et pourtant…", 8) vaut
"Et pourt"
Right("Et pourtant…", 4) vaut
"t…"
Trouve("Un pur bonheur", "pur") vaut 4
Trouve("Un pur bonheur", "techno") vaut 0
Modulo
Cette fonction permet de récupérer le reste de la
division d’un nombre par un deuxième nombre. Par exemple :
A ← Mod(10,3) A vaut 1 car 10 = 3*3 + 1
B ← Mod(12,2) B vaut 0 car 12 = 6*2
C ← Mod(44,8) C vaut 4 car 44 = 5*8 + 4
Cette fonction peut paraître un peu bizarre, est réservée aux seuls
matheux. Mais vous aurez là aussi l’occasion de voir dans les exercices
à venir que ce n’est pas le cas.
Notion de tableau
Les tableaux servent à désigner une suite finie d'éléments de même type au
moyen d'une unique variable. Ces éléments peuvent être des entiers, des chaînes, ... Ils sont
stockés dans les différentes cases du tableau, habituellement numérotées de 1 à n
n représentant la taille du tableau (le nombre de cases dans le tableau).
Le type d'un tableau précise l'intervalle de définition et le type (commun) des
éléments.
Nomtableau : tableau [borne_inférieure .. borne_supérieure] type_des_éléments
Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case
contenant cet élément. Par exemple, pour accéder au septième élément (49) du tableau
d'entiers ci-dessus, on écrit :
t [7].
L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à
dire 45 :
x ← t [1] L'élément désigné du tableau peut être utilisé comme n'importe quelle
variable :
Les tableaux
Algorithme Remplissage_Affichage
Var n : entier {taille du tableau}
tab : tableau [1..n] entier
début
Lire (n)
Pour i ← 1 à n faire
Lire (tab[i])
fpour
pour i ← 1 à n faire
Écrire (tab[i])
fpour
fin
Exemple 2
Algorithme qui permet de multiplier par 2 tous les éléments d'un tableau.
Les tableaux
Algorithme doublerTableau
Var n : entier {taille du tableau}
t : tableau [1..n] entier {tableau modifiable}
début
Pour i ← 1 à n faire
t[i] ← t[i]*2
fpour
fin
Exemple : On cherche ici à savoir si un tableau saisi au clavier n'est constitué que d'entiers
positifs :
Les tableaux
Algorithme
Var i : entier {indice d'itération} , n : entier {taille du tableau}
tab : tableau entier [1..n] , positif : booléen {vrai si aucun entier négatif n'a été détecté}
début
Pour i ← 1 à n faire
lire (tab[i])
fpour
i←0
positif ← vrai
tant que positif et (i < n) faire
si tab[i] < 0 alors
positif ← faux
fsi
i ← i+1
ftant
si positif alors
écrire ("tableau d'entiers naturels")
sinon
écrire ("tableau d'entiers relatifs")
fsi
fin
Les tableaux
Parcours imbriqués
Certains algorithmes sur les tableaux font appel à des boucles imbriquées : la boucle
principale sert généralement à parcourir les cases une à une, tandis que le traitement de chaque
case dépend du parcours simple d'une partie du tableau (par exemple toutes les cases restantes),
ce qui correspond à la boucle interne.
Exemple
L’algorithme suivant calcule, pour chaque case d'un tableau, le nombre de cases
suivantes qui contiennent un élément strictement supérieur. Les résultats sont placés dans un
tableau.
Les tableaux
Algorithme calculerNbSuccesseurSup
Var n : entier {taille du tableau}
t : tableau [1..n] entier
tres : tableau [1..n] entier {tableau résultat (case i contient le nombre de cases de t indice
strictement supérieur à i qui contiennent un élément supérieur à t[i] }
i : entier {indice d'itération de la boucle principale (parcours pour remplir tres)}
j : entier {indice d'itération de la boucle interne (parcours des cases restantes de t)}
début
Pour i ← 1 à n-1 faire
tres[i] ← 0
fpour
Pour i ← 1 à n-1 faire
Pour j ← i+1 à n-1 faire
si t[i] < tres[i]+1 alors
tres[i] ← tres[i]+1
fsi
fpour
fpour
tres
Fin
Les tableaux
Tableaux multidimensionnels
Les cases d'un tableau à une dimension sont indicées de manière consécutive (cases
"alignées"). Il est possible de disposer ces cases selon des grilles (tableaux à deux dimensions),
des cubes (tableaux à trois dimensions), ...
Les algorithmes les plus simples sur ces tableaux utilisent néanmoins en général des
boucles imbriquées : chaque niveau de boucle correspond au parcours selon une dimension.
Le type d'un tableau précise l'intervalle de définition selon chaque dimension.
1 45 54 1 -56 22
2 64 8 54 34 2
3 56 23 -47 0 12
Les tableaux
x ← t[1,1]
L'élément désigné du tableau peut alors être utilisé comme n'importe quelle variable :
t[3,2] ← 43
1 45 54 1 -56 22
2 64 8 54 34 2
3 56 43 -47 0 12
Exemple : calcul de la somme
Algorithme somme
Var li : entier {nombre de lignes du tableau}
co : entier {nombre de colonnes du tableau}
t : tableau [1..li, 1..co] entier {tableau dont on cherche l'élément maximal}
s : entier {somme des éléments déjà parcourus}
i : entier {indice d'itération sur les lignes}
j : entier {indice d'itération sur les colonnes}
début
s←0
Pour i ← 1 à li faire
Pour j ← 1 à co faire
s ← s + t[i,j]
fpour
fpour
Ecrire (s)
fin
Recherche dichotomique
La fonction rechercheDicho recherche un élément dans un tableau trié et retourne
l'indice d'une occurrence de cet élément (ou -1 en cas d'échec). Une telle recherche peut être
réalisée de manière séquentielle ou dichotomique. Nous développons ici la version
dichotomique qui est la plus efficace en temps d'exécution.
Exemples :
Exemple de recherche dans le tableau d'entiers suivant défini sur l'intervalle [3..10] :
5 13 18 23 46 53 -89 97
3 4 5 6 7 8 9 10
Recherche de 46 :
Etape 1 : comparaison de 46 avec t[6] (6=(10+3)÷2), t[6]<46 => recherche dans [7..10]
Etape 2 : comparaison de 46 avec t[8], t[8]>46 => recherche dans [7..7]
Etape 3 : comparaison de 46 avec t[7], t[7]=46 => élément cherché trouvé à l'indice 7
Recherche de 10 :
Etape 1 : comparaison de 10 avec t[6], t[6]<10 => recherche dans [3..5]
Etape 2 : comparaison de 10 avec t[4], t[4]<10 => recherche dans [3..3]
Etape 3 : comparaison de 10 avec t[3], t[3]>10 => recherche dans [4..3], Borne inférieure
supérieure à la borne supérieure donc on met fin à l'algorithme et l'élément cherché n'a pas été
trouvé !
Paramètres modifiables
L'entête d'une fonction spécifie son nom, le type de son résultat, et les paramètres
(avec leurs types). Ces paramètres sont considérés comme les données transmises à la
fonction, c'est à dire l'entrée de la fonction. Il peut arriver que la fonction modifie ces
paramètres lors de l'exécution de son algorithme. On parle alors de paramètre modifiable : il
s'agit à la fois d'une entrée et d'une sortie de l'algorithme. La déclaration d'un tel paramètre
dans la liste des paramètres se fait de la manière suivante :
Exemple 1
La fonction suivante prend deux paramètres réels et les modifie de manière à ce
qu'ils soient dans l'ordre croissant (N.B. : elle ne retourne pas de résultat) :
Exemple 2
La fonction suivante prend trois paramètres réels : les deux premiers sont les bornes d'un
intervalle, et le troisième est (éventuellement) modifié de manière à rester dans l'intervalle
spécifié.
début
si x < inf alors
x <- inf
sinon
si x > sup alors
x <- sup
fsi
fsi
fin
Enfin, une fonction qui utilise des paramètres modifiables peut également renvoyer un
résultat.
Compléments sur les fonctions
Exemple 3
La fonction suivante est similaire à celle de l'exemple précédent. Elle renvoie en plus un
booléen égal à vrai si et seulement si le paramètre x a été effectivement modifié.
Appels de fonction
Les fonctions ont jusqu'à présent été utilisées de façon à présenter certains algorithme de
manière autonome (données fournies, résultat calculé). Plus généralement, les fonctions sont
utilisées pour décrire les différentes étapes d'un algorithme plus complexe. On peut alors
appeler ces fonctions pour réaliser les étapes de calcul correspondantes : lors de l'appel, on
indique grâce aux paramètres les données sur lesquelles la fonction doit travailler, puis on
récupère le résultat retourné. Un appel de fonction provoque donc l'exécution complète du
corps de cette fonction.
Le passage des paramètres sera décrit ici de manière intuitive. Chaque langage de
programmation traite cet aspect d'une manière rigoureuse, ce qui nécessite d'aborder les
notions plus détaillées (paramètres formels et effectifs, passage par valeur ou par adresse,
portée des paramètres, compatibilité des types, ...).
Compléments sur les fonctions
Exemple 1
Décrire un algorithme qui calcule le maximum de 4 réels saisis au clavier. Le
calcul du maximum de deux valeurs sera décrit par une fonction.
Algorithme
Var maximum : réel {maximum des i premiers nombre réels}
nombre : réel {ième réel donné}
i : entier {indice d'itération}
début
lire (maximum)
pour i de 2 à 4 faire
lire (nombre)
maximum <- calculerMax2Réels(nombre, maximum)
fpour
écrire (maximum)
fin
Il est possible d'utiliser les mêmes variables dans différentes fonctions et dans
l'algorithme principal. On précise donc à chaque fois à quelle fonction correspond la
variable.
Les paramètres fournis lors de l'appel peuvent être des expressions, s'il ne s'agit
pas de paramètres modifiables.
Si une fonction a des paramètres modifiables, les paramètres fournis lors de
l'appel doivent être des variables. Les instructions d'affectation que contient la fonction
appelée peuvent alors modifier ces variables.
Une fonction peut elle-même contenir plusieurs appels de fonctions. Il est
également possible d'utiliser le résultat d'une fonction directement dans le paramètre fourni
à l'appel d'une autre fonction.
Compléments sur les fonctions
Exemple 2
Un étudiant doit, pour obtenir son diplôme, passer un écrit et un oral dans deux
modules. le coefficient du premier module est le double de celui du second module. La
moyenne d'un module, afin de ne pas pénaliser trop les éventuels échecs accidentels,
accorde un coefficient double à la meilleure des deux notes obtenues.
On veut décrire un algorithme où, après saisie des quatre notes, la décision
finale est affichée (diplôme obtenu si la moyenne est supérieure ou égale à 10, aucun
module ne devant avoir une moyenne inférieure à 8).
Exemple 2
Exemple 2
fonction accorderDiplôme (m1:réel, m2:réel) : booléen
Var m1 : réel {moyenne premier module}
m2 : réel {moyenne second module}
moy : réel {moyenne générale}
recu : booléen {à vrai si l'étudiant a obtenu son diplôme}
début
moy <- calculerMoyenne(m2, m1)
si moy < 10 alors
recu <- faux
sinon
si (m1 < 8) ou (m2 < 8) alors
recu <- faux
sinon
recu < vrai
fsi
fsi
retourne
recu
fin
Compléments sur les fonctions
Algorithme
Var ne_m1 : réel {note d'écrit du premier module}
no_m1 : réel {note d'oral du premier module}
ne_m2 : réel {note d'écrit du second module}
no_m2 : réel {note d'oral du second module}
obtenu : booléen {vrai si le diplôme est accordé}
début
lire (ne_m1)
lire (no_m1)
lire (ne_m2)
lire (no_m2)
obtenu <- accorderDiplôme (calculerNoteModule(ne_m1, no_m1),
calculerNoteModule(ne_m2, no_m2))
si obtenu alors
écrire("diplôme obtenu")
sinon
écrire("diplôme non accordé")
fsi
fin
Données structurées
6. Données structurées
6.1 Données structurées simples
nous pouvions réserver un emplacement pour une information
d'un certain type. Un tel emplacement s'appelle une variable.
Nous pouvions aussi réserver une série d'emplacement
numérotés pour une série d'information de même type. Un tel
emplacement s'appelle un tableau
Nous pouvons réserver une série d'emplacements pour des
données de type différents. Un tel emplacement s'appelle une
variable structurée.
Ainsi, le problème du "découpage" de chaque enregistrement en
différentes variables (le nom, le prénom, le numéro de téléphone, etc.)
sera résolu d'avance, puisqu'on aura une structure, en quelque sorte, tout
prêt d'avance pour accueillir et prédécouper nos enregistrements.
Données structurées
Ici, Militaire est le nom de ma structure. Ce mot jouera par la suite dans
mon programme exactement le même rôle que les types prédéfinis
comme Numérique, Caractère ou Booléen.
Maintenant que la structure est définie, je vais pouvoir, dans la
section du programme où s'effectuent les déclarations, créer une ou des
variables correspondant à cette structure :
Var Personnel : Militaire
Et je pourrais remplir les différentes informations contenues au
sein de la variable Individu de la manière suivante :
Personnel ← “Alaoui", “Mohamed", “MG", “SIGR"
Algorithme Stagiaire
Const N=30
Type Structure Stagiaire
Matricule : Entier
Nom : Chaine * 20
Prénom : Chaine * 15
Adresse : Chaine * 30
Tel : Chaine * 10
Fin Structure
Var
T : Tableau [1..N] Stagiaire
i : Entier
Début
{Enregistrement des Stagiaires}
Pour i ← 1 Jusqu’à N Faire
Lire ( T[i].Matricule )
Lire ( T[i].Nom )
Lire ( T[i].Prénom )
Lire ( T[i].Adresse )
Lire ( T[i].Tel )
FPour
Fin
Données structurées
Algorithme Stagiaire
Const N=30
Type Structure Adresse
Num : Entier
Rue : Chaine * 10
Ville : Chaine * 20
Fin Structure
Structure Stagiaire
Matricule : Entier
Nom : Chaine * 20
Prénom : Chaine * 15
Adr : Adresse
Tel : Chaine * 10
Fin Structure
Var
T : Tableau [1..N] Stagiaire
i : Entier
Début
{Enregistrement des Stagiaires}
Pour i ← 1 Jusqu’à N Faire
Lire ( T[i].Matricule )
Lire ( T[i].Nom )
Lire ( T[i].Prénom )
Lire ( T[i].Adr.Num )
Lire ( T[i].Adr.Rue )
Lire ( T[i].Adr.Ville )
Lire ( T[i].Tel )
FPour
Fin
Données structurées
Algorithme Stagiaire
Const N=30
Type Structure Adresse
Num : Entier
Rue : Chaine * 10
Ville : Chaine * 20
Fin Structure
Structure Stagiaire
Matricule : Entier
Nom : Chaine * 20
Prénom : Chaine * 15
Adr : Adresse
Tel : Chaine * 10
Fin Structure
Var
T : Tableau [1..N] Stagiaire
i,j : Entier
St : Stagiaire
Début
{Enregistrement des Stagiaires}
Pour i ← 1 Jusqu’à N Faire
Lire ( T[i].Matricule )
Lire ( T[i].Nom )
Lire ( T[i].Prénom )
Lire ( T[i].Adr.Num )
Lire ( T[i].Adr.Rue )
Lire ( T[i].Adr.Ville )
Lire ( T[i].Tel )
FPour
Données structurées
Ecrire ( T[i].Matricule )
Ecrire ( T[i].Nom )
Ecrire ( T[i].Prénom )
Ecrire ( T[i].Adr.Num )
Ecrire ( T[i].Adr.Rue )
Ecrire ( T[i].Adr.Ville )
Ecrire ( T[i].Tel )
FPour
Fin
Les Fichiers
3. Types d’accès
Il existe une autre ligne de partage des fichiers : le type d’accès,
autrement dit la manière dont la machine va pouvoir aller rechercher les
informations contenues dans le fichier.
On distingue :
L’accès séquentiel : Dans le cas d'un fichier texte, cela signifie qu'on lit
le fichier ligne par ligne (enregistrement par enregistrement).
L’accès direct : on peut accéder directement à l’enregistrement de son
choix, en précisant le numéro de cet enregistrement.
L’accès indexé : pour simplifier, il combine la rapidité de l'accès direct
et la simplicité de l'accès séquentiel (en restant toutefois plus compliqué).
Il est particulièrement adapté au traitement des gros fichiers, comme les
bases de données importantes.
En fait, tout fichier peut être utilisé avec l’un ou l’autre des trois
types d’accès. Le choix du type d’accès n’est pas un choix qui concerne le
fichier lui-même, mais uniquement la manière dont il va être traité par la
machine. C’est donc dans le programme, et seulement dans le
programme, que l’on choisit le type d’accès souhaité.
Les Fichiers
- La Variable Fiche est un fichier (File) dont ses composants sont du type
Personne.
- Bien entendu, le fichier qui l’on va ainsi créer contenuera à exister,
indépendament du programme lui-même, notament comme tout fichier, il possédera un nom
de la forme :
NomFichier.EXT
Ce nom est spécifié par l’instruction :
Affecter (NomFichier_Logique , NomFichier_Physique)
Exemple : Affecter ( Fich , "C:Exemple.Dat")
Les Fichiers
Instructions de Manipulation :
- Ouverture du fichier en Lecture :
Il permet l’ouverture de fichier pour l’écriture des informations lus au clavier dans
le fichier.
Les Fichiers
- Fermeture du fichier :
Fermer (Fich)
Il permet la fermeture du fichier
Les Fichiers
Cherche (Fich , N)
Il permet de déplacer la fenêtre sur le N+1 élément.
Les fonctions Standards :
- EOF ( Fich ) : Est une fonction (End Of File) qui renvoie la valeur Vrai si on a
atteint la fin du fichier
Algorithme Création
Type Structure Personne
Matricule : Entier
Nom : Chaine * 20
Prénom : Chaine * 15
Fin Structure
Var
Fich : File of Personne
Individu : Personne
Début
Algorithme Affichage
Type Structure Personne
Matricule : Entier
Nom : Chaine * 20
Prénom : Chaine * 15
Fin Structure
Var
Fich : File of Personne
Individu : Personne
Début
FTantQue
Fermer ( Fich )
Fin
Les Fichiers
5. Stratégies de traitement
Il existe globalement deux manières de traiter les fichiers textes :
l’une consiste à s’en tenir au fichier proprement dit, c'est-à-dire à
modifier directement (ou presque) les informations sur le disque dur.
C’est parfois un peu acrobatique, lorsqu’on veut supprimer un
élément d’un fichier : on programme alors une boucle avec un test,
qui recopie dans un deuxième fichier tous les éléments du premier
fichier sauf un ; et il faut ensuite recopier intégralement le deuxième
fichier à la place du premier fichier.
l’autre stratégie consiste, comme on l’a vu, à passer par un ou
plusieurs tableaux. En fait, le principe fondamental de cette
approche est de commencer, avant toute autre chose, par recopier
l’intégralité du fichier de départ en mémoire vive. Ensuite, on
ne manipule que cette mémoire vive (concrètement, un ou plusieurs
tableaux). Et lorsque le traitement est terminé, on recopie à nouveau
dans l'autre sens, depuis la mémoire vive vers le fichier d’origine.
Les avantages de la seconde technique sont nombreux, et 99 fois
sur 100, c'est ainsi qu'il faudra procéder :
la rapidité : les accès en mémoire vive sont des milliers de fois plus
rapides que les accès aux mémoires de masse.
En basculant le fichier du départ dans un tableau, on
minimise le nombre ultérieur d'accès disque, tous les traitements
Les Fichiers
7. Récapitulatif général
Lorsqu'on est amené à travailler avec des données situées dans
un fichier, plusieurs choix, en partie indépendants les uns des autres,
doivent être faits :
sur l'organisation en enregistrements du fichier (choix entre fichier
texte ou fichier binaire)
sur le mode d'accès aux enregistrements du fichier (direct ou
séquentiel)
sur l'organisation des champs au sein des enregistrements (présence de
séparateurs ou champs de largeur fixe)
sur le type de variables utilisées pour cette recopie en mémoire vive
(plusieurs tableaux de type simple, ou un seul tableau de type
structuré).
Chacune de ces options présente avantages et inconvénients, et
il est impossible de donner une règle de conduite valable en toute
circonstance. Il faut connaître ces techniques, et savoir choisir la bonne
option selon le problème à traiter.