Leçon 03

Introduction à la programmation C# · Module 7, leçon 2 sur 3

Paramètres et valeurs de retour

Donner des données à une méthode et récupérer son résultat : des méthodes qui calculent, qu'on appelle avec des valeurs différentes et qu'on teste une à une.

Résultat attendu

À la fin de la leçon, vous écrivez des méthodes qui reçoivent des valeurs, renvoient un résultat, et que vous réutilisez à plusieurs endroits d'un même programme.

Dans cette leçon
  1. L'essentiel
  2. Exercices
  3. Solutions
  4. Je fais le point

Ce que vous allez faire

  • Déclarer des paramètres et passer des arguments.
  • Renvoyer un résultat avec return et l'utiliser.
  • Choisir le type de retour : int, double, string, bool ou void.
  • Modifier une variable de l'appelant avec ref, et renvoyer plusieurs résultats avec out.
  • Tester une méthode seule, avec des valeurs connues.

Vous aurez réussi si…

  • vos arguments sont dans le même ordre et du même type que les paramètres ;
  • vous utilisez toujours la valeur renvoyée par une méthode ;
  • vos méthodes de calcul n'affichent rien : elles renvoient.

L'essentiel

À la leçon 7.1, chaque méthode faisait une tâche fermée : elle lisait ses propres données et affichait son propre résultat. C'est utile, mais limité. Une méthode AfficherLigne qui dessine toujours 20 signes = ne sert qu'à un seul endroit. Pour qu'une méthode soit réutilisable, il faut pouvoir lui donner des valeurs, et en recevoir un résultat.

Les paramètres : donner des valeurs

Un paramètre est une variable déclarée entre les parenthèses de la méthode. À l'appel, on fournit une valeur pour chacun : c'est l'argument.

C# · Program.cs
AfficherLigne('=', 20);
Console.WriteLine("Journal de course");
AfficherLigne('-', 20);

static void AfficherLigne(char symbole, int longueur)
{
    for (int i = 0; i < longueur; i++)
    {
        Console.Write(symbole);
    }
    Console.WriteLine();
}
Sortie
====================
Journal de course
--------------------

La même méthode dessine deux lignes différentes. Les arguments sont associés aux paramètres par leur position : le premier argument va dans le premier paramètre, et ainsi de suite. Leur nombre et leur type doivent correspondre.

La valeur de retour : récupérer un résultat

Une méthode qui calcule annonce le type de son résultat à la place de void, et le renvoie avec return. L'allure d'un coureur, en secondes par kilomètre, se calcule ainsi :

C# · Program.cs
int allure = CalculerAllure(5, 1610);
Console.WriteLine($"Allure : {allure} s/km");
Console.WriteLine($"Au 10 km : {CalculerAllure(10, 3485)} s/km");

static int CalculerAllure(int km, int secondes)
{
    return secondes / km;
}
Appelint allure = CalculerAllure(5, 1610);Déclarationstatic int CalculerAllure(int km, int secondes)arguments (valeurs)paramètres (variables de la méthode)5km = 51610secondes = 1610allure = 322return 1610 / 5; → 322la valeur renvoyée remplace l'appel dans l'instruction
Les arguments remplissent les paramètres, dans l'ordre. La valeur renvoyée par return prend la place de l'appel.

Un appel qui renvoie une valeur s'utilise partout où une valeur est permise : dans une affectation, dans un $"…", dans un calcul, dans une condition, et même comme argument d'un autre appel. Ici, la division entière est voulue : l'allure est arrondie à la seconde inférieure.

Type de retourCe que la méthode renvoieExemple d'appel
voidRien : elle agit (affiche, par exemple)AfficherLigne('-', 20);
int, doubleUn nombre calculéint allure = CalculerAllure(5, 1610);
stringUn texte construitConsole.WriteLine(FormaterDuree(322));
boolUne réponse vrai ou fauxif (EstBissextile(2028)) { … }

