⌂ Programmation
Fiche 5 sur 13

Faire évoluer une variable

Calculer, et modifier une variable à partir de sa propre valeur.

Après cette fiche, vous saurez :

1Les quatre opérations

Rien de surprenant, sauf pour les symboles.

SigneOpérationExempleRésultat
+Addition7 + 29
-Soustraction7 - 25
*Multiplication7 * 214
/Division8 / 24

La multiplication s'écrit avec une étoile, pas avec un x. La division avec une barre oblique.

int hp = 50;
int soin = 5;

Console.WriteLine(hp + soin);   // 55
Console.WriteLine(hp - soin);   // 45
Console.WriteLine(hp * 2);      // 100
Console.WriteLine(hp / 2);      // 25

Attention

Avec des int, la division oublie le reste.

Console.WriteLine(7 / 2);    // affiche 3, et non 3,5

Une boîte int ne peut contenir qu'un nombre entier. L'ordinateur jette donc tout ce qui suit la virgule.

Nous verrons plus tard comment obtenir 3,5, avec un autre type de boîte. Pour l'instant, retenez simplement que la division entre entiers tombe toujours juste.

2Changer la valeur d'une variable

Une fois la boîte créée, on peut y mettre une nouvelle valeur autant de fois qu'on veut.

int hp = 50;
Console.WriteLine(hp);   // 50

hp = 40;
Console.WriteLine(hp);   // 40

hp = 12;
Console.WriteLine(hp);   // 12
Ce que l'ordinateur affiche
50
40
12

À chaque fois, l'ancienne valeur est effacée. Et on n'écrit int qu'une seule fois, tout au début.

3La ligne qui surprend tout le monde

Voici la ligne la plus importante de cette fiche.

hp = hp - 2;

En mathématiques, cette égalité est impossible : aucun nombre n'est égal à lui-même moins deux.

Mais souvenez-vous de la fiche 4 : le signe = ne veut pas dire « égal ». Il veut dire « reçoit ».

Comment l'ordinateur lit cette ligne

Il procède toujours en deux temps, de droite à gauche.

  1. Il calcule d'abord la partie de droite Il regarde ce qu'il y a dans la boîte hp. Disons 50. Il calcule 50 - 2, ce qui donne 48.
  2. Il range le résultat dans la boîte de gauche Il met 48 dans hp. L'ancienne valeur, 50, est effacée.

Résultat : hp vaut maintenant 48. La ligne se lit « hp reçoit hp moins 2 ».

À retenir

Une image utile : c'est comme un compte en banque.

Nouveau solde = ancien solde moins 20 euros.

Personne ne trouve cette phrase absurde. C'est pourtant exactement ce que fait hp = hp - 2;

Suivons Radakass pas à pas

int hp = 50;

hp = hp - 2;    // il se vautre dans la boue
hp = hp - 10;   // il prend une balle perdue
hp = hp + 5;    // il se baigne dans la fontaine magique
Ligne exécutéeCalcul effectuéhp vaut ensuite
int hp = 50;—50
hp = hp - 2;50 − 248
hp = hp - 10;48 − 1038
hp = hp + 5;38 + 543

À chaque ligne, l'ordinateur repart de la valeur actuelle de la boîte, et non de celle du début.

Attention

L'ordre des lignes change le résultat.

Ce n'est pas comme en mathématiques, où l'on peut réarranger les termes. Ici, chaque ligne part de ce que la précédente a laissé dans la boîte.

Sur papier, tracez toujours un petit tableau comme celui ci-dessus quand vous ne comprenez pas ce que fait un programme. C'est la méthode qu'utilisent aussi les professionnels.

4Le compteur

Un cas très fréquent : ajouter 1 chaque fois qu'il se passe quelque chose.

int nbEvents = 0;

nbEvents = nbEvents + 1;   // premier évènement
nbEvents = nbEvents + 1;   // deuxième évènement
nbEvents = nbEvents + 1;   // troisième évènement

Console.WriteLine($"Radakass a rencontré {nbEvents} évènements !");
Ce que l'ordinateur affiche
Radakass a rencontré 3 évènements !

C'est exactement le même mécanisme que hp = hp - 2, avec un + 1.

À retenir

Un compteur commence toujours à zéro.

Si vous oubliez int nbEvents = 0; au départ, l'ordinateur refusera de démarrer : il ne peut pas ajouter 1 à une boîte vide.

