Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

54
Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008

Transcript of Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Page 1: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Langage de Programmation: I

- Le Langage C -

M. Khalid EL HACHEMI

I.N.S.E.A 2007 - 2008

Page 2: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Sommaire

Histoire du langage C

1. Introduction au langage

2. Éléments de base (règles d’écriture, types…)

3. Les variables

4. Opérateurs et expressions

5. Les entrées-Sorties (printf, scanf)

6. Les structures de contrôle

Page 3: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Sommaire

7. Classification des variables

8. Les objets structurés (tableaux, structures)

9. Les Fonctions

10. Les pointeurs

11. Les fichiers

12. Le préprocesseur (#include, #define…)

Page 4: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Histoire du C

Origines

C a trois ancêtres : les langages CPL, BCPL et B.

CPL : (pour Combined Programming Language) a été conçu au début des années 1960 - universités de Cambridge et de Londres. Fortement typé mais trop complexe disparition dans las année 70

BCPL : (pour Basic CPL) Cambridge en 1966 par Martin Richards. Version siplifiée Ecriture d’un 1er Compilateur et de divers systèmes d’exploitations

B : Ken Thompson vers 1970 dans les laboratoires Bell Version simplifiée du BCPL

Page 5: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Histoire du C

C : développé par un collègue de Ken Thompson, Dennis Ritchie qui ajouta les tableaux, les pointeurs, les nombres à virgule flottante, les structures... 1972 fut l'année de développement la plus productive et sans doute l'année de baptême de C. En 1973, C fut suffisamment au point pour que 90% de UNIX puisse être récrit avec.

- Une 1ère définition du langage est apparue en 1978 avec l’ouvrage de Ritchie et Kernighan « The C programming language ».

- Son succès international a contribué à sa normalisation:

1- ANSI (American National Standard Institute

2- ISO (International Standadization Organisation

3- CEN (Comité Européen de Normalisation) en 1993

Page 6: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

1. Introduction au langage C

- Le langage C est un langage de bas niveaux, dans le sens où il permet la

manipulation de données que manipulent les ordinateurs (Bit, octet, adresse) ≠

Langages évolués (Pascal, Fortran, ADA)

- Il est suffisamment général pour permettre de développer des application de

type scientifique ou de gestion basée sur l’accès aux bases de données (Word

et Excel sont écrits à partir de C ou C++)

- Il est un des 1ers langages offrant des possibilités de programmation modulaire:

Un programme peut être constitué de plusieurs module (module = fichier .c)

Page 7: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

- Un langage de programmation a pour finalité de communiquer avec la machine. Le langage maternel de la machine n'utilise que deux symboles (0 et 1): c'est le langage machine.

Exemple: le nombre 5 est reconnu par une machine par la succession des symboles 101 (c'est la représentation du nombre en base 2).

De même, les opérations qu'une machine est capable d'exécuter sont codées par des nombres, c'est-à-dire une succession de 0 et 1. Par exemple, l'instruction Machine 00011010 0001 0010 demande à la machine d'effectuer l'opération 1+2.

Ce langage est le seul qui soit compris par l'ordinateur, Est-il alors le seul moyen pour communiquer avec celui-ci???

Réponse : Non, utilisation du langage assembleur : add $1 $2

Il fut suivi par des langages plus sophistiqués et de plus en plus proche du langage humain

1. Introduction au langage C

Page 8: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

- La programmation structurée (Fortran, Pascal, C, Perl, Tcl ),

- La programmation structurée et modulaire (Ada, Modula),

- La programmation fonctionnelle (Lisp)

- La programmation logique (Prolog)

- La programmation objet (C++, Java, VB.net, C# …).

Compilateur

1. Introduction au langage C

Page 9: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Qu’est ce qu’un programme C?

C’est un texte écrit avec un éditeur de texte, respectant une certaine syntaxe et

stocké sous forme d'un ou plusieurs fichiers (généralement avec l'extension .c). A

l'opposé du langage assembleur, les instructions du langage C sont obligatoirement

encapsulées dans des fonctions et il existe une fonction privilégiée appelée main qui

est le point de départ de tout programme.

Exemple: main()

{

printf(’’Bonjour!’’);

}

Source.c

Compilation Objet.o Edition des liens Exécutable

1. Introduction au langage C

Page 10: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.1 les fichiers include

Exemple:

# include <stdio.h>

main()

{

printf(’’Bonjour!’’);

}

La directive #include inclu le fichier stdio.h au programme avant la compilation (pour

pouvoir utiliser la fonction prédéfinie printf.

On parle alors de préproceseur

2. Éléments de base

Page 11: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.2 les Commentaires

Exemple:

# include <stdio.h> //pour pouvoir utiliser la fonction printf

main()

{

printf(’’Bonjour!’’);

}

/*Ce programme imprime la chaine de

caractère ‘’Bonjour!’’ à l’écran*/

2. Éléments de base

Page 12: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.3 Présentation de quelques instructions du langage C

2. Éléments de base

Page 13: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.3 Présentation de quelques instructions du langage C

Exemple 2 :Exemple 2 :

2. Éléments de base

Page 14: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.4 Les identificateurs

Les identificateurs servent à désigner les différents objets manipulés par le

programme:Variables, fonctions, …

- Commence nécessairement par une lettre

- une lettre majuscule est tenue pour différente de la lettre minuscule correspondante;

- Au plus 31 caractère

- Le caractère _ (appelé « blanc souligné ») est considéré comme une lettre ; il peut

donc figurer à n'importe quelle place dans un identificateur: _Total2, Prix_unit

2. Éléments de base

Page 15: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.5 Les Types dans C

Les types de base du langage C se répartissent en 3 grande catégories en fonction

de la nature des informations qu’ils permettent de représenter:

Nombres entiers (int)

Nombres flottants (float ou double)

Caractère (char): apparaît en C comme un cas particulier de int.

Ils peuvent être signés ou non signés : signed ou unsigned (unsigned int x;)

2. Éléments de base

Page 16: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

a. Les Types Entiers

short int ou short (entier sur 16 bits : - 32 768 à 32 767)

int (entier sur 32 bits : - 2 147 483 648 à 2 147 483 647)

long int ou long (entier sur 32 bits ou 64 bits, selon les machines)

Chacun des 3 peut être nuancé par l’utilisation du qualificatif unsigned pour ne

représenter que des nombres positifs:

Exemple: unsigned short x; x peut aller de 0 à 65 535

pas de bit réservé pour le signe

- C accepte les constantes entière en notation décimale, hexadécimale ou octale

2. Éléments de base

Page 17: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

b. Les Types Flottants

Float : codé sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits

d'exposant

Double : codé sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11

bits d'exposant

Long : codé sur 10 octets avec 1 bit de signe, 64 bits de mantisse et 15 bits

d'exposant

- C accepte les constantes flottante en notation décimale ou scientifique

3.5e+3 3500 2.43 -0.38 -.38 4. .27

2. Éléments de base

Page 18: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2. Éléments de base

c. Le Type Char

En C, un caractère est un entier signé codé sur 1 octet

Notation des constantes caractères : ‘a’ , ‘$’ ..

Important: ‘a’ ≠ ‘’a’’

Il existe des caractères non imprimables, tel que le changement de ligne, de

Tabulation, … en voici un tableau récapitulatif

Page 19: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2. Éléments de base

NOTATION RESULTAT 

\a cloche ou bip (alert ou audible bell)

\b Retour arrière (Backspace)

\f Saut de page (Form Feed)

\n Saut de Ligne (Line Feed)

\r Retour chariot (Carriage Return)

\t Tabulation horizontaLe (HorizontaL Tab)

\v Tabutation verticale (VerticaL Tab)

\\ \ 

\' ‘ 

\ '' ‘’ 

\? ? 

Page 20: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

A propos du type booléen :

2. Éléments de base

Pas de type booléen en C. Le type booléen est représenté par un entier. Il se comporte

comme la valeur booléenne vraie si cette valeur entière est non nulle.

Dans un contexte qui exige une valeur booléenne (comme les tests, par exemple), un

entier non nul équivaut à vrai et la valeur zero équivaut à faux

Page 21: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

2.6 Les Mots réservés

2. Éléments de base

Les mots suivants sont réservés. Leur fonction est prévue par la syntaxe de C et ils ne

peuvent pas être utilisés dans un autre but :

auto break case char const continue default do

double else enum extern float for goto if

int long register return short signed sizeof static

struct switch typedef union unsigned void volatile while

Page 22: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

3.1 Declaration

3. Les Variables

Auto

Register

Static

extern

Const

volatile

Unsigned

Signed

Float

Double

Long double

Char

Short

Int

long identificateur = expression

Exemple: int x, y=0, z;

extern float a,b;

static unsigned short n=1000;

Page 23: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

3.2 Les variables statiques locale

Le qualificatif static, placé devant la déclaration d'une variable locale, produit une variable

qui est:

-Pour sa visibilité , locale

-Pour sa durée de vie, statique (Permanente)

Elle n'est accessible que depuis l'intérieur du bloc ou elle est déclarée, mais elle est créée

au début du programme et elle existe aussi longtemps que dure l'exécution de celui-ci.

Exemple : void bizarre(void)

{ static int cpt = 1000; Appels consécutifs : 1000

1001 1002

printf("%d ", cpt);

cpt++; }

3. Les Variables

Page 24: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

C dispose d'un important éventail d'opérateurs originaux d'affectation et

d'incrémentation.

4.1 Opérateurs arithmétiques en C

Comme tous les langages, C dispose d'opérateurs classiques "binaires" , à

savoir l'addition (+), la soustraction (-), la multiplication (*) et la division (/), ainsi

que d'un opérateur "unaire" correspondant à l'opposé noté - (comme dans -n ou

-x+y).

Les opérateurs binaires ne sont à priori définis que pour deux opérandes ayant

le même type parmi: int, long int, float, double, long double et ils fournissent

un résultat de même type que leurs opérandes.

4. Opérateurs et Expressions

Page 25: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.1 Opérateurs arithmétiques en C

De plus, il existe un opérateur de "modulo" noté % qui ne peut porter que sur des

entiers et qui fournit le reste de la division de son premier opérande par son

second. Par exemple, 11%4 vaut 3, 23%6 vaut 5

Remarque: le quotient de deux entiers fournit un entier. Ainsi 5/2 vaut 2; en

revanche, le quotient de deux flottants (noté, lui aussi, /) est bien un flottant

(5.0/2.0 vaut bien approximativement 2.5).

Priorité des opérateurs :

les règles sont "naturelles" et rejoignent celles de l'algèbre traditionnelle

4. Opérateurs et Expressions

Page 26: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Conversions implicites :

On peut écrire des expressions mixtes dans lesquelles interviennent des opérandes

de types différents:

Int n,p; float x; n * x + p

(int * float) + int

Conversion implicite: int float ( float*float) + int

float + int

Même mécanisme : float + float float

On parle de conversion d’ajustement de type: intlongfloatdoublelong double

4. Opérateurs et Expressions

Page 27: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Promotions numériques :

On a vu que les opérateurs numériques ne sont pas définis pour le types char et

short :

C prévoit que toute valeur char ou short soit d’abord convertie en int.

short n,p; float x; n * x + p

(short * float) + short

Conversion systématique: ( int * float) + int

Conversion implicite : float * float + int

float + float float

4. Opérateurs et Expressions

Page 28: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.2 Opérateurs Relationnels

Comme tout langage, C permet de "comparer" des expressions à l'aide

d'opérateurs classiques de comparaison. exemple : 2*a > b +5

Par contre, C se distingue de la plupart des autres langages sur deux points:

1-le résultat de la comparaison est, non pas une valeur "booléenne" (on dit aussi

"logique") prenant l'une des deux valeurs vrai ou faux, mais un entier valant:

0 si le résultat de la comparaison est faux,

1 si le résultat de la comparaison est vrai.

Ainsi, la comparaison ci-dessus devient en fait une expression de type entier. Cela

signifie qu'elle pourra éventuellement intervenir dans des calculs arithmétiques;

4. Opérateurs et Expressions

Page 29: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.2 Opérateurs Relationnels

2-les expressions comparées pourront être de type quelconque et seront soumises au

règles de conversion présentées précédemment.

Liste des opérateurs: < <= > >= == !=

même priorité > même priorité

Exemple: a < b == c < d (a < b) == (c < d)

Remarque: les opérateurs relationnels sont moins prioritaires que les opérateurs

arithmétiques ( x+y < a+2 (x+y) < (a+2) )

4. Opérateurs et Expressions

Page 30: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.3 Opérateurs Logiques

C dispose de trois opérateurs logiques classiques: et (noté &&), ou (noté | |) et

non (noté ! ). Par exemple: (a<b) && (c<d) prend la valeur 1 (vrai) si les deux

expressions a<b et c<d sont toutes deux vraies ( de valeur 1), la valeur 0 (faux)

dans le cas contraire.

Ces opérateurs acceptent n'importe quel opérande numérique, y compris les

types flottants, avec les règles de conversion implicite déjà rencontrées. à

condition de considérer que:

0 correspond à faux,

toute valeur non nulle correspond à vrai

4. Opérateurs et Expressions

Page 31: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.3 Opérateurs Logiques

Exemples:

n et p sont des entiers, le compilateur accepte des expression telles que:

n && p n | | p if ( !n ) if (n == 0)

Remarque1: l’opérateur ! a une priorité supérieur à celle de tous lés opérateurs

arithmétiques et relationnels. La négation de a==b serait !(a==b) et non

!a==b

Remarque2: l’opérateur | | est moins prioritaire que &&. Tous deux sont de priorité

inférieure aux opérateurs arithmétique et relationnels

a<b && c<d équivaut à (a<b) && (c<d)

4. Opérateurs et Expressions

Ne sera évaluée que si a<b est vrai

Page 32: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.4 Opérateur d’affectation ordinaire

Nous avons déjà eu l'occasion de remarquer que : i = 5 était une expression qui

réalisait une action : l'affectation de la valeur 5 à i. Cet opérateur d'affectation (=)

peut faire intervenir d'autres expressions comme dans : c=b + 3

Cet opérateur possède une associativité de droite à gauche : i = j = 5

4. Opérateurs et Expressions

Page 33: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.5 Opérateurs d’incrémentation et de décrémentation ( ++ - - )

++ i : expression qui incrémente de 1 la valeur de i, et sa valeur est celle de i

après incrémentation

si la valeur de i est 5, l'expression : n = ++i - 5 affectera à i la valeur 6 et à n la

valeur 1.

n = i++ - 5 (n==0 , i++ vaut 5, i vaut 6)

On dit que ++ est:

-un opérateur de pré incrémentation lorsqu'il est placé à gauche

-un opérateur de post incrémentation lorsqu'il est placé à droite

4. Opérateurs et Expressions

Page 34: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.5 Opérateurs d’incrémentation et de décrémentation ( ++ -- )

Priorité:

3 * i++ * j-- + k++ équivaut à 3 * (i++) * (j--) + (k++)

La priorité élevée de ces opérateurs unaires permet d’écrire des expression

assez compliquées sans qu’il soit nécessaire d’employer des ( )

4.6 Opérateurs d’affectation élargie:

i=i+k i+=k a=a*b a*=b i=i-k i-=k a=a/b a/=b

4. Opérateurs et Expressions

Page 35: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

4.7 L’opérateur de CAST :

Exemple: n=10, p=3;

(double) (n/p) aura comme valeur 3

(double) n/p aura comme valeur 3.33333…

4.8 L’opérateur conditionnel : (seul opérateur ternaire en C)

syntaxe : condition ? Valeur si vrai : valeur si faux

z = (x=y) ? a : b ; on utilise la valeur de l’expression

a>b ? i++ : i-- ; la valeur de l’expression n’est pas utilisée

4. Opérateurs et Expressions

Page 36: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

E X E R C I C E S

4. Opérateurs et Expressions

Page 37: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

Quelles sont les écritures autorisés pour des nombres fournis en données? Que se

passe-t-il lorsque l’utilisateur ne les respecte pas?

Comment organiser les données lorsque l’on mélange les types numériques et les

types caractères?

Que se passe-t-il lorsque, en réponse à scanf, on fournit trop ou peu

d’informations?

Comment agir sur la présentation des informations à l’écran?

5. Les Entées-Sorties Conversationnelles

Page 38: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

La fonction printf a comme 1er argument une chaîne de caractères qui spécifie:

Des caractères à afficher tels quels;

Des code de format repérés par %. Un code de conversion (c, d, f..) précise

le type de l’information à afficher.

Un code de format peut contenir des informations complémentaires agissant sur le

cadrage, le gabarit ou la précision.

Exemple: printf("leur somme est : %d",n1+n2);

5.1 Les possibilités de la fonction printf

Page 39: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

a. Les principaux codes de conversion:

c : char: caractère affiché ''en clair" (convient aussi à short ou à int compte tenu

des conversions systématiques)

d : int (convient aussi à char, compte tenu des conversions systématiques)

u : unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu

des conversions systématiques)

ld : long

lu : unsigned long

5.1 Les possibilités de la fonction printf

Page 40: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

a. Les principaux codes de conversion:

f : double ou float écrit en notation "décimale" avec six chiffres après le point

e : double ou float écrit en notation ‘'exponentielle'' (mantisse entre 1 et 9) avec six

chiffres après le point décimal, sous la forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour

les nombres positifs et -x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les nombres

négatifs

s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée

ultérieurement)

5.1 Les possibilités de la fonction printf

Page 41: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

b. Action sur le gabarit d’affichage:

Les entiers sont affichés par défaut sans espaces avant ou après. Les flottants avec six

chiffres après le point.

Pour agir sur l’affichage un nombre est placé après % et précise le nombre de

caractère minimum à utiliser.

Exemples: printf("%3d" , n );

n = 20 ^20

n = 3 ^^3

n = 2358 2358

n = -5200 -5200

5.1 Les possibilités de la fonction printf

Page 42: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

b. Action sur le gabarit d’affichage:

Exemples: printf("%f" , x );

x = 1.2345 1.234500

x = 12.3456789 12.345678

printf("%10f" , x );

x = 1.2345 ^^1.234500

x = 1.2345E5 123450.000000

printf("%e" , x );

x = 1.2345 1.234500e+000

x = 123.45 1.234500e+002

5.1 Les possibilités de la fonction printf

Page 43: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

c. Actions sur la précision :

pour les flottants, on peut préciser un nombre de chiffres après le point décimal

Exemples: printf("%10.3f" , x );

x = 1.2345 ^^^^^1.235

x = 1.2345E3 ^^1234.500

x = 1.2345E7 12345000.000

Remarques:

Cadrage de l’affichage à gauche printf("%-10.3f" , x ); x = 1.2345 1.235^^^^^

- Le caractère * figurants à la place d’un gabarit ou une précision signifie que la valeur

effective est fournie dans la liste des arguments de printf:

printf("%8.*f" , n, x ); n=1; x=1.2345 ^^^^^1.2

- La fonction printf fournit une valeur de retour (nombre de caractère affichés)

5.1 Les possibilités de la fonction printf

Page 44: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

d. Les erreurs de programmation :

Erreur 1 : Code de format en désaccord avec le type de l’expression à afficher:

Conséquence : mauvaise interprétation si même taille (int en %u), sinon, conséquences

plus désastreuses.

Erreur 2: Nombre de code de format différents du nombre d’expressions de la liste

Conséquence 1 : si des expressions de la liste n’ont pas de format, elles ne seront pas

affichées ( printf("%d" , n, p ); // valeur de p ne sera pas affiché )

Conséquence 2 : s’il y a trop de code de format, printf cherchera à afficher n’importe

quoi ( printf("%d %d" , n ); n=8 8 2 )

5.1 Les possibilités de la fonction printf

Page 45: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

a. Les principaux codes de conversion :

c : char

d : int

u : unsigned int

hd : short int

hu : unsigned short

ld : long

lu : unsigned long

5.1 Les possibilités de la fonction scanf

Page 46: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

a. Les principaux codes de conversion :

f ou e : float écrit en notation "décimale" ou ‘'exponentielle''

Lf ou le : double écrit en notation "décimale" ou ‘'exponentielle''

s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée

ultérieurement)

b. Premières notion de tampon et de séparateurs :

Lorsque scanf attend des données, l’information frappée au clavier est rangée

temporairement dans l’emplacement mémoire nommé « tampon ». Ce dernier est

exploré caractère par caractère au fur et à mesure des besoins. Certains caractères

jouent un rôle particulier: les séparateurs (l’espace et la fin de ligne \n)

5.1 Les possibilités de la fonction scanf

Page 47: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

c. Les premières règles utilisées par scanf :

Les codes de format correspondant à un nombre entraînent l’avancement du

pointeur jusqu’au 1er caractère différent d’un séparateur, puis scanf prend en

compte tous les caractères suivants jusqu’à la rencontre d’un séparateur.

Quand au code de format %c, il entraîne la prise en compte du caractère désigné

par le pointeur (même un séparateur) et il est avancé sur le caractère suivant.

5.1 Les possibilités de la fonction scanf

Page 48: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

c. Les premières règles utilisées par scanf :

Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne)

