Cours Algo Ii - Unikan
Cours Algo Ii - Unikan
Cours Algo Ii - Unikan
COURS D’ALGORITHME II
Objectif du cours :
Plan du cours
Documentation
INTRODUCTION
Pour cela, il faut bien cerner le problème posé, prévoir toutes les
éventualités qui peuvent se présenter. Toutes les questions prévues doivent
avoir des réponses. L’ordinateur ne peut rien improviser.
Comment s'assurer qu'elle fait ce travail aussi bien que nous ? Mieux
que nous?
Avez-vous déjà indiqué un chemin à un touriste égaré ? Si oui, vous avez déjà
fabriqué et fait exécuter des algorithmes.
Bref : Un algorithme, c’est une suite d’instructions, qui une fois exécutée
correctement, conduit à un résultat donné.
il faut avoir une certaine intuition. Sachez que les réflexes s’acquièrent. Et
ce qu’on appelle l’intuition n’est finalement que de l’expérience tellement
répétée que le raisonnement, au départ laborieux, finit par devenir
« spontané ».
il faut être méthodique et rigoureux. En effet, chaque fois qu’on écrit une
série d’instructions qu’on croit justes, il faut systématiquement se mettre
mentalement à la place de la machine qui va les exécuter, armé d'un papier
et d'un crayon, afin de vérifier si le résultat obtenu est bien celui que l’on
voulait.
Et petit à petit, à force de pratique, vous verrez que vous pourrez faire de plus
en plus souvent l’économie de cette dernière étape : l’expérience fera que vous
« verrez » le résultat produit par vos instructions, au fur et à mesure que vous
les écrirez. Naturellement, cet apprentissage est long, et demande des heures de
travail patient. Aussi, dans un premier temps, évitez de sauter les étapes : la
vérification méthodique, pas à pas, de chacun de vos algorithmes
représente plus de la moitié du travail à accomplir... et le gage de vos
progrès.
De manière générale, une analyse d’un problème dans le but de le résoudre peut
se ramener à une suite d’interrogation qui s’enchaine :
Quel que soit le type de problème qu’on aura en face de soi, l’analyse consistera
à:
EXERCICE D’APPLICATION
Enoncé : Votre grand père détient un terrain sous forme rectangulaire au village.
Il aimerait connaitre la superficie occupée par son terrain.
1) Analyse :
I.2.1. Définition : une variable est un emplacement mémoire repéré par une
étiquette (nom) et dont on définit le type de données à stocker dedans.
La première chose à faire avant de pouvoir utiliser une variable est de créer
la boîte (lui réserver un emplacement mémoire) et de lui coller une
étiquette. Ceci se fait tout au début de l’algorithme, avant même les instructions
proprement dites. C’est ce qu’on appelle la déclaration des variables.
Lorsqu’on déclare une variable, il ne suffit pas de créer une boîte (réserver un
emplacement mémoire) ; encore doit-on préciser ce que l’on voudra mettre
dedans, car de cela dépendent la taille de la boîte (de l’emplacement mémoire)
et le type de codage utilisé.
Notation
Nous n’emploierons pas ces types dans ce cours ; mais je les signale, car vous
ne manquerez pas de les rencontrer en programmation proprement dite.
C) Type alphanumérique
D) Type booléen
a) Syntaxe et signification
Cette seule chose qu’on puisse faire avec une variable, c’est l’affecter, c’est-à -
dire lui attribuer une valeur.
Ainsi :
A ← 24
Il va de soi que l’ordre dans lequel les instructions sont écrites va jouer un
rô le essentiel dans le résultat final. Considérons les deux algorithmes suivants :
Exemple 1 Exemple 2
Variable A en Numérique Variable A en Numérique
Début Début
A ← 34 A ← 12
A ← 12 A ← 34
Fin Fin
Les opérateurs possibles dépendent du type des valeurs qui sont en jeu.
1) Opérateurs numériques :
+ : addition * : multiplication
- : soustraction / : division
Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles qu’en
mathématiques. La multiplication et la division ont « naturellement » priorité
sur l’addition et la soustraction. Les parenthèses ne sont ainsi utiles que pour
modifier cette priorité naturelle.
Var A, B, C : Caractère
Début
A ← "Informatique "
B ← "Gestion"
C←A&B
Fin
REMARQUES
Dès lors, aussitô t que la touche Entrée (Enter) a été frappée, l’exécution
reprend. Dans le sens inverse, pour écrire quelque chose à l’écran, c’est aussi
simple.
Avant de Lire une variable, il est très fortement conseillé d’écrire des libellés
à l’écran, afin de prévenir l’utilisateur de ce qu’il doit frapper (sinon, le pauvre
utilisateur passe son temps à se demander ce que l’ordinateur attend de lui… et
c’est très désagréable !) :
EXERCICES
Il n’y a que deux formes possibles pour un test ; la première est la plus
simple, la seconde la plus complexe.
Si booléen Alors
Instructions
Finsi
Si booléen Alors
Instructions 1
Sinon
Instructions 2
Finsi
Un booléen est une expression dont la valeur est VRAI ou FAUX. Cela peut
donc être (il n’y a que deux possibilités) :
une condition
Toujours est-il que la structure d’un test est relativement claire. Dans la forme
la plus simple, arrivé à la première ligne (Si… Alors) la machine examine la
valeur du booléen. Si ce booléen a pour valeur VRAI, elle exécute la série
d’instructions. Cette série d’instructions peut être très brève comme très longue,
cela n’a aucune importance. En revanche, dans le cas où le booléen est faux,
l'ordinateur saute directement aux instructions situées après le FinSi.
Dans le cas de la structure complète, c'est à peine plus compliqué. Dans le cas
où le booléen est VRAI, et après avoir exécuté la série d'instructions 1, au
Assistant Freddy ETSHIKO. Notions d’Algorithmique II.
16
Cette définition est essentielle ! Elle signifie qu’une condition est composée de
trois éléments :
une valeur
un opérateur de comparaison
une autre valeur
Remarque
par : 5 < y < 8. Or, une telle expression, qui a du sens en français, comme en
mathématiques, ne veut rien dire en programmation. En effet, elle comprend
deux opérateurs de comparaison, soit un de trop, et trois valeurs, soit là aussi
une de trop. Pour résoudre ce problème on utilise les autres opérations logiques
qui permettent de mettre ensemble deux conditions (ET, OU, NON, et XOR.).
a) Test si
Le test si est la forme d'alternative la plus simple : si Test est vérifié on exécute
Instruction 1 puis Instruction 2 ; si Test n'est pas vérifié on exécute directement
'Instruction 2
Pseudo code :
SI Test
Instruction 1
FIN SI
Instruction 2
b) Test si sinon
SI Test
Instruction 1
SINON
Instruction 2
FIN SI Instruction 3
c) Test sinon si
SI Test 1
Instruction 1
SINONSI Test 2
Instruction 2
FIN SI
Instruction 3
Instruction1();
} else if ( test2() ){
Instruction2();
Instruction3();
Le test selon est une spécialisation de l'instruction sinon si, qui permet
de sélectionner le bloc à exécuter en fonction de la valeur d'une variable. Il est
utilisé lorsque l'on doit tester une condition plusieurs fois, en utilisant toujours
la même variable.
SELON Variable 1
CAS Valeur 1:
Instruction 1
CAS Valeur 2:
Instruction 2
FIN SELON
Instruction 3
Structurellement, c'est équivalent à une succession de sinon si, mais le
fait de savoir que la valeur de la variable testée ne changera pas lors de
l'évaluation des conditions permet au compilateur de faire quelques
optimisations.
Suivant les langages, l'expression qui suit le mot clef cas peut être une
simple valeur pour un test d'égalité, une collection, un intervalle, ou une
expression rationnelle par exemple.
I.4. BOUCLES
TANTQUE Test
Instruction 1
FIN TANTQUE
Instruction 2
C : while(condition) instruction ;
Instruction 1
JUSQUACEQUE Condition 1
Instruction 2
C : do instruction while(condition) ;
Pour compteur ← vd à vf
Instructions
Dit d’une autre manière, la structure « Pour … Suivant » est un cas particulier
de TantQue : celui où le programmeur peut dénombrer à l’avance le nombre de
tours de boucles nécessaires.
Moy ← (N1+N2+N3+N4+N5+N6+N7+N8+N9+N10+N11+N12)/12
T : nom du tableau
i : indice : le nombre au sein d’un tableau qui sert à repérer chaque valeur.
En nous calquant sur les choix les plus fréquents dans les langages de
programmations, nous déciderons ici arbitrairement et une bonne fois pour
toutes que :
les "cases" sont numérotées à partir de zéro, autrement dit que le plus
petit indice est zéro.
N.B. : Si l’on est dans un langage où les indices commencent à zéro, il faut en
tenir compte à la déclaration :
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.
Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on ne
sait pas combien il y aura de notes à saisir. Le début de l’algorithme sera quelque
chose du genre :
45 122 12 3 21 78 64 53 89 28 84 46
On commence par rechercher, parmi les 12 valeurs, quel est le plus petit élément, et où il se
trouve. On l’identifie en quatrième position (c’est le nombre 3), et on l’échange alors avec le premier
élément (le nombre 45). Le tableau devient ainsi :
3 122 12 45 21 78 64 53 89 28 84 46
3 12 122 45 21 78 64 53 89 28 84 46
3 12 21 45 122 78 64 53 89 28 84 46
Tout ceci peut vous sembler un peu fumeux, mais cela devrait s’éclairer
à l’aide d’un exemple extrêmement fréquent : la recherche de l’occurrence d’une
valeur dans un tableau. On en profitera au passage pour corriger une erreur
particulièrement fréquente chez le programmeur débutant.
last, but not least, l'affectation par défaut de la variable Trouvé, dont la
valeur de départ doit être évidemment Faux.
FinSi
Fin
Méditons un peu sur cette affaire.
Voilà la raison qui nous oblige à passer par une variable booléenne, un
« drapeau » qui peut se lever, mais jamais se rabaisser. Et cette technique de
flag (que nous pourrions élégamment surnommer « gestion asymétrique de
variable booléenne ») doit être mise en œuvre chaque fois que l’on se trouve
devant pareille situation.
effectuer. En fait, tout ce qu’on peut dire, c’est qu’on devra effectuer le tri jusqu’à
ce qu’il n’y ait plus d’éléments qui soient mal classés. Ceci est typiquement un
cas de question « asymétrique » : il suffit que deux éléments soient mal classés
pour qu’un tableau ne soit pas trié. En revanche, il faut que tous les éléments
soient bien rangés pour que le tableau soit trié.
lui attribuer la valeur Vrai dès qu’une seule permutation a été faite (il suffit
qu’il y en ait eu une seule pour qu’on doive tout recommencer encore une
fois).
REMARQUE ESSENTIELLE :
Il n’y a aucune différence qualitative entre un tableau à deux dimensions ( i, j
) et un tableau à une dimension ( i * j ). De même que le jeu de dames qu’on
vient d’évoquer, tout problème qui peut être modélisé d’une manière peut
aussi être modélisé de l’autre. Simplement, l’une ou l’autre de ces techniques
correspond plus spontanément à tel ou tel problème, et facilite donc (ou
complique, si on a choisi la mauvaise option) l’écriture et la lisibilité de
l’algorithme.
C’est par exemple le cas du calcul du sinus d’un angle : pour en obtenir
une valeur approchée, il faudrait appliquer une formule d’une complexité à vous
glacer le sang. Aussi, que se passe-t-il sur les petites calculatrices que vous
connaissez tous ? On vous fournit quelques touches spéciales, dites touches de
fonctions, qui vous permettent par exemple de connaître immédiatement ce
résultat. Sur votre calculatrice, si vous voulez connaître le sinus de 35°, vous
taperez 35, puis la touche SIN, et vous aurez le résultat.
A ← Sin(35)
Partie Entière
Modulo
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
Sqr ( )
A ← Sqr(4) A vaut 2
B ← Sqr(9) B vaut 3
IV.5. VARIABLES PUBLIQUES ET PRIVEES
Par défaut, une variable est déclarée au sein d'une procédure ou d'une
fonction. Elle est donc créée avec cette procédure, et disparaît avec elle. Durant
tout le temps de son existence, une telle variable n'est visible que par la
procédure qui l'a vu naître. Si je crée une variable Toto dans une procédure
Bidule, et qu'en cours de route, ma procédure Bidule appelle une sous-
procédure Machin, il est hors de question que Machin puisse accéder à Toto, ne
serait-ce que pour connaître sa valeur (et ne parlons pas de la modifier). Voilà
pourquoi ces variables par défaut sont dites privées, ou locales.
Afin d'illuminer ces propos obscurs, prenons le cas classique, celui d'un
carnet d'adresses. Le fichier est destiné à mémoriser les coordonnées d'un
certain nombre de personnes. Pour chacune, il faudra noter le nom, le prénom, le
numéro de téléphone et l'email. Dans ce cas, il peut paraître plus simple de
stocker une personne par ligne du fichier (par enregistrement). Dit autrement,
quand on prendra une ligne, on sera sû r qu'elle contient les informations
concernant une personne, et uniquement cela. Un fichier ainsi codé sous forme
d'enregistrements est appelé un fichier texte.
Ce type de fichier est couramment utilisé dès lors que l'on doit stocker
des informations pouvant être assimilées à une base de données.
fichier, on devra convertir ces chaînes en nombre si l'on veut pouvoir les
utiliser dans des calculs. En revanche, dans les fichiers binaires, les données sont
écrites à l'image exact de leur codage en mémoire vive, ce qui épargne toutes ces
opérations de conversion.
Structure n°1
"Etshiko";"Freddy";0822225983;"[email protected]"
"Ngalula";"Mélanie";0991226114;"[email protected]"
"Kayembe";"Jean-Philippe";0898288123;"[email protected]"
"Lusamba";"Olive";0851110022;"[email protected]"
ou ainsi :
Structure n°2
La structure n°2, elle, est dite à champs de largeur fixe. Il n’y a pas de
caractère de délimitation, mais on sait que les x premiers caractères de chaque
ligne stockent le nom, les y suivants le prénom, etc. Cela impose bien entendu de
ne pas saisir un renseignement plus long que le champ prévu pour l’accueillir.
On distingue :
Et neuf fois sur dix également, si l’on veut stocker au fur et à mesure en
mémoire vive les informations lues dans le fichier, on a recours à un ou
plusieurs tableaux. Et comme on ne sait pas d’avance combien il y aurait
d’enregistrements dans le fichier, on ne sait pas davantage combien il doit y
avoir d’emplacements dans les tableaux. Qu’importe, les programmeurs avertis
que vous êtes connaissent la combine des tableaux dynamiques.
Une telle déclaration assure que quel que soit le contenu de la variable
Nom, par exemple, celle-ci comptera toujours 20 caractères. Si son contenu est
plus petit, alors un nombre correct d’espaces sera automatiquement ajouté pour
combler. Si on tente d’y entrer un contenu trop long, celui-ci sera
automatiquement tronqué. Voyons la suite :
Assistant Freddy ETSHIKO. Notes de cours : Algorithme II.
51
Nom ← "Jokers"
Prénom ← "Midnight"
Tel ← "0348946532"
Mail ← "[email protected]"
Truc ← Nom & Prénom & Tel & Mail
EcrireFichier 3, Truc
Et pour finir, une fois qu’on en a terminé avec un fichier, il ne faut pas
oublier de fermer ce fichier. On libère ainsi le canal qu’il occupait (et
accessoirement, on pourra utiliser ce canal dans la suite du programme pour un
autre fichier… ou pour le même).