return termine la méthode immédiatement. Une méthode peut donc avoir plusieurs return, un par cas, pourvu que chaque chemin en rencontre un :

C# · ObtenirNiveau
static string ObtenirNiveau(int allure)
{
    if (allure < 300)
    {
        return "rapide";
    }
    if (allure < 330)
    {
        return "modéré";
    }
    return "détente";
}

Pas besoin de else : si l'allure est inférieure à 300, le premier return a déjà quitté la méthode. Le dernier return couvre tous les autres cas ; sans lui, le compilateur refuse la méthode (CS0161, « les chemins du code ne retournent pas tous une valeur »).

Un tableau en paramètre

Un paramètre peut être un tableau. La méthode CalculerTotal ci-dessous additionne n'importe quel tableau d'entiers : on l'appelle une fois pour les distances et une fois pour les durées. Voici le journal complet, où chaque méthode est réutilisée :

C# · Program.cs
const int Largeur = 44;
int[] distances = { 5, 10, 8, 21 };          // en km
int[] durees = { 1610, 3485, 2340, 7440 };   // en secondes

AfficherLigne('=', Largeur);
Console.WriteLine("Journal de course");
AfficherLigne('=', Largeur);

for (int i = 0; i < distances.Length; i++)
{
    int allure = CalculerAllure(distances[i], durees[i]);
    Console.WriteLine($"{distances[i]} km en {FormaterDuree(durees[i])} : {FormaterDuree(allure)}/km, {ObtenirNiveau(allure)}");
}

AfficherLigne('-', Largeur);
int kmTotal = CalculerTotal(distances);
int secondesTotal = CalculerTotal(durees);
Console.WriteLine($"Total : {kmTotal} km en {FormaterDuree(secondesTotal)}");
Console.WriteLine($"Allure moyenne : {FormaterDuree(CalculerAllure(kmTotal, secondesTotal))}/km");

// ---------- Méthodes ----------

static void AfficherLigne(char symbole, int longueur)
{
    for (int i = 0; i < longueur; i++)
    {
        Console.Write(symbole);
    }
    Console.WriteLine();
}

static int CalculerAllure(int km, int secondes)
{
    return secondes / km;
}

static string FormaterDuree(int secondes)
{
    int minutes = secondes / 60;
    int reste = secondes % 60;
    return $"{minutes} min {reste} s";
}

static string ObtenirNiveau(int allure)
{
    if (allure < 300)
    {
        return "rapide";
    }
    if (allure < 330)
    {
        return "modéré";
    }
    return "détente";
}

static int CalculerTotal(int[] valeurs)
{
    int total = 0;
    for (int i = 0; i < valeurs.Length; i++)
    {
        total += valeurs[i];
    }
    return total;
}
Sortie
============================================
Journal de course
============================================
5 km en 26 min 50 s : 5 min 22 s/km, modéré
10 km en 58 min 5 s : 5 min 48 s/km, détente
8 km en 39 min 0 s : 4 min 52 s/km, rapide
21 km en 124 min 0 s : 5 min 54 s/km, détente
--------------------------------------------
Total : 44 km en 247 min 55 s
Allure moyenne : 5 min 38 s/km

Remarquez la répartition des rôles : les méthodes de calcul (CalculerAllure, CalculerTotal, FormaterDuree, ObtenirNiveau) n'affichent rien. Elles renvoient un résultat, et c'est le programme principal qui décide quoi en faire. C'est ce qui les rend réutilisables : FormaterDuree sert à la fois pour les durées, les allures et le total.

Un paramètre est une copie

C# · Program.cs
int points = 10;
Doubler(points);
Console.WriteLine($"Après l'appel : {points}");

