Aller au menu - Aller au contenu

Icône TP : Bonjour c'est le week-end ...

Mise à jour : 02/02/2012
Difficulté : Facile Facile Creative Commons BY-NC-SA
22 955 visites depuis 7 jours, dont 362 sur ce chapitre classé 15/786
Bienvenue dans ce premier TP ! Vous avez pu découvrir dans les chapitres précédents les premières bases du langage C# permettant la construction d'applications. Il est grand temps de mettre en pratique ce que nous avons appris. C'est ici l'occasion pour vous de tester vos connaissances et de valider ce que vous appris en réalisant cet exercice.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Instructions pour réaliser le TP

Le but est de créer une petite application qui affiche un message différent en fonction du nom de l’utilisateur et du moment de la journée :
  • Bonjour XXX pour la tranche horaire 9h <-> 18h, les lundi, mardi, mercredi, jeudi et vendredi
  • Bonsoir XXX pour la tranche horaire 18h <-> 9h, les lundi, mardi, mercredi, jeudi
  • Bon week-end XXX pour la tranche horaire vendredi 18h <-> lundi 9h


Peut-être cela vous parait simple, dans ce cas, foncez et réalisez cette première application tout seul :) .
Sinon, décortiquons un peu l’énoncé de ce TP pour éviter d’être perdu.

Pour réaliser ce premier TP, vous allez avoir besoin de plusieurs choses.
Dans un premier temps, il faut afficher le nom de l’utilisateur, c’est une chose que nous avons déjà faite en allant puiser dans les fonctionnalités du framework .NET.

Vous aurez besoin également de récupérer l’heure courante pour la comparer aux tranches horaires souhaitées. Vous avez déjà vu comment récupérer la date courante. Pour pouvoir récupérer l’heure de la date courante, il vous faudra utiliser l’instruction DateTime.Now.Hour qui renvoie un entier représentant l’heure du jour.

Pour comparer l’heure avec des valeurs entières il vous faudra utiliser les opérateurs de comparaisons et les instructions conditionnelles que nous avons vus précédemment.

Pour traiter le cas spécial du jour de la semaine, vous aurez besoin que le framework .NET vous indique quel jour nous sommes. C’est le rôle de l’instruction DateTime.Now.DayOfWeek qui est une énumération indiquant le jour de la semaine. Les différentes valeurs sont consultables à cette adresse.

Pour plus de clarté, nous les reprenons ici :

Valeur Traduction
Sunday Dimanche
Monday Lundi
Tuesday Mardi
Wednesday Mercredi
Thursday Jeudi
Friday Vendredi
Saturday Samedi



Il ne restera plus qu’à comparer deux valeurs d’énumération, comme on l’a vu au chapitre sur les énumérations.

Voilà, vous avez tous les outils en main pour réaliser ce premier TP. N’hésitez pas à revenir sur les chapitres précédents si vous avez un doute sur la syntaxe ou sur les instructions à réaliser. On ne peut pas apprendre un langage par cœur du premier coup.

À vous de jouer !

Correction

Vous êtes autorisés à lire cette correction uniquement si vous vous êtes arraché les cheveux sur ce TP ! Je vois qu'il vous en reste, encore un effort ! :lol:
Quoique, si vous avez réussi avec brio le TP, vous pourrez également comparer votre travail au mien.

Quoi qu’il en soit, voici la correction que je propose. Bien évidemment, il peut y en avoir plusieurs, mais elle contient les informations nécessaires pour la réalisation de ce TP.

Première chose à faire : créer un projet de type console. J’ai ensuite ajouté le code suivant :


Code : C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
static void Main(string[] args)
{
    if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
    {
        // nous sommes le week-end
        AfficherBonWeekEnd();
    }
    else
    {
        // nous sommes en semaine

        if (DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour < 9)
        {
            // nous sommes le lundi matin
            AfficherBonWeekEnd();
        }
        else
        {
            if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour < 18)
            {
                // nous sommes dans la journée
                AfficherBonjour();
            }
            else
            {
                // nous sommes en soirée

                if (DateTime.Now.DayOfWeek == DayOfWeek.Friday && DateTime.Now.Hour >= 18)
                {
                    // nous sommes le vendredi soir
                    AfficherBonWeekEnd();
                }
                else
                {
                    AfficherBonsoir();
                }
            }
        }
    }
}

