• Aucun résultat trouvé

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
115
0
0

Texte intégral

(1)

FSTS 2014

(2)

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

(3)

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…)

(4)

 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 1

er

Compilateur et de divers systèmes d’exploitations

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

du BCPL

(5)

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

(6)

- 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 1

ers

langages offrant des possibilités de programmation

modulaire:

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

(7)

- 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

(8)

- 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

(9)

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

(10)

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

(11)

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*/

(12)

2.3 Présentation de quelques instructions du langage C

(13)

2.3 Présentation de quelques instructions du langage C

Exemple 2 :

(14)

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, suivi par

les caractères suivants peuvent être des lettres, des chiffres ou le caractère de soulignement _,

Le C distingue les minuscules des majuscules;

Exemple : carlu Carlu CarLu CARLU sont valides et tous différents,

La longueur dépend de l ’implémentation. Au moins les 31 premier caractères soient significatifs pour le compilateur,

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,

Le nom ne peut pas être un mot réservé du langage :

(15)

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;)

(16)

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

(17)

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

(18)

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

(19)

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)

\\ \

\' ‘

\ '' ‘’

\? ?

(20)

A propos du type booléen :

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

(21)

21 21

tableau donnant les types de données en langage C

Vendredi 11 Février 2011 Youssef BALOUKI

Type de donnée Signification Taille (en octets) Plage de valeurs acceptée

char Caractère 1 -128 à 127

unsigned char Caractère non signé 1 0 à 255

short int Entier court 2 -32 768 à 32 767

unsigned short int Entier court non signé 2 0 à 65 535

int Entier

2 (sur processeur 16 bits) -32 768 à 32 767

4 (sur processeur 32 bits) -2 147 483 648 à 2 147 483 647

unsigned int Entier non signé

2 (sur processeur 16 bits) 0 à 65 535

4 (sur processeur 32 bits) 0 à 4 294 967 295

long int Entier long 4 -2 147 483 648 à 2 147 483 647

unsigned long int Entier long non signé 4 0 à 4 294 967 295

float Flottant (réel) 4 3.4*10-38 à 3.4*1038

double Flottant double 8 1.7*10-308 à 1.7*10308

long double Flottant double long 10 3.4*10-4932 à 3.4*104932

(22)

2.6 Les Mots réservés

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

(23)

3.1 Declaration

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;

(24)

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++; }

(25)

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.

(26)

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

(27)

Classes de priorités

27

Priorité 1 (la plus forte): ()

Priorité 2: ! ++ --

Priorité 3: * / %

Priorité 4: + -

Priorité 5: < <= > >=

Priorité 6: == !=

Priorité 7: &&

Priorité 8: ||

Priorité 9 (la plus faible): = += -= *= /= %=

4. Opérateurs et Expressions

(28)

Exemples :

28

L'expression 10+20+30-40+50-60 sera évaluée comme suit:

10+20 ==> 30

30+30 ==> 60

60-40 ==> 20

20+50 ==> 70 70-60 ==> 10

Pour A=3 et B=4, l'expression A *= B += 5 sera évaluée comme suit

:

4. Opérateurs et Expressions

(29)

29

Pour A=1 et B=4, l'expression !--A==++!B sera évaluée comme suit:

4. Opérateurs et Expressions

(30)

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: intlongfloatdoublelong double

(31)

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

(32)

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;

(33)

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) )

(34)

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

(35)

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)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

E X E R C I C E S

(41)

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?

(42)

42

La Norme ANSI a défini deux bibliothèques : canio.h et stdio.h.

 putch(char) :

affiche sur l’écran le caractère fourni en argument (entre parenthèses).

Dans canio.h on trouve les fonctions de base de gestion de la console :

Dans stdio.h, on trouve des fonctions plus évoluées :

puts(chaîne)

affiche, sur l’écran (stdout), la chaîne de caractères puis positionne le curseur en début de ligne suivante. puts retourne EOF en cas d’erreur.

gets(chaîne)

