====== Algorithme: Définition et Langage ====== * Objet : Rappel des définitions et de la syntaxe du langage algorithmique * Niveau requis : {{tag>débutant avisé}} * Commentaires : //Contexte d'utilisation du sujet du tuto. // * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) ===== Introduction : Notion d'objets et d'actions ===== Quelques éléments du langage algorithmique.\\ On utilise * **caractères** ''**A**...**Z**'' ; ''**a**...**z**'' ; * les **chiffres** ''**0 1 2 3** ...'' ; * des **signes** ''** _ = < > ' " ( ) [ ] + - * / , : . **'' ; * les **identificateurs** : ce sont les noms donnés aux différents objets déclarés dans un algorithme.\\ Ils peuvent être fait d'une suite de longueur quelconque de chiffres de lettre (min, maj) de soulignés. * les **commentaires** : **//**explications sur les identificateurs, sur les étapes du programme d'algo =====Quatre sortes d'objets===== Il y a quatre sortes d'objets : les constantes, les variables, les fonctions et les procédures. ====Les constantes==== * Syntaxe de déclaration d'une constante : nom_constante = valeur_de_la_constante // On commente toujours le nom d'une constante. * Exemple : CONSTANTE taille = '.' // caractère de terminateur ====Les variables==== Une variable est un emplacement mémoire qui change de valeur au cours d'un programme ou d'un d'un algorithme. * **Syntaxe de déclaration d'une variable** nom_variable :type * Exemple : Nbjeunes :entier // Nombre de jeunes interrogés * **Affectation d'une variable** Elle n'est possible que s'il y a eu déclaration de la variable. On note le signe d'affectation **'':=''**. variable i : entier // déclaration ... i := 3 // affectation de i par la valeur 3 i := i + 1 // incrémentation de 1 ... i := 4 * i // i est multiplié par 4 ... ====FONCTION ET PROCEDURE ==== Fonction et procédure réalisent un travail, par exemple un calcul, et ne font rien d'autre que ce travail. Elles sont utilisée par des programmes qui les appelle, et qui font d'autre chose, par exemple afficher le résultat calculé par une procédure ou une fonction. Comparons une fonction et une procédure qui toute deux calculent le cube d'un nombre ; puis comment un programme utilise l'une ou l'autre. Voir [[utilisateurs:hypathie:tutos:algo-definition-et-langage?&#structure-generale-d-un-algorithme|la structure générale d'un algorithme]] ===Fonction cube === * Explication : On imagine un tableau où on place 2, le nombre dont calcule la puissance de 3 ;\\ L'indice maximal de ce tableau est la puissance à laquelle on veut élever le nombre 2. Pour i de 1 à 3 on fait : | 2 | 2 | 2 | | | | 1 * 2 | | = 2 | | 2 * 2 | = 4 | 4 * 2 = 8 * Déclaration et mise en place de la fonction Fonction fctcube (entrée x : entier):entier //cette fonction calcul la puissance trois d'un nombre // x est le nombre // la fonction retourne le cube du nombre CONSTANTES constante puissance = 3 VARIABLES variable i : entier //comptage des puissances variable y : entier // calcul intermédiaire début i := 1 y := 1 Tantque (i := puissance) FAIRE y := y * x i := i + 1 FinTantque retourner (y) Fin fin ===Utilisation de la fonction dans un programme=== //Programme cube // Programme qui calcule le cube d'un nombre et affiche le résultat VARIABLES nombre : entier // nombre à élever au cube FONCTIONS fonction fctcube (entrée x : entier):entier // cette procédure calcule le cube du nombre x et retourne le résultat Début lire(nombre) écrire ('le résultat est : ', fctcube(nombre)) // Appel de la fonction, elle rend la résultat qu'on affiche avec écrire // utilisation du résultat Fin ==== Procédure cube==== La différence avec un programme est l'en-tête. procédure proccube (entrée x : entier, sortie y : entier) // Cette procédure calcule la puissance trois d'un nombre. CONSTANTES constante puissance = 3 VARIABLES variable i :entier // comptage des puissances Début i := 1 j := 1 Tantque (i := puissance) FAIRE y := y * x i := i + 1 FinTanque Fin ===Utilisation de procédure dans un programme === La procédure fait le calcul du cube, le programme se moque de savoir comment,\\ il a pour travail de calculer le cube au moyen d'une procédure et d'afficher le résultat fait par la procédure. // Programme qui calcule le cube d'un nombre VARIABLES variable nombre :entier //nombre à élever au cube variable resultat :entier // cube du nombre PROCEDURES procédure proccube (entrée x : entier , sortie y : entier) //Cette procédure calcule le cube du nombre x et met le résultat dans y Début lire(nombre) proccube (nombre, resultat) // calcul du cube de nombre écrire('Le résultat est : ', résultat) // affichage du résultat du calcul Fin Voir ci-dessous la structure en sous programme d'un algorithme complexe: [[utilisateurs:hypathie:tutos:algo-exo-constructions-d-algorithmes-de-procedure]] Voir aussi : d'autres exemples simples d'algorithme de fonctions et de procédures : [[http://www.est-usmba.ac.ma/ALGORITHME/co/module_ALGORITHME_40.html]] =====Les Types===== Il y a quatre types prédéfinis : entiers ; réels ; booléens ; caractères.\\ Les tableaux sont des types de variables créés.\\ ====Les entiers ==== * Les entiers ne sont pas limités par leur taille.\\ * Les constantes entières sont toujours en base 10.\\ ===Les opérateurs de comparaison sur les entiers=== Ils ont pour opérandes deux entiers et donnent un résultat booléen. ^symboles ^ signification ^ | = | Comparaison d'un égalité | |<> | Comparaison d'une différence | | > | Comparaison de plus grand que | | < | Comparaison de plus petit que | | >= | Comparaison de plus grand ou égal que | | <= | Comparaison de plus petit ou égal que | ===Les opérateurs de calcul=== Ils ont pour opérandes deux entiers et donnent un résultat entier ^symboles ^ signification ^ | + | addition | | - | soustraction | | * | multiplication | | div | division (récupère le quotient) | | mod | modulo (récupère le reste de la division | **Exemples** :\\ 7 div 3 = 2\\ 7 mod 2 = 1\\ **Priorité de div et de mod sur + et - : ** ====Les réels ==== ===Écriture === 238.45 420.0 ===Opérateurs de comparaison sur les réels === ^symboles ^ signification ^ | = | Comparaison d'un égalité | |<> | Comparaison d'une différence | | > | Comparaison de plus grand que | | < | Comparaison de plus petit que | | >= | Comparaison de plus grand ou égal que | | <= | Comparaison de plus petit ou égal que | Le résultat de la comparaison est un booléen. ===Les opérateurs de calcul sur les réels=== ^symboles ^ signification ^ | + | addition | | - | soustraction | | * | multiplication | | / | division | Le résultat d'un calcul entre un entier et un réel se fait avec les opérateurs des réels et donne toujours un réel comme résultat. ====Les caractères ==== Ce sont tous les caractères imprimables de la tables ASCII ; 'a' et 'A' sont deux caractères différents.\\ On distingue '2' en tant que caractère et en tant qu'entier. On n'utilise que les opérateurs de comparaison ; ils sont ordonnés selon la tables ASCII. Voir : [[http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange]] ====Les booléens ==== ===Comparaison et calcul sur les booléens === * Deux valeurs possibles :** VRAI FAUX**\\ ===Opérateurs de comparaison === Le résultat d'une comparaison est soit VRAI soit FAUSSE : le résultat d'une comparaison est toujours un booléen. ^symboles ^ signification ^ | = | **Comparaison d'un égalité** | |<> | **Comparaison d'une différence** | | > | Comparaison de plus grand que | | < | Comparaison de plus petit que | | >= | Comparaison de plus grand ou égal que | | <= | Comparaison de plus petit ou égal que | Exemple de comparaison : ... i := entier bool : booléen // Déclaration d'une variable de type booléen ... SI (i > 5 ) ALORS bool := VRAI SINON bool := FAUX FINSI La comparaison ci-dessus (SI ... SINON ... FINSI) se réduira ainsi : bool := (i > 5) Pour s'aider lire ainsi : ''**bool = VRAI pour (i > 5)**''. ===Opérations logiques === Trois opérations nous intéresse : **NON ET OU** (du plus prioritaire au moins prioritaire). Il faut parenthèser les expressions pour la lisibilité. **Le ET et le OU algorithmiques ne sont pas le ET et le OU de la logique de bool.** * __En algo, on comprends **ET** comme un **ET-alors**__ : ^ a ^ b ^ condition a ET b ^ | FAUX| (non évalué)| FAUSSE (pas d'exécution du code) | | VRAI | alors b évalué\\ b = VRAI\\ b = FAUX | expression = b qui doit être calculable\\ a ET B = VRAI (condition exécutée)\\ a ET b = FAUX (condition non exécutée)| => Pour résumer, on tient compte de **b** seulement si a est vrai,\\ et la condition est exécutée si **a et b** sont vrais. * __On comprends le **OU** comme **OU-sinon**__ : ^ a ^ b ^ condition a OU b ^ | VRAI| (non évalué)| VRAI | | FAUX | (sinon) b évalué\\ b = FAUX\\ b = VRAI | expression = b qui doit être calculable\\ a OU b = FAUX (condition non exécutée)\\ a OU b = VRAI (condition exécutée) | => Pour résumer, **b** est pris en compte seulement si a est FAUX,\\ et la condition est exécutée si **b** est vrai. ===Rappel des tables de vérité === Voir : algèbre de bool surtout la loi de Morgan. ====Les types de variables créés (tableaux) ==== ===Déclaration d'un tableau à une dimension === * __Déclaration et affectation__ type // On annonce qu'on crée un nouveau type de variable. blabla = tableau[n] d'un type_pré-défini * Mettre (affecter) la valeur d'un indice (n° de case du tableau) dans une variable (cible) : cible := nom_tableau[i] | nom_variable <- valeur de tab[i] * __Mettre la valeur d'une variable (cible) dans une case de tableau (cible)__ : nom_tableau[i] := cible | case tableau <- valeur de variable * __Vérifier une condition__ : SI nom_tableau[i] = cible ALORS ... | | valeur case valeur de variable SI nom_tableau[i] = nom_tableau[i + 1] ALORS ... | | valeur de case valeur de case + 1 * Exemples 1: Type nombres : tableau[35] d'entiers * Exemple 2 : Type tab : tableau[35] d'entiers ===Lire la valeur d'une case d'un tableau=== lire(tab[2]) // enregistre en mémoire la valeur de la case 2 du tableau "tab". ===Afficher la valeur d'une case d'un tableau=== écrire(tab[5]) // afficher à l'écran la valeur de la case 5 du tableau "tab". ===Déclaration d'un tableau à deux dimensions === ... variables i: entier j: entier matcarré : matrice ... matcarré [i][j] := 2 // matcarré est de type matrice // matcarré[i] est de type tabent // matcarré [i][j] est de type entier **''matcarré [i][j] := 2''** ou **''matcarré [i][j] := 2''** Doc sur tableau : * [[http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CEAQFjAF&url=http%3A%2F%2F2igc.cours.free.fr%2Ftsttig%2F002I_Algo%2F02I_Algo02.doc&ei=1Lt6VLGUBIjdau32gbgG&usg=AFQjCNGBy4qN30W1FEHReM5fNcAHhdcQnQ&sig2=CYelZWE8ytMAn1tvjP7MRw&bvm=bv.80642063,d.d2s]] ===== Les actions ===== Il s'agit des instructions et des outils d'entrée et de sortie. ==== Les instructions alternatives==== ===L'instruction SI=== * Syntaxe : SI ALORS < instruction 1 > ... < instruction n > FinSI Exemple : variable i : entier //déclaration d'un variable nommée i SI i > 4 ALORS i := i - 1 SINON i := i + 1 FinSI ===L'instruction CHOIX=== * Syntaxe : CHOIX sur < variable > FAIRE < valeur 1 > : ... < valeur M > : ... AutreCas : ... FinCHOIX > ''AutreCas'' est obligatoire, même dans le cas où il n'y en a pas. * Exemple : variable i :entier ... CHOIX sur i faire 1 : écrire(c'est bien) 2 : écrire(c'est très bien) 3 : écrire(c'est très nul) AutreCas : écrire('Les moyens') //cas tous regroupables FinCHOIX * enregistrer la valeur donnée par l'utilisateur d'une variable déclarée age : entier //"age" c'est le nom de la variable lire(age) // * afficher ce qu'on veut à l'écran : écrire(blabla) // * afficher à l'écran la valeur d'une variable parmi un message : age : entier age := 25 écrire('La valeur de la variable age est :', age 'encore du texte si on veut.') // === Instructions itératives : TantQue=== Instruction exécutée par la boucle tant que la condition est remplie ; il faut une condition d'arrêt. La boucle est toujours exécutée au moins une fois. * Syntaxe : TantQue < condition > FAIRE // condition de continuation < instruction1 > < instruction2 > ... FinTQ * Exemple : variable i : entier i := 1 TantQue ( i < 3 ) FAIRE // La boucle s'arrêtera quand i sera >= à 3. // On met dans le commentaire la condition contraire // c'est-à-dire la condition de terminaison. i := i + 1 // incrémentation écrire ('coucou') // Tant que i < 3 il s'affiche "coucou" à l'écran. FinTQ écrire('la variable i est égale à ', i) // coucou coucou la variable i est égale à 3 === Instructions itératives : Répéter=== Elle permet d'exécuter une instruction jusqu'à ce qu'une condition soit remplie. Attention si la condition n'est jamais remplie, l'instruction n'est jamais exécutée, car la conditiion est placée après l'instruction ! * Syntaxe : Répéter < instruction 1> < instruction n> Jusqu'à < condition > // C'est une condition d'arrêt. * Exemple : variable i : entier i := 1 Répéter i := i + 1 écrire('coucou') Jusqu'à ( i >= 3 ) // être égal à 3 est une condition d'arrêt. écrire('la variable i est égale à ', i) coucou coucou la variable i est égale à 3 > ATTENTION la boucle s'effectue toujours une fois Dans le schéma "Tant que" la condition de poursuite est avant le traitement, dans le schéma "Répéter", la condition de poursuite est après.\\ La boucle répéter est donc exécutée au moins une fois.\\ Avec une boucle répéter, on exécute l'instruction " tant que la condition est fausse. " répéter Afficher "Saisir un nombre strictement positif " Saisir i Si i (<= 0) alors écrire("J'ai dit STRICTEMENT POSITIF !") Sinon écrire("Bravo") Finsi jusqu'à i > 0 => Si on entre -2 : on aura "J'ai dit STRICTEMENT POSITIF !" =====Structure générale d'un algorithme ===== Un algorithme écrit d'un seul tenant devient difficile à comprendre et à gérer dès qu'il dépasse deux pages. La solution consiste alors à découper l'algorithme en plusieurs parties plus petites. Ces parties sont appelées des sous-algorithmes. Voici le schéma de l'algorithme d'un programme complexe, l'algorithme principal (P0) appelle les algorithmes de sous-programmes (P1, P2, P3), qui eux-mêmes en appellent d'autres ... : __________| P0 |____________ | | | | _____ | | P1 | | P2 | | P3 | | | ____________________ ______________________ |P11| | P12 | | P21| P22 | Le sous-algorithme est écrit séparément du corps de l'algorithme principal et sera appelé par celui-ci quand ceci sera nécessaire. Les différentes parties d'un algorithme (sous-algorithmes) sont appelées des blocs. Il existe deux sortes de **sous-algorithmes** : **les procédures et les fonctions**. Un objet définit dans un bloc n'est pas connu dans les blocs extérieurs. Mais il doit être connu (défini) dans bloc et il est connu (re-défini) dans les sous-blocs de ce bloc. ====Structure d'un bloc ==== Quelque soit le niveau où l'on se trouve dans l'arborescence, tous les blocs, y compris l'algorithme du programme principal, se déclare comme ceci : Interface de bloc // nom du programme, de la procédure ou de la fonction. // Commentaire sur le rôle du bloc CONSTANTE // On définit les constantes. TYPES // Définitions des types du bloc VARIABLES // Définitions des variables PROCEDURES ... // Définitions des sous-procédures appelées par le bloc, ce bloc // est alors un algorithme plus globale FONCTIONS ... // Définitions des fonctions appelées par le bloc // Définition des actions du bloc Début actions // actions effectuées lors de l'activation du bloc Fin ====Les procédures dans algorithme==== Une procédure est une boîte (un petit algorithme) qu'on insère dans un programme ( gros algorithme) et à laquelle on donne les paramètres du programme. Ses **paramètres sont appelés paramètres formels**. Leurs valeurs ne sont pas connus lors de la création de la procédure. //Dans un **programme principal qui utilise une procédure**, on n'aura pas à expliquer comment fonctionne la procédure utilisée, mais seulement ce à quoi elle sert dans ce programme, et ce qu'on lui donne en paramètre dans ce programme. Dans le programme les paramètres passés à la procédure sont réels ; ils sont appelés **paramètres effectifs**.// ===Déclaration d'une procédure=== * Syntaxe : Procédure nom_proc(entrée nom_parmètre1_formel : typeDuParamètre nom_paramètre2_formel : typeDuParamètre entrée sortie nom_paramètre1 : typeDuParamètre sortie nom_paramètre1_formel : typeDuParamètre) > Cela est copier de l'étape n°4 de la présentation ([[utilisateurs:hypathie:tutos:algo-la-presentation-d-une-procedure?&#definition-de-l-interface]] ===La procédure=== Une procédure est une série d'__instructions regroupées sous un nom__, qui permet d'effectuer des actions par un simple appel de la procédure dans un algorithme ou dans un autre sous-algorithme. * On y trouve - la déclaration ; - ces composants (constantes, type_créé , variables) ; - le programme qui permet à cette procédure de fonctionné ===Appel d'une procédure dans un programme === Pour déclencher l'exécution d'une procédure dans un programme, il suffit de l'appeler. L'appel de procédure s'écrit en mettant le nom de la procédure, puis la liste des paramètres, séparés par des virgules. A l'appel d'une procédure, le programme interrompt son déroulement normal, exécute les instructions de la procédure, puis retourne au programme appelant et exécute l'instruction suivante. ... Nom_procédure(liste de paramètres) ... ====Exemple simple d'un algorithme appelant un sous-algorithme ==== //Donnez l'algorithme qui affiche un carré d'étoile à l'écran.// L'exemple suivant ne prétend que mettre en avant l'appel de procédure dans un algorithme.\\ Cela est possible seulement parce qu'il s'agit d'un cas très simple.\\ // Algorithme carréEtoile | // Algorithme qui affiche un carré de 15 lignes // et de 15 colonnes Variables j : entier // nombre d'étoile sur une ligne Procédure Etoile ( ) // pas de paramètre //Procédure qui affiche une // ligne de 15 étoiles. DébutAlgo Pour j DE 1 à 15 FAIRE // appel de la procédure --------------->| Etoile(entrée i : entier , sortie i :entier) Etoile( ) | // Procédure qui affiche une ligne d'étoile | // Et qui va à la ligneFinProc FinPour | FinAlgo | | Variables i :entier | DébutProc | Pour i DE 1 à 15 | ecrire("*") | FinPour | ecrire("\n") | FinProc Lors de problème plus complexes, on le divise en procédures et l'on cherche un algorithme\\ pour chaque procédure. =====Les entrée sortie et entrée sortie ===== + entrée | | sortie variables | | c = 3 a = 1 b = 2 entrée sortie | | | modifier une variable | | qui est donnée | | en entrée et qui sort | | avec une autre valeur |