44
C : calculs et structures de contrˆ ole C : calculs et structures de contrˆole 1 / 44

C : calculs et structures de contrôle

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C : calculs et structures de contrôle

C : calculs et structures de controle

C : calculs et structures de controle 1 / 44

Page 2: C : calculs et structures de contrôle

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 2 / 44

Page 3: C : calculs et structures de contrôle

Credits

Sur la bibliotheque math.h

Sur les operateurs arithmetiques et la difference entre instruction etexpression

Sur les expressions conditionnelles et les boucles

Sur les subtilites (Hors Programme) de l’incrementation

C : calculs et structures de controle 3 / 44

Page 4: C : calculs et structures de contrôle

Operateurs et calculs

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 4 / 44

Page 5: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 5 / 44

Page 6: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

5 operateurs sans surprise♥

Les operateurs arithmetiques ne devraient pas surprendre les utilisateurs dePython :

l’addition +

la soustraction -

la multiplication *

la division / (euclidienne ou flottante)

le modulo % .

C : calculs et structures de controle 6 / 44

Page 7: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Convention

Dans ce qui suit, on indique uniquement les operations a realiser mais onomet l’empaquetage dans la fonction main et les importations.

C : calculs et structures de controle 7 / 44

Page 8: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Exemple

Avec

1 i n t n1 = 2 ;2 i n t n2 = 3 ;3 p r i n t f ( ”%i+%i=%i \n” , n1 , n2 , n1+n2 ) ;

On obtient :

2+3=5

C : calculs et structures de controle 8 / 44

Page 9: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Exemple

Avec

1 i n t n1 = 2 ;2 i n t n2 = 3 ;3 p r i n t f ( ”%i*% i=%i \n” , n1 , n2 , n1*n2 ) ;

On obtient :

2*3=6

C : calculs et structures de controle 9 / 44

Page 10: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Exemple

Avec

1 p r i n t f ( ”%i−%f=%f \n” , 3 , 5 . 6 ,3−5 . 6) ; // c o e r c i t i o n de t y p e2

On obtient

3 -5.600000= -2.600000

On observe que, comme en Python, le type entier est transforme enflottant lorsque les operandes sont des deux types.

C : calculs et structures de controle 10 / 44

Page 11: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Exemple

Avec

1 p r i n t f ( ”%i /% i=%i \n” , 9 , 4 , 9 / 4 ) ;2 p r i n t f ( ”%i /%f=%f \n” , 9 , 3 . 6 ,9/3 . 6) ;3 p r i n t f ( ”%f/%f=%f \n” ,9 . ,3 . 6 ,9/3 . 6) ;4

On obtient

9/4=2

9/3.600000=2.500000

9.000000/3.600000=2.500000

On observe toujours le phenomene de coercition de type. De plus lecomportement de l’operateur de division est celui de Python 2.7 :lorsque les deux operandes sont des entiers, c’est la divisioneuclidienne qui est effectuee. Dans tous les autres cas, il s’agit de ladivision des flottants.

C : calculs et structures de controle 11 / 44

Page 12: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Exemple

On calcule le reste de la division des entiers avec l’operateur % commeen Python :

1 i n t n1 = 11 ;2 i n t n2 = 3 ;3 p r i n t f ( ”%i %% %i = %i \n” , n1 , n2 , n1%n2 ) ;4

Sans surprise, on obtient :

11 % 3 = 2

On remarque que l’echappement en C consiste a mettre un caracterepercent % avant le caractere a echapper.♥

C : calculs et structures de controle 12 / 44

Page 13: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Incrementation

Pour incrementer une valeur, on ecrit en CPGE

1 n1 = n1 + 1 ;2

Hors programme : Pour incrementer (sous-entendu de 1) une variablen1. On peut preferer la syntaxe suivante :

1 n1++; // ou e n c o r e : ++n1 ;2

Cette syntaxe est indiquee pour ne pas susciter la surprise dans lalecture de codes lus sur le Web ou dans des sujet mal concusl’utilisant. (PI)

C : calculs et structures de controle 13 / 44

Page 14: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

Incrementation

Hors programme. (PI)

