M106-SC-01-Algorithmique 1
M106-SC-01-Algorithmique 1
I : Introduction
La DEMARCHE ALGORITHMIQUE est une composante essentielle de l’activité mathématique.
• L’usage et le développement des algorithmes font partie de notre quotidien ; ils sont notamment à la base
du fonctionnement des automates, des calculatrices et des ordinateurs.
• De nombreux algorithmes sont connus depuis l’Antiquité, dont l’algorithme d’Euclide, qui permet de calculer
le PGCD de deux nombres entiers non nuls.
En résumé, on peut considérer dans une PREMIERE APPROCHE qu’un algorithme décrit un processus de résolution
d’un problème défini, rédigé dans un langage formalisé et produisant un résultat en un temps fini.
Le mot ALGORITHME tire son nom du mathématicien persan Al-Khuwarizmi (né vers 780 - mort vers 850) qui a écrit
en langue arabe le plus ancien traité d’algèbre baptisé « Abrégé de calcul par la complétion et la simplification »
dans lequel il décrivait des procédés de calcul à suivre étape par étape pour résoudre des problèmes ramenés à des
équations.
Un algorithme est donc une séquence d’étapes de calcul qui transforment l’entrée en sortie.
L’on peut aussi considérer un algorithme comme un outil permettant de résoudre un problème de calcul bien
spécifié.
L’énoncé du problème spécifie, en termes généraux, la relation désirée entre l’entrée et la sortie.
L’algorithme décrit une procédure de calcul spécifique permettant d’obtenir cette relation entrée/sortie.
Un ALGORITHME est une suite finie d’instructions élémentaires (règles), qui s’appliquent dans un ordre déterminé à
un nombre fini de données pour fournir un résultat.
Supposons, par exemple, qu’il faille trier une suite de nombres dans l’ordre croissant.
Problème : tri ; données : ensemble des nombres ; résultat ou sortie : les nombres en ordre.
Un algorithme peut être écrit en utilisant un langage de description d’algorithme (LDA). Ce langage utilise un
ensemble de mots clés et de structures permettant de décrire de manière complète et claire l’ensemble des
opérations à exécuter sur des données pour obtenir des résultats. Un tel langage présente un réel avantage, celui de
pouvoir être transcrit dans un langage de programmation structuré et lisible. Il ne faut donc pas confondre
algorithme et programme.
4) Organigramme
En algorithmique, on peut aussi utiliser un
Organigramme, c’est-à-dire représenter
graphiquement l’algorithme à l’aide de symboles
normalisés.
Exemples :
• Symbole de traitement (symbole général)
(rectangle ou parallélogramme)
• Symbole de test (symbole de branchement)
(losange)
• Symbole auxiliaire (symbole de début, fin ou
interruption d’algorithme) (Ellipse)
Autrement dit, après avoir précisé en en-tête le nom de l’algorithme afin d’en identifier le but, l’algorithme se
compose des déclarations de constantes, de variables et de structures, qui correspondent à une liste exhaustive
des ressources utilisées et manipulées dans le corps de l’algorithme.
Remarque : L’entrée des données (saisie de caractères ou de nombres sur le clavier, lecture de la position du
pointeur de la souris, lecture d’un fichier contenant ces nombres ou caractères …) s’intègre dans cette phase de
préparation du traitement.
2) Le traitement de données
Cette phase, qui correspond au corps de l’algorithme, consiste à spécifier toutes les étapes des instructions à
donner pour une exécution automatique.
Il existe plusieurs types d’algorithmes, déterminés selon le type d’exécution des instructions :
• Si les instructions s’exécutent en séquence, on parle d’algorithme séquentiel ;
• Si les opérations s’exécutent sur plusieurs processeurs en parallèle, on parle d’algorithme parallèle ;
• Si les instructions s’exécutent sur un réseau de processeurs, on parle d’algorithme réparti ou distribué.
3) La sortie de résultats
Les résultats obtenus, graphiques ou sonores, peuvent être :
• Affichés sur l’écran
• Conservés en mémoire jusqu’à la prochaine exécution
• Imprimés sur papier
• Conservés dans un fichier
• Perdus !
IV : Constantes et variables
Les constantes et les variables sont des éléments fondamentaux, indispensables au bon déroulement d’un
algorithme, caractérisés par un identificateur, une valeur et un type.
1) Définitions
▪ Une VARIABLE est une donnée (emplacement) stockée dans la mémoire de la calculatrice ou de
l’ordinateur. Elle est repérée par un identificateur (nom de la variable constitué de lettres et/ou de chiffres,
sans espace) et contient une valeur dont le type (nature de la variable) peut être un entier, un réel, un
booléen, un caractère, une chaîne de caractères…
▪ Une CONSTANTE, comme une variable, peut représenter un chiffre, un nombre, un caractère, une chaîne de
caractères, un booléen.
Toutefois, contrairement à une variable dont la valeur peut être modifiée au cours de l’exécution de
l’algorithme, la valeur d’une constante ne varie pas.
▪ Ne pas confondre la variable et son identificateur. En effet, la variable possède une valeur (son contenu) et
une adresse (emplacement dans la mémoire où est stockée la valeur). L’identificateur n’est que le nom de la
variable, c’est-à-dire un constituant de cette variable.
▪ Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre et les opérations réalisables
qu’elle peut subir.
▪ L’utilisation d’une variable doit être précédée de sa déclaration. La syntaxe pour déclarer une variable est la
suivante :
Variables :
Identificateur de la variable_1 : type de la variable_1
Identificateur de la variable_2 : type de la variable_2
…
Identificateur de la variable_N : type de la variable_N
▪ Si la valeur de la variable peut changer au cours du déroulement de l’algorithme, en revanche son type est
figé lors de déclaration.
2) Conventions de nommage
Le nom d’un algorithme, d’une variable ou d’une constante doit respecter les règles suivantes :
V : Opérandes et opérateurs
1) Définitions
❖ Un OPERATEUR est un outil qui permet d’agir sur une variable ou d’effectuer des calculs.
❖ Un OPERANDE est une donnée utilisée par un opérateur.
2) Types d’opérateurs
▪ Les opérateurs arithmétiques qui permettent d’effectuer des opérations arithmétiques entre opérandes
numériques :
✓ Opérateurs élémentaires : « + », « - », « × », « ÷ », « / » (division entière)
✓ Changement de signe : « - »
✓ Elévation à la puissance : « ^ »
✓ Reste d’une division entière : « modulo » (ou « mod »)
▪ Les opérateurs de comparaison (« = », « ≠ », « < », « > », « ≤ » et « ≥ ») qui permettent de comparer deux
opérandes et produisent une valeur booléenne, en s’appuyant sur des relations d’ordre :
✓ Ordre naturel pour les entiers et les réels
✓ Ordre lexicographique ASCII pour les chaînes de caractère
▪ Les opérateurs logiques qui combinent des opérandes booléens pour former des expressions logiques plus
complexes :
✓ Opérateur unaire : « non » (négation)
✓ Opérateurs binaires : « et » (conjonction), « ou » (disjonction), « ou_exclusif »
✓ L’opérateur de concaténation qui permet de créer une chaîne de caractères à partir de deux chaînes
de caractère en les mettant bout à bout.
✓ Opérateurs sur les entiers et les réels : addition, soustraction, multiplication, division, division entière,
puissance, comparaisons, modulo (reste d’une division entière)
✓ Opérateurs sur les booléens : comparaisons, négation, conjonction, disjonction
✓ Opérateurs sur les caractères : comparaisons
✓ Opérateurs sur les chaînes de caractères : comparaisons, concaténation
A chaque opérateur est associée une priorité. Lors de l’évaluation d’une expression, la priorité de chaque opérateur
permet de définir l’ordre d’exécution des différentes opérations. Aussi, pour lever toute ambiguïté ou pour modifier
l’ordre d’exécution, on peut utiliser des parenthèses.
Remarques :
VI : Instructions de base
1) Définitions :
▪ L’instruction d’AFFECTATION permet d’attribuer une valeur à une variable. Cette instruction est notée «
identificateur prend valeur ».
Comme il a été vu précédemment, on peut aussi noter : « identificateur ← valeur ».
▪ L’ENTREE ou la lecture de données correspond à l’opération qui permet de saisir des valeurs pour qu’elles
soient utilisées par le programme. Cette instruction est notée « saisir identificateur » ou « lire identificateur ».
▪ La SORTIE ou l’écriture des données permet l’affichage des valeurs des variables après traitement.
Cette instruction est notée « afficher identificateur ».
Remarques :
✓ L’affectation d’une valeur à une variable peut être assimilée au rangement d’un objet dans un tiroir, sur la
façade duquel figure l’identificateur, et qui ne peut contenir qu’un objet à la fois.
✓ En sortie, on peut également afficher un message suivi d’une expression ; l’instruction est alors notée «
afficher (message, expression) ».
Variables
prixHT, prixTTC : réels (déclaration des variables pour lesquelles il reste préférable de donner un identificateur
explicite ; ici prixHT désigne le prix hors taxe et prixTTC le prix toutes taxes comprises)
Début
prend TVA prend 0,196 ; (on affecte la valeur 0,196, soit 19,6%, à la variable TVA; on peut également noter
cette affectation TVA←0,196)
afficher (« Renseigner le prix hors taxes de l’article. ») ; (affichage de la phrase entre guillemets)
saisir (prixHT) ; (lecture de la valeur de la variable prixHT )
prixTTC prend (prixHT+prixHT*TVA); (calcul du prix TTC avec l’opérateur × prioritaire devant l’opérateur + )
afficher (« Après application de la TVA, le prix de l’article devient », prixTTC, « toutes taxes comprises. »)
(sortie du résultat qui proposera l’affichage de la 1ère locution entre guillemets, puis le prix hors taxes qui
avait été saisi par l’utilisateur, puis la 2 locution entre guillemets, et enfin le prix toutes taxes comprises qui a
été calculé dans le corps de l’algorithme)
Fin
Exercice 2 :
Soit un nombre entier à multiplier par son suivant.
1. Ecrire l'algorithme correspondant.
2. Dessiner l'organigramme
Exercice 3 :
Quelle seront les valeurs des variables A et B après l’exécution de l'algorithme suivant ?
Algorithme Algo_1
Var A,B : entier
Début
A←1;
B←A+1;
A←3;
FIN
Exercice 4 :
Quelle seront les valeurs des variables A, B et C après l’exécution de l'algorithme suivant ?
Algorithme Algo_1.2
Début
Algorithmique Page 6 sur 23
A←7;
B←10;
C←A+B;
A←3;
C←B-A;
Fin
Exercices 5 :
Ecrire un Algorithme "Permut" permettant d'échanger les valeurs de deux variables entières
(permutation).
Exercice 6 :
Ecrire un Algorithme permettant de lire une variable et de calculer et afficher son carrée.
3) Solution des exercices
Exercice 1 :
Algorithme sous_add_mul_div
Var add , mul , sous , div , A , B : entier ;
Début
Ecrire ("entrer deux variables");
Lire (A,B);
add←A+B;
mul←AxB;
sous←A-B;
div←A/B; * / donne la division entière de A et B
Ecrire("Le résultat de la multiplication est", mul);
Ecrire("Le résultat de l'addition est", add);
Ecrire("Le résultat de la soustraction est", sous);
Ecrire("Le résultat de la division est", div);
Exercice 2 :
Algorithme mul_svt
Var X
Début
Ecrire ("saisir un nombre");
Lire X ;
X←X x(X+1)
Ecrire(X);
Fin
Exercice 3 :
A=3;
B=2;
Exercice 4 :
A=3;
B=10;
C=7
Algorithmique Page 7 sur 23
Exercice 5 :
Algorithme Permut
Var A,B,C: entier
Début
C←A; *On stocke la valeur de A dans une variable intermédiaire C , car après la
première permutation on perd la valeur de A.
A←B;
B←C .
Fin
Exercice 6 :
Algorithme Carré
Var val ,C : entier;
Lire Val ;
Début
Ecrire("entrer une valeur entière");
C←val x val ;
Ecrire(C);
Fin ;
1) Définitions :
▪ Une STRUCTURE LINEAIRE (ou STRUCTURE SEQUENTIELLE) se caractérise par une suite de traitements à
exécuter successivement, dans l’ordre énoncé.
Une CONDITION est une expression logique booléenne, prenant la valeur « vrai » ou « faux » (c’est-à-dire « oui »
ou « non »).
▪ Une STRUCTURE ALTERNATIVE (ou STRUCTURE CONDITIONNELLE) n’offre que deux issues possibles à la
poursuite de l’algorithme, qui s’excluent mutuellement. Selon qu’une condition est vraie ou fausse, on
effectue un traitement ou un autre. On parle de traitements conditionnels. Une structure alternative est
donc une structure de test.
▪ Une STRUCTURE REPETITIVE (ou STRUCTURE ITERATIVE) répète l’exécution d’un traitement, dans un ordre
précis, un nombre déterminé ou indéterminé de fois. Une structure itérative est aussi appelée boucle.
▪ Une STRUCTURE DE CHOIX permet, en fonction de plusieurs conditions de type booléen, d’exécuter des
traitements différents selon les valeurs que peut prendre une même variable.
On note très simplement les structures linéaires, comme une suite de traitements à exécuter dans l’ordre où ils
sont énoncés :
Faire traitement 1 ;
Faire traitement 2 ;
…;
Faire traitement N ;
3) Structures alternatives
La résolution de certains problèmes nécessite parfois la mise en place d’un test pour effectuer une tâche :
Si condition
Alors traitement 1 ; (instructions à effectuer si la condition est vérifiée)
Sinon
traitement 2 ; (instructions à effectuer si la condition n’est pas vérifiée)
FinSi
❖ Une condition simple peut correspondre à un test d’égalité (par exemple : A = B ) ou d’inégalité (par
exemple : A ≤ B ) ;
❖ Une condition complexe est une combinaison logique de conditions simples (par exemple : A = B et B < C ).
La structure proposée précédemment est qualifiée de « complète » mais, selon le cas, il se peut que, si la condition
n’est pas vérifiée, il n’y ait pas à effectuer de traitement 2. On écrira ainsi la structure alternative « réduite ».
Si condition
Plusieurs structures alternatives peuvent être imbriquées, si bien que dans un traitement peut (peuvent) figurer une
ou plusieurs structure(s) alternative(s).
Pour une meilleure lisibilité de l’algorithme, on utilise l’INDENTATION, qui consiste à écrire les instructions sur des
lignes différentes en procédant à des décalages.
Remarque : Il s’avère parfois nécessaire d’exécuter plusieurs fois de suite le même traitement, c’est-à-dire la même
série d’instructions. Dans ce cas, il convient de faire appel aux structures répétitives.
La structure de choix permet, en fonction de plusieurs conditions de type booléen, d’effectuer des traitements
spécifiques.
Exemple (numérique) : Proposons un algorithme qui choisit de manière aléatoire un nombre entier compris entre 1
et 6 et précise si ce nombre est pair ou impair, premier ou pas.
Rappel :
Un nombre entier est premier si, et seulement si, il a pour uniques diviseurs 1 et lui-même. Les nombres 2, 3, 5 et 7
sont les seuls nombres premiers inférieurs à 10.
Remarque : 2 est le seul nombre premier pair.
Toutes les structures itératives répètent l’exécution de traitement(s). Deux cas sont cependant à envisager, selon
que :
• Le nombre de répétitions est connu à l’avance : c’est le cas des boucles itératives
• Le nombre de répétitions n’est pas connu ou est variable : c’est le cas des boucles conditionnelles
Cette structure est une BOUCLE ITERATIVE ; elle consiste à répéter un certain traitement un nombre de fois fixé à
l’avance. En algorithmique, on traduit cette structure itérative à l’aide des instructions :
Pour i De 1 Jusqu’à N (on répète un nombre connu de fois le même traitement ; ici, de 1 à, donc fois)
Remarques :
La variable i est un compteur, dont la valeur augmente automatiquement de 1 à chaque tour. Cette variable permet
en définitive de contrôler le nombre entier de tours. Cette variable est en d’autres termes une variable de contrôle
d’itération, caractérisée par sa valeur initiale, sa valeur finale et son pas de variation.
La sortie de la boucle s’effectue lorsque le nombre souhaité d’itérations est atteint, c’est-à-dire lorsque i prend la
valeur N.
Exemple 1 (fonction) : Proposons un algorithme qui calcule le carré de tous les entiers compris entre 1 et 50.
Remarque : A chaque tour de boucle, on affiche la locution « Le nombre » suivie de la valeur du nombre nb, suivie de
la locution « a pour cube », suivie de la valeur du cube du nombre, à savoir la valeur de la variable cube.
Exemple 2 (numérique) : Ecrivons un algorithme permettant de calculer la somme des entiers de 1 à N, le nombre N
étant renseigné par l’utilisateur.
Parfois, pour réaliser une tâche, on doit effectuer plusieurs fois les mêmes instructions, sans que le nombre de fois
soit déterminé à l’avance. On utilise alors une BOUCLE CONDITIONNELLE. Dans cette structure, le même traitement
est effectué tant qu’une condition reste valide ; la boucle s’arrête quand celle-ci n’est plus remplie. Cette structure
répétitive est ainsi formulée :
Tant que condition (on répète un nombre inconnu de fois le même traitement, autant de fois que la condition est
vérifiée)
Faire traitement (instructions à effectuer)
FinTant
Remarques :
• Le nombre de répétitions dépendra de la condition.
• Si la condition n’est pas vérifiée au début, alors le traitement 1 ne sera pas exécuté du tout.
• Si la condition est vérifiée au début et si la condition n’est pas susceptible d’être modifiée lors du traitement
1, alors le traitement 1 sera indéfiniment exécuté et l’utilisateur sera contraint d’arrêter le programme. Dans
Exemple 1 (fonction) : Proposons un algorithme qui permet d’afficher tous les nombres entiers naturels dont le cube
est inférieur à 500.
Exemple 2 (numérique) : Ecrivons un algorithme permettant de déterminer le PGCD de deux nombres entiers.
Rappel : En arithmétique, le plus grand commun diviseur (PGCD) de deux nombres entiers naturels est le plus grand
entier naturel qui divise simultanément ces deux entiers.
Une variante de structure répétitive avec BOUCLE CONDITIONNELLE consiste à répéter un traitement jusqu’à ce
qu’une certaine condition soit vérifiée. On la traduit par l’instruction :
Répète (on répète un nombre inconnu de fois le même traitement, autant de fois que la condition n’est pas
vérifiée)
FAIRE traitement (instructions à effectuer)
Jusqu’à condition
Remarque : Dans ce type d’instruction, le test est effectué à la fin de la boucle, si bien que le traitement est
exécuté au moins une fois, que la condition soit ou non vérifiée au début.
Imaginons que dans un programme, nous ayons besoin simultanément de 25 valeurs (par exemple, des notes pour
calculer une moyenne). La solution consiste à déclarer 25 variables réelles, appelées par exemple n1,n2,n3,…,n25 et la
variable moyenne réelle.
moyenne = (n1+n2+n3+…+n25) / 25
Un ensemble de valeurs portant ainsi le même nom de variable et repérées par un nombre, s’appelle un tableau,
et le nombre qui sert à repérer chaque valeur s’appelle un indice.
Un tableau de taille n est une structure très simple constituée de n emplacements consécutifs en mémoire. Il est
donc possible d'accéder à un élément d'un tableau en temps constant pourvu que l'on connaisse sa position (ou
indice). Un tableau est donc une structure très simple et très efficace.
Dans notre exemple, nous créerons donc un tableau appelé Note[]. Et chaque note individuelle sera désignée par :
Note[i] (l’élément qui se trouve à la position i).
Pour déclarer un tableau il faut préciser le nombre et le type de valeurs qu’il contiendra.
Tableau Note[25] : réels
Cette déclaration réserve l’emplacement de 25 éléments de type réels. Chaque élément est repéré par son indice
(position de l’élément dans le tableau). Dans la plupart des langages de programmation la première position porte le
numéro 0. Dans notre exemple, les indices vont de 0 à 24. Le premier élément du tableau sera désigné par Note[0],
le deuxième par Note[1], le dernier par Note[24]. L’utilisation de Note[25] déclenchera une erreur.
On peut créer des tableaux contenant des variables de tous types, mais on ne peut pas faire un mixage de types
différents de valeurs au sein d’un même tableau.
L’énorme avantage des tableaux, c’est qu’on va pouvoir les traiter en faisant des boucles.
Exemple
Voici un programme qui comporte la déclaration d’un tableau de 25 réels (les notes d’une classe), on commence par
effectuer la saisie des notes, et ensuite on calcul la moyenne des 25 notes et on affiche la moyenne :
Il arrive fréquemment que l’on ne connaisse pas à l’avance le nombre d’éléments que devra comporter un tableau.
Bien sûr, une solution consisterait à déclarer un tableau gigantesque (10 000 éléments) pour être sûr que "ça
rentre". Mais d’une part, on n’en sera jamais parfaitement sûr (si le nombre n des éléments du tableau dépasse 10
000, ça provoquera une erreur), d’autre part, en raison de l’immensité de la place mémoire réservée (la plupart du
temps non utilisée), c’est un gâchis qui affectera la taille de notre algorithme, ainsi que sa rapidité.
Pour résoudre ce problème, on a la possibilité de déclarer le tableau sans préciser au départ son nombre d’éléments.
Ce n’est que dans un second temps, au cours du programme, que l’on va fixer ce nombre via une instruction
d’allocation : Allocation(nom,nombre,type), Dans laquelle il faut préciser le nom du tableau, le nombre d’éléments
et le type des éléments à allouer. Notez que tant qu’on n’a pas précisé le nombre d’éléments d’un tableau, d’une
manière ou d’une autre, ce tableau est inutilisable. Il ne faut pas oublier de libérer le tableau à la fin de son
utilisation avec l’instruction : libère(nom).
Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on ne sait pas combien il y aura de notes à
saisir. L’algorithme sera :
lire(Note[i])
finpour
/* effectuer la moyenne des notes */
somme ← 0
pour i allant de 0 à n-1 faire
somme ← somme + Note[i]
finPour
moyenne = somme / n
/* affichage de la moyenne */
écrire("la moyenne des ",n," notes est :",moyenne)
/* libérer le tableau Notes */
libère(Notes)
fin
Pour représenter par exemple les matrices dans un ordinateur, un tableau ne suffit pas, puisque chaque ligne de
la matrice est en effet un tableau, donc une matrice n×k peut par exemple être représenter par n tableaux de k
éléments chacun. Mais cette représentation sera difficile à gérer, surtout si on veut implémenter un algorithme
qui effectue la multiplication ou l’addition de deux matrices. L’informatique nous offre la possibilité de déclarer
des tableaux dans lesquels les valeurs ne sont pas repérées par un indice seule, mais par deux indices. C’est la
solution à notre problème de représentation de matrice.
Cette déclaration signifie : réserver un espace de mémoire pour 10 x 12 entiers, et quand j’aurai besoin de l’une
de ces valeurs, je les repèrerai par deux indices.
matrice[i][j] est l’élément de la matrice qui se trouve à l’intersection de la ligne i et la colonne j.
matrice[2][3] ← 5
Cette instruction signifie : mettre à l’emplacement qui se trouve à l’intersection de la deuxième ligne avec la
troisième colonne la valeur 5.
Dans la mémoire l’ordinateur représente un tableau matrice[10][12] par un seul tableau avec la taille 10×10.
4) Initialisation de matrice :
Pour initialiser une matrice on peut utiliser par exemple les instructions suivantes :
T1[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
T2[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
lire(n)
/* lecture de la matrice A */
pour i allant de 1 à n faire
écrire("donner les éléments de la ",i," ligne:")
pour j allant de 1 à n faire
lire(A[i][j])
finpour
fipour
/* lecture de la matrice B */
pour i allant de 1 à n faire
écrire("donner les éléments de la ",i," ligne:")
pour j allant de 1 à n faire
lire(B[i][j])
finpour
fipour
/* la somme de C = A + B */
pour i allant de 1 à n faire
pour j allant de 1 à n faire
C[i][j] ← A[i][j]+B[i][j]
finpour
fipour
/* affichage de la matrice de C */
pour i allant de 1 à n faire
pour j allant de 1 à n faire
écrire(C[i][j]," ")
finpour
écrire("\n") /* retour à la ligne */
finpour
fin
Analyse :
• Parcours séquentiel du tableau
• Arrêt lorsque la valeur est trouvée
• Retour l’indice correspondant
• La valeur n’est pas trouvée
• Retour d’une valeur spéciale
Conception :
Un programme qui demande la taille du tableau T, les éléments du tableau T, la valeur de x (la valeur cherchée), le
programme donne la première position de x dans le tableau T, si x est dans le tableau T et donne la valeur -1 si x
n’est pas dans le tableau T.
b) Recherche dichotomique
On se place dans le cas où le tableau est ordonné et les éléments du tableau sont deux à deux distincts.
Analyse :
x : élément recherché,
T : tableau ordonné, sans duplication,
n : la taille du tableau (le nombre d’éléments du tableau)
mil : indice du milieu du tableau,
si x = T[mil] alors retourne mil
sinon
si x < T[mil] alors
recherche dans la 1ère moitié du tableau (T[d … mil-1])
sinon recherche dans la 2ème moitié du tableau (T[mil+1 … f])
finsi
Conception :
2) LES STRUCTURES
Imaginons que l’on veuille afficher les notes d’une classe d’élèves par ordre croissant avec les noms et prénoms de
chaque élève. On va donc utiliser trois tableaux (pour stocker les noms, les prénoms et les notes). Lorsque l’on va
trier le tableau des notes il faut aussi modifier l’ordre les tableaux qui contiennent les noms et prénoms. Mais cela
multiplie le risque d’erreur. Il serait donc intéressant d’utiliser ce qu’on appelle les structures.
Les structures contrairement aux tableaux servent à rassembler au sein d’une seule entité un ensemble fini
d’éléments de type éventuellement différents. C’est le deuxième type complexe disponible en algorithmique.
A la différence des tableaux, il n’existe pas par défaut de type structure c'est-à-dire qu’on ne peut pas déclarer une
variable de type structure. Ce qu’on peut faire c’est de construire toujours un nouveau type basé sur une structure
et après on déclare des variables sur ce nouveau type.
La syntaxe de construction d’un type basé sur une structure est :
TYPE NomDuType = STRUCTURE
attribut1 : Type
attribut2 : Type
...
attributn : Type
FIN STRUCTURE
✓ Un type simple
✓ Un type complexe :
- Un tableau
- Un type basé sur une structure
Exemple :
Maintenant, pour accéder aux attributs d’une variable dont le type est basé sur une structure on suffixe le nom de la variable
d’un point « . » suivi du nom de l’attribut. Par exemple, dans notre cas pour affecter le nom "Dinar" à notre premier étudiant, on
utilisera le code suivant :
Etud (1).nom = « Dinar »
En programmation, donc en algorithmique, il est possible de décomposer le programme qui résout un problème en
des sous-programmes qui résolvent des sous parties du problème initial. Ceci permettra d’améliorer la conception
du programme et ainsi sa lisibilité.
L’utilisation des sous-programmes s’avère utile aussi dans le cas où on constate qu’une suite d’actions se répète
plusieurs fois.
Il existe deux types de sous-programmes les fonctions et les procédures. Un sous- programme est obligatoirement
caractérisé par un nom (un identifiant) unique.
Le nom d’un sous-programme comme le nom d’une variable doit :
Le programme qui utilise un sous- programme est appelé programme appelant. Un sous-programme peut être
invoqué n'importe où dans le programme appelant en faisant référence à son nom.
Un programme ainsi doit suivre la structure suivante :
a) Les fonctions
Une fonction est un sous-programme qui retourne un seul résultat. Pour définir une fonction on utilise la
syntaxe suivante :
FONCTION nom_fonction (Argument1 : Type , Argument2 : Type ,….) : Type
Déclarations
DEBUT
Instructions de la fonction
nom_fonction ← Valeur renvoyée
FIN
On constate que la déclaration d’une fonction revient à lui préciser un nom, un type ainsi qu’une liste
d’arguments.
Un argument (appelé paramètre formel) d’un sous- programme est une variable locale particulière
qui est associée à une variable ou constante du programme appelant. Puisque qu’un argument est une
variable locale, il admet un type.
Lorsque le programme appelant appelle le sous-programme il doit indiquer la variable ou la constante de même
type, qui est associée au paramètre.
Par exemple, le sous-programme sqr permet de calculer la racine carrée d’un réel. Ce sous-programme admet un
seul paramètre de type réel positif.
Le programme qui utilise sqr doit donner le réel positif dont il veut calculer la racine carrée, cela peut être :
- une variable, par exemple a
- une constante, par exemple 5.25
Les arguments d’une fonction sont en nombre fixe (>=0).
Une fonction possède un seul type, qui est le type de la valeur retournée qui est affecté au nom de la fonction.
Une fois la fonction définie, il est possible (en fonction des besoins) à tout endroit du programme appelant de faire
appel à elle en utilisant simplement son nom suivi des arguments entre parenthèses.
Les parenthèses sont toujours présentes même lorsqu’il n’y a pas de paramètre.
Les arguments spécifiés lors de l’appel de la fonction doivent être en même nombre que dans la déclaration de la
fonction et des types prévus. Dans le programme appelant ces arguments sont appelés paramètres effectifs.
La valeur ainsi renvoyée par la fonction peut être utilisée dans n’importante quelle expression compatible avec son type.
Exemple :
FONCTION Calcul (x : Réel , y : Réel , z : Réel) : Réel
Variable a : Entier
DEBUT
a←3
Calcul ← (x + y + z) * a
FIN
Ça c’est un exemple de déclaration de fonction. Cette fonction appelée « Calcul » est de type réel et elle admet trois arguments
de type réel.
Maintenant voici un exemple de programme complet :
FONCTION Calcul (x : Réel , y : Réel , z : Réel) : Réel
Variable a : Entier
DEBUT
a←3
Calcul ← (x + y + z) * a
FIN
Variables i , j , k , b : Réels
DEBUT
Lire i
Lire j
Algorithmique Page 19 sur 23
Lire k
b ← Calcul (i , j , k) + 2
Ecrire b
FIN
Dans ce programme on fait appel à une fonction. Sa valeur est utilisée dans une expression.
La portée d’une variable est l’ensemble des sous- programmes où cette variable est connue c'est-à-dire que les instructions de
ces sous-programmes peuvent utiliser cette variable.
Une variable définie au niveau du programme principal (problème appelant) est appelée variable globale. Sa portée est totale :
tout sous-programme du programme principal peut utiliser cette variable.
Cependant, une variable définie au sein d’un sous-programme est appelée variable locale. La portée d’une variable locale est
uniquement le sous-programme qui la déclare.
Remarque :
Lorsque le nom d’une variable locale est identique à une variable globale, la variable globale est localement masquée. Dans ce
sous-programme la variable globale devient inaccessible.
Exemple
Soit le programme suivant :
Fonction Surface (a : Réel) : Réel
Variables valeur , resultat : Réels
DEBUT
valeur ← 3.14
resulat ← valeur * a
Surface ← resultat
FIN
Variable rayon : Réel
DEBUT
Ecrire « Entrez le rayon du cercle : »
Lire rayon
Ecrire « La surface de cette cercle est : » , Surface (rayon)
FIN
Les variables valeur et resultat déclarées dans la fonction Surface sont locales.
Considérons presque le même programme sauf que la variable valeur est déclarée maintenant dans le programme appelant.
Fonction Surface (a : Réel) : Réel
Variables resultat : Réels DEBUT
resulat ← valeur * a
Surface ← resultat
FIN
Variable valeur , rayon : Réel
DEBUT
valeur ← 3.14
Ecrire « Entrez le rayon du cercle : »
Lire rayon
Ecrire « La surface de cette cercle est : » , Surface (rayon)
FIN
Dans ce deuxième programme seule la variable resultat est locale. Tandis que la variable valeur est devenue globale. On peut
par conséquent accéder à sa valeur dans la fonction Surface.
b) Le passage de paramètres
Il existe deux types d’association (que l’on nomme passage de paramètre) entre le(s) paramètre(s) du sous-programme
(fonction ou procédure) et variable(s) du programme appelant :
- Passage par valeur
- Passage par adresse
Exemple
Considérons l’algorithme suivant :
DEBUT
Calcul ← a * 2
a←a–1
FIN
Variable x : Réel
DEBUT
x←3
Ecrire Calcul (x)
Ecrire x
FIN
b) Les procédures
Les procédures sont des sous- programmes qui ne retournent aucun résultat. Elles admettent comme les fonctions des
paramètres.
On déclare une procédure de la façon suivante :
PROCEDURE nom_procedure (Argument1 : Type , Argument2 : Type ,….)
Déclarations
DEBUT
Instructions de la procédure
FIN
Et on appelle une procédure comme une fonction, en indiquant son nom suivi des paramètres entre parenthèses.
Exercice
1. Ecrire une procédure qui reçoit la longueur et la largeur d’une surface et qui affiche la valeur de la surface. Donnez à cette
procédure le nom « Surface ».
2. Ecrire une procédure qui permet d’échanger les valeurs de deux variables. Appelez cette procédure « Echanger ».
3. On dispose d’une phrase dont les mots sont séparés par des point virgules. Ecrivez une procédure qui permet de remplacer
les points virgules par des espaces. On suppose qu’on dispose des fonctions suivantes :
Solutions
1. Le programme qui définit la procédure « Surface » est :
PROCEDURE Surface (longueur : Réel , largeur : Réel)
Variable s : Réel
DEBUT
s ← longueur * largeur
Ecrire « La surface obtenu est : » , s
FIN