programmation en c contrôle du...

22
Programmation en C Contrôle du programme 20170201 Gabriel Risterucci

Upload: others

Post on 27-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

Programmation en CContrôle du programme

2017­02­01

Gabriel Risterucci

Page 2: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

1 ‐ DANS L'ÉPISODE PRÉCÉDENT...Cours

Variable → un moyen de retenir des valeurs principalement numériquesIl y a des variables locales et des variables globalesExpression → série d'opérations produisant un résultatUne expression est constitué d'opérandes et d'opérateursLes appels de fonctions ne sont qu'une forme d'expressionLes fonctions reçoivent les paramètres par valeurOn peut afficher du texte et récupérer des saisies depuis la console via puts(), printf() etscanf()

TP

Aperçu : les fonctions peuvent retourner une valeur après leur exécution

Page 3: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

2 ‐ COMPLÉMENT DU TPLorsqu'une fonction est déclarée comme pouvant renvoyer un type de donnée (ex. int, char…)le corps de la fonction doit contenir au moins une instruction return.

La syntaxe de return est la suivante :

return <expression> ;

On peut donc, comme à beaucoup d'endroits, passer une expression (aussi simple ou complexeque l'on veut) à return.

Il peut y avoir plusieurs return dans une même fonction. Lorsque l'exécution arrive sur uneinstruction return, l'expression est évaluée et la fonction se termine immédiatement.

La valeur ainsi retournée prend la place de l'appel de fonction dans l'expression qui a donné lieuà l'appel de la fonction.

Page 4: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

3 ‐ SOMMAIRE DU COURSRappels de logiqueLogique en COpérateurs logiquesBlocs d'instructionsExécution séquentielle ?Les structures de contrôleLes bouclesTest conditionnelBranchementBlocs d'instructions V2

Page 5: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

AND 0 10 0 01 0 1

OR 0 10 0 11 1 1

XOR 0 10 0 11 1 0

NOT0 11 0

4 ‐ RAPPELS DE LOGIQUEOn parle ici des opérations logiques ET (AND), OU (OR), NON (NOT) et OU exclusif (XOR).

0 ≡ false1 ≡ true

Page 6: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

5 ‐ LOGIQUE EN C [1/2]Le C permet de réaliser des opérations sur des valeurs booléennes. N'importe quel expressionpeut être utilisée dans un test logique : si l'expression est évaluée à 0, alors la valeur est fausse.Toute autre valeur de l'expression signifie que la valeur est vraie.

Pendant longtemps, on a utilisé différents types primitifs pour représenter des variablesbooléennes: int, char… mais il existe maintenant un type standardisé appelé _Bool.

Pour des raisons de commodités, on l'appelle simplement bool. Il existe aussi deux constantesappelée true et false.

Pour utiliser le type bool il faut inclure le fichier stdbool.h avec la directive #include<stdbool.h> dans votre code source.

Page 7: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

6 ‐ LOGIQUE EN C [2/2]L'utilisation correcte du type bool n'a que des avantages :

La clareté du code : une variable ou un paramètre de type bool indique clairement l'intentionde recevoir 0 ou 1L'affectation de n'importe quelle valeur non­nulle à une variable de type bool donneratoujours 1, même en cas de dépassement de capacitéLe compilateur peut choisir la taille « réelle » de la variable qui permet les meilleuresperformances

Pour finir sur les spécificités de la logique en C, les valeurs booléennes peuvent, commen'importe quel autre variable, faire partie d'expressions.

Page 8: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

a++ a‐‐ (function) [array]!a ++a ‐‐a ‐a ~! (cast) *a &a sizeofa*b a/b a%ba+b a‐ba<<b a>>ba<b a<=b a>b a>=ba==b a!=ba&b

a^ba|ba&&ba||ba=b a+=b a­=b a*=b a/=b a%=b a<<=ba>>=b a&=b a^=b a|=ba,b

7 ‐ OPÉRATEURS LOGIQUESVoici les opérateurs logiques par ordre de priorité :

On peut bien évidemment utiliser ces opérateurs dans des expressions avec d'autres; il n'y a pasde différence entre opérateurs logiques et opérateurs arithmétiques.

Page 9: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

void someFunc() int a = 12; int a = 20; printf("%d\n", a); // 20 printf("%d\n", a); // 12

On sait déjà que le corps d'une fonction estdélimité par et .

C'est en fait un bloc d'instructions. Et il estpossible d'avoir des blocs imbriqués les unsdans les autres.

8 ‐ BLOCS D'INSTRUCTIONS

On en profite pour remarquer ce qui se passe quand une variable en « écrase » une autre avec saportée.

Cependant, si créer des blocs d'instructions de cette façon peut améliorer la lecture, on restedans une exécution séquentielle…

Page 10: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

9 ‐ EXÉCUTION SÉQUENTIELLE ?Quel que soit le découpage que l'on fait avec des fonctions, l'exécution est toujoursséquentielle…

début main() fin

début main() prompt() prompt() squareAdd() display() fin

La possibilité d'utiliser des branchements pour changer de chemin apporterait un peu deflexibilité…

→ →

→ → → → → →

Page 11: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

10 ‐ LES STRUCTURES DE CONTRÔLELes structures de contrôle permettent de modifier le chemin d'exécution du programme.L'exécution reste séquentielle, mais on peut :

Sauter des morceaux de codeRépéter des morceaux de code

Ces changements dans l'ordre d'exécution sont conditionnels, et sont ce qui permet d'avoir desprogrammes complexes.

