Boucles en C# (for, foreach, while, do-while)
Apprenez à utiliser les boucles for, foreach, while et do-while en C# pour gérer des actions répétitives avec des exemples pratiques.
En C#, les boucles permettent d’exécuter plusieurs fois le même bloc de code tant qu’une certaine condition est vraie. Elles font gagner du temps au programmeur et facilitent les tâches répétitives. Les boucles les plus utilisées en C# sont : for, foreach, while et do-while.
Boucle for
La boucle for est généralement utilisée lorsque le nombre de répétitions est connu. Elle est contrôlée par une variable compteur.
Comptage croissant : Le compteur i augmente de 1 à chaque fois. La boucle se termine avant qu’il atteigne 5.
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Étape : " + i);
}
// Sortie :
Étape : 0
Étape : 1
Étape : 2
Étape : 3
Étape : 4
Comptage décroissant : Le compteur i diminue de 1 à chaque fois. La boucle se termine avant qu’il atteigne 0.
for (int i = 5; i > 0; i--)
{
Console.WriteLine("Compte à rebours : " + i);
}
// Sortie :
Compte à rebours : 5
Compte à rebours : 4
Compte à rebours : 3
Compte à rebours : 2
Compte à rebours : 1
Incréments de 5 : Le compteur i augmente de 5 à chaque fois. La boucle se termine lorsqu’il atteint 25.
for (int i = 0; i <= 25; i += 5)
{
Console.WriteLine("Nombre : " + i);
}
// Sortie :
Nombre : 0
Nombre : 5
Nombre : 10
Nombre : 15
Nombre : 20
Nombre : 25
Boucle for imbriquée : Avec les compteurs i et j, chacun comptant jusqu’à 3, le programme affiche leurs produits.
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.Write($"{i * j}\t");
}
Console.WriteLine();
}
// Sortie :
1 2 3
2 4 6
3 6 9
break et continue
Parfois, dans les boucles, on utilise les mots-clés break et continue pour contrôler le flux.
break : Termine complètement la boucle.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
break; // lorsque i est égal à 3, la boucle se termine
Console.WriteLine("i : " + i);
}
// Sortie :
i : 1
i : 2
continue : Ignore uniquement l’itération en cours et continue avec le reste de la boucle.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
continue; // lorsque i est égal à 3, cette étape est ignorée
Console.WriteLine("i : " + i);
}
// Sortie :
i : 1
i : 2
i : 4
i : 5
Boucle foreach
La boucle foreach est utilisée pour parcourir des collections (tableaux, listes, etc.). Il n’est pas nécessaire de connaître le nombre d’éléments.
string[] fruits = { "Pomme", "Poire", "Banane" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
Dans cet exemple, chaque élément du tableau fruits est affiché dans la console, un par un.
Boucle while
La boucle while se répète tant que la condition est vraie. Le nombre d’itérations peut ne pas être connu à l’avance.
Compteur simple : La variable nombre commence à 1 et s’affiche jusqu’à 3.
int nombre = 1;
while (nombre <= 3)
{
Console.WriteLine("Nombre : " + nombre);
nombre++;
}
// Sortie :
Nombre : 1
Nombre : 2
Nombre : 3
Afficher les caractères d’une chaîne : Dans cet exemple, une boucle while affiche chaque caractère d’un texte.
Si un espace est trouvé, il est ignoré avec continue. Si un point (.) est trouvé, la boucle se termine avec break.
string texte = "Il fait beau aujourd'hui. Sortons.";
int index = 0;
while (index < texte.Length)
{
char c = texte[index];
if (c == ' ')
{
index++;
continue; // ignorer les espaces
}
if (c == '.')
break; // terminer la boucle si un point est trouvé
Console.WriteLine(c);
index++;
}
// Sortie :
I
l
f
a
i
t
b
e
a
u
a
u
j
o
u
r
d
'
h
u
i
Boucle infinie while(true) : Dans les boucles infinies, on peut sortir avec break.
Dans cet exemple, l’utilisateur doit saisir le bon mot de passe pour sortir de la boucle.
while (true)
{
Console.Write("Entrez le mot de passe : ");
string motdepasse = Console.ReadLine();
if (motdepasse == "1234")
{
Console.WriteLine("Connexion réussie !");
break; // mot de passe correct, sortie de la boucle
}
Console.WriteLine("Mot de passe incorrect, réessayez.");
}
// Exemple d'exécution :
Entrez le mot de passe : 1111
Mot de passe incorrect, réessayez.
Entrez le mot de passe : 2222
Mot de passe incorrect, réessayez.
Entrez le mot de passe : 1234
Connexion réussie !
Boucle do-while
La boucle do-while s’exécute au moins une fois, puis vérifie la condition. Cela signifie qu’elle s’exécute au moins une fois, même si la condition est fausse.
Exemple simple : Même si la condition n’est pas remplie au départ, la boucle s’exécute une fois.
int x = 5;
do
{
Console.WriteLine("Valeur de x : " + x);
x++;
} while (x < 5);
// Sortie :
Valeur de x : 5
Trouver les diviseurs : Les diviseurs d’un nombre saisi par l’utilisateur sont trouvés avec une boucle do-while.
Console.Write("Entrez un nombre : ");
int nombre = int.Parse(Console.ReadLine());
if (nombre <= 0)
{
Console.WriteLine("Entrez un nombre supérieur à 0.");
}
else
{
int diviseur = nombre;
Console.WriteLine($"Diviseurs de {nombre} :");
do
{
if (nombre % diviseur == 0)
{
Console.WriteLine(diviseur);
}
diviseur--;
} while (diviseur >= 1);
}
// Exemple d'exécution :
Entrez un nombre : 12
Diviseurs de 12 :
12
6
4
3
2
1
Résumé
- for → Adaptée aux répétitions contrôlées par compteur.
- foreach → Utilisée pour parcourir des tableaux ou des collections.
- while → Se répète tant que la condition est vraie.
- do-while → S’exécute au moins une fois, puis vérifie la condition.
- break → Termine la boucle.
- continue → Ignore l’itération en cours.
Application : Gestion de menu et de produits avec les flèches
Dans cet exemple, nous écrivons un menu simple qui fonctionne avec une boucle infinie et permet la sélection à l’aide des flèches (↑/↓) et de la touche Entrée.
Des tableaux sont utilisés pour stocker le nom et le prix de 5 produits.
Menus : Afficher les produits, Mettre à jour le produit, Supprimer le produit, Quitter.
using System;
using System.Globalization;
class Program
{
static void Main()
{
string[] nomsProduits = { "Stylo", "Cahier", "Gomme", "Sac", "Règle" };
decimal[] prixProduits = { 12.5m, 45m, 7.9m, 350m, 22.75m };
string[] menu = { "Afficher les produits", "Mettre à jour le produit", "Supprimer le produit", "Quitter" };
int selection = 0;
while (true) // Boucle infinie
{
Console.Clear();
Console.WriteLine("=== Gestion des produits ===\n");
// Dessin du menu
for (int i = 0; i < menu.Length; i++)
{
if (i == selection)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Cyan;
Console.WriteLine($"> {menu[i]}");
Console.ResetColor();
}
else
{
Console.WriteLine($" {menu[i]}");
}
}
Console.WriteLine("\nUtilisez les flèches pour naviguer, Entrée pour sélectionner, Échap pour quitter.");
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.UpArrow)
selection = (selection - 1 + menu.Length) % menu.Length;
else if (key.Key == ConsoleKey.DownArrow)
selection = (selection + 1) % menu.Length;
else if (key.Key == ConsoleKey.Escape)
break;
else if (key.Key == ConsoleKey.Enter)
{
if (selection == 0) // Afficher les produits
{
Console.Clear();
Console.WriteLine("=== Liste des produits ===\n");
for (int i = 0; i < nomsProduits.Length; i++)
{
string nom = string.IsNullOrWhiteSpace(nomsProduits[i]) ? "(supprimé)" : nomsProduits[i];
Console.WriteLine($"{i + 1}. {nom,-15} | {prixProduits[i],8:0.00} EUR");
}
Console.WriteLine("\nAppuyez sur une touche pour continuer...");
Console.ReadKey(true);
}
else if (selection == 1) // Mettre à jour le produit
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Sélectionnez un produit à mettre à jour ===\n");
for (int i = 0; i < nomsProduits.Length; i++)
{
string nom = string.IsNullOrWhiteSpace(nomsProduits[i]) ? "(supprimé)" : nomsProduits[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine($"> {i + 1}. {nom,-15} | {prixProduits[i],8:0.00} EUR");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {nom,-15} | {prixProduits[i],8:0.00} EUR");
}
}
Console.WriteLine("\nFlèches pour naviguer, Entrée pour sélectionner, Échap pour revenir.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + nomsProduits.Length) % nomsProduits.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % nomsProduits.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
Console.Clear();
Console.WriteLine("=== Mettre à jour le produit ===\n");
Console.WriteLine($"Sélectionné : {nomsProduits[index]} | Ancien prix : {prixProduits[index]:0.00} EUR\n");
Console.Write("Nouveau nom (laisser vide pour conserver) : ");
string nouveauNom = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(nouveauNom))
nomsProduits[index] = nouveauNom.Trim();
Console.Write("Nouveau prix (laisser vide pour conserver) : ");
string prixStr = Console.ReadLine();
if (decimal.TryParse(prixStr, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal nouveauPrix))
prixProduits[index] = Math.Max(0, nouveauPrix);
Console.WriteLine("\nMise à jour terminée. Appuyez sur une touche pour continuer...");
Console.ReadKey(true);
break;
}
}
}
else if (selection == 2) // Supprimer le produit
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Sélectionnez un produit à supprimer ===\n");
for (int i = 0; i < nomsProduits.Length; i++)
{
string nom = string.IsNullOrWhiteSpace(nomsProduits[i]) ? "(supprimé)" : nomsProduits[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine($"> {i + 1}. {nom,-15} | {prixProduits[i],8:0.00} EUR");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {nom,-15} | {prixProduits[i],8:0.00} EUR");
}
}
Console.WriteLine("\nFlèches pour naviguer, Entrée pour sélectionner, Échap pour revenir.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + nomsProduits.Length) % nomsProduits.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % nomsProduits.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
nomsProduits[index] = string.Empty;
prixProduits[index] = 0m;
Console.WriteLine("\nProduit supprimé. Appuyez sur une touche pour continuer...");
Console.ReadKey(true);
break;
}
}
}
else if (selection == 3) // Quitter
{
return;
}
}
}
}
}
Remarques :
- La navigation avec les flèches utilise
Console.ReadKey(true)etConsoleKey. - Les menus sont redessinés dans une boucle infinie ; on quitte avec
ÉchapouQuitter. - Les produits supprimés s’affichent avec le libellé
(supprimé)et un prix de0 EUR. decimal.TryParseest utilisé pour la conversion numérique de la saisie du prix.