lecture d’une chaîne sur le clavier (stdin). Tous les caractères peuvent être entrés. La saisie est terminée par un retour chariot.

getch(void)

: attend le prochain appui sur le clavier, et rend le caractère qui a été saisi. L’appui sur une touche se fait sans écho, c’est à dire que rien n’est affiché à l’écran.

5. Les Entées-Sorties Conversationnelles

(43)

Vendredi 11 Février 2011 43

Youssef BALOUKI

Une spécification de format est de la forme :

%[flag][largeur][.précision][modificateur]type

(entre [] facultatifs)

Ecriture formatée en C printf( )

La fonction printf est utilisée pour transférer du texte, des valeurs de variables ou des résultats d'expressions vers le fichier de sortie standard stdout (par défaut l'écran).

printf("<format>",<Expr1>,<Expr2>, ... )

5.1 Les possibilités de la fonction printf

(44)

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);

(45)

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

(46)

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)

(47)

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

(48)

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

(49)

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)

(50)

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 )

(51)

51

scanf( )

lecture au clavier de valeurs, dans le format spécifié. Les arguments sont des pointeurs sur les variables résultats). scanf retourne le nombre de valeurs effectivement lues et mémorisées.

scanf("<format>",<AdrVariable1>,<AdrVariable2>, ... ) Ecriture formatée en C :

5.1 Les possibilités de la fonction scanf

Une spécification de format est de la forme :

%[*][largeur][modification]type

(52)

a. Les principaux codes de conversion :

c : char

d : int

u : unsigned int

hd : short int

hu : unsigned short

ld : long

lu : unsigned long

(53)

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)

(54)

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.

(55)

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=‘ ‘

(56)

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

(57)

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‘

(58)

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 !!

(59)

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

(60)

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

(61)

La structure alternative en langage algorithmique

si

(<expression logique>)

alors

<bloc d'instructions 1>

sinon

<bloc d'instructions 2>

fsi

61

L’instructions conditionnelle

Si l’expression logique (la condition) prend la valeur vrai, le premier bloc d’instructions est exécuté; si elle prend la valeur faux, le second bloc est exécuté (s’il est présent, sinon, rien).

La structure alternative en C

if

( <expression> ) <bloc d'instructions 1>

else

<bloc d'instructions 2>

Exemple 1

if (a > b) max = a; else max = b;

Exemple 2

if (EGAL) printf("A est égal à B\n"); else printf("A est différent de B\n");

Exemple 3 if (A-B) printf("A est différent de B\n"); else printf("A est égal à B\n");

6. Les instructions de contrôle

(62)

Exemple

Calcul du net commercial. Si le montant brut est supérieur à 1 000 on accorde une remise de 10%.

Programme : Net commercial Variables

Prix, Quantité, Montant_Brut, Net_Cial: Entier Début

Afficher ("Donnez le prix de l' article") Saisir( Prix)

Afficher ("Donner la quantité acheté ") Saisir Quantité

Montant_Brut Quantité * Prix

Afficher ("Le montant brut est", Montant_Brut) Si Montant_Brut >1000

Alors Net_Cial  Montant_Brut * 0,9 Sinon Net_Cial  Montant_Brut Fsi

Afficher ("Le net commercial est de :", Net_Cial) Fin

Youssef BALOUKI 62

6. Les instructions de contrôle

(63)

Exercices

1- Saisir deux nombres puis Afficher le plus grand 2- Saisir un entier et vérifier s’il est pair ou non.

Youssef BALOUKI 63

6. Les instructions de contrôle

(64)

Instruction conditionnelle: imbriquée

Les blocs instruction1 et instruction2 peuvent eux aussi être des instructions conditionnelles, ce qui permet

d'imbriquer les structures conditionnelles.

64

if ( <expr1> ) <bloc1>

else if (<expr2>) <bloc2>

else if (<expr3>) <bloc3>

else if (<exprN>) <blocN>

else <blocN+1>

6. Les instructions de contrôle

(65)

Programme : Net commercial Variables