p3b

p3a

p4p1 p2 p5

Page 12: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

11 ‐ LES BOUCLES [1/7]Il existe trois types de boucles en C. Une boucle permet d'exécuter le même bloc d'instructionsplusieurs fois.

La plus importante est la boucle for. Elle permet de réaliser à peu prêt tous les types de bouclesimaginables.

for ( <decl> ; <condition expr.> ; <step expr.> )

<bloc instr.>

for (<decl>; <condition expr.>; <step expr.>) // ...

On remarque déjà le bloc d'instructions délimité par et …

Page 13: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

12 ‐ LES BOUCLES [2/7]for (<decl>; <condition expr.>; <step expr.>) // ...

<decl> : peut contenir une ligne de déclaration de variables (exemple : int i = 0;).<condition expr.> : peut contenir une expression qui sera évaluée avant chaque exécutiondu bloc d'instructions de la boucle

Si elle vaut 0 (équ. false) → l'exécution continue après le bloc d'instructionSi elle vaut 1 (équ. true) → l'exécution continue au début du bloc d'instruction

<step expr.> : peut contenir une expression qui sera évaluée après chaque exécution dubloc d'instructions de la boucle

Lorsque l'exécution arrive à la fin du bloc d'instructions, elle retourne au début, avec unenouvelle évaluation de <condition expr.>.

Page 14: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

void main() for (int i = 0; i < 10; ++i) printf("%d ", i);

void main() int val = 2; int result = 1; for (int exp = 5; exp; ‐‐exp) result *= val; printf("5^2=%d\n", result);

Le premier exemple affiche : 0 1 2 3 4 5 6 7 8 9

Le deuxième exemple affiche : 5^2=32

13 ‐ LES BOUCLES [3/7]Exemples de boucle for

Page 15: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

14 ‐ LES BOUCLES [4/7]Boucle « tant que »

Exécuter un bloc d'instructions tant qu'une condition (expression) est vraie.

while ( <expr.> ) <bloc d'instructions>

while (<expr.>) // ...

L'expression <expr.> est évaluée avant d'entrer dans le bloc d'instructions. Comme pour for sielle est false l'exécution continue après le bloc d'instructions. Lorsque l'exécution arrive à la findu bloc d'instructions, on remonte au début et on réévalue l'expression.

Page 16: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

15 ‐ LES BOUCLES [5/7]Boucle « faire tant que »

Exécuter un bloc d'instructions et continuer tant qu'une condition (expression) est vraie.

do <bloc d'instructions> while ( <expr.> ) ;

do // ... while (<expr>);

Attention : contrairement à for et while cette instruction doit être suivie par un point­virgule.

L'expression <expr.> est évaluée après le bloc d'instructions.

Page 17: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

16 ‐ LES BOUCLES [6/7]Éléments communs aux boucles

Il existe deux façons de sortir d'une boucle: soit lors de l'évaluation de sa condition, soit enutilisant l'instruction break.

Une instruction break fait sortir d'un niveau de boucle et non pas d'un niveau de blocd'instructions.

Il est possible d'arrêter prématurément une itération de boucle avec l'instruction continue.

Comme cas particulier, si on omet tous les éléments facultatifs d'une boucle for on obtient uneboucle infinie (l'utilisation de break est toujours possible).

for (;;) printf("WAA");

Page 18: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

17 ‐ LES BOUCLES [7/7]void main() for (int i = 20; i > 0; ‐‐i) if (i == 3) // arrêter avant d'afficher 3 break; if (i > 5 && i < 10) // sauter 6, 7, 8, 9 continue; printf("%d\n", i);

Page 19: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

18 ‐ TEST CONDITIONNELOn peut décider d'entrer ou d'ignorer un bloc d'instructions basé sur la valeur logique d'uneexpression.

if ( <expr.> ) <bloc d'instruction> <clause else>

if (<expr.>) // bloc true else // bloc false

Si l'expression est évaluée à true c'est le premier bloc d'instruction qui s'exécute. Si la conditionest false et qu'une clause else est présente, l'exécution continue dans celle ci.

Page 20: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

19 ‐ BRANCHEMENT [1/2]Un bloc switch permet de choisir où l'exécution va se rendre en fonction de plusieurspossibilitées.

switch ( <expr.> ) <bloc switch>

switch (<expr.>) // bloc switch

Le bloc switch est un bloc d'instructions dans lequel deux instructions spéciales peuvent êtreprésentes : case et break.

Page 21: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

20 ‐ BRANCHEMENT [2/2]void main() int a; scanf("%d", &a); switch (a) case 0: puts("Zéro"); break; case 1: puts("Un"); break; case 3: puts("3 ou plus"); case 2: puts("2 ou plus"); default: puts("Je ne comprend que 0 et 1");

Page 22: Programmation en C Contrôle du programmestephane.ayache.perso.luminy.univ-amu.fr/zoom/cours/Cours/ProgC/… · 6 ‐ LOGIQUE EN C [2/2] L'utilisation correcte du type bool n'a que

21 ‐ BLOCS D'INSTRUCTIONS V2Il est possible dans tous les cas à l'exception des définitions de fonctions de remplacer un blocd'instructions par une instruction seule :

if (true) puts("Vrai");

C'est généralement déconseillé; il est très facile de faire ensuite une modification rapide enajoutant une instruction que l'on souhaite conditionelle, en oubliant d'ajouter les crochets.Toujours les mettre ne coûte rien.