Il y a une difference entre x=n++ (passe d’abord la valeur de n a x etincremente n apres) et x=++n (incremente d’abord n et passe lavaleur incrementee a x).

1 i n t n = 2 ;2 i n t x ;3 x=++n ;4 p r i n t f ( ” a p r e s x=++n on a x=%i , n=%i \n” , x , n ) ;5 x=n++;6 p r i n t f ( ” a p r e s x=n++ on a x=%i , n=%i \n” , x , n ) ;

apres x=++n on a x=3, n=3

apres x=n++ on a x=3, n=4

C : calculs et structures de controle 14 / 44

Page 15: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

La bibliotheque math

Importons une bibliotheque supplementaire avec# include <math.h> .

On dispose maintenant des fonctions usuelles parmi lesquelles pow

pour elever un double a une puissance.

1 #i n c l u d e <math . h> // f i c h i e r p e r s o s q u a r e . c2 #i n c l u d e <s t d i o . h>3

4 i n t main ( ) {5 d o u b l e v a l u e ;6 p r i n t f ( ” V e u i l l e z s a i s i r une v a l e u r : ” ) ;7 s c a n f ( ”%l f ” , &v a l u e ) ; // a t t e n d un d o u b l e8 p r i n t f ( ” Le c a r r e de %g e s t %g . \n” ,9 v a l u e , pow ( v a l u e , 2 ) ) ;

10 r e t u r n 0 ;11 }

Remarque : L’option %g est un specificateur de format pour les

double tel que les 0 ou le point decimal a la fin du nombre ne sontpas imprimes. C : calculs et structures de controle 15 / 44

Page 16: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

La bibliotheque math

Explication du code :

On importe la bibliotheque math dans laquelle se trouve la fonctionpow .

Une variable value est creee, sa valeur est recuperee au clavier et

mise a l’adresse indiquee par &value selon la syntaxe de scanf .

Ensuite on calcule son carre par pow(value,2) et un message est

finalement affiche.

Sortie :

$ ./ square

Veuillez saisir une valeur : 32

Le carre de 32 est 1024.

C : calculs et structures de controle 16 / 44

Page 17: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

La bibliotheque math ♥Edition des liens

Pour que le compilateur sache ou se trouve <math.h> , il faut lui

indiquer dans quelle librairie il se trouve : il s’agit de la librairie libm .

L’option de gcc qui permet de preciser une librairie est

-lbibliotheque , donc l suivi du nom de la bibliotheque sans leprefixe � lib � ni son extension � .h �.

Puisque la bibliotheque desiree s’appelle libm, on fait le lien enecrivant -lm .

Compilation du fichier square.c

gcc square.c -o square -lm

C : calculs et structures de controle 17 / 44

Page 18: C : calculs et structures de contrôle

Operateurs et calculs Operateurs

La bibliotheque mathQuelques fonctions utiles de <math.h>

ceil qui calcule dxe, la partie entiere vers +∞ du double x .

floor qui calcule bxc, la partie entiere vers −∞ du double x .

sqrt la racine carree.

sin, cos, tan les fonctions trigos.

asin,acos,atan leurs reciproques.

exp, log, log10 exponentielle, logarithme neperien pour attendre etlogarithme de base 10.

C : calculs et structures de controle 18 / 44

Page 19: C : calculs et structures de contrôle

Les instructions conditionnelles

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 19 / 44

Page 20: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 20 / 44

Page 21: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Pas de type bouleen importe par defaut

En C, il n’existe pas de type bouleen importe par defaut.

A la place, la valeur 0 represente le bouleen false et toute autrevaleur, true.

Or, ce n’est pas l’esprit du programme d’info en CPGE. Une bonnefacon de mettre des bouleens dans un programme C est alorsd’importer la bibliotheque #include <stdbool.h> .♥

C : calculs et structures de controle 21 / 44

Page 22: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Operateurs bouleens ♥

Les voici :Symbole Signification

&& ET

|| OU

! NON

C : calculs et structures de controle 22 / 44

Page 23: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Evaluation paresseuse ♥

En C comme dans la plupart des langages, l’evaluation desexpressions bouleenne est paresseuse. Cela dignifie que le langageconnaıt les tables de verite.

Ainsi, si f est une fonction a valeurs bouleennes et e1,e2 sont du

