Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
C : calculs et structures de controle
C : calculs et structures de controle 1 / 44
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 2 / 44
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
Operateurs et calculs
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 4 / 44
Operateurs et calculs Operateurs
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 5 / 44
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
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
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
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
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
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
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
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
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
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
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
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
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
Les instructions conditionnelles
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 19 / 44
Les instructions conditionnelles Bouleens
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 20 / 44
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
Les instructions conditionnelles Bouleens
Operateurs bouleens ♥
Les voici :Symbole Signification
&& ET
|| OU
! NON
C : calculs et structures de controle 22 / 44
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
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
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
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
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
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
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
Les instructions conditionnelles Bouleens
Bug SSL d’IOS
Figure – Une instruction globale mal positionnee (source advens)
C : calculs et structures de controle 30 / 44
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
Les boucles
1 Operateurs et calculsOperateurs
2 Les instructions conditionnellesBouleens
3 Les boucles
C : calculs et structures de controle 32 / 44
Les boucles
Diagramme d’une boucle while
Entree
Condition
Corps de la boucle
Sortie
Faux
Vrai
C : calculs et structures de controle 33 / 44
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
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
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
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
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
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
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
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
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
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
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