static void Doubler(int valeur)
{
    valeur = valeur * 2;
    Console.WriteLine($"Dans la méthode : {valeur}");
}
Sortie
Dans la méthode : 20
Après l'appel : 10
Programme principalMéthode Doubler1. Doubler(points);points10valeur10copie2. valeur = valeur * 2;valeur20points103. inchangéPour changer points, la méthode renvoie le résultat : points = Doubler(points);
Modifier un paramètre ne modifie pas la variable passée en argument : la méthode travaille sur une copie de la valeur.

La correction consiste à renvoyer le résultat et à le récupérer :

C# · Program.cs (corrigé)
int points = 10;
points = Doubler(points);
Console.WriteLine($"Après l'appel : {points}");

static int Doubler(int valeur)
{
    return valeur * 2;
}
Le cas des tableaux

Un tableau passé en paramètre n'est pas copié : la méthode reçoit le même tableau, et changer une de ses cases change le tableau d'origine. Dans ce cours, les méthodes qui reçoivent un tableau se contentent de le lire, comme CalculerTotal.

Passer par référence : ref et out

Il arrive qu'une méthode doive vraiment modifier la variable de l'appelant, ou renvoyer plus d'un résultat. C# offre pour cela le passage par référence : le paramètre n'est plus une copie, mais un autre nom pour la variable passée. Le mot ref s'écrit à la fois dans la déclaration et à l'appel.

C# · Program.cs
int points = 10;
Doubler(ref points);
Console.WriteLine($"Après l'appel : {points}");

static void Doubler(ref int valeur)
{
    valeur = valeur * 2;
}
Sortie
Après l'appel : 20
Programme principalMéthode DoublerDoubler(ref points);valeur = valeur * 2;10 → 20pointsvaleuravec ref, les deux noms désignent le même emplacement :changer valeur, c'est changer points
Avec ref, la méthode ne reçoit pas une copie : elle travaille directement sur la variable de l'appelant.

L'exemple classique est l'échange de la leçon 6.5, qui devient enfin une méthode réutilisable :

C# · Program.cs
int a = 7;
int b = 3;
if (a > b)
{
    Echanger(ref a, ref b);
}
Console.WriteLine($"{a} {b}");

static void Echanger(ref int premier, ref int second)
{
    int temporaire = premier;
    premier = second;
    second = temporaire;
}

Le mot out sert à renvoyer des résultats supplémentaires. Un paramètre out n'a pas besoin de valeur à l'entrée, mais la méthode doit obligatoirement lui en donner une. À l'appel, on peut déclarer la variable sur place, avec out int :

C# · Program.cs
ConvertirMinutes(135, out int heures, out int minutes);
Console.WriteLine($"135 min = {heures} h {minutes} min");

static void ConvertirMinutes(int total, out int heures, out int minutes)
{
    heures = total / 60;
    minutes = total % 60;
}
Sortie
135 min = 2 h 15 min

Vous utilisez out depuis la leçon 3.3 sans le savoir : int.TryParse(texte, out valeur) renvoie un bool (la conversion a-t-elle réussi ?) et donne la valeur convertie par out. On peut écrire une méthode sur le même modèle :

C# · Program.cs
Console.Write("Heure (0 à 23) : ");
if (EssayerLireHeure(Console.ReadLine() ?? "", out int heure))
{
    Console.WriteLine($"Rendez-vous à {heure} h.");
}
else
{
    Console.WriteLine("Heure invalide.");
}

// Même modèle que int.TryParse : un bool renvoyé, et la valeur par out
static bool EssayerLireHeure(string texte, out int heure)
{
    if (!int.TryParse(texte, out heure))
    {
        return false;
    }
    return heure >= 0 && heure <= 23;
}
BesoinOutilExemple
Un seul résultatreturn : toujours le premier choixint allure = CalculerAllure(5, 1610);
Plusieurs résultats, ou une réussite et une valeuroutConvertirMinutes(135, out int h, out int m), TryParse
Modifier des variables de l'appelantref, avec parcimonieEchanger(ref a, ref b)

