Dag 5 opgave 2

Opgavens ordlyd er:
"Indexer
Betragt følgende klassedefinition

class DaysInMonth
{
int[] days ={31,28,31,30,31,30,31,31,30,31,30,31};

public DaysInMonth() {}

}

Du skal tilføje indexer til DaysInMonth, så følgende kode bliver tilladt:

DayInMonth dim = new DayInMonth();

int n1 = dim[2]; // antal dage i februar
int n2 = dim["apr"]; // antal dage i april
int n2 = dim["Aug"]; // antal dage i august

Som index skal man altså kunne bruge månedens nummer eller 3-bogstavsforkortelsen for månedens navn (med llille eller stort begyndelsesbogstav). Der skal kun være get’er i de to indexer, ingen set’er."


Koden er at finde nederst på denne side

Gå direkte til koden opgave 2 Form1.cs
Her kan du også downloade koden, som er lagt ud som .zip-fil.
Da denne opgave handler om koden og ikke programmet - har jeg ikke lavet program til installation.


Gennemgang af opgaveløsningen:

Denne løsning følger næsten den stillede opgave. Consol-applikationer er ufattelig kedelige at lave når det bare er til opgaveløsning og oprettelse af objekter. Jeg lavede derfor en windowsapplikation og fik derved genopfrisket min hukommelse i forhold til comboboxe/dropdownlister.

Ideen med indexer er vel egentlig at gøre programmørens liv nemmere og min GUI er vældig stor i omfang sammenlignet med hvor meget brugen af selve indexerne fylder i programmet.
Da GUI egentlig ikke er en del af opgaven laver jeg lige en hurtig gennemgang.


GUI'en består af 2 dropdownlister og et stort tekstfelt (i en listbox). Tekstfeltet viser resultatet af brugerens valg. Fra start af er der to linier i tekstfeltet; disse er min test af om opgaven løser kravet "Du skal tilføje indexer til DaysInMonth, så følgende kode bliver tilladt:

DayInMonth dim = new DayInMonth();

int n1 = dim[2]; // antal dage i februar
int n2 = dim["apr"]; // antal dage i april
int n2 = dim["Aug"]; // antal dage i august".
Viser skærmbilledet ved opstart

Ved opstart af programmet indlæses de nødvendige data til de to dropdownlister. Den ene viser årets måneder repræsenteret ved månedens nummer i intervallet 1 - 12. Den anden viser årets måneder repræsenteret ved månedens første 3 bogstaver (for at opfylde opgaven som siger - med lille eller stort begyndelsesbogstav - har jeg så "mast" dette ind i den samme dropdownliste).
Ved tryk på en af dropdownlisterne "rulles" valg-mulighederne ud.


Viser skærmbilledet ved tryk på dropdownliste Viser skærmbilledet ved tryk på den anden liste

Når brugeren i ovenstående foretager et valg vises resultatet med det samme i tekstfeltet:

Viser skærmbilledet hvor tesktfelt er opdateret

Gennemgang af specielle detaljer i koden

En gennemgang virker overflødig, da det interessante i denne opgave er de to indexere og disse består egentlig blot af switch-erklæringer.
De væsentligste oplysninger er notationen ved metode-erklæringerne:


public int this[int i]
{
public int this[string name]
{

Og ideen er så, at det fungerer på samme måde som ved anvendelse af arrays. Værdier hentes og sættes med samme notation som hvis der f.eks. var tale om et string array:

string[] ord = { "jan", "feb", "mar", "apr", "may" };
string femteMd = ord[4];
this.listBox1.Items.Add(femteMd);
ord[4] = "maj";
this.listBox1.Items.Add(ord[4].ToString());

//Instansiering af array sker i klassen DaysInMonth, så når et objekt af denne type dannes,
//er arrayet også dannet.
DaysInMonth dim = new DaysInMonth();
int n2 = dim[4];
this.listBox1.Items.Add(n2.ToString());
//Da opgaven ikke omhandler set, men blot get vil denne notation ikke virker i dette program:
//dim[4] = 30;
//this.listBox.Items.Add(dim[4].ToString());



Henriette Rømer Dreier - 4. marts 2006







Download den samlede kode som .zip-fil



Indhold af DaysInMonth.cs

Indhold af Form1.cs

Indhold af Form1.Designer.cs

Valid CSS!

Valid XHTML 1.0!