scanf("%d%d" , &n, &p );

12^25@ n = 12 p=25

^12^^25^^@ n = 12 p=25

123@

@

^25 n = 12 p=25

scanf("%d%c" , &n, &c );

12^a@ n = 12 c=‘ ‘

5.1 Les possibilités de la fonction scanf

Page 49: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

d. On peut imposer un gabarit maximal :

Le traitement d’un code de format s’interrompe soit à la rencontre d’un séparateur, soit

lorsque le nombre de caractère indiqué a été atteint !!

Exemples : (n et p sont de type int, @ désigne une fin de ligne)

scanf("%3d%3d" , &n, &p );

12^25@ n = 12 p=25

^^^^^12345@ n = 123 p=45

12@

25@ n = 12 p=25

5.1 Les possibilités de la fonction scanf

Page 50: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

e. Rôle d’un espace dans le format :

Un espace entre deux codes de format demande à scanf de faire avancer le pointeur au

prochain caractère différent d’un séparateur !!

Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne)

scanf("%d %c" , &n, &c );

12^a@ n = 12 c=‘a‘

12^^^@

a@ n = 12 c=‘a‘

5.1 Les possibilités de la fonction scanf

Page 51: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

f. Arrêt prématuré de scanf :

Compte = scanf("%d %d %c" , &n, &p, &c );