Prix, Quantité, Montant_Brut, Net_Cial: Entier Début

Afficher ("Donnez le prix de l' article") Saisir Prix

Afficher ("Donner la quantité acheté") Saisir Quantité

Montant Brut Quantité * Prix

Afficher ("Le montant brut est", Montant_Brut)

Si Montant_Brut <=1000

Alors Net_Cial  Montant_Brut Sinon Si Montant_Brut <= 2000

Alors Net_Cial  Montant_Brut * 0,88

Sinon Net_Cial  Montant_Brut * 0,86

Fsi

Fsi

Afficher ("Le net commercial est de :", Net_Cial)

Fin

65

Exemple :

Calcul du net commercial. Si le montant brut est inférieur à 1 000 on n'accorde pas de remise de 10%, si le montant brut est compris entre 1 000 et 2 000 la

remise sera de 12% et de 14 % au-delà.

(66)

La structure

SELON VALEUR1 VALEUR2 …SINON ….. FINSELON

FORMAT :

SELON variable ou expression FAIRE VALEUR1 :

Action (s) si CONDITION 1 VRAIE VALEUR 2 :

Action (s) si CONDITION 2 VRAIE ....

SINON

Action si expression testée ne rentre dans aucun des cas précédents.

FINSELON

Y. BALOUKI 66

6. Les instructions de contrôle

(67)

Youssef BALOUKI 67

Sa syntaxe est en C :

Switch (valeur) {

case E1 : <instruction1> ; case E2 : <instruction2> ;

…. : ….

case Ek : <instructionk> ; default : <instruction> ; }