static void AfficherBonWeekEnd()
{
    Console.WriteLine("Bon week-end " + Environment.UserName);
}

static void AfficherBonjour()
{
    Console.WriteLine("Bonjour " + Environment.UserName);
}

static void AfficherBonsoir()
{
    Console.WriteLine("Bonsoir " + Environment.UserName);
}


Détaillons un peu ce code :

Au chargement du programme (méthode Main) nous faisons les comparaisons adéquates.
Dans un premier temps, nous testons le jour de la semaine de la date courante (DateTime.Now.DayOfWeek) et nous la comparons aux valeurs représentant Samedi et Dimanche. Si c’est le cas, alors nous appelons une méthode qui affiche le message « Bon week-end » avec le nom de l’utilisateur courant que nous pouvons récupérer avec Enrivonment.UserName.

Si nous ne sommes pas le week-end, alors nous testons l’heure de la date courante avec DateTime.Now.Hour. Si nous sommes le lundi matin avant 9h, alors nous continuons à afficher « Bon week-end ». Sinon, si nous sommes dans la tranche horaire 9h – 18h alors nous pouvons appeler la méthode qui affiche Bonjour. Si non, il reste juste à vérifier que nous ne sommes pas vendredi soir, qui fait partie du week-end, sinon on peut afficher le message de « Bonsoir ».

Et voilà, un bon exercice pour manipuler les conditions et les énumérations…

Aller plus loin

Ce TP n’était pas très compliqué, il nous a permis de vérifier que nous avions bien compris le principe des if et que nous sachions appeler des éléments du framework .NET.

Nous aurions pu simplifier l’écriture de l’application en compliquant en peu les tests avec une combinaison de conditions.
Par exemple, on pourrait avoir :

Code : C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday ||
    DateTime.Now.DayOfWeek == DayOfWeek.Sunday ||
    (DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour < 9) ||
    (DateTime.Now.DayOfWeek == DayOfWeek.Friday && DateTime.Now.Hour >= 18))
{
    // nous sommes le week-end
    AfficherBonWeekEnd();
}
else
{
    // nous sommes en semaine
    if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour < 18)
    {
        // nous sommes dans la journée
        AfficherBonjour();
    }
    else
    {
        AfficherBonsoir();
    }
}


Le premier test permet de vérifier que nous sommes soit samedi, soit dimanche, soit que nous sommes lundi et que l’heure est inférieure à 9, soit que nous sommes vendredi et que l’heure est supérieure à 18.
Nous avons, pour ce faire, combiné les tests avec l’opérateur logique OU : ||. Remarquons que les parenthèses nous permettent d’agir sur l’ordre d’évaluation des conditions. Pour que ce soit le week-end, il faut bien sûr être « vendredi et que l’heure soit supérieure à 18 » ou « lundi et que l’heure soit inférieure à 9 » ou samedi ou dimanche.

On pourrait encore simplifier en évitant de solliciter à chaque fois le framework .NET pour obtenir la date courante. Il suffit de stocker la date courante dans une variable de type DateTime. Ce qui donnerait :

Code : C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DateTime dateCourante = DateTime.Now;

if (dateCourante.DayOfWeek == DayOfWeek.Saturday ||
    dateCourante.DayOfWeek == DayOfWeek.Sunday ||
    (dateCourante.DayOfWeek == DayOfWeek.Monday && dateCourante.Hour < 9) ||
    (dateCourante.DayOfWeek == DayOfWeek.Friday && dateCourante.Hour >= 18))
{
    // nous sommes le week-end
    AfficherBonWeekEnd();
}
else
{
    // nous sommes en semaine
    if (dateCourante.Hour >= 9 && dateCourante.Hour < 18)
    {
        // nous sommes dans la journée
        AfficherBonjour();
    }
    else
    {
        AfficherBonsoir();
    }
}


On utilise ici le type DateTime comme le type string ou int. Il sert à gérer les dates et l’heure. Il est légèrement différent des types que nous avons vus pour l’instant, nous ne nous attarderons pas dessus. Nous aurons l’occasion de découvrir de quoi il s’agit dans la partie suivante.
Cette optimisation n’a rien d’extraordinaire, mais cela nous évite un appel à chaque fois au framework .NET.
Voilà pour ce TP. J’espère que vous aurez réussi avec brio l’exercice.
Vous avez pu remarquer que ce TP n'était pas trop difficile. Il a simplement fallu réfléchir à comment imbriquer correctement nos conditions.

