⌂ Programmation
Fiche 6 sur 13

Poser une question

Faire participer l'utilisateur, et utiliser sa réponse.

Après cette fiche, vous saurez :

1Demander quelque chose

Jusqu'ici, toutes les valeurs étaient écrites par vous, dans le programme. Radakass avait toujours 50 HP.

La commande Console.ReadLine() change cela : elle met le programme en pause et attend que l'utilisateur tape quelque chose, puis appuie sur Entrée.

Console.Write("Comment vous appelez-vous ? ");
string prenom = Console.ReadLine();

Décortiquons la deuxième ligne :

MorceauCe que ça veut dire
stringLe type de boîte : elle contiendra du texte.
prenomLe nom de la boîte. C'est vous qui le choisissez.
=Reçoit…
Console.ReadLine()…ce que l'utilisateur va taper.

À retenir

C'est exactement le mécanisme de la fiche 4. Une boîte, un nom, une valeur qu'on range dedans.

La seule nouveauté : la valeur ne vient plus de vous, elle vient de l'utilisateur.

Un nouveau type : string

int contient un nombre entier. string contient du texte : un prénom, une ville, une phrase.

int hp = 50;              // un nombre, sans guillemets
string prenom = "Sofia";  // du texte, avec guillemets

Attention

Utilisez Write et non WriteLine pour poser la question. La réponse s'affiche alors sur la même ligne, ce qui est bien plus agréable.

Console.Write("Votre prénom : ");
Ce que l'ordinateur affiche
Votre prénom : Sofia

2Utiliser la réponse

La réponse est dans la boîte. On l'affiche comme n'importe quelle variable, avec le dollar et les accolades.

Console.Write("Comment vous appelez-vous ? ");
string prenom = Console.ReadLine();

Console.WriteLine($"Bonjour {prenom} !");
Ce que l'ordinateur affiche
Comment vous appelez-vous ? Sofia
Bonjour Sofia !

On peut poser plusieurs questions. Une boîte par réponse, avec un nom différent.

Console.Write("Votre prénom : ");
string prenom = Console.ReadLine();

Console.Write("Votre ville : ");
string ville = Console.ReadLine();

Console.WriteLine($"Bonjour {prenom}, vous habitez à {ville}.");
Ce que l'ordinateur affiche
Votre prénom : Sofia
Votre ville : Binche
Bonjour Sofia, vous habitez à Binche.

3Le piège : ReadLine donne toujours du texte

C'est le point le plus important de cette fiche.

Console.ReadLine() donne toujours du texte, même quand l'utilisateur tape des chiffres.

Console.Write("Combien de HP ? ");
string reponse = Console.ReadLine();     // l'utilisateur tape 50

Console.WriteLine(reponse + 1);          // affiche 501 !

Pourquoi 501 ? Parce que la boîte contient le texte "50", et non le nombre 50. Le signe + a donc collé "50" et "1" bout à bout, comme deux mots.

À retenir

Le signe + a deux métiers.

C'est pour cela qu'il faut absolument savoir ce que contient une boîte.

La solution : convertir

Il faut transformer le texte en nombre. La commande s'appelle int.Parse.

Console.Write("Combien de HP ? ");
string reponse = Console.ReadLine();
int hp = int.Parse(reponse);

Console.WriteLine(hp + 1);       // affiche 51

Deux boîtes sont utilisées : reponse contient le texte, hp contient le nombre.

Une fois le mécanisme compris, on peut tout écrire sur une seule ligne :

int hp = int.Parse(Console.ReadLine());

À retenir

La règle est simple :

Attention

Si l'utilisateur tape autre chose qu'un nombre entier — « bonjour », ou « 12,5 » — le programme s'arrête brutalement avec un message d'erreur.

C'est normal pour l'instant. Nous verrons plus tard comment s'en protéger. En attendant, on suppose que l'utilisateur tape ce qu'on lui demande.

4Nettoyer l'écran et faire une pause

Effacer tout ce qui est affiché

Console.Clear();

Pratique après avoir posé toutes vos questions, pour présenter le résultat sur un écran propre.

Attendre avant de fermer

Console.Write("Appuyez sur une touche pour fermer...");
Console.ReadKey();

Console.ReadKey() attend n'importe quelle touche. Cela empêche la fenêtre de se refermer avant que l'utilisateur ait lu.

À retenir

Un programme complet suit presque toujours le même plan :

  1. Je pose mes questions — Write puis ReadLine
  2. Je convertis, si je dois calculer — int.Parse
  3. Je calcule
  4. J'efface l'écran — Clear
  5. J'affiche le résultat — WriteLine
  6. J'attends une touche — ReadKey

Gardez ce plan sous les yeux. Il convient à presque tous vos exercices.

5L'ordinogramme : la saisie

Une quatrième forme, pour représenter une question posée à l'utilisateur.

FormeCe qu'elle veut dire
OvaleDébut ou fin
RectangleUn traitement : calcul, valeur donnée à une variable
TrapèzeAfficher quelque chose — l'information sort vers l'écran
Parallélogramme
(un rectangle penché)
Demander quelque chose — l'information entre depuis le clavier

Les deux dernières formes vont par paire, et une saisie complète en utilise toujours une de chaque :

Début "Votre prénom : " prenom "Bonjour " + prenom Fin

Le programme correspondant :

Console.Write("Votre prénom : ");
string prenom = Console.ReadLine();

Console.WriteLine($"Bonjour {prenom}");

