LangageC FSB Imp

Embed Size (px)

Citation preview

  • 7/26/2019 LangageC FSB Imp

    1/81

    Pr. EDDAOUI AHMED

  • 7/26/2019 LangageC FSB Imp

    2/81

    1- Edition du programme source, l'aide d'un diteur (traitement de textes). Lenom dufichier contient l'extension .C, exemple: EXI_1.C (menu edit ).2- Compilation du programme source, c'est dire cration des codes machinedestins aumicroprocesseur utilis. Le compilateur indique les erreurs de syntaxe mais ignore lesfonctions-bibliothque appeles par le programme.Le compilateur gnre un fichier binaire, non listable, appel fichier objet: EXI_1.OBJ(commande compile ).3- Editions de liens: Le code machine des fonctions-bibliothque est charg,cration d'unfichier binaire, non listable, appel fichier executable: EXI_1.EXE (commande build all).

    4- x cu on u programme.Les compilateurs permettent en gnral de construire des programmes composs deplusieursfichiers sources, d'ajouter un programme des units dj compiles ...

    2

  • 7/26/2019 LangageC FSB Imp

    3/81

    Structure dun programme C#include

    void main (){

    .

    }

    variables. Une fonction est elle-mme constitue d'une

    squence d'instructions qui indiquent les oprations effectuer alors que les variables mmorisent les valeurs

    utilises au cours du traitement. Les instructions sontelles-mmes constitues de mots-cls, de variables etdefonctions.

    3

  • 7/26/2019 LangageC FSB Imp

    4/81

    Les noms donns aux variables et fonctions sont cequon appelle des identificateurs.

    Ils doivent commencer par une lettre (majuscule ou

    outre des lettres, des chiffres et le caractre soulign _dans le reste du symbole.

    En langage C, les caractres majuscules et minuscules

    ne sont pas quivalents, ainsi printf() et PRINTF()dsignent deux fonctions diffrentes.

    4

  • 7/26/2019 LangageC FSB Imp

    5/81

    La premire ligne contient la directive #include suivi dunnom de fichier, ici stdio.h, contenant les dclarationsncessaires lutilisation de certaines fonctions.

    Le compilateur dispose ainsi des informations ncessaires

    pour vrifier si lappel de la fonction (en l'occurrenceprintf) est correct.

    A la deuxime ligne la construction main() indique ledbut de dfinition d'unefonction dnomme main.

    Tout programme C comporte au minimum une fonction, la

    fonction main, qui est la fonction principale par laquellecommence lexcution du programme.

    5

  • 7/26/2019 LangageC FSB Imp

    6/81

    Linstruction printfLa fonction printf ne fait pas partie du langage C ausens strict mais d'une bibliothque de fonctions stdio(Standard Input/Output), qui sont toujours fournies

    ,cest ce qui explique la prsence de la directive#include en dbut de programme.

    La fonction printf ne provoque pas de retour la ligne

    aprs la chane de caractres quelle affiche.Pour provoquer un retour la ligne il faut insrersquence spciale \n dans la chane de caractres.

    6

  • 7/26/2019 LangageC FSB Imp

    7/81

    #include void main ()

    {

    printf("Un ");

    " "printf("texte.\n");

    printf("Nouvelle ligne");

    }

    Affichera:Un bout de texte.

    Nouvelle ligne

    7

  • 7/26/2019 LangageC FSB Imp

    8/81

    Les squences d'chappement permettent dereprsenter des caractres non imprimables oudifficiles taper.

    \t pour le caractre de tabulation (tab),

    \b pour le caractre de retour en arrire (backspace),

    - .Ainsi, si lon veut afficher un texte qui contient unguillemet,

    on ne peut pas simplement le mettre dans le texte, caril sert galement indiquer la fin de la chane, on doit

    utiliser la squence d'chappement correspondante:printf(Le guillemet \ delimite les chaines);

    8

  • 7/26/2019 LangageC FSB Imp

    9/81

    Commentaires/* Commentaire

    qui stend sur

    plusieurs lignes */

    // Commentaire sur une ligne

    9

  • 7/26/2019 LangageC FSB Imp

    10/81

    Dclaration de variablesType nom_var;

    Type nom_var=valeur;

    Type nom_var1,nom_var2;

    Diffrents types :

    10

  • 7/26/2019 LangageC FSB Imp

    11/81

    constantes#include

    #define pi 3.1415626

    #define g 9.81

    void main ()

    {

    double rayon, diametre;

    rayon = 15.0;

    diametre = 2*pi*rayon;

    }

    11

  • 7/26/2019 LangageC FSB Imp

    12/81

    Affichage des variablesla fonction printf a besoin de savoir quel est le type de cesvariables

    (entier, f lottant, simple caractre, etc...) et quel formatd'affichage utiliser (combien afficher de chiffres aprs la virgule,

    utiliser la notation dcimale habituelle ou la notationscientifique en puissances de 10, complter les nombres troppetits par des espaces ou des zros gauche, etc...) Ces deuxinformations, type des variables afficher et format d'affichagesont indiques au moyen de squences de caractres spciales,appeles spcificateurs de format, insres dans la chane de

    caractres passe comme premier paramtre la fonction printf.Ainsi linstruction printf(%d,un_entier); affiche le contenu dela variable un_entier sur lcran.

    12

  • 7/26/2019 LangageC FSB Imp

    13/81

    13

  • 7/26/2019 LangageC FSB Imp

    14/81

    Lecture du clavierscanf est un peu le

    symtrique de printf et s'utilise de faon assez similaire. Ainsi, lepremier argument pass scanf doit tre une chane de formatindiquant le type des paramtres suivants.

    #include

    void main ()

    {

    int un_nombre;

    printf("Donnez un nombre: ");scanf("%d", &un_nombre);

    }

    14

  • 7/26/2019 LangageC FSB Imp

    15/81

    structure alternativesi () alors

    finsi

    15

  • 7/26/2019 LangageC FSB Imp

    16/81

    structure alternativeExemple 1

    if (a > b)max = a;

    elsemax = b;

    Exemple 2if A==B

    printf("A est gal B\n");else

    printf("A est diffrent de B\n");

    Exemple 3if (A-B)

    printf("A est diffrent de B\n");else

    printf("A est gal B\n");

    16

  • 7/26/2019 LangageC FSB Imp

    17/81

    structure alternativeExemple 4if (A > B)

    {

    A DE = A; // S A suprieur B Permuter A et C

    = ; non permuter etC = A DE;

    }

    Else

    {

    A DE = B;B = C;

    C = A DE;

    }

    17

  • 7/26/2019 LangageC FSB Imp

    18/81

    structure alternativeLa suite d'instructions

    if (A>B)

    MAX=A;

    else

    MAX=B;

    peut tre remplace par:

    MAX = (A > B) ? A : B;

    18

  • 7/26/2019 LangageC FSB Imp

    19/81

    tructures r p t t ves

    19

  • 7/26/2019 LangageC FSB Imp

    20/81

    tant que en algorithmique

    tant que () faire

  • 7/26/2019 LangageC FSB Imp

    21/81

    exemple

    /* Afficher les nombres de 0 9 */ int = 0;while (

  • 7/26/2019 LangageC FSB Imp

    22/81

    do - while

    22

  • 7/26/2019 LangageC FSB Imp

    23/81

    do - while

    do {Instruction 1;Instruction 2:..}while ( condition );

    La structure do - while est semblable la structure while,avec la diffrence suivante :

    while value la condition avant d'excuter le blocd'instructions,*do - while value la condition aprs avoir excut le bloc

    d'instructions. Ainsi le bloc d'instructions est excut aumoins une fois.

    23

  • 7/26/2019 LangageC FSB Imp

    24/81

    Exemplefloat N;do{

    printf(" ntroduisez un nombre entre 1 et 10 :");scanf("%f", &N);}while (N10);

    nt n, v;printf("Entrez le nombre diviser : ");scanf("%i", &n);do{printf("Entrez le diviseur ( 0) : ");

    scanf("%i", &div);}while (!div);printf("%i / %i = %f\n", n, div, (f loat)n/div);

    24

  • 7/26/2019 LangageC FSB Imp

    25/81

    La structure for en Cfor ( ; ; )

  • 7/26/2019 LangageC FSB Imp

    26/81

    est value une fois avant le passage de la boucle.

    Elle est utilise pour initialiser les donnes de la boucle. est value avant chaque passage de la boucle.Elle est utilise pour dcider si la boucle est rpte ou non. est value la fin de chaque passage de la boucle.Elle est utilise pour rinitialiser les donnes de la boucle.

    Exempleint ;for ( =0 ;

  • 7/26/2019 LangageC FSB Imp

    27/81

    /* notation utilisant for - plus compacte - */ /* prfre par lesexperts en C */ int C, ;

    C=getchar();

    for ( =128 ; >=1 ; C%= , /=2) printf("%i ", C/ );

    * * * - - * *mauvais emploi de la structure */

    int C, ;

    for(C=getchar(), =128; >=1 ;printf("%i ",C/ ),C%=i,i/=2) ;

    27

  • 7/26/2019 LangageC FSB Imp

    28/81

    Instruction switchElle permet dexcuter diffrentes instructions en fonction

    dune expression qui pourra avoir plus de deux valeurs.Une instruction de contrle comme if ne peut valuer quedeux valeurs dune expression: vrai ou faux.Dans le cas o l'on souhaite excuter une action diffrenteselon les diffrentes valeurs possibles d'une variable celaoblige utiliser une cascade de if...else

    28

  • 7/26/2019 LangageC FSB Imp

    29/81

    Exo : faite un programme qui permet de raliser les opration

    mathmatiques (+,-,/,*) de valeurs saisie au clavier.

    #include void main (){char operation;int r, a, b;printf("Entrez un signe d'opration: ");scanf("%c", &operation);a=273; b=158; r=0;if (operation=='+' || operation=='p') r = a + b;else if (operation=='-' || operation=='m') r = a - b;

    else if (operation=='*' || operation=='f') r = a * b;else if (operation=='/' || operation=='d') r = a / b;

    else printf("Non valable: ");printf("%d %c %d = %d\n", a, operation, b, r);}

    29

  • 7/26/2019 LangageC FSB Imp

    30/81

    #include

    void main (){char operation; int r, a, b;printf("Entrez un signe d'opration: "); scanf("%c",&operation);a=273; b=158; r=0;

    switch o erationcase '+':case 'p':r = a + b;break;case '-':case 'm':r = a - b;break;case '*':case 'f':r = a * b;break;case '/':case 'd':r = a / b;break;

    default:printf("Non valable: ");}printf("%d %c %d = %d\n", a, operation, b, r);}

    30

  • 7/26/2019 LangageC FSB Imp

    31/81

    dimension

    31

  • 7/26/2019 LangageC FSB Imp

    32/81

    Les tableaux une dimension

    Dfinitions

    Un tableau (uni-dimensionnel) A est une variablestructure forme d'un nombre entier N de variables

    ,composantes du tableau. Le nombre de composantesN est alors la dimension du tableau.

    En faisant le rapprochement avec les mathmatiques,on dit encore que "A est unvecteurde dimension N"

    32

  • 7/26/2019 LangageC FSB Imp

    33/81

    Exemple

    La dclaration

    int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31};

    n t un ta eau u type nt e mens on 12. es 12composantes sont initialises par les valeursrespectives 31, 28, 31, ... , 31.On peut accder lapremire composante du tableau par JOURS[0], ladeuxime composante par JOURS[1], . . . , la dernirecomposante par JOURS[11].

    33

  • 7/26/2019 LangageC FSB Imp

    34/81

    Dclaration de tableaux en C

    [];

    Les noms des tableaux sont des identificateurs qui

    variables.

    Exemples

    int A[25]; ou bien long A[25];float B[100]; ou bien double B[100];

    int C[10];char D[30];

    34

  • 7/26/2019 LangageC FSB Imp

    35/81

    MmorisationEn C, le nom d'un tableau est le reprsentant del'adresse du premier lment du tableau. Lesadresses des autres composantes sont calcules

    .Exemple:

    short A[5] = {1200, 2300, 3400, 4500, 5600};

    35

  • 7/26/2019 LangageC FSB Imp

    36/81

    Si un tableau est form de N composantes et si unecomposante a besoin de M octets en mmoire, alors letableau occupera de N*M octets.

    Exemple

    En supposant qu'une variable du type long occupe 4octets (c.--d: sizeof(long)=4), pour le tableau T

    dclar par: long T[15];C rservera N*M = 15*4 = 60 octets en mmoire.

    36

  • 7/26/2019 LangageC FSB Imp

    37/81

    Initialisationint A[5] = {10, 20, 30, 40, 50};

    float B[4] = {-1.05, 3.33, 87e-5, -12.3E4};

    int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};

    Il faut que le nombre de valeurs dans la listecorresponde la dimension du tableau. Si la liste necontient pas assez de valeurs pour toutes lescomposantes, les composantes restantes sont

    initialises par zro.

    37

  • 7/26/2019 LangageC FSB Imp

    38/81

    Rservation automatiqueint A[] = {10, 20, 30, 40, 50};

    ==> rservation de 5*sizeof(int) octets (dans notrecas: 10 octets)

    oat = -1.05, 3.33, 7e-5, -12.3 4 ;==> rservation de 4*sizeof(float) octets (dans notrecas: 16 octets)

    int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};

    ==> rservation de 10*sizeof(int) octets (dans notrecas: 20 octets)

    38

  • 7/26/2019 LangageC FSB Imp

    39/81

    Accs aux composantesMAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2;

    int A[5]; dfini un tableau A avec cinq composantes,auxquelles on peut accder par: A[0], A[1], ... , A[4]

    Considrons un tableau T de dimension N:

    l'accs au premier lment du tableau se fait par T[0]

    l'accs au dernier lment du tableau se fait par T[N-1]

    39

  • 7/26/2019 LangageC FSB Imp

    40/81

    Affichage du contenu d'un tableaumain() {int A[5];int ; /* Compteur */

    " "= ,printf("\n");}Affectationmain() {int A[5];

    int ; /* Compteur */for ( =0;

  • 7/26/2019 LangageC FSB Imp

    41/81

    ExercicesSaisir 10 rels, les ranger dans un tableau. Calculer etafficher la moyenne.

    41

  • 7/26/2019 LangageC FSB Imp

    42/81

    Les tableaux deuxdimensions

    42

  • 7/26/2019 LangageC FSB Imp

    43/81

    DfinitionsEn C, un tableau deux dimensions A est interprtercomme un tableau (uni-dimensionnel) de dimension L(ligne)dont chaque composante est un tableau (uni-

    .

    43

  • 7/26/2019 LangageC FSB Imp

    44/81

    Dclaration[][];

    Exemples

    nt 10 10 ; ou en ong 10 10 ; ou en ...float B[2][20]; ou bien double B[2][20]; ou bien ...int C[3][3];char D[15][40];

    44

  • 7/26/2019 LangageC FSB Imp

    45/81

    Mmorisationle nom d'un tableau est le reprsentant de l'adressedu premier lment du tableau (c.--d. l'adresse de lapremire ligne du tableau). Les composantes d'un

    ligne dans la mmoire.

    Exemple: Mmorisation d'un tableau deuxdimensions

    short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}};

    45

  • 7/26/2019 LangageC FSB Imp

    46/81

    Initialisationint A[3][10] ={{ 0,10,20,30,40,50,60,70,80,90},

    {10,11,12,13,14,15,16,17,18,19},

    { 1,12,23,34,45,56,67,78,89,90}};

    - -. , . ,{86e-5, 87e-5 },

    {-12.5E4, -12.3E4}};

    Lors de l'initialisation, les valeurs sont affectes lignepar ligne en passant de gauche droite. Nous ne

    devons pas ncessairement indiquer toutes les valeurs:Les valeurs manquantes seront initialises par zro.

    46

  • 7/26/2019 LangageC FSB Imp

    47/81

    Access au composants ,

    - les indices du tableau varient de 0 L-1,respectivement de 0 C-1.

    - a composante e a me gne et me co onneest note:

    A[N-1][M-1]

    A[3][2]=4;

    47

  • 7/26/2019 LangageC FSB Imp

    48/81

    Affichage du contenu d'un tableau deux dimensions

    void main() {

    int A[5][10];

    int ,J;

    * *for ( =0;

  • 7/26/2019 LangageC FSB Imp

    49/81

    Affectation avec des valeurs provenant de l'extrieur

    void main() {

    int A[5][10];

    int ,J;

    /* Pour chaque ligne ... */

    for ( =0;

  • 7/26/2019 LangageC FSB Imp

    50/81

    ExercicesExo 1: Saisir une matrice dentiers 2.2, calculer et afficher son dterminant.

    50

  • 7/26/2019 LangageC FSB Imp

    51/81

    51

  • 7/26/2019 LangageC FSB Imp

    52/81

    La notion d'adresse mmoire

    La dfinition de variable int i = 5; peut tre interprte de 2 faons.

    Point de vue conceptuel Point de vue du compilateur C

    52

    i est un nom symboliquequi dsigne une variablequi prend des valeurs entires

    i 5

    i est une zone mmoire dimensionnepour contenir des valeurs entires

    le compilateur attribue une adresse i en mmoire

    51C02

    adresse mmoire

  • 7/26/2019 LangageC FSB Imp

    53/81

    Accs l'adresse mmoire d'une variable

    l'adresse d'une variable est une donne en elle-mme=> on peut manipuler les adresses mmoire

    le langage C autorise :-> l'accs l'adresse mmoire d'une variable

    - ' '

    53

    -> la dclaration de variables dont les valeurs sontdes adresses mmoire (notion de pointeur)

    l'oprateur "&"si i est une variable entire, alors &i est une expression dnotant

    l'adresse de i

    5&i

  • 7/26/2019 LangageC FSB Imp

    54/81

    La notion de pointeur Dclaration d'une variable pointeur sur un type

    Affectation un pointeur

    int * pi; /* pi est un pointeur sur entier */char * pc;/* pc est un pointeur sur caractre */

    -> on peut dclarer un pointeur sur un type quelconque

    54

    L'oprateur *

    pi *pi

    variable pointeur variable pointe

    l'oprateur * permet d'accder la variable pointe : il sert drfrencer le pointeur

    5

    int i = 5; ==> pi = &i;

    i * (&i)

  • 7/26/2019 LangageC FSB Imp

    55/81

    Les oprations sur les pointeurs

    le dfrencement "*"

    l'affectation "="

    les oprateurs de comparaison "==", "!="

    55

    les oprateurs "+" et "-" sur les adresses

    la constante NULL est une valeur spciale du fichier stdio.h-> un pointeur NULL ne pointe sur rien

    les oprations d'allocation dynamique de la mmoire malloc et dedsallocation free offertes par la librairie standard (fichier stdlib.h

  • 7/26/2019 LangageC FSB Imp

    56/81

    Un programme illustrant les pointeurs

    main ()

    {int i = 5, j = 9;int *p1, *p2; /* deux pointeurs sur entier */

    p1 = &i; /* *p1 est la variable i */

    p2 = p1; /* p2 dsigne la variable pointe par p1, c'est dire i */

    56

    *p1 = 9; /* la variable i est modifie */

    if (p1 == p2) printf ("Ncessairement *p1 == *p2 ");

    p2 = &j; /* *p2 est la variable j */

    if (*p1 == *p2) printf ("Ne signifie pas p1 == p2 !!! ");}

  • 7/26/2019 LangageC FSB Imp

    57/81

    Pointeurs et typage Typage d'un pointeur

    - un pointeur est typ par le type de l'objet point

    int * pi1, * pi2; /* pi1 et pi2 sont de type pointeur sur entier */

    * * *

    57

    Affectation entre pointeurs

    - l'affectation p1 = p2 est correcte si p1 et p2 sont de mme type

    - pi1 = pi2; /* affectation correcte */- pi1 = pc; /* affectation errone !!! */

  • 7/26/2019 LangageC FSB Imp

    58/81

    Passage de paramtres par valeur

    #include

    int carre ( ){

    return (x * x);}

    main Carre

    i

    car

    3

    copie

    avantappelde carre

    int x

    58

    void main (){

    int i = 3;int car;car = carre ( );

    printf ("%d", car);}

    car

    i

    valeur

    retour

    valeur

    appelde carre

    fin de

    l'exc.de carre

    3 3

    3

    9 9car

    x

    i

  • 7/26/2019 LangageC FSB Imp

    59/81

    Passage de paramtres par adresse

    #include

    void raz ( ){

    *ip = 0;}

    main Raz

    i 3avantappelde raz

    int *ip

    *ip

    59

    void main (){

    int i = 3;

    raz ( );

    printf ("%d", i);}

    i

    copie

    appelde raz

    fin del'exc.de raz

    3

    &i

    &i ipadresse

    0

  • 7/26/2019 LangageC FSB Imp

    60/81

    Synthse sur le passage de paramtres

    Passage par valeur

    - la valeur du paramtre effectif est recopie dans le paramtre formel- le paramtre effectif est la valeur d'une expression- le paramtre effectif ne peut pas tre modifi par la fonction

    60

    Passage par adresse

    - l'adresse du paramtre effectif est recopie dans le paramtre formel- le paramtre effectif est une variable- le paramtre effectif peut tre modifi par la fonction- un tableau est toujours pass par adresse

  • 7/26/2019 LangageC FSB Imp

    61/81

    Pointeurs et tableaux Identificateur de tableaule nom d'un tableau est une constante dont la valeurest l'adresse du premier lment du tableau

    0 1 2

    ou &t[0]tint t[3];

    61

    Oprateurs "+" et "-" sur les pointeurs

    int *p;p = &t[1]; ==> p+1 pointe sur t[2] et p-1 pointe sur t[0]

    Equivalence tableau / pointeur

    int t[N]; ==> &t[k] equivaut t+k pour k dans 0..N-1

  • 7/26/2019 LangageC FSB Imp

    62/81

    Tableau en paramtre de fonction

    Prototype d'une fonction triTableau

    void triTableau (int tab[], int n);

    Appel de la fonction triTableau

    /* tab est une variablede type pointeur sur entier */

    62

    int t[3] = {4, 7, 2};triTableau (t,3);

    Passage du tableau t en paramtre

    l'appel de triTableau, l'argument tab est initialis avec &t[0]

    ==> un tableau est toujours pass par adresse

    /* t est une constante de type pointeur sur entier */

  • 7/26/2019 LangageC FSB Imp

    63/81

    Pointeurs sur tableauxint t1[3] = {4, 6, 1};int *p1 = t1;

    int t2[3] = {2, 7, 9};int *p2 = t2;

    4 6 1

    2 7 9

    p1

    p2

    0 1 2t1

    t2

    63

    p2 = p1;4 66 1

    2 7 9

    p1

    p2

    0 1 2

    4 1

    2 7 9

    p1

    p2

    0 1 2

    -- 55*(p2+1) = - 5 ;

    ==> modification de t1[1] !!!

    t1

    t2

    t2

    t1

  • 7/26/2019 LangageC FSB Imp

    64/81

    Pointeurs et chanes de caractres

    Constantes chanes de caractres- "ada", "pascal" sont des constantes littrales- une constante chane de caractres est implante commeune squence de caractres, termine par le caractre '\0'

    - sa valeur est l'adresse de son premier caractre- son t e est ointeur sur caractre

    64

    Pointeurs sur chane de caractres

    char * ch = "ada";

    Tableaux de caractres

    char tc[] = {'a', 'd', 'a', '\0'};

    a ad \0

    non modifiable !!non modifiable !!ch

    a ad \0

    modifiable !!modifiable !!

    tcnon modifiable !!non modifiable !!

    modifiable !!modifiable !!

  • 7/26/2019 LangageC FSB Imp

    65/81

    Pointeur sur fonction Dfinition- le langage C autorise la dfinition de pointeurs sur fonction- le nom d'une fonction est une constante de type pointeur sur fondont la valeur est l'adresse de sa premire instruction

    Passage d'une fonction en paramtre

    65

    float integrer (float (* f)(float) , float a, float b, int n);

    float carre (float x) { return (x * x); }

    main (){ float surface;

    surface = integrer (carre, 0.0, 2.0, 100);}

  • 7/26/2019 LangageC FSB Imp

    66/81

    LES FONCTIONS

    66

  • 7/26/2019 LangageC FSB Imp

    67/81

    Dfinition d'une fonctionDans la dfinition d'une fonction, nous indiquons:

    - le nom de la fonction- le type, le nombre et les noms des paramtres de la

    - le type du rsultat fourni par la fonction- les donnes locales la fonction- les instructions excuter

    67

    ( , , ... ) { }

  • 7/26/2019 LangageC FSB Imp

    68/81

    Exemple

    La fonction MAX est du type int et elle a besoin dedeux paramtres du type int. Le rsultat de la fonction

    ' .int MAX(int N1, int N2) {

    if (N1>N2)

    return N1;

    elsereturn N2; }

    68

  • 7/26/2019 LangageC FSB Imp

    69/81

    69

  • 7/26/2019 LangageC FSB Imp

    70/81

    70

  • 7/26/2019 LangageC FSB Imp

    71/81

    Pour crer une fonction, il faut dfinir deux choses :

    le prototype de la fonction et son code.On peut dfinir uniquement que le prototype

    une prdfinition : il faudra par la suite dcrire aussison code pour qu'elle devienne utilisable.

    e prototype cont ent ensem e es n ormat onslies aux types que la fonction manipule et retourne.

    Une fonction peut utiliser des paramtres et rendreune valeur : ces paramtres et cette valeur de retour ontchacun un type qui globalement forme donc unprototype. Le code de la fonction (forcment placentre accolades) suit directement la dfinition duprototype.

    71

  • 7/26/2019 LangageC FSB Imp

    72/81

    Pour dfinir un prototype on procde de la faonsuivante :

    on commence par fixer le type de retour (void s'il y en aaucun),

    uis on rcise le nom de la fonction

    puis on donne une liste des types des paramtresutiliss (cette liste est mise entre parenthses et leslments sont spars par des virgules).

    L'exemple suivant dfinit le prototype de la fonction

    factorielle qui calcule la factorielle d'une valeur entire(passe en paramtre) et retourne ce rsultat .

    long fact(int); /* Pr-dclaration de la fonction fact*/ 72

  • 7/26/2019 LangageC FSB Imp

    73/81

    Ensuite, il faut dfinir le code de cette fonction. La syntaxe reste

    trs proche de la prcdente la diffrence que l'on rajoute del'information sur les noms des paramtres.

    long fact(int n) {

    long temp=1;

    while(n>1) temp*=n--;

    return temp;}

    Il n'est pas obligatoire de prdclarer la fonction. Cela ne se faitque si la fonction doit tre utilise avant qu'elle ne soit dfinie.En effet, sans cette phase de pr-dclaration, le compilateur ne

    pourrait correctement vrifier la validit (au niveau des types) devotre programme.

    73

  • 7/26/2019 LangageC FSB Imp

    74/81

    Variables localesLes variables dclares dans un bloc d'instructionssont uniquement visibles l'intrieur de ce bloc. On ditque ce sont desvariables locales ce bloc.

    Exemple

    extrieur de la fonction HELLO. Ainsi, aucune autrefonction n'a accs la variable NOM:

    void HELLO(void); {

    char NOM[20];

    printf(" ntroduisez votre nom : "); gets(NOM);printf("Bonjour %s !\n", NOM); }

    74

  • 7/26/2019 LangageC FSB Imp

    75/81

    Exemple

    Dans la fonction suivante,int FONCT ON(int A); {int X; ...X = 100; ...while (A>10) {

    ...X *= A;... } }la premire instruction X=100 se rapporte la variable du typeint dclare dans le bloc extrieur de la fonction; l'instructionX*=A agit sur la variable du type double dclare dans la bouclewhile. A l'intrieur de la boucle, il est impossible d'accder lavariable X du bloc extrieur.

    75

  • 7/26/2019 LangageC FSB Imp

    76/81

    Variables globalesLes variables dclares au dbut du fichier, l'extrieurde toutes les fonctions sont disponibles toutes les

    fonctions du programme. Ce sont alors desvariables.

    En gnral, les variables globales sont dclaresimmdiatement derrire les instructions #include audbut du programme.

    Attention !

    Les variables dclares au dbut de la fonctionprincipale main ne sont pas des variables globales,mais elles sont locales main !

    76

  • 7/26/2019 LangageC FSB Imp

    77/81

    ExempleLa variable STATUS est dclare globalement pour pouvoir treutilise dans les procdures A et B.#include int STATUS;void A(...) {...

    if (STATUS>0)STATUS--;else... ... }void B(...) {...STATUS++;... }

    77

  • 7/26/2019 LangageC FSB Imp

    78/81

    rcursivitUne fonction est dite rcursive, ds lors ou elle se fait appel pourcalculer une sous partie de la valeur finale qu'elle retournera.La rcursivit peut tre directe ou non, selon que la fonction sefasse directement appel, ou bien qu'elle appelle une autrefonction, qui durant son excution pourra finir par r-appeler la

    onct on n t a e.Un exemple classique de fonction rcursive, est celui de lafactorielle : en voici le code.

    /* La factorielle rcursive. */

    long fact(int n) {

    return (n

  • 7/26/2019 LangageC FSB Imp

    79/81

    Reprenons donc l'exemple de la factorielle. La factorielle de 6vaut 6*5*4*3*2*1. Celle de 5 vaut 5*4*3*2*1. Donc, on peut direque la factorielle de 6 vaut 6 fois la factorielle de 5. Plusgnralement, la factorielle de n vaut n*fact(n-1). Nous venonsde diviser le problme initial de la factorielle en un sousproblme de complexit (de difficult) moindre. Mais ce n'est

    pas suffisant car cet algorithme ne finit pas : en effet onaboutirait une tape fact(0)=0*fact(-1), ce qui aboutirait traiter l'ensemble de tous les entiers ngatifs. Il faut donc dfinirun cas d'arrt pour la rcursivit. Or cette fonctionmathmatique n'est pas dfinie sur les entiers ngatifs, mieuxencore elle doit retourner 1 pour les valeurs 0 et 1. Il en rsultedonc le code prcdent.

    79

  • 7/26/2019 LangageC FSB Imp

    80/81

    80

  • 7/26/2019 LangageC FSB Imp

    81/81