Retrouver le jour de la semaine d'une date quelconque
Le but du programme à réaliser consiste à retrouver le jour de la semaine d'une date à préciser par l'opérateur. Ainsi, il doit être possible de déterminer si nous sommes né un Jeudi ou un autre jour de la semaine.
Saisie de la date du jour
--------------------------
Jour de la semaine (Lundi ... Dimanche) ? Lundi
Jour du mois (1..31) ? 6
Mois (Janvier...Décembre) ? Novembre
Année ? 2006
La date est : Lundi 6 Novembre 2006
Jours déjà fait dans l'année : 310
Saisie de la date à calculer
-----------------------------
Jour du mois (1..31) ? 1
Mois (Janvier...Décembre) ? Octobre
Année ? 1959
La date complète est : Jeudi1 Octobre 1959
Jours déjà fait dans l'année : 274
Run successful. Exit value 0.
Pour connaître le jour de la semaine d'une date quelconque, il est d'abord nécessaire d'indiquer un jour de semaine d'une date connue, comme par exemple le jour de la semaine de la date du jour. Ainsi, dans un premier temps, le programme demande de saisir la date d'aujourd'hui en commançant par le jour de la semaine, suivi du jour du mois, ensuite du mois et enfin de l'année. Il est à noter que vous devez introduire la jour de la semaine ainsi que le mois tout simplement sous forme de texte en prenant toutefois la précaution de bien mettre la première lettre du mot en majuscule. Ensuite, vous devez saisir la date avec laquelle vous désirez chercher le jour de la semaine, en précisant dans l'ordre, le jour du mois, le mois et l'année.
Dans ce programme, vous ne tiendrez pas compte des mauvaises saisies éventuelles.
.
Bien que ce sujet soit simple en apparence, il est en réalité plus difficile qu'il n'y paraît. Je vous invite donc à suivre la procédure décrite ci-dessous :
Déclaration des différents types et constantes nécessaires à la gestion des dates - en dehors et avant la fonction main()
type JourSemaine : énumération qui représente les jours de la semaine du Lundi au Dimanche.
constante texteJour : tableau de chaînes de caractères qui représente également les jours de la semaine, mais sous forme de texte (chaîne de caractères : "Lundi", "Mardi", etc.). La première case du tableau doit donc être remplie avec la chaîne "Lundi", et la dernière case avec la chaîne "Dimanche". Nota : chaque chaîne de caractères comme "Lundi" doivent être considérée comme un pointeur sur un caractère (taille des chaînes assez variables).
type Mois : énumération qui représente les mois de l'année de Janvier à Decembre.
constante texteMois : tableau de chaînes de caractères qui représente également les mois de l'année, mais sous forme de texte (chaîne de caractères : "Janvier", "Février", etc.). La première case du tableau doit donc être remplie avec la chaîne "Janvier", et la dernière case avec la chaîne "Décembre". Nota : chaque chaîne de caractères comme "Janvier" doivent être considérée comme un pointeur sur un caractère (taille des chaînes assez variables).
constante joursDansMois : tableau d'entiers non signés qui indique le nombre de jour dans le mois correspondant, 31 pour janvier, 28 pour février, etc. La première case du tableau doit donc posséder la valeur 31 (correspondant à janvier) et la dernière case également 31 (correspondant à décembre).
Déclaration de la structure Date - en dehors et avant la fonction main()
La structure Date doit être composée :
jourSemaine : qui correspond au jour de la semaine du Lundi au Dimanche.
jourDuMois : entier non signé qui correspond au jour du mois 1..31, ou 1..30, ou 1..28 suivant le cas.
joursDansAnnee : également entier non signé qui correspond au nombre de jours déjà effectués dans l'année. Ainsi, le 6 novembre d'une année non bissextile correspond au 310 jours de l'année.
mois : qui indique le mois de l'année de Janvier à Decembre.
annee : entier qui représente l'année, par exemple 2006.
Programme principal - dans la fonction main()
Déclaration des variables locales qui seront utiles pour le bon déroulement du programme :
saisie : tableau de 12 caractères qui permettra de saisir les chaînes de caractères pour désigner soit le jour de semaine comme "Lundi", soit le mois comme "Août".
jours : entier non signé qui sera utile pour la saisie du jour du mois, de 1..31.
Récupération et affichage de la date du jour - dans la fonction main()
Déclaration de la variable dateDuJour qui représente la date d'aujourd'hui.
Affichage préliminaire de la zone de saisie de la date du jour (revoir le scénario proposé plus haut).
Saisie du jour de la semaine sous forme de chaîne de caractères. Servez-vous de la variable saisie.
A partir de cette chaîne de caractère qui vient d'être saisie, le programme doit retrouver le jour de la semaine afin de compléter le champ jourSemaine de la variable dateDuJour. Pour cela, servez-vous de la constante TexteJour et contrôler uniquement les deux premières lettres de la chaîne saisie. Par ailleurs, vous devez passer par une itérative (for) qui va permettre de vérifier les jours de la semaine en commançant par Lundi et en terminant par Dimanche. Il donc souhaitable, dans cette itérative, de passer par une variable jour de type JourSemaine que vous allez faire évoluer de Lundi à Dimanche. Puisque vous êtes en présence d'une énumération, pour passer au jour suivant, vous devez incrémenter votre jour avec une syntaxe sous forme d'entier et ensuite de transtyper vers le type de l'énumération. Voici l'écriture correspondante à cette incrémentation : jour = (JourSemaine)(jour+1).
Saisie du jour du mois sous forme d'entier non signé directement à partir du champ jourDuMois de la variable dateDuJour.
Saisie du mois en cours sous forme de chaîne de caractères. Réutilisez la variable saisie pour cela.
Retrouver le mois à partir de la variable saisie. Cette fois-ci, vous vous servirez de la constante TexteMois. Par contre cette fois-ci, vous devez tester les quatre premières lettres de la chaîne de caractères stockée dans saisie. Complétez la variable dateDuJour en conséquence.
Saisie de l'année en cours sous forme d'entier directement à partir du champ annee de la variable dateDuJour.
Calcul des jours déjà fait au cours de l'année. Par exemple, le 6 novembre 2006 correspond au 310 jour de l'année. Pour cela, vous allez vous servir de la constante JoursDansMois. Vous allez parcourir tous les mois de Janvier jusqu'à la date d'aujourd'hui et comptabiliser le nombre de jour total que comporte chacun des mois. Attention aux années bissextiles. Complétez ensuite le champ joursDansAnnee de la variable dateDuJour en conséquence.
Tout est maintenant complété dans la variable dateDuJour. Il suffit maintenant d'afficher son contenu en tenant compte du scénario présenté ci-dessus.
Cette première partie est importante puisqu'elle met en valeur l'utilisation à la fois des énumérations JourSemaine et Mois, des constantes tableaux de chaîne de caractères TexteJour, TexteMois, JoursDansMois et la structure Date. Testez cette première partie. N'allez pas plus loin tant que cette dernière n'est pas correctement opérationnelle.
Récupération et affichage de la date à traiter et affichage du jour de la semaine - dans la fonction main()
Nous allons nous occuper maintenant de la date qui va nous permettre de calculer le jour de la semaine à rechercher.
Déclaration de la variable date qui représente la date à calculer.
Affichage préliminaire de la zone de saisie de la date à calculer (revoir le scénario proposé plus haut).
Saisie du jour du mois sous forme d'entier non signé directement à partir du champ jourDuMois de la variable date.
Saisie du mois sous forme de chaîne de caractères. Réutilisez la variable saisie pour cela.
Retrouver le mois à partir de la variable saisie. Encore une fois, vous vous servirez de la constante TexteMois. Complétez la variable date en conséquence.
Saisie de l'année sous forme d'entier directement à partir du champ annee de la variable dateDuJour.
Calcul des jours déjà fait au cours de l'année. Attention aux années bissextiles. Complétez ensuite le champ joursDansAnnee de la variable date en conséquence.
Calcul du jour de la semaine de la date à calculer par rapport à la date du jour. C'est la partie principale du programme. Pour cela, sur un papier broullion, prévoyez plusieurs scénarii possibles en prenant d'abord des exemples simples, sans tenir compte des années bissextiles. Prenez des dates très proches de la date d'aujourd'hui. Par exemple, regardez ce qu'il faut faire pour trouver un jour de la semaine dans la semaine juste avant la date d'aujourd'hui ou la semaine d'après. Ensuite, dans votre recherche, prenez une date un peu plus éloignée. Une opération qui me paraît prépondérante pour traiter ce genre de problème est la fonction modulo (%) et plus particulièrement modulo 7 (sept jours dans la semaine).
Tout est maintenant complété dans la variable date. Il suffit juste de l'afficher comme précédemment.
Accès direct mémoire vidéo – affichage en mode DOS
Le programme à réaliser doit permettre de gérer l'affichage en proposant des accès directement dans la mémoire vidéo. Une carte vidéo peut gérer deux modes de fonctionnement. Soit le mode texte, soit le mode graphique. Le mode graphique propose en son sein plein de modes différents. Pour ce programme, nous nous intéresserons uniquement au mode texte. C'est d'ailleurs celui qui existe lorsque que l'ordinateur est en phase de démarrage au moment de la lecture du BIOS.
Dans ce mode, l'adressage de la mémoire vidéo se situe à l'adresse 0xB8000000 . Par ailleurs, ce mode propose un affichage de 80 caractères sur 25 lignes.
Chacun des caractères est codé sur 2 octets. En effet, le premier octet est le caractère proprement dit, le deuxième correspond aux attributs de ce caractère, c'est-à-dire, sa couleur de fond, sa couleur du texte et éventuellement s'il doit clignoter.
Les lignes se suivent dans la mémoire vidéo, ainsi le premier caractère de la deuxième ligne se situe à l'adresse :
- 0xB8000000 + 2x80 (en octet).
A partir de toutes ces considérations, vous allez donc mettre en œuvre votre programme. Toutefois, pour avoir un accès libre à la mémoire vidéo, il est nécessaire d'utiliser un compilateur qui travaille en mode DOS. En effet, Windows protège l'accès direct à la mémoire vidéo pour éviter tout conflit entre les différentes applications. Chaque application DOS possède donc sa propre mémoire partagée, qui du coup devient une mémoire virtuelle (le résultat sera d'ailleurs légèrement dégradé puisque, par exemple, le clignotement ne fonctionne pas). Le compilateur à utiliser est le Turbo C++.
Dans l'ordre, vous allez établir toutes les déclarations nécessaires en dehors de la fonction ‘main' pour que le traitement devienne facile à mettre en œuvre, savoir :
Mettre en place l'énumération Couleur qui représente toutes les couleurs possibles pour un caractère.
Mettre en place le type Attribut (sous forme de structure de bit) qui prend en compte la couleur du texte, la couleur du fond et le clignotement.
Mettre en place la structure CaractereEcran qui doit disposer d'un caractère et de ses attributs.
A partit de ces déclarations, vous allez structurer le traitement au sein de la fonction main :
Déclarer la variable ecran de type pointeur sur CaractereEcran dont le contenu correspond directement à l'adresse de la mémoire vidéo, donc à l'adresse 0xB8000000.
Il est en effet possible d'indiquer à un pointeur directement l'adresse pointée. Toutefois, il est nécessaire de réaliser un changement de type pour que l'écriture soit compatible. Par exemple :
int *p = (int *) 0x1AF12 ; // p pointe à l'adresse 0x1AF12 ;
Déclarez la chaîne de caractères message qui doit comporter le message de bienvenue.
Placez cette chaîne de caractères en accès direct sur la mémoire vidéo de telle façon qu'elle apparaisse sur la première ligne de la fenêtre DOS comme cela vous est présenté dans la photo d'écran ci-dessus. Ce message doit être bleu sur fond cyan.
Vous allez mettre en œuvre une fenêtre modeste sans fioriture qui correspond à une zone d'écran. Cette fenêtre doit avoir une dimension de 20 caractères de large, 8 de hauteur. Elle doit être placée à 5 caractères du bord gauche pour 3 caractères à partir du haut. La mise en œuvre de cette fenêtre consiste uniquement à régler les attributs propres à cette zone. Le texte devra pouvoir s'écrire en rouge sur fond brun.
Affichez un nouveau message de bienvenue à l'intérieur de cette fenêtre en vous servant des attributs déjà proposés par la fenêtre. Ce message doit être placé à un caractère du bord haut et du bord gauche.
Pour finir, mettez en œuvre une procédure qui permet d'effacer tout l'écran (tout noir).