Chaque ligne du code a sa forme :

Attention

Le piège : ne dessinez jamais un seul parallélogramme pour « poser la question et lire la réponse ». Ce sont deux actions séparées, avec deux formes différentes : d'abord le trapèze qui affiche la question, ensuite le parallélogramme qui range la réponse dans une variable.

À retenir

Vous connaissez maintenant les quatre formes de base. Avec elles, vous pouvez dessiner tous les programmes vus jusqu'ici.

Il en reste une seule à découvrir, pour les choix. Ce sera pour la prochaine fiche.

→Exercices

1Bonjour à vousRecopier

Recopiez ce programme et lancez-le.

Console.Write("Votre prénom : ");
string prenom = Console.ReadLine();

Console.WriteLine($"Bonjour {prenom} !");

Console.ReadKey();

Solution

Ce que l'ordinateur affiche
Votre prénom : Sofia
Bonjour Sofia !

Trois vérifications si ça ne marche pas :

  • Le $ est bien devant le guillemet.
  • prenom est écrit exactement pareil aux deux endroits.
  • ReadLine a bien deux majuscules : le R et le L.
2Radakass personnaliséModifier

Reprenez l'aventure de Radakass de la fiche 5.

  1. Au lieu de fixer hp = 50;, demandez à l'utilisateur combien de points de vie Radakass doit avoir au départ.
  2. N'oubliez pas de convertir la réponse en nombre.
  3. Gardez les trois évènements : −2, −10, puis +5.
  4. Testez avec 50, puis avec 100.

Solution

int hp;
int nbEvents;

Console.Write("Combien de HP pour Radakass ? ");
string reponse = Console.ReadLine();
hp = int.Parse(reponse);

nbEvents = 0;

Console.Clear();

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($"Radakass a {hp} HP");

Console.WriteLine("Radakass prend une balle perdue...");
hp = hp - 10;
nbEvents = nbEvents + 1;
Console.WriteLine($"Radakass a {hp} HP");

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

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

Console.ReadKey();
Ce que l'ordinateur affiche
Combien de HP pour Radakass ? 100

*****************************
Première aventure de Radakass
*****************************

Radakass a 100 HP
Radakass se vautre dans la boue...
Radakass a 98 HP
Radakass prend une balle perdue...
Radakass a 88 HP
Radakass se baigne dans une fontaine magique...
Radakass a 93 HP

Radakass a rencontré 3 évènements !

Une seule ligne a vraiment changé par rapport à la fiche 5 : celle qui donne sa valeur à hp. Tout le reste du programme fonctionne à l'identique.

C'est la puissance des variables : le programme ne dépend plus d'un nombre écrit en dur. Il fonctionne avec n'importe quelle valeur de départ.

Si vous oubliez int.Parse, le programme refusera de démarrer : on ne peut pas ranger du texte dans une boîte int.

3La caisse du magasinCréer

Écrivez le programme d'une petite caisse.

  1. Demandez le nom du client.
  2. Demandez trois montants d'achat, l'un après l'autre (des nombres entiers, en euros).
  3. Calculez le total en partant de zéro et en ajoutant chaque montant, comme pour le bon d'achat de la fiche 5.
  4. Effacez l'écran.
  5. Affichez un ticket avec le nom du client, les trois montants et le total.
  6. Terminez par une pause.

Avant de coder, dessinez l'ordinogramme. Vous devriez y trouver quatre parallélogrammes.

Solution

string client;
int achat1;
int achat2;
int achat3;
int total;

Console.Write("Nom du client : ");
client = Console.ReadLine();

Console.Write("Premier achat (euros)   : ");
achat1 = int.Parse(Console.ReadLine());

Console.Write("Deuxième achat (euros)  : ");
achat2 = int.Parse(Console.ReadLine());

Console.Write("Troisième achat (euros) : ");
achat3 = int.Parse(Console.ReadLine());

// Le total se construit petit à petit
total = 0;
total = total + achat1;
total = total + achat2;
total = total + achat3;

Console.Clear();

Console.WriteLine("*******************************");
Console.WriteLine("             TICKET");
Console.WriteLine("*******************************");
Console.WriteLine($"  Client : {client}");
Console.WriteLine();
Console.WriteLine($"  Achat 1 : {achat1} euros");
Console.WriteLine($"  Achat 2 : {achat2} euros");
Console.WriteLine($"  Achat 3 : {achat3} euros");
Console.WriteLine();
Console.WriteLine($"  TOTAL   : {total} euros");
Console.WriteLine("*******************************");

Console.WriteLine();
Console.Write("Appuyez sur une touche...");
Console.ReadKey();
Ce que l'ordinateur affiche
*******************************
             TICKET
*******************************
  Client : Sofia Martin

  Achat 1 : 50 euros
  Achat 2 : 250 euros
  Achat 3 : 500 euros

  TOTAL   : 800 euros
*******************************

Appuyez sur une touche...

Deux types différents dans le même programme. Le nom du client est un string, parce qu'on ne calcule pas avec un nom. Les montants sont des int, parce qu'on les additionne.

Le total se construit ligne par ligne, exactement comme le bon d'achat de la fiche 5. On aurait aussi pu écrire total = achat1 + achat2 + achat3; en une seule fois : les deux sont corrects. La version en plusieurs lignes est celle qui s'adaptera le mieux quand vous aurez des boucles.

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

Je sais faire

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

← Fiche 5 Fiche 7 : Les nombres à virgule →