Play with Strings

Inleiding

De titel van het hoofdstuk ‘Play with Strings’ verwijst niet naar een of ander muziekinstrument of naar een summier stukje textiel. In IT wordt een string gedefinieerd als “een reeks tekens of karakters” (nl.wikipedia.org). Jouw voornaam is een string. Jouw familienaam is een string. De naam van jouw gemeente is een string… Allerhande bewerkingen met strings zullen voortdurend nodig zijn om een programma samen te stellen: voornaam en familienaam moeten soms worden samengevoegd, de naam van de straat zal moeten worden aangevuld met het huisnummer, de postcode en de naam van de gemeente om een adres te vormen… Scratch biedt standaard een aantal functies om met strings te werken: de lengte van een string bepalen, een karakter uit een string opvragen, strings samenvoegen. Een aantal van deze functies werden reeds in vorige hoofdstukken geïllustreerd.

In deze les willen we een aantal nieuwe functies als procedures (Mijn blokken) toevoegen om het ‘spelen’ met strings te vereenvoudigen.

Substring

Een substring is een deel van een bestaande string. Het woord ‘Limburg‘ is bijvoorbeeld een substring van de string ‘Provincie Limburg‘. De procedure die we in deze paragraaf wensen te ontwikkelen moet de mogelijkheid bieden om een aantal karakters op te halen vanaf een bepaalde startpositie in een bestaande tekst. Om het woord ‘Limburg’ op te halen in de string ‘Provincie Limburg’ zou de startpositie op 11 moeten worden geplaatst (9 karakters voor het woord ‘Provincie’+ 1 spatie = 10 karakters, de letter ‘L’ begint dan op de 11de positie) en het aantal gewenste karakters op 7.

Een nieuw blok definiëren

We kunnen nooit weten welke variabelen in een programma zullen worden gebruikt. Dit maakt het natuurlijk moeilijk om een algemene functie substring te creëren waarbij we de naam van de oorspronkelijke string-variabele nog niet kennen.

Scratch biedt de mogelijkheid om de inhoud van een bestaande variabele door te geven aan een nieuwe variabele in een blok. Voor een substring moeten we drie gegevens doorsturen naar het substring-blok: de oorspronkelijke string, de startpositie en de lengte. Deze gegevens zijn noodzakelijk om de procedure te laten werken.

Maak een blok
Maak een blok

Bij het definiëren van een nieuw blok wordt de naam van het blok bovenaan ingevoerd. Onderaan zijn 3 bijkomende knoppen beschikbaar: Voeg een invoer toe – getal of tekst, Voeg een invoer toe – boolean, Voeg een label toe.

Het substring-blok moet kunnen beschikken over 3 gegevens: de oorspronkelijke tekst (variabele Tekst), de startpositie (variabele Start) en het aantal karakters die we willen opvragen (variabele Aantal). Tekst, Start en Aantal zijn dan 3 variabelen die enkel bruikbaar zullen zijn binnen deze procedure.

parameters
Blok met toegevoegde variabelen

De definitie van deze variabelen kan gebeuren via de knop Voeg een invoer toe – getal of tekst. Bij het indrukken van deze knop (zie rode pijlop bovenstaande schermafdruk) wordt één element toegevoegd waarin de naam van de blok-variabele kan worden ingebracht. Bij het aanroepen van deze procedure zullen deze variabelen dan moeten worden ingevuld met bepaalde waarden. Soms noemt men deze variabelen ook parameters.

Substring: pseudocode

De variabelen Tekst, Start en Aantal werden reeds gedefinieerd. Deze variabelen zullen worden opgevuld vanuit andere delen van het programma. Deze ‘speciale’ variabelen kunnen worden gebruikt maar kunnen niet worden gewijzigd. Daarom kopiëren we de variabele Start in een nieuwe variabele Positie. De variabele Positie kan dan meerdere malen worden verhoogd. Het resultaat van de substring-procedure wordt een tekst die we terug willen bezorgen aan het onderdeel dat het substring-blok heeft opgeroepen. Ik gebruik steeds de variabele MyReturn om het resultaat van een functie te stockeren. Deze variabele moet je dan op een ‘normale’ manier creëren via de bekende knop Maak een variabele. Zoals steeds kan je de naam van deze variabele natuurlijk zelf bepalen.

Maak de variabele MyReturn leeg
Plaats de variabele Start in de variabele Positie
Repeat Aantal Times
   Voeg de letter op plaats Positie toe aan de variabele MyReturn
   Verhoog de variabele Positie met 1
End Repeat

Substring: Scratch-Programma

Het substring-blok kan nu als volgt worden geprogrammeerd:

substring-blok
substring-blok

Substring: substring-blok oproepen

In volgend Scratch-programma maak ik gebruik van de pas gecreëerde substring-functie:

Het substring-blok gebruiken
substring oproepen

Het substring-blok om de procedure op te roepen vinden we in de categorie Mijn blokken.

substring oproepen
substring oproepen

Bij het oproepen van het substring-blok moeten we alle gegevens doorgeven die nodig zijn om het substring-blok te laten werken. Het substring-blok krijgt steeds een kopie van de gegevens beschikbaar in het oproepende blok. Soms noemt men deze gegevens ook argumenten.

De ‘speciale’ variabele Tekst wordt opgevuld met de gegevens die zich in de variabele antwoord bevinden, de variabele Start krijgt de waarde 11 en de variabele Aantal krijgt de waarde 7.

Als we het programma nu uitvoeren met onze testgegevens (‘Provincie Limburg‘) dan krijgen we het gewenste resultaat (‘Limburg‘).

Bemerk tevens dat ik de variabele MyReturn in het oproepende script onmiddellijk kopieer naar een nieuwe variabele (variabele Resultaat). Op deze manier komt de variabele MyReturn steeds opnieuw beschikbaar.

Rtrim

Strings bevatten soms een reeks spaties op het einde van de string. Dit kan tot onverwachte resultaten leiden zeker als je dergelijke strings gaat samenvoegen. Denk hierbij maar even aan de situatie waarbij de variabele VoorNaam de waarde Thomas         zou bevatten en de variabele FamilieNaam de waarde Mertens      . Als je beide gegevens nadien zou samenvoegen dan bekom je Thomas          Mertens       . Deze string kan je toch moeilijk op een adreslabel drukken! De procedure rtrim moet ons toelaten om overtollige spaties op het einde (rechts) van de string te verwijderen.

Rtrim: Variabelen

De procedure zal andermaal een string ontvangen waarvan de spaties op het einde moeten worden verwijderd. Deze string kunnen we opnieuw Tekst noemen. De gewijzigde string (zonder spaties op het einde) kunnen we dan bewaren in de variabele MyReturn.

Rtrim: Algoritme

We starten op het einde van de string Tekst en bekijken het laatste karakter. Als dit karakter een spatie is dan bekijken we onmiddellijk het voorgaande karakter,… Dit gaat zo verder tot er een niet-blanco karakter wordt ontmoet. De lus stopt dus op het moment dat het bestudeerde karakter niet gelijk is aan een spatie. De plaats waar dit niet-blanco karakter werd gevonden is natuurlijk heel belangrijk. Deze plaats kunnen we bijhouden in de variabele Positie. Nadien kunnen alle karakters startend vanaf het eerste karakter tot en met het karakter op de plaats Positie worden gekopieerd naar de variabele MyReturn. Hierbij kunnen we gebruik maken van de zopas ontwikkelde substring– procedure.

Rtrim: Pseudocode

De pseudocode kan als volgt worden voorgesteld:

Maak de variabele MyReturn leeg
Plaats de lengte van de Tekst in de variabele Positie
Repeat Until het karakter op de plaats Positie van Tekst niet gelijk is aan een spatie
   Verminder de variabele Positie met 1
End Repeat
substring(Tekst, 1, Positie)

Rtrim: Scratch-Programma

Het rtrim-blok kan nu als volgt worden ontwikkeld in Scratch:

rtrim
rtrim-blok

De herhaal tot-instructie lijkt wat complex maar is gemakkelijk te begrijpen op basis van de pseudocode: blijf de lus uitvoeren totdat de bestudeerde letter in de tekst niet gelijk is aan een spatie. In dit geval combineren we twee functies waarbij de functie Controleren op gelijkheid (categorie Functies) is ingebouwd in de functie not-functie (categorie Functies).

De rtrim-functie kan je nu als volgt oproepen:

rtrim oproepen
rtrim oproepen

Ltrim

De ltrim-procedure is vergelijkbaar met de rtrim-procedure.ltrim zal alle spaties verwijderen in het begin van een string. In dit geval moeten we onze logica natuurlijk starten vanaf de eerste positie van de string.

Het volgende ltrim-programma is gemakkelijk te begrijpen op basis van de bespreking van het rtrim-blok:

ltrim
ltrim-blok

Trimall

De trimall-procedure verwijdert alle spaties uit een tekst.

Ook dit programma is heel gemakkelijk te begrijpen op basis van vorige besprekingen.

trimall
trimall-blok