La programmation C : cours 4 | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Nous abordons ce mois-ci des notions qui nous permettrons de complexifier nos programmes grâce a des instructions qui "sauterons " ou répéterons certaines parties de nos programmes.
Jusqu'a present les instrucutions de nos programmes étaient éxécutées séquentiellement, c'est à dire dans l'ordre ou elle apparaissaient. Nous allons donner l'occasion a notre programme, a prendre des décisions en fonction d'événements, ou a répeter des instructions jusqu'a ce qu'une circonstance particulière intervienne. |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
les différents opérateurs du langage C | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Nous ne reviendrons pas sur les opérateur communs du langage C (+, -, /, ...) mais plutôt sur ceux qui peuvent nous poser problème.
L'opérateur modulo '%' donne le reste de la division du premier opérande par le second opérande. Ainsi 11%3 donne 2 (3 * 3 = 9, il reste 2). Jusqu'a present lorsque nous voulions augmenter la valeur d'une variable de 1 nous faisions : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
variable=variable+1; | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
ou pour la diminuer de 1 :
|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
variable=variable-1; | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Nous pouvons avantageusement remplacer ces deux instructions par : | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//incrementation ++variable; //decrementation --variable; |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Si increment vaut 5, alors : | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
variable = ++increment-5; | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
affectera la valeur 1 a "variable" et 6 à "increment". Par contre si l'opérateur '++' est placé à gauche de la "LValue" alors : | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
variable = increment++ -5; | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
affectera la valeur 0 a "variable" (5-5) et 6 à "increment. On parlera donc d'opérateur de pré-incrémentation lorsque '++' sera placé avant la LValue, et de post-incrémentation dans le cas contraire. De même pour l'opérateur unaire '--' nous parlerons de pré-décrémetation et de post-décrémetation. De même en C on peut condenser les instructions de la forme : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
LValue = LValue opérateur donnée | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
tel que "variable = variable * 3", ou "variable = variable + 1" par : | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
LValue opérateur= donnée | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
ce qui nous donnerais "variable*= 3", ou "variable+=1". Ce genre "d'affectation élargies" concerne bien-sûr les cas +=, -=, /=, *=, %= et les opérateurs de manipulations de bits que nous verrons plus tard comme |=, &=, <<=, >>=. Nous passerons l'opérateur 'cast' expliqué dans l'annexe 3 pour parler de l'opérateur 'sizeof'. sizeof donne la taille en octets d'une donnée. Ainsi si nous avons le programme suivant : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//... short a; long b; //affichage de la taille en octets printf("%d, %d\n", sizeof(a), sizeof(b)); //... | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
nous aurons la sortie: | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
2, 4 | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
soit 2 octets pour le short et 4 octets pour le long. | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
l'algèbre booléènne | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
L'algèbre de Bool est soumise à la logique des propositions (intemporelle et instantanée). Soit une proposition est vraie (1) soit elle est fausse (0), il n'y a pas de " peut-être ".
Le programmeur pourra prendre des décisions en fonction de la valeur, d'un opérateur de comparaison ou d'une variable logique suivant que cette valeur est soit vraie (différente de 0), soit fausse (0). |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
c = a == b | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
si a est égal à b alors c prend la valeur 1 sinon c prend la valeur 0 ; | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
c = a < b | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
si a est inférieur à b alors c prend la valeur 1 sinon c prend la valeur 0 ; Le tableau ci-dessous énumère les différent opérateurs de comparaison. On peut ainsi dans nos programme insérer des " questions " (ou structure de contrôle) du genre " l'utilisateur a appuyé sur la touche 'o' ? si la réponse est faux (ou 0) alors faire tel instruction, sinon faire tel instruction. " ou bien " tant que la question, b est il supérieur ou égale a 10 ? est vraie (1) faire tel instruction et incrémenter b, sinon continuer le programme " Il existe en C différent type de structures de contrôle afin de pouvoir prendre des décision en fonction " d'événements " interieur ou exterieur au programme (appuis d'une touche, valeur d'une variable..). |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Structure de contrôle " if -else if - else " | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Cette structure de contrôle qui peut etre traduite par " si -sinon si- sinon " suit ce schéma :
|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//si nous avons la condition (condition est différent de 0) If (condition) { //alors exécuter les instructions suivantes : //bloc d'instruction } //sinon si on a cette condition : else if (condition) { //alors exécuter les instructions suivantes : //bloc d'instruction } //sinon exécuter ceci : else { //bloc d'instruction } |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Pour exemple, revenons sur l'exemple de question ci-dessus :
" l'utilisateur a appuyé sur la touche 'o' ? " Nous aurions en C : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//déclaration char reponse ; //attente de la réponse reponse = getchar() ; //absorde la validation de la réponse par enter getchar() ; //si on a appuyé sur 'o'… if (reponse == 'o') { printf(" l'utilisateur a appuyé sur 'o' ") ; } //… ou sur 'n'… if (reponse == 'n') { printf(" l'utilisateur a appuyé sur 'n' ") ; } //sinon else { printf(" mauvaise réponse ") ; } |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
la structure de contrôle while | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
La structure while, est une itération (structure répétitive) qui peut être traduite par " tant que "
Reprennons encore une fois l'exemple ci-dessus : " tant que b est strictement inférieur a 10 " : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//declaration de b int b = 0 ; //tant que b est inferieur a 10 while (b < 10) { //on affiche b et on l'incremente printf(" valeur de b : %d\n ", b++) ; } printf(" b a atteint la valeur 10\n ") ; |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Quelques remarques | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Faire toujours attention a ne pas confondre '=' (affectation) et '==' (comparaison). Faire toujours attention aux boucles infinies. Par exemple dans la boucle while ci-dessus nous aurions pu mettre 'b--' en lieu et place de 'b++'. 'b' aurait alors tendu vers - l'infini, et le programme ne se serait jamais terminé ! Un bloc est une suite d'instruction placée entre accolades. Un bloc peut être vide : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
{} //ou {;} | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Toute instruction dans un bloc doit être terminée par un ';'. Ainsi :
|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
{i++} | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
est syntaxiquement faux.
![]() la programmation événementielle est essentiellement basée sur les structures de contrôle Lorsqu'un bloc d'instruction ne contient qu'une instruction, nous pouvons omettre les accolades. Ainsi nous aurions pu avoir ci-dessus : |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
//… if (reponse == 'o') printf(" l'utilisateur a appuyé sur 'o' ") ; //… |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
C'était vraiment très interressant | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Nous continuerons dans notre prochain cours les structures de contrôle, et l'algèbre de bool, ce qui nous permettra d'aborder ensuite les fonctions et le "linkage". | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Annexes | |||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
[ Précédent | Index | Suivant ] |
|||||||||||||||||||||||||||||||||||
par Valentin BILLOTTE |