N'hésitez pas à pratiquer et à vous entraîner avec d'autres problèmes de votre cru. Si vous avez le moindre problème, vous pouvez relire les chapitres précédents.
Vous verrez que nous aurons l'occasion d'énormément utiliser ces instructions conditionnelles dans tous les programmes que nous allons écrire.
Chapitre précédent Sommaire Chapitre suivant

Partager

20 commentaires pour "TP : Bonjour c'est le week-end ..."
Note moyenne : 3.05 / 4 (230 votes)
Pseudo Commentaire
Hors ligne Nihak Ben # Posté le 12/04/2012 à 06:33:56
Avatar

Avis : Très bon

Plutôt bon. :)
Hors ligne best83 # Posté le 12/04/2012 à 23:50:23

Salut a tous moi j'ai fait comme ça. Je pense que ca devrai fonctionner mais rien ne ce passe pourtant aucune erreur du compilateur!!!
Quelqu'un voit l'erreur.

Code : C#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 * Crée par SharpDevelop.
 * Utilisateur: alex
 * Date: 11/04/2012
 * Heure: 19:26
 * 
 * Pour changer ce modèle utiliser Outils | Options | Codage | Editer les en-têtes standards.
 */
using System;

namespace aide
{
	class Program
	{
		public static void Main(string[] args)
		{
			if ((DateTime.Now.DayOfWeek == DayOfWeek.Saturday) || (DateTime.Now.DayOfWeek == DayOfWeek.Sunday) || (DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour < 9))
			{
				Console.WriteLine("Bon week nous somme le {0}", DateTime.Now); // Samedi ou dimanche ou Lundi avant 9h c'est le week
			}
				
			
			else

				if ((DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.DayOfWeek != DayOfWeek.Saturday) && (DateTime.Now.Hour >= 9 && DateTime.Now.Hour < 18))
				
					Console.WriteLine(" bonjours"); // De Lundi à Vendredi entre 9 et 18h
				
				else

					if ((DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.DayOfWeek != DayOfWeek.Saturday) && (DateTime.Now.Hour < 9 && DateTime.Now.Hour >= 18 ))
				
						Console.WriteLine(" bonsoir"); // De Lundi à Jeudi entre 18 et 9h
				
			
						else
							Console.WriteLine("Pas bon");
					
				
						
			Console.ReadLine();

		}
	}
}
Hors ligne gfox78 # Posté le 13/04/2012 à 12:41:16
Avatar

Avis : Très bon

Ville : Marcq
Pays : France métropolitaine

Bonjour,
Je suis en seconde lecture et je constate (encore une fois) qu'il y a une grande différence entre comprendre et assimiler! Maintenant je m'efforce de faire les TPs sans regarder la solution.
Je n'ai pas tout à fait respecter le cahier des charges et j'ai fait quelques ajouts : en effet, je ne me permettrais pas de dire à un ami "Bon week-end", le lundi matin à 8h58 !!

Dans ma solution, j'ai préféré utiliser le 'switch..case' (qui admet en C#, des chaines de caractères) plutôt qu'une cascade de 'if..else' peu lisible et dans laquelle je me plante toujours.
Secret (cliquez pour afficher)

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
//using System.Collections.Generic;
//using System.Linq;
using System.Text;

namespace BonWE
{
    class Program
    {
        static void Main(string[] args)
        {
            string salut;
            Console.WriteLine("Quel est votre nom: ");
            string nom_Ami = Console.ReadLine();
            string ajout;
            DateTime dateValue = DateTime.Now;
            string nomJour = dateValue.ToString("ddddd");  // pour avoir le nom du jour en Français
            int heure = dateValue.Hour;
            // heure = 10; nomJour = "lundi";   // pour mettre au point
            if (heure > 18)
            {
                salut = "Bonsoir ";
                ajout = ", pas trop fatigué ?";
            }
            else
            {
                salut = "Bonjour ";
                ajout = ", bon courage !";
            }
            if (nomJour == "vendredi" && heure >= 18) nomJour = "vendredi-soir";
            if (nomJour == "lundi" && heure < 9) nomJour = "lundi-matin";
            switch (nomJour)
            {
                case "vendredi-soir":
                    ajout = ", le week-end arrive, ce n'est pas trop tôt !";
                    break;
                case "samedi":
                case "dimanche":
                    ajout = ", c'est le week-End, on se repose.";
                    break;
                case "lundi-matin":
                    ajout = ", le week-end se termine, dommage !";
                    break;
            }
            Console.WriteLine(salut + nom_Ami + ", on est " + nomJour + ajout + "\n signé : " + Environment.UserName + "\n");
        }
    }
}


