Poser une question
Faire participer l'utilisateur, et utiliser sa réponse.
Après cette fiche, vous saurez :
- demander quelque chose à l'utilisateur
- garder sa réponse dans une variable
- transformer une réponse en nombre pour pouvoir calculer
- dessiner la saisie dans un ordinogramme
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 :
| Morceau | Ce que ça veut dire |
|---|---|
string | Le type de boîte : elle contiendra du texte. |
prenom | Le 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 : ");
Votre prénom : Sofia2Utiliser 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} !");
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}.");
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.
- Avec des nombres, il additionne.
- Avec du texte, il colle.
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 :
- Vous voulez seulement afficher la réponse ?
stringsuffit. - Vous voulez calculer avec ? Il faut convertir avec
int.Parse.
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 :
- Je pose mes questions —
WritepuisReadLine - Je convertis, si je dois calculer —
int.Parse - Je calcule
- J'efface l'écran —
Clear - J'affiche le résultat —
WriteLine - 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.
| Forme | Ce qu'elle veut dire |
|---|---|
| Ovale | Début ou fin |
| Rectangle | Un traitement : calcul, valeur donnée à une variable |
| Trapèze | Afficher 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 :
- Le trapèze pour poser la question — c'est un affichage, elle
sort vers l'écran (
Console.Write). - Le parallélogramme pour récupérer la réponse dans une variable —
c'est ce qui entre depuis le clavier (
Console.ReadLine).
Le programme correspondant :
Console.Write("Votre prénom : "); string prenom = Console.ReadLine(); Console.WriteLine($"Bonjour {prenom}");
Chaque ligne du code a sa forme :
Console.Write("…")— trapèze, on affiche la question.prenom = ReadLine()— parallélogramme, on récupère la réponse.Console.WriteLine("…")— trapèze, on affiche le résultat.
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
Recopiez ce programme et lancez-le.
Console.Write("Votre prénom : "); string prenom = Console.ReadLine(); Console.WriteLine($"Bonjour {prenom} !"); Console.ReadKey();
Solution
Votre prénom : Sofia
Bonjour Sofia !Trois vérifications si ça ne marche pas :
- Le
$est bien devant le guillemet. prenomest écrit exactement pareil aux deux endroits.ReadLinea bien deux majuscules : le R et le L.
Reprenez l'aventure de Radakass de la fiche 5.
- Au lieu de fixer
hp = 50;, demandez à l'utilisateur combien de points de vie Radakass doit avoir au départ. - N'oubliez pas de convertir la réponse en nombre.
- Gardez les trois évènements : −2, −10, puis +5.
- 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();
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.
Écrivez le programme d'une petite caisse.
- Demandez le nom du client.
- Demandez trois montants d'achat, l'un après l'autre (des nombres entiers, en euros).
- Calculez le total en partant de zéro et en ajoutant chaque montant, comme pour le bon d'achat de la fiche 5.
- Effacez l'écran.
- Affichez un ticket avec le nom du client, les trois montants et le total.
- 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();
*******************************
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
- Je sais poser une question avec Write et ReadLine.
- Je sais que ReadLine donne toujours du texte.
- Je sais convertir une réponse en nombre avec int.Parse.
- Je sais mettre mon programme en pause à la fin.
- Je reconnais le parallélogramme dans un ordinogramme.
Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.