main() { int n ;

Printf( "donnez un entier : ) ; Scanf(%d ,&n) ;

switch (n)

{ case 0 : Printf( "nul\n" );

break ;

case 1 : Printf( "un\n« ) ; break ;

case 2 : Printf( "deux\n" );

break ; }

Printf( "au revoir\n« ) ; }

Exemple

(68)

Youssef BALOUKI 68

Switch

L'instruction d'aiguillage switch permet de tester la valeur d'une expression parmi un ensemble de constantes. La définition syntaxique est la suivante:

switch (expr) {

case const1: instr1 case const2: instr2 case const3: instr3 default : instr_d }

(69)

Exemple

Le programme suivant illustre l'utilisation du switch.

void main() {

char c = 'B';

switch(c) {

case 'a':

case 'A':

printf("Cas 'a' ou 'A'\n");

case 'b':

case 'B':

printf("Cas 'b' ou 'B'\n");

case 'z':

case 'Z':

printf("Cas 'z' ou 'Z'\n");

default:

printf("Cas default\n");

} }

Youssef BALOUKI 69

Son exécution sera:

Cas 'b' ou 'B' Cas 'z' ou 'Z' Cas default

6. Les instructions de contrôle

(70)

Youssef BALOUKI 70

Exemple

Le programme suivant:

/* Programme switch2.c */

void main() {

int i = 2;

switch(i) {

case 1:

printf("i = 1\n");

break;

case 2:

printf("i = 2\n");

break;

case 3:

printf("i = 3\n");

break;

default:

printf("default\n");

} }

affiche:

i = 2

(71)

Youssef BALOUKI 71

Début

Exécution des Instruction(s)

Evaluation de la condition

Vrai

Fin

Faux

While

( <expression> )

{

bloc d'instructions

}

#include<stdio.h>

#include<conio.h>

int main() {

int i=1;

while (i<100) {

if (i % 3 == 0)

printf("%d est divisable par 3\n",i);

i++;

}

getch();

}

(72)

Youssef BALOUKI 72

Début

Fin Evaluation de la condition Exécution des Instruction(s)

Vrai

Faux

Do { bloc d'instructions } While (

<expression> ) ;

Exemple

#include<stdio.h>

#include<conio.h>

int main() {

int i=1;

do

{

if (i % 3 == 0)

printf("%d est divisable par 3\n",i);

i++;

}

while (i<100)

getch();

}

(73)

Evaluation de Initial

Youssef BALOUKI 73

Evaluation de la condition

Début

Evaluation de Incrément

For ( <expr1> ; <expr2> ; <expr3> )

{ bloc d'instructions }

Fin

Faux

Exécution des Instruction(s)

Vrai

Exemple

#include<stdio.h>

#include<conio.h>

int main() {

int i,n = 100;

for

(i=1; i<100 ; i++)

{

if (i % 3 == 0)

printf("%d est divisable par 3\n",i);

}

getch();

}

(74)

Remarque

74

6. Les instructions de contrôle

(75)

6.1 Les tableaux à une dimension

6.1.1. Déclaration et mémorisation

Déclaration de tableaux en langage algorithmique NomTableau= Tableau[<Dimension>] de type simple

Déclaration de tableaux en C

<TypeSimple> <NomTableau>[<Dimension>];

(76)

Traduction en C par:

int A[25]; ou bien long A[25]; ou bien ...

float B[100]; ou bien double B[100];

int C[10];

char D[30];

(77)

une variable du type long occupe 4 octets (c.-à-d: sizeof(long)=4), pour le tableau T déclaré par: long T[15];

C réservera N*M = 15*4 = 60 octets en mémoire.

6.1.2. Initialisation et réservation automatique

Exemples

int 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};

(78)

Exemples

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

==> réservation de 5*sizeof(int) octets (dans notre cas: 10 octets)

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

==> réservation de 4*sizeof(float) octets (dans notre cas: 16 octets)

Application 1

Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.

Effacer ensuite toutes les occurrences de la valeur 0 dans

le tableau T et tasser les éléments restants. Afficher le

tableau résultant.

(79)
(80)
(81)
(82)
(83)

6.2.1. Déclaration et mémorisation

Déclaration de tableaux à deux dimensions en lang. algorithmique NomTab= tableau [<DimLigne>,<DimCol>] de TypeSimple

Déclaration de tableaux à deux dimensions en C

<TypeSimple> <NomTabl>[<DimLigne>][<DimCol>];

(84)
(85)

Remarque

une variable du type double occupe 8 octets (c.-à-d:

sizeof(double)=8), pour le tableau T déclaré par: double T[10][15];

C réservera L*C*M = 10*15*8 = 1200 octets en mémoire.

(86)

Exemples

int 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}};

float B[3][2] = {{-1.05, -1.10 }, {86e-5, 87e-5 },

{-12.5E4, -12.3E4}};

(87)
(88)
(89)
(90)
(91)
(92)
(93)
(94)

7.1 Déclaration et mémorisation

Déclaration

Déclaration de chaînes de caractères en langage algorithmique chaîne <NomVariable>

Déclaration de chaînes de caractères en C char <NomVariable> [<Longueur>];

Exemples

char NOM [20];

char PRENOM [20];

char PHRASE [300];

(95)

Exemple:

Mémorisation d'un tableau

char TXT[10] = "BONJOUR !";

(96)

Utiliser toutes les séquences d'échappement définies comme caractères constants dans une chaine de caractère :

"Un \n message \nsera réparti sur 3 lignes."

" peut être représenté dans une chaîne par la séquence d'échappement \":

" fait voir le \"guillemets\" \n"

Le symbole ' peut être représenté à l'intérieur d'une liste de caractères par la séquence d'échappement \' :

{'L', '\'', 'a', 's', 't', 'u', 'c', 'e', '\0'}

(97)

 Observation

Pour la mémorisation de la chaîne de caractères "Bon", C a besoin de ??? octets.

‘A‘ est un caractère constant , qui a une valeur numérique:

P.ex: ‘A' a la valeur 96 dans le code ASCII.

"x " est un tableau de caractères qui contient deux caractères:

la lettre 'x' et le caractère NUL: '\0' 'x' est codé dans un octet

"x" est codé dans deux octets

(98)

 initialiser par l'indication de la liste des éléments du tableau entre accolades:

char CHAINE[] = {'H','e','l','l','o','\0'};

 Une initialisation plus confortable en indiquant simplement une chaîne de caractère constante:

char CHAINE[] = "Hello";

7.3. Initialisation de chaînes de caractères

(99)

 Exemples

'B' 'o' 'n' 'j' 'o' 'u' 'r' '\0'

Char TXT [ ] = "Bonjour" ; TXT :

'B' 'o' 'n' 'j' 'o' 'u' 'r' '\0'

Char TXT [8] = "Bonjour" ;

TXT :

'B' 'o' 'n' 'j' 'o' 'u' 'r' '\0' 0 0

Char TXT [10] = "Bonjour" ; TXT :

'B' 'o' 'n' 'j' 'o' 'u' 'r' ¤

Char TXT [7] = "Bonjour" ;

ERREUR PRNDANT L’EXECUTTION

(100)

 Exercice :

a) char a[] = "un\ndeux\ntrois\n";

b) char b[12] = "un deux trois";