type de ses arguments, alors dans f(e1) && f(e2) , le programme

n’evalue f(e2) que si f(e1) est Vrai.

En effet, si f(e1) s’evalue en Faux, la conjonction sera fausse quelle

que soit la valeur de f(e2) .

Dans la meme veine, pour f(e1) || f(e2) , le programme le

programme n’evalue f(e2) que si f(e1) est Faux.

C : calculs et structures de controle 23 / 44

Page 24: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Les comparateurs ♥

On donne le tableau suivant deja connu des utilisateurs de Python :Symbole Signification

== est egal a

> est strictement superieur a

< est strictement inferieur a

>= est superieur ou egal a

<= est inferieur ou egal a

! = est different deComme en Python, le symbole = n’est pas un operateur de comparaisonmais d’affectation.

C : calculs et structures de controle 24 / 44

Page 25: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Si alors sinonSyntaxe

La syntaxe est la aussi proche de Python :

1 i f ( /* Votre c o n d i t i o n */ )2 {3 // I n s t r u c t i o n s a ex e c u t e r s i l a c o n d i t i o n e s t v r a i e4 }5 e l s e6 {7 // I n s t r u c t i o n s a ex e c u t e r s i l a c o n d i t i o n e s t v r a i e8 }

La condition s’exprime entre parentheses.

De plus, contrairement a Python, l’indentation ne fait pas sens en C.Aussi faut-il mettre les blocs d’instructions entre accolades. ♥On evite d’ecrire les accolades sur une seule ligne comme dans

else {printf(3);} pour des raisons de lisiblite.

C : calculs et structures de controle 25 / 44

Page 26: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Si alors sinon ♥Detection et affichage de la parite d’un entier saisi

1 // p a r i t e d ’ un e n t i e r2 i n t n ;3 p r i n t f ( ” e n t r e r un nombre e n t i e r : ” ) ;4 s c a n f ( ”%i ” ,&n ) ;5 i f ( n%2==0)6 {7 p r i n t f ( ” v o t r e nombre e s t p a i r \n” ) ;8 }9 e l s e

10 {11 p r i n t f ( ” v o t r e nombre e s t i m p a i r \n” ) ;12 }

C : calculs et structures de controle 26 / 44

Page 27: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Si alors sinonelse if

Le elif de Python s’ecrit else if en C et se place entre if etelse :

1 // I n d i c a t i o n du nombre de r a c i n e s d ’ un t r i n ome du 2nd d e gr e2

3 d o u b l e d e l t a ;4 p r i n t f ( ” e n t r e r l a v a l e u r du d i s c r i m i n a n t : ” ) ;5 s c a n f ( ”%l f ” ,&d e l t a ) ;6 i f ( d e l t a==0)7 {8 p r i n t f ( ” une r a c i n e d o u b l e \n” ) ; }9 e l s e i f ( d e l t a > 0)

10 {11 p r i n t f ( ” deux r a c i n e s r e e l l e s \n” ) ; }12 e l s e13 {14 p r i n t f ( ” pas de r a c i n e r e e l l e \n” ) ; }15

C : calculs et structures de controle 27 / 44

Page 28: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Avec des bouleens

Ceci devrait toujours afficher vrai :

1 # i n c l u d e <s t d i o . h>2 #i n c l u d e <s t d b o o l . h>3 i n t main ( )4 {5 i f ( t r u e )6 {7 p r i n t f ( ” v r a i \n” ) ;8 }9 e l s e

10 {11 p r i n t f ( ” f a u x \n” ) ;12 }13 }

C : calculs et structures de controle 28 / 44

Page 29: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Importance des accolades

Un bug de securite celebre, le � Goto Fail � dans le SSL (protocolede communication) de iOS, etait du a une mauvaise indentationd’une instruction goto fail; .

Cela laissait penser que le goto etait dans le bloc d’une instructionconditionnelle alors qu’il etait en realite au niveau global.

Les IPhone sont restes vulnerables a une attaque de typeMan-in-The-Middle durant un an et demi avant que le bug soitidentifie en janvier 2014 !

Il vaut toujours mieux mettre le contenu des blocs entre accolades,meme pour une ligne de code !