Encore merci pour cet excellent tutoriel.
Hors ligne gfox78 # Posté le 13/04/2012 à 15:45:15
Avatar

Avis : Très bon

Ville : Marcq
Pays : France métropolitaine

Réponse à best81

Bonjour,
Comme toi, je suis débutant en C#, mais j'ai beaucoup pratiqué le langage Borland-C.
Ton erreur vient de ce que tu a mis des "&&" au lieu de "||" dans certaines conditions.

En fait, ton programme est très difficile à déboguer car tu travailles directement sur DateTime.Now et la seule solution pour tester le programme est de changer la date et l'heure de l'ordinateur.

Pour l'éviter je te propose de passer par une variable intermédiaire en écrivant au début du programme:
Code : Autre
1
2
3
DateTime date = DateTime.Now;
date = new DateTime(2012, 4, 13,17,0,0); 
                  //année,mois,jour,heure,minute,seconde, que l'on peut modifier

et en remplaçant les "DateTime.Now" par cette variable dans le corps du programme.
Il suffira de mettre la ligne "date = new Da..." en commentaire après la mise au point.

Je joins le code que tu a écris, en le modifiant le moins possible:
Secret (cliquez pour afficher)

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace essai1
{
    class Program
    {
        public static void Main(string[] args)
        {
           DateTime date = DateTime.Now;
           date = new DateTime(2012, 4, 13,17,0,0); // à modifier pour mise au point
            Console.WriteLine(date.DayOfWeek+" à " + date.Hour + " heures\n");
            if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday || (date.DayOfWeek == DayOfWeek.Monday && date.Hour < 9)
                  || (date.DayOfWeek == DayOfWeek.Friday && date.Hour > 18) )
            {
                Console.WriteLine("Bon week nous somme le {0}", date); // Samedi ou dimanche ou Lundi avant 9h c'est le week
            }
            else
                if (((date.DayOfWeek != DayOfWeek.Sunday) || (date.DayOfWeek != DayOfWeek.Saturday)) && (date.Hour >= 9 && date.Hour < 18))

                    Console.WriteLine(" bonjours"); // De Lundi à Vendredi entre 9 et 18h
                else
                    if (!(date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday) && (date.Hour < 9 || date.Hour >= 18))

                        Console.WriteLine(" bonsoir"); // De Lundi à Jeudi entre 18 et 9h
                    else
                        Console.WriteLine("Pas bon");
            Console.ReadLine();
        }
    }
}


Amicalement
Hors ligne jpnapo # Posté le 28/04/2012 à 21:28:14

Bonjour,

Tout d'abord un grand merci à tous ceux qui contribuent à la richesse du "Site du Zéro" et tout particulièrement à vous, Nico, pour cet excellent tutoriel sur le C#.
Avec plus de 20 ans d'expérience en informatique, notamment en Visual Basic, me voici donc plongé dans l'étude du C#, qui me permettra peut-être demain de décrocher mon nouveau job.

