Program brusautomat Eksempel på en tilstandsmaskin Dette er et programeksempel i C# som gir et eksempel på en tilstandsmaskin. Programmet simulerer en brusautomat hvor man kan kjøpe to typer brus. Man kan legges på 5 kr og 10 kr. Det er også mulig å angre etter at det er lagt på penger. Brukergrensesnittet til programmet Om programmet Programmet er laget slik at hver tilstand har en egen metode. I hver tilstandmetode er det en switch som skiller mellom mulige hendelser. Tilstandmetodene kalles av events dvs. når man trykker på knappene på formen. For å holde orden på tilstander og hendelser brukes enumerasjon (enum class). enum knytter tallverdier til tekst og man kan arbeide med tekst liksom med tallverdier. Noen objekter i programmet textbox_meldinger textbox_kr button_fem_kr button_ti_kr button_angre radiobutton1 radiobutton2 En tekstboks nederst for meldinger til bruker En tekstboks hvor antall kroner lagt på skrives ut En knapp man trykker på for å putte på 5 kr En knapp man trykker på for å putte på 10 kr En knapp man trykker på for å få pengene igjen En radioknapp for å velge Coca Cola En radioknapp for å velge Fanta
Koden i programmet using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Brusautomat public partial class Form1 : Form public Form1() InitializeComponent(); initialiser(); enum HENDELSER Ingen, Kr5, Kr10, Angre; enum TILSTANDER Klar, Kr5, Kr10; enum AKSJONER Ingen, LeverBrus, LeverBrusOg5kr, PengerTilbake; HENDELSER Hendelse; TILSTANDER Tilstand; AKSJONER Aksjon; void initialiser() // Kalles i konstruktøren Form1 Hendelse = HENDELSER.Ingen; void tilstand_klar() // Ingen penger er lagt på // Denne skriver metodenavnet i Output Window (hvis Debug) System.Diagnostics.Trace.WriteLine("tilstand_Klar()"); Tilstand = TILSTANDER.Kr5; this.textbox_kr.text = "5 kr"; Tilstand = TILSTANDER.Kr10; this.textbox_kr.text = "10 kr";
// Ikke noe er lagt på void tilstand_kr5() // 5 kr er lagt på fra før Tilstand = TILSTANDER.Kr10; this.textbox_kr.text = "10 kr"; Aksjon = AKSJONER.LeverBrus; // Har nå betalt 15 kr Aksjon = AKSJONER.PengerTilbake; void tilstand_kr10() // 10 kr er lagt på fra før Aksjon = AKSJONER.LeverBrus; // Har nå betalt 15 kr Aksjon = AKSJONER.LeverBrusOg5kr;// Har nå betalt 20 kr Aksjon = AKSJONER.PengerTilbake;
void nytilstand() // Denne metoden kaller rett tilstandsmetode switch (Tilstand) case TILSTANDER.Klar: tilstand_klar(); case TILSTANDER.Kr5: tilstand_kr5(); case TILSTANDER.Kr10: tilstand_kr10(); void utfoer_aksjon() // Denne metoden utfører en aksjon switch (Aksjon) case AKSJONER.Ingen: return; case AKSJONER.LeverBrus: if (this.radiobutton1.checked) "Værsågod, en Coca Cola"; else "Værsågod, en Fanta"; case AKSJONER.LeverBrusOg5kr: if (this.radiobutton1.checked) "Værsågod, en Coca Cola og 5 kr tilbake"; else "Værsågod, en Fanta og 5 kr tilbake"; case AKSJONER.PengerTilbake: "Værsågod, her er pengene tilbake";
private void button_fem_kr_click(object sender, EventArgs e) // Denne metoden kalles når 5 kr knappen trykkes "La på 5 kroner"; Hendelse = HENDELSER.Kr5; private void button_ti_kr_click(object sender, EventArgs e) // Denne metoden kalles når 10 kr knappen trykkes "La på 10 kroner"; Hendelse = HENDELSER.Kr10; private void button_angre_click(object sender, EventArgs e) // Denne metoden kalles når Angre knappen trykkes Hendelse = HENDELSER.Angre;