C : calculs et structures de controle 29 / 44

Page 30: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Bug SSL d’IOS

Figure – Une instruction globale mal positionnee (source advens)

C : calculs et structures de controle 30 / 44

Page 31: C : calculs et structures de contrôle

Les instructions conditionnelles Bouleens

Les instructions ternaires (PI)

Hors programme. Donne pour le cas ou un sujet l’utiliserait.Il s’agit d’un sucre syntaxique permettant d’ecrire en une ligne uneinstruction conditionnelle.

Considerons ce programme qui met a jour une variable a suivant laparite d’une variable n

1 i f ( n%2==1) // ou j u s t e ( n%2)2 a = 2*n+1 ; // on ne met pas d ’ a c c o l a d e c a r 1 s e u l e

i n s t r u c t i o n3 e l s e4 a = n−2 ;

On peut l’ecrire de facon plus condensee :

1 a = ( n%2) ? 2*n+1 : n−2 ;

Cela se comprend comme :est-ce que n%2 est different de 0 ?Si oui renvoyer 2n + 1,sinon renvoyer n − 2.

C : calculs et structures de controle 31 / 44

Page 32: C : calculs et structures de contrôle

Les boucles

1 Operateurs et calculsOperateurs

2 Les instructions conditionnellesBouleens

3 Les boucles

C : calculs et structures de controle 32 / 44

Page 33: C : calculs et structures de contrôle

Les boucles

Diagramme d’une boucle while

Entree

Condition

Corps de la boucle

Sortie

Faux

Vrai

C : calculs et structures de controle 33 / 44

Page 34: C : calculs et structures de contrôle

Les boucles

Boucle while

La syntaxe est tres proche de celle de Python :

