Solutions : portée des variables et passage d'arguments
1. Prédire la portée
AfficherTotal();
void CalculerTotal()
{
int total = 100;
}
void AfficherTotal()
{
Console.WriteLine(total);
}
Ne compile pas. total est déclaré à l'intérieur de CalculerTotal, une fonction complètement différente d'AfficherTotal. total n'existe donc nulle part dans AfficherTotal.
int score = 0;
AugmenterScore();
Console.WriteLine(score);
void AugmenterScore()
{
score = score + 10;
}
Compile. AugmenterScore est une fonction locale déclarée dans la même portée que score : elle capture cette variable par fermeture (closure) et peut la modifier directement. Le programme affiche 10.
for (int i = 0; i < 3; i++)
{
int carre = i * i;
}
Console.WriteLine(carre);
Ne compile pas. carre est déclaré à l'intérieur du bloc de la boucle for et est détruit à chaque fin d'itération : il n'existe plus une fois sorti de la boucle.
2. Fonctions isolées
DefinirPrenom();
AfficherPrenom();
void DefinirPrenom()
{
string prenom = "Alex";
Console.WriteLine(prenom);
}
void AfficherPrenom()
{
// Erreur : prenom n'existe pas ici, il appartient seulement à DefinirPrenom
Console.WriteLine(prenom);
}
AfficherPrenom ne peut pas fonctionner telle quelle : prenom est une variable locale à DefinirPrenom, donc elle n'existe pas dans une autre fonction.
Version corrigée, avec passage en paramètre :
string prenom = "Alex";
DefinirPrenom(prenom);
AfficherPrenom(prenom);
void DefinirPrenom(string prenom)
{
Console.WriteLine(prenom);
}
void AfficherPrenom(string prenom)
{
Console.WriteLine(prenom);
}
3. Passage par valeur
int valeur = 42;
Reinitialiser(valeur);
Console.WriteLine(valeur); // affiche encore 42
void Reinitialiser(int nombre)
{
nombre = 0;
}
valeur n'affiche pas 0 après l'appel, car les arguments sont passés par valeur : Reinitialiser reçoit une copie de valeur dans son paramètre nombre. Modifier nombre à l'intérieur de la fonction ne touche pas la variable d'origine.
4. Le mot-clé out
Console.Write("Entrez un nombre : ");
double nombre;
if (!double.TryParse(Console.ReadLine(), out nombre))
{
Console.WriteLine("Erreur : le nombre entré est invalide.");
return;
}
double resultat;
if (!EssayerCalculerRacineCarree(nombre, out resultat))
{
Console.WriteLine("Erreur : la racine carrée d'un nombre négatif n'est pas définie dans les nombres réels.");
return;
}
Console.WriteLine("Racine carrée : " + resultat);
bool EssayerCalculerRacineCarree(double nombre, out double resultat)
{
if (nombre < 0)
{
resultat = 0;
return false;
}
resultat = Math.Sqrt(nombre);
return true;
}
5. Plusieurs valeurs de sortie
int[] nombres = [4, 9, 1, 7, 3];
AnalyserTableau(nombres, out int minimum, out int maximum, out double moyenne);
Console.WriteLine("Minimum : " + minimum);
Console.WriteLine("Maximum : " + maximum);
Console.WriteLine("Moyenne : " + moyenne);
void AnalyserTableau(int[] nombres, out int minimum, out int maximum, out double moyenne)
{
minimum = nombres[0];
maximum = nombres[0];
int somme = 0;
for (int i = 0; i < nombres.Length; i++)
{
if (nombres[i] < minimum)
{
minimum = nombres[i];
}
if (nombres[i] > maximum)
{
maximum = nombres[i];
}
somme = somme + nombres[i];
}
moyenne = (double)somme / nombres.Length;
}
6. Recherche dans un tableau
int[] nombres = [5, 8, 12, 3, 9];
int position = TrouverPosition(nombres, 12);
Console.WriteLine("Position : " + position);
int TrouverPosition(int[] nombres, int valeurRecherchee)
{
for (int i = 0; i < nombres.Length; i++)
{
if (nombres[i] == valeurRecherchee)
{
return i;
}
}
return -1;
}
7. Premier nombre pair
int[] nombres = [7, 11, 13, 8, 5];
int resultat = PremierNombrePair(nombres);
Console.WriteLine("Premier nombre pair : " + resultat);
int PremierNombrePair(int[] nombres)
{
int index = 0;
while (index < nombres.Length)
{
if (nombres[index] % 2 == 0)
{
return nombres[index];
}
index++;
}
return int.MinValue;
}
8. Validation avec nombre d'essais limité
bool reussi = DemanderMotDePasse("Prog1!2026", 3);
if (reussi)
{
Console.WriteLine("Connexion réussie !");
}
else
{
Console.WriteLine("Échec après le nombre maximal d'essais.");
}
bool DemanderMotDePasse(string motDePasseAttendu, int nombreEssaisMax)
{
for (int essai = 1; essai <= nombreEssaisMax; essai++)
{
Console.Write("Entrez le mot de passe : ");
string saisie = Console.ReadLine();
if (saisie == motDePasseAttendu)
{
return true;
}
}
return false;
}