Le total, c'est le même principe

Au lieu d'ajouter 1, on ajoute un montant.

int totalAchats = 0;

totalAchats = totalAchats + 50;    // fournitures
totalAchats = totalAchats + 250;   // matières premières

Console.WriteLine($"Total du bon d'achat : {totalAchats} euros");
Ce que l'ordinateur affiche
Total du bon d'achat : 300 euros

5Un raccourci d'écriture

Comme on écrit tout le temps hp = hp - 2, il existe une écriture plus courte.

Écriture longueRaccourci
hp = hp + 5;hp += 5;
hp = hp - 2;hp -= 2;
nbEvents = nbEvents + 1;nbEvents++;

Les deux colonnes font exactement la même chose.

À retenir

Vous n'êtes pas obligé d'utiliser les raccourcis.

Ils sont plus courts, mais l'écriture longue montre bien mieux ce qui se passe. Utilisez celle avec laquelle vous êtes à l'aise.

Sachez simplement les lire : vous les rencontrerez partout dans le code des autres.

6L'ordinogramme de l'aventure

Rappel des trois formes :

FormeCe qu'elle veut dire
OvaleDébut ou fin
RectangleUn traitement : donner une valeur, faire un calcul
TrapèzeAfficher quelque chose
Début hp = 50 "Radakass a 50 HP" hp = hp - 2 "Radakass a 48 HP" hp = hp - 10 Fin

Le programme correspondant :

int hp = 50;
Console.WriteLine($"Radakass a {hp} HP");

hp = hp - 2;
Console.WriteLine($"Radakass a {hp} HP");

hp = hp - 10;

Remarquez que la même ligne de code apparaît deux fois, et que les deux trapèzes affichent pourtant des valeurs différentes. C'est normal : entre les deux, un rectangle a modifié la boîte.

À retenir

Sur un ordinogramme, écrivez dans les trapèzes ce qui s'affichera réellement, avec les valeurs.

Cela vous force à suivre le programme pas à pas — et c'est justement le but de l'exercice.

→Exercices

1L'aventure complète de RadakassRecopier

Recopiez ce programme et lancez-le. Avant de le lancer, calculez sur papier combien de HP il restera à Radakass à la fin.

int hp;
int nbEvents;

hp = 50;
nbEvents = 0;

Console.WriteLine("*****************************");
Console.WriteLine("Première aventure de Radakass");
Console.WriteLine("*****************************");

Console.WriteLine();
Console.WriteLine($"Radakass a {hp} HP");

Console.WriteLine("Radakass se vautre dans la boue...");
hp = hp - 2;
nbEvents = nbEvents + 1;

Console.WriteLine();
Console.WriteLine($"Radakass a {hp} HP");

Console.WriteLine("Radakass prend une balle perdue...");
hp = hp - 10;
nbEvents = nbEvents + 1;

Console.WriteLine();
Console.WriteLine($"Radakass a {hp} HP");

Console.WriteLine("Radakass se baigne dans une fontaine magique...");
hp = hp + 5;
nbEvents = nbEvents + 1;

Console.WriteLine();
Console.WriteLine($"Radakass a {hp} HP");
Console.WriteLine($"Radakass a rencontré {nbEvents} évènements !");

Solution

Ce que l'ordinateur affiche
*****************************
Première aventure de Radakass
*****************************

Radakass a 50 HP
Radakass se vautre dans la boue...

Radakass a 48 HP
Radakass prend une balle perdue...

Radakass a 38 HP
Radakass se baigne dans une fontaine magique...

Radakass a 43 HP
Radakass a rencontré 3 évènements !

Le calcul : 50 − 2 = 48, puis 48 − 10 = 38, puis 38 + 5 = 43.

Deux variables évoluent en parallèle, chacune de son côté. hp monte et descend, nbEvents ne fait qu'augmenter de 1.

À observer : la ligne Console.WriteLine($"Radakass a {hp} HP"); est écrite quatre fois, à l'identique. Elle affiche pourtant quatre valeurs différentes. C'est bien la preuve que le contenu de la boîte a changé entre-temps.

2Le bon d'achatModifier

Voici un programme incomplet. Recopiez-le et terminez-le.

int totalAchats;

totalAchats = 0;

Console.WriteLine("*******************************");
Console.WriteLine("Bon achat : 0123456789");
Console.WriteLine("*******************************");