c) char c[] = 'abcdefg';

d) char d[10] = 'x';

e) char e[5] = "cinq";

f) char f[] = "Cette " "phrase" "est coupée";

g) char g[2] = {'a', '\0'};

h) char h[4] = {'a', 'b', 'c'};

i) char i[4] = "'o'";

(101)

Char txt[6];

txt[0], txt[1], ... , txt[5]

Exemple

Char TXT [8] = "Bonjour" ;

TXT :

'B' 'o' 'n' 'j' 'o' 'u' 'r' '\0'

TXT[0] TXT[1] TXT[2] TXT[3] TXT[4] TXT[5] TXT[6

] TXT[7

]

(102)

Pour le code ASCII, nous pouvons constater l'ordre suivant:

. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . .

'0' est inférieur à ‘A' et noter '0' < ‘A‘

Précédence lexicographique des chaînes de caractères

La chaîne vide "" précède lexicographiquement toutes les autres chaînes.

La chaîne A = "a

1

a

2

a ... a

p

" (p caractères) précède

lexicographiquement la chaîne B = "b

1

b

2

... b

m

" (m caractères) si l’une des deux conditions est remplie

1) : 'a

1

' < 'b

1

'

2) : 'a

1

' = 'b

1

' et " a2a3…..ap " précède lexicographiquement "

b2b3…..bm "

(103)

 Exemples

- "ABC" précède "Ball" car 'A'<'B‘

- "ABC"précède "B" car 'A'<'B' - "Abc" précède "abc" car 'A'<'a'

- "ab" précède "abcd« car "" précède "cd"

- " ab" précède "ab" car ' '<'a'

(le code ASCII de ' ' est 32, et le code ASCII

de 'a' est 97)

(104)
(105)

7.6.1. Les fonctions de <stdio.h>

- Affichage de chaînes de caractères

Exemples

char NOM[] = "Bonjour tout le monde";

printf(":%s:", NOM); -> : Bonjour tout le monde :

printf(":%5s:", NOM); -> : Bonjour tout le monde :

printf(":%25s:", NOM); -> : Bonjour tout le monde :

printf(":%-25s:", NOM); -> : Bonjour tout le monde :

printf(":%.7s:", NOM); -> :Bonjour:

Syntaxe: puts( <Chaîne> )

puts(TXT);  printf("%s\n",TXT);

(106)

Exemple

char LIEU[25];

int JOUR, MOIS, ANNEE;

printf("Entrez lieu et date de naissance : \n");

scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE);

Syntaxe: gets( <Chaîne> )

Exemple

int MAXI = 1000;

char LIGNE[MAXI];

gets (LIGNE);

- Lecture de chaînes de caractères

(107)

strlen(<s>) fournit la longueur de la chaîne sans compter le '\0' final strcpy(<s>, <t>) copie <t> vers <s>

strcat(<s>, <t>) ajoute <t> à la fin de <s>

strcmp(<s>, <t>)

compare <s> et <t> lexicographiquement et fournit un résultat:

négatif si <s> précède <t>

