Au chapitre précédent, je vous ai expliqué comment afficher des variables dans la console. Voyons maintenant comment faire le contraire, c'est-à-dire demander des informations à l'utilisateur pour les stocker dans la mémoire.
Stockez les informations données par l'utilisateur
Voyons ce que cela donne avec un premier exemple :
#include <iostream>
using namespace std;
int main()
{
cout << "Quel age avez-vous ?" << endl;
int ageUtilisateur(0); //On prépare une case mémoire pour stocker un entier
cin >> ageUtilisateur; //On fait entrer un nombre dans cette case
cout << "Vous avez " << ageUtilisateur << " ans !" << endl; //Et on l'affiche
return 0;
}
Voici ce que cela donne avec mon âge :
Quel age avez-vous ? 36 Vous avez 36 ans !
Voici ce qu'il s'est passé :
Le programme affiche le texte : "Quel age avez-vous ", et demande à l'ordinateur une case mémoire pour stocker un
int
; il baptise cette caseageUtilisateur
.Il affiche un curseur blanc clignotant, et attend que l'utilisateur écrive quelque chose.
Quand celui-ci a terminé et appuyé sur la touche Entrée de son clavier, le programme prend ce qui a été écrit et le place dans la case mémoire
ageUtilisateur
à la place du 0 qui s'y trouvait.
Évidemment, ce que je vous ai présenté marche aussi avec d'autres types de variables :
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Quel est votre prenom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
cin >> nomUtilisateur; //On remplit cette case avec ce qu'écrit l'utilisateur
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
Je vous invite à tester ce programme pour bien comprendre en détail ce qui se passe, et je vous propose une vidéo pour récapituler ce que l'on vient de voir :
Utilisez getline()
pour afficher une chaîne de caractères
Avez-vous testé le code précédent et répondu à la question "Quel est votre prenom ?" en entrant votre prénom suivi de votre nom de famille ? Non ? Si vous l'aviez fait, voici ce qu'il se serait passé :
Quel est votre prenom ? Albert Einstein Combien vaut pi ? Vous vous appelez Albert et vous pensez que pi vaut 0.
L'ordinateur n'a rien demandé pour pi, et le nom de famille a disparu ! Que s'est-il passé ?
Quand il s'agit d'un nombre, cela ne pose pas de problème puisqu'il n'y a pas d'espace dans les nombres ; mais pour une string
, il peut très bien y avoir un espace dans une chaîne de caractères… L'ordinateur coupe donc au mauvais endroit : après le premier mot. Et comme il n'est pas très malin, il croit que le nom de famille correspond à la valeur de pi…
Il faudrait récupérer toute la ligne, pas juste le premier mot. Et si je vous en parle, c'est qu'il y a une solution pour le faire : la fonction getline()
.
Il faut remplacer cin >> nomUtilisateur;
par getline(cin, nomUtilisateur)
:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Quel est votre nom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrit
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
cin
et le nom de la variable ( nomUtilisateur
) sont encadrés par des parenthèses, et séparés par une virgule au lieu des chevrons.
Cette fois, le nom ne sera pas tronqué lors de la lecture, et notre ami Albert pourra utiliser notre programme sans souci :
Quel est votre nom ? Albert Einstein Combien vaut pi ? 3.14 Vous vous appelez Albert Einstein et vous pensez que pi vaut 3.14.
Si l'on utilise d'abord cin >>
puis getline()
, par exemple pour demander la valeur de pi avant de demander le nom, le code ne fonctionne pas. L'ordinateur ne demande pas son nom à l'utilisateur, et affiche n'importe quoi.
Pour pallier ce problème, il faut ajouter la ligne cin.ignore()
après l'utilisation des chevrons :
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker unnombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écritl'utilisateur
cin.ignore();
cout << "Quel est votre nom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrit
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
Avec cela, plus de souci.
Quand on mélange l'utilisation des chevrons et de getline()
, il faut toujours placer l'instruction cin.ignore()
après la ligne cin>>a
. C'est une règle à apprendre.
Voyons maintenant ce que l'on peut faire avec des variables, par exemple additionner deux nombres.
Changez le contenu d'une variable
On utilise le symbole =
pour effectuer un changement de valeur.
int unNombre(0); //Je crée une case mémoire nommée 'unNombre' et qui contient le nombre 0
unNombre = 5; //Je mets 5 dans la case mémoire 'unNombre'
On peut aussi directement affecter le contenu d'une variable à une autre :
int a(4), b(5); //Déclaration de deux variables
a = b; //Affectation de la valeur de 'b' à 'a'.
Que se passe-t-il exactement ?
Quand il arrive à la ligne 3, l'ordinateur lit le contenu de la case mémoire nommée b
, soit le nombre . Il ouvre ensuite la case dont le nom est a
et y écrit la valeur , en remplaçant le qui s'y trouvait :
On peut d'ailleurs afficher le contenu des deux variables pour vérifier :
#include <iostream>
using namespace std;
int main()
{
int a(4), b(5); //Déclaration de deux variables
cout << "a vaut : " << a << " et b vaut : " << b << endl;
cout << "Affectation !" << endl;
a = b; //Affectation de la valeur de 'b' à 'a'.
cout << "a vaut : " << a << " et b vaut : " << b << endl;
return 0;
}
Avez-vous testé ? Voici le résultat :
a vaut : 4 et b vaut : 5 Affectation ! a vaut : 5 et b vaut : 5
Revoyons en vidéo comment affecter des valeurs à une variable, et comment les modifier. On en profitera pour échanger les valeurs de deux variables, car c’est plus subtil que l’on pense :
C'est un bon début mais maintenant, allons plus loin : nous allons faire des opérations !
Utilisez les variables pour faire des calculs
Commençons avec une addition. Je ne vais pas trop vous surprendre en vous disant qu'on utilise le symbole +
:
int a(5), b(8), resultat(0);
resultat = a + b; //Et hop une addition pour la route !
À la ligne 1, le programme crée dans la mémoire trois cases nommées a
, b
et resultat
. Il remplit également ces cases respectivement avec les valeurs , et .
On arrive ensuite à la ligne 3 : l'ordinateur voit qu'il doit modifier le contenu de la variable resultat
. Il regarde alors ce qu'il y a de l'autre côté du symbole =
, et il remarque qu'il doit faire la somme des contenus des cases mémoire a et b
. Il regarde alors le contenu de a
et de b
sans le modifier, effectue le calcul et écrit la somme dans la variable resultat
. Tout cela en un éclair.
Si vous voulez, on peut même vérifier que cela fonctionne :
#include <iostream>
using namespace std;
int main()
{
int resultat(0), a(5), b(8);
resultat = a + b;
cout << "5 + 8 = " << resultat << endl;
return 0;
}
Sur votre écran, vous devriez voir :
5 + 8 = 13
Ce n'est pas tout, il existe encore quatre autres opérations dont voici le tableau récapitulatif :
Opération | Symbole | Exemple |
---|---|---|
Addition | + |
|
Soustraction | - |
|
Multiplication | * |
|
Division | / |
|
Modulo | % |
|
Mais qu'est-ce que le modulo ? Je n'ai pas vu cela à l'école.
Pas forcément sous ce nom-là. Il s'agit en fait du reste de la division entière.
Par exemple, lorsqu'on divise par :
on obtient un nombre entier dénommé "quotient" (en l'occurrence, il vaut ) ;
mais, comme n'est pas un multiple de , il faut compléter par quelque chose (ici, 1) pour obtenir exactement .
C'est ce "quelque chose" qu'on appelle le reste de la division. Avec notre exemple, on peut donc écrire , c'est-à-dire .
À partir des opérations de base, on peut tout à fait écrire des expressions mathématiques plus complexes qui nécessitent plusieurs variables, et utiliser des parenthèses si nécessaire :
int a(2), b(4), c(5), d; //Quelques variables
d = ((a+b) * c ) - c; //Un calcul compliqué !
La seule limite est votre imagination. Toute expression valide en mathématiques l'est aussi en C++.
Déclarez une variable non modifiable (constante)
Je vous ai présenté comment modifier des variables. Maintenant, on va faire le contraire : déclarer des variables non modifiables.
En termes techniques, on parle de constantes.
Mais à quoi peuvent bien servir des variables non modifiables ?
Imaginez un programme de jeu vidéo qui possède plusieurs niveaux, disons 10. Eh bien, ce nombre de niveaux ne va jamais changer durant l'exécution du programme. Entre le moment où l'utilisateur lance le jeu et le moment où il le quitte, il y a en permanence 10 niveaux dans le jeu. Ce nombre est constant. En C++, on pourrait donc créer une variable nombreNiveaux
qui serait une constante.
Il existe aussi des variables dont la valeur ne change jamais, mais dont on ne connaît pas la valeur à l'avance, comme une opération dans une calculatrice : une fois que le calcul est effectué, le résultat ne change plus. La variable qui contient le résultat est donc une constante.
Pour déclarer une constante, on ajoute le mot-clé const
entre le type et le nom :
int const nombreNiveaux(10);
Cela marche bien sûr avec tous les types de variables :
string const motDePasse("wAsTZsaswQ"); //Le mot de passe secret
double const pi(3.14);
unsigned int const pointsDeVieMaximum(100); //Le nombre maximal de points de vie
À vous de jouer !
Vous avez toutes les clés en main pour réaliser votre premier vrai programme !
Dans l'exemple précédent, le programme effectuait l'addition de deux nombres fixés à l'avance. Il serait bien mieux de demander à l'utilisateur quels nombres il veut additionner…
Voilà donc le sujet de notre premier exercice :
Demander deux nombres à l'utilisateur.
Calculer la somme de ces deux nombres.
Et afficher le résultat.
Essayez par vous-même avant de regarder la solution. C'est le meilleur moyen d'apprendre !
Regardez ensuite la correction de l’exercice :
Voici quelques idées pour parfaire vos connaissances :
multipliez
a
etb
;faites une opération plus complexe comme a×b+c ;
demandez deux nombres entiers et calculez leur quotient et le reste de la division.
En résumé
Pour demander à l'utilisateur de saisir une information au clavier, on utilise
cin >> variable;
. La valeur saisie sera stockée dans la variable.Il ne faut pas confondre le sens des chevrons
cout <<
etcin >>
.On utilise le symbole
=
pour effectuer un changement de valeur. Pour modifier le contenu d'une variable de typeint
, on écrit le nom de la variable suivi du symbole=
puis de la nouvelle valeur. C'est ce qu'on appelle l'affectation d'une variable.La fonction
getline()
permet de récupérer toute une chaine de caractères, pas juste le premier mot.On peut faire toutes sortes d'opérations mathématiques de base en C++ : addition, soustraction, multiplication…
Les constantes sont des variables qu'on ne peut pas modifier une fois qu'elles ont été créées. On utilise le mot
const
pour les définir.
Le prochain chapitre vous sera bien utile : vous allez voir comment utiliser les raccourcis, c'est parti !