// Ligne 1 : vous achetez pour 50 euros de fournitures
Console.WriteLine("Achat de 50 euros de fournitures");
totalAchats = totalAchats + 50;

// Ligne 2 : vous achetez pour 250 euros de matières premières
// À VOUS : affichez la ligne, puis ajoutez 250 au total.

// Ligne 3 : vous achetez pour 500 euros de pièces détachées
// À VOUS : affichez la ligne, puis ajoutez 500 au total.

// À VOUS : affichez le total du bon d'achat.

Vérifiez que le total final est correct.

Solution

int totalAchats;

totalAchats = 0;

Console.WriteLine("*******************************");
Console.WriteLine("Bon achat : 0123456789");
Console.WriteLine("*******************************");

// Ligne 1
Console.WriteLine("Achat de 50 euros de fournitures");
totalAchats = totalAchats + 50;

// Ligne 2
Console.WriteLine("Achat de 250 euros de matières premières");
totalAchats = totalAchats + 250;

// Ligne 3
Console.WriteLine("Achat de 500 euros de pièces détachées");
totalAchats = totalAchats + 500;

Console.WriteLine();
Console.WriteLine($"Total du bon d'achat : {totalAchats} euros");
Ce que l'ordinateur affiche
*******************************
Bon achat : 0123456789
*******************************
Achat de 50 euros de fournitures
Achat de 250 euros de matières premières
Achat de 500 euros de pièces détachées

Total du bon d'achat : 800 euros

Vérification : 0 + 50 + 250 + 500 = 800.

C'est exactement le mécanisme du compteur de Radakass. La seule différence est qu'on ajoute un montant au lieu d'ajouter 1.

Le piège classique : oublier totalAchats = 0; au début. Le programme refuse alors de démarrer, parce qu'on ne peut pas ajouter 50 à une boîte vide.

3Le combatCréer

Écrivez le programme d'un combat, en vous inspirant de Radakass.

  1. Trois variables : hpHeros à 100, hpMonstre à 60, et un compteur nbCoups à 0.
  2. Affichez les points de vie de départ des deux personnages.
  3. Le héros frappe : le monstre perd 25 points.
  4. Le monstre riposte : le héros perd 15 points.
  5. Le héros frappe à nouveau : le monstre perd 25 points.
  6. Après chaque coup, affichez les points de vie du personnage touché, et comptez le coup.
  7. Affichez le nombre total de coups à la fin.

Avant de coder, dessinez l'ordinogramme sur papier.

Solution

int hpHeros;
int hpMonstre;
int nbCoups;

hpHeros = 100;
hpMonstre = 60;
nbCoups = 0;

Console.WriteLine("=== DÉBUT DU COMBAT ===");
Console.WriteLine();
Console.WriteLine($"Le héros a {hpHeros} HP");
Console.WriteLine($"Le monstre a {hpMonstre} HP");

Console.WriteLine();
Console.WriteLine("Le héros attaque !");
hpMonstre = hpMonstre - 25;
nbCoups = nbCoups + 1;
Console.WriteLine($"Le monstre a {hpMonstre} HP");

Console.WriteLine();
Console.WriteLine("Le monstre riposte !");
hpHeros = hpHeros - 15;
nbCoups = nbCoups + 1;
Console.WriteLine($"Le héros a {hpHeros} HP");

Console.WriteLine();
Console.WriteLine("Le héros attaque encore !");
hpMonstre = hpMonstre - 25;
nbCoups = nbCoups + 1;
Console.WriteLine($"Le monstre a {hpMonstre} HP");

Console.WriteLine();
Console.WriteLine($"Le combat a duré {nbCoups} coups.");
Ce que l'ordinateur affiche
=== DÉBUT DU COMBAT ===

Le héros a 100 HP
Le monstre a 60 HP

Le héros attaque !
Le monstre a 35 HP

Le monstre riposte !
Le héros a 85 HP

Le héros attaque encore !
Le monstre a 10 HP

Le combat a duré 3 coups.

Trois boîtes qui évoluent en même temps. Chacune vit sa vie : deux descendent, une monte.

Le compteur nbCoups augmente à chaque coup, qu'il soit porté par le héros ou par le monstre. C'est bien ce que demandait l'énoncé : le nombre total de coups.

Vérification : le monstre passe de 60 à 35, puis à 10. Le héros passe de 100 à 85.

Je sais faire

Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.

← Fiche 4 Fiche 6 : Poser une question →