Skip to content

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;
}