algo-à-c.pdf

37
Algorithmique... De l’algorithmique au C Nicolas Delestre [email protected] Michel Mainguenaud [email protected] INSA de Rouen De l’algorithmique au C - v1.1 – p. 1

Upload: sanaa-usthb

Post on 22-Nov-2015

3 views

Category:

Documents


0 download

TRANSCRIPT

  • Algorithmique...

    De lalgorithmique au C

    Nicolas [email protected]

    Michel [email protected]

    INSA de Rouen

    De lalgorithmique au C - v1.1 p. 1

  • Plan...Notes

    Un langage compil

    Un langage bas sur desmodules

    Traduire les types de bases

    Traduire les constantes

    Traduire les oprateurs usuels

    Traduire les instructionssimples et composes

    Traduire les conditionnelles

    Traduire les itratifs

    Les pointeurs

    Traduire les fonctions et lesprocdures

    Traduire lire ou crire

    Traduire un programme

    Un exemple

    De lalgorithmique au C - v1.1 p. 2

  • Notes...Ce cours nest pas un cours prsentant tous les concepts du CIl prsente seulement la manire de traduire proprement un programmealgorithmique en programme CVous ne trouverez donc pas dans ce cours toutes les subtilits du C, maisvous pouvez vous rfrer des cours sur le langage C aux adressessuivantes :

    http://www.enstimac.fr/~gaborit/lang/CoursDeC/

    http://www-rocq.inria.fr/codes/Anne.Canteaut/COURS_C/

    http://www-ipst.u-strasbg.fr/pat/program/tpc.htm

    http://www710.univ-lyon1.fr/~bonnev/CoursC/CoursC.html

    . . .

    De lalgorithmique au C - v1.1 p. 3

  • Un langage compil...Le C est un langage compil

    Les compilateurs C transforment un programme C (fichier suffix par .c) enprogramme objet (fichier suffix par .o) en deux phases :

    1. Le prprocesseur agit sur les macros (commandes prcdes dun #) ettransforme le code source C en un autre code source C (ne contenant plusaucune macro) en remplaant le code macro par son valuation

    Par exemple si le code C contient linstruction #define PI 3.14159, le prprocesseur remplacera

    dans le code source la chane de caractres PI par la chane de caractres 3.14159 partir de la

    position du #define

    2. Le compilateur transforme ce deuxime code source C en programme machine(nomm code objet)

    Sous Linux (et gnralement sous unix), on utilise le compilateur gcc (GNUC Compiler) avec loption -c pour compiler

    De lalgorithmique au C - v1.1 p. 4

  • Un langage compil...Par exemple pour compiler le programme helloworld.c suivant (dont onexpliquera le contenu plus tard), il faut taper gcc -c helloworld.c, on obtientalors le fichier helloworld.o# i n c l u d e < s t d i o . h>

    i n t main ( ) {p r i n t f ( " H e l l o wor ld \ n " ) ;

    }

    De lalgorithmique au C - v1.1 p. 5

  • Un langage bas sur des modules...Le langage C utilise le concept de module (ou de librairie) qui permet decrer et dutiliser des bibliothques de fonctions qui peuvent tre utilisesdans plusieurs programmes

    De ce fait, le code objet produit par le compilateur nest pas un programmeexcutable car il utilise certainement des fonctions dfinies dans des modules

    Pour le rendre excutable il faut le lier aux modules adquates : cest ce quelon nomme ldition des liens (ou linkage)Cette dition des liens seffectue toujours avec gcc (sans option) suivi descodes objets du programme et des modules (non standards) utiliss

    De lalgorithmique au C - v1.1 p. 6

  • Un langage bas sur des modules...Par exemple pour linker helloworld.o on tape gcc helloworld.o

    Il ny a que helloworld.o car le seul module utilis est le module stdio.hqui est un module standard

    Le programme excutable a.out est alors cr

    Si la place de lexcutable a.out, on veut obtenir lexcutable helloworld ilfaut utiliser loption -o suivi du nom du fichier excutable dsir (ici -ohelloworld)

    Remarque :

    Si le programme nutilise aucune librairie non standard, on peut compileret linker directement en utilisant gcc suivi du fichier C (avecoptionnellement loption -o), par exemple :

    gcc -o helloworld helloworld.cDe lalgorithmique au C - v1.1 p. 7

  • Traduire les types simples...Le C propose les types simples suivants :

    int, long, short, float, double, charOn peut donc suivre les rgles de traduction suivantes :

    Algorithmique C

    Entier,Naturel int, long, short

    Rel float, double

    Caractre char

    Boolen int (1=Vrai, 0=Faux)

    Chane de caractres Voir cours sur les tableaux

    De lalgorithmique au C - v1.1 p. 8

  • Traduire les constantes...Pour traduire les constantes entires, le C propose trois notations :

    1. La notation dcimale, en base dix, par exemple 379

    2. La notation octale, en base huit, qui doit commencer par un zro parexemple 0573

    3. Le notation hexadcimale, en base seize, qui doit commencer par un zrosuivi dun x (ou X), par exemple 0X17B (ou 0x17B, 0X17b, 0x17b)

    Les constantes caractres sont entoures de quote, par exemple a

    Certains caractres (les caractres non imprimables, avec un code ASCIIinfrieur 32, le \, le ) ne sont utilisables quen prfixant par un \:

    le code ASCII du caractre (exprim en octal), par exemple \001

    un caractre tel que \n, \t, \\, \

    De lalgorithmique au C - v1.1 p. 9

  • Traduire les constantes...Pour les constantes relles, on utilise le . pour marquer la virgule et lecaractre e suivi dun nombre entier, ici a, pour reprsenter 10a, parexemple :

    2. , .3, 2e4, 2.3e4

    les constantes chane de caractres doivent tre entoures de guillemet, parexemple "une chaine"

    Par dfaut le compilateur ajoute la fin de la chane de caractres \0,qui est le marqueur de fin de chane

    Il ny a pas de constante nomme en C, il faut utiliser la commande#define du prprocesseur

    De lalgorithmique au C - v1.1 p. 10

  • Traduire les oprateurs...On traduit les oprateurs en respectant les rgles suivantes :

    Algorithmique C

    =

    =, 6= ==, !=

    , =

    et, ou, non &&, ||, !

    +, -, *, / +, -, *, /

    div, mod /, %

    De lalgorithmique au C - v1.1 p. 11

  • Traduire les oprateurs...Les oprateurs unaires ++ et sont des oprateurs particuliers quipeuvent avoir jusqu deux effets de bord:

    En dehors de toute affectation, elle incrmente loprande associe, parexemple

    i++ et ++i sont quivalents i=i+1

    Lorsquils sont utiliss dans une affectation, tout dpend de la position deloprateur par rapport loprande, par exemple :

    j=i++ est quivalent j=i;i=i+1;j=++i est quivalent i=i+1;j=i;

    De lalgorithmique au C - v1.1 p. 12

  • Les instructions...Il existe deux types dinstructions en C :

    Les instructions simples (expression, appel de fonction, etc.)Elles finissent toujours par un ;Par exemple :

    a=a +1;

    Les instructions composes qui permettent de considrer unesuccession dinstructions comme tant une seule instruction

    Elles commencent par { et finissent par }Par exemple :

    { a=a +1; b=b +2;}

    De lalgorithmique au C - v1.1 p. 13

  • Traduire les variables...On dclare en C une variable en la prcdant de son type, par exemple :

    i n t a ;f l o a t x ;char c ;

    Une variable globale est dfinie en dehors de toute fonctionSa porte est le fichier o elle est dfinie partir de sa dfinition (pasau dessus)

    Une variable locale est dfinie lintrieur dune fonctionSa porte est uniquement la fonction ou elle a t dfinie

    De lalgorithmique au C - v1.1 p. 14

  • Les conditionnelles...Linstruction si...alors...sinon est traduit par linstruction if,qui a la syntaxe suivante :

    i f ( c o n d i t i o n )/ / i n s t r u c t i o n ( s ) du i f

    [ e l s e/ / i n s t r u c t i o n ( s ) du e l s e

    ]

    Par exemple :

    i f ( a

  • Les conditionnelles...Remarque :

    Lorsquil y ambiguit sur la port du else dune instruction if, leelse dpend toujours du if le plus prochePar exemple :

    i f ( a>b ) i f ( cb )i f ( cb ) {i f ( c

  • Les conditionnelles...Linstruction cas..o est traduite par linstruction switch, qui a lasyntaxe suivante :

    s w i t c h ( l e S e l e c t e u r ) {c a s e c a s 1 :

    / / i n s t r u c t i o n ( s ) du cas 1break ;

    c a s e c a s 2 :/ / i n s t r u c t i o n ( s ) du cas 2break ;

    . . .d e f a u l t :

    / / i n s t r u c t i o n ( s ) du d e f a u l t}

    De lalgorithmique au C - v1.1 p. 17

  • Les conditionnelles...Par exemple :s w i t c h ( c h o i x ) {

    case t : p r i n t f ( " vous v o u l e z un t r i a n g l e " ) ; break ;case c : p r i n t f ( " vous v o u l e z un c a r r e " ) ; break ;case r : p r i n t f ( " vous v o u l e z un r e c t a n g l e " ) ; break ;d e f a u l t : p r i n t f ( " e r r e u r . recommencez ! " ) ;

    }

    De lalgorithmique au C - v1.1 p. 18

  • Traduire les itrations...Linstruction Pour est traduite par linstruction for, qui a la syntaxesuivante :f o r ( i n i t i a l i s a t i o n ;

    c o n d i t i o n _ d _ a r r e t ;o p e r a t i o n _ e f f e c t u e _ _ c h a q u e _ i t r a t i o n )

    i n s t r u c t i o n ;

    Par exemple :

    f o r ( i =0 ; i

  • Traduire les itrations...Linstruction Tant...que est traduite par linstruction while, qui a lasyntaxe suivante :

    whi le ( c o n d i t i o n )i n s t r u c t i o n ;

    Par exemple :

    i =0 ;whi le ( i

  • Traduire les itrations...Linstruction rpter est traduite par linstruction do..while, qui a lasyntaxe suivante :

    doi n s t r u c t i o n ;

    whi le ( c o n d i t i o n ) ;

    Par exemple :

    i =0 ;do {

    p r i n t f ( "%d \ n " , i ) ;i ++;

    } whi le ( i

  • Les pointeurs...Lorsque lon dclare une variable, par exemple un entier i, lordinateurrserve un espace mmoire pour y stocker les valeurs de iLemplacement de cet espace dans la mmoire est nomm adresse

    Dans lanalogie de larmoire que nous avons vu dans un coursprcdent, ladresse correspond au numro du tiroir

    Un pointeur est une variable qui permet de stocker une adressePar exemple si on declare une variable entire i (initialise 10) et quelon dclare un pointeur p dans lequel on range ladresse de i (on dit que ppointe sur i), on a par exemple le schma suivant :

    i p

    124

    10Mmoire :

    226

    124

    De lalgorithmique au C - v1.1 p. 22

  • Les pointeurs...On dclare une variable de type pointeur en suffixant le type de la variablepointe par le caractre *, par exemple

    i n t i , j ;i n t p ;

    Il existe deux oprateurs permettant dutiliser les pointeurs :& : permet dobtenir ladresse dune variable, permettant donc unpointeur de pointer sur une variable, par exemple

    p=&i ; / / p p o i n t e s u r i

    * : permet de drfrencer un pointeur, cest--dire daccder lavaleur de la variable pointe, par exemple

    p=p +2; / / a j o u t e 2 a ij =p ; / / met l a v a l e u r de i dans j ( donc 12)

    De lalgorithmique au C - v1.1 p. 23

  • Les pointeurs...Par dfaut lorsque lon dclare un pointeur, on ne sait pas sur quoi il pointeComme toute variable, il faut linitialiser

    On peut dire quun pointeur ne pointe sur rien en lui affectant la valeurNULLPar exemple :

    i n t i ;i n t p1 , p2 ;p1=&i ;p2=NULL;

    De lalgorithmique au C - v1.1 p. 24

  • Traduire les fonctions...On dclare une fonction en respectant la syntaxe suivante :t y p e R e t o u r nomFonct ion ( t y p e 1 param1 , t y p e 2 param2 , . . . ) {

    / / v a r i a b l e s l o c a l e s

    / / i n s t r u c t i o n s avec au moins/ / une f o i s l i n s t r u c t i o n r e t u r n

    }

    Par exemple :

    i n t plusUn ( i n t a ) {return a +1;

    }

    De lalgorithmique au C - v1.1 p. 25

  • Traduire les procdures...Il ny a pas de procdure en C

    Pour traduire une procdure, on cre une fonction qui ne retourne pas devaleur, on utilise alors le type void comme type de retour

    Tous les passages de paramtres en C sont des passages de paramtres enentre (on parle de passage par valeur)

    Lorsque lon veut traduire des passages de paramtres en sortie ou enentre/sortie on utilise les pointeurs (on parle de passage de paramtrepar adresse)

    On passe le pointeur sur la variable en lieu et place de la variable

    De lalgorithmique au C - v1.1 p. 26

  • Passage de paramtre par valeur...

    i n t c a r r e ( i n t x ) {return ( xx ) ;

    }

    void exemple ( ) {i n t i = 3 ;i n t j ;

    j = c a r r e ( i ) ;p r i n t f ( "%d " , j ) ;

    }

    exemple carre

    Avant appel i = 3de carre j = ?

    Appel i = 3 x = 3de carre j = ?

    Aprs appel i = 3de carre j = 9 9

    copie

    retour

    De lalgorithmique au C - v1.1 p. 27

  • Passage de paramtre par adresse...

    void remiseAZero ( i n t p ) {p =0;

    }

    void exemple2 ( ) {i n t i =10;

    remiseAZero (& i ) ;p r i n t f ( "%d " , i ) ;

    }

    exemple carreAvant appel i = 10

    Appel i = 10de remiseAZero &i p = 124

    Aprs appel i = 0de remiseAZero

    i p

    124

    10Mmoire :

    226

    124

    copie

    De lalgorithmique au C - v1.1 p. 28

  • Traduire crire...Linstruction printf (du module stdio.h) permet dafficher desinformations lcranSyntaxe :

    p r i n t f ( " c h a n e de c a r a c t r e s " [ , v a r i a b l e s ] )

    Si des variables suivent la chane de caractres, cette dernire doitspcifier comment prsenter ces variables :

    %d pour les entiers (int, short, long)%f pour les rels (float, double)%s pour les chanes de caractres%c pour les caractres

    La chane de caractres peut contenir des caractres spciaux :\n pour le retour chariot\t pour les tabulations

    De lalgorithmique au C - v1.1 p. 29

  • Traduire crire...Par exemple :

    i n t i =1 ;f l o a t x = 2 . 0 ;p r i n t f ( " Bonjour \ n " ) ;p r i n t f ( " i = %d \ n " , i ) ;p r i n t f ( " i = %d , x = %f \ n " , i , x ) ;

    . . . affiche :Bonjouri = 1i = 1, x=2.0

    De lalgorithmique au C - v1.1 p. 30

  • Traduire lire...Linstruction scanf (du module stdio.h) permet lutilisateur desaisir des informations au clavierSyntaxe :

    s c a n f ( " c h a n e de f o r m a t a g e " , p o i n t e u r var1 , . . . )

    La chane de formatage spcifie le type des donnes attendues, parexemple :

    %d pour les entiers (int, short, long)%f pour les rels (float, double)%s pour les chanes de caractres

    %c pour les caractres

    De lalgorithmique au C - v1.1 p. 31

  • Traduire lire...Par exemple :

    i n t i ;f l o a t x ;s c a n f ( "%d%f " ,& i ,&x ) ;

    De lalgorithmique au C - v1.1 p. 32

  • Traduire les programmes...Le programme principal en C est une fonction (comme une autre) dont lenom est main et son type de retour est int

    Programme nom du programmeDfinition des constantesDfinition des typesDclaration des variables principalesDfinition des sous-programmes

    dbutinstructions du programme principal

    fin

    / / i n c l u r e l e s l i b r a i r i e s (# i n c l u d e )/ / d e f i n i r l e s c o n s t a n t e s (# d e f i n e )/ / d e f i n i r l e s t y p e s/ / d e f i n i r l e s f o n c t i o n si n t main ( ) {

    / / d e c l a r e r l e s v a r i a b l e s du/ / programme p r i n c i p a l/ / i n s t r u c t i o n s

    }

    De lalgorithmique au C - v1.1 p. 33

  • Un exemple...Nous allons traduire le programme suivant :Programme NombrePremier

    Dclaration n : Entier; c : Caractrefonction estPremier (a : Entier) : Boolen

    dbutrpter

    crire(Entrez un entier :)lire(n)si estPremier(n) alors

    crire(n," est premier")sinon

    crire(n," nest pas premier")finsirpter

    crire("Voulez vous tester un autre nombre (O/N) :")lire(c) ;

    jusqu ce que c=O ou c=o ou c=n ou c=Njusqu ce que c=n ou c=N

    fin

    De lalgorithmique au C - v1.1 p. 34

  • Un exemple...avec :fonction estPremier (a : Entier) : Boolen

    Dclaration i : Entier

    dbuti 2tant que i

  • Un exemple...Le programme C correspondant :

    # inc lude < s t d i o . h>

    i n t e s t P r e m i e r ( i n t a ) {i n t i =2 ;whi l e ( ( i

  • Un exemple...

    p r i n t f ( "%d n e s t pas p r e m i e r \ n " , n ) ;do {

    p r i n t f ( " Voulez vous t e s t e r un a u t r e nombre (O/N) : " ) ;s c a n f ( "%c " ,&c ) ;

    } whi l e ( c != o && c != O && c != n && c != N ) ;} whi l e ( c != n && c != N ) ;

    }

    De lalgorithmique au C - v1.1 p. 37

    Algorithmique...Plan...Notes...Un langage compil...Un langage compil...Un langage bas sur des modules...Un langage bas sur des modules...Traduire les types simples...Traduire les constantes...Traduire les constantes...Traduire les oprateurs...Traduire les oprateurs...Les instructions...Traduire les variables...Les conditionnelles...Les conditionnelles...Les conditionnelles...Les conditionnelles...Traduire les itrations...Traduire les itrations...Traduire les itrations...Les pointeurs...Les pointeurs...Les pointeurs...Traduire les fonctions...Traduire les procdures...Passage de paramtre par valeur...Passage de paramtre par adresse...Traduire commandeAlgo {crire}...Traduire commandeAlgo {crire}...Traduire commandeAlgo {lire}...Traduire commandeAlgo {lire}...Traduire les programmes...Un exemple...Un exemple...Un exemple...Un exemple...