Le paramètre par valeur reste la règle : en lisant Doubler(ref points), on voit que points peut changer, mais une méthode pleine de ref devient difficile à suivre. Réservez ref aux cas où la modification est le but même de la méthode, comme un échange.

Tester une méthode seule

Une méthode qui renvoie une valeur se teste facilement : on l'appelle avec des valeurs dont on connaît le résultat, et on compare. On choisit les valeurs comme pour un plan de tests : un cas normal, les cas limites, les valeurs extrêmes.

AppelAttenduCe qui est vérifié
FormaterDuree(0)0 min 0 sValeur minimale
FormaterDuree(59), FormaterDuree(60)0 min 59 s ; 1 min 0 sPassage à la minute
FormaterDuree(3661)61 min 1 sPlus d'une heure
ObtenirNiveau(299), ObtenirNiveau(300)rapide ; modéréPremière limite
ObtenirNiveau(329), ObtenirNiveau(330)modéré ; détenteSeconde limite

Il suffit d'écrire temporairement ces appels en haut du programme, dans des Console.WriteLine, puis de les retirer une fois la méthode validée. Dans Visual Studio, après un pas à pas sortant (Maj + F11), la fenêtre Automatique affiche aussi la valeur que la méthode vient de renvoyer.

Sept pièges fréquents
  • Ignorer la valeur renvoyée : CalculerAllure(5, 1610); seul compile, mais le résultat est perdu, comme s.ToUpper(); à la leçon 6.4.
  • Inverser les arguments : CalculerAllure(1610, 5) compile aussi, puisque les deux sont des int, mais renvoie 0. Le compilateur ne voit que les types, pas le sens.
  • Donner un argument du mauvais type : CalculerAllure(5.5, 1610) donne CS1503 (« Argument 1 : conversion impossible de 'double' en 'int' »).
  • Oublier un argument : CalculerAllure(5) donne CS7036 (« aucun ne correspond au paramètre obligatoire 'secondes' »).
  • Utiliser le résultat d'une méthode void : int n = AfficherLigne('-', 5); donne CS0029 (« Impossible de convertir implicitement le type 'void' en 'int' »).
  • Oublier ref à l'appel : Doubler(points); pour une méthode qui attend ref donne CS1620 (« L'argument 1 doit être passé avec le mot clé 'ref' »). Passer une valeur, comme Doubler(ref 5), donne CS1510 : il faut une variable.
  • Laisser un paramètre out sans valeur : CS0177 (« Le paramètre out … doit être assigné avant que le contrôle quitte la méthode actuelle »).

Exercices

GuidéExercice 1 : Prévoir les résultats

C# · Program.cs
Console.WriteLine(Carre(4));
Console.WriteLine(Carre(2) + Carre(3));
int n = 5;
Augmenter(n);
Console.WriteLine(n);
Console.WriteLine(Resumer("Léa", 3));
Console.WriteLine(EstGrand(Carre(3)));

static int Carre(int x)
{
    return x * x;
}

static void Augmenter(int x)
{
    x = x + 1;
}

static string Resumer(string nom, int nombre)
{
    return $"{nom} a {nombre} message(s)";
}

static bool EstGrand(int valeur)
{
    return valeur > 10;
}

Prévoyez les cinq lignes affichées, puis vérifiez en exécutant.

Vous avez réussi si vos cinq prévisions sont justes, et si vous expliquez pourquoi la troisième ligne n'affiche pas 6.

GuidéExercice 2 : Les points au classement

Règle : « Au classement de la ligue, une victoire vaut 3 points et un match nul vaut 1 point. »

Écrivez la méthode static int CalculerPoints(int victoires, int nuls), avec une constante pour les 3 points, puis appelez-la pour trois équipes : les Aigles (5 victoires, 2 nuls), les Castors (0, 0) et les Hiboux (3, 4).