Je vous propose ici ma vision du TP, ayant choisi de créer une méthode (j'allais dire une fonction... :D ), pour attribuer un code message en fonction du jour et de la date.
J'ai utilisé tout ce que nous avons appris jusqu'à présent : les variables, les tableaux, les structures conditionnelles (if, switch), les opérateurs de comparaison, les méthodes, les boucles (évoquées précédemment) notamment pour la phase optionnelle de vérification du code.
La difficulté a été de restituer le code jour (entier de 0 à 6) de l'énumération DayOfWeek, obtenu de la façon suivante :

int theDayNumber = (int) DateTime.Now.DayOfWeek;

et inversement, obtenir le texte par rapport à l'indice :

DayOfWeek theEnglishDay = (DayOfWeek)theDayNumber;

Concernant la phase de vérification (non prévue dans le TP), j'ai souhaité transformer le nom du jour renvoyé en anglais par son équivalent en français.
Mes recherches sur Internet m'ont conduit à utiliser la classe CultureInfo de l'espace de nom "System.Globalization".

J'attends vos commentaires avec impatience. Merci encore et bonne continuation. Amicalement.

Code : C#
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
// --------------------------------------------------------------------
//      Date        : 26/04/2012
//      Auteur      : Jean Paul N.
//      Formation   : Le Site du Zéro
//      Langage     : C#
//      Projet      : TP_Bienvenue
// --------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace TP_Bienvenue
{
    class Program
    {
 
        static void Main(string[] args)
        {


            // Définition du message de bienvenue dans un tableau
            string [] theMessage = new string []{"Bonjour", "Bonsoir", "Bon week-end"};

            // Récupération du nom d'utilisateur
            string myUserName = Environment.UserName;

            // Récupération de l'heure courante
            int theHour = DateTime.Now.Hour;

            // Récupération du numéro du jour de la semaine
            // 0=Sunday / 1=Monday / 2=Tuesday / 3=Wednesday / 4=Thursday / 5=Friday / 6=Saturday
            int theDayNumber = (int) DateTime.Now.DayOfWeek;

            // Appel de la Méthode renvoyant le numéro de message (0=Bonjour / 1=Bonsoir / 2=Bon week-end)
            // et affichage du message de bienvenue en fonction de l'heure et du jour de la semaine
            Console.WriteLine(theMessage[ GetMessageNumber(theHour,theDayNumber) ] + " " + myUserName);

            // ------------------------------------------------------------------------------------------------------------------------------------
            // PARTIE OPTIONNELLE DE VERIFICATION
            // ------------------------------------------------------------------------------------------------------------------------------------

            // Définition de la langue : nécessite using System.Globalization; 
            CultureInfo culture = new CultureInfo("fr-Fr");
            
            // Boucle du dimanche(à) au samedi(6)
            for (theDayNumber = 0; theDayNumber < 7; theDayNumber++)
            {
                // Récupération du nom du jour en anglais
                DayOfWeek theEnglishDay = (DayOfWeek)theDayNumber;

                // Transformation en français
                string theFrenchDay = culture.DateTimeFormat.GetDayName(theEnglishDay);
                
                // Affichage Jour
                Console.WriteLine("---------------------------------------------------------");
                Console.WriteLine("    " + theFrenchDay);
                Console.WriteLine("---------------------------------------------------------");

                // Boucle de 0H00 à 23H00
                for (theHour = 0; theHour < 24; theHour++)
                {
                    Console.WriteLine(theMessage[GetMessageNumber(theHour, theDayNumber)] + " " + myUserName + ". Il est " + theHour + " H.");
                }
            }
            Console.WriteLine("---------------------------------------------------------");

            // ------------------------------------------------------------------------------------------------------------------------------------

        
            // Attente saisie clavier permettant de visualiser les messages de la console.
            Console.WriteLine("Appuyer sur ENTREE pour terminer...");
            Console.Read();
        }

        
        static int GetMessageNumber(int parHour, int parDay)
        {
            // Initialisation du numéro de message renvoyé
            int messageNumber = 0;

            // Le numéro du jour est forcément compris entre 0 et 6
            switch(parDay)
            {
                case 6: // Samedi
                case 0: // Dimanche
                    messageNumber = 2; // Bon week-end
                    break;
                case 1: // Lundi
                case 2: // Mardi
                case 3: // Mercredi
                case 4: // Jeudi
                case 5: // Vendredi
                    // Test horaires en journée
                    if (parHour >= 9 && parHour <=18)
                        messageNumber = 0; // Bonjour
                    else
                    {
                        // Cas du lundi avant 9H et du Vendredi après 18H
                        if (parDay==1 && parHour<9 || parDay==5 && parHour>18) 
                            messageNumber = 2; // Bon week-end
                        else
                            messageNumber = 1; // Bonsoir
                    }
                    break;
            }
            return messageNumber;
        }
    }
}

Voir tous les commentaires