2015_10_14_in1gh01-allslides-2012-2013

Upload: maissa-zini

Post on 08-Jul-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    1/425

    Algorithmique et programmation

    ENSTA - TC 1ère année

    François [email protected]

    UIIS - Sûreté

    2012-2013

    Avec certaines planches / idées deMatthieu FiniaszFrançoise LévyMichel Mauny

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    2/425

    Introduction

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 2/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    3/425

    But de ce cours

    Systèmes informatiques omniprésents.▸   ⇒ Nécessité pour tout ingénieur d’y être sensibilisé.▸   ⇒ Nécessité de savoir juger l’efficacité et les limites de  “l’informatique” .

    Apprendre un premier langage, vous vous adapterez ensuite aux autres.

    Apprendre à automatiser des tâches quelque soit le domaine métier.

    Acquérir un bagage scientifique supplémentaire.

    Comprendre que informatique = science = mathématiques.

    Entrevoir quelques problèmes scientifiques / de recherche intéressants.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 3/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    4/425

    Règles d’or

    Ne pas hésiter à poser des questions. Même en amphi !Se rappeler que si vous avez une question “bête”, au moins 1/4 de lapromo’ se pose la même.

    Le ridicule ne tue pas. Sinon ne je serais plus devant vous.

    Ne s’avouer ni perdu ni vaincu. Venez demander des précisions, mêmeen mode “entretien particulier” .

    Ne pas hésiter à venir me voir dans mon bureau pour me parler dequelque problème que ce soit.

    Ne pas hésiter à dire  “Mais M’sieur, vous ne vous êtes pas trompé sur xxx ?” 

    Ne pas hésiter à me faire part de vos facilités / difficultés.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 4/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    5/425

    Architecture

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 5/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    6/425

    “Vous avez dit ordinateur ?” 

    Mais pour quoi faire ?  Pour traiter de l’information.“Information ?” 

    ▸   C’est un message.▸  Écriture avec des symboles :   code.▸  Monde numérique : code binaire.

    Architecture d’un ordinateur:▸   Mémoire(s) : pour stocker de l’information.▸   Micro-processeur (CPU) : pour travailler l’information.▸   Périphériques : pour échanger avec   “l’extérieur” .

    “Traitement”   ⇒ description de  “comment” :   programme.

    Architecture de Von Neumann :▸  Le programme est stocké dans la mémoire...▸  ... dans la même mémoire que les données (informations).

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 6/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    7/425

    La mémoire

    Pourquoi en avoir besoin ?▸  Certains traitements peuvent se faire directement:   x  ↦ x + 1.▸   Intervention de la notion de  “ temps ” : exemple, un compteur.▸   ⇒ Besoin de se rappeler de (d’un)  “l’ état ”  précédent.

    Différents fonctionnements de mémoire:▸  RAM (Random Access Memory) : lecture / écriture – Volatile.▸  ROM (Read Only Memory) : lecture – Persistente.▸  EPROM (Erasable Programmable Read Only Memory) : lecture (/

    écriture mais en mode de fonctionnement particulier) – Persistente.

    Différents types de mémoire:▸  Mémoire de masse (disques) :   ∼ 10  ms ▸  Mémoire vive (RAM) externe au CPU :   ∼ 40 − 50  ηs▸   Mémoire cache   ± interne au CPU :   ∼ 5 − 10  ηs▸   Registres :   ∼ 1  ηs

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 7/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    8/425

    Le micro-processeur

    C’est l’unité qui  “travaille” .Idéalement segmentée en 2 parties:

    ▸  L’unité arithmétique et logique (UAL / ALU) : effectue les calculs.▸  L’unité de contrôle : décodage et séquencement des instructions.

    Contient de la mémoire très rapide (∼ 1  ηs): les registres.“Instruction”  : opération élémentaire effectuée par le CPU (addition de2 registres, copie registre ↔ mémoire, registre ← registre, décalages,sauts ...

    Chaque CPU (x86, ARM, amd64 . . . ) est différent, a son propre jeud’instructions.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 8/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    9/425

    Programmation

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 9/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    10/425

    “Qu’est-ce que programmer ?” 

    Énoncer une manière d’effectuer un calcul.Il existe toujours plusieurs manières d’effectuer un calcul.

    Une machine ne sait  que calculer (pas de raisonnement).

    Un calcul s’effectue sur des données, des valeurs.

    Programmer c’est donner une suite d’ordre au CPU.

    Cette suite est un algorithme.Mais c’est surtout concevoir des objets mathématiques.

    ▸  En suivant la sémantique des instructions / constructions.

    ▸  Avec des propriétés bien définies.▸   ... sinon ... bug.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 10/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    11/425

    “Qu’est-ce qu’un programme ?” 

    Un programme c’est:▸   L’expression (±) formelle d’un problème à résoudre,▸   puis l’expression de ce que l’on attend en sortie,

    ▸   puis l’établissement de ce que l’on a à disposition en entrée,▸   et enfin  l’algorithme.

    ⇒ Il faut une spécification avant le code !: Parfois, entrées à revoir en cours d’élaboration de l’algorithme.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 11/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    12/425

    Un langage de programmation

    “Pourquoi utiliser un langage de programmation ?” ▸  Instructions CPU très simples   ⇒ travail démesuré.▸   Instructions différentes entre CPU   ⇒ pas de portabilité / compatibilité.

    Un langage de programmation permet:▸  De fournir des constructions de  “haut niveau” .

    ▸   D’automatiser la génération de nombreuses instructions élémentairespour ces constructions.▸  D’écrire un calcul de manière standard, (relativement) indépendante de

    l’architecture cible.

    Il  “suffit”  de traduire le programme pour l’exécuter.

    ▸   Soit avec un interpréteur : JavaScript, shell, Matlab, Perl . . .▸   Soit un compilateur : C, OCaml, Fortran . . .▸  Soit un peu des deux : Java, Python ...

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 12/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    13/425

    Le langage C

    Des tonnes de langages de programmation !⇒ Choix d’un langage. . . C.Créé B. Kernighan, D. Ritchie et K. Thompson aux Bell Labs en 1972.Pourquoi C ?

    ▸  Très utilisé dans l’industrie malgré certains défauts/difficultés.▸   “Souple”  (programmation haut et bas niveau).▸  Vous en ferez en IN102 et IN104.

    Algorithmique, programmation ≡ langage.Langage = support, mots pour le dire.

    Une mine d’infos:   http://www.lysator.liu.se/c/

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 13/1

    U C

    http://www.lysator.liu.se/c/http://www.lysator.liu.se/c/http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    14/425

    Un premier programme en C

    aloha.c# i n c l u d e   < s t d i o . h>   /∗ Pour a cc éd er à p r i n t f . ∗/  

    i n t main   ( ){

    p r i n t f ( " Al oha c o us i n s ! \ n" ) ;r e t u r n   ( 0 ) ;

    }

    La plus simple manière d’afficher en C “Aloha cousins !”

    Équivalent à la commande shell> echo "Aloha cousins !"

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 14/1

    U i C

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    15/425

    Un premier programme en C

    aloha.c# i n c l u d e   < s t d i o . h>   /∗ Pour a cc éd er à p r i n t f . ∗/  

    i n t main   ( ){

    p r i n t f ( " Al oha c o us i n s ! \ n" ) ;r e t u r n   ( 0 ) ;

    }

    #include  : Demander accès aux fonctions entrée/sortie (printf)./* ... */  : Commentaires.

    ▸   Ignorés par le langage.▸   Mais pas les lecteurs !▸

     Servent à la documentation du code.▸   Documentez vos programmes !

    Espaces non-significatifs mais indentez votre code !

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 14/1

    U i C

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    16/425

    Un premier programme en C

    aloha.c# i n c l u d e   < s t d i o . h>   /∗ Pour a cc éd er à p r i n t f . ∗/  

    i n t main   ( ){

    p r i n t f ( " Al oha c o us i n s ! \ n" ) ;r e t u r n   ( 0 ) ;

    }

    Fonction  main : point d’entrée du programme.

    Toujours automatiquement appelée en premier.

    Un programme en C doit toujours contenir une fonction  main.

    Type  int (entier) au début : type renvoyé par  main.

    Pour le  main :   toujours un entier.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 14/1

    U i C

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    17/425

    Un premier programme en C

    aloha.c# i n c l u d e   < s t d i o . h>   /∗ Pour a cc éd er à p r i n t f . ∗/  

    i n t main   ( ){

    p r i n t f ( " Al oha c o us i n s ! \ n" ) ;r e t u r n   ( 0 ) ;

    }

    Fonction  printf  : affiche un message dans le terminal.

    "Aloha cousins !\n" : chaîne de caractères (à afficher).  \n : représente le caractère  “retour à la ligne” .

    ;   Point-virgule : fin d’instruction, marque la séquence.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 14/1

    U i C

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    18/425

    Un premier programme en C

    aloha.c# i n c l u d e   < s t d i o . h>   /∗ Pour a cc éd er à p r i n t f . ∗/  

    i n t main   ( ){

    p r i n t f ( " Al oha c o us i n s ! \ n" ) ;r e t u r n   ( 0 ) ;

    }

    return : sortir d’une fonction en retournant la valeur qui suit.

    return  n’est pas une fonction mais une   instruction.

    Ici, la valeur de retour est 0, c’est bien un (type  int).Retour de la fonction  main :

    ▸  Code de sortie du programme.▸  Existe pour toutes les commandes Unix▸  Permet de tester si le programme s’est exécuté normalement.▸   Convention: 0   ≡ “OK”.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 14/1

    Compilation et e éc tion d’ n programme

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    19/425

    Compilation et exécution d un programme

    Édition du source:▸   >   emacs   aloha.c &▸   emacs : Éditeur de texte, permet de taper le source.▸   “Human-readable” .▸   Vous pouvez utiliser n’importe quel éditeur (vi, vim, joe. . . )

    Compilation:▸   gcc   aloha.c   ou   gcc   aloha.c -o first.x▸   gcc (compilateur) transforme le source en exécutable.▸   “Computer-readable” : compilateur   ≡ traducteur.▸  Par défaut, nom de l’exécutable = “a.out”.▸   Option  -o  : permet de spécifier un nom d’exécutable.

    Exécution:▸   ./a.out   ou   ./first.x▸   ... en fonction du nom de votre exécutable.▸  Exécute votre programme dans le répertoire courant.▸  “./” devant car le répertoire courant n’est pas dans le  PATH.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 15/1

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    20/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    21/425

    Quelques constructions élémentaires

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 17/1

    Différentes “formes” de données

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    22/425

    Différentes  formes   de données

    En maths: entiers naturels, réels, rationnels, complexes . . .En logique: booléens {vrai , faux }En linguistique: caractères, mots (chaînes de caractères)

    ⇒ Besoin de types de données de base différents.“De base”   ≡ primitifs, (± pour les chaînes) insécables.Ces types de données sont intrinsèquement différents:

    ▸  en terme de sémantique (sens),▸  en terme de représentation dans la machine.

    3 (4) types de données de base: entiers, réels, (booléens), caractères.

    . . . et les fonctions . . . un peu à part.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 18/1

    Les scalaires de base

    http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    23/425

    Les scalaires de base

    Les entiers: type   int.

    Les réels: type  float  ou double.

    Vue simplifiée: on y reviendra plus tard.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 19/1

    La mémoire

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    24/425

    La mémoire

    Avant d’être exécuté, le programme est chargé en mémoire.Un  “pointeur”  indique où en est l’exécution.

    À chaque instruction il avance d’une  “case” .

    Il y a parfois des sauts (appels de fonctions, tests, boucles. . . ).

    Pendant l’exécution, le programme peut aussi réserver de la mémoire:▸   Déclaration (création) de variables, réceptacles d’information.▸  À chaque variable correspond une  “case mémoire” .

    2 zones mémoire différentes:▸   La pile: variables  “locales”  (temporairement accessibles).▸   Le tas: variables  “globales”  (durée de vie arbitraire).

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 20/1

    Nécessité de typage

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    25/425

    Nécessité de typage

    Mémoire: contient de l’information codée en binaire.

    Nous avons vu quelques formes de données.

    ⇒ un octet en mémoire peut avoir différentes significations.L’octet 01010111 peut représenter:

    ▸   l’entier 87 (= 64 + 16 + 4 + 2 + 1),▸   le flottant 4.85 ⋅10−270,▸   (le caractère ’W’),▸  une instruction en langage machine,▸   une adresse mémoire, etc . . .

    Il faut associer un type à chaque case mémoire, chaque variable !

    C’est son type (lors de la déclaration) qui va définir sa significationréelle.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 21/1

    Déclaration et initialisation de variable (1)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    26/425

    Déclaration et initialisation de variable (1)

    i n t main   ( ){

    f l o a t   c ;i n t   i , j = 42 ;

    d o u b l e   b ;b = 0. 00 34 5 ;c = 3 .1 41 5 9 ;

    }

    On déclare une variable en donnant son type suivide son nom.

    Cela réserve une case mémoire contenant  a priori une valeur aléatoire.

    L’initialisation fixe sa valeur.Cela peut se faire dès la déclaration, ou après.

    Le tout c’est de ne pas lire dans une variable avant son initialisation !

    Sa valeur est “ce qu’il y avait dans la mémoire”.

    Ça n’a aucun sens de l’utiliser, c’est un oubli, une erreur.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 22/1

    Déclaration et initialisation de variable (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    27/425

    Déclaration et initialisation de variable (2)

    i n t main   ( ){

    f l o a t   c ;i n t   i , j = 42 ;d o u b l e   b ;b = 0. 00 34 5 ;c = 3 .1 41 5 9 ;

    }

    Avec ce code, la mémoire ressemble à:

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 23/1

    Expressions (de base) du langage

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    28/425

    Expressions (de base) du langage

    Une expression est quelque chose qui “a une valeur” .

    Opposition à une instruction (slides suivants) qui  “fait” .

    À partir d’expressions de base, on combine les expressions.Expressions de base: les variables et les littéraux.

    ▸   Variables: toute variable déclarée et de portée accessible.▸   Entiers:   4   −5▸   Booléens:   true false   (. . . et les entiers !)▸   Caractères:   ’U’ ’n’▸   Flottants:   −4.6 5e-12▸   Chaînes:   "plop" "\tGlop\n"

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 24/1

    Composition d’expressions

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    29/425

    p p

    Arithmétique: entre entiers et/ou flottants.▸   +,   −, /, ∗ avec leur sens “habituel”, % (modulo)▸   Ex:   4   − (5 ∗ 7)

    Relationnel (“tests”): entre expressions de même type.▸   Rem: conversions implicite entre scalaires (entiers, flottants, caractères

    et booléens).▸  == (égalité), < (inférieur à), >, =.▸   Ex:   y

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    30/425

    g g

    Une instruction est quelque chose qui  “fait”  une action, sans valoirquelque chose.

    Opposition à une expression qui vaut une valeur.Plusieurs (nombreuses) formes d’instructions.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 26/1

    L’affectation

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    31/425

    Dénotée par le signe = (à ne pas confondre avec ==).

    Donne une valeur à une variable.Attention matheux !

    ▸   Variable “mathématique”   ≠ variable “informatique”.▸  En maths, variable   ≡ inconnue.

    ▸  En info, variable   ≡ réceptacle d’information.▸   En info, une variable a toujours une valeur . . . même incohérente.

    v = 15 ; stocke 15 dans la variable v.

    15 = v ; n’a aucun sens.

    À gauche du =: case mémoire (variable, case de tableau. . . ).À droite du =: expression dont la valeur va être stockée.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 27/1

    L’affectation

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    32/425

    Besoin de “compatibilité” entre type de la case mémoire et type de lavaleur à stocker !

    Si les types sont les mêmes, aucun problème.Si les types sont compatibles, transformation implicite:

      Entier  ↤

     entier avec signe et/ou taille différents,▸   Flottant   ↤ entier,▸   Entier   ↤ caractère.

    . . . mais attention aux problèmes de précision et débordement !

    Et sinon, les types n’ont rien à voir (ex: tableau à la place d’un

    entier): erreur de typage par le compilateur.

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 28/1

    Instructions d’affectation-arithmétique abrégée

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    33/425

    Il existe des versions courtes des opérations  “courantes” :

    i n t   i = 0 ;

    i++ ;   // i = i + 1 ;i −−   ;   // i = i    −   1 ;i += 3 ;   // i = i + 3 ;i   −= 3 ;   // i = i    −   3 ;i ∗= 3 ;   // i = i ∗ 3 ;i / = 3 ;   // i = i / 3 ;i %= 3 ;   // i = i % 3 ;i |= 3 ;   // i = i | 3 ;i &= 3 ;   // i = i & 3 ;

    i ^= 3 ;   // i = i ^ 3 ;

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 29/1

    Exécution conditionnelle

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    34/425

    Besoin d’effectuer un traitement ...ou pas ...ou un autre.

    Notion de condition (expression booléenne).

    Condition toujours entre parenthèses !if (expression) {   instruction(s )  ; }:

    ▸   instruction

    (s 

    ) exécutée(s) si   expression renvoie   ≠ 0

    instruction(s) exécutée(s) si expression renvoie   ≠ 0.if (expression) {   instruction1(s )  ; } else {   instruction2(s )  ; }:

    ▸   instruction1(s ) exécutée(s) si  expression renvoie   ≠ 0▸   sinon,  instruction2(s ) exécutée(s).

    Remarquez la construction { ...   }:   groupement de plusieursinstructions:   “bloc” .

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 30/1

    Exécution conditionnelle: petit exemple

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    35/425

    i n t   x ;. . .i f    ( x == 0) p r i n t f ( " x e s t n ul . \ n" ) ;i f    ( x > 0) { p r i n t f ( " x e s t p o s i t i f . \ n" ) ; }e l s e   {

    i f    ( ( x   −5) )p r i n t f ( "x e s t n é g a t i f e n t re ] −5 ; −3 ] ou n ul . \ n" ) ;e l s e   p r i n t f ( "x e s t n é g a t i f h o r s ] −5 ; −3 ] ou n u l . \ n" ) ;

    }

    x  = −90⇒"x est négatif hors ]-5;-3] ou nul."

    x  = 0⇒"x est nul.""x est négatif hors ]-5;-3] ou nul."

    x  = −4⇒"x est négatif entre ]-5;-3] ou nul."

    Algorithmique et programmation   IN101François Pessaux ,   [email protected], ENSTA 31/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    36/425

    Approfondissement des types de base de C

    Algorithmique et programmation  IN101

    François Pessaux ,   [email protected], ENSTA 32/1

    Les entiers (naturels et relatifs)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    37/425

    Plusieurs tailles.Signés ou non.

    Par défaut: un entier est signé.Ex: 0 -3 +0 15657

    Taille Valeur(bits) Min Max

    short 16 -32768 32767unsigned short 16 0 65535

    int 32   −231 231 − 1unsigned int 32 0 232 − 1

    long 32 ou 64 dépend de l’architectureunsigned long 32 ou 64 dépend de l’architecturelong long 64   −263 263 − 1

    unsigned long long 64 0 264 − 1

    Algorithmique et programmation  IN101

    François Pessaux ,   [email protected], ENSTA 33/1

    Codage des entiers

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    38/425

    Entiers codés en binaire: base 2.

    ▸   421   ↦ 0000000110100101 (sur 16 bits)▸   = 28 + 27 + 25 + 22 + 20

    Base 2 :▸  Pratique au niveau électronique mais encombrant !▸   ⇒ On préfère la base 16 (hexadécimal).

    ▸   0000 0001 1010 01010x   0 1 A 5

    Pour avoir des entiers signés: complément à 2.▸  Inverser les bits de l’écriture binaire de sa valeur absolue,▸  puis ajouter 1 au résultat.▸  Calcule 2l  − x  où   l  est la longueur de représentation d’un entier.▸   ⇒ 1 seule représentation de 0.▸   ⇒ + et   − identiques sur signés / non-signés, positifs / négatifs.

    Algorithmique et programmation  IN101

    François Pessaux ,   [email protected], ENSTA 34/1

    Débordement d’entiers

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    39/425

    Arithmétique modulo la taille des mots machine.

    Pour les exemples suivants, taille = 4 bits.⇒ Perte de plein de  “bonnes”  propriétés mathématiques  ▸  Débordement de non signé: 9 + 7 = 16 ?

    1001 + 0111 = 10000 = sur 4 bits . . . 0000 = 0▸  Débordement de signé: -9 - 8 = -17 ?

    0111 − 1000 = 11111 = sur 4 bits . . . 1111 = -1▸  Conversion de signé → non signé: -4 → ?1100 = 12

    ▸  Conversion de non signé → signé: 15 → ?1111 = -1

    ▸   Associativité de   ∗ et :  (1 / 4)  * 4 = (1 * 4) / 4 ?1 / 4 = 0.25   En entiers . . . 0. Donc, * 4   → 01 * 4 = 4   En entiers . . . 4. Donc, / 4,   → 1

    Algorithmique et programmation  IN101

    François Pessaux ,   [email protected], ENSTA 35/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    40/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    41/425

    Des réels différents égaux. . .

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    42/425

    thiskillsme.c# i n c l u d e   < s t d i o . h>

    i n t m a i n   ( ){

    f l o a t   f l 1 = 4 84 31 .1 23 1 ;f l o a t   f l 2 = 4 84 31 .1 23 9 ;f l o a t   f l 3 = 4 84 31 .1 25 0 ;

    p r i n t f ( " f l 1 : %f f l 2 : %f f l 3 : %f \ n " , f l 1 , f l 2 , f l 3 ) ;p r i n t f ( " f l 1 == f l 2 ? %d \n " , ( f l 1 == f l 2 ) ) ;

    p r i n t f ( " f l 2 == f l 3 ? %d \n " , ( f l 2 == f l 3 ) ) ;p r i n t f ( " f l 1 == f l 3 ? %d \n " , ( f l 1 == f l 3 ) ) ;f l 1 = f l 1 + 0 .0 0 0 1 ;p r i n t f ( " f l 1 + 0 . 00 0 1 : %f \ n" , f l 1 ) ;r e t u r n   ( 0 ) ;

    }

    > ./thiskillsme

    fl1: 48431.125000 fl2: 48431.125000 fl3: 48431.125000fl1 == fl2 ? 1

    fl2 == fl3 ? 1

    fl1 == fl3 ? 1

    fl1 + 0.0001: 48431.125000

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 38/1

    . . . et des réels égaux différents

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    43/425

    thiskillsmeagain.c# i n c l u d e   < s t d i o . h># i n c l u d e   # d e f i n e   EPSILON (1 e −6)   // Tout p e t i t e p s i l o n . . .

    i n t m a i n   ( ){

    d o u b l e   f l 1 = 0 . 1 ;d o u b l e   f l 2 = 0 . 2 ;d o u b l e   f l 3 = 0 . 3 ;d o u b l e   f l 4 = f l 1 + f l 2 ;

    p r i n t f ( " f l 1 : %f f l 2 : %f f l 3 : %f f l 4 : %f \ n " , f l 1 , f l 2 , f l 3 , f l 4 ) ;p r i n t f ( " f l 3 = f l 4 ? %d \ n " , ( f l 3 == f l 4 ) ) ;p r i n t f ( " f l 3 ~ f l 4 ? %d \ n " , ( f a b s ( f l 3   −   f l 4 ) < EPSILON) ) ;r e t u r n   ( 0 ) ;

    }

    > ./thiskillsmeagainfl1: 0.100000 fl2: 0.200000 fl3: 0.300000 fl4: 0.300000

    fl3 = fl4 ? 0

    fl3 ~ fl4 ? 1

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 39/1

    Les booléens

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    44/425

    Valeurs dans l’ensemble {  vrai ;  faux }Valeurs logiques booléennes.En fait, comme une valeur entière avec:

    ▸   0 ≡ false▸  Tout sauf 0 ≡ true

    On peut donc tester une valeur entière comme un booléen.

    Tirage aléatoire dans cet ensemble “booléen” non équiprobable !Fichier d’entête #include   “pseudo-définit”  les booléens:

    ▸   Type  bool (alias de   int)▸   Constante  true (=1) et  false (= 0).

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 40/1

    Les chaînes de caractères

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    45/425

    Ce sont en fait des “tableaux” de caractères.

    Intuition : suite contigue de caractères terminée par le caractère ’\0’.

    Caractère: type prédéfini char. Par ex: ’a’.

    Chaîne: moyen facile d’écrire des morceaux de texte. Ex: "Eat at Joe’s .’’

    Fichier d’entête requis:  #include 

    Peuvent être copiées: fonction  strcpy (dest , source ).Longueur d’une chaîne: fonction  strlen

     (chaine 

    ).

     ATTENTION: ne compte pas le ’\0’ final !

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 41/1

    Quelques formes particulières de caractères

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    46/425

    Utilisables en tant que caractères individuels ou dans des chaînes.▸   ’\n’ : Retour à la ligne.▸   ’\\’ : Le caractère \.▸   ’\” : Le caractère ’.▸   ’\"’ : Le caractère ".▸   ’\t’  : La tabulation.

    ▸   ’\x’ ••: Le caractère dont le code en hexadécimal suit.▸   ’\’ •••: Le caractère dont le code en octal suit.▸   . . . et quelques autres que l’on passe sous silence.

    Ex: printf ("foo\n\"\’bar\\\x65\046");

    foo

    "’bar\e&

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 42/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    47/425

    Plus de constructions

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 43/1

    Répéter, toujours répéter. . .

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    48/425

    Informellement, certains traitements parfois spécifiés par:▸

     Faire un traitement  T ,▸  Puis si une condition  C  est vérifiée s’arrêter,▸   Sinon recommencer le traitement  T .

    Notion de “répétition”.

    Exemple:   cos 

    (x 

    )= 1 − x 

    2

    2! +x 4

    4! −x 6

    6! + . . .

    Et d’ailleurs ... n! = 1 ∗ 2 ∗ . . . ∗ nNécessité de préciser comment mener la répétition:

    ▸  Nombre de fois connu à l’avance ?▸   Condition  C  doit être testée avant le 1er traitement T   ?▸

      Condition C 

     doit être testée après le 1

    er

    traitement T 

      ?⇒ Plusieurs schémas d’itération.⇒ Plusieurs constructions de boucles.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 44/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    49/425

    La boucle  for dégénérée

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    50/425

    Possibilité d’omettre des parties de la construction.

    Initialisation, condition, post-traitement, voire corps !Poussé à l’extrême: formes étranges voire illisibles . À éviter !

    i = 0 ; j = 0 ;f o r   (

    ∗∗; i < 1 0 ; i ++) {

     j += i ;}

     j = 0 ;f o r   ( i = 0 ; i < 1 0 ; ∗∗) {

     j += i ;

    i++ ;}

    i = 0 ; j = 0 ;f o r   (∗∗ ; i < 1 0; ∗∗) {

     j += i ;i++ ;}

    i = 0 ; j = 0 ;f o r   (∗∗ ; ∗∗ ; ∗∗) {

     j += i ;

    i f    ( i == 9)   b r e a k   ;i++ ;}

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 46/1

    “Tant que” . . . faire: la boucle  while

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    51/425

    while (expression) {   instruction(s ) }Sémantique:

    1   Si   expression  s’évalue en  true1.1   Exécuter   instruction(s ).1.2  Retourner en 1.

    Ex:   U n+1 =   U n2   Si  U n  est pair3 ∗ U n + 1 Sinonsyracuse.c

    i n t main   ( ){

    i n t   x = 134560 ;w h i l e   ( x != 1 ) {   // R ép é t e r t an t que x e s t d i f f é r e n t de 1 .

    i f    ( x % 2 == 0 )   // S i x e s t p a i r .

    x = x / 2 ;   // On l e d i v i s e p ar 2 .e l s e   x = 3 ∗ x + 1 ;

    }r e t u r n   ( 0 ) ;

    }

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 47/1

    Équivalence entre boucles  for et  while

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    52/425

    Remplacement de   for en while:

    f o r   ( i n i t ; t e s t ; p o s t l u d e ) {i n s t r u c t i o n ( s ) ;

    }

    i n i t ;w h i l e   ( t e s t ) {

    i n s t r u c t i o n ( s ) ;p o s t l u d e ;

    }

    Remplacement de while en   for:

    w h i l e   ( t e s t ) {i n s t r u c t i o n ( s ) ;

    }

    f o r   ( ; t e s t ; ) {i n s t r u c t i o n ( s ) ;

    }

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 48/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    53/425

    En résumé des boucles

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    54/425

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 50/1

    Construction conditionnelle “généralisée” (1)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    55/425

    Besoin de tester une valeur contre plusieurs cas mutuellement exclusifs.

    Ex:   x  =?

    0 ou  x  =?

    1 ou  x  =?

    4 ou ... ou “sinon”.On peut cascader des   if −else

    i f    ( x == 0) p r i n t f ( " x : 0\ n" ) ;e l s e   {

    i f    ( x == 1) p r i n t f ( " x : 1\ n" ) ;e l s e   {

    i f    ( x == 4) p r i n t f ( " x : 4\ n" ) ;e l s e   {

    i f    . . .   e l s e   . . .   i f    . . .   e l s e   . . .. . . p r i n t f ( " A u t r e c a s \n" ) ;

    } } . . . }}

    }}

    Pas franchement pratique ni lisible

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 51/1

    Construction conditionnelle “généralisée” (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    56/425

    Discrimination par cas.

    ⇒ Cas doivent être mutuellement exclusifs.

    Construction switch (expression) { ...   }

    Suite de   case  constante   :   instructions 

    instructions  correspondant au cas dont  constante  est égal à la valeurde   expression alors exécutées.

    Fin de chaque cas par  break  ;Cas  “autre” , par défaut:  default.

    . . .s w i t c h   ( x ) {

    c a s e   0 : p r i n t f ( "x : 0\ n" ) ;   b r e a k   ;c a s e   1 : p r i n t f ( "x : 1\ n" ) ;   b r e a k   ;c a s e   4 : p r i n t f ( "x : 4\ n" ) ;   b r e a k   ;d e f a u l t  : p r i n t f ( " Au t r e c a s \n" ) ;   b r e a k   ;

    }

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 52/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    57/425

    Quelques utilitaires de C

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 53/1

    Les entrées/sorties (“I/Os” ) élémentaires

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    58/425

    Communication avec “l’extérieur” : clavier, écran, fichiers. . .

    Lecture (Input), écriture (Output).

    Écriture à l’écran:   printf.Lecture au clavier:   scanf.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 54/1

    Sortie à l’écran  printf (1)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    59/425

    Nécessite:  #include printf ("Aloha cousins\n") ;

    printf ("%d = %d + %d\n", x + y, x, y);Format= chaîne de caractères contenant (ou pas) des séquences %.

    %d un   int%ld un long int  en décimal

    %u un unsigned int en décimal%x un   int  en hexadécimal%f un  float%lf un double%e un double en notation scientifique

    %.7lf un double avec 7 chiffres après la virgule%07d un   int  en décimal sur 7 digits (padding frontal avec des 0)% 7d un   int  en décimal sur 7 digits (padding frontal avec des ’ ’)%c un char (comme caractère ASCII, pas comme entier)

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 55/1

    Sortie à l’écran avec  printf (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    60/425

    # i n c l u d e   < s t d i o . h>

    i n t main   ( ){

    p r i n t f ( "%d\ n" , 4 2) ;p r i n t f ( "%l d \ n" , 42 ) ;

    p r i n t f ( "%u\ n" , 4 2) ;p r i n t f ( "%x \n" , 4 2) ;p r i n t f ( "%f \ n" , 4 2 .0 ) ;p r i n t f ( "%e \n" , 4 2 . 0) ;p r i n t f ( "%.7 f \n" , 4 2 . 0 ) ;p r i n t f ( "%07d \n " , 4 2) ;p r i n t f ( "% 7d\n" , 42 ) ;

    p r i n t f ( "%c \n" , 4 2) ;r e t u r n   ( 0 ) ;

    }

    42

    42

    422a

    42.000000

    4.200000e+01

    42.0000000

    0000042

    42

    *

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 56/1

    Entrée au clavier avec  scanf (1)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    61/425

    Nécessite:  #include 

    Lecture au clavier selon le format spécifié (séquences %).Saisie pas en accord avec ce qu’attend le format: imprévisible.

    Format avec uniquement des % (pas de  “message” ).

    input.c# i n c l u d e   < s t d i o . h>

    i n t main   ( ){

    i n t   i , j ;s c a n f ( "%d %d " , &i , & j ) ;

    p r i n t f ( " i = %d , j = %d\n" , i , j ) ;r e t u r n   ( 0 ) ;

    }

     mymac:/tmp$ gcc input.c -o input

     mymac:/tmp$ ./input45 67

    i = 4 5 , j = 6 7

     mymac:/tmp$ ./input

    5

    FHG

    i = 5, j = 0

     mymac:/tmp$ ./input

    DFG 6

    i = 0, j = 0

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 57/1

    Entrée au clavier avec  scanf (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    62/425

    scanf ("%d", & i ) ;  

    Pour le moment,  & reste un peu “magique”.

    Sera approfondi ultérieurement.

    Idée: “à mettre devant une variable pour permettre sa modification parscanf”.

    Rem: lecture de chaînes de caractères (%s) nécessite quelquesexplications ultérieures. On vivra sans pour le moment.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 58/1

    Constantes, macros et préprocesseur

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    63/425

    Définir des constantes littérales dans le source:  pas maintenable !

    Nécessité de changer partout la valeur.

    ⇒ Utilisation de macros.# d e f i n e   SI ZE ( 4 2 ). . .i n t   i = SIZE ;i f    ( j < SIZE ) . . .

    Remplacement textuel avant compilation par le préprocesseur C (cpp).Mieux vaut parenthéser:

    # d e f i n e   SIZE 42 + 1. . .i n t   i = SIZE ∗ 10 ;

    → i = 52 et non 430 !

    Possibilité de macros “paramétrées”:  #define TWICE(x)((x)∗ (x))

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 59/1

    Alias de types

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    64/425

    Vous en avez assez de taper  unsigned long int ?

    ⇒ Définissez un alias.

    typedef unsigned long int  uli_t ;  uli_t: nom, abréviation de  unsigned long int. Utilisable ensuite comme nom de type: uli_t i = 42 ;

    Ne définit pas un nouveau type !

    De manière générale:   typedef  

    Fonctionnera avec les types que nous verrons plus tard.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 60/1

    Les fonctions (1)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    65/425

    Vus jusqu’à présent:   expressions (arithmétiques, logiques), affectation,séquence et boucles.

    Permet déjà d’effectuer des calculs.Parfois, besoin:

    ▸  D’effectuer le même calcul à plusieurs endroits⇒ Pas envie de répéter les instructions.

    ▸  D’effectuer un calcul en “instanciant” des inconnues de différentesmanières.

    Par exemple: calcul de cosinus en invoquant 2 fois l’exponentielle:

    mycos (x )↦

    e ix 

    +e −ix 

    2

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 61/1

    Les fonctions (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    66/425

    C’est typiquement la notion de fonction mathématique:▸   Soit  A et  B  2 ensembles.▸   Fonction  f   définie sur  A à valeur dans  B   : correspondance qui   ∀x  ∈ A

    associe au plus (fonction partielle) 1 élément de  B .▸   A: domaine.▸   B : codomaine.

    Autrement dit:▸  Prend 1 (ou des) argument(s).▸  Retourne 1 valeur.

    D’où, une fonction est définie par:▸   le type de la valeur qu’elle retourne,▸   son nom,▸   les types des paramètres qu’elle attend,▸   et son corps: la description du calcul qu’elle effectue, spécification

    exécutable.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 62/1

    Les fonctions (3): exemples

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    67/425

    i n t   t w i ce ( i n t   i ){

    r e t u r n   ( i ∗ 2 ) ;   // C o r p s : r e t o u r n e b i en un i n t .}

    f l o a t  s q u ar e _ mi n us (

     f l o a t  x ,

      f l o a t  y ){

    f l o a t   t = ( x   −   y ) ;   /∗ V a r i a b l e l o c a l e . ∗/  r e t u r n   ( t ∗ t ) ;

    }

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 63/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    68/425

    Les fonctions (5): remarques pour puristes

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    69/425

    Fonctions en C légèrement différentes du modèle théorique du calcul(λ-calcul).λ-calcul:

    ▸   Fonction à  n arguments = fonction à 1 argument retournant unefonction à  n − 1 argument(s).

    ▸   ⇒ Les fonctions sont de valeurs.▸  Pas de fonction à 0 argument: paramètre de type trivial (void, unit)

    habité par 1 seule valeur.▸  Supprime la différence artificielle entre  “fonction” ,  “procédure”  et “arité”

    (nb d’arguments).▸

      Cas des langages fonctionnels (OCaml, Haskell, LISP. . . )

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 65/1

    http://goforward/http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    70/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    71/425

    Déclaration / prototype (1)

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    72/425

    Utilisation d’une fonction en dehors de son fichier hôte ⇒ son typedoit être connu.

    Donner juste le type:   déclaration (et non définition).

    Rend visible par toute personne ayant accès à cette déclaration.

    Règle valable pour les autres types de variables, d’ailleurs.Prototype d’une entité: son nom + son type.Déclaration:

    ▸   Faite au  “toplevel”  d’un fichier d’entête (.h).▸  Utilisée via les directives  #include.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 68/1

    Déclaration / prototype (2)

    Pour une fonction:

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    73/425

    Pour une fonction:▸  son type de retour,

    ▸   son nom,▸  les types (et les noms optionnellement) de ses arguments.

    Pour une variable autre:▸   le mot clef  extern (sinon ça serait une définition de variable !),▸   son type,

    ▸   son nom.

    /∗ D é c l a r a t i o n d ’ u ne v a r i a b l e ( g l o b a l e ) e n t i è r e . ∗/  e xt er n i n t   e rr no ;/∗ D é c l a r a t i o n de l a f o n c t i o n a r c   − t a n g e nt e ( d e y / x ) . ∗/  f l o a t   a ta n2 ( f l o a t   y ,   f l o a t   x ) ;

    Indique “comment” utiliser la fonction.

    ...Mais pas ce qu’elle fait.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 69/1

    Quelques fonctions déjà vues

    printf: affichage à l’écran

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    74/425

    printf: affichage à l écran▸  Prototype un peu bizarre car nombre et types des arguments variables.

    ▸   void   printf (const char ∗ restrict format, ...) ;  main :   LA fonction point d’entrée de tout programme

    ▸   int main () ;☀  Retourne un entier: le code de retour du programme.☀  Ne prend pas d’argument.

    ▸   int main (int  argc,   char ∗argv []) ;☀  Forme alternative: arguments en provenance de la ligne de commande.☀   argc : nombre d’entrées dans  argv.☀   argv: tableau (plus de détails plus tard) de chaînes de caractères.☀   1er élément: nom du programme.☀  Éléments suivants: arguments effectifs.☀   Ex:   > ./myprog 1 hop 4

    ⇒  argv =  0 1 2 3

    ”myprog ” ”1” ”hop ” ”4”

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 70/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    75/425

    La récursivité

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 71/1

    La récursivité: une autre façon d’itérer

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    76/425

    Soit la fonction “factorielle”.

    ▸   Spécification par abstraction:   n! =∏ni =1 i ▸   Spécification par récurrence:   Fact n =   1 Si  n = 0n ∗ Fact n−1   Sinon

    Idée: problème  P  de la forme

    ⇒ Traitement T   sur  P :▸

     Traiter “la partie orange”.▸   Traiter ce qui reste. . . qui est un problème de la même forme que P .

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 72/1

    La récursivité (2)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    77/425

    Une fonction qui s’appelle elle-même est dite récursive.

    Ex: recherche d’un fichier sur un disque.

    booléen existe_fichier (nom, répertoire)

    {

    liste fs = noms_de_fichier (répertoire) ;

    si (name est dans fs) retourner (vrai) ;

    sinon {liste srs = sous_répertoires (répertoire) ;

    pour chaque r dans srs {

    si (existe_fichier (nom, r)) retourner (vrai) ;

    // Sinon, implicitement continuer le pour-chaque.

    }

    }

    retourner (faux) ;}

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 73/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    78/425

    Exemple: factorielle

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    79/425

    1   i n t   f a c t ( i n t   n )2   {3   i f    (n

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    80/425

    1

    fact (4)

    4 * fact (3)

    3 * fact (2)

    2 * fact (1)

    1 * fact (0)

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 76/1

    Exemple: factorielle - Déroulement du calcul (2)

    24

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    81/425

    fact (4)

    4 * fact (3)

    3 * fact (2)

    2 * fact (1)

    1 * fact (0)

    1

    1

    1 * 1

    2 * (1 * 1)

    3 * (2 * (1 * 1))

    4 * (3 * (2 * (1 * 1)))

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 77/1

    Pour résoudre notre problème de factorielle. . .

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    82/425

    On a trouvé au moins un cas où la solution est connue: 0!

    On a tenté de ramener le problème posé pour  n quelconque au mêmeproblème...

    . . . Mais posé sur une valeur plus simple (plus “proche” du cas connu).

    On a raisonné par récurrence pour obtenir une définition récursive.Principe de récurrence. Soit  P  une propriété sur  N:

    ▸   Si  P (0) est vérifiée,▸   si de l’hypothèse “P (n) est vérifié” on peut déduire que  P (n + 1) est

    vérifiée,▸

      alors  ∀

    m∈ N,

    P (m) est vérifiée.

    Algorithmique et programmation   IN101

    François Pessaux , [email protected], ENSTA 78/1

    Exemple: élévation à la puissance

    http://goforward/http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    83/425

    Spécification récursive:

      x n = x ∗ x n−1x 0 = 1

    À chaque appel récursif, l’exposant  n décroit

    ⇒ il converge vers 0 et la fonction  power termine bien.

    d o u b l e   p ow er ( d o u b l e   x ,   u ns ig ne d i n t   n ){

    i f    ( n == 0)   r e t u r n   ( 1 . 0 ) ;e l s e r e t u r n   ( x ∗ power ( x , n

      −  1 ) ) ;

    }

    Algorithmique et programmation   IN101

    François Pessaux , [email protected], ENSTA 79/1

    Exemple: puissance - Déroulement du calcul (1)

    http://goforward/http://find/http://goback/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    84/425

    power (a, 4)

    1

    a * power (a, 3)

    a * power (a, 2)

    a * power (a, 1)

    a * power (a, 0)

    Algorithmique et programmation   IN101

    François Pessaux [email protected] ENSTA 80/1

    Exemple: puissance - Déroulement du calcul (2)

    a* a * a* a

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    85/425

    1

    a * power (a, 3)

    a * power (a, 2)

    a * power (a, 1)

    a * power (a, 0)

    power (a, 4)

    1

    a

    a * a

    a * a * a

    a* a * a* a

    Algorithmique et programmation   IN101

    François Pessaux [email protected] ENSTA 81/1

    Exemple: élévation à la puissance -  “square & multiply” 

    Spécification récursive:

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    86/425

    ⎧⎪⎪⎪⎨⎪⎪⎪⎩x 

    2n= x 

    n

    ∗ x n

    x 2n+1 = x ∗ x 2n

    x 1 = x .

    d o u b l e   power_sm ( d o u b l e   x ,   u n si gn ed i n t   n )

    {d o u b l e   tmp ;i f    ( n == 1)   r e t u r n   ( x ) ;

    i f    ( e % 2 == 0 ) {tmp = power_sm ( x , n / 2 ) ;r e t u r n   ( tmp ∗ tmp ) ;

    }r e t u r n   ( x ∗ power_sm ( x , n   −   1 ) ) ;}

    Algorithmique et programmation   IN101

    François Pessaux [email protected] ENSTA 82/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    87/425

    Ex:  “square & multiply”  - Déroulement du calcul (2)

    a * a * a 2( )2

    ( )

    2

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    88/425

    2( )2

    a * a 2

    a * a 2( )2

    ( )

    2

    a * a 2( )2

    ( )

    2

    ( )( )

    power (a, 6) ^ 2

    power (a, 3) ^ 2

    power (a, 2) ^ 2

    power (a, 13)

    a * power (a, 12)

    power (a, 1) ^ 2

    a

    a2

    a

    a *

    a * a

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta-paristech fr ENSTA 84/1

    Appels récursifs multiples

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    89/425

    Suite de Fibonacci:   F n = F n−1 + F n−2  et  F 0 = 0,

    F 1 = 1Une fonction récursive peut faire plusieurs appels récursifs.

    Exemple: suite récurrente double, algorithmes de tri (c.f. plus tard).Déroulement comme des appels de fonction  “normaux” :

     Entrer dans le premier appel récursif.▸  Ce dernier va lui-même effectuer ses appels internes.▸  Quand premier appel terminé, on passe au second.

    Attention: pas de notion de parallélisme !

    Les appels ne sont pas exécutés en “même temps”.

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta-paristech fr ENSTA 85/1

    Appels récursifs multiples: déroulement

    F n  = F n−1 + F n−2  et  F 0 = 0, F 1 = 1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    90/425

    fib(4) ;

    fib(3) ;

    fib(2) ;

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta-paristech fr ENSTA 86/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    91/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    92/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    93/425

    Appels récursifs multiples: déroulement

    F n  = F n−1 + F n−2  et  F 0 = 0, F 1 = 1

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    94/425

    0

    fib(4) ;

    fib(3) ;

    fib(2) ;

    fib(2) ;

    fib(0) ;

    fib(1) ;

    fib(1) ;

    1

    1

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta paristech fr ENSTA 90/1

    Appels récursifs multiples: déroulement

    F n  = F n−1 + F n−2  et  F 0 = 0, F 1 = 1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    95/425

    1

    fib(4) ;

    fib(3) ;

    fib(2) ;

    fib(2) ;

    fib(0) ;

    fib(1) ;

    fib(1) ;

    2

    1

    1

    0

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta paristech fr ENSTA 91/1

    Appels récursifs multiples: déroulement

    F n  = F n−1 + F n−2  et  F 0 = 0, F 1 = 1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    96/425

    1

    fib(4) ;

    fib(3) ;

    fib(2) ;

    fib(2) ;

    fib(1) ;

    fib(0) ;

    fib(0) ;

    fib(1) ;

    fib(1) ;

    2

    1

    1

    0

    1

    0

    Algorithmique et programmation   IN101

    François Pessaux francois pessaux@ensta paristech fr ENSTA 92/1

    Appels récursifs multiples: déroulement

    F n  = F n−1 + F n−2  et  F 0 = 0, F 1 = 1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    97/425

    1fib(4) ;

    fib(3) ;

    fib(2) ;

    fib(2) ;

    fib(1) ;

    fib(0) ;

    fib(0) ;

    fib(1) ;

    fib(1) ;

    3

    2

    1

    1

    0

    1

    0

    1

    Algorithmique et programmation   IN101

    F ançois Pessa  [email protected]

    ENSTA 93/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    98/425

    Fonctions mutuellement récursivesPlusieurs fonctions s’appelant mutuellement.Pas d’ordre (ni partiel, ni total) de précédence de définition.

    f d fi “ ”

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    99/425

    Sont en fait définies  “en même”  temps.En C, (comme dans beaucoup de langages): toutes les fonctions sontimplicitement mutuellement récursives (si besoin).

    # i n c l u d e   < s t d b o o l . h>

    b oo l n at ur al _ ev en ( u ns ig ne d i n t   n ){i f    ( n == 0)   r e t u r n   ( t r u e ) ;e l s e r e t u r n   ( n a t ur a l _ od d ( n   −   1) ) ;

    }

    b o ol n at ur al _o dd ( u ns ig ne d i n t   n )

    {i f    ( n == 0)   r e t u r n   ( f a l s e ) ;e l s e r e t u r n   ( n a t ur a l _ e ve n ( n   −   1 ) ) ;

    }

    Algorithmique et programmation   IN101

    F i P  [email protected]

    ENSTA 95/1

    “Récursion, boucles, ça se termine quand ?”

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    100/425

    Pour obtenir un résultat, un calcul doit terminer.

    Boucle avec condition d’arrêt toujours fausse ⇒ boucle “infinie”.

    Récursion avec cas de base (≡ condition d’arrêt) jamais atteint ⇒récursion “infinie”.

    Dans ces cas . . . on peut attendre longtemps.

    La terminaison est une propriété très importante.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 96/1

    Le problème de l’arrêt

    Un programme pour déterminer l’arrêt de programmes ?

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    101/425

    p g p p g

    Halt (prog , data) =   Vrai    Si  prog  avec les données  data s’arrêteFaux    SinonUn programme:

    Hic (prog ) =   Boucler si Halt (prog, prog) = VraiTerminer sinon

    Hic (Hic )   →   ?Termine si  Hic  ne termine pas et ne termine pas si  Hic  termine

    Dans les 2 cas: contradiction → hypothèse initiale fausse.

    Impossibilité de programmer un prédicat de test d’arrêt: problèmeindécidable.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 97/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    102/425

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    103/425

    Appel(s) de fonction(s)

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 99/1

    Déroulement d’un appel de fonction

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    104/425

    Illustration sur le calcul de la racine carrée d’un réel  a.

    Méthode itérative de Newton.√ a donnée par  x n+1 =  12(x n +   ax n )

    n: Nombre d’itérations (à fixer arbitrairement).x 0 > 0 : Point de départ (à fixer arbitrairement).

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 100/1

    Protocole d’appel

    A l f i ’

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    105/425

    Appeler une fonction c’est:▸  stocker la valeur de ses paramètres,▸  aller exécuter son code,▸  et en revenir avec le résultat.

    Différentes conventions d’appel selon les langages, les architectures.

    Principe restant majoritairement le même: utilisation de la pile.Différences dans “qui (appelant/appelé) fait quoi”.

    Différences dans l’agencement mémoire d’informations (registres vspile).

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 101/1

    Protocole d’appel de manière générique

    Côté appelant:▸  Évaluation des arguments à passer → mis sur la

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    106/425

    g p

    pile.▸  Adresse de retour mise sur la pile.

    Côté appelé:▸  Réservation des variables locales sur la pile.▸  Exécution du code.

    ▸  Stockage de la valeur à retourner (en registre oupile).

    ▸   Aller . . . à l’adresse de retour.

    Côté appelant:▸  Récupérer la valeur retournée par l’appelé.▸  Supprimer de la pile les arguments passés lors de

    l’appel.

    1

    var locale

    arg

    arg

    ...

    var locale

    @ retour

       C  r  o   i  s  s  a  n  c  e   d  e   l  a  p   i   l  e

    var locale

    ...  A

      p  p e l    é  

    A  p  p e l    a n t  

    m

    1

    2

    arg n

    2

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 102/1

    Déroulement d’un appel de fonction1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {i t i

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    107/425

    Pile

    nb_iters 15

    ???

    2.0

    res

    v m a i   n

    4   i n t   i ;5   d o u b l e   xn = X0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5 ∗ ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11  i n t main

      ( ) {12   int nb_iters = 15 ;13    double res, v = 2.0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Définition et initialisation des variables locales de  main

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 103/1

    Déroulement d’un appel de fonction1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4 i n t i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    108/425

    Pile

    nb_iters 15

    ???

    2.0

    res

    v m a i   n

    a 2.0

    15max_iter

    ligne 14  s   q ur 

    4   i n t   i ;5   d o u b l e   xn = X0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5 ∗ ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14     r e s =  squr (v, nb_iters) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Appel de la fonction  squr

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 104/1

    Déroulement d’un appel de fonction1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4 int i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    109/425

    Pile

    nb_iters 15

    ???

    2.0

    res

    v m a i   n

    a 2.0

    15max_iter

    ligne 14  s   q ur 

    i

    xn

    ???

    3.0

    4   int i ;5    double xn = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5 ∗ ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Définition et initialisation des variables locales de  squr

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 105/1

    Déroulement d’un appel de fonction

    Pil

    1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4 i n t i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    110/425

    Pile

    nb_iters 15

    ???

    2.0

    res

    v m a i   n

    a 2.0

    15max_iter

    ligne 14  s   q ur 

    i

    xn 1.414998

    2

    4   i n t   i ;

    5   d o u b l e   x n = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7     xn = 0.5  * (xn + (a / xn)) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Itérations de la boucle (ici   i  = 2,  xn = 1.41499)

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 106/1

    Déroulement d’un appel de fonction

    Pil

    1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4 i n t i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    111/425

    Pile

    nb_iters 15

    ???

    2.0

    res

    v m a i   n

    a 2.0

    15max_iter

    ligne 14  s   q ur 

    i

    xn 1.414214

    15

    4   i n t   i ;5   d o u b l e   x n = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5   ∗   ( xn + ( a / xn ) ) ;8    return (xn) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Sortie de la boucle, prêt à retourner de la fonction  squr

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 107/1

    Déroulement d’un appel de fonction

    Pile

    1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4   i n t   i ;

    d o u b l e

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    112/425

    nb_iters 15

    ???2.0

    resv m

     a i   n

    a 2.0

    15max_iter

    ligne 14  s   q ur 

    5  d o u b l e

      x n = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5   ∗   ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {

    12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Retour de la fonction: suppression des variables locales, retourner àl’adresse spécifiée sur la pile

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 108/1

    Déroulement d’un appel de fonction

    Pile

    1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4   i n t   i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    113/425

    Pile

    nb_iters 15

    1.414214

    2.0

    res

    v m a i   n

    5   d o u b l e   x n = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5   ∗   ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14     res =   s q ur ( v , n b _i t e rs ) ;15   p r i n t f ( " s q r t (% f ) = %f \ n" , v , r e s ) ;16   r e t u r n   ( 0 ) ;17   }

    Affectation de la valeur de retour de la fonction  squr

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 109/1

    Déroulement d’un appel de fonction

    Pile

    1   # d e f i n e   X 0 ( 3 . 0 )   // Germe : q u e l c o n q ue > 0  2

    3   d o u b l e   s q ur ( d o u b l e   a ,   i n t   m a x _ i t e r ) {4   i n t   i ;

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    114/425

    Pile

    nb_iters 15

    1.414214

    2.0

    res

    v m a i   n

    "sqrt (%f)..." 

    1.414214

    2.0

    format

    arg[1]

    arg[2]

    ligne 15

      pr i   n t  f   

    5   d o u b l e   x n = x0 ;6   f o r   ( i = 0 ; i < m ax _i te r ; i ++)7   xn = 0 . 5   ∗   ( xn + ( a / xn ) ) ;8   r e t u r n   ( xn ) ;9   }

    10

    11   i n t main   ( ) {12   i n t   n b_ i te r s = 15 ;13   d o u b l e   r e s , v = 2. 0 ;14   r e s = s qu r ( v , n b_ i t e rs ) ;15    printf ("sqrt (%f) = %f\n", v, res) ;16   r e t u r n   ( 0 ) ;17   }

    Appel à la fonction  printf . . . etc . . .

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 110/1

    Appels de fonctions récursives

    Rappel: une fonction récursive se rappelle elle-même.

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    115/425

    Principe d’appel identique à ce que l’on vient de voir.▸  À chaque appel on empile les informations nécessaires.▸  Lorsque l’on sort d’un appel, on dépile.

    ⇒ La pile augmente avec la profondeur de récursion.

    En cas de récursion trop profonde, possibilité de dépassement de pile

    (“stack overflow” ).Pour autant la récursivité n’est pas à banir !

    ▸  Permet d’exprimer simplement et élégamment certains algorithmes.▸  Incontournable pour certains problèmes (sinon, obligation de se gérer

    manuellement une pile en fait).▸  Les compilateurs savent dé-récursiver la récursion terminale !

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 111/1

    Déroulement d’appels de fonction récursive

    Pile1   unsigned int fact (unsigned int n)2   {

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    116/425

    f    a  c  t  

    i 4

    4

    ligne 10

    n m a i   n

    f    a  c  t  

    ligne 4

    3n

    n 2

    n

    ligne 4

    1

    ligne 4

    f    a  c  t  

    f    a 

     c  t  

    f    a  c  t  

    ligne 4

    n 0

    3   i f    (n == 0 )   r e t u r n   ( 1 ) ;4   e l s e r e t u r n   ( n   ∗   f a c t ( n   −   1 ) ) ;5   }6

    7   i n t main   ( )8   {9   u ns ig ne d i n t   i = 5 ;

    10   p r i n t f ( " F a ct (%d )=%d \n " , i , f a c t ( i ) ) ;11   r e t u r n   ( 0 ) ;12   }

    État de la pile à l’entrée de l’appel à  fact

    avec l’argument 0.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 112/1

    Déroulement d’appels de fonction récursive

    Pile1   u ns ig ne d i n t   f a c t ( u ns ig ne d i n t   n )2   {

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    117/425

    f    a  c  t  

    i 4

    4

    ligne 10

    n m a i   n

    f    a  c  t  

    ligne 4

    3n

    n 2

    n

    ligne 4

    1

    ligne 4

    f    a  c  t  

    f    a 

     c  t  

    3   i f    (n == 0 )   r e t u r n   ( 1 ) ;4     e l s e r e t u r n   ( n  * fact (n - 1) ) ;5   }6

    7   i n t main   ( )8   {9   u ns ig ne d i n t   i = 5 ;

    10   p r i n t f ( " F a ct (%d )=%d \n " , i , f a c t ( i ) ) ;11   r e t u r n   ( 0 ) ;12   }

    État de la pile au retour de l’appel à  fact avec

    l’argument 0.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 113/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    118/425

    Les tableaux

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 114/1

    Limite des types de base

    1 variable   ≈ 1 case mémoire.

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    119/425

    Par exemple 1 point d’image ARBG (alpha-rouge-vert-bleu):

    bleu

    T T T T R R R R G G G G B B B B 32 bits

    transparence rouge vert

    1 image 1024×

    768 = 786432 cases mémoires 32 bits.Déclaration de 786432 variable ?  

    ⇒ Types de base insuffisants pour manipuler de grandes quantités dedonnées.

    ⇒ Besoin de structures de données.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 115/1

    “Dessine-moi un tableau. . . ” 

    Tableau =▸

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    120/425

     ensemble de  “cases”  mémoire consécutives,▸   du même type,▸   dénoté par un seul nom de variable.

    Accès à 1 case particulière (“élément”) par indexation:   t[3].

    Le type d’un élément détermine la taille d’une “case”.

    ⇒ Si on connait où se trouve la 1ère “case” , (“base”) on trouvefacilement l’endroit où se trouve la ième “case”  en mémoire.

    Numérotation des cases (“indices”) commence à 0 !

    Élémenti  à l’octet: “base” + i × taille d’un élément.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 116/1

    Quand utiliser un tableau ?

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    121/425

    Besoin de grouper plusieurs données de même type.Besoin d’accéder rapidement (tps constant) à n’importe quel élément.

    Chaque élément est identifié par son indice (place) dans le tableau.

    Pas (peu) de trous entre les éléments effectifs.

    ⇒ Un tableau est une structure:▸   Homogène.▸   Dense.▸  À accès direct par indexation entière.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 117/1

    “Tableaux et mémoire”

    Deux sortes de tableaux:▸   Statiques : taille connue à la compilation.

    → gérés à la compilation comme des variables  “standard” .

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    122/425

    ▸   Dynamiques: taille déterminée à l’exécution.→ Nécessite une primitive ou un fonction d’allocation de mémoire.⇒ Cours ultérieur: uniquement des tableaux statiques pour commencer.

    dyn[0] dyn[1] dyn[2] dyn[3]

    Mémoire

    Pile Tas

    dyn

    sta[0]

    sta[2]

    sta[1]

    i 4

      s   t  a

    i n t   i ;/∗ B la b l a . . . i    ←   4 ∗/ / ∗ D yn amiq ue . ∗ /  i n t   dyn [ ] = « a l l o u e r i c as es »/∗ S t a t i q u e . ∗/  i n t   s t a [ 3 ] ;

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 118/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    123/425

    Initialisation de tableaux

    Lorsqu’on déclare un tableau, il n’est pas initialisé.

    Il contient  “ce qu’il y avait dans la mémoire” .

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    124/425

    Comme pour les autres variables, il faut l’initialiser:⇒ donner une valeur à chaque case.Initialisation case par case:

    f l o a t   t [ 3 ] ;t [ 0 ] = 1 . 0 ;

    t [ 1 ] = 1 . 5 ;t [ 2 ] = 2 . 0 ;

    Tableaux statiques: on peut initialiser d’un coup à la définition:

    f l o a t   t [ 3 ] = { 1 .0 , 1 . 5 , 2 . 0 } ;

    t = { 2.0, 4.7 } ; ne marche pas !

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 120/1

    Parcours de tableaux

    Un tableau étant une zone contigue indexée, il est naturel d’utiliserune boucle pour le parcourir.Boucle sur les indices de 0 à  “taille du tableau  −1” .

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    125/425

    i n t   t [ SIZE ] ;i n t   i =   0   ;w h i l e   ( i   < SIZE ; i ++) {

    d o _s o me t hi n g ( t [ i ] ) ;i++ ;

    }

    Exemple: initialisation

    i n t   t [ SIZE ] ;i n t   i ;f o r   ( i =   0 ; i   < SIZE ; i ++) t [ i ] = i   ∗   i ;   /∗ t [ i ] =    i 2 . ∗/ 

    Boucle  for très pratique !

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 121/1

    Petit retour sur les chaînes de caractères  string

    En C: chaîne = un tableau de caractères. . .

    . . . terminé par le caractère ’\0’.

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    126/425

    str.c# i n c l u d e   < s t d i o . h>i n t main   ( ){

    i n t   i ;c h a r   f o o [ ] = " s t u p e f i x " ;f o r   ( i = 0 ; f o o [ i ] != ’ \ 0 ’ ; i ++)

    p r i n t f ( "%c " , f oo [ i ] ) ;p r i n t f ( "\n" ) ;

    r e t u r n   ( 0 ) ;

    }

     mymac:/tmp$ gcc str.c -o str mymac:/tmp$ ./str

    s t u p e f i x

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 122/1

    Tableaux à plusieurs dimensions

    U i i d l d

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    127/425

    Une image est une partie de plan: coordonnées  x   et  y .Espace à 2 dimensions ⇒ structure 2 D ⇒ tableau à 2 dimensions.

    type nom  [   taille 1   ][  taille 2   ] ;

    Accès par indexation sur les 2 dimensions: t [x ][ y] = ... ;

    Généralisable à  n dimensions:   int   t [3][2][6][7][4] ;Tailles de tableaus statiques: connues à la compilation.

    Tableaux dynamiques: subtilités d’initialisation, on verra plus tard.

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 123/1

    Tableaux statiques à plusieurs dimensionsst_array.c

    # i n c l u d e   < s t d i o . h>#define X (4)#define Y (3)

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    128/425

    i n t main   ( ){

    i n t   x , y ;i n t   c[X][Y]   ;   / ∗ S t a t i q u e / ∗/  

    f o r   ( x = 0 ; x < X ; x++) {f o r   ( y = 0 ; y < Y ; y++)

    c [ x ] [ y ] = x + y ;}

    f o r   ( x = 0 ; x < X ; x++) {f o r   ( y = 0 ; y < Y ; y++)

    p r i n t f ( "%d " , c [ x ] [ y ] ) ;p r i n t f ( "\n" ) ;}r e t u r n   ( 0 ) ;

    }

     mymac:/tmp$ gcc st_array.c -o st_array

     mymac:/tmp$ ./st_array

    c:

    0 1 21 2 3

    2 3 4

    3 4 5

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 124/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    129/425

    Quelques remarques sur  argv (1)

    Déterminer le nombre d’éléments pour savoir jusqu’où aller dans  argv.

    → Utilisation de la valeur de  argc.

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    130/425

     mymac:/tmp$ ./args bar gee 42

    ’b’ ’a’ ’r’

    ’g’ ’e’ ’e’

    ’2’’4’

    Pile

    Mémoire

    Tas

    argv[0]

    argv[1]

    argv[2]

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 126/1

    Quelques remarques sur  argv (2)

    argv contient uniquement des chaînes de caractères.

    O pe t pa fois ece oi des omb es e a me ts

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    131/425

    On peut parfois recevoir des nombres en arguments.⇒ Nécessité de conversion chaîne → nombre.

    Nécessite une transformation algorithmique, et non un changement“simple” de regarder la zone mémoire !

    Fonctions à disposition (requièrent #include ):▸   atoi  : string → int▸   atol  : string → long int▸   atoll  : string → long long int▸   atof  : string → float

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 127/1

    Quelques remarques sur  argv (3)

    string-to-nums.c# i n c l u d e   < s t d i o . h>

    # i n c l u d e < s t d l i b h> /* Pour accéder a atoXXX */

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    132/425

    # i n c l u d e   < s t d l i b . h>   / Pour accéder a atoXXX /i n t main   ( i n t   argc ,   c h a r   ∗ ar gv [ ] ){

    i n t   i = a t o i ( a r g v [ 1 ] ) ;l o n g   l = a t o l ( a r g v [ 2 ] ) ;l on g l on g   l l = a t o l l ( a r g v [ 3 ] ) ;f l o a t   f = a t o f ( a rg v [ 4 ] ) ;

    p r i n t f ( " i : %d , l : %l d , l l : %l l d , f : %f \ n" , i , l , l l , f ) ;r e t u r n   ( 0 ) ;

    }

     mymac:/tmp$ gcc -Wall string-to-nums.c

     mymac:/tmp$ ./a.out 1 2 4559924234322424 4.5i: 1, l: 2, ll: 4559924234322424, f: 4.500000

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 128/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    133/425

    Phases de construction d’un exécutable

    Algorithmique et programmation   IN101

    François Pessaux ,   [email protected], ENSTA 129/1

    http://find/

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    134/425

    L’analyse lexicale (lexical analysis, lexing)

    Découper le texte source en mots du langage.

    Mots de C:   if  ,   int ,   else ,   break,  switch . . .

    Mots (lexèmes) = suite de caractères

  • 8/19/2019 2015_10_14_IN1gh01-allslides-2012-2013

    135/425

    Mots (lexèmes) = suite de caractères.

    ∃ plusieurs catégories de lexèmes: littéraux, mots-clefs, ponctuation,identificateurs, “blancs” . . .

    Mots décrits par des expression