1 w h i l e ( C o n d i t i o n )2 {3 // I n s t r u c t i o n s a r e p e t e r4 }

C : calculs et structures de controle 34 / 44

Page 35: C : calculs et structures de contrôle

Les boucles

Exemple ♥

Voici une boucle qui demande d’entrer un nombre jusqu’a ce quel’utilisateur saisisse 10 :

1 i n t nb =0 ;2 w h i l e ( nb != 10)3 {4 p r i n t f ( ” e n t r e r un nb e n t i e r : ” ) ;5 s c a n f ( ”%d” , &nb ) ;6 }

Le programme entre au moins une fois dans la boucle. Voici une traced’execution :

entrer un nb entier :12

entrer un nb entier :10

C : calculs et structures de controle 35 / 44

Page 36: C : calculs et structures de contrôle

Les boucles

Autres exemples

On peut utiliser un compteur :

1 i n t compteur = 0 ; // l e compteur2

3 w h i l e ( compteur < 3)4 {5 p r i n t f ( ” l e compteur vaut %i . \n” , compteur ) ;6 compteur = compteur +1 ; // i n c r e mentat ion de 17 }

Un exemple de boucle infinie :

1 w h i l e ( 1 )2 {3 p r i n t f ( ” c a ne s ’ a r r e t e j a m a i s ! ” )4 }

C : calculs et structures de controle 36 / 44

Page 37: C : calculs et structures de contrôle

Les boucles

Diagramme d’une boucle do-while

Entree

Condition

Corps de la boucle

Sortie

Faux

Vrai

C : calculs et structures de controle 37 / 44

Page 38: C : calculs et structures de contrôle

Les boucles

Boucle do-while

Considerons :

1 w h i l e ( C o n d i t i o n )2 {3 // I n s t r u c t i o n a ex e c u t e r au moins une f o i s s o u s

p e i n e de mort4 }

Si la condition n’est pas realisee alors l’� Instruction a executer aumoins une fois sous peine de mort � n’est jamais effectuee.Une facon d’eviter cela est de mettre le test de sortie de boucle a lafin :

1 i n t compteur = 0 ; // l e compteur2 do3 {4 p r i n t f ( ” l e compteur vaut %i . \n” , compteur ) ;5 compteur++; // i n c r e mentat ion de 16 }w h i l e ( compteur < 0) ; // ne pas o u b l i e r l e ” ; ” i c i !

Apres compilation et execution :

le compteur vaut 0.C : calculs et structures de controle 38 / 44

Page 39: C : calculs et structures de contrôle

Les boucles

Boucle for

Syntaxe

1 f o r ( /* E x p r e s s i o n /De c l a r a t i o n */ ; /* C o n d i t i o n */ ; /*E x p r e s s i o n */ )

2 {3 /* I n s t r u c t i o n s a r e p e t e r */4 }5

La syntaxe d’une boucle for se decompose en trois parties :

une expression et/ou une declaration qui est le plus souvent ;l’initialisation d’une variable ;une conditionune seconde expression, qui consistera le plus souvent enl’incrementation d’une variable ;Le corps de la boucle (entre accolades).

C : calculs et structures de controle 39 / 44

Page 40: C : calculs et structures de contrôle

Les boucles

Boucle for ♥Compteur local

Exemple

1 # i n c l u d e <s t d i o . h>2 i n t main ( ) {3 f o r ( i n t c = 10 ; c <13 ; c = c+1)4 {5 p r i n t f ( ” l e compteur vaut %i \n” , c ) ; // c e s t l o c a l6 }// a c c o l a d e s non n e c e s s a i r e s : i n s t r u c t i o n u n i q u e7 r e t u r n 0 ; }8

CommentairesLa variable c n’a pas d’existence en dehors de la boucle.

Au lieu de c=c+1 on peut ecrire c++ mais c’est deconseille en CPGE

Retour

le compteur vaut 10

le compteur vaut 11

le compteur vaut 12

C : calculs et structures de controle 40 / 44

Page 41: C : calculs et structures de contrôle

Les boucles

Boucle forCompteur global

Dans le code precedent, on a declare le compteur dans la bouclefor .

On peut aussi le declarer avant. La variable devient globale.

1 #i n c l u d e <s t d i o . h>2 i n t main ( ) {3 i n t i ; // i e s t g l o b a l e4 f o r ( i=0 ; i<2 ; i=i+1)5 p r i n t f ( ” l a v a r i a b l e i vaut %d\n” , i ) ;6 p r i n t f ( ” en s o r t i e , i vaut %d\n” , i ) ; // i e s t g l o b a l e7 r e t u r n 0 ;8 }9

Retour

la variable i vaut 0

la variable i vaut 1

en sortie , i vaut 2

C : calculs et structures de controle 41 / 44

Page 42: C : calculs et structures de contrôle

Les boucles

Plusieurs compteurs (PI)

Le nombre de compteurs et de conditions n’est pas limite. Maisattention a la lisibilite !

1 #i n c l u d e <s t d i o . h>2

3 i n t main ( ) {4 f o r ( i n t i=0 , j=5 ; i<3 && j> −50 ; i=i+1 , j=j−10)5 p r i n t f ( ” i = %d ; j=%d\n” , i , j ) ;6 r e t u r n 0 ;7 }8

Retour

i = 0; j=5

i = 1; j=-5

i = 2; j=-15

C : calculs et structures de controle 42 / 44

Page 43: C : calculs et structures de contrôle

Les boucles

Boucles imbriquees ♥

On peut imbriquer des boucles.

1 #i n c l u d e <s t d i o . h>2

3 i n t main ( ) {4 i n t c=0 , t=0 ;5 f o r ( i n t i = 0 ; i <= 10 ; ++i )6 f o r ( i n t j = i ; j <= 10 ; ++j )7 f o r ( i n t k = j ; k <= 10 ; ++k )8 { i f ( i /10 .+( j /10 .+k /10 . ) !=9 ( i /10 .+j /10 . )+k /10 . )

10 {c=c+1 ; }11 t=t+1 ; }12 p r i n t f ( ”Non r e s p e c t a s s o c i a t i v i t e : %d/%d\n” , c , t ) ;13 }14

Retour

Non respect associativit e : 62/286

C : calculs et structures de controle 43 / 44

Page 44: C : calculs et structures de contrôle

Les boucles

Quand peut-on se passer d’accolades dans les blocs ?

On peut (eventuellement) se passer d’accolades dans le bloc positif (ounegatif) d’une instruction conditionnelle ou dans le corps d’une boucledo-while, while, for mais il faut etre prudent ! (cf bug SSL).

C : calculs et structures de controle 44 / 44