Vous avez réussi si votre programme affiche 17, 0 et 13 points, et si la méthode ne contient aucun Console.WriteLine.

Semi-guidéExercice 3 : La mention

Règle : « Une note de 90 ou plus vaut la mention Excellent ; de 80 à moins de 90, Très bien ; de 70 à moins de 80, Bien ; de 60 à moins de 70, Passable ; sous 60, Échec. »

Écrivez static string ObtenirMention(double note) avec un return par cas. Testez-la avec un tableau de notes choisies aux limites et une boucle foreach qui affiche chaque note et sa mention.

Vous avez réussi si 90 donne Excellent, 89,9 donne Très bien, 60 donne Passable et 59,9 donne Échec, et si votre méthode compile sans else.

Semi-guidéExercice 4 : ref et out

  1. Avec out : écrivez static void ConvertirSecondes(int total, out int heures, out int minutes, out int secondes), puis affichez « 3725 s = 1 h 2 min 5 s ».
  2. Avec ref : écrivez static void TrierTrois(ref int a, ref int b, ref int c), qui met trois variables en ordre croissant en appelant Echanger. Indice : trois comparaisons de voisins suffisent, comme deux passes d'un tri à bulles.

Vous avez réussi si 0, 59, 3600 et 86399 secondes donnent 0 h 0 min 0 s, 0 h 0 min 59 s, 1 h 0 min 0 s et 23 h 59 min 59 s ; et si (9, 2, 5), (3, 3, 1), (3, 2, 1) et (2, 3, 1) deviennent 2 5 9, 1 3 3, 1 2 3 et 1 2 3.

AutonomeExercice 5 : Les ventes de la semaine

Ce programme doit afficher le total des ventes plus une prime de 50 , la moyenne par jour avec deux décimales, puis la tendance entre le premier et le dernier jour.

C# · Program.cs (avec erreurs)
int[] ventes = { 120, 80, 150, 95 };

int total = CalculerSomme(ventes);
AjouterPrime(total);
Console.WriteLine($"Total avec la prime : {total} $");
Console.WriteLine($"Moyenne par jour : {CalculerMoyenne(ventes):F2} $");
Console.WriteLine(DecrireTendance(ventes[0], ventes[ventes.Length - 1]));

static int CalculerSomme(int[] valeurs)
{
    int somme = 0;
    for (int i = 0; i < valeurs.Length; i++)
    {
        somme += valeurs[i];
    }
    return somme;
}

static void AjouterPrime(int montant)
{
    const int Prime = 50;
    montant = montant + Prime;
}

static double CalculerMoyenne(int[] valeurs)
{
    return CalculerSomme(valeurs) / valeurs.Length;
}

static string DecrireTendance(int fin, int debut)
{
    if (fin > debut)
    {
        return "Les ventes ont augmenté.";
    }
    if (fin < debut)
    {
        return "Les ventes ont baissé.";
    }
    return "Les ventes sont stables.";
}

Il compile, mais trois résultats sont faux. Utilisez F11 pour entrer dans chaque méthode, trouvez les trois erreurs et corrigez-les sans ajouter de Console.WriteLine dans les méthodes.

Vous avez réussi si le programme affiche « Total avec la prime : 495  », « Moyenne par jour : 111,25  » et « Les ventes ont baissé. », et si vous nommez la cause de chaque erreur.

DéfiExercice 6 : Le jour de l'année

Énoncé : « Le rang d'une date dans l'année va de 1 (le 1er janvier) à 365, ou 366 pour une année bissextile. »

Écrivez trois méthodes qui s'appuient les unes sur les autres :

  1. static bool EstBissextile(int annee), avec la condition de la leçon 3.2 ;
  2. static int JoursDansMois(int mois, int annee), qui utilise un tableau des jours par mois et EstBissextile ;
  3. static int JourDeLAnnee(int jour, int mois, int annee), qui additionne les jours des mois précédents.