zéro si <s> est égal à <t>

positif si <s> suit <t>

strncpy(<s>, <t>, <n>) copie au plus <n> caractères de <t> vers <s>

strncat(<s>, <t>, <n>) ajoute au plus <n> caractères de <t> à la fin de <s>

<n> représente un nombre du type int.

Les symboles <s> et <t> peuvent être remplacés par :

* une chaîne de caractères constante

* le nom d'une variable déclarée comme tableau de char

* un pointeur sur char

(108)

Application 1

Ecrire un programme qui lit deux chaînes de

caractères CH1 et CH2, les compare et affiche le résultat:

Exemple:

Donner la première chaîne: ABC

Donner la deuxième chaîne: abc

"AMC" précède "abc"

(109)

main()

{ /* Déclarations */

char CH1[250], CH2[250];

int RESULTAT;

printf(« Donner la première chaîne de caractères : ");

gets(CH1);

printf(« Donner la deuxième chaîne de caractères : ");

gets(CH2);

/* Comparaison */

RESULTAT = strcmp (CH1,CH2);

if (RESULTAT <0)

printf("\"%s\" précède \"%s\"\n",CH1 ,CH2);

else if (RESULTAT >0)

printf("\"%s\" précède \"%s\"\n",CH2 ,CH1);

else

printf("\"%s\" est égal à \"%s\"\n",CH1, CH2);

return 0;

}

(110)

Application 2

Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la première

moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher le résultat.

 a) Utiliser les fonctions spéciales de <string>.

 b) Utiliser uniquement les fonctions gets et

puts

(111)

#include <stdio.h>

#include <string.h>

main() {

char CH1[100], CH2[100]; /* chaînes données */

char CH3[100]=""; /* chaîne résultat */

/* Saisie des données */

printf("la première chaîne de caractères : ");

gets(CH1);

printf(" la deuxième chaîne de caractères : ");

gets(CH2);

strncpy(CH3, CH1, strlen(CH1)/2);

strncat(CH3, CH2, strlen(CH2)/2);

/* Affichage */

printf("Un demi \"%s\" plus un demi \"%s\" donne \"%s\"\n", CH1, CH2, CH3);

return 0;

}

(112)

7.7.1. Déclaration, initialisation et mémorisation

Un tableau de chaînes de caractères correspond à un tableau à deux dimensions

du type char, où chaque ligne contient une chaîne de caractères.

Déclaration

char JOUR[7][9];

réserve l'espace en mémoire pour 7 mots contenant 9 caractères

(dont 8 caractères significatifs).

(113)

Initialisation

char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi",

"samedi",

"dimanche"};

Mémorisation

(114)

Application 3

Ecrire un programme qui lit un nombre entre 1 et 7 et qui affiche le nom du jour de la semaine correspondant:

Utiliser le premier élément du tableau pour

mémoriser un petit message d'erreur.

(115)

1. Adressage de variables 2. Les pointeurs

3. Pointeurs et tableaux 4. Tableaux de pointeurs

5. Allocation dynamique de mémoire

Références

Documents relatifs

Tout d’abord, nous pouvons comparer ce genre de récit merveilleux à la légende qui, comme lui, fut en premier lieu un récit oral avant d’être écrit.. C’est-à-dire que nous

méchant bavard stupide sportif marrant

L’égalité est-elle vérifiée?... Répondre par VRAI

[r]

Les thérapies cognitives sont une forme de thérapie comportementales agissant plus dans le sens de la prescription (à quelqu’un), elles n’ont rien à voir avec les

Cette deuxième réponse fait des particules consécutives des mar- queurs forts de polyphonie puisque, non seulement elles signale- raient que le garant (le danger est à éviter) peut

To describe and introduce things or people in French, two common phrases are used: c'est and il/elle est.. The plural forms are ce sont and

Le Traité de Lisbonne prévoit l’élection d’un Président Européen pour deux ans et demi : cette présidence stable va-t-elle gagner en efficacité et permettre une nouvelle