Maak in de solution Lussen een nieuwe WPF Application WpfLussen.
Inleiding
Een programmalus wordt gebruikt wanneer een statement of een groep statements herhaald moet worden.
Lussen vormen een basisstructuur in om het even welke programmeertaal, het is uitermate belangrijk er een goed begrip van te hebben.
Voorbeelden waarbij gebruik wordt gemaakt van lussen zijn:
Een (variabele) boodschap moet aantal keer op het scherm worden gezet
Een getallenreeks wordt overlopen bij bijvoorbeeld zoeken naar delers van een getal
Een reeks waarden dient gesorteerd te worden
De namen van alle bestanden in een map moeten getoond worden
Een tekstbestand moet regel per regel worden ingelezen
Records uit een databasetabel moeten overlopen worden
...
While
Een while-lus kan gebruikt worden om statements uit te voeren zolang een bepaalde voorwaarde waar (true) is.
while(booleanexpressie)
{
statement(s);
}
De expressie moet een boolean als resultaat geven
De expressie moet tussen ronde haken genoteerd worden
Als de expressie al direct als false geëvalueerd wordt, worden de statements niet uitgevoerd
Als er meer dan een statement moet uitgevoerd worden, dan plaats je deze tussen accolades
Voorbeeld: lussen van 0 tot en met 5, waarde van de teller wordt getoond:
int teller = 0;
while(teller < 6)
{
MessageBox.Show("Teller is nu gelijk aan " +teller.ToString());
teller++;
}
Toepassing: getallen 1 t.e.m. 10
Maak een WPF Window met twee knoppen (btnToonGetallen, btnLeegMaken) en een ListBox (list).
Drukken op btnToonGetallen toont de getallen 1 tot en met 10 in de ListBox.
Drukken op btnLeegMaken maakt list leeg
Toon /verberg
private void btnToonGetallen_Click(object sender, RoutedEventArgs e)
{
int i = 0;
while (i < 10)
{
i++;
list.Items.Add(i);
}
}
private void btnLeegMaken_Click(object sender, RoutedEventArgs e)
{
list.Items.Clear();
}
Toepassing: faculteit
Maak een nieuw WPF Window Faculteit aan
Voeg een TextBox txtGetal, een Knop btnBerekenFaculteit en een Label lblFaculteit toe
Wanneer de gebruiker een geheel getal ingeeft wordt door het klikken op de knop de faculteit van dat getal berekend.
faculteit:
4! = 4 x 3 x 2 x 1 6! = 6 x 5 x 4 x 3 x 2 x 1 1! = 1
0! = 1
Toon /verberg
private void btnBerekenFaculteit_Click(object sender, RoutedEventArgs e)
{
int getal = int.Parse(txtGetal.Text);
long resultaat = BerekenFaculteit(getal);
lblFaculteit.Content = resultaat.ToString();
}
private long BerekenFaculteit(int getal)
{
long faculteit = 1;
while (getal > 1)
{
faculteit *= getal;
getal--;
}
return faculteit;
}
//Extra: recursie
private long BerekenFaculteitRecursief(int getal)
{
long faculteit = 1;
if (getal > 1)
{
faculteit = getal * BerekenFaculteitRecursief(getal - 1);
}
return faculteit;
}
Extra: file inlezen
In deze toepassing werken we weer in Window1.
We openen we een tekstfile en tonen we deze op het scherm in de ListBox list
Deze toepassing is wat meer realistisch, maar vereist enige kennis die we (voorlopig) nog niet hebben.
Voeg een knop btnOpenBestand toe
Voeg een TextBox txtBestand toe
Voorzie een Click eventhandler voor de knop btnOpenBestand (dubbelklik )
Voorzie volgende extra code:
...
using Microsoft.Win32;using System.IO;
...
public partial class Window1 : Window
{
private OpenFileDialog openFileDialog = null;
public Window1()
{
InitializeComponent();
openFileDialog = new OpenFileDialog();openFileDialog.FileOk += openFileDialogFileOk;
}
private void openBestand_Click(object sender, RoutedEventArgs e)
{
openFileDialog.ShowDialog();
}
private void openFileDialogFileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
string fullPathname = openFileDialog.FileName;
FileInfo src = new FileInfo(fullPathname);
fileName.Text = src.Name;
TextReader reader = src.OpenText();
// hier komt de while lus
string line = reader.ReadLine();
while (line != null)
{
list.Items.Add(line);
line = reader.ReadLine();
}
// einde while lus
reader.Close();
}
...
}
For
Een for-lus bevat initialisatie van de teller, lusvoorwaarde en controlestatement (meestal ophogen van de tellervariabele) in één coderegel:
for(int i = 0; i < 6; i++)
{
MessageBox.Show("De teller i is nu gelijk aan: " +i.ToString());
}
Do
while en for testen de voorwaarde bij de start van de lus, het is mogelijk dat de statements binnen de lus nooit uitgevoerd worden. Een do-lus bevat de voorwaarde na de statements:
int i = 0;
do
{
MessageBox.Show("De teller i is nu gelijk aan: " +i.ToString());
i++;
}
De lusstatements worden hier dus minstens één keer uitgevoerd.
Toepassing: decimaal naar octaal
Maak een toepassing waarbij de gebruiker een geheel getal ingeeft. Bij het drukken op een knop wordt dit omgerekend naar het octaal talstelsel (opeenvolgende rest bij deling door 8, zie cursus computerarchitectuur)
Het statement break beëindigt de lus: de lus wordt dus gestopt en er wordt verdergegaan met de statements na de lus.
Kan gebruikt worden in while-, for- en do-lussen
private void btnToonGetallen_Click(object sender, RoutedEventArgs e)
{
int i = 0;
while (i < 10)
{
i++;
if(i==8) break;
list.Items.Add(i);
}
}
continue
Het statement continue beëindigt de huidige doorgang van de lus: de huidige doorgang van de lus wordt dus gestopt en indien de lusvoorwaarde nog vervuld is worden de lusstatements van in het begin hernomen.
Kan gebruikt worden in while-, for- en do-lussen
private void btnToonGetallen_Click(object sender, RoutedEventArgs e)
{
int i = 0;
while (i < 10)
{
i++;
if(i==8) continue;
list.Items.Add(i);
}
}
Variabelen
Variabelen die je declareert binnen een lus hebben dit codeblok als scope en zijn daarbuiten dus niet gekend.
Oefeningen op lussen
Toepassing: tafels
Maak een Window WpfTafels aan, voorzie volgende toepassingen:
Een Button btnTafel5 die bij klikken de tafel van 5 toont in een ListBox lbTafels (1 x 5 = 5, 2 x 5 = 10, ..., 10 x 5 = 50)
Een ComboBox cbKiesTafel met alle getallen van 1 tot en met 10 die bij het veranderen van keuze de tafel in lbTafels toont.
Een Button btnTafels die bij klikken de tafels toont van 1 tot 10 (1 x 1 = 1, ... , 10 x 10 = 100), tussen de tafels staat een lege lijn.
Toepassing: delers
Maak een Window WpfDelers aan:
Het Window bevat een TextBoxen waarin de gebruiker een geheel getal zal ingeven (max. 1000).
Bij drukken op een knop worden in een ListBox de getallen getoond van 1 t.e.m. het gekozen getal, met ernaast de delers het getal.
Bij een Priemgetal wordt een extra melding "Priemgetal!" getoond, een priemgetal is een getal met exact twee (verschillende!) delers.
Toepassing: schrikkeljaren
Maak een Window WpfSchrikkeljaren aan:
Een jaar is een schrikkeljaar :
Wanneer het jaartal deelbaar is door 4, behalve wanneer deelbaar door 100.
Een jaartal deelbaar door 400 is wel een schrikkeljaar
Het Window bevat twee TextBoxen waarin de gebruiker een start- en eindjaar kan ingeven
Bij drukken op een knop worden jaren van startjaar t.e.m. eindjaar in een ListBox getoond
De jaren zijn in de ListBox voorzien van een melding:
Het woord schrikkeljaar indien het jaar een schrikkeljaar is.
Deelbaar door 400 (schrikkeljaar): twee uitroeptekens "!!"
Deelbaar door 100 (geen schrikkeljaar): de tekens "<--"
Deelbaar door 4 (schrikkeljaar): één uitroepteken "!"