Vous avez réussi si le 1er janvier 2025 donne 1, le 1er mars 2024 donne 61, le 1er mars 2025 donne 60, le 31 décembre 2024 donne 366 et le 24 juin 2026 donne 175.

Solutions

Exercice 1 : Prévoir les résultats

16 ; 13 ; 5 ; Léa a 3 message(s) ; False.

La troisième ligne affiche 5 : Augmenter modifie son paramètre x, qui est une copie de n. La dernière ligne affiche False, car Carre(3) vaut 9, et 9 n'est pas supérieur à 10. Un appel peut servir d'argument à un autre appel : Carre est calculée d'abord, puis son résultat est passé à EstGrand.

Exercice 2 : Les points au classement
C# · Program.cs
Console.WriteLine($"Aigles : {CalculerPoints(5, 2)} points");
Console.WriteLine($"Castors : {CalculerPoints(0, 0)} points");
Console.WriteLine($"Hiboux : {CalculerPoints(3, 4)} points");

static int CalculerPoints(int victoires, int nuls)
{
    const int PointsVictoire = 3;
    return victoires * PointsVictoire + nuls;
}

La constante est déclarée dans la méthode, près du seul calcul qui l'utilise. L'affichage reste dans le programme principal : la méthode pourra servir ailleurs, par exemple pour trier un classement.

Exercice 3 : La mention
C# · Program.cs
double[] notes = { 95, 90, 89.9, 72, 60, 59.9 };
foreach (double note in notes)
{
    Console.WriteLine($"{note} : {ObtenirMention(note)}");
}

static string ObtenirMention(double note)
{
    if (note >= 90)
    {
        return "Excellent";
    }
    if (note >= 80)
    {
        return "Très bien";
    }
    if (note >= 70)
    {
        return "Bien";
    }
    if (note >= 60)
    {
        return "Passable";
    }
    return "Échec";
}
Sortie
95 : Excellent
90 : Excellent
89,9 : Très bien
72 : Bien
60 : Passable
59,9 : Échec

Les conditions vont de la plus haute à la plus basse : quand on arrive au test note >= 80, on sait déjà que la note est inférieure à 90. Le dernier return, sans condition, garantit que tous les chemins renvoient une valeur.

Exercice 4 : ref et out
C# · Program.cs
// Partie A : out
ConvertirSecondes(3725, out int h, out int m, out int s);
Console.WriteLine($"3725 s = {h} h {m} min {s} s");

// Partie B : ref
int a = 9;
int b = 2;
int c = 5;
TrierTrois(ref a, ref b, ref c);
Console.WriteLine($"{a} {b} {c}");

static void ConvertirSecondes(int total, out int heures, out int minutes, out int secondes)
{
    heures = total / 3600;
    minutes = total % 3600 / 60;
    secondes = total % 60;
}

static void TrierTrois(ref int a, ref int b, ref int c)
{
    if (a > b)
    {
        Echanger(ref a, ref b);
    }
    if (b > c)
    {
        Echanger(ref b, ref c);
    }
    if (a > b)
    {
        Echanger(ref a, ref b);
    }
}

static void Echanger(ref int premier, ref int second)
{
    int temporaire = premier;
    premier = second;
    second = temporaire;
}

total % 3600 / 60 prend d'abord ce qui reste après les heures entières, puis compte les minutes de ce reste. Dans TrierTrois, les deux premières comparaisons amènent la plus grande valeur en c ; la troisième ordonne a et b. Les paramètres ref de TrierTrois sont passés tels quels à Echanger : c'est toujours la variable de départ qui est modifiée.