12^25^b@ n = 12 p = 25 c=‘b‘ compte = 3

12b@ n = 12 p inchangé c inchangé compte = 1

b@ n indéfini p inchangé c inchangé compte = 0

Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est pas en mesur de fabriquer

une valeur adéquate !!

5.1 Les possibilités de la fonction scanf

Page 52: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

f. Problème de synchronisation entre l’écran et le clavier :

Examinons cet exemple:

#include <stdio.h>

main()

{ int n, p;

printf("donner une valeur pour n : ");

scanf("%d",&n);

printf("Merci pour %d\n",n);

printf("donner une valeur pour p : ");

scanf("%d",&p);

printf("Merci pour %d\n",p);}

exécution

5.1 Les possibilités de la fonction scanf

Page 53: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

f. Problème de synchronisation entre l’écran et le clavier :

Le tampon n’est pas vide à chaque nouvel appel de scanf

g. Erreurs de programation :

1- Code de format en désaccord avec le type de l’expression:

Si même taille introduction d’une mauvaise valeur

Si la variable a une taille inférieur écrasement d’un emplacement mémoire

consécutif à cette variable

2- Nombre de codes de format différent du nombre d’éléments de la liste:

Scanf("%d",&n, &p); seule la valeur de n est lue

Scanf("%d%d",&n); on affecte une valeur à un emplacement aléatoire de la

mémoire

5.1 Les possibilités de la fonction scanf

Page 54: Langage de Programmation: I - Le Langage C - M. Khalid EL HACHEMI I.N.S.E.A 2007 - 2008.

6. Les instructions de contrôle