Algorithmique – Cours 1 Algorithmique – Cours 1 1. Introduction. Un ordinateur est une machine électronique programmable servant au traitement de l’information codée sous forme binaire Un ordinateur manipule exclusivement des informations binaires. Un ordinateur n'est qu'une machine capable d'exécuter automatiquement une série d'opérations simples qu'on lui a demandé de faire. L'intérêt d'un ordinateur est sa capacité à manipuler rapidement et sans erreur un grand nombre d'informations, mémoriser des quantités numériques ou alphabétiques, rechercher une quantité mémorisée, comparer ou classer des informations. Pour donner des ordres à l’ordinateur, il est nécessaire de pouvoir communiquer avec lui. Cette communication passe par un langage de programmation, dans lequel est écrit le programme. Un programme est un assemblage et un enchaînement d’instructions élémentaires écrit dans un langage de programmation, et exécuté par un ordinateur afin de traiter les données d’un problème et renvoyer un ou plusieurs résultats. Un algorithme représente l’enchaînement des actions (instructions) nécessaires pour faire exécuter une tâche à un ordinateur(résoudre un problème). Un algorithme s’écrit le plus souvent en pseudo-langage de programmation (appelé langage algorithmique) Pour réaliser un traitement exécutable sur ordinateur, il faut distinguer deux étapes : Définir la logique du traitement en vue d’obtenir le résultat souhaité. Traduire cette logique à l’aide d’un langage de programmation compréhensible de l’ordinateur (formules de calcul sur tableur, langage de macro-commandes des logiciels, outils ou langage de programmation). 1 Algorithmique – Cours 1 2. Le Codage Les ordinateurs ne son capables que d’une seule chose : faire des calculs, et uniquement cela. Lorsqu’un ordinateur traite du texte, du son, de l’image, de la vidéo, il traite en réalité des nombres. Un ordinateur manipule exclusivement des informations binaires. Qu’est-ce qu’une information binaire ? C’est une information qui ne peut avoir que deux états que l’on symbolise sous la forme de 1 et de 0. Les ordinateurs ont été conçus pour manier ces informations par paquets de 0 et de 1. Et la taille de ces paquets a été fixée à 8 informations binaires. Une information binaire (symbolisée couramment par 0 ou 1) s’appelle un bit. Un groupe de huit bits s’appelle un octet (en anglais, byte) Combien d’états différents un octet possède-t-il ? Le calcul est assez facile (mais il faut néanmoins savoir le refaire). Chaque bit de l’octet peut occuper deux états. Il y a donc dans un octet : 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 28 = 256 possibilités 2 Algorithmique – Cours 1 3. Définition et représentation d’un algorithme Définition Un algorithme c’est « l’ensemble des règles opératoires et des procédés définis en vue d’obtenir un résultat déterminé au moyen d’un nombre fini d’opérations » (selon l’ AFNOR). Il faut donc définir une succession logique de tâches à automatiser. L’algorithmique exprime les instructions résolvant un problème donné indépendamment des particularités de tel ou tel langage Les ordinateurs ne sont capables de comprendre que quatre catégories d'instructions. Ces quatre familles d'instructions sont : l’affectation de variables la lecture / écriture les tests les boucles L’algorithmique est la technique des algorithmes Un algorithme décrit un traitement selon une logique et un formalisme rigoureux. L’algorithmique prépare la programmation o L’algorithmique est une étape préalable indispensable à la réalisation d’un bon programme o C’est une méthode de découpage d’un traitement en instructions élémentaires 3 Algorithmique – Cours 1 4. Structure d'un algorithme Pour représenter un algorithme, on peut recourir à 2 méthodes : organigramme de programmation Langage structuré (pseudo code) Exemple : Organigramme Langage structuré VARIABLES Caff : Réel Rist : Réel DEBUT SAISIR Caff SI Caff >12000 ALORS Rist<-Caff*0,12 SINON Rist <- 0 FIN SI AFFICHER ‘’La ristourne est de ‘’, Rist FIN Afficher Tester Calculer Avantages : Visualisation du traitement Avantage : Cette forme est adaptée aux Inconvénients : devient vite fouillis si n’est pas langages de programmation découpé en plusieurs niveaux d’abstraction. Ne structurée (langage C) ou au langage correspond plus aux exigences de la programmation de macro-commandes inclus dans les structurée actuelle. suites bureautiques (exemple : VBA pour MS Office). L’algorithme peut également être utilisé pour des formules de calcul tableur complexe. 4 Algorithmique – Cours 1 Structure générale d’un algorithme Un algorithme comprend deux parties : l’entête : qui contient la déclaration des variables : pour chaque variable utilisée, on définit le type de données qu’elle contient: entier, réel, logique ou alphanumérique (pour éviter tout problème, les variables doivent être déclarées préalablement à leur utilisation). le corps : contient l’ensemble des actions. D'une manière générale, un algorithme : a. Commence toujours par le mot programme suivi du nom du programme b. Possède un bloc de déclaration de variables, repéré par le mot Var et qui contient la liste des variables utilisées dans l'algorithme. c. Possède un bloc d'instructions encadré par les mots Début et Fin (le programme commence son instruction sur le mot Début et se termine sur le mot Fin). Ainsi, nous obtenons : Programme NomDuProgramme Var Déclaration des variables Liste des variables : Type Début Instructions Fin 5 Algorithmique – Cours 1 5. Les Variables et Constantes Les variables et les constantes correspondent à des zones de stockage de la mémoire vive. Elles permettent de conserver des valeurs en vue d’ un traitement. Une constante, en revanche, est définie une fois pour toute à l’intérieur du « programme » (avant les déclarations de variables) et ne peut pas être modifiée par l’utilisateur. Une constante correspond à un paramètre. Une variable permet de stocker une information au cours d’un programme.. Une variable est une boîte, que le programme (l’ordinateur) va repérer par une étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner par son étiquette. La déclaration d'une variable va permettre au programme, en cours d'exécution, de réserver une zone mémoire (physiquement, c'est un emplacement dans la mémoire vive repéré par une adresse binaire) d'une certaine taille et de lui associer un nom pour pouvoir y accéder ultérieurement. Une variable se caractérise par : Une Etiquette (un nom ). Un Emplacement mémoire. L’adresse en mémoire est associée au non de la variable. Manipuler le nom de la variable, c’est faire référence à son adresse mémoire. Rassurez-vous, c’est le compilateur qui réalise cette association, pas le programmeur ; Une Taille mémoire déterminée par le type de la variable. Elle ne possède aucune valeur initiale a priori. Attention, il ne faut jamais partir du principe qu’une variable est initialisée automatiquement à zéro. Certains langages de programmation le font, d’autres pas. Prenons donc le principe général qu’elle n’est jamais initialisée à zéro, cela peut éviter bien des surprises. Un Type de données. Les données manipulées par un programme peuvent être de natures différentes (entiers, réels, chaînes de caractères, booléen… ). Les types de données utilisables sont les suivants : Réel : nombre à virgule Entier Chaîne : texte de longueur fixe (CHAINE DE 15 CARACTERES) ou de longueur variable (mot clé CHAINE utilisée sans rien) Caractère : Un seul caractère ‘0’, ‘1’,…, ‘a’, ‘A’ par exemple Booléen : valeur logique pouvant être .VRAI. ou .FAUX. 6 Algorithmique – Cours 1 Le type des données est défini dans la section « Déclaration de variable »s. Lorsque plusieurs variables sont de même type, on peut les regrouper sur une même ligne. Exemple Programme TestDéclaration Var LaValeur : Entier LeCaractere : Caractere Début Instructions Fin Remarques : Par convention, le nom d’une variable doit avoir la première lettre de chaque mot important la composant en majuscule ; Exemple : LaValeur et non pas lavaleur ni la_valeur Le nom des variables doit être significatif (parlant). Evitez d’appeler une variable «s» pour Somme ou « t » pour TotalAchat ; Il faut toujours déclarer une variable, même si certains langages de programmation peuvent les déclarer pour vous. Le type pris par défaut ne sera pas forcément le plus adapté ; Les variables se déclarent toujours en début de programme, même si, encore une fois, certains langages de programmation sont permissifs. E n effets, lors des recherches d’erreurs (bugs) ou lors des phases de maintenance, la définition des variables est plus facilement localisée. 7 Algorithmique – Cours 1 6. Affectation d’une variable Affecter une variable, c’est lui attribuer une valeur. En pseudo-code, l'instruction d'affectation se note avec le signe Ainsi : Toto: Entier Toto 24 Attribue la valeur 24 à la variable Toto. On peut en revanche sans aucun problème attribuer à une variable la valeur d’une autre variable, telle quelle ou modifiée. Par exemple : Tutu Toto Signifie que la valeur de Tutu est maintenant celle de Toto. Une instruction d’affectation ne modifie que ce qui est situé à gauche de la flèche. Tutu Toto + 4 Si Toto contenait 12, Tutu vaut maintenant 16. De même que précédemment, Toto vaut toujours 12. Exemple n°1 Exemple n°2 Début Début Riri "Loulou" Riri "Loulou" Fifi "Riri Fifi Riri Fin Fin La seule différence entre les deux algorithmes consiste dans la présence ou dans l’absence des guillemets lors de la seconde affectation. Et l'on voit que cela change tout ! Dans l'exemple n°1, ce que l'on affecte à la variable Fifi, c'est la suite de caractères R – i – r - i. Et à la fin de l’algorithme, le contenu de la variable Fifi est donc « Riri ». Dans l'exemple n°2, en revanche, Riri étant dépourvu de guillemets, n'est pas considéré comme une suite de caractères, mais comme un nom de variable. Le sens de la ligne devient donc : « affecte à la variable Fifi le contenu de la variable Riri ». A la fin de l’algorithme n°2, la valeur de la variable Fifi est donc « Loulou ». Ici, l’oubli des guillemets conduit certes à un résultat, mais à un résultat différent. 8 Algorithmique – Cours 1 7. Expressions et opérateurs Dans une instruction d’affectation, on trouve : à gauche de la flèche, un nom de variable, à droite de la flèche, ce qu’on appelle une expression Une expression est un ensemble de valeurs, reliées par des opérateurs, et équivalent à une seule valeur. Un opérateur est un signe qui relie deux valeurs, pour produire un résultat. Opérateurs numériques : + : addition - : soustraction * : multiplication / : division ^ : puissance ( ) : parenthèses Opérateur alphanumérique : & Cet opérateur permet de concaténer, autrement dit d’agglomérer, deux chaînes de caractères Exemple Var A, B, C : Caractère Début A ← “Gloubi” B ← “Boulga” C← A&B Fin La valeur de C à la fin de l’algorithme est “GloubiBoulga” Opérateurs logiques (ou booléens) Il s’agit du ET, du OU, du NON et du mystérieux 9 Algorithmique – Cours 1 8. Les instructions d’écriture et de lecture Instructions d’écriture : instructions qui permettent au programme de communiquer des valeurs à l’utilisateur en les affichant à l’écran. Ecrire pour fournir de l'info au monde extérieur. Permet d'écrire quelque chose à l’écran Ecrire “Entrez votre nom : ” Instructions de lecture : instructions qui permettent à l’utilisateur de rentrer des valeurs au clavier pour qu’elles soient utilisées par le programme. Lire pour recevoir de l'info du monde extérieur. Dès que le programme rencontre une instruction Lire, l’exécution s’interrompt, attendant la frappe d’une valeur au clavier Programme LireEcrire Var NomFamille : Caractère Début Ecrire “Entrez votre nom : ” Lire NomFamille Ecrire "Bonjour : " , NomFamille Fin Affiche: Bonjour : suivi du nom saisie par l'utilisateur Exemple complet Nous allons écrire un algorithme qui calcule l'âge de l'utilisateur en fonction de son année de naissance. Programme Age CONST année ← 2000 VAR ddn : entier // date de naissance DEBUT Ecrire “Entrez votre année de naissance sur 4 chiffres : ” Lire ddn Ecrire "Vous avez, ou aurez dans l'année : " , année – ddn , " ans" FIN 10 Algorithmique – Cours 1 Opérations sur les données de type numérique Opérateurs : Division entière : div et Reste de la division entière : mod L’opération de division entière est la division euclidienne telle qu’on l’apprend à l’école primaire : on ne va pas "derrière la virgule", le reste de la division entière (mod, qui signifie modulo) est l’opération complémentaire de la division entière. Elle récupère le reste de la division entière. Exemples : 7 div 4 = 1 7 mod 4= 3 car 7 divisé par 4 égal 1 et il reste 3 l2 div 2 = 6 12 mod 6 = 0 car 12 divisé par 2 égal 6 et il reste 0 Fonctions : Partie entière d’un nombre : ent et partie décimale d’un nombre : dec Ces 2 opérations sont également complémentaires l’une de l’autre. Exemples: ent(12.5) = 12 dec(12.5) = 0.5 ent(-6) = -6 dec(-6) = 0 Ces deux opérations sont des opérations unaires, ou plutôt ce sont des fonctions, c’est à dire qu’elles s’utilisent sous la forme : NomDeLaFonction (ValeurQueL’onVeutFaireTraiterParLaFonction). Dans un programme, et donc dans un algorithme, le résultat d’une fonction s’utilise comme une variable, c’est à dire qu’on peut écrire des choses du genre : Var Nb1, PartDec : Réel PartEnt: Entier Début Ecrire “Saisir un nombre :” Lire Nb1 PartEnt ← ent(Nb1) PartDec ← dec(Nb1) Ecrire “La partie entière de Nb1 est : ”, PartEnt Ecrire “La partie décimale de Nb1 est : ”, PartDec Fin 11 Algorithmique – Cours 1 9. Les Tests (ou structure alternative) Elles permettent d’exécuter des actions obéissant à une condition déterminée. Si « condition » Alors Exécuter les actions si la condition est VRAIE Sinon Exécuter les conditions si la condition est FAUSSE FinSi Il n’y a que deux formes possibles pour un test ; la forme de gauche est la forme complète, celle de droite la forme simple. Si condition Alors Si condition Alors Instructions 1 Instructions Sinon Finsi Instructions 2 Finsi Les opérateurs de comparaison sont : = égal à… <> différent de… < strictement plus petit que… > strictement plus grand que… =< plus petit ou égal à… >= plus grand ou égal à… A noter que ces opérateurs de comparaison peuvent tout à fait s’employer avec des caractères. Ceux-ci sont codés par la machine dans l’ordre alphabétique (rappelez vous le code ASCII vu dans le préambule), les majuscules étant systématiquement placées avant les minuscules. Ainsi on a : “t” < “w” VRAI “Maman” > “Papa“ FAUX “maman” > “Papa” VRAI 12 Algorithmique – Cours 1 Les opérateur logique sont : On peut combiner les conditions avec les opérateurs ET ou OU Il est possible d’imbriquer les SI. ET : il faut impérativement que Condition1 soit VRAI et que Condition2 soit VRAI. Condition1 ET Condition2 OU : il suffit que Condition1 soit VRAIE ou que Condition2 soit VRAIE Condition1 OU Condition2 NON : le NON inverse une condition NON(Condition1) XOR (ou OU exclusif) : Pour que Condition1 XOR Condition2 soit VRAI, il faut que Condition1 soit VRAI, ou bien que Condition2 soit VRAI. Mais si toutes les deux sont fausses, ou que toutes les deux sont VRAI, alors le résultat global est considéré comme FAUX. 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) : C1 et C2 C2 Vrai C2 Faux C1 Vrai Vrai Faux C1 Faux Faux Faux C1 ou C2 C2 Vrai C2 Faux C1 Vrai Vrai Vrai C1 Faux Vrai Faux C1 xor C2 C2 Vrai C2 Faux C1 Vrai Faux Vrai C1 Faux Vrai Faux Non C1 C1 Vrai Faux C1 Faux Vrai 13 Algorithmique – Cours 1 10. Tests imbriqués Les structures de tests imbriqués sont donc un outil indispensable à la simplification et à l’optimisation des algorithmes. Si « condition1 » Alors Instructions 1 Sinon Si « condition2 » Alors Instructions 2 Sinon Instructions 3 FinSi FinSi Ou Si « condition1 » Alors Instructions 1 SinonSi « condition2 » Alors Instructions 2 Sinon Instructions 3 FinSi 11. Le choix multiple Les Si imbriqués par rapport à une même valeur deviennent vite lourds à gérer et à présenter. Pour remplacer avantageusement la structure alternative (SI..ALORS…SINON…), quand il y a un grand nombre de cas possibles selon les valeurs que peut prendre une variable, on peut utiliser la structure SELON CAS : Selon Cas <variable> Cas <expression> <action1> Cas <expression> <action2> … Cas Sinon <action3> Fin selon 14 Algorithmique – Cours 1 Exemple : Choix Menu Var choix : entier Début Ecrire " Choix 1 : Saisie" Ecrire " Choix 2 : Modification" Ecrire " Choix 3 : Suppression" Ecrire " Choix 4 ou Choix 5: Impression" Ecrire " Choix 6 : Quitter" Ecrire " Choisir un menu :" Lire choix Selon Cas choix Cas 1 Ecrire "On saisie" Cas 2 Ecrire "On modifie" Cas 3 Ecrire "On supprime" Cas 4 à 5 Ecrire "On imprime" Cas 6 Ecrire "On quitte" Cas Sinon Ecrire "Choix incorrect" Fin selon 15 Algorithmique – Cours 1 12. Les structures répétitives (les boucles) L'intérêt d'utiliser un ordinateur n'apparaît clairement que lors de la manipulation de données nombreuses ou traitées de manière répétitive. Exemple 1: Chercher dans une liste de noms et d'adresses, l'adresse d'une personne à partir de son nom. Le nombre de fois qu'il faudra comparer le nom donné aux noms de la liste est dans ce cas inconnu. Une structure répétitive permet de faire répéter un ensemble d’actions, un certain nombre de fois dans un ordre préalablement défini. Il existe plusieurs types de structures itératives : la structure « TantQue - FinTantQue » : Le nombre de répétitions n’est pas connu et peut être nul : 0 à n répétitions la structure « Répéter - Jusqu’à » : Le nombre de répétitions n’est pas connu mais ne peut pas être nul : 1 à n répétitions la structure « Pour - Suivant » : Le nombre de répétitions est connu (i= 1 à 20) Comme pour les tests, les boucles peuvent être imbriquées. 16 Algorithmique – Cours 1 13. structure TantQue… FinTantQue TantQue booléen ou … Instructions … FinTantQue condition Le principe est simple : le programme arrive sur la ligne du TantQue. Il examine alors la valeur du booléen (qui, je le rappelle, peut être une variable booléenne ou, plus fréquemment, une condition). Si cette valeur est VRAI, le programme exécute les instructions qui suivent, jusqu’à ce qu’il rencontre la ligne FinTantQue. Il retourne ensuite sur la ligne du TantQue, procède au même examen, et ainsi de suite. Le manège enchanté ne s’arrête que lorsque le booléen prend la valeur FAUX. On entre dans la boucle uniquement si la condition est vraie. Exemple : Var Rep : Caractère Début Ecrire “Voulez vous un café ? (O/N)“ Lire Rep TantQue Rep <> “O“ ET Rep <> “N“ Ecrire “Vous devez répondre par O ou N. Recommencez“ Lire Rep FinTantQue Ecrire “Saisie acceptée“ Fin 17 Algorithmique – Cours 1 14. structure Répéter… Jusqu’à Répéter … Instructions … Jusqu'à booléen ou condition Exemple : Var Rep : Caractère Début Ecrire “Voulez vous un café ? (O/N)“ Lire Rep Repéter Lire Rep Jusqu'à Rep = “O“ Ecrire “Saisie acceptée“ Fin Contrairement à la boucle TantQue où la condition est une condition d’entrée dans la boucle, la condition pour est une condition de sortie : on sort si la condition est vraie. On évalue la condition après avoir exécuté le bloc d'instructions. Ainsi le bloc d'instructions est exécuté au moins une fois. 18 Algorithmique – Cours 1 15. structure Pour … Suivant 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. Le seul intérêt du « Pour » est d’épargner un peu de fatigue au programmeur, en lui évitant de gérer lui-même la progression de la variable qui lui sert de compteur (on parle d’incrémentation). Pour Compteur = Initial à Final Pas ValeurDuPas … Instructions … Compteur suivant Mais si vous souhaitez une progression plus spéciale, de 2 en 2, ou de 3 en 3, ou en arrière, de –1 en –1, ou de –10 en –10, ce n’est pas un problème : il suffira de le préciser à votre instruction « Pour » en lui rajoutant le mot « Pas » et la valeur de ce pas (Le « pas » dont nous parlons, c’est le « pas » du marcheur, « step » en anglais). Exemple : Afficher la table de multiplication par 2 VAR N , i : Entier Debut N ← 2 Pour i ← 1 à 10 Ecrire " x ",i, " = ", n*i i Suivant Fin 19