Exercice 5 : Les ventes de la semaine
  1. La prime est perdue (445 au lieu de 495) : AjouterPrime modifie une copie de total. Elle doit renvoyer le nouveau montant, et l'appel doit le récupérer : total = AjouterPrime(total);.
  2. La moyenne est tronquée (111,00 au lieu de 111,25) : CalculerSomme(valeurs) / valeurs.Length divise deux int, donc la division est entière, même si la méthode renvoie un double. On range d'abord la somme dans un double.
  3. La tendance est inversée (« augmenté » au lieu de « baissé ») : les paramètres sont déclarés dans l'ordre (fin, debut), mais l'appel passe le premier jour, puis le dernier. Le premier argument (120) arrive dans fin. On remet les paramètres dans l'ordre de l'appel : (debut, fin).
C# · Program.cs (corrigé)
int[] ventes = { 120, 80, 150, 95 };

int total = CalculerSomme(ventes);
total = AjouterPrime(total);
Console.WriteLine($"Total avec la prime : {total} $");
Console.WriteLine($"Moyenne par jour : {CalculerMoyenne(ventes):F2} $");
Console.WriteLine(DecrireTendance(ventes[0], ventes[ventes.Length - 1]));

static int CalculerSomme(int[] valeurs)
{
    int somme = 0;
    for (int i = 0; i < valeurs.Length; i++)
    {
        somme += valeurs[i];
    }
    return somme;
}

static int AjouterPrime(int montant)
{
    const int Prime = 50;
    return montant + Prime;
}

static double CalculerMoyenne(int[] valeurs)
{
    double somme = CalculerSomme(valeurs);
    return somme / valeurs.Length;
}

static string DecrireTendance(int debut, int fin)
{
    if (fin > debut)
    {
        return "Les ventes ont augmenté.";
    }
    if (fin < debut)
    {
        return "Les ventes ont baissé.";
    }
    return "Les ventes sont stables.";
}
Exercice 6 : Le jour de l'année
C# · Program.cs
Console.WriteLine(EstBissextile(2024));
Console.WriteLine(EstBissextile(1900));
Console.WriteLine(JoursDansMois(2, 2024));
Console.WriteLine(JoursDansMois(2, 2025));
Console.WriteLine(JourDeLAnnee(1, 1, 2025));
Console.WriteLine(JourDeLAnnee(1, 3, 2024));
Console.WriteLine(JourDeLAnnee(1, 3, 2025));
Console.WriteLine(JourDeLAnnee(31, 12, 2024));
Console.WriteLine(JourDeLAnnee(24, 6, 2026));

static bool EstBissextile(int annee)
{
    return (annee % 4 == 0 && annee % 100 != 0) || annee % 400 == 0;
}

static int JoursDansMois(int mois, int annee)
{
    int[] joursParMois = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (mois == 2 && EstBissextile(annee))
    {
        return 29;
    }
    return joursParMois[mois - 1];
}

static int JourDeLAnnee(int jour, int mois, int annee)
{
    int rang = jour;
    for (int m = 1; m < mois; m++)
    {
        rang += JoursDansMois(m, annee);
    }
    return rang;
}

EstBissextile renvoie directement la condition : une expression booléenne est déjà une valeur true ou false, sans if. JoursDansMois utilise mois - 1 comme indice, puisque janvier est à l'indice 0. JourDeLAnnee appelle JoursDansMois pour chaque mois complet avant le mois demandé : pour le 1er mars 2024, 31 + 29 + 1 = 61. Chaque méthode a été testée seule avant de servir à la suivante.

Je fais le point

  • Je sais déclarer des paramètres et passer les arguments dans le bon ordre.
  • Je sais renvoyer un résultat avec return et l'utiliser dans une affectation, un affichage ou une condition.
  • Je choisis le type de retour : void, int, double, string ou bool.
  • Je sais qu'un paramètre est une copie et qu'il faut renvoyer un résultat pour changer une variable.
  • Je sais passer un tableau en paramètre.
  • Je sais utiliser ref pour modifier une variable de l'appelant et out pour renvoyer plusieurs résultats.
  • Je teste une méthode seule avec des valeurs connues, y compris les cas limites.