Quelques raccourcis :
Ceci est un petit site de support pour le cours 420-KBB-LG – Programmation orientée objet avancée.
Vous trouverez aussi des liens sur divers langages (dont C#, notre outil de prédilection dans ce cours) un peu partout dans http://h-deb.ca/. Portez une attention particulière à ../../../Sujets/Divers--cdiese/index.html.
Les diverses sections de cette page (en fonction desquelles vous trouverez quelques liens dans l'encadré à droite) vous mèneront elles-aussi sur des pistes qui vous permettront d'explorer un peu plus par vous-mêmes, de valider vos acquis et d'enrichir votre apprentissage.
![]() |
Plan de cours |
![]() |
Je corrige les programmes en appliquant des codes de correction. Vous trouverez ici la liste des codes les plus fréquents. |
![]() |
Ma stratégie de correction en tant que telle (pour le code, à tout le moins) est résumée ici. |
![]() |
Cliquez sur cette cible pour les normes appliquées dans ce cours, en ce qui a trait au pseudocode |
![]() |
Quelques trucs pour demander de l'aide plus efficacement |
Puisque nous serons en quelque sorte laboratoire à la fois pour les séances théoriques et les séances de laboratoire, j'ai fait le choix de construire le cours sous forme de 30 séances (de S00 à S29) plutôt que sous forme de 15 séances théoriques et 15 séances de laboratoire. Le dosage prévu de temps en théorie et de temps en laboratoire (soit environ moitié-moitié) devrait être respecté.
L'horaire de cette session pour ce cours est d'une grande complexité, du moins pour votre humble serviteur, et ce pour deux raisons :
Pour cette raison, je vais essayer une nouvelle manière de planifier la session, séparant les séances et les dates (jointes aux groupes). Prenez soin d'apprendre votre numéro de groupe pour bien être en mesure de vous repérer.
| Séance | Groupe 00001 | Groupe 00002 | Groupe 00003 |
|---|---|---|---|
| S00 | Lundi 24 août | Mercredi 26 août | Lundi 24 août |
| S01 | Vendredi 28 août | Vendredi 28 août | Jeudi 27 août |
| S02 | Lundi 31 août | Mercredi 2 sept. | Lundi 31 août |
| S03 | Vendredi 4 sept. | Vendredi 4 sept. | Jeudi 3 sept. |
Lundi 7 sept. Fête du travail (jour férié) |
|||
| S04 | Vendredi 11 sept. | Mercredi 9 sept. | Jeudi 10 sept. |
| S05 | Lundi 14 sept. | Vendredi 11 sept. | Lundi 14 sept. |
| S06 | Vendredi 18 sept. | Mercredi 16 sept. | Jeudi 17 sept. |
| S07 | Lundi 21 sept. | Vendredi 18 sept. | Lundi 21 sept. |
| S08 | Vendredi 25 sept. | Mercredi 23 sept. | Jeudi 24 sept. |
| S09 | Lundi 28 sept. | Vendredi 25 sept. | Lundi 28 sept. |
| S10 | Vendredi 2 oct. | Mercredi 30 sept. | Jeudi 1 oct. |
|
Lundi 5 oct. Élections provinciales (cours suspendus) |
|||
| S11 | Mardi 6 oct. | Vendredi 2 oct. | Mardi 6 oct. |
| S12 | Vendredi 9 oct. | Mercredi 7 oct. | Jeudi 8 oct. |
Lundi 12 oct. Action de grâce (jour férié) |
|||
| S13 | Vendredi 16 oct. | Vendredi 9 oct. | Jeudi 15 oct. |
| S14 | Lundi 19 oct. | Mercredi 14 oct. | Lundi 19 oct. |
Mercredi 21 oct. Journée pédagogique (cours suspendus) |
|||
Jeudi 22 et vendredi 23 oct. Journées de récupération (cours suspendus) |
|||
| S15 | Lundi 26 oct. | Vendredi 16 oct. | Lundi 26 oct. |
| S16 | Vendredi 30 oct. | Mercredi 28 oct. | Jeudi 29 oct. |
| S17 | Lundi 2 nov. | Vendredi 30 oct. | Lundi 2 nov. |
| S18 | Vendredi 6 nov. | Mercredi 4 nov. | Jeudi 5 nov. |
| S19 | Lundi 9 nov. | Vendredi 6 nov. | Lundi 9 nov. |
| S20 | Vendredi 13 nov. | Mercredi 11 nov. | Jeudi 12 nov. |
| S21 | Lundi 16 nov. | Vendredi 13 nov. | Lundi 16 nov. |
| S22 | Vendredi 20 nov. | Mercredi 18 nov. | Jeudi 19 nov. |
| S23 | Lundi 23 nov. | Vendredi 20 nov. | Lundi 23 nov. |
| S24 | Vendredi 27 nov. | Mercredi 25 nov. | Jeudi 26 nov. |
| S25 | Lundi 30 nov. | Vendredi 27 nov. | Lundi 30 nov. |
| S26 | Vendredi 4 déc. | Mercredi 2 déc. | Jeudi 3 déc. |
| S27 | Lundi 7 déc. | Vendredi 4 déc. | Lundi 7 déc. |
| S28 | Vendredi 11 déc. | Mercredi 9 déc. | Jeudi 10 déc. |
| S29 | Lundi 14 déc. | Vendredi 11 déc. | Lundi 14 déc. |
Le détail des séances en soi suit (le calendrier par groupe est plus haut).
| Séance | Détails |
|---|---|
|
Au menu :
La raison pour laquelle il est important de mettre vos outils de développement à jour n'est pas vraiment le recours à de nouveaux mécanismes du langage ou de la plateforme, mais bien parce que nous écrirons des programmes faits de plusieurs composants compilés qui devront parfois être de la même technologie. Conséquemment, si vos outils ne sont pas à jour, vous ne pourrez pas faire certains de vos travaux pratiques.
Si vous souhaitez le code du programme principal à partir duquel vous devrez démarrer, vous pouvez le prendre du fichier PDF ou encore le prendre ci-dessous (parfois, copier / coller d'un PDF, ça donne des résultats suspects) : Après avoir pris un peu de temps pour se « chamailler » avec ce petit défi de remise en forme, je vous ai proposé un peu de code pour vous aider à redémarrer vos instincts de programmeuse et de programmeur. L'accent a été mis sur l'écriture de code simple :
Le code produit en classe suit (note : il y a quelques ajouts et ajustements dans ce code en comparaison avec ce que nous avons fait aujourd'hui, mais nous en parlerons à la séance S01) : Program.cs
Algos.cs
Orque.cs
Suggestions de lecture :
|
|
|
Au menu :
L'idée est que les classes static en C# servent entre autres de palliatif pour l'absence de vraies fonctions dans le langage. En effet, tout comme Java, C# ne supporte que les méthodes, qui sont des fonctions membres d'une classe ou d'une instance, mais ne supporte pas les fonctions en tant que telles, hors d'une classe). Ainsi, le programme suivant (https://dotnetfiddle.net/OWcfrC) : ... offre une méthode Distance qui est un peu verbeuse, mais qui peut s'écrire plus simplement (https://dotnetfiddle.net/CFsrjf) : ... qui est un peu plus léger pour les yeux.
À titre de référence, le code d'aujourd'hui est à peu près le suivant. Ce code est perfectible; nous ferons bien mieux plus tard dans la session. Je vous laisse le soin d'écrire le programme principal : Soldat.cs
Orque.cs
En espérant que cela vous soit utile! Nous avons aussi discuté sommairement du clonage et de l'idiome NVI. À titre de référence, le code produit lors de cette séance pour démontrer le clonage était :
En fin de séance, j'ai fait une petite activité dirigée d'un système à deux assemblages, soit le code client (qui était une application console, donc un exécutable), et le code serveur (qui était une bibliothèque de classes – une DLL). Distribution du TP00 Le code auquel nous en sommes arrivés pour le client était le suivant (j'ai pris quelques libertés pour vous divertir) : Le code auquel nous en sommes arrivés pour le serveur était le suivant (encore une fois avec quelques libertés) : Nous avons ensuite survolé les consignes du TP00. Si votre serveur pour le TP00 fonctionne correctement, le programme de test suivant... ... devrait donner un affichage comme le suivant (il peut y avoir certaines différences dans les cas « partagé » et « aléatoire », mais il y a des limites à ces différences – le test utilise un germe choisi – alors consultez votre chic prof si vous avez des doutes) : |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu : à venir |
|
|
Au menu :
|
Vous trouverez ici quelques documents, la plupart petits, qui peuvent vous donner un petit coup de pouce occasionnel.
Vous trouverez aussi des exemples de code C# dans la section Divers – C# du site, mais notez que je n'ai pas nécessairement harmonisé ces exemples (écrits pour des cours plus avancés, sous forme de survols) aux standards de programmation appliqués dans le présent cours. À lire avec prudence et discrimination, donc.
Les consignes des travaux pratiques suivent.
| Consignes | Détails supplémentaires | À remettre... |
|---|---|---|
|
s/o |
||
|
TP00 |
À venir |
À venir |
|
TP01a |
À venir |
À venir |
|
TP01b |
À venir |
À venir |
|
TP02 |
À venir |
À venir |
|
TP03 |
À venir |
À venir |
|
PFI |
Solutionnaire de la classe Messagerie proposée à la séance S17 :
using System;
using System.Collections.Generic;
namespace ActivitéArdoise
{
class HauteurInvalideException : Exception { }
class Messagerie : IObservateurArdoise
{
Dictionary<string, List<string>> Messages { get; } = new();
Dictionary<string, ConsoleColor> Couleurs { get; } = new();
static readonly ConsoleColor[] couleurs =
{
ConsoleColor.Red, ConsoleColor.Green, ConsoleColor.Blue,
ConsoleColor.Yellow, ConsoleColor.Cyan, ConsoleColor.Magenta
};
int Hauteur { get; init; }
public Messagerie(int hauteur)
{
if (hauteur <= 1) throw new HauteurInvalideException();
Hauteur = hauteur;
}
public void Nouveauté(string qui, string quoi)
{
lock (this)
{
if (Messages.ContainsKey(qui))
{
Messages[qui].Add(quoi);
if (Messages[qui].Count > Hauteur)
Messages[qui].RemoveAt(0);
}
else
{
Messages.Add(qui, new());
Couleurs.Add(qui, couleurs[Messages.Count % couleurs.Length]);
}
}
}
public void Afficher()
{
int[] largeurs;
string[] noms;
List<string> [] messages;
lock (this)
{
largeurs = new int[Messages.Count];
noms = new string[Messages.Count];
messages = new List<string>[Messages.Count];
int i = 0;
foreach (var (qui, msgs) in Messages)
{
noms[i] = qui;
largeurs[i] = Algos.Cumuler(
msgs, (cur, s) => Math.Max(cur, s.Length), noms[i].Length
);
messages[i] = new(msgs);
++i;
}
}
// titres
Console.Clear();
for (int i = 0; i != largeurs.Length; ++i)
Console.Write(noms[i].PadRight(largeurs[i]));
Console.WriteLine();
// messages
for (int j = 0; j != Hauteur; ++j)
{
for (int i = 0; i != largeurs.Length; ++i)
{
string nom = noms[i];
if (j < messages[i].Count)
{
ConsoleColor pré = Console.ForegroundColor;
Console.ForegroundColor = Couleurs[nom];
Console.Write(messages[i][j].PadRight(largeurs[i]));
Console.ForegroundColor = pré;
}
else
Console.Write(new string(' ', largeurs[i]));
}
Console.WriteLine();
}
}
}
}En espérant que ça vous aide à organiser vos idées!