Algorithmique 1ère Année

of 175 /175
Sylvain Contassot- Vivier Algorithmique 1ère Année IUT Belfort-Montbéliard Département Informatique

Embed Size (px)

description

Algorithmique 1ère Année. IUT Belfort-Montbéliard Département Informatique. Introduction. L’informatique met en jeu des ordinateurs qui fonctionnent selon des schémas pré-établis - PowerPoint PPT Presentation

Transcript of Algorithmique 1ère Année

  • IntroductionLinformatique met en jeu des ordinateurs qui fonctionnent selon des schmas pr-tablisPour rsoudre un problme donn laide dun ordinateur, il faut lui indiquer la suite dactions excuter dans son schma de fonctionnementCette suite dactions est un programme qui est exprim dans un langage de programmation plus ou moins volu (code machine, assembleur, C, Caml, Prolog)Pour crire un programme (la suite dactions), il faut donc dabord savoir comment faire pour rsoudre le problme

  • AlgorithmeUn algorithme est lexpression de la rsolution dun problme de sorte que le rsultat soit calculable par machineLalgorithme est exprim dans un modle thorique de machine universelle (Von Neumann) qui ne dpend pas de la machine relle sur laquelle on va lutiliserIl peut tre crit en langage naturel, mais pour tre lisible par tous, on utilise un langage algorithmique plus restreint qui comporte tous les concepts de base de fonctionnement dune machineOn a finalement lenchanement suivant :nonc du problme Algorithme Programme (universel) (li une machine)

  • Problme et noncUn problme a un nonc qui donne des informations sur le rsultat attenduIl peut tre en langage naturel, imprcis, incomplet et ne donne gnralement pas la faon dobtenir le rsultatExemples :Calculer le PGCD de 2 nombresCalculer la surface dune piceRanger des mots par ordre alphabtiqueCalculer x tel que x divise a et b et si y divise a et b alors xyLe dernier exemple dcrit trs prcisment le rsultat mais ne nous dit pas comment le calculer

  • Rsolution de problmesPour rsoudre un problme, il faut donner la suite dactions lmentaires raliser pour obtenir le rsultatLes actions lmentaires dont on dispose sont dfinies par le langage algorithmique utilisExemple :

    Parfois, il faut dcomposer les actions trop complexes

    Construire une maison

    Niveler le terrainPlacer les fondationsMonter les mursPoser la toitureInstaller llectricitInstaller les canalisationsAjouter les portes et fentresPoser la toiture

    Poser la charpentePoser les chevronsPoser les liteauxPoser la sous-toiturePoser la couverture

  • Un exempleLordre des oprations a son importance, mais dans certains cas plusieurs ordres sont possibles

    Algorithme dEuclide : Calcule le PGCD de 2 entiers a et b

    Ordonner les deux nombres tel que abCalculer leur diffrence c=a-bRecommencer en remplaant a par c (a=c)jusqu ce que a devienne gal b

  • Excution avec 174 et 72tape 1 : a=174 et b=72tape 2 : c=174-72=102tape 3 : a=c=102 b=72 tape 4 : a=102 et b=72tape 5 : c=102-72=30tape 6 : a=c=30 b=72tape 7 : a=72 et b=30tape 8 : c=72-30=42tape 9 : a=42 b=30tape 10 : a=42 et b=30tape 11 : c=42-30=12tape 12 : a=12 b=30

  • Suite et fintape 13 : a=30 et b=12tape 14 : c=30-12=18tape 15 : a=18 b=12tape 16 : a=18 et b=12tape 17 : c=18-12=6tape 18 : a=6 b=12tape 19 : a=12 et b=6tape 20 : c=12-6=6tape 21 : a=6 = b=6Arrt car a=b le rsultat est donc 6

  • Langages nonc algorithme programme

    langage naturel langage algorithmique langage de programmation

    Un langage est compos de deux lments :La grammaire qui fixe la syntaxeLa smantique qui donne le sensLe langage rpond donc deux questions :Comment crire les choses ?Que signifient les choses crites ?

  • Types de langagesLangages machines : code binaire, lis au processeurLangages assembleurs : bas niveau, lis au processeurLangages volus : haut niveau, indpendants de la machine compilateur ou interprteur pour lexcutionLangages impratifs (procduraux) : suite des instructions raliser dans lordre dexcution : C, Pascal, Fortran, CobolLangages objets : modlisation par entits ayant des proprits et des interactions possibles : C++, JavaLangages dclaratifs : rgles de calcul et vrification de proprits sans spcification dordre :Fonctionnels : les rgles sont exprimes par des fonctions : CamlLogiques : les rgles sont exprimes par des prdicats logiques : Prolog

  • tapes de la conceptionLa conception de lalgorithme est la phase la plus difficileOn privilgie une mthodologie hirarchique en dcomposant lalgorithme en partiesChaque partie est elle-mme dcompose jusqu obtenir des instructions lmentaires (raffinements successifs)Les diffrents lments dun algorithme :Description du rsultat : ce que doit produire lalgoIde de lalgorithme: les grandes tapes de traitement/calculLexique des variables: liste des valeurs manipulesAlgorithme: le dtail du traitement/calculDautres lments peuvent sajouter (on les verra plus loin)

  • Description du rsultatSpcifier prcisment ce que doit produire lalgorithme et le lien entre le rsultat et les donnes fournies au dpartSynopsis :Utilisation du mot cl Rsultat : suivi dun texte en langage naturel dcrivant le rsultatExemples :Problme : trouver x tel que x divise a et b et si y divise a et b alors xyRsultat : affichage du PGCD de deux entiers a et b

    Problme : calculer la surface dun champRsultat : affichage de la surface dun champ

  • Lexique des variablesListe des valeurs manipules par lalgorithmeSynopsis :Mot cl Lexique des variables : suivi de la liste dtaille des variablesLes variables permettent de nommer et mmoriser les valeurs manipules par lalgorithmeElles sont dfinies par :Un nom : rfrence de la variable. Exemple : numroProduit cf formalisation des noms de variablesUn type : nature de la valeur (entier, rel, caractre,) cohrence des calculs/traitements

  • Ide de lalgorithmeDescription informelle en langage naturel des grandes tapes de lalgorithme (1re dcomposition)Synopsis :Mot cl Ide : suivi de lnumration des tapesExemple : calcul de la surface dun champIde :Acqurir la longueur et la largeur du champCalculer la surfaceAfficher la surfaceCes 3 tapes sont dduites du rsultat demandChaque tape de lide peut elle-mme tre dcompose si elle est trop complexe, et ainsi de suite (cf la maison)

  • Lexique des variablesLes informations donnes pour chaque variable sont :Nom: en suivant les conventions spcifiesType : indiqu entre parenthsesDescription : texte bref en langage naturel donnant la signification de la variable dans lalgorithmeRle : on distingue trois rles possibles :DONNE : la valeur de la variable est donne lalgorithme par le biais dune lecture depuis un mdia quelconqueRSULTAT : la valeur de la variable est fournie en rsultat de lalgorithme, elle et gnralement calcule par celui-ciINTERMDIAIRE : la valeur de la variable est calcule par lalgorithme et utilise dans des calculs sans tre fournie en rsultat

  • Lexique des variablesDans lexemple prcdent on obtient :Lexique des variables :

    La largeur et la longueur du champ sont des donnes du problme La surface est le rsultat rendu par lalgorithmeIl ny a pas de variable intermdiaire dans cet algorithme

    NOMTYPEDESCRIPTIONRLEsurface(rel)Surface du champRSULTATlongueur(rel)Longueur du champDONNElargeur(rel)Largeur du champDONNE

  • AlgorithmeDtail en langage algorithmique des traitements/calculs effectus par lalgorithmeSynopsis :Mot cl Algorithme : suivi de la suite des actions lmentairesExemple : la surface dun champAlgorithme :

    longueur lirelargeur liresurface longueur * largeurcrire surface

  • ExplicationsLaffectation : indique par Affecte la valeur droite de la flche dans la variable place gauchetruc machin peut se lire : variable truc reoit la valeurmachin Attention la correspondance des types !On ne peut affecter une variable quune valeur de mme typePermet de vrifier la cohrence de ce que lon critExemple :maVariable 15maVariable contient 15 aprs linstructionLa valeur 15 sera prise en lieu et place de maVariable dans la suite de lalgorithme jusqu sa prochaine modification

  • Oprateurs diverslire : signifie que la valeur est donne par lutilisateurcrire : affiche du texte et/ou des valeurs lcranLes oprateurs arithmtiques sont * / + - et % (modulo) le type du rsultat dpend du type des oprandes :Le rsultat a toujours le type le plus complexe des oprandesExemples :entier op entier entierentier op rel relrel op entier relrel op rel relentier / entier entier (division entire !!)!

  • Oprateurs divers (suite)Les oprateurs boolens : et, ou, non dans {vrai,faux}A et B : vrai si A et B sont vraisA ou B : vrai si A est vrai ou B est vrainon A : inverse logique de A (not )Oprateurs de comparaison : Autres fonctions mathmatiques : on suit le C++

    exexp(x)xypow(x,y) xsqrt(x)xfloor(x)xceil(x)||x||abs(x) ou fabs(x)

  • Lexique des constantesValeurs utilises mais non modifies par lalgorithmeSynopsis :Mot cl Lexique des constantes : suivi de la liste des constantesPlac avant le lexique des variablesElles sont dfinies par :Un nom : rfrence de la constante. Exemple : TAUX_TVA cf formalisation des noms de constantesUn type : nature de la valeur (entier, rel, caractre,)Une valeur : la valeur de la constante, connue avant lexcution de lalgorithme et non modifie par celui-ciUne description : un texte indiquant ce que reprsente la constante

  • Les conditionnellesPossibilit de choisir une squence d'instructions selon une condition donneExemple : "s'il pleut, je prends mon parapluie et je mets mes bottes sinon je mets mes sandales"

  • ConditionnellesSynopsis :

    La condition est une expression boolenne {vrai,faux}Si la condition est vraie, on excute la branche alorsSi la condition est fausse, on excute la branche sinon

    si alors ...sinon ...fsi si alors ...fsi

  • Imbrication de conditionnellesToute instruction algorithmique peut tre place dans une conditionnelle, donc galement une conditionnelle !Cela permet de multiplier les choix possibles d'excutionExemple :

    L'ordre des imbrications est gnralement important /* c1 vraie */ /* c1 fausse *//* c2 vraie *//* c2 fausse */

    si c1 alors ...sinon si c2 alors ... sinon ... fsifsi

  • Conditionnelles de type casLorsque l'on veut comparer une seule variable une numration de valeurs connues l'avance, on peut utiliser la structure de contrle selon queSynopsis :le cas dfaut est optionnel les val sont des constantestoutes diffrentes maisdu mme type que variable

    selon que est : ... : ... : ... dfaut : ...fselon

  • Contrles itratifs (boucles)Possibilit de rpter une suite dinstructions selon une condition donneExemple : Euclide rpter jusqu ce que a=bOn dispose de 3 structures de contrles diffrentes :Le tant que : Rpte des instructions tant que la condition de la boucle est vraieLes instructions de la boucle peuvent ne pas tre excutesLe pour :Rpte des instructions un nombre connu de foisLa condition porte uniquement sur le nombre ditrations effectuerLe rpter :Comme le tant que mais on effectue au moins une fois les instructions de la boucle

  • Structure tant queSynopsis :instructionsconditionvraifauxinitialisationsLes initialisations spcifient les valeurs initiales des variables intervenant dans la conditionIl faut au moins une instruction dans la boucle susceptible de modifier la valeur de la conditionLes instructions de la boucle peuvent ne pas tre excutes

    tant que ...ftant

  • Exemple : EuclideAlgorithme :Utilis pour effectuer un nombre inconnu (fini) ditrations Vous devez vous assurer que la boucle termine et donc que la condition devient fausse un moment donn!

    a lire b liretant que a b si a b alors changer(a,b) fsi c a-b a cftant/* initialisations de la boucle */

    /* condition dexcution de la boucle */

    /* change les valeurs de a et b */

    /* instruction modifiant la valeur dau moins une variable intervenant dans la condition */

  • Exemple : conversion de F en CAlgorithme :Utilis pour effectuer un nombre connu ditrations

    nbTemp lirei 1 /* initialisation de la boucle */tant que i nbTemp /* condition dexcution de la boucle */ fahr lire celsius (fahr-32)*5/9 crire "la temprature ",fahr," en degrs F est ",celsius," en degrs C" i i+1 /* instruction de modification ventuelle de la condition */ftant

  • Structure pourLorsque la rptition ne porte que sur le nombre ditrations et quil est connu avant de commencer la boucle, on utilise une criture plus condense que le tant que, cest la structure de contrle pour

    Synopsis :instructionscompteur borneMaxvraifauxcompteur borneMincompteur compteur+1

    pour de ...fpour

  • Exemple : conversion de F en CAlgorithme :

    Le pour cache linitialisation et la mise jour du compteurIl permet aussi dviter des erreurs / oublisIl ne faut pas modifier le compteur dans la boucleOn peut utiliser la valeur du compteur dans la boucle!

    nbTemp lirepour i de 1 nbTemp fahr lire celsius (fahr-32)*5/9 crire "la temprature ",fahr," en degrs F est ",celsius," en degrs C"fpour

  • Exemple : les factoriellesAlgorithme :

    Utilisation de la valeur de i dans la boucleInitialisation du ou des lment(s) calcul(s) dans la boucle, ici la variable factSi on place laffichage en dehors de la boucle (aprs le fpour) on affiche uniquement la dernire valeur calcule

    n lirefact 1pour i de 1 n fact fact * i crire factfpour

  • Sens du pourPar dfaut, une boucle pour va dans le sens croissantOn peut inverser le sensSynopsis :

    On nentre pas dans la boucle si ses bornes sont dans lordre inverse de son sensinstructionscompteur borneMinvraifauxcompteur borneMaxcompteur compteur-1!

    pour de en descendant ...fpour

  • Structure rpterSimilaire au tant que mais excute au moins une foisSynopsis :

    Pratique pour la vrification des lectures de donnes :rpter la lecture tant que celle-ci nest pas valide

    rpter ...tant que

  • Boucles imbriquesOn peut placer nimporte quel type de boucle dans une autreExemple :Algorithme

    n lirepour i de 1 n rpter a lire tant que a 0 rpter b lire tant que b 0 tant que a b si a b alors changer(a,b) fsi a a-b ftantfpour

  • Arrt sur la fin des donnesOn lit les donnes tant que lutilisateur en fournitLa lecture renvoie la constante EOF quand plus de donnesCette valeur est place dans la variable lueExemple :Algorithme

    n liretant que n EOF fact 1 pour i de 1 n fact fact * i fpour crire factftant

  • Les fonctionsMorceaux dalgorithmes rutilisables volontLes fonctions permettent la dcomposition des algorithmes en sous-problmes (raffinements successifs)Prennent en entre des paramtresRestituent lalgorithme appelant un ou plusieurs rsultatsDfinies par :Un en-tte :Nom : identifiant de la fonctionListe des paramtres : informations extrieures la fonctionRsultat : valeur de retour de la fonctionDescription en langage naturel du rle de la fonctionUn corps :Algorithme de la fonction

  • En-tte de fonctionRepr par le mot cl fonction Exemple :fonction nomFonction( mode nomParam : typeParam, ) : ret typeRet /* indique ce que fait la fonction et le rle de ses paramtres */nomFonction : identifiant de la fonction (cf normalisation des noms)mode : donner pour chaque paramtrein : paramtre donne, non modifiable par la fonction out : paramtre rsultat, modifi par la fonction, valeur initiale non utilisein-out : paramtre donne/rsultat, valeur initiale utilise, modifi par la fonctionnomParam : identifiant du paramtre dans la fonctiontypeParam : type du paramtreretour :Mot cl ret suivi du type de la valeur renvoye par la fonction (typeRet)Si pas de retour, on remplace ret par le mot cl vide

  • Corps de la fonctionConstruit comme un algorithme classique :Ide de lalgorithmeLexique local des constantesLexique local des variablesAlgorithme de nomFonctionLes variables/constantes dfinies dans une fonction sont utilisables uniquement dans cette fonction et ne peuvent pas tre utilises en dehors de celle-ci (variables locales ou constantes locales)Elles sont dtruites ds que lon sort de la fonction

  • Dclaration / Dfinition / RetourLa dclaration des fonctions est place avant le lexique des variables dans le lexique des fonctions (liste des en-ttes)La dfinition des fonctions est place aprs lalgorithme principal dans la section dfinition des fonctions (corps des fonctions)Lorsque la fonction a un retour, sa dernire instruction doit tre retour_de_nomFonction valeurDeRetour Cela permet de renvoyer effectivement une valeur lalgorithme appelantLes fonctions sans retour sont appeles procdures

  • Paramtres formels / effectifsles paramtres de la fonction ne doivent pas tre redfinis dans le lexique local des variables de la fonctionCe sont dj des variables/constantes locales la fonction dans lesquelles on recopie les lments reus de lalgorithme appelantLes paramtres dans len-tte de la fonction sont les paramtres formelsLes paramtres utiliss lors de lappel de la fonction par lalgorithme appelant sont les paramtres effectifsLes fonctions peuvent ne pas avoir de paramtres !

  • Exemplefonction volPrisme( in ct : rel, in hauteur : rel ) : ret rel/* calcule le volume dun prisme de ct et hauteur donns */

    Lexique local des variables :

    Algorithme de volPrisme :

    hauteurTri(rel)Hauteur du triangle formant la baseINTERMDIAIREsurfTri(rel)Surface du triangle formant la baseINTERMDIAIRE

    hauteurTri ct * sqrt(3) / 2surfTri ct * hauteurTri / 2retour_de_volPrisme surfTri * hauteur

  • Exemple (suite)Lexique des variables :

    Algorithme :

    nbVol(entier)Nombre de volumes calculerDONNEi(entier)Compteur de la boucleINTERMDIAIREctPri(rel)Ct dun prismeDONNEhauteurPri(rel)Hauteur dun prismeDONNE

    nbVol lirepour i de 1 nbVol ctPri lire hauteurPri lire crire le volume du prisme est , volPrisme(ctPri,hauteurPri)fpour

  • ExplicationctPri lirei nbVolvraifauxi 1i i+1nbVol lirehauteurPri lirecrire , volPrisme(ctPri,hauteurPri)

  • Fonction sans retourctCarr lirei nbCarrsvraifauxi 1i i+1nbCarrs lire

  • Fonctions rcursivesConstruire la solution d'un problme en utilisant la solution du mme problme dans un contexte diffrent (plus simple)La suite des contextes doit tendre vers une solution directe (cas terminal)Adaptes une certaine classe de problmesExemple : la factorielle n!=n*(n-1)! et 0!=1fonction factorielle( in n : entier ) : ret entier/* calcule la factorielle de n positif ou nul */Algorithme de factorielle :

    si n=0 alors retour_de_factorielle 1sinon retour_de_factorielle n * factorielle(n-1)fsi

  • Exemple dexcutionfact(5) 5 * fact(4)

  • CaractristiquesUne telle fonction doit contenir :au moins un appel elle-mme avec des paramtres diffrents au moins un cas o elle ne s'appelle pas au moins une conditionnelle pour sparer ces diffrents casOn dit que la rcursivit est terminale lorsque l'appel rcursif est la dernire instruction ralise lors de l'appel courantS'il y a des traitements aprs l'appel rcursif, on a une rcursivit non terminale

  • Exemplefonction litEcritOrdo( in nb : entier ) : vide/* lit et crit dans le mme ordre nb nombre entiers */fonction litEcritInv( in nb : entier ) : vide/* lit et crit dans l'ordre inverse nb nombre entiers */

    Algorithme de litEcritOrdo :Algorithme de litEcritInv :

    si nb > 0 alors valeur lire crire valeur litEcritOrdo(nb-1)fsisi nb > 0 alors valeur lire litEcritInv(nb-1) crire valeurfsi

  • Autre exempleCalcul de C(n,k) = C(n-1,k-1) + C(n-1,k) avec :C(n,n)=1, C(n,0)=1, C(n,k)=0 quand k>nfonction cnk( in n : entier, in k : entier ) : ret entier /* ... */Algorithme de cnk :

    Si n

  • ExcutionC(4,2)11

  • Les tableauxStructure de donnes qui permet de rassembler un ensemble de valeurs de mme type sous un mme nom en les diffrenciant par un indice

    tNotes un tableau de 6 rels

    Dclaration :

    tNotes(rel tableau[6])Liste des notes

  • Tableaux de constantesPlac dans le lexique des constantesOn indique le contenu par la liste des valeurs entre { }On garde le formalisme des noms de variables

    Exemple :On a besoin de la liste des nombres de jours des mois de lanne on peut dfinir un tableau dans le lexique des constantes

    tJoursMois(entier tableau[12])={31,28,31,30,31,30,31,31,30,31,30,31}

  • Initialisation dun tableauLorsque lon connat les valeurs initiales placer dans un tableau, on peut le faire en une seule instruction :tableau { liste_valeurs }Le nombre de valeurs dans la liste doit correspondre au nombre dlments du tableauExemple :on a un tableau de 8 entiers tMesValeurs, on peut linitialiser par :tMesValeurs { 5, 9, -4, 2, 12, 17, 2, 7 }

  • Lecture/affichage dun tableauPour initialiser un tableau avec des valeurs fournies par lutilisateur, on est oblig de lire les valeurs une par uneUne boucle de lecture est donc ncessaireAlgorithme :

    Laffichage se fait aussi lment par lmentAlgorithme

    pour i de 0 nbElem-1 tab[i] lirefpour

    pour i de 0 nbElem-1 crire tab[i]fpour

  • Tableau et fonctionOn peut passer un tableau en paramtre dune fonctionIl faut en gnral passer aussi la taille du tableauExemple : fonction lirePrix(out tPrix : rel tableau, in taille : entier ) : vide/* lit taille prix et les stocke dans tPrix */Lexique local des variables :

    Algorithme de lirePrix :

    pour i de 0 taille-1 tPrix[i] lirefpour

    i(entier)Indice de la boucle de lectureINTERMDIAIRE

  • Exempledition dune facture correspondant lachat de produits en quantits donnes parmi une liste de NB_PROD produits de prix des donns et numrots de 1 NB_PRODlexique des constantes :

    lexique des fonctions :fonction lirePrix(out tPrix : rel tableau, in taille : entier ) : videlexique des variables :

    tPrix(rel tableau[NB_PROD])Liste des prix des produitsDONNEtotal(rel)Montant total de la factureRSULTATnumProd(entier)Suite des numros de produits achetsDONNEquantit(entier)Suite des quantits de produitsDONNE

    NB_PROD(entier)= 10Nombre de produits vendre

  • Exemple (suite)Algorithme :

    lirePrix(tPrix,NB_PROD) /* remplissage de la liste des prix des produits */total 0numProd lire /* lecture du premier numro de produit */tant que numProd EOF si numProd 1 et numProd NB_PROD alors quantit lire total total + quantit * tPrix[numProd-1] fsi numProd lireftantcrire le montant total est de , total,

  • Parcours en sens inverseOn peut aussi parcourir un tableau de la fin vers le dbutAlgorithme :

    impression de la liste des valeurs lues en ordre inverse

    pour i de 0 taille-1 tab[i] lirefpourpour i de taille-1 0 en descendant crire tab[i]fpour

  • Compter les voyelles dans un texteRsultat : afficher le nombre doccurrences des lettres a,e,i,o,u dans un texte

    Ide :Lire le texte caractre par caractreCompter les occurrences des voyellesAfficher les nombres doccurrences des voyelles

    Lexique des constantes :

    Lexique des variables :

    NB_VOY(entier)= 5Nombre de voyelles dans lalphabet

    tNbVoy(entier tableau[NB_VOY])Tableau des compteursRSULTATcarLu(caractre)Suite des caractres du texte luDONNE

  • AlgorithmeAlgorithme :

    tNbVoy {0,0,0,0,0}carLu lireTant que carLu EOF selon que carLu est a : tNbVoy[0] tNbVoy[0] + 1 e : tNbVoy[1] tNbVoy[1] + 1 i : tNbVoy[2] tNbVoy[2] + 1 o : tNbVoy[3] tNbVoy[3] + 1 u : tNbVoy[4] tNbVoy[4] + 1 fselon carLu lireftantcrire a, tNbVoy[0], e, tNbVoy[1], i, tNbVoy[2],

  • Avec un tableau de constanteslexique des constantes :

    Algorithme :

    NB_VOY(entier)=5Nombre de voyelles dans l'alphabettVoy(caractre tableau[NB_VOY])={'a','e','i','o','u'}Liste des voyelles

    tNbVoy {0,0,0,0,0}carLu liretant que carLu EOF pour i de 0 NB_VOY-1 si carLu=tVoy[i] alors tNbVoy[i] tNbVoy[i] + 1 fsi fpour carLu lireftant...pour i de 0 NB_VOY-1 crire tVoy[i], tNbVoy[i]fpour

  • Les caractresNots entre apostrophes :Exemples : a, A, 3, { sont des caractresOn utilise un seul jeu de caractres la foisIl suit certaines conventions :Il contient tous les caractres utilisables (lettres, chiffres, ponctuations)Chaque caractre est repr par sa position dans le jeu de caractres Notion dordre entre les caractresLes chiffres sont contigus et dans lordreLes lettres minuscules sont contigus et dans lordreLes lettres majuscules sont contigus et dans lordreLordre entre ces diffrents sous-ensembles peut tre quelconque

  • Oprations sur les caractresAddition/soustraction dun entier : car entier car Effectue un dcalage dans le jeu de caractres, du nombre de positions spcifi partir du caractre donn :Vers la droite avec laddition Vers la gauche avec la soustractionExemples : a+1 b, 5-3 2, G+0 G

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

  • Oprations sur les caractresDiffrence entre deux caractres : car car entierRenvoie le dcalage relatif entre les deux caractres : le dplacement ncessaire pour arriver au 1er car en partant du 2ndExemples : b-a 1, 3-5 -2, G-G 0, A-a

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

  • Oprations sur les caractresComparaisons : car car boolenCompare deux caractres selon leurs positions dans le jeu de caractres Un caractre est infrieur un autre sil est plac avantExemples : a9 faux, GI vrai

    Il nest pas ncessaire de connatre les positions relles des caractres dans la table

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

  • Les chanes de caractresTableau de caractres se diffrenciant par son contenu :La chane contient au moins une occurrence du caractre spcial \0Ce caractre marque la fin de la chaneExemple : la chane "bonjour" correspond

    Consquences :Il faut un tableau dau moins N+1 cases pour stocker une chane de N caractres ( cause du \0)Lors du parcours dune chane, il nest pas ncessaire de connatre sa taille car on sarrte ds que lon rencontre le caractre \0Le type chane est utilis pour marquer la diffrence smantique avec les tableaux de caractresbojnuor\0

  • Dclaration / LectureDclaration :

    Lecture dune chane : directement avec linstruction lireExemple : maChane lireLes caractres sont rangs dans la chane dans lordre de lectureLe \0 est ajout automatiquement juste aprs le dernier caractre luLa lecture dune chane sarrte sur le premier sparateur rencontr : espace et retour la ligneLa chane doit pouvoir contenir ce qui est lu!

    maChane(chane[20])Une chane de 19 caractres au plus

  • RemarqueLe type chane est diffrent du type caractre tableau :

    nom est termin par un \0 et sa lecture et son affichage sont directsprnom ne contient pas de \0 et doit tre lu/affich caractre par caractreExemple :!

    nom(chane[20])Nom de ltudiantprnom(caractre tableau[20])Prnom de ltudiant

    nom lire /* 19 caractres au plus */i 0carLu liretant que carLu EOF et carLu et carLu \n et i

  • ExcutionBo\0nJ

    nom lirei 0carLu liretant que carLu EOF et prnom[i] carLu i i + 1 carLu lireftant

    nom =i=0carLu=JVraiVraiVraiVrai

    i=1i=2i=3i=4eanEOF

    Faux

  • Manipulation de chanesPlusieurs oprations sont possibles sur les chanes :Dterminer la longueur dune chaneCopier une chane dans une autreConcatner deux chanes (lune la suite de lautre)Comparer deux chanes (ordre lexicographique)Rechercher une sous-chane dans une chane cf TDsLa longueur des chanes nest pas explicitement ncessaire pour effectuer ces oprationsLaffectation dune chane (sauf lecture) ne peut se faire que caractre par caractre

  • Recherche dans un tableauTrouver lindice dun lment particulier dans le tableau Une premire solution est de parcourir tout le tableau et de sarrter ds que lon trouve la valeur chercheIl faut prvoir de sarrter la fin du tableau si la valeur nest pas prsente

    fonction recherche( in tab: entier tableau, in taille : entier, in val : entier ) : ret entier/* renvoie lindice de val dans tab de taille taille si elle y est et 1 sinon */

    Lexique local des variables :!

    i(entier)Suite des indices des cases du tableauINTERMDIAIRE trouv(boolen)Vrai si val est dans tab et faux sinonINTERMDIAIRE

  • Algorithme simpleAlgorithme :

    i 0trouv tab[i]=valtant que trouv et i

  • Recherche dans un sous-tableaufonction rechercheDans( in tab: entier tableau, in deb : entier, in taille : entier,in val : entier ) : ret entier/* renvoie lindice de val dans tab entre les indices deb et deb+taille-1 et 1 sinon */

    Algorithme :

    i debtrouv tab[i]=valtant que trouv et i

  • Recherche dichotomiqueNe sapplique qu des tableaux tris dont on connat le sens de triPrincipe : rduire lintervalle de rechercheChoisir un lment dans le tableau : t[i]

    Si la valeur recherche est > t[i], on continue la recherche dans la partie des lments t[i]

    Sinon, si la valeur recherche est < t[i], on continue dans la partie des lments t[i]

    Enfin, lorsque la valeur est gale t[i], on a trouv !!lments t[i]t[i]lments t[i]lments t[i]t[i]lments t[i]

  • Recherche dichotomiqueArrt de la recherche :Lorsque lon trouve llment recherchLorsque lon arrive sur un intervalle de recherche vide (mmes indices de dbut et de fin de lintervalle)En gnral, on choisit llment du milieu pour la sparationExemple : recherche de 15

    57812151523293435365155608990

    57812151523293435365155608990

    57812151523293435365155608990

  • ExempleRecherche de 52 :

    57812151523293435365155608990

    57812151523293435365155608990

    57812151523293435365155608990

    57812151523293435365155608990

  • criture rcursiveIde de lalgorithme :Vrifier si lon est sur la case recherche ou que lon a termin la rechercheSi ce nest pas le cas, regarder de quel ct peut se trouver la valeur Recommencer la recherche sur le nouvel intervalle correspondantSi on a termin, on renvoie lindice si cest la bonne case ou 1 sinon

    fonction rechDicho( in tab : entier tableau, in deb : entier, in fin : entier, in val : entier ) : ret entier/* renvoie lindice de val dans tab entre deb et fin si elle y est et 1 sinon */

    Lexique local des variables :

    milieu(entier)Milieu de lintervalle de rechercheINTERMDIAIRE

  • Algorithme rcursifAlgorithme de rechDicho :

    milieu (deb+fin)/2si tab[milieu] val et deb

  • criture itrativeIde de lalgorithme :Vrifier si lon est sur la case recherche ou que lon a termin la rechercheSi ce nest pas le cas, regarder de quel ct peut se trouver la valeur Recommencer la recherche sur le nouvel intervalle correspondantSi on a termin, on renvoie lindice si cest la bonne case ou 1 sinon

    fonction rechDicho2( in tab : entier tableau, in deb : entier, in fin : entier, in val : entier ) : ret entier/* renvoie lindice de val dans tab entre deb et fin si elle y est et 1 sinon */

    Lexique local des variables :

    milieu(entier)Milieu de lintervalle de rechercheINTERMDIAIRE min(entier)Dbut de lespace de rechercheINTERMDIAIREmax(entier)Fin de lespace de rechercheINTERMDIAIRE

  • Algorithme itratifAlgorithme de rechDicho2 :

    milieu (deb+fin)/2min debmax fintant que tab[milieu] val et deb

  • Tableaux 2 dimensionsReprsentation de matrices, tables, imagesUn tableau contient des lments de mme type :Le type peut tre quelconque et donc aussi un tableauun tableau 2 dimensions un tableau de tableauxExemple : table (entier tableau[7] tableau[4])dfinit table comme un tableau de 4 cases contenant chacune un tableau de 7 entiers

    Reprsentation vectorielle de table : 0 1 2 3

    0 1 2 3 4 5 60 1 2 3 4 5 60 1 2 3 4 5 60 1 2 3 4 5 6

  • Reprsentation matricielleDclaration :

    Reprsentation matricielle de table :

    Accs un lment : NomDuTableau[ indice 1re dimension , indice 2me dimension ] entre 0 et tailleDim1-1 entre 0 et tailleDim2-1table[1,3]2me ligne4me colonne

    table(entier tableau[4,7])Tableau de 4 lignes et 7 colonnes

    01234560123

  • Exemple (1/4)On veut stocker et manipuler les notes des tudiants.Utilisation dun tableau 2D contenant :Un tudiant par ligneUne matire par colonneDimensions NBE x NBM fixes : NBE et NBM dfinies en constantesTableau tNotes[NBE,NBM]

    Matire 1 0Matire nbM NBM-1tudiant 1 0tudiant nbE NBE-1

  • Exemple (2/4)On utilise deux tableaux de chanes de caractres pour les noms des matires et les noms dtudiants

    Fonctions de remplissage des tableaux :fonction lireListe(out tab : chane tableau, in nbElem : entier) : vide/* lit nbElem chanes et les place dans tab */

    fonction lireNotes(out tNotes : rel tableau tableau, in tEtu : chane tableau, in tMat : chane tableau, in nbE : entier, in nbM : entier ) : vide/* lit nbE x nbM notes et les place dans tNotes */

    tEtu(chane tableau[NBE])Liste des tudiants tMat(chane tableau[NBM])Liste des matires

  • Fonction lireListefonction lireListe(out tab : chane tableau, in nbElem : entier) : vide/* lit nbElem chanes et les place dans tab */

    Lexique local des variables :

    Algorithme de lireListe :

    Cette fonction est utilisable pour la lecture des noms des tudiants et la lecture des noms des matires

    i(entier)Compteur de la boucle de lectureINTERMDIAIRE

    pour i de 0 nbElem-1 tab[i] lirefpour

  • Fonction lireNotesfonction lireNotes(out tNotes : rel tableau tableau, , in nbM : entier) : vide/* lit nbE x nbM notes et les place dans tNotes */

    Lexique local des variables :

    Algorithme de lireNotes :

    iEtu(entier)Indice de ltudiantINTERMDIAIREiMat(entier)Indice de la matireINTERMDIAIRE

    pour iEtu de 0 nbE-1 pour iMat de 0 nbM-1 rpter crire Entrez la note de,tEtu[iEtu], en ,tMat[iMat] tNotes[iEtu,iMat] lire tant que tNotes[iEtu,iMat]20 fpourfpour

  • Calcul des moyennesRsultat :Afficher les moyennes par tudiant et les moyennes par matireLexique des constantes :

    Lexique des variables :

    NBE(entier)=110Nombre dtudiantsNBM(entier)=15Nombre de matires

    iEtu(entier)Indice de ltudiant courantINTERMDIAIREiMat(entier)Indice de la matire couranteINTERMDIAIREtotEtu(rel)Somme des notes par tudiantINTERMDIAIREtotMat(rel)Somme des notes par matireINTERMDIAIREtMat(chane tableau[NBM])Liste des noms des matiresDONNE/RSULTATtEtu(chane tableau[NBE])Liste des noms des tudiantsDONNE/RSULTATtNotes(rel tableau[NBE,NBM])Notes des tudiants DONNE

  • Calcul des moyennesAlgorithme :

    lireListe(tMat,NBM)lireListe(tEtu,NBE)lireNotes(tNotes,tEtu,tMat,NBE,NBM)

    pour iEtu de 0 NBE-1 totEtu 0 pour iMat de 0 NBM-1 totEtu totEtu + tNotes[iEtu,iMat] fpour crire tEtu[iEtu],totEtu/NBMfpour

    pour iMat de 0 NBM-1 totMat 0 pour iEtu de 0 NBE-1 totMat totMat + tNotes[iEtu,iMat] fpour crire tMat[iMat],totMat/NBEfpour

  • Un jeu de morpionOn veut crire un algorithme qui gre une partie de morpion entre deux joueurs sur une grille de dimensions donnes :Le but du jeu est daligner un certain nombre de pions identiques (ligne, colonne, diagonale)Chaque joueur dispose dun pion (motif) diffrentLes joueurs jouent tour de rleLe jeu sarrte quand :Un joueur align 4 de ses pionsLa grille est pleine (possibilit de match nul)

    Modlisation :Grille : tableau 2D de caractresPions : caractres

  • Ide / RsultatIde de lalgorithme :Initialiser la grille du jeu (vide)Rpter les tours de jeu jusqu la fin de la partie :Spcifier le joueur actif et le joueur en attenteAfficher la grille du jeuEffectuer un tour de jeu avec le joueur actifRegarder si le joueur actif a gagn ou si la grille est pleine

    Rsultat :Affichage de la grille chaque tour et affichage du rsultat de la partie la fin

  • LexiquesLexique des constantes :

    Lexique des fonctions :fonction initGrille(out grille : car tableau tableau, in nbL : entier, in nbC : entier, in cvide : car):vide/* initialise la grille de nbL lignes et nbC colonnes avec cvide */fonction afficherGrille(in grille: car tableau tableau, in nbL:entier, in nbC: entier):vide/* affiche la grille du jeu */

    HAUT(entier)=7Hauteur de la grilleLARG(entier)=10Largeur de la grilleNBA(entier)=4Nombre de pions aligner conscutivement pour le gainVIDE(caractre)=' 'Reprsente une case vide dans la grille

  • LexiquesLexique des fonctions (suite) :fonction tour(in-out grille : car tableau tableau, in joueur : car, in nbL : entier, in nbC : entier, in cvide : car) : vide/* effectue un tour de jeu du joueur sur la grille */fonction changerJoueur(in-out jActif:car, in-out jAttente:car):vide/* change les rles entre joueur actif jActif et joueur en attente jAttente */fonction vainqueur(in grille : car tableau tableau, in joueur : car, in nbL : entier, in nbC : entier, in nbA : entier) : ret boolen/* retourne VRAI si la grille contient nbA pions joueur aligns, FAUX sinon */

  • Lexiquesfonction grillePleine(in grille : car tableau tableau, in nbL:entier, in nbC : entier, in cvide : car) : ret boolen/* retourne VRAI si la grille ne contient plus de case vide */

    Lexique des variables :

    jActif(caractre)Motif du joueur actifRSULTATjAttente(caractre)Motif du joueur en attenteRSULTATgrille(caractre tableau[HAUT,LARG])Grille du jeuRSULTATgagn(boolen)Devient Vrai lorsque un joueur a gagnINTERMDIAIRE

  • Algorithme principal

    initGrille(grille,HAUT,LARG,VIDE)jActif OjAttente Xrpter changerJoueur(jActif, jAttente) afficherGrille(grille,HAUT,LARG) tour(grille, jActif, HAUT, LARG,VIDE) gagn vainqueur(grille, jActif, HAUT, LARG, NBA)tant que gagn et grillePleine(grille, HAUT, LARG, VIDE)si gagn alors crire Le joueur avec les pions , jActif, a gagnsinon crire Match nul !fsi

  • Fonction initGrillefonction initGrille(out grille : car tableau tableau, in nbL : entier, in nbC : entier, in cvide : car ):videLexique local des variables :

    Algorithme de initGrille :

    ligne(entier)indice de ligneINTERMDIAIREcolonne(entier)indice de colonneINTERMDIAIRE

    pour ligne de 0 nbL-1 pour colonne de 0 nbC-1 grille[ligne,colonne] cvide fpourfpour

  • Fonction afficherGrillefonction afficherGrille(in grille: car tableau tableau, in nbL: entier, in nbC: entier):videLexique local des variables :

    Algorithme de afficherGrille :

    ligne(entier)indice de ligneINTERMDIAIREcolonne(entier)indice de colonneINTERMDIAIRE

    pour ligne de 0 nbL-1 pour colonne de 0 nbC-1 crire grille[ligne,colonne]," " fpour crire "\n"fpour

  • Fonction changerJoueurfonction changerJoueur(in-out jActif : car, in-out jAttente : car) : vide

    Lexique local des variables :

    Algorithme de changerJoueur :

    inter(caractre)variable d'changeINTERMDIAIRE

    inter jActifjActif jAttentejAttente inter

  • Fonction grillePleinefonction grillePleine(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in cvide : car) : ret boolenLexique local des variables :

    Algorithme de grillePleine :

    ligne 0res vraitant que ligne

  • Fonction tourfonction tour(in-out grille : car tableau tableau, in joueur : car, in nbL : entier, in nbC : entier, in cvide : car) : videLexique local des variables :

    Algorithme de tour :

    lig(entier)Numro de ligne o le joueur place son pionDONNEcol(entier)Numro de colonne o le joueur place son pionDONNE

    rpter rpter lig lire tant que lignbL rpter col lire tant que colnbC ...tant que grille[lig-1,col-1] cvidegrille[lig-1,col-1] joueur

  • Fonction vainqueurfonction vainqueur(in grille : car tableau tableau, in joueur : car, in nbL : entier, in nbC : entier, in nbA : entier) : ret boolen

    Lexique local des fonctions :fonction testL(in grille : car tableau tableau, in numL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolen/* renvoie Vrai si la ligne numL contient nbA motifs joueur conscutifs */fonction testC(in grille : car tableau tableau, in nbL : entier, in numC : entier, in joueur : car, in nbA : entier) : ret boolen/* renvoie Vrai si la colonne numC contient nbA motifs joueur conscutifs */fonction testDiag(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolen/* renvoie Vrai si au moins une des deux diagonales contient nbA motifs joueur conscutifs */

  • Fonction vainqueurLexique local des variables :

    Algorithme de vainqueur :

    ind(entier)Indice de ligne et de colonneINTERMDIAIREgagn(boolen)Vrai si on a nbA motifs joueur en ligne ou colonneRSULTAT

    gagn Fauxind 0tant que gagn et ind

  • Fonction testLfonction testL(in grille : car tableau tableau, in numL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolenProblme : y-a-t-il une squence de nbA lments dans la ligne ?

    Principe : On utilise un compteur relatif au motifOn parcourt la ligneLorsque la case contient le motif, on incrmente le compteurLorsque la case ne contient pas le motif, on remet le compteur zro Compte le nombre de motifs conscutifs Si ce nombre atteint le seuil voulu, on a gagn !Lexique local des variables :

    ind(entier)Indice de colonneINTERMDIAIREnbMotifs(entier)Nombre de motifs joueur conscutifsINTERMDIAIRE

  • Fonction testLAlgorithme de testL :

    ind 0nbMotifs 0tant que ind

  • Fonction testCfonction testC(in grille : car tableau tableau, in nbL : entier, in numC : entier, in joueur : car, in nbA : entier) : ret boolen

    Mme principe que testL mais en parcourant une colonne

    Lexique local des variables :

    ind(entier)Indice de ligneINTERMDIAIREnbMotifs(entier)Nombre de motifs joueur conscutifsINTERMDIAIRE

  • Fonction testCAlgorithme de testC :

    ind 0nbMotifs 0tant que ind

  • Fonction testDiagfonction testDiag(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolen

    Lexique local des fonctions :fonction diagHB(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolen/* teste les diagonales dans le sens haut-gauche bas-droit */

    fonction diagBH(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolen/* teste les diagonales dans le sens bas-gauche haut-droit */

  • Fonction testDiagAlgorithme de testDiag :

    si diagHB(grille,nbL,nbC,joueur,nbA) alors retour_de_testDiag Vraisinon retour_de_testDiag diagBH(grille,nbL,nbC,joueur,nbA)fsi

  • Fonction diagHBfonction diagHB(in grille : car tableau tableau, in nbL : entier, in nbC : entier, in joueur : car, in nbA : entier) : ret boolenLexique local des variables :

    2 fois 2 boucles imbriques

    lig(entier)Indice de ligneINTERMDIAIREcol(entier)Indice de colonneINTERMDIAIREnbMotifs(entier)Nombre de motifs joueur conscutifsINTERMDIAIRE

  • Fonction diagHBAlgorithme : (1re boucle imbrique, partie suprieure)

    col 0tant que colnbC-nbA et nbMotifs

  • Fonction diagHBAlgorithme : (2me boucle imbrique, partie infrieure)

    lig 1 /* ligne 0 traite dans la 1re boucle imbrique */tant que lignbL-nbA et nbMotifs

  • Fonction diagHBAlgorithme : (version complte)

    nbMotifs 0 /* initialisation */1re boucle imbriquesi nbMotifs

  • Fonction diagBH

    vos crayons !!

  • Projets et Partiels1 projet ralis ensemble en TD :Mise en oeuvre de la dcomposition hirarchique2 projets raliss individuellement :Dossier de conception algorithmiqueSources du programme en C + MakefileAUCUN retard ne sera acceptPartiels :Tout ce que l'on a vu en cours et TDLes notes de cours et de TD sont autorisesPlusieurs exercices de difficult croissante2 parties notes sparment : Algorithmique : environ 85% du temps du partiellangage C : environ 15% : question de cours et traduction d'algo

  • Tri sur les vecteursLa notion dordre nest pas implicite dans un tableauIl est souvent ncessaire davoir des valeurs triesRecherche dichotomiqueNous allons voir les tris en ordre croissant suivants :Tri par insertionTri par slection-permutationTri bullesDouble tri bullesOn peut facilement dduire les versions dcroissantesCes tris simples sont peu efficaces sur de grands vecteursOn utilise alors les tris :FusionRapide (quick sort)

  • Tri par insertionUtilis pour trier les cartes que lon a en mainPrincipe : On prend un lment et on recherche sa place dans la partie dj trie puis on linsre cet endroit, et ainsi de suiteApplication aux tableaux :Deux parties dans le tableau :

    On procde itrativement en prenant chaque fois un lment de la partie non trie et en linsrant la bonne place dans la partie trie La proportion de partie trie/partie non trie va donc voluer chaque fois, on prend le 1er lment de la partie non trie comme lment insrer dans la partie dj trie

  • tapes dinsertion dun lmentLinsertion de llment courant se fait en 4 tapes :Trouver le point dinsertion dans la partie trie

    Recopier llment courant

    Dcaler dune case vers la droite les lments dj tris qui sont aprs le point dinsertion

    Placer llment courant lemplacement ainsi librXPartie non trie XXXPartie non trie XX> XPartie non trie XX> XX> X X> XPartie non trie

  • RemarquesOn voit que la nouvelle partie grise est toujours trie

    Au dpart, on a logiquement :Partie trie : videPartie non trie : tout le tableauMais on peut gagner une tape en prenant :Partie trie : 1er lment du tableauPartie non trie : le reste du tableauOn termine quand la partie non trie devient vide : quand le dernier lment du tableau a t insr dans la partie triePartie non trie X> XX

  • Algorithmefonction triInsert(in-out vect : entier tableau, in taille : entier ) : vide/* trie le tableau vect de taille lments par insertion */

    Lexique local des variables :

    valeur(entier)Valeur insrer dans la partie trieINTERMDIAIRElimite(entier)Indice du 1er lment de la partie non trieINTERMDIAIREplace(entier)Indice dinsertion de la valeur dans la partie trieINTERMDIAIREtrouve(boolen)Vrai lorsque la place dinsertion est trouveINTERMDIAIRE

  • Algorithme

    pour limite de 1 taille-1 /*on commence 1 car 1re case dj trie */ valeur vect[limite] place limite /*on parcourt la partie trie depuis sa fin */ trouve vect[place-1] valeur /*on a trouv qd on arrive sur un lt */ tant que trouve vect[place] vect[place-1] /*on dcale vect[place-1] dune case droite car elle est > la valeur placer */ place place 1 /*on passe la case prcdente dans la partie trie */ si place>0 alors /*si on nest pas au dbut du tableau : */ trouve vect[place-1] valeur /*on continue la recherche */ sinon trouve Vrai /*on arrte la recherche (dernire place possible) */ fsi ftant vect[place] valeur /*on place la valeur lemplacement trouv */fpour

  • Tri par slection-permutationOn aimerait ne plus avoir modifier la partie dj trie (dplacements des lments trop coteux)On distingue toujours les deux parties des lments mais cette fois :

    Ajout dun nouvel lment la fin de la partie trieIl doit tre aux lments de la partie non triePrincipe :On cherche le plus petit lment dans la partie non trie (slection) et on le place au dbut de cette partie (permutation)Nouvelle zone trie = ancienne zone trie plus cet lmentNouvelle zone non trie = ancienne zone non trie moins cet lmentPartie non trie ( lts lts tris )Partie trie ( lts lts non tris )

  • tapes de slection-permutationLa slection-permutation dun lment se fait en 2 tapes :Trouver le minimum dans la partie non trie

    Permuter avec le premier lment de la partie non triePartie non trie Partie trie YPartie non trie Partie trie XPartie trie Partie non trie XminXY

  • RemarquesOn voit que la nouvelle partie grise est toujours trie

    Au dpart, on a logiquement :Partie trie : videPartie non trie : tout le tableauCette fois, on gagne une tape la fin (dernier lment)On termine quand la partie non trie ne contient plus quun seul lment : il sincorpore directement dans la partie triePartie non triePartie trie XPartie trie X

  • Algorithmefonction triSlect(in-out vect : entier tableau, in taille : entier ) : vide/* trie le tableau vect de taille lments par slection-permutation */

    Lexique local des variables :

    iMin(entier)Indice du minimum de la partie non trieINTERMDIAIREmin(entier)Valeur du minimum de la partie non trieINTERMDIAIRElimite(entier)Indice de la 1re case de la partie non trieINTERMDIAIREind(entier)Indice de parcours du tableau pour trouver le minINTERMDIAIRE

  • Algorithme

    pour limite de 0 taille-2 /*on finit lavant dernire case */ iMin limite /*au dpart, le min est initialis avec la 1re case de la partie non trie */ pour ind de limite+1 taille-1 /*on recherche le min parmi toutes les valeurs suivantes jusqu la fin */ si vect[ind]

  • Tri bullesOn aimerait viter le calcul des min (recherches coteuses)On distingue toujours la partie trie () et la partie non trie :

    On fait descendre les lments les plus petits par parcours successifs

    Principe :Parcours droite-gauche de la partie non trie avec comparaison deux deux des lments conscutifs et remise en ordre ventuelleNouvelle zone trie = ancienne zones trie plus lment min de la zone non triePartie non triePartie trie ( non tris )petite valeur se dplace gauchePartie trie ( non tris )X

  • Droulement d'un parcours525712108161495257121081691452571210891614525712108916145257128109161452578121091614 On commence la fin du tableau On compare les lts deux deux On les change s'ils ne sont pas dans l'ordre On recommence en se dcalant d'une case gauche jusqu'au dbut de la partie non trie la fin du parcours, le min de la partie non trie est au dbut de celle-ci On recommence avec nouvelle zone non trie Arrt quand zone non trie contient un seul lment ou est vide Remarque : le min n'est pas la seule valeur dplace 9 a aussi t dplac vers la gauche

  • Algorithmefonction triBulles(in-out vect : entier tableau, in taille : entier ) : vide/* trie le tableau vect de taille lments par insertion */

    Lexique local des variables :

    tmp(entier)variable pour l'change des valeursINTERMDIAIRElimite(entier)Indice de la 1re case de la partie non trieINTERMDIAIREind(entier)Indice de parcours du tableau pour trouver le minINTERMDIAIRE

  • Algorithme

    pour limite de 0 taille-2 /*on finit lavant dernire case */ pour ind de taille-1 limite+1 en descendant /*on parcourt la zone non trie de droite gauche : on s'arrte limite+1 car on compare avec l'lment prcdent */ si vect[ind]

  • RemarquesVariante du tri par slection-permutation o la recherche du min est remplace par les dplacements des petites valeursPeut avoir un cot suprieur cause des changes (ordre inverse)Si au kme parcours, la fin du tableau est dj trie, on effectue quand mme les taille-1-k parcours restants Pas efficace !On s'arrte ds qu'il n'y a plus d'change de valeursOn commence un nouveau parcours seulement si il y a eu au moins un change dans le parcours prcdent Utilisation d'un boolen pour la dtection d'change La boucle principale devient conditionnelle

  • Algorithmefonction triBulles(in-out vect : entier tableau, in taille : entier ) : vide/* trie le tableau vect de taille lments par insertion */

    Lexique local des variables :

    tmp(entier)variable pour l'change des valeursINTERMDIAIRElimite(entier)Indice de la 1re case de la partie non trieINTERMDIAIREind(entier)Indice de parcours du tableau pour trouver le minINTERMDIAIREechange(boolen)Vrai si au moins un change lors d'un parcoursINTERMDIAIRE

  • Algorithme

    limite 0 /*initialisation de la boucle tant que */echange Vrai /*on le place Vrai pour entrer dans la boucle */tant que limite taille-2 et echange /*on continue si la partie non trie n'est pas vide ET s'il y a eu change au parcours prcdent */ echange Faux /*au dbut du parcours, il n'y a pas encore eu d'change */ pour ind de taille-1 limite+1 en descendant si vect[ind]

  • Double tri bullesOn aimerait ne plus traiter un seul lment la fois (recherches des min trop coteuses)On distingue trois parties cette fois :

    On fait descendre/monter les lments les plus petits/grands par parcours successifs de la partie non trie

    Principe :Parcours de la partie non trie avec comparaison deux deux des lments conscutifs et remise en ordre ventuelleNouvelles zones tries = anciennes zones tries plus lments min/max de la zone non triePartie non triePartie trie ( non tris )Partie trie ( non tris )petite valeur se dplace gauchegrande valeur se dplace droitePartie trie ( non tris )Partie trie ( non tris )XY

  • Exemple dexcution41635827

  • Le type structureLes tableaux permettent de runir plusieurs donnes de mme type dans une seule entitLa structure permet de runir des donnes de types quelconques dans une mme entit logiqueLes lments de la structure (appels champs) sont senss avoir un lien logique entre eux :ils reprsentent les diffrentes caractristiques qui dfinissent lentitExemple : reprsentation dun tudiantNumro dtudiant(entier)Nom(chane de caractres)Prnom(chane de caractres)Age(entier)

  • Dclaration dune variable structureExemple : criture de la structure tudiantStructurenum: (entier)nom : (chane de caractres)prnom: (chane de caractres)age: (entier)Ainsi, la dclaration dune variable tudiant peut se faire par :lexique des variables :

    NOMTYPEDESCRIPTIONRLEtudiant StructurenumEtu : (entier)nom : (chane de caractres)prnom : (chane de caractres)age: (entier)Les donnes dun tudiant

  • Dfinition dun type structurePour allger lcriture des dfinitions de variables, on peut aussi dfinir une nouveau type dans le lexique des types qui se place avant les autres lexiquesLa dclaration dun nouveau type se fait simplement par :NomDuType = dfinition du typeLes noms de types commencent par une majusculeAinsi, la dclaration du type Etudiant se fait par :Lexique des types :Etudiant = structure num: (entier)nom : (chane de caractres)prnom: (chane de caractres)age: (entier)

  • Type structure et accsLa dclaration de la variable tudiant peut alors se faire par :Lexique des variables :

    Accs un champ :nomDeVariable.nomDuChampExemple :tudiant.nom lireAffectation de structure : tudiant1 et tudiant2 sont 2 variables de type Etudiant, linstructiontudiant1 tudiant2Recopie les valeurs de tous les champs de la variable tudiant2 danstudiant1 : mme effet que pour les types simples (entier, rel, )

    tudiant(Etudiant)Les donnes dun tudiant

  • Structures et fonctionsUne structure peut tre passe en paramtre dune fonction et aussi tre renvoye en rsultatExemples :

    fonction lireEtu(out tu : Etudiant) : ret boolen/* lit les donnes dun tudiant dans la structure tu et retourne Vrai si la lecture est correcte (pas de fin de saisie) */

    Date = structure jour: (entier)mois : (entier)anne: (entier)

    fonction demain(in aujourdhui : Date) : ret Date/* retourne une structure Date contenant la date du lendemain */

  • Exemple completLexique des types :Date = structureEtudiant = structurejour : (entier) num : (entier)mois : (entier)nom : (chane)anne : (entier)prnom : (chane)dateNais : (Date)Lexique des constantes :

    Lexique des fonctions :fonction lireEtu( out tu : Etudiant ) : ret boolen/* lit les donnes dun tudiant et retourne Vrai si lecture ok */

    NB_ETU(entier)=120Nombre dtudiant(e)s dans la promo

  • Exemple (suite)Lexique des variables :

    Algorithme :

    tabEtu(Etudiant tableau[NB_ETU])Tableau des tudiantsINTERi(entier)Indice de parcours du tableauINTERunEtu(Etudiant)tudiant(e) lu(e)DONNE

    i 0tant que i

  • Exemple (suite)Dfinition de la fonction lireEtu :Lexique local des variables :

    Algorithme de lireEtu :

    rs Fauxtu.num liresi tu.num EOF alors tu.nom lire si // imbrication des lectures, rs mise Vrai si la dernire est Ok ! fsifsiretour_de_lireEtu rs

    rs(boolen)Vrai si la lecture des donnes est valideRSULTAT

  • Liens avec le modle objetApproche du cours :Imprative hirarchique : dcompositions successives des tapesConception base sur les actions effectuerApproche objet :Entits qui interagissent entre elles : Modlisation des informations dans les entits (donnes)Modlisation des actions possibles de chaque entit (mthodes)Conception base sur les donnes intervenant dans le problmeLes objets sont quivalents des structures dont les accs sont contrls (parties prive et publique)Assure la cohrence des informations lintrieur des objetsLes mthodes sont conues avec lapproche imprative hirarchiqueDiffrence principalement mthodologique !

  • Les numrationsUne numration permet de modliser des ensembles finis de valeurs abstraitesLes valeurs de lensemble ont gnralement un lien smantique entre ellesPar exemple, une variable couleur peut tre dfinie par :

    Cette dfinition spcifie une liste particulire de valeurs possibles pour la variable couleurLa valeur de couleur ne pourra donc tre que rouge, vert, bleu ou jaune et rien dautre

    couleur(num {rouge,vert,bleu,jaune})Une couleur

  • PropritsLes noms des lments dune numration ne sont pas des chanes de caractres mais des noms internes lalgorithmela lecture et laffichage des numrations ne sont pas possibles directementIl faut donc faire la conversion manuellementExemple :

    On ne peut lire directement les valeurs lun,mar, et il faut donc passer par une variable intermdiaire ayant un type supportant les lectures/affichages

    jour(num {lun,mar,mer,jeu,ven,sam,dim})Un jour de la semaine

  • Exemple de lectureLexique des variables :

    Algorithme :

    val(entier)Valeur lueDONNEjour(num {lun,mar,mer,jeu,ven,sam,dim})Jour de la semaineINTER

    crire Entrez le numro dun jour de la semaine entre 1 et 7 : val lireselon que val est 1 : jour lun 2 : jour mar 3 : jour mer fselon

  • Exemple daffichageLexique des variables :

    Algorithme :

    jour(num {lun,mar,mer,jeu,ven,sam,dim})Jour de la semaineINTER

    selon que jour est lun : crire lundi mar : crire mardi mer : crire mercredi fselon

  • Notion dordreUne notion dordre existe dans les numrationsIl est donc possible de comparer deux valeurs dune mme numration (,) selon leur rang dans lensembleComme pour les caractres, il est possible dajouter ou soustraire un entier une valeur numre pour passer dun lment un lment de rang diffrent dans lensembleOn ne peut sortir de lensemble enumr !Exemples :jour jour + 1 // passe llment suivant de la liste sauf si jour=dimjour jour - 1 // passe llment prcdent de la liste sauf si jour=lun!

  • Calculs sur numrationsLexique des types :Jour = num {lun,mar,mer,jeu,ven,sam,dim}Lexique des variables :

    Algorithme :

    jour(Jour)Jour de la semaineINTER

    // calcul du lendemainsi jour = dim alors jour lunsinon jour jour + 1fsi

  • Autre version de la lectureLexique des variables :

    Algorithme :

    val(entier)Valeur lueDONNEjour(Jour)Jour de la semaineINTER

    crire Entrez le numro dun jour de la semaine entre 1 et 7 : val lirejour lun + val 1 // dplacement depuis lundi du n de jour moins un

  • Les pointeursUne variable est dfinie par :Un nomUn typeUn emplacement mmoire rserv une adresse prciseUn pointeur sur un type T est une variable qui contient ladresse mmoire dune variable de type TMmoirePointeur pVariable x

  • Oprateurs lmentairesAccs la valeur pointe : p est loprateur dindirection ou de drfrencement le pointeur doit contenir une adresse valide Ladresse dune variable est rcupre par : @x @ est loprateur dadressage

    @xMmoirePointeur p p!Variable x

  • Oprations sur les pointeursInitialisation dun pointeur : p NilIndique que le pointeur pointe sur rienAvant toute utilisation, il faut vrifier la valeur du pointeurDs quun pointeur nest plus utilis, il faut le remettre NilAffectation : p @xPlace ladresse de x dans pMmoirePointeur pVariable x

  • Oprations sur les pointeursCopie dun pointeur : q pLes deux pointeurs p et q pointent sur le mme emplacement mmoire

    Copie dune valeur pointe : q pLes valeurs pointes sont identiques mais les pointeurs restent diffrentsMmoirePointeur pVariable x [email protected] qMmoirePointeur pVariable [email protected] [email protected] y1510

  • Allocation dynamiqueRserver un emplacement mmoire dynamiquement :Crer un tableau de taille donne pendant lexcution de lalgorithme Requiert le nombre et le type des lments que lon veut stockerFonction dallocation : fonction alloue(in nb : entier, in typeElem : Type) : ret pointeur sur typeElemRetourne Nil si lallocation nest pas possibleExemple : p alloue(10,entier) // alloue un tableau de 10 entiersMmoirePointeur p

  • DsallocationLorsque un emplacement dynamique nest plus utile, il faut le dsallouer de faon conomiser la mmoireFonction de dsallocation : fonction libre(in ptr : pointeur) : videAprs la libration mmoire, il est conseill de rinitialis le pointeur NilExemple : libre(p) // libre lemplacement mmoire pointe par p mais ne modifie pas p p Nil // permet de dtecter que p ne pointe plus sur un emplacement valideMmoirePointeur [email protected]

  • ExempleLexique des variables :

    Algorithme :

    tab(pointeur sur entier)Liste dentiersINTERind(entier)Indice du tableauINTERnb(entier)Nombre dentiers dans le tableauDONNE

    nb liresi nb > 0 alors tab alloue(nb,entier) si tab Nil alors tab[ind] // utilisation de tab comme un tableau classique nb lments libre(tab) // libration du tableau dynamique aprs son utilisation tab Nil // rinitialisation du pointeur pour la suite de lalgo fsifsi

  • Les listes chanesListes dlments (maillons) dont le nombre volue dynamiquement pendant lexcution de lalgorithme :Les maillons sont de mme typeChaque maillon est reli au suivant par un pointeurLe dbut de la liste est repr par un pointeur sur le 1er maillonLa fin de la chane est repre par la valeur Nil du pointeur sur le suivant dans le dernier maillonMmoirePointeur [email protected]@[email protected]@[email protected]

  • Oprations sur les listes chanesMise en place :Dfinition du maillon (crer un type)Dclaration dun pointeur sur le dbut de la liste et dun pointeur de parcoursConstruction de la liste :Cration dun maillon (allocation dynamique)Insertion dun maillon dans la liste (au dbut, dans la liste, la fin)Utilisation :Parcours de la listeModification :Insertion dun maillon dans la liste (idem ci-dessus)Suppression dun maillon dans la liste (au dbut, dans la liste, la fin)Dsallocation :Comme tout lment cr dynamiquement, il faut dsallouer la liste :Supprimer tous les lments de la liste

  • Dfinition dun maillonOn cre un type (LT) correspondant un maillon de la listeLe maillon doit contenir les donnes stocker ainsi quau moins un pointeur de chanage sur un maillon de mme typeIl faut utiliser une structureIl y a deux organisations possibles lintrieur du maillon :

    Tous les lments au mme niveauDonnes spares des liaisons entre maillonsMaillonPoint =structurePoint =structurelig : (entier)lig : (entier)col : (entier)col : (entier)coul : (entier)coul : (entier)svt : (pointeur surMaillonPoint =structure MaillonPoint)pt : (Point)svt : (pointeur sur MaillonPoint)

  • Dclaration et initialisationIl faut dclarer un pointeur sur le dbut de la liste et au moins un pointeur supplmentaire pour les manipulations :

    Au dbut de lalgorithme, la liste est vide et aucun maillon nest encore allouLa valeur Nil permet de savoir si la liste est vide ou nonAinsi, il faut initialiser les pointeurs Nil :dbut Nil // la liste est videcourant Nil // courant ne pointe sur rien

    dbut(pointeur sur MaillonPoint)Pointe sur le dbut de la listeINTERcourant(pointeur sur MaillonPoint)Pointe sur un lment INTER

  • Construction de la listePour construire la liste, il faut crer des maillons en utilisant lallocation dynamique dun seul lment la fois :courant alloue(1,MaillonPoint)Mais le maillon point par courant nest ni initialis ni chanLinitialisation des donnes se fait comme pour des variables classiques :courant.col // affectation de la colonne du point courantLe chanage consiste insrer le nouveau maillon dans la liste en dfinissant :Les liens sortant du maillon (un seul dans le cas le plus simple)Les lments qui pointent sur ce maillon (un seul en gnral)On modifie toujours le maillon insrer avant la liste

  • Insertion dun lmentAu dbut de la liste :courant.svt dbut // le 1er maillon devient le suivant du futur 1erdbut courant // le maillon courant devient le 1er maillonMmoirePointeur [email protected]@[email protected]@[email protected]?Pointeur [email protected]

  • Insertion dun lmentDans la liste : entre un maillon et son suivantcourant.svt lm.svt // la liste nest pas encore modifielm.svt courant // le maillon est insr la suite de lmMmoirePointeur [email protected]@[email protected]@donnes?Pointeur [email protected]@Pointeur [email protected]

  • Insertion dun lment la fin de la liste : idem mais entre le dernier maillon et riencourant.svt fin.svt // revient affecter courant.svt Nil si la liste a t bien construitefin.svt courant// le maillon courant devient le dernier lmentfin courant // ncessaire seulement pour conserver un pointeur sur le dernier maillonMmoirePointeur [email protected]@[email protected]@donnes?Pointeur [email protected]@Pointeur [email protected]

  • Parcours de la listeUtilisation dun pointeur de parcours :courant dbut // initialisation sur le dbut de la liste (si liste vide alors courant = Nil)tant que courant Nil // on continue tant que lon pointe sur un maillon de la liste courant // traitement du maillon courantcourant courant.svt // passage au maillon suivantftantMmoirePointeur [email protected]@[email protected]@[email protected]@Pointeur courant

  • Suppression dun lmentAu dbut de la liste :courant dbut // on rcupre le 1er maillondbut dbut.svt // la liste commence au second maillon (lancien 1er nest plus dedans)libre(courant) // on dsalloue lancien 1er mailloncourant Nil // on rinitialise le pointeur courant pour viter les accs non [email protected]@[email protected]@Pointeur [email protected] [email protected]

  • Suppression dun lmentDans la liste : il faut un pointeur sur le maillon prcdentelem courant.svtcourant.svt Nilsi elem Nil alorsfsicourant.svt elem.svtlibre(elem)[email protected] [email protected] [email protected] [email protected]@[email protected]

  • Suppression dun lment la fin de la liste : idem avec les deux derniers maillonslibre(fin)// on libre le dernier maillonfin courant// lavant-dernier maillon devient le dernierfin.svt Nil// le suivant du dernier maillon est rinitialis pour marquer la fin de la [email protected] [email protected] [email protected]@[email protected]@Pointeur [email protected]

  • Destruction de la listeSuite de suppressions du 1er lment de la liste :courant dbut // initialisation sur le dbut de la liste (si liste vide alors courant = Nil)tant que courant Nil // on continue tant que la liste nest pas videdbut courant.svt // la liste commence au second maillonlibre(courant) // suppression du 1er lmentcourant dbut // on se replace au dbut de la [email protected]@[email protected] [email protected]@Pointeur [email protected]

  • Listes doublement chanesPrsence dun pointeur sur le maillon prcdent :Permet les parcours en sens inverseSimplifie certaines manipulations (suppressions)Plus de liens grer entre les maillonsMmoirePointeur [email protected]

  • Les fichiersPermettent un stockage permanent dinformations :En entre : liste de paramtres et/ou de donnesEn sortie : rsultat(s) dun algorithme stock(s) dans un fichierIntermdiaire : lorsque la mmoire vive nest pas suffisanteComme la mmoire vive, les mmoires de masse permanentes sont constitues dun ensemble fini et homogne de blocs lmentaires dinformation (octets)Un fichier est une zone finie logiquement contigu dune telle mmoireIl est donc gnralement dfini par :Sa position de dpart sur le mdia de stockageSa taille, exprime en blocs lmentaires ou en units logiques

  • ContenuBien quun fichier soit une suite de blocs lmentaires identiques, il peut contenir des informations de types diffrentsSon contenu smantique dpend de la faon dont on interprte la suite des blocs lmentaires, cest--dire de la faon dont on les regroupe smantiquementPar exemple, un fichier de 16 octets peut contenir :16 caractres (1 octet chacun)4 entiers standards (4 octets chacun)2 rels en prcision double (8 octets chacun)Mais aussi :1 entier suivi de 4 caractres suivis dun rel double prcision2 caractres, un entier, un caractre, un rel double, un caractre

  • ClassificationIl existe plusieurs types dorganisation de fichier :Squentiel : (bandes magntiques)Les lments sont stocks les uns la suite des autres dans lordre dcriture et laccs aux lments se fait dans lordre de stockageSquentiel index : (idem avec marqueurs)Idem mais avec une table dindex ordonne faisant une correspondance directe entre un index (cl) et llment correspondant dans le fichierSquentiel accs direct : (disques durs)Organisation squentielle par dfaut mais avec la possibilit de se dplacer directement une position donne dans le fichier pour lire et/ou crireRelatif : (systmes spcifiques)La position des lments dans le fichier dpend dun index particulier (ordonn) et non plus de lordre dcriture (trous possibles dans le fichier)

  • Fichiers squentiels accs directUn fichier squentiel accs direct peut tre vu comme une suite linaire de blocs sur laquelle se dplace une tte de lecture/criture :

    Dclaration :TTte de lecture/critureAvance (sens par dfaut)ReculeMarque de fin de fichierBloc lmentaire de stockageDbut du fichier

    fic(fichier)Un fichierLe rle dpend de lutilisation du fichier

  • Oprations sur les fichiersOuverture : Selon 4 modes : lecture, criture, ajout et modificationAccs aux lments :Lecture ou critureDtection de la fin de fichierFermetureAccs directs :Dplacement un position donnePlacement au dbutPlacement la finRcupration de la position courante

  • OuvertureFonction douverture : fonction ouvrir(in nom : chane de caractres, in mode : caractre) : ret fichiernom contient le nom du fichier dans le systme de stockagemode indique le mode dutilisation du fichier :L : lecture lectures uniquementE : criture critures uniquementA : ajout critures partir de la fin du fichierM: modification lecture/modification des lments existantsExemples :fic ouvrir("liste.txt",L)// ouvre le fichier liste.txt en lecturefic ouvrir("toto",E) // ouvre le fichier toto en criturefic ouvrir("titi",A)// ouvre le fichier titi en ajoutfic ouvrir("tutu",M)// ouvre le fichier tutu en modification

  • Modes douvertureOuverture en lecture :La tte de L/E est place au dbut du fichierAucun lecture nest encore faite !

    Ouverture en criture :La tte de L/E est place au dbut du fichierLa marque de fin de fichier est place au dbutLouverture en criture dun fichier existant vide ce fichier !!!TTOuverture dun fichier videOuverture dun fichier non videTOuverture dun fichier en criture!

  • Modes douverture (suite)Ouverture en ajout :La tte de L/E est place la fin du fichierLe contenu initial du fichier nest pas modifi

    Ouverture en modification :La tte de L/E est place au dbut du fichierIl faut respecter lorganisation smantique du fichier !!TOuverture dun fichier non videTOuverture dun fichier videTOuverture dun fichier non vide!

  • Accs aux lmentsLecture :fonction lire(in fic: fichier, in typeElem : Type) : ret typeElemfic doit tre un fichier ouvert en lecture ou modificationtypeElem indique le type de llment luLa fonction retourne la valeur EOF si la lecture a chou (rencontre de la fin de fichier)Aprs la lecture, la tte de L/E se retrouve juste aprs llment luExemple :val lire(fic,entier)val

  • Accs aux lmentsEcriture :fonction crire(in fic: fichier, in val : typeElem) : ret boolenfic doit tre un fichier ouvert en criture, ajout ou modificationval est llment crire dans le fichierLa fonction retourne Vrai si lcriture a russi et Faux sinonAprs lcriture, la tte de L/E se retrouve juste aprs llment crit Exemple :rs crire(fic,val)123val

  • Fin de fichier et fermetureDtection de la fin de fichier :fonction fdf(in fic: fichier) : ret boolenfic doit tre un fichier ouvertLa fonction retourne Vrai si la tte de L/E se trouve en face de la marque de fin de fichier et Faux sinon

    Fermeture dun fichier :fonction fermer(in fic: fichier) : videfic doit tre un fichier ouvertDlimite la zone dutilisation dun fichier dans lalgorithmeLa fermeture est ncessaire pour changer de mode dutilisationTTfdf(fic)=Fauxfdf(fic)=Vrai

  • Dplacements (1/2)Fonction de dplacement quelconque de la tte de L/E : fonction dpAPos(in fic : fichier, in pos : entier) : ret boolenfic doit tre un fichier ouvertpos est spcifie par rapport au dbut du fichier (position 0)Si la position spcifie nest pas dans le fichier, la tte de L/E est place sur lextrmit correspondante et la fonction retourne Faux, sinon elle retourne VraiExemples :TdpAPos(fic,4)=VraiTTdpAPos(fic,20)=FauxdpAPos(fic,-5)=Faux

  • Dplacements (2/2)Fonction de placement de la tte de L/E au dbut du fichier : fonction dpAuDbut(in fic : fichier) : videfic doit tre un fichier ouvert sinon la fonction na pas deffetEquivalent dpAPos(fic,0)Fonction de placement de la tte de L/E la fin du fichier :fonction dpAFin(in fic : fichier) : videfic doit tre un fichier ouvert sinon la fonction na pas deffetFonction de rcupration de la position courante :fonction donnePos(in fic : fichier) : ret entierfic doit tre un fichier ouvert sinon la fonction retourne -1Retourne la position de la tte de L/E par rapport au dbut du fichier Lorsque plusieurs fichiers sont ouverts simultanment, ces fonctions agissent indpendamment sur chaque fichier comme sil y avait une tte de L/E par fichier

  • Modes dun fichierOn distingue gnralement deux modes de reprsentation des donnes dans un fichier :Le mode binaire : quivalent ce qui a t prsent prcdemmentGnralement beaucoup plus denseLe contenu du fichier nest pas implicitement interprtableProblmes de compatibilit (reprsentation des nombres)Le mode texte : le contenu du fichier est une suite de caractresLe contenu du fichier est implicitement interprtable Utilisable facilement sur tous les types de machines/systmesNcessite une conversion explicite des valeurs en leur quivalent textuel lors des critures dans le fichierNcessite la conversion inverse lors des lectures depuis le fichierTaille plus importante du fichier