cursus programmeren in quickbasic 4.5

54
C U R S U S C U R S U S C U R S U S C U R S U S P R O G R A M M E R E N IN Q u i c k B A S I C versie 4.5 voor beginners M.J.W. Beck

Upload: mjw61

Post on 01-Jan-2016

124 views

Category:

Documents


9 download

DESCRIPTION

Een beginnerscursus propgrammeren in QuickBasic 4.5. Aan de hand van voorbeelden worden de belangrijkste commando's behandeld. Alle voorbeeldprogramma's zijn ook digitaal verkrijgbaar.De cursus bevat oefeningen van eenvoudig tot pittig.

TRANSCRIPT

Page 1: Cursus programmeren in QuickBasic 4.5

C U R S U SC U R S U SC U R S U SC U R S U S

P R O G R A M M E R E N IN

Q u i c k B A S I C versie 4.5

voor beginners

M.J.W. Beck

Page 2: Cursus programmeren in QuickBasic 4.5

Beginnerscursus programmeren in QuickBASIC

© M.J.W. Beck, 1993 – 2013

Niets uit deze uitgave mag openbaar gemaakt worden zonder toestemming van de auteur (mjwbeck_at_hotmail.com)

Page 3: Cursus programmeren in QuickBasic 4.5

1

INHOUDSOPGAVE VOORWOORD 2 1 WAT IS PROGRAMMEREN? 3 2 DE QuickBASIC PROGRAMMEEROMGEVING 4 3 UITVOER NAAR HET SCHERM 6 4 VARIABELEN (1): GETALVARIABELEN 8 5 VARIABELEN (2): STRINGVARIABELEN 11 6 VARIABELEN (3): ARRAYVARIABELEN 14 7 GEGEVENS INVOEREN (1) 16 8 ZELF PROGRAMMA'S MAKEN (1) 17 9 BESLISSINGSSTRUCTUREN (1): IF...THEN...ELSE 18 10 BESLISSINGSSTRUCTUREN (2): SELECT CASE 21 11 HET GEBRUIK VAN HET TOETSENBORD IN PROGRAMMA'S 23 12 LUSSEN (1): FOR...NEXT 27 13 LUSSEN (2): DO...LOOP EN WHILE...WEND 32 14 GEGEVENS INVOEREN (2) 36 15 HET LEZEN VAN EN HET SCHRIJVEN NAAR EEN BESTAND OP DE SCHIJF 37 16 ZELF PROGRAMMA'S MAKEN (2) 41 17 GRAFISCHE MOGELIJKHEDEN (1): INLEIDING EN LIJNEN 44 18 GRAFISCHE MOGELIJKHEDEN (2): PSET 46 19 GRAFISCHE MOGELIJKHEDEN (3): DRAW 48 20 GRAFISCHE MOGELIJKHEDEN (4): CIRKELS EN ELLIPSEN 50 21 ZELF PROGRAMMA'S MAKEN (3) 52

Page 4: Cursus programmeren in QuickBasic 4.5

2

VOORWOORDVOORWOORDVOORWOORDVOORWOORD De beginnerscursus QuickBASIC is oorspronkelijk in 1993 geschreven voor leerlingen op een school voor voortgezet onderwijs. Het doel was om de leerlingen te interesseren voor het programmeren en dat zij er plezier in zouden krijgen en het als een uitdaging zouden zien om programma's te maken in QuickBASIC. Anno 2013, dus 20 jaar later(!), is de cursus herzien. Het doel is nog steeds om de belangstelling van de lezer te wekken voor het programmeren, ook al gebeurt dit in een DOS-omgeving. De opzet van de cursus is hetzelfde gebleven, maar wat achterhaald is, zoals werken met floppydisks, guldens en dergelijke is aangepast. Deze handleiding speelt een centrale rol in de cursus. Zij is met de grootste zorg samengesteld, waarbij uitgegaan wordt van het principe dat je met de handleiding en de PC voor je aan de slag moet kunnen gaan. Daarom staan er ook zo veel voorbeeldprogramma's in, waarin iedere keer een bepaald aspect van het programmeren wordt toegelicht. Alle programma's zijn uiteraard op hun juistheid gecontroleerd. Van alleen maar het intypen van voorbeeldprogramma's leer je niet veel. Bij veel programma's staan opdrachten. Je moet dan bijvoorbeeld in het programma iets wijzigen en kijken wat dit voor effect heeft. In aparte hoofdstukken staan ook programmeeropdrachten. Wat je in de voorgaande hoofdstukken geleerd hebt, moet je dan kunnen toepassen in zelf te schrijven programma's. Uiteraard begint dit vrij eenvoudig. M.J.W. Beck, juli-augustus 1993 (herzien augustus 2013)

Page 5: Cursus programmeren in QuickBasic 4.5

3

HOOFDSTUK 1HOOFDSTUK 1HOOFDSTUK 1HOOFDSTUK 1 WAT IS PROGRAMMEREN?WAT IS PROGRAMMEREN?WAT IS PROGRAMMEREN?WAT IS PROGRAMMEREN? In feite is programmeren niets anders dan de computer een serie opdrachten geven. Een opdracht als: "Bereken het gemiddelde van 5 + 8" begrijpt de PC niet. Hij kan alleen opdrachten uitvoeren die in 'machinetaal' zijn gegeven. Het kost veel tijd om een programma in machinetaal te schrijven. Om die reden werden er vertaalprogramma's (interpreters) geschreven. Hiermee kun je de opdrachten (veel minder dan in een machinetaalprogramma) in normaal Engels invoeren, waarna het automatisch voor je vertaald wordt in machinetaal. De eenvoudigste van de interpreters is BASIC (Beginners All-purpose Symbolic Instruction Code). Deze programmeertaal werd in 1965 ontwikkeld en is daarna sterk verbeterd en uitgebreid. In deze cursus wordt gewerkt met QuickBASIC Versie 4.5. HOE ZIET NOU ZO'N BASIC-PROGRAMMA ER UIT? Hieronder een voorbeeld van een programma dat tafels berekent. REM Berekenen van tafels CLS INPUT " Tafel van ", T PRINT STRING$(16, "=") FOR I = 1 TO 20 PRINT USING "## x ### = ####"; I; T; I * T NEXT I END Op iedere regel staat een opdracht. Als je dit programma aandachtig bekijkt, snap je misschien wel wat er precies gebeurt. Er wordt nu geen uitleg bij gegeven, want later wordt op dit programma teruggekomen. Je zult zien dat als je later nog eens naar dit programma kijkt, je direct begrijpt wat er staat. Het zal duidelijk zijn dat je de opdrachten in een logische volgorde plaatst. Als je geen geld op zak hebt, ga je eerst geld halen bij de bank en dan pas boodschappen doen en niet andersom. Als je in een programma de opdrachten omdraait of verkeerde opdrachten geeft, werkt het programma niet. Hoe je die fouten (die door iedereen worden gemaakt) kunt opsporen en verhelpen leer je natuurlijk ook. NU WIL IK AAN DE SLAG M'N EERSTE PROGRAMMA? Voor het programmeren in QuickBASIC heb je het programma QB.EXE nodig. De benodigde bestanden, inclusief mappen met voorbeeldprogramma’s, zijn te vinden op: https://www.dropbox.com/sh/ie1xyo1qdezmr20/RrsKplTPTk. (indien niet, stuur dan een mail naar mjwbeck_at_hotmail.com). De programma’s uit deze cursus staan in de map CURSUS. Hoofdstuk 2 gaat over de werking van het programma QB.EXE. Als dit duidelijk is, kun je programma's gaan maken.

Page 6: Cursus programmeren in QuickBasic 4.5

4

HOOFDSTUK 2 DE QHOOFDSTUK 2 DE QHOOFDSTUK 2 DE QHOOFDSTUK 2 DE QuickuickuickuickBASIC PROGRAMMEEROMGEVINGBASIC PROGRAMMEEROMGEVINGBASIC PROGRAMMEEROMGEVINGBASIC PROGRAMMEEROMGEVING WE GAAN BEGINNEN Het gebruik van speciale toetsen wordt weergegeven met < >. Als je bijvoorbeeld op de toets Home moet drukken staat er <Home>. In DOS (Disk Operating System, de voorloper van Windows) en in QuickBASIC moet je na iedere regel op <Enter> drukken. Het drukken op <Enter> wordt niet steeds aangegeven. QuickBASIC werkt het beste in een DOS-omgeving. Hiervoor kan het gratis programma DosBox worden gedownload op http://www.dosbox.com. Als DosBox gestart is en QB.EXE staat in de map C:\QB45, dan kun je als volgt QuickBASIC starten in de DOS-omgeving van DosBox:

mount c c:\qb45 c: qb

QuickBASIC is nu gestart en waarschijnlijk in een venster. Met <ALT><Enter> kun je omschakelen naar een volledig scherm. WAT IS DIT NU? Wat nu op het scherm staat noemen we het HOOFDSCHERM. Op de bovenste regel zie je de woorden File, Edit, View etc. staan. Dit zijn allemaal verschillende menu's die je kunt activeren door de ALT-toets ingedrukt te houden en dan de eerste letter van het woord in te typen. Je kunt ook de linker muisknop gebruiken. Om hiermee te oefenen kun je het File-menu activeren. Er verschijnt dan een menu met de woorden New Program, Open Program etc. Bovendien staat New Program in een blokje. De opties die je nu ziet kun je op twee manieren activeren met het toetsenbord: 1. Typ de anders gekleurde letter in. 2. Beweeg het blokje met de pijltjestoetsen (of cursortoetsen) op en neer

totdat de gewenste optie in het blokje staat en druk op de Enter—toets. Als je met de cursortoetsen alle opties doorloopt, zie je op de onderste regel wat je met deze optie kunt doen. Helemaal links onderaan staat dat je met F1 hulp kunt krijgen. Ook nu kun je de opties in de submenu's ook activeren met de linker muisknop. Met <Esc> kun je een opgeroepen menu weer laten verdwijnen. HET HERSTELLEN VAN TYPEFOUTEN TIJDENS HET PROGRAMMEREN? Dit gaat hetzelfde als in Word, Excel en dergelijke. Er is één belangrijk verschil: de toetscombinaties voor het kopiëren, verwijderen en plakken van tekst is hier anders. Je vindt deze toetscombinaties in het menu onder Edit. Als de opdrachten intypt die QuickBASIC herkent, dan worden ze automatisch in hoofdletters weergegeven. Als je bijvoorbeeld 'rem' intypt gevolgd door <Enter>, dan staat er 'REM' in het scherm. Hiermee kun je commentaar bij de regels plaatsen; dit kan ook met '. Maak je een typefout en typ je 'ram' in, dan zie je ook 'ram' in het scherm staan. QuickBASIC denkt nu dat je een variabele bedoelt met de naam 'ram'. Fouten in de programmeeropdrachten herkent QuickBASIC, maar je wordt er pas op geattendeerd als je het programma start. Dit kan met <F5> of met <Shift><F5>.

Page 7: Cursus programmeren in QuickBasic 4.5

5

OEFENPROGRAMMA Voer de onderstaande opdrachten uit (<Enter> wordt niet aangegeven): • Typ CLS • Typ PRINT gevolgd door een spatie en dan een zinnetje, bijvoorbeeld "ik

heet ...", vergeet daarbij de aanhalingstekens niet. • Typ ? en weer gevolgd door een spatie en hetzelfde zinnetje. • Herhaal dit een aantal maal (dat kan door alles in te typen, maar ook door

de tekst te kopiëren en te plakken) • Typ END • Druk nu op <F5>. Als het goed is staat nu op het scherm een aantal keer het zinnetje dat je hebt ingetypt. Je hebt de volgende opdrachten gebruikt: CLS om het scherm schoon te maken (CLear Screen) PRINT (of ?) om iets op het scherm te zetten (tekst moet dan tussen

aanhalingstekens staan) END om het programma te beëindigen. Onder in beeld staat: Press any key to continue • Druk op een willekeurige toets (je komt nu weer terug in het hoofdscherm). • Druk nu een paar keer op <F4> (Hiermee wissel je tussen de twee schermen). In programma’s komen vaak opdrachten voor die herhaald moeten worden. Hiervoor zijn ‘lussen’ bedacht. Het zojuist gemaakte programma zou je als volgt kunnen aanpassen: CLS FOR i = 1 to 10 PRINT “Ik heet …” NEXT i END • Typ het programma in en druk op <F5>. De opdrachten FOR en NEXT horen bij elkaar en vormen een lus. De lus wordt 10 keer uitgevoerd. Het inspringen van de opdracht PRINT is niet noodzakelijk, maar vergroot de overzichtelijkheid in grotere programma’s. Alle ingesprongen tekst hoort bij een speciale opdracht, bijvoorbeeld een lus (zie hoofdstuk 12 en 13) of een beslissingsstructuur (zie hoofdstuk 9 en 10) EEN BESTAND BEWAREN OP DE SCHIJF Er staan veel programma's in deze cursus. De meesten zijn slechts bedoeld als toelichting bij een bepaald commando. Je mag zelf bepalen of je de programma's op een schijf wilt bewaren of niet. Een programma kun je opslaan via het File-menu. Kies dan de optie Save (met de muis of S intypen). Er verschijnt nu een nieuw scherm. Bovenin kun je de naam van het programma invoeren (maximaal 8 letters). Deze naam eindigt automatisch met .BAS. Sla het programma op in de map EXAMPLES. EEN BESTAND OPENEN Als je een programma wilt uitvoeren dat op de schijf staat, moet je het eerst openen. Dat gaat via het File-menu en de optie Open Program. Er verschijnt dan een scherm met een overzicht van alle BASIC-programma's. Zoek eventueel naar de juiste map. Als je het gewenste programma hebt gevonden kun je het openen door er 2x kort achter elkaar met de muis op te klikken (of druk er 1x op met de muis gevolgd door <Enter>). Een eventueel vorig programma wordt nu automatisch gewist (als het nog niet opgeslagen is, wordt eerst gevraagd of het bewaard moet worden) en het geselecteerde programma wordt geladen.

Page 8: Cursus programmeren in QuickBasic 4.5

6

HOHOHOHOOOOOFDSTFDSTFDSTFDSTUUUUK 3K 3K 3K 3 UITVUITVUITVUITVOOOOER NER NER NER NAAAAAAAAR R R R HHHHET ET ET ET SCHSCHSCHSCHERMERMERMERM HOE DE UITVOER UITVOEREN? Hieronder staan een paar eenvoudige programma's die bedoeld zijn om de werking van bepaalde commando's (zoals PRINT) toe te lichten. Voordat je de regels intypt, moet je met <Alt><F> en New Program voor een schoon scherm zorgen. Op de vraag of het programma bewaard moet worden, kies je <No>. De programma's start je met <F5> of <Shift><F5>. Bij sommige regels wordt toelichting gegeven. Dit commentaar staat dan aan het eind van de regel en begint met '. Dan weet QuickBASIC dat er gewone tekst volgt. Je hoeft dit commentaar niet per se over te nemen. Je kunt de commando's die in hoofdletters staan gewoon met kleine letters intypen. Opmerking: Ter onderscheid van de hoofdletter O en het cijfer nul, wordt de nul als volgt aangegeven: 0. 3.1 De commando's PRINT, LOCATE en TAB()3.1 De commando's PRINT, LOCATE en TAB()3.1 De commando's PRINT, LOCATE en TAB()3.1 De commando's PRINT, LOCATE en TAB() CLS 'maakt het scherm schoon PRINT "Ik programmeer in QuickBASIC" 'LET OP de aanhalingstekens PRINT "1934" PRINT TAB(12); 1934 'begint op positie 12 PRINT Hallo LOCATE 1, 40 PRINT "Dit staat op regel 1, positie 40" LOCATE 12, 70 'regel 12, positie 70 PRINT 2+3 LOCATE , 70 PRINT 2*3 END Toelichting bij programma 3.1 Bij PRINT wordt gewone tekst tussen aanhalingstekens gezet: PRINT "tekst". Als er geen aanhalingstekens staan wordt de waarde van een variabele getoond of het resultaat van een berekening. Een variabele is hetzelfde als de X in de wiskunde. In BASIC kunnen variabelen ook uit meer letters bestaan. Hierover later veel meer. Na PRINT Hallo wordt er op het scherm een 0 gezet, want met Hallo wordt hier een variabele bedoeld en die heeft de waarde 0. Bij berekeningen wordt * gebruikt als vermenigvuldigingsteken. Met LOCATE geef je aan waar iets op het scherm moet komen te staan. Helemaal linksboven is LOCATE 1,1. Helemaal rechts beneden is LOCATE 25,80. Met TAB() kun je alleen de positie op de regel aangeven waar het printen moet beginnen (met printer wordt hier steeds het weergeven op het scherm bedoeld). Het programma wordt afgesloten met END. Na deze opdracht stopt het programma onherroepelijk. Een programma dat met END begint, zal dus nooit uit te voeren zijn. In programma 3.2 zul je zien dat je met de PRINT-opdracht meerdere gegevens op het scherm kunt krijgen.

PROBEER STEEDS TE BEGRIJPEN WAT JE DOET!!

Page 9: Cursus programmeren in QuickBasic 4.5

7

3.2 Nogmaals het commando PRINT3.2 Nogmaals het commando PRINT3.2 Nogmaals het commando PRINT3.2 Nogmaals het commando PRINT CLS PRINT A + B PRINT "A + B" PRINT "A" + "B" PRINT 1; 2; 3; 4 PRINT 1, 2, 3, 4 PRINT "A"; "B"; "C" PRINT "D", "E", "F" PRINT "x = "; (3 + 4 / 5) + (1 / 3 * SQR(9)) LOCATE 24, 1 PRINT "Zonder ; aan het eind verspringt het beeld!"; END Toelichting bij programma 3.2 Met ; aan het eind van een PRINT-opdracht voorkom je dat er automatisch naar de volgende regel wordt gesprongen. Er wordt dan geen Carriage Return (= <Enter>) gegeven. Op die manier kun je afzonderlijke dingen achter elkaar plaatsen. Let op het verschil tussen ; en , in het gebruik. Met SQR(9) wordt bedoeld: de wortel van 9 (wortel = SQuare Root). SLAPEN MET GELUID EN KLEUREN. 3.3 De commando's COLOR, BEEP, SOUND en SLEEP3.3 De commando's COLOR, BEEP, SOUND en SLEEP3.3 De commando's COLOR, BEEP, SOUND en SLEEP3.3 De commando's COLOR, BEEP, SOUND en SLEEP CLS PRINT "Wacht 2 seconden op een toon." SLEEP 2 BEEP SLEEP 1: COLOR 16, 7 'voor- en achtergrondkleur veranderen PRINT "A L A R M ! ! ! " SOUND 300, 10: SOUND 400, 10: SOUND 800, 10 SLEEP 4 COLOR 7, 0 CLS PRINT "Alles weer normaal!" PRINT "Alleen m'n ogen "; COLOR 31 'alleen voorgrondkleur veranderen PRINT "knipperen"; COLOR 7 PRINT " nog." END

Toelichting bij programma 3.3 Met SOUND kun je een bepaalde toon met de frequentie in Herz (eerste getal) een zekere tijd (tweede getal) laten horen. Hier duurt de toon 10/18e seconde. Verschillende commando's mogen ook op één regel staan, mits ze gescheiden zijn door een dubbele punt. Vaak is het overzichtelijker als je één commando per regel gebruikt. Met COLOR kun je de voor- en achtergrondkleur veranderen. De achtergrondkleur loopt van 0 t/m 7. Geen achtergrondkleur aangeven betekent automatisch kleur 0 (= zwart). De voorgrondkleur loopt van 0 t/m 31. Van 8 t/m 15 zijn het fellere kleuren. Daarna wordt het patroon herhaald, maar dan knipperend. LET OP! Een COLOR-opdracht geldt voor ALLE volgende PRINT-opdrachten.

Page 10: Cursus programmeren in QuickBasic 4.5

8

HHHHOOOOOOOOFDSTFDSTFDSTFDSTUUUUK 4K 4K 4K 4 VARIABELENVARIABELENVARIABELENVARIABELEN (1): GET(1): GET(1): GET(1): GETALVARIABELENALVARIABELENALVARIABELENALVARIABELEN Er zijn twee soorten variabelen: GETALVARIABELEN en STRINGVARIABELEN. Beide soorten kunnen ook gebruikt worden in een zogenaamde ARRAY-variabele. In de hoofdstukken 4, 5 en 6 worden deze variabelen behandeld. Er zijn ook nog variabelen die je zelf kun definiëren, maar dit is voor gevorderden. GETALVARIABELEN Dit zal het meest bekend zijn, want in de wiskunde werk je ook met getal-variabelen. Als je opschrijft: x = 3, dan heeft x de waarde 3. Hier is x een getalvariabele. Je kunt dus aan x een waarde toekennen. Dat kan ook via een berekening: x = 3*5 + 2.5. Na deze opdracht heeft x de waarde 17.5 (LET OP: er wordt bij decimale getallen een punt gebruikt in plaats van de komma). In BASIC kunnen de variabelen uit meer letters (en ook cijfers) bestaan. Maximaal zijn 40 tekens toegestaan, maar je moet altijd met een letter beginnen. Juist zijn dus: Hallo, Winst, Getal1, Getal2, Cijfer, x, Oeroeboeroe. Bij het toekennen van een waarde MOET de variabele VOOR de = staan. De volgende toekenningen zijn juist in BASIC: Breuk = 4 / 8 Breuk krijgt de waarde 0.5 X = SIN(2*a) De sinus van 2a wordt berekend tel = tel + 1 tel wordt 1 groter zero = 0 zero krijgt de waarde 0 De volgende toekenningen zijn onjuist in BASIC: A + B = 23 X > 2 SIN(x) = 0.345 Hieronder staan programma om te oefenen. Begin iedere keer met New Program. Typ het programma in en voer het uit met <Shift><F5>. 4.1 Getalvariabelen en berekeningen (1)4.1 Getalvariabelen en berekeningen (1)4.1 Getalvariabelen en berekeningen (1)4.1 Getalvariabelen en berekeningen (1) CLS 'scherm schoonmaken A = 3: B = 4: C = 5.6: D = 7.2 'beginwaarden toekennen aan variabelen PRINT A * B * C 'product A*B*C op scherm tonen Product = A * B * C 'berekening uitvoeren PRINT Product 'resultaat (= 67.2) op scherm tonen PRINT "Product = "; Product 'idem met tekst erbij Gem = (A + B + C + D) / 4 'bereken gemiddelde LOCATE 20, 1 'ga naar regel 20, positie 1 COLOR 0, 7 'zwarte tekst op witte achtergrond PRINT "Gemiddelde: "; COLOR 7, 0 'witte tekst op zwarte achtergrond PRINT Gem 'op scherm: Gemiddelde: 4.95 LOCATE 15, 1 'ga naar regel 15, positie 1 PRINT SQR(D) 'wortel van 7.2 tonen (2.68328...) X = (A + B) * C / D 'bereken X PRINT X 'resultaat op scherm (5.44444...) END

Page 11: Cursus programmeren in QuickBasic 4.5

9

4.2 Getalvariabelen en berekeningen (2)4.2 Getalvariabelen en berekeningen (2)4.2 Getalvariabelen en berekeningen (2)4.2 Getalvariabelen en berekeningen (2) CLS X = 2 / (SQR(5) - 1) 'bereken X PRINT 1 / X, X, X ^ 2 'alles op regel; X^2 = X*X X = X + 1 'X wordt 1 groter PRINT X Y = ABS (-4.34) 'absolute waarde: Y = + 4.34 Z = SIN(1 / X) ^ Y 'SIN = sinus PRINT Z END ALLEEN NATUURLIJKE GETALLEN GRAAG. De computer kan zeer snel rekenen, maar kan dit extra snel als er alleen gehele getallen worden gebruikt. Ze nemen namelijk minder geheugenruimte in beslag. Deze getallen worden INTEGERS genoemd. Je kunt van ieder getal een integer maken door % aan het eind van de variabele te plaatsen. De waarde van een integer ligt tussen -32768 en +32768. Voorbeeld: A% = 3.9 → A% krijgt de waarde 4

B% = SQR(5) → √5 = 2.236.. , maar B% krijgt de waarde 2 Vaak is het lastig als je iedere keer % moet toevoegen. Je kunt ook aan het begin van je programma aangeven welke variabelen integer moeten zijn met DEFINT (DEFine INTeger). Voorbeeld: DEFINT A-M. Alle variabelen die met de letters A t/m M beginnen zijn nu automatisch een integer. Dus Eerste is een integer en Tweede niet. Er bestaan ook LONG INTEGERS. Die definieer je met DEFLNG en hebben een bereik van –(231) tot 231. WE RONDEN DE BOEL AF. Er zijn ook commando's om getallen af te ronden tot integers. Hiermee wordt geoefend in de onderstaande programma's. 4.3 Het gebruik van integers en het afronden van getallen4.3 Het gebruik van integers en het afronden van getallen4.3 Het gebruik van integers en het afronden van getallen4.3 Het gebruik van integers en het afronden van getallen CLS DEFINT A-Z 'ALLE variabelen zijn nu integers G1 = 2.345: G2 = 4.556: P = G1 * G2 PRINT "G1 = "; G1, "G2 = "; G2, "G1 * G2 = "; P PRINT PRINT INT(5.9) 'INT rondt af tot een kleiner integer PRINT INT(-5.9) PRINT FIX(5.9) 'FIX laat de decimalen weg PRINT FIX(-5.9) PRINT CINT(5.49) 'CINT rondt af tot een geheel getal PRINT CINT(5.50) END 4.4 Het bepalen van het decimale gedeelte van een getal4.4 Het bepalen van het decimale gedeelte van een getal4.4 Het bepalen van het decimale gedeelte van een getal4.4 Het bepalen van het decimale gedeelte van een getal CLS X = 4 * ATN (1) 'manier om pi te berekenen (3.14159265359); ATN = arctan Y = INT(X) 'Y heeft nu de waarde 3 Z = X - Y 'Z heeft nu de waarde pi - 3 (= 0.14159...) PRINT X, Y, Z 'alles op het scherm zetten END

Page 12: Cursus programmeren in QuickBasic 4.5

10

4.5 De integerdeling en he4.5 De integerdeling en he4.5 De integerdeling en he4.5 De integerdeling en het bepalen van de rest na een integerdelingt bepalen van de rest na een integerdelingt bepalen van de rest na een integerdelingt bepalen van de rest na een integerdeling CLS PRINT "25.68/6.99 = "; 25.68 / 6.99 'uitkomst: 3.6738 PRINT "25.68\6.99 = "; 25.68 \ 6.99 'uitkomst: 3 Rest = 25.68 MOD 6.99 'er wordt berekend: 26\7 = 3 PRINT Rest 'met als rest 5 (3*7=21 + 5 = 26) END 'of ook: 26/7 = 3 rest 5 WAT EEN TOEVAL! Het is mogelijk een variabele een willekeurige waarde (tussen 0 en 1) te geven met het commando RND (RaNDom). De computer bezit als het ware een voorraad willekeurige getallen (toevalsgetallen). Je kunt deze voorraad door elkaar schudden met RANDOMIZE TIMER zodat de PC iedere keer begint met een ander toevalsgetal. RND is vooral handig in spelletjes. Als je een dobbelsteen wilt nabootsen op de PC gaat dit als volgt; 4.6 Gooien met een dobbelsteen nabootsen4.6 Gooien met een dobbelsteen nabootsen4.6 Gooien met een dobbelsteen nabootsen4.6 Gooien met een dobbelsteen nabootsen CLS RANDOMIZE TIMER FOR i = 1 TO 480 'herhaal de lus 480 keer (hele scherm vol) A = INT(RND * 6) + 1 'A is minimaal 1 en maximaal 6 PRINT A; " "; 'waarden gescheiden door een spatie NEXT i 'i wordt 1 groter en terug naar FOR END Toelichting bij programma 4.6 In dit programma komt een lus voor die begint met FOR en eindigt met NEXT. Deze lus wordt besproken in hoofdstuk 12. In het kort komt het hier op neer dat alle opdrachten die tussen FOR en NEXT staan herhaald worden uitgevoerd. In dit voorbeeld zelfs 480 keer! Opdracht bij programma 4.6 • Verander de printopdracht in: PRINT USING "##"; A; • Start opnieuw. Zie je dat het scherm op een andere manier wordt vol-

geschreven? • Snap je wat de toevoeging USING en "##" voor effect heeft? Zo niet,

verander dan "##" in "#" of in "###" of zelfs in "####" en start opnieuw. Let goed op hoe het scherm met getallen gevuld wordt.

De opdracht PRINT USING wordt later uitgebreider toegelicht.

Page 13: Cursus programmeren in QuickBasic 4.5

11

HHHHOOOOOOOOFDSTFDSTFDSTFDSTUUUUK 5K 5K 5K 5 VARIABELEN (2): STRINGVARIABELENVARIABELEN (2): STRINGVARIABELENVARIABELEN (2): STRINGVARIABELENVARIABELEN (2): STRINGVARIABELEN STRINGVARIABELEN Het gaat hier om letters of tekst. Iedere stringvariabele eindigt met $ (van string). Voorbeeld: Hallo$ = "Goede morgen!": PRINT Hallo$ (spreek uit: hallo-string). Dit voorbeeld heeft als resultaat dat op het scherm komt te staan: Goede morgen! Bij de toekenning moeten "" gebruikt worden. Dus A$ = B of A$ = 23 is niet toegestaan. Je kunt twee (of meer) stringvariabelen (kortweg: strings) bij elkaar optellen en daarmee een nieuwe stringvariabele maken: A$ = "Goede": B$ = " morgen": C$ = A$ + B$. Wat is C$ dus? Hieronder volgt een oefening waarin je straks wat verbeteringen moet aan-brengen. 5.1 Oefenen met stringvariabelen5.1 Oefenen met stringvariabelen5.1 Oefenen met stringvariabelen5.1 Oefenen met stringvariabelen CLS Voornaam$ = "Lodewijk Friso Mathijs Krelis" Achternaam$ = "van Appelflap tot Roomsoes" Naam$ = Voornaam$ + Achternaam$ PRINT Naam$ PRINT Eind$ = "Eindcijfer" Eind = (5 + 7 + 8 + 9) / 4 PRINT Eind$; Eind END Opdrachten bij programma 5.1 • Je ziet dat "Krelis" en "van" aan elkaar worden geschreven. Hoe kun je dit

verhelpen ZONDER Voornaam$ en/of Achternaam$ te veranderen? • Hoe moet je het tweede gedeelte van het programma wijzigen zodat er op het

scherm komt te staan: Eindcijfer = 7.25 (je mag Eind$ NIET veranderen)? ASCII-KARAKTERS, WAT ZIJN DAT PRECIES? Totaal zijn er 256 karakters die variëren van gewone letters via bijzondere letters (zoals ü, ö, ê, δ, Σ) tot speciale tekens (zoals ╔, │, ▒, ╬). Ieder karakter heeft een bepaalde waarde: de ASCII-waarde (= American Standard Code for Information Interchange). Een overzicht van alle ASCII-karakters met hun waarden kun je opvragen met <Shift><F1>, <Enter> en kies dan voor ASCII Character Codes. Je kunt één zo'n karakter in een programma op het scherm laten zetten met PRINT CHR$(…). Op de stippeltjes vul je een getal tussen 0 en 255 in. LET OP: Niet ieder karakter kan getoond worden. Sommige karakters hebben namelijk een speciale functie zoals een geluidssignaal, een carriage return en dergelijke. Met een truc kun je de bijbehorende tekens wèl op het scherm krijgen, maar dat is voor gevorderden. Ook in je programmatekst kun je bijzondere letters of tekens gebruiken. Typ hiervoor in <Alt> gevolgd door ASCII-waarde (invoeren met numerieke toetsen-bord). Probeer maar eens <Alt>130 (é), <Alt>137 (ë), <Alt>253 (²), etc. Soms heb je van een bepaald karakter de bijbehorende ASCII-waarde nodig. Hiervoor gebruik je het commando ASC(…). Zie programma 5.2.

Page 14: Cursus programmeren in QuickBasic 4.5

12

5.2 Oefenen met CHR$( ) en ASC()5.2 Oefenen met CHR$( ) en ASC()5.2 Oefenen met CHR$( ) en ASC()5.2 Oefenen met CHR$( ) en ASC() CLS PRINT CHR$(65); CHR$(66); CHR$(67) PRINT CHR$(0); CHR$(255) PRINT CHR$(7); CHR$(13) PRINT TAB(20); CHR$(201); CHR$(205); CHR$(187) PRINT TAB(20); CHR$(186); CHR$(254); CHR$(186) PRINT TAB(20); CHR$(200); CHR$(205); CHR$(188) PRINT : PRINT GrA = ASC("A"): KlA = ASC("a") PRINT GrA, KlA X = ASC("APPEL"): Y = ASC("anders") PRINT X, Y PRINT ASC(CHR$(100)), ASC(CHR$(50)) PRINT CHR$(ASC(CHR$(100)) + ASC(CHR$(50))), CHR$(150) END Toelichting bij programma 5.2 Na het starten hoorde je een geluidssignaal. Dit kwam door het printen van CHR$(7). Zoals hierboven al verteld werd, kun je niet alle karakters op het scherm krijgen. CHR$(7) is daar één van. Hetzelfde geldt hier voor de waarde 13. Na PRINT CHR$(13) krijg je een carriage return (de cursor springt naar de volgende regel zonder iets te printen). Opdrachten bij programma 5.2 • Zoek uit wat er aan het eind van het programma gebeurt. • Wijzig een paar van de ASCII-waarden en start opnieuw. Resultaat? KUN JE GETALLEN EN STRINGS COMBINEREN? Dat kan. Soms is het handig om getallen om te zetten in strings. Bijvoorbeeld wanneer je de lengte van een bepaald getal wilt weten. Dit omzetten kan met STR$(). Stel X = 12345 dan heeft X$ = STR$(X) tot gevolg dat X$ = "12345". Je kunt nu stringopdrachten uitvoeren met X$ (zie volgende bladzijde). Het omzetten van een string naar een getal gebeurt met VAL(): X = VAL(X$). X heeft nu de waarde 12345. Overigens is de lengte van een string maximaal 255 karakters. De lengte kan bepaald worden met LEN(). Voorbeeld: X = LEN(X$). Nu heeft X de waarde 5 want "12345" is een string van 5 karakters. 5.3 Oefenen met STR$(), VAL() en LEN()5.3 Oefenen met STR$(), VAL() en LEN()5.3 Oefenen met STR$(), VAL() en LEN()5.3 Oefenen met STR$(), VAL() en LEN() CLS A$ = "123": B$ = "456" PRINT A$, B$, A$ + B$, B$ + A$ PRINT LEN(A$) + LEN(B$), LEN(A$ + B$) PRINT VAL(A$), VAL(B$) PRINT VAL(A$ + B$), VAL(A$) + VAL(B$) PRINT VAL(B$ + A$), VAL(B$) + VAL(A$) PRINT 3 * VAL(A$), VAL(B$) MOD 5 C$ = STR$(VAL(A$ + B$)) PRINT C$ D$ = STR$(9034) PRINT D$ PRINT VAL(CHR$(67)), VAL(CHR$(65) + "A") PRINT VAL(" -3"), VAL("HALLO") END

Page 15: Cursus programmeren in QuickBasic 4.5

13

Opdracht bij programma 5.3 • Loop het programma stap voor stap na en kijk goed op het scherm wat het

resultaat is. Kun je alles verklaren? WAT KUN JE NOG MEER DOEN MET STRINGS? Er zijn behoorlijk veel stringopdrachten. Hieronder worden de belangrijkste genoemd met hun betekenis en een voorbeeld. Zorg dat je ze kent. Straks volgen oefeningen. LCASE$() Maakt kleine letters. LCASE$("HALLO") →→→→ "hallo UCASE$() Maakt hoofdletters. LCASE$("Hallo") →→→→ "HALLO" LTRIM$() Verwijdert spaties links. LTRIM$(" hoi") →→→→ "hoi" RTRIM$() Verwijdert spaties rechts. RTRIM$("hoi ") →→→→ "hoi" SPACE$() Geeft string met spaties. SPACE$(5) →→→→ " " STRING$() Geeft string van bepaalde

lengte met karakter. of STRING$(4, "G") STRING$(4, 71)

→→→→ →→→→

"GGGG" "GGGG"

LEFT$() Geeft linker gedeelte van string met bepaalde lengte

LEFT$("Hallo", 3) →→→→ "Hal"

RIGHT$() Geeft rechter gedeelte van string met bepaalde lengte.

RIGHT$("Hallo", 3) →→→→ "llo"

MID$() Geef midden gedeelte van string met bepaalde lengte vanaf een bepaald beginpunt.

MID$("Hallo", 2, 3) →→→→ "all"

INSTR() Zoekt een string in een andere string vanaf bepaald beginpunt.

INSTR(i,"bestand.ext",".") = 8

Toelichting bij STRING$(): Uit het voorbeeld blijkt dat je in plaats van het karakter ook de ASCII-waarde mag geven (71 is de ASCII-waarde voor G).Dit is vooral handig als je met STRING$() karakters wilt weergeven die niet op het toetsenbord staan (o.a. alle karakters van waarden boven 126). Toelichting bij INSTR(): Er wordt gezocht in "bestand.ext" vanaf de eerste positie (mag je weglaten). De punt wordt op de 8e positie gevonden. Er wordt altijd van links naar rechts gezocht. Als in de opdracht X = INSTR(zin$, ".") géén punt gevonden kan worden in zin$, krijgt X de waarde 0. 5.4 Oefenen met stringopdrachten5.4 Oefenen met stringopdrachten5.4 Oefenen met stringopdrachten5.4 Oefenen met stringopdrachten CLS A$ = " ABCDEFGHIJKLMNOPQRSTUVWXYZ " B$ = " zyxwvutsrqponmlkjihgfedcba " PRINT LEN(A$), LEN(B$) PRINT LCASE$(A$), UCASE$(B$) C$ = LTRIM$(RTRIM$(A$)) + RTRIM$(LTRIM$(B$)) PRINT LEN(C$); " "; C$; " "; MID$(C$, 20, 10) X = INSTR(C$, "f") PRINT "f gevonden op plaats"; X; "in C$." Y = INSTR(C$, "KLM") PRINT "KLM gevonden op plaats"; Y; "in C$." PRINT PRINT STRING$(5, 127) END

Page 16: Cursus programmeren in QuickBasic 4.5

14

HOOFDSTUK 6HOOFDSTUK 6HOOFDSTUK 6HOOFDSTUK 6 VARIABELEN (3): ARRAYVARIABELENVARIABELEN (3): ARRAYVARIABELENVARIABELEN (3): ARRAYVARIABELENVARIABELEN (3): ARRAYVARIABELEN ARRAYVARIABELEN Vaak is het handig als je een variabelenaam kunt gebruiken voor meerdere variabelen. Als je in een programma bijvoorbeeld tien proefwerkcijfers nodig hebt is, het onhandig als je namen moet gebruiken als EersteCijfer, TweedeCijfer, DerdeCijfer etc. (of zelfs C1, C2, C3). Een oplossing hiervoor biedt de array (= reeks). Hierbij krijgt iedere variabele met dezelfde naam een bepaald nummer (we spreken dan van element). Dit nummer (of index) staat tussen haakjes. Bijvoorbeeld: C(1), C(2), C(3) zijn drie elementen van de array C. Het voordeel ten opzichte van C1, C2, C3 etc. is, dat je de elementen ook met andere variabelen kunt aanduiden. Hierover een oefening. 6.1. Oefenen met array's (1)6.1. Oefenen met array's (1)6.1. Oefenen met array's (1)6.1. Oefenen met array's (1) CLS C(1) = 4.5: C(2) = 6.7: C(3) = 5.9: C(4) = 6.0: C(5) = 7.8 Som = C(1) + C(2) + C(3) + C(4) + C(5) Gem = Som / 5 PRINT "Gemiddelde:"; Gem I = 2 PRINT C(I) J = 2 * I - 1 PRINT "Inhoud"; J; "e element:"; C(J) END Opmerkingen bij programma 6.1 Vooral bij het werken met lussen (zie hoofdstuk 12) zijn array’s erg handig. Het laagste element is C(0). Hier geldt: C(0) = 0. EFFE DIMME Voor de array’s moet de PC geheugenruimte reserveren. Je moet daarom van te voren aangeven hoeveel elementen je nodig denkt te hebben. Dit heet dimensioneren en gebeurt met het commando DIM. Hiermee kun je alle array’s dimensioneren. Een array bevat of getallen of strings, maar nooit beide tegelijk. Een stringarray geef je aan met de toevoeging $. De array Tekst$() is dus een stringarray. 6.2. Oefenen met array's (2)6.2. Oefenen met array's (2)6.2. Oefenen met array's (2)6.2. Oefenen met array's (2) LET OP: er zullen foutmeldingen optreden bij het starten. Probeer te begrijpen waarom de foutmelding optreedt. Vraag het programma desnoods om hulp. Verwijder de verkeerde regel of plaats er een ' voor (dan wordt het een REMark) en start opnieuw. CLS DIM Naam$(3), Leeftijd(3) Naam$(0) = "Jan": Naam$(1) = "Carla" Naam$(2) = "Peter": Naam$(3) = "Anna" Leeftijd(0) = 14: Leeftijd(1) = 16 Leeftijd(2) = 17: Leeftijd(3) = 15 FOR I = 0 TO 3 PRINT Naam$(I); " is"; Leeftijd(I); "jaar oud." NEXT I PRINT Naam$(-1) PRINT Leeftijd(4) END

Page 17: Cursus programmeren in QuickBasic 4.5

15

Opmerkingen bij programma 6.2 In dit programma komt een lus voor, net als in programma 4.6. Geen nood als je niet begrijpt wat er precies gebeurt. In hoofdstuk 12 en 13 komen de lussen aan de orde. Bij het dimensioneren moet je van te voren een beetje inschatten hoeveel elementen je nodig hebt. Hoewel niet fout, is het toch wat overdreven om bijvoorbeeld 10000 elementen te reserveren als je er maar 10 gebruikt. IS DAT ALLES WAT JE MET ARRAY’S KUNT DOEN? Nee! Er is nog veel meer mogelijk. Een paar voorbeelden (hierbij horen geen programma’s): 1. De indices hoeven niet te lopen van 0 tot ... Als je in een array de

jaarsalarissen over de jaren 2007 t/m 2013 wilt opslaan, kun je deze als volgt dimensioneren: DIM JrSal(7 TO 13). De elementen komen nu handig overeen met de jaartallen. Sterker nog: je kunt zelfs negatieve getallen gebruiken, maar het moeten wel allemaal gehele getallen zijn!

2. Als je liever als laagste element de index 1 gebruikt (in plaats van 0) kun je dit aangeven met de opdracht OPTION BASE 1.

3. Een array kan ook meerdere dimensies hebben (maximaal 63). In een twee dimensionale array zou je bijvoorbeeld ook de maandsalarissen kunnen opslaan: DIM Salaris(7 TO 13, 1 TO 12). Het maandsalaris van april 2010 staat dan in element Salaris(10, 4).

Page 18: Cursus programmeren in QuickBasic 4.5

16

HOOFDSTUK 7HOOFDSTUK 7HOOFDSTUK 7HOOFDSTUK 7 GEGEVENS INVOEREN (1)GEGEVENS INVOEREN (1)GEGEVENS INVOEREN (1)GEGEVENS INVOEREN (1) WAT MAG HET ZIJN? In alle bovenstaande programma’s werden de waarden van variabelen in het programma vastgelegd. In de praktijk zal het vaak voorkomen dat er gegevens ingevoerd moeten worden. Meestal vanaf het toetsenbord, maar er kunnen ook gegevens van een schijf gelezen worden. Het gaat hier om de invoer vanaf het toetsenbord. Typ het onderstaande programma in en voer dan de opdrachten uit. 7.1 Oefenen met invoeren vanaf het toetsenbord (1)7.1 Oefenen met invoeren vanaf het toetsenbord (1)7.1 Oefenen met invoeren vanaf het toetsenbord (1)7.1 Oefenen met invoeren vanaf het toetsenbord (1) CLS INPUT A PRINT "Je hebt"; A; "ingevoerd." INPUT "Voer een getal in: "; Getal INPUT "Getal = ", Getal INPUT "Voer een korte zin in: ", Zin$ PRINT "Heb je ingevoerd: '"; Zin$; "'?" LINE INPUT "Voer de zin nogmaals in: ", Zin$ PRINT "Klopt het nu wel: "; Zin$ END Opdrachten bij programma 7.1 • Start het programma met <Shift>F5. • Voer een letter of een woord in (en druk op <Enter>). • Dit mocht dus kennelijk niet. Voer nu een getal in. • Voer een getal in en, na <Enter>, daarna weer één. Let op de aan- en

afwezigheid van het vraagteken en onderzoek hoe dit in het programma verwerkt is.

• Bij: "Voer een korte zin in:" moet je iets invoeren met leestekens, bijvoorbeeld: hallo, ik ben ....

• Je mag dus bij INPUT geen leestekens gebruiken. Voer nu de zin in zonder leestekens.

• Als gevraagd wordt nogmaals de zin in te voeren, kun je wel leestekens gebruiken. Kijk in het programna waarom het nu wel kan.

Typ het onderstaande programma in en probeer de gegevens in te voeren zonder dat er "Redo from Start" verschijnt. 7.2. Oefenen met invoeren vanaf het toetsenbord (2)7.2. Oefenen met invoeren vanaf het toetsenbord (2)7.2. Oefenen met invoeren vanaf het toetsenbord (2)7.2. Oefenen met invoeren vanaf het toetsenbord (2) CLS INPUT A, B, C 'geef bij voorkeur aan wat INPUT A$, B$, C$ 'er ingevoerd moet worden LOCATE 12, 20 'nu moet je raden: getal, woord? INPUT " "; Naam$, Leeftijd 'of beide? en hoe vaak? LOCATE 5, 1 'kortom: wees duidelijk PRINT "Voer de code 1993 in: "; X$ = INPUT$(4) PRINT "Je hebt "; X$; " ingevoerd." END Vraag: wat is het verschil tussen INPUT, LINE INPUT en INPUT$()?

Page 19: Cursus programmeren in QuickBasic 4.5

17

HOODSTUK 8HOODSTUK 8HOODSTUK 8HOODSTUK 8 ZELF PROGRAMMAZELF PROGRAMMAZELF PROGRAMMAZELF PROGRAMMA’S’S’S’S MAKEN (1)MAKEN (1)MAKEN (1)MAKEN (1) Hieronder staan wat opdrachten, waarbij je alles wat je in de voorgaande hoofdstukken hebt geleerd kunt toepassen. Het is de bedoeling dat je korte programma's maakt. Gebruik, als je problemen krijgt, zoveel mogelijk de Helpfunctie van QuickBASIC. Als je de programma's wilt bewaren, kies je uit het File-menu de optie Save. Je geeft het programma een naam van maximaal 8 letters en dan wordt het naar de schijf geschreven. 1 Maak een programma dat de volgende berekeningen uitvoert en de uitkomsten

op het scherm toont: a. 2 x 4 + 6 b. 5 + 8 : 2 c. 20 : 5 x (2 + 7) De volledige berekening moet op het scherm komen. Dus bij a. moet op het scherm komen: 2 x 4 + 6 = 14.

2 Voeg in het programma van opdracht 1 na a de berekening 16 + 24 : 4 toe. 3 Maak een programma dat op het scherm het volgende resultaat geeft:

De uitkomst van 2 - 12 is: -10 De uitkomst van 1/4 is: .25

4 Maak een programma dat om 5 getallen vraagt; ze onder elkaar afdrukt en

daar onder het gemiddelde vermeldt. 5 Maak een programma dat om 2 getallen vraagt (x en y) en vervolgens op

het scherm de antwoorden van de volgende berekeningen toont: x + y; x - y; x * y en x / y. Toon de gehele berekening op het scherm. Wat gebeurt er als je voor y de waarde 0 invoert?

6 Maak een programma dat vraagt naar je naam, adres, woonplaats etc. en

dit vervolgens op fraaie wijze op het scherm tovert (gebruik o.a. LOCATE). 7 Maak een programma waarbij 5 woorden moeten worden ingevoerd. Daarna

moeten die woorden, met ernaast de bijbehorende lengtes (LEN$), op het scherm worden afgedrukt.

8 Maak een programma dat om 5 getallen tussen 32 en 254 vraagt en vervolgens

de getallen met het bijbehorende ASCII-karakters toont. Bijv. 65 → A. Laat het programma daarna om 5 karakters vragen en toon ze met de waarden op het scherm. Bijvoorbeeld $ → 36.

9 Maak een programma waarbij je een zin invoert (gebruik LINE INPUT), waarin

"huis" voorkomt (dus huiswerk is ook goed). Vind de plaats waar "huis" begint in de zin (met INSTR). Toon de zin op het scherm waarbij je "huis" laat weergeven in zwarte letters op een witte achtergrond (gebruik o.a. LOCATE en COLOR).

10 Maak een programma dat willekeurig een ASCII-waarde boven 32 berekent

en dit als een string met een lengte van 400 op het scherm toont (gebruik onder andere STRING$ en RND).

Page 20: Cursus programmeren in QuickBasic 4.5

18

HOOFDSTUKHOOFDSTUKHOOFDSTUKHOOFDSTUK 9999 BESLISSINGSSTRUCTUREN (1): IF...THEN...ELSEBESLISSINGSSTRUCTUREN (1): IF...THEN...ELSEBESLISSINGSSTRUCTUREN (1): IF...THEN...ELSEBESLISSINGSSTRUCTUREN (1): IF...THEN...ELSE NEEM EENS EEN BESLUITJE Een bekend spelletje is dat iemand een getal moet raden en als aanwijzing alleen maar krijgt dat zijn gekozen getal te hoog of te laag is. Als een computer die aanwijzingen moet geven, dan moet de PC de volgende opdracht kunnen uitvoeren (te raden getal is X): "als getal kleiner is dan X, moet ik vermelden 'te laag'; als getal groter is dan X, moet ik vermelden 'te hoog'; als getal juist is, moet ik vermelden 'geraden'". De PC moet dus een beslissing nemen. Dit kan met de commandostructuur IF...THEN...ELSE. De begrippen 'groter dan', 'kleiner dan' etc. komen uit de wiskunde. Hier volgt een overzicht van wat de PC kent:

kleiner dan: < groter dan: > kleiner of gelijk: <= groter of gelijk: >= gelijk aan: = ongelijk aan: <>

Voorbeeld Stel in een programma komen de volgende regels voor: INPUT "Getal: ", G IF G > 100 THEN PRINT "G > 100" PRINT "Einde programma" Eerst moet je een getal G invoeren. In de volgende regel controleert de PC of dit getal groter is dan 100. Zo ja, dan wordt geprint "G > 100", zo niet dan wordt direct naar de volgende regel gesprongen. Kortom: alle opdrachten na THEN worden alleen uitgevoerd als aan de voorwaarde voldaan is. Anders gezegd: als de ongelijkheid juist is. 9.1 Eenvoudig gebruik van IF...THEN...ELSE; kop of munt nabootsen9.1 Eenvoudig gebruik van IF...THEN...ELSE; kop of munt nabootsen9.1 Eenvoudig gebruik van IF...THEN...ELSE; kop of munt nabootsen9.1 Eenvoudig gebruik van IF...THEN...ELSE; kop of munt nabootsen CLS RANDOMIZE TIMER 'zie hoofdstuk 4 X = RND 'X is willekeurig getal tussen 0 en 1 IF X <= .5 THEN PRINT "kop" 'kop en munt nabootsen met willekeurige IF X > .5 THEN PRINT "munt" 'getallen REM Andere manier: Y = RND 'Y is willekeurig getal tussen 0 en 1 IF Y <= .5 THEN PRINT "kop" ELSE PRINT "munt" REM Nog een andere manier (met een 'blok'): Z = RND 'Z is willekeurig getal tussen 0 en 1 IF Z <= .5 THEN 'een 'blok' gebruiken is de meest PRINT "kop" 'overzichtelijke manier (zie verder) ELSE PRINT "munt" END IF 'een 'blok' ALTIJD eindigen met END IF END Opmerking bij programma 9.1 Je ziet dat het gebroken getal 0,5 wordt aangegeven met .5. Natuurlijk mag 0.5 ook, maar je mag dus GEEN komma gebruiken. In een blok kun je ook meerdere commando’s plaatsen. Het inspringen is niet noodzakelijk, maar maakt het geheel wat overzichtelijker. Het is toegestaan om ELSE weg te laten (zie eerste gedeelte) als dit voor de beslissing niet nodig is.

Page 21: Cursus programmeren in QuickBasic 4.5

19

9.2 Nogmaals IF...THEN...ELSE; het getalprogramma (e9.2 Nogmaals IF...THEN...ELSE; het getalprogramma (e9.2 Nogmaals IF...THEN...ELSE; het getalprogramma (e9.2 Nogmaals IF...THEN...ELSE; het getalprogramma (eenvoudige versie).envoudige versie).envoudige versie).envoudige versie). Opmerking: in dit programma wordt de lus DO...LOOP gebruikt. Deze lus wordt nader toegelicht in hoofdstuk 13. CLS PRINT "Raad een geheel getal tussen 1 en 1000. "; PRINT "Stoppen door 0 in te voeren." PRINT RANDOMIZE TIMER Getal = INT(RND * 1000) + 1 'willekeurig geheel getal tussen 1 en 1000 DO 'begin van de lus DO...LOOP INPUT "Invoer: ", X 'getal invoeren IF X = 0 THEN END 'stoppen als 0 is ingevoerd IF X = Getal THEN 'begin IF...THEN-blok; getal geraden SOUND 1200, 5 'overwinningsgeluid LOCATE CSRLIN - 1, 15 'CSRLIN = laatst gebruikte regel PRINT "GERADEN!" 'printen achter juiste getal END 'einde programma END IF 'einde IF...THEN-blok REM Als X <> Getal, wordt bovenstaand blok overgeslagen! LOCATE CSRLIN - 1, 15 IF X < Getal THEN PRINT "TE LAAG!" 'wordt nu op zelfde regel getoond als ELSE 'ingevoerde getal door CSRLIN - 1 PRINT "TE HOOG!" END IF LOOP 'terug naar DO Opmerking bij programma 9.2 In dit programma wordt TE LAAG! en TE HOOG! op dezelfde regel geprint als het ingevoerde getal. Na invoer verspringt de cursor vanzelf naar de volgende regel. De positie van de cursor wordt automatisch opgeslagen in CSRLIN (CuRSorLINe → de regel waarop de cursor staat; regelnummer) en in POS(0) (POSition → de kolom waarin de cursor staat; kolomnummer). Dit gegeven wordt hier gebruikt om de tekst één regel hoger te printen, namelijk op regel CSRLIN � 1. IS JOOP GROTER DAN PETER EN JOLANDA? Je kunt niet alleen getallen, maar ook strings met elkaar vergelijken. In feite worden dan de ASCII-waarden (zie Hoofdstuk 5) van de karakters met elkaar vergeleken. Stel dat A$ = "Joop" en B$ = "Annet", dan geldt A$ > B$, want de ASCII-waarde van "J" (74) is groter dan de ASCII-waarde van "A" (65). Maar ook als A$ = "Joop" en B$ = "Jolanda" geldt A$ > B$, want het verschil tussen beide strings treedt nu op bij de derde letter en "o" > "l". Hieronder een programma waarin strings met elkaar worden vergeleken. Het gaat hierbij slechts om één karakter, dat direct vanaf het toetsenbord wordt ingelezen (dus zonder <Enter>). In hoofdstuk 7 heb je geleerd dat dit kan met behulp van INPUT$().

Page 22: Cursus programmeren in QuickBasic 4.5

20

9.39.39.39.3. Het gebruik van strings in IF...THEN...ELSE. Het gebruik van strings in IF...THEN...ELSE. Het gebruik van strings in IF...THEN...ELSE. Het gebruik van strings in IF...THEN...ELSE CLS PRINT "Voer het karakter @ in. "; kar$ = INPUT$(1) IF kar$ <> "@" THEN PRINT "Je hebt GEEN @ ingevoerd!" ELSE PRINT "Goed zo!" END IF PRINT : SLEEP 2 PRINT "Vind je dit een leuke cursus? (J/N of j/n) " kar$ = UCASE$(INPUT$(1)) IF kar$ = "J" THEN PRINT "Wat aardig van je." IF kar$ = "N" THEN PRINT "Wat jammer nou." IF kar$ <> "J" AND kar$ <> "N" THEN PRINT "Verkeerde invoer!" END Opmerkingen bij programma 9.3 Het gebruik van INPUT$() heeft een nadeel. Als je in plaats van @ op <Esc> had moeten drukken, dan had INPUT$() deze invoer niet geaccepteerd. Toch komt het drukken op <Esc> (of op <Enter>) vaak voor. Bijvoorbeeld om een programma te beëindigen. Het probleem kan worden verholpen met het commando INKEY$. Dit komt ter sprake in hoofdstuk 11. Onthoud vooral de truc om de invoer van zowel kleine letters als hoofdletters te accepteren (gebruik van UCASE$). In het tweede gedeelte moet de PC drie dingen nagaan: 1. J ingevoerd?, 2. N ingevoerd? of 3. Geen van beide ingevoerd? Hiervoor wordt drie keer IF...THEN gebruikt. Stel dat je de letters A t/m Z kunt invoeren en iedere invoer heeft een bepaalde betekenis, dan zou je dus 26 keer IF...THEN moeten gebruiken. Dit is bijzonder omslachtig. Om die reden is het commando SELECT CASE bedacht. In het volgende hoofdstuk zie je de voordelen van dit commando. Tenslotte zie je bij de laatste IF...THEN dat er AND is gebruikt. Aan beide voorwaarden moet worden voldaan. Je kunt ook OR gebruiken. Dan hoeft slechts aan één van de voorwaarden te worden voldaan. Over het gebruik van AND en OR volgt hieronder nog een programma. 9.4 Het gebruik van AND en OR in IF...THEN...ELSE9.4 Het gebruik van AND en OR in IF...THEN...ELSE9.4 Het gebruik van AND en OR in IF...THEN...ELSE9.4 Het gebruik van AND en OR in IF...THEN...ELSE CLS INPUT "Voer een getal in tussen 0 en 10: ", x IF x > 0 AND x < 10 THEN PRINT "Het getal was:"; x ELSE PRINT x; "ligt niet tussen 0 en 10!" END IF PRINT INPUT "Voer een x of een X in. ", x$ IF x$ = "x" OR x$ = "X" THEN PRINT "Goed zo!" ELSE PRINT "Dit is geen x of X!" END IF END

Page 23: Cursus programmeren in QuickBasic 4.5

21

HOOFDSTUK 10HOOFDSTUK 10HOOFDSTUK 10HOOFDSTUK 10 BESLISSINGSSTRUCTUREN (2): SELECT CASEBESLISSINGSSTRUCTUREN (2): SELECT CASEBESLISSINGSSTRUCTUREN (2): SELECT CASEBESLISSINGSSTRUCTUREN (2): SELECT CASE

KIES HET GEVAL MAAR UIT. SELECT CASE is bijzonder handig als je verschillende mogelijkheden moet nagaan. Met SELECT CASE kun je ze allemaal langslopen. Eerst een eenvoudig voorbeeld, uiteraard in de vorm van een programma. 10.1 Bepalen of een hoofdletter of een kleine letter is ingevoerd10.1 Bepalen of een hoofdletter of een kleine letter is ingevoerd10.1 Bepalen of een hoofdletter of een kleine letter is ingevoerd10.1 Bepalen of een hoofdletter of een kleine letter is ingevoerd CLS PRINT "Voer een letter in. " L$ = INPUT$(1) SELECT CASE L$ CASE "A" TO "Z" PRINT "Je hebt de hoofdletter "; L$; " ingevoerd!" CASE "a" TO "z" PRINT "Je hebt de kleine letter "; L$; " ingevoerd!" CASE ELSE PRINT "Je hebt iets verkeerds ingevoerd, namelijk: "; L$ END SELECT END Opmerkingen bij programma 10.1 Wat opvalt, is dat je met "A" TO "Z" een gebied kunt aangeven. Natuurlijk kan dit ook met getallen, bijvoorbeeld CASE 1 TO 10. Zeer handig is ook CASE ElSE. Hiermee heb je alle overige gevallen te pakken. In dit geval als je bijvoorbeeld een cijfer of een leesteken invoert. Denk er aan dat je altijd eindigt met END SELECT. Opdracht bij programma 10.1 Maak een programma dat hetzelfde kan als 10.1, maar nu moet je gebruik maken van IF...THEN...ELSE. Let dan vooral op het verschil tussen beide programma's. Bij spelletjes kun je vaak dingen bewegen met behulp van de cursortoetsen. Deze bijzondere toetsen (ook <Home>, <End> etc.) worden ook gebruiken in programma’s van deze cursus. Dit wordt nader toegelicht in hoofdstuk 11. Ook hier zal gebruik worden gemaakt van het commando SELECT CASE. Hieronder nog een voorbeeld, waarbij tevens het commando PRINT USING wordt uitgelegd (zie ook het eerste programma op bladzijde 3).

Page 24: Cursus programmeren in QuickBasic 4.5

22

10.2. Het gebruik van PRINT USING en nogmaals SELECT CASE10.2. Het gebruik van PRINT USING en nogmaals SELECT CASE10.2. Het gebruik van PRINT USING en nogmaals SELECT CASE10.2. Het gebruik van PRINT USING en nogmaals SELECT CASE CLS A = 3.14: B = 234.21: C = 94.37 INPUT "Op hoeveel decimalen weergeven (0 tot 2): ", dec SELECT CASE dec CASE 0 M$ = "A = ### B = ### C = ###" CASE 1 M$ = "A = ###.# B = ###.# C = ###.#" CASE 2 M$ = "A = ###.## B = ###.## C = ###.##" CASE ELSE PRINT "Je had 0, 1 of 2 moeten invoeren!" END END SELECT PRINT PRINT USING M$; A; B; C PRINT M$ = "\ \= ###.### \ \= ###.###" G1$ = "Getal 1": G2$ = "Getal 2" G1 = 34.5665: G2 = 231.22 PRINT USING M$; G1$; G1; G2$; G2 END Toelichting bij programma 10.2 Met PRINT USING kun je de lay out aanpassen. Met de ##-jes bepaal je hoeveel cijfers er weergegeven moeten worden. Erg handig bij tabellen. Het gebruik van een string (zoals M$) is natuurlijk niet verplicht. Ook goed is bijvoor-beeld: PRINT USING "A = ###.###"; A. Ook de lengte van de weer te geven tekst kan met PRINT USING worden vastgelegd. Hiervoor gebruik je \\-jes. Opdracht bij programma 10.2 • Verander in de SELECT CASE-opdracht het aantal ##�jes en bekijk wat hiervan

het gevolg is als je opnieuw start. • Verwissel de variabelen in de laatste PRINT USING-opdracht en bekijk wat

hiervan het gevolg is. Treden er foutmeldingen op? Waarom?

Page 25: Cursus programmeren in QuickBasic 4.5

23

HOODSTUK 11HOODSTUK 11HOODSTUK 11HOODSTUK 11 HET GEBRUIK VAN HET TOETSENBORD IN PROGRAMMA'SHET GEBRUIK VAN HET TOETSENBORD IN PROGRAMMA'SHET GEBRUIK VAN HET TOETSENBORD IN PROGRAMMA'SHET GEBRUIK VAN HET TOETSENBORD IN PROGRAMMA'S EEN LEESSTUK. Het nu volgende stuk tekst is bedoeld als inleiding op het gebruik van bijzondere toetsen in programma's. Bijvoorbeeld de cursortoetsen om iets te laten bewegen. Je leert in dit hoofdstuk hoe je die toetsen kunt 'activeren'. WEL OF GEEN TEKST INVOEREN Je kunt via het toetsenbord zowel tekst intypen als opdrachten geven. Als je bijvoorbeeld het File-menu activeert, kun je de optie Save kiezen door op de s te drukken. Er komt dan GEEN s op het scherm te staan, maar er wordt een opdracht uitgevoerd. WAT GEBEURT ER PRECIES ALS JE EEN TOETS INDRUKT? Wanneer je een a intypt, verstuurt het toetsenbord twee speciale codes naar het brein van de computer (CPU genaamd; van Central Processing Unit). De eerste code geeft aan DAT er een toets is ingedrukt. De tweede is een zogeheten Scan Code waarmee aangegeven wordt WELKE toets er is ingedrukt. Voor een a (of A) is de Scan Code 30. Een Scan Code is voor een hoofdletter en een kleine letter hetzelfde. SCAN CODES EN ASCII-WAARDEN. De Scan Codes hebben helemaal niets te maken met de ASCII-waarden van een karakter. De Scan Code die wordt doorgegeven wordt omgezet in een ASCII-waarde. Hierbij maakt het uit of <Shift> wel of niet is ingedrukt. Ook dit wordt aan de CPU doorgegeven. Als <Shift> niet is ingedrukt zal Scan Code 30 worden omgezet in een ASCII-waarde van 97, behorend bij de letter a. Als <Shift> wel is ingedrukt wordt Scan Code 30 omgezet in een ASCII-waarde van 65, behorend bij de letter A. Wat er dan gebeurt, hangt helemaal van het programma af. Als het gaat om het intypen van tekst zal er een a (of A) op het scherm komen, maar er kan ook een bepaalde opdracht uitgevoerd worden. EEN TOETSINDRUK REGISTREREN Er zijn twee opdrachten om een enkele toetsindruk te registreren: INPUT$(1) en INKEY$. Het verschil tussen beide opdrachten wordt hieronder toegelicht, waarbij er van uit wordt gegaan dat het resultaat wordt opgeslagen in de string i$ (maar je mag die string ook een andere naam geven, bijvoorbeeld key$). i$ = INPUT$(1) Bij deze opdracht wordt er net zo lang gewacht totdat er één

karakter is ingevoerd, aangegeven met (1). INPU$(1) accepteert geen bijzondere toetsen. i$ = INKEY$ Als je toetsen indrukt, worden ze tijdelijk opgeslagen in een

buffer. INKEY$ leest het eerste karakter uit die buffer. INKEY$ wacht dus niet op een toetsindruk. Als je geen toets indrukt, wordt een string met lengte 0 ingelezen. Daarom wordt deze opdracht meestal in een lus gezet. Deze lus wordt net zo lang doorlopen totdat er op een toets is gedrukt. Een voorbeeld van zo’n lus is:

DO i$ = INKEY$

LOOP UNTIL LEN(i$) > 0 De lus DO...LOOP wordt in hoofdstuk 13 nader toegelicht. De lus wordt net zo lang doorlopen totdat (UNTIL) i$ een lengte groter dan 0 heeft. Er is dan namelijk een toets ingedrukt. Met INKEY$ kun je WEL bijzondere toetsen 'registreren'.

Page 26: Cursus programmeren in QuickBasic 4.5

24

WAT IS NOU HET VERSCHIL TUSSEN EEN GEWONE EN EEN BIJZONDERE TOETS? Dit ga je zelf uitzoeken met het onderstaande programma. 11.1 Het verschil tussen een gewone en een bijzondere toets bepalen11.1 Het verschil tussen een gewone en een bijzondere toets bepalen11.1 Het verschil tussen een gewone en een bijzondere toets bepalen11.1 Het verschil tussen een gewone en een bijzondere toets bepalen CLS PRINT "Druk steeds op een toets. Stop met <Esc>." PRINT "Toets: ASCII-waarde:" DO DO i$ = INKEY$ LOOP UNTIL LEN(i$) 'De toevoeging > 0 is niet nodig PRINT i$, ASC(i$) LOOP UNTIL i$ = CHR$(27) END Toelichting bij programma 11.1 Dit programma staat ook in hoofdstuk 13, ter illustratie van de lus DO...LOOP. Stop het programma door op <Esc> te drukken. Bij <Esc> hoort namelijk ASCII-waarde 27. Opdrachten bij programma 11.1 • Voer een aantal gewone toetsen in: a, r, Y, V (etc). • Voer nu bijzondere toetsen in: cursortoetsen, <Home>, <End> (etc). Er vallen twee dingen op: 1. Bij de bijzondere toetsen wordt toch een letter op het scherm gezet, maar

deze wordt vooraf gegaan door een spatie. 2. De ASCII-waarde voor alle bijzondere toetsen is 0. Verklaring: Een bijzondere toets heeft twee ASCII-waarden, waarvan de eerste altijd de waarde 0 heeft. Bij CHR$(0) hoort geen bepaald karakter en wordt daarom als een spatie op het scherm gezet. De tweede ASCII-waarde komt overeen met de Scan Code van de toets. Als je een bijzondere toets indrukt, heeft i$ dus een lengte van 2. Bij de opdracht ASC(i$) wordt alleen de ASCII-waarde van het eerste karakter van i$ getoond, en deze waarde is 0. Voorbeeld: de ASCII-waarden voor <Home> zijn 0 en 71. Bij een ASCII-waarde van 71 hoort het karakter "G". Programma 11.1 wordt nu aangepast, zodat beide ASCII-waarden van een bijzondere toets zichtbaar zijn. • Verander de PRINT�opdracht in: PRINT i$, ASC(i$), ASC(RIGHT$(i$, 1)) • Start het programma opnieuw. Snap je de verandering? DAN NU DE BIJZONDERE TOETSEN ECHT GEBRUIKEN! De bijzondere toetsen zijn alleen van elkaar te onderscheiden als gekeken wordt naar de tweede ASCII-waarde. Verwar dit niet met de ASCII�waarden van de gewone toetsen. Het drukken op <Home> en op "G" mag dus niet hetzelfde resultaat opleveren. Er zijn twee manieren om gebruik te maken van die tweede ASCII�waarde. Welke manier je kiest is een kwestie van smaak. Beide manieren worden hieronder toegelicht. Als voorbeeld wordt steeds een bijzondere toets uitgekozen, namelijk <Home>. Als op <Home> wordt gedrukt en dit wordt met INKEY$ opgeslagen in i$, dan is i$ gelijk aan CHR$(0) + CHR$(71), waarbij geldt dat CHR$(71) = "G".

Page 27: Cursus programmeren in QuickBasic 4.5

25

Manier 1. Strings voor bijzondere toetsen definiëren Eerst wordt string CN$ gedefinieerd voor CHR$(0): CN$ = CHR$(0). Vervolgens de string Home$: Home$ = CN$ + "G". Na de lus met i$ = INKEY$ kan met SELECT CASE bepaald worden of er op <Home> is gedrukt: SELECT CASE i$ CASE Home$ (Opdracht) 11.2 Bijzondere toetsen gebruiken (1): strings definiëren11.2 Bijzondere toetsen gebruiken (1): strings definiëren11.2 Bijzondere toetsen gebruiken (1): strings definiëren11.2 Bijzondere toetsen gebruiken (1): strings definiëren CLS PRINT "Druk op G, <Home> of een andere toets." CN$ = CHR$(0) Home$ = CN$ + "G" DO i$ = INKEY$ LOOP UNTIL LEN(i$) SELECT CASE i$ CASE Home$ PRINT "Je hebt op <Home> gedrukt." CASE "G" PRINT "Je hebt op G gedrukt." CASE ELSE PRINT "Je hebt op een andere toets gedrukt, namelijk "; IF LEN(i$) > 1 THEN PRINT "een speciale toets." ELSE PRINT i$; "." END SELECT END Manier 2. Maak de tweede ASCII-waarde van bijzondere toetsen negatief Nadat er op een toets is gedrukt wordt bepaald of de lengte van i$ wel of niet gelijk aan 1 is. Zo ja, dan is er op een gewone toets gedrukt en verandert er niets. Zo nee, dan is er op een bijzondere toets gedrukt en wordt de tweede ASCII-waarde negatief gemaakt. Vervolgens kan met SELECT CASE uitgezocht worden op welke toets er gedrukt is. 11.3. Bijzondere toetsen gebruiken (2): tweede ASCII11.3. Bijzondere toetsen gebruiken (2): tweede ASCII11.3. Bijzondere toetsen gebruiken (2): tweede ASCII11.3. Bijzondere toetsen gebruiken (2): tweede ASCII----waarde negatiefwaarde negatiefwaarde negatiefwaarde negatief CLS PRINT "Voer G, <Home> of een andere toets in." DO i$ = INKEY$ LOOP UNTIL LEN(i$) IF LEN(i$) = 1 THEN Waarde = ASC(i$) ELSE Waarde = -ASC(RIGHT$(i$, 1)) END IF SELECT CASE Waarde CASE -71 PRINT "Je hebt op <Home> gedrukt." CASE 71 PRINT "Je hebt op <G> gedrukt."

Page 28: Cursus programmeren in QuickBasic 4.5

26

CASE ELSE PRINT "Je hebt op een andere toets gedrukt, namelijk "; IF LEN(i$) > 1 THEN PRINT "een speciale toets." ELSE PRINT i$; "." END SELECT END WAT ZIJN AL DIE TWEEDE ASCII-WAARDEN VAN DE BIJZONDERE TOETSEN? Hieronder volgt een overzicht. Het gaat hier om functietoetsen en om de toetsen op het numerieke toetsenbord. Dit toetsenbord wordt gevolgd van links naar rechts en van boven naar beneden. Functietoets: 2e ASCII-waarde: F1 t/m F10 59 t/m 68 Toets op numerieke toetsenbord: 2e ASCII-waarde: 7 / Home 71 8 / ↑ 72 9 / PgUp 73 - 74 4 / ← 75 5 76 6 / → 77 + 78 1 / End 79 2 / ↓ 80 3 / PgDn 81 0 / Ins 82 . / Del 83

Page 29: Cursus programmeren in QuickBasic 4.5

27

HOOFDSTUK 12HOOFDSTUK 12HOOFDSTUK 12HOOFDSTUK 12 LUSSEN(1): FOR...NEXTLUSSEN(1): FOR...NEXTLUSSEN(1): FOR...NEXTLUSSEN(1): FOR...NEXT WILT U DAT NOG EVEN HERHALEN? Het komt geregeld voor dat bepaalde opdrachten vaker uitgevoerd moeten worden. Zo is in opdracht 5 van hoofdstuk 2 een eenvoudig programma gemaakt dat circa 10 keer je naam op het scherm zet, door een aantal malen de opdracht PRINT "Naam" in te typen. In opdracht 10 is dit programma aangepast door een lus te gebruiken. Een eenvoudig programma dat het gehele scherm vult met je naam zie je hier onder. 12.1 Eenvoudig gebruik van FOR...NEXT12.1 Eenvoudig gebruik van FOR...NEXT12.1 Eenvoudig gebruik van FOR...NEXT12.1 Eenvoudig gebruik van FOR...NEXT CLS INPUT "Naam (niet meer dan 8 letters): ", Naam$ Naam$ = LEFT$(Naam$ + STRING$(8, 32), 8) '8 spaties toevoegen CLS 'en eerste 8 karakters nemen FOR i = 1 TO 250 PRINT Naam$; NEXT i END Toelichting bij programma 12.1 Na invoer van je naam, wordt deze aangepast. Er wordt voor gezorgd dat Naam$ uit precies 8 karakters bestaat. De naam past dan 250 keer (10 per regel en totaal 25 regels) op het scherm. Hiertoe wordt Naam$ aangevuld met acht spaties (STRING$(5, 32), waarbij 32 de ASCII�waarde voor een spatie is). Dit is nodig voor het geval Naam$ uit nul karakters bestaat. Vervolgens worden de eerste acht karakters van de naam genomen (LEFT$(.. , 8)). Dit kan ook op een andere manier. Zie hiervoor de opdracht bij dit programma. In de lus FOR...NEXT wordt met een teller i (of iedere andere variabele) bijgehouden hoe vaak de lus is uitgevoerd. Iedere keer wordt i één groter. De puntkomma (;) achter Naam$ zorgt ervoor dat de cursor op dezelfde regel blijft. Opdracht bij programma 12.1 Verander de regel Naam$ = LEFT$(Naam$ ... in: Naam$ = Naam$ + SPACE$(8 � LEN(Naam$)) en start opnieuw. Kun je uitleggen waarom dit hetzelfde resultaat oplevert? HOE WARM IS HET HIER EIGENIJK? Stel je wilt een tabel maken waarin de temperatuurschalen van Celsius en Fahrenheit met elkaar vergeleken worden (T °C = 1.8 * T + 32 °F). In de tabel moet de schaal van Celsius onderverdeeld zijn in stukjes van 5°. Ook hiervoor kun je FOR...NEXT gebruiken in combinatie met STEP. 12.12.12.12.2222 Omrekenen van Celsius in FahrenheitOmrekenen van Celsius in FahrenheitOmrekenen van Celsius in FahrenheitOmrekenen van Celsius in Fahrenheit CLS PRINT "Celsius Fahrenheit" 'weergave tabel PRINT "--------------------" REM Kan ook met: PRINT STRING$(20, 196) 'wordt etc. M$ = " ### ###" 'bepaalt de lay out FOR Celsius = -20 TO 40 STEP 5 'temperatuur met 5 graden omhoog Fahrenheit = 1.8 * Celsius + 32 'omrekenformule PRINT USING M$; Celsius; Fahrenheit 'getallen rechts uitgelijnd NEXT Celsius END

Page 30: Cursus programmeren in QuickBasic 4.5

28

Opdracht bij programma 12.2 Verander het programma zodanig dat naar begin- en eindtemperatuur gevraagd wordt en naar het interval (per hoeveel graden). Zorg er voor dat de gehele tabel op een scherm past. (Gebruik dus variabelen in plaats van -20, 40 en 5). WAT STA JIJ GEMIDDELD VOOR .... ? Als je gegevens in een array (zie hoofdstuk 6) wilt stoppen is het gebruik van FOR...NEXT erg handig. In het volgende programma worden toetscijfers met hun gewichten ingelezen. Daarna wordt het gemiddelde getoond. 12.3 Bepalen van een gemiddeld eindcijfer12.3 Bepalen van een gemiddeld eindcijfer12.3 Bepalen van een gemiddeld eindcijfer12.3 Bepalen van een gemiddeld eindcijfer CLS INPUT "Hoeveel cijfers invoeren: ", N DIM Cijfer(N), Gewicht(N) 'array's dimensioneren PRINT "Voer cijfer en gewicht als volgt in: cijfer, gewicht <Enter>" PRINT FOR i = 1 TO N 'start lus PRINT "Nr."; i; ":"; 'bijhouden aantal cijfers INPUT " ", Cijfer(i), Gewicht(i) 'gegevens invoeren NEXT i PRINT 'regel overslaan Som = 0 'startwaarde voor Som Deler = 0 'startwaarde voor Deler FOR i = 1 TO N Som = Som + Cijfer(i) * Gewicht(i) 'cijfers x gewichten optellen Deler = Deler + Gewicht(i) 'totale aantal cijfers NEXT i Gem = Som / Deler 'berekent gemiddelde PRINT "Gemiddelde:"; Gem 'gemiddelde tonen PRINT "Afgerond: "; PRINT USING "#.#"; Gem 'nu afgerond op één decimaal END Opdracht bij programma 12.3 In dit programma wordt twee keer dezelfde FOR...NEXT-lus gebruikt. Het is mogelijk om slechts één lus te gebruiken. Verander het programma zodanig dat er maar van een lus gebruik gemaakt wordt. Zorg er bovendien voor dat het gemiddelde op twee decimalen wordt afgerond. IN HET KADER VAN OVERZICHTELIJKHEID. Op het scherm kun je tekst of gegevens overzichtelijk in een of in een zetten Voor kaders heb je karakters als ┌, ┼, ┐, ╚, ╠, ║ etc. nodig. De belangrijkste volgen nu met hun ASCII-waarden. 218 196 194 191 201 205 203 187 ┌─────────┬────┐ ╔═════════╦════╗ 179 │ │ │ 186 ║ ║ ║ │ 197 ┼ ┤ 180 ║ 206 ╬ ╣ 185 195 ├ │ │ 204 ╠ ║ ║ └─────────┴────┘ ╚═════════╩════╝ 192 196 193 217 200 205 202 188

K A D E R K A D E R

Page 31: Cursus programmeren in QuickBasic 4.5

29

Een kader maak je met behulp van een FOR...NEXT-lus. In het volgende programma zie je één van de manieren om dit voor elkaar te krijgen. Bij het maken van de verticale randen gebruik je de FOR...NEXT-lus en daarbij maakt het nogal uit of je de ruimte tussen de linker en rechter rand vult met spaties (met de opdracht SPACE$) of niet (je moet dan LOCATE gebruiken). Als je namelijk SPACE$ gebruikt, wordt alles tussen de randen gewist. Je kunt op die manier niet ergens een kader omheen plaatsen. Je moet dan eerst het kader maken en dit vervolgens opvullen. Bij het gebruik van LOCATE is dit niet nodig. Het nu volgende programma is bedoeld als aardigheid, maar is ook zeer instructief. Er wordt twintig keer een kader (enkel- of dubbelrandig) van willekeurige grootte op een willekeurige plek op het scherm gezet. Uiteraard moet hiervoor RND (random) gebruikt worden. Voor het tekenen van het kader zijn slechts de coördinaten van de linker bovenhoek en de rechter benedenhoek nodig. Deze coördinaten worden willekeurig bepaald en indien nodig verwisseld (bijvoorbeeld linksboven = (12, 20) en rechtsonder = (3, 4) kan natuurlijk niet, zodat de coördinaten verwisseld moeten worden). Dit verwisselen kan met het commando SWAP. Stel A = 5 en B = 3 dan zorgt SWAP A, B er voor dat A = 3 en B = 5. Bovendien demonstreert dit programma het gebruik van een lus in een lus. 12.4 Willekeurig kaders tekenen12.4 Willekeurig kaders tekenen12.4 Willekeurig kaders tekenen12.4 Willekeurig kaders tekenen CLS RANDOMIZE TIMER FOR i = 1 TO 20 'totaal 20 kaders r = RND 'bepaalt rand (enkel of dubbel) c = INT(RND * 14) + 2 'bepaalt de kleur (geen zwart) COLOR c, 0 li = INT(RND * 75) + 1 'links (van 1 t/m 75) bo = INT(RND * 20) + 1 'boven (van 1 t/m 20) re = INT(RND * 72) + 8 'rechts (van 8 t/m 79) be = INT(RND * 20) + 5 'beneden (van 5 t/m 24) IF li > re THEN SWAP li, re 'verwissel li en re indien nodig IF li = re THEN re = re + 1 'li en re mogen niet gelijk zijn IF bo > be THEN SWAP bo, be 'verwissel bo en be indien nodig IF bo = be THEN be = be + 1 'bo en be mogen niet gelijk zijn Br = re - li + 1 'breedte van het kader LOCATE bo, li 'begin bij linker bovenhoek IF r < .5 THEN 'enkelrandig PRINT CHR$(218); STRING$(Br - 2, CHR$(196)); CHR$(191); FOR a = bo + 1 TO be - 1 'lengte van het kader LOCATE a, li 'begin links PRINT CHR$(179); LOCATE a, li + Br - 1 'naar rechter rand PRINT CHR$(179); NEXT a LOCATE be, li 'linker benedenhoek PRINT CHR$(192); STRING$(Br - 2, CHR$(196)); CHR$(217); ELSE 'dubbelrandig PRINT CHR$(201); STRING$(Br - 2, CHR$(205)); CHR$(187); FOR a = bo + 1 TO be - 1 'lengte van het kader LOCATE a, li 'begin links PRINT CHR$(186); LOCATE a, li + Br - 1 'naar rechter rand PRINT CHR$(186); NEXT a LOCATE be, li 'linker benedenhoek PRINT CHR$(200); STRING$(Br - 2, CHR$(205)); CHR$(188); END IF

Page 32: Cursus programmeren in QuickBasic 4.5

30

SLEEP 1 'even wachten NEXT i COLOR 7, 0 'kleuren weer normaal END Programma’s kun je korter maken door vergelijkbare opdrachten die vaker voorkomen proberen samen te voegen. In bovenstaand programma komt twee keer de opdracht voor om een kader te tekenen. De eerste keer bij een enkelrandig kader en de tweede keer bij een dubbelrandig kader. Je kunt beide opdrachten samenvoegen door van te voren vast te leggen welke karakters gebruikt moeten worden. Hieronder staat zo’n programma, die natuurlijk nog veel overeen-komsten heeft met programma 12.4. 12.5 Nogmaals willekeurig kaders tekenen12.5 Nogmaals willekeurig kaders tekenen12.5 Nogmaals willekeurig kaders tekenen12.5 Nogmaals willekeurig kaders tekenen CLS RANDOMIZE TIMER FOR i = 1 TO 20 'totaal 20 kaders r = RND 'bepaalt rand (enkel of dubbel) IF r < .5 THEN 'enkelrandig libo$ = CHR$(218) 'linksboven rebo$ = CHR$(191) 'rechtsboven libe$ = CHR$(192) 'linksbeneden rebe$ = CHR$(217) 'rechtsbeneden hor$ = CHR$(196) 'horizontaal ver$ = CHR$(179) 'verticaal ELSE 'dubbelrandig libo$ = CHR$(201) 'linksboven rebo$ = CHR$(187) 'rechtsboven libe$ = CHR$(200) 'linksbeneden rebe$ = CHR$(188) 'rechtsbeneden hor$ = CHR$(205) 'horizontaal ver$ = CHR$(186) 'verticaal END IF c = INT(RND * 14) + 2 'bepaalt de kleur (geen zwart) COLOR c, 0 li = INT(RND * 75) + 1 'links (van 1 t/m 75) bo = INT(RND * 20) + 1 'boven (van 1 t/m 20) re = INT(RND * 72) + 8 'rechts (van 8 t/m 79) be = INT(RND * 20) + 5 'beneden (van 5 t/m 24) IF li > re THEN SWAP li, re 'verwissel li en re indien nodig IF li = re THEN re = re + 1 'li en re mogen niet gelijk zijn IF bo > be THEN SWAP bo, be 'verwissel bo en be indien nodig IF bo = be THEN be = be + 1 'bo en be mogen niet gelijk zijn Br = re - li + 1 'breedte van het kader LOCATE bo, li 'begin bij linker bovenhoek PRINT libo$; STRING$(Br - 2, hor$); rebo$; FOR a = bo + 1 TO be - 1 'lengte van het kader LOCATE a, li 'begin links PRINT ver$; LOCATE a, li + Br - 1 'naar rechter rand PRINT ver$; NEXT a LOCATE be, li 'linker benedenhoek PRINT libe$; STRING$(Br - 2, hor$); rebe$; SLEEP 1 'even wachten NEXT i COLOR 7, 0 'kleuren weer normaal END

Page 33: Cursus programmeren in QuickBasic 4.5

31

In feite kan het nog korter, door de betreffende ASCII-waarden in te lezen met behulp van het commando READ en DATA. Dit staat in hoofdstuk 14. 12.5 Tekst in e12.5 Tekst in e12.5 Tekst in e12.5 Tekst in eenenenen kader plaatskader plaatskader plaatskader plaatsenenenen Dit programma moet je zelf maken. Gebruik onderstaande aanwijzingen. • Dimensioneer de array Naam$() voor 10 elementen. • Laat met een FOR...NEXT-lus 10 namen opvragen en stop ze in Naam$(). • Bepaal de lengte van de langste naam. Hint: Stel eerst de maximale lengte

op 0; bijv. MaxLen = 0. Bepaal dan van alle namen de lengte en vergelijk ze met MaxLen. MaxLen moet de lengte van de string worden als die lengte groter is dan de huidige waarde van MaxLen. Dus IF LEN(Naam$(i)) > MaxLen THEN MaxLen = LEN(Naam$(i)).

• Het kader moet links en rechts 2 karakters breder worden dan de langste naam (waarvan de lengte inmiddels is vastgelegd in MaxLen).

• Plaats het kader bij voorkeur midden op het scherm. • Laat dan de namen in het kader zetten. Opdracht bij programma 12.5 Herschrijf een gedeelte van het programma zodat je eerst de namen op het scherm zet en daar het kader omheen zet (dus net omgekeerd). 12.6 Tafel weergeven12.6 Tafel weergeven12.6 Tafel weergeven12.6 Tafel weergeven • Neem het programma uit hoofdstuk 1 over. • Verander het programma zodanig dat de tafel in het midden van het scherm

komt te staan met een kader er omheen. • Wijzig dit ook weer zodat iedere seconde een tafel getoond wordt, beginnend

en eindigend bij wat je ingevoerd hebt.

Page 34: Cursus programmeren in QuickBasic 4.5

32

HOOFDSTUK HOOFDSTUK HOOFDSTUK HOOFDSTUK 13131313 LLLLUSSENUSSENUSSENUSSEN (2): (2): (2): (2): DDDDOOOO...L...L...L...LOOOOOOOOPPPP EEN LOOPING MET DE PC. In sommige gevallen moet een lus ’eindeloos' herhaald worden, of is vooraf niet bekend hoe vaak de lus doorlopen moet worden. In zo’n geval is FOR...NEXT niet erg geschikt en kun je beter DO...LOOP gebruiken. Een oneindige lus is de volgende. 13.1 Ee13.1 Ee13.1 Ee13.1 Een n n n oneindige lus met DO...LOOPoneindige lus met DO...LOOPoneindige lus met DO...LOOPoneindige lus met DO...LOOP CLS DO

x = x + 1 PRINT x

LOOP PRINT "Klaar" END Opmerking bij programma 13.1 Je kunt het programma alleen maar stoppen met <Ctrl>-C of <Ctrl>-Break. "Klaar" zal nooit getoond worden op deze manier. Opdracht bij programma 13.1 Het beëindigen van DO...LHet beëindigen van DO...LHet beëindigen van DO...LHet beëindigen van DO...LOOOOOP.OP.OP.OP. Gelukkig zijn er voldoende manieren om uit een lus te komen. Een onelegante manier is het toevoegen van IF x = 10 THEN EXIT DO. Je kunt dus met EXIT DO de lus verlaten. • Wijzig het programma zodat je met EXIT DO de lus verlaat.

Andere manieren zijn: DO WHILE x = 10 ... LOOP

DO UNTIL x = 10 ... LOOP DO ... LOOP WHILE x = 10 DO ... LOOP UNTIL x = 10

• Probeer bovenstaande vier manieren uit en let goed op hoe vaak de lus wordt uitgevoerd.

• Herhaal de vorige opdracht, maar voeg nu eerst onder de opdracht CLS de volgende regel toe: x = 10. Zijn er nu verschillen te zien bij die vier manieren? Let weer goed op hoe vaak de lus wordt uitgevoerd.

• Hetzelfde als de vorige opdracht, maar gebruik nu ook eens x > 10, x >= 10, x < 10, x <= 10, x <> 10 en kijk weer hoe vaak de lus doorlopen wordt.

GA TERUG NAAR AF! Een erg primitieve vorm van een lus is het gebruik van een label in combinatie met de opdracht GOTO. In GWBASIC is dit vrij normaal, maar in QuickBASIC niet! Met GOTO geef je een onvoorwaardelijke sprongopdracht naar een label. Zo'n label kan een getal of een woord zijn, maar moet altijd eindigen met een dubbele punt. 13.2 Het gebruik van GOTO label als (primitieve) lus13.2 Het gebruik van GOTO label als (primitieve) lus13.2 Het gebruik van GOTO label als (primitieve) lus13.2 Het gebruik van GOTO label als (primitieve) lus CLS start: 'eerste label (eindigen met :) x = x + 1 PRINT x IF x = 10 GOTO verder 'naar tweede label om te stoppen GOTO start 'terug naar start: verder: 'tweede label PRINT "Klaar!" END

Page 35: Cursus programmeren in QuickBasic 4.5

33

In hoofdstuk 12 kwam een lus in een lus voor. Dat kan ook bij DO...LOOP. 13.3. Invoer van één karakter zonder <Enter>13.3. Invoer van één karakter zonder <Enter>13.3. Invoer van één karakter zonder <Enter>13.3. Invoer van één karakter zonder <Enter> CLS DO DO I$ = INKEY$ 'vraagt om toetsinvoer LOOP UNTIL LEN(I$) 'als LEN(I$) > 0 dan verder PRINT I$; LOOP UNTIL I$ = CHR$(27) 'stoppen als <Esc> is ingetoetst END Toelichting bij programma 13.3 De tweede lus is erg belangrijk. Met I$ = INKEY$ wordt naar een toetsindruk gevraagd, maar hier wordt niet op gewacht (zoals bij INPUT$()). Daarom moet deze opdracht in een lus staan. Met LOOP UNTIL LEN(I$) wordt bepaald of er een toets is ingedrukt. Zo ja, dan heeft I$ een bepaalde lengte, namelijk 1, en wordt de lus verlaten. Ook goed zou zijn: LOOP UNTIL LEN(I$) > 0, maar kennelijk is de toevoeging > 0 niet nodig. Als je moet kiezen tussen ‘Ja’ of ‘Nee’, kun je de lus als volgt wijzigen: DO

I$ = UCASE$(INKEY$) LOOP UNTIL I$ = "J" OR I$ = "N" Het maakt, door de opdracht UCASE$, niet uit of je een hoofdletter of een kleine letter invoert. Je kunt maar op één manier uit de hoofdlus van programma 13.3 komen, namelijk door het invoeren van CHR$(27). Dit kun je op twee manieren invoeren via het toetsenbord: 1. houdt de <A1t>toets ingedrukt en toets op het numerieke toetsenbord 27 in;

(het numerieke toetsenbord is het gedeelte rechts op het toetsenbord) 2. (veel en veel simpeler) druk op <Esc>. Veel programma's kun je beëindigen door op <Esc> te drukken. Opdracht bij programma 13.3 • Start het programma en voer gegevens in via ALT en numerieke toetsenbord,

zoals hierboven voor CHR$(27) beschreven is. Je kunt hiermee karakters op het scherm krijgen die niet op het toetsenbord staan. Probeer maar eens met waarden tussen 126 en 254.

• Zoek uit bij welke waarden tussen O en 32 er GEEN karakter op het scherm wordt getoond.

• Wat stellen de getallen precies voor die je in combinatie met de ALT-toets moet invoeren?

HET GEHELE SCHERM OVER. Hoofdstuk 11 ging over het gebruik van bijzondere toetsen. Dit wordt nu gebruikt om een blokje over het gehele scherm te laten bewegen. Maar er gelden ook randvoorwaarden. Het blokje moet bijvoorbeeld wel op het scherm blijven. Hieronder staat een overzicht van alle eventuele probleemgevallen en een (mogelijke) oplossing.

Page 36: Cursus programmeren in QuickBasic 4.5

34

Probleem: Oplossing: Programma stoppen Druk op <Esc> Blokje op het scherm krijgen PRINT CHR$(219); (ook op de onderste regel) (vandaar ;) Blokje wissen PRINT " "; Positie van het blokje x = kolom en y = regel Positie op het scherm LOCATE x, y Positie veranderen x = x + 1, x = x - 1; idem voor y Blokje op scherm houden IF x < 1 THEN ...; IF x > 80 THEN ...

IF y < 1 THEN ...; IF y > 25 THEN ... Wat betreft dit laatste, moet nog de keuze gemaakt worden of het blokje moet "doorlopen" of niet. In het voorbeeld mag het blokje "doorlopen", dus als het blokje links verdwijnt, komt het rechts weer tevoorschijn. Het blokje mag ook schuin over het scherm. Hiervoor kunnen de toetsen <Home>, <End>, <PgUp> en <PgDn> op het numerieke toetsenbord gebruikt worden. Dit betekent dat zowel x als y moet veranderen. 13.4 Het bewegende blokje13.4 Het bewegende blokje13.4 Het bewegende blokje13.4 Het bewegende blokje CLS LOCATE 12, 40 'midden van scherm PRINT CHR$(219); 'print een blokje x = 40 'beginwaarde x-coördinaat (kolom) y = 12 'beginwaarde y-coördinaat (regel) DO DO

i$ = INKEY$ LOOP UNTIL LEN(i$) 'wachten op toetsinvoer IF LEN(i$) = 1 THEN Waarde = ASC (i$) 'gewone toets ELSE Waarde = -ASC(RIGHT$(i$, 1)) 'bijzondere toets END IF LOCATE y, x PRINT " " 'blokje wissen SELECT CASE Waarde 'coördinaten wijzigen CASE -72 'pijl omhoog y = y - 1 '‚‚n regel hoger CASE -80 'pijl omlaag y = y + 1 '‚‚n regel lager CASE -75 'pijl naar links x = x - 1 'plaatsje naar links CASE -77 'pijl naar rechts x = x + 1 'plaatsje naar rechts CASE -71 '<Home> x = x - 1 '‚‚n naar links y = y - 1 '‚‚n naar boven CASE -79 '<End> x = x - 1 '‚‚n naar links y = y + 1 '‚‚n naar beneden CASE -73 '<PgUp> x = x + 1 '‚‚n naar rechts y = y - 1 '‚‚n naar boven CASE -81 '<PgDn> x = x + 1 '‚‚n naar rechts y = y + 1 '‚‚n naar beneden

Page 37: Cursus programmeren in QuickBasic 4.5

35

CASE 27 'op <Esc> gedrukt CLS : END 'stoppen END SELECT IF y < 1 THEN y = 25 ' IF y > 25 THEN y = 1 'zorgen dat x en y "binnen IF x < 1 THEN x = 80 'de perken" blijven. IF x > 80 THEN x = 1 LOCATE y, x PRINT CHR$(219); LOOP NOG EEN (K)LUS. Er is nog een lus. Deze begint met WHILE en eindigt met WEND. Deze lus komt overeen met een DO WHILE ... LOOP-constructie, maar kan echter niet met EXIT worden verlaten. Meestal wordt WHILE...WEND in het volgende geval gebruikt: 13.5 Wachte13.5 Wachte13.5 Wachte13.5 Wachten totdat een toets is ingedruktn totdat een toets is ingedruktn totdat een toets is ingedruktn totdat een toets is ingedrukt CLS PRINT "Druk op een toets om verder te gaan." WHILE INKEY$ = "": WEND Toelichting bij programma 13.5 Zolang er niets ingevoerd is geldt INKEY$ = "", waarbij "" staat voor: geen invoer. In dat geval geeft WEND aan dat je weer terug moet keren. Hetzelfde kan bereikt worden met de DO...LOOP-constructie zoals beschreven in dit hoofdstuk. In principe kun je DO...LOOP altijd gebruiken in plaats van WHILE...WEND.

Page 38: Cursus programmeren in QuickBasic 4.5

36

HOOFDSTUK HOOFDSTUK HOOFDSTUK HOOFDSTUK 14141414 GEGGEGGEGGEGEEEEVENSVENSVENSVENS INVINVINVINVOOOOEREN EREN EREN EREN ((((2)2)2)2) LEES DE DATA. In hoofdstuk 7 heb je geleerd hoe gegevens vanaf het toetsenbord kunnen worden ingevoerd. Het komt ook voor dat gegevens als 'constanten' worden gebruikt. In een programma dat alle dagen van de week gebruikt, zal er niet gevraagd worden deze zelf in te voeren. Meestal komen deze dagen in een stringarray te staan. Dit kun je vrij primitief doen: Dag$(1) = "Zaterdag" etc. Handiger is het om de gegevens als DATA in je programma op te nemen en ze met de opdracht READ te laten inlezen. De DATA kunnen zowel aan het begin als aan het eind van het programma staan. 14.1 DATA inlezen m.b.v. READ14.1 DATA inlezen m.b.v. READ14.1 DATA inlezen m.b.v. READ14.1 DATA inlezen m.b.v. READ CLS DIM Dag$(7) 'array dimensioneren FOR i = 1 to 7 READ Dag$(i) 'gegevens achter DATA een voor een inlezen NEXT i FOR i = 1 TO 7 PRINT Dag$(i) 'ter controle of het gelukt is NEXT i END 'einde programma DATA "Maandag", "Dinsdag", "Woensdag", "Donderdag" DATA "Vrijdag", "Zaterdag", "Zondag" Opdrachten bij programma 14.1 • Zoek uit wat er mis gaat als je i tot 8 of hoger laat lopen. • Zoek uit wat er mis gaat als je geen aanhalingstekens gebruikt bij de DATA. • Controleer of het programma ook loopt als je alle DATA aan het begin van

het programma plaatst. Hoe kun je deze regels het snelst verplaatsen? Datum en tijd kunnen worden opgevraagd met DATE$ en TIME$. Als je de datum opvraagt met bijvoorbeeld Datum$ = DATE$, dan wordt 28 maart 2013 weergegeven als 03-28-2013. Met MID$, LEFT$ e.d. kun je dit omzetten in 28-03-2013 en zelfs in 28 maart 2013. Voor dat laatste moet je wel een stringarray dimensioneren waarin alle namen van de maanden komen te staan (net zo als het in programma 14.1 is gedaan voor de dagen in de week). Het programma kan er dan als volgt uit komen te zien: 14.2 DATA inlezen m.b.v. READ14.2 DATA inlezen m.b.v. READ14.2 DATA inlezen m.b.v. READ14.2 DATA inlezen m.b.v. READ CLS DIM Maand$(12) 'array voor de maanden dimensioneren FOR i = 1 TO 12 READ Maand$(i) 'gegevens achter DATA een voor een inlezen NEXT i Datum$ = DATE$ 'systeemdatum ophalen: mm-dd-yyyy Dag$ = MID$(Datum$,4,3) 'dag halen uit datum Mnd = VAL(LEFT$(Datum$,2)) 'maandwaarde halen uit datum Jaar$ = RIGHT$(Datum$,5) 'jaar halen uit datum Datum$ = Dag$ + Maand$(Mnd) + Jaar$ PRINT Datum$ END 'einde programma DATA "Januari", "Februari", "Maart", "April" DATA "Mei", "Juni", "Juli", "Augustus" DATA "September", "Oktober", "November", "December"

Page 39: Cursus programmeren in QuickBasic 4.5

37

HOOFDSTUK 15 HET LEZEN EN HET SCHRIJVEN VAN EEN BESTAND OP DE SCHIJFHOOFDSTUK 15 HET LEZEN EN HET SCHRIJVEN VAN EEN BESTAND OP DE SCHIJFHOOFDSTUK 15 HET LEZEN EN HET SCHRIJVEN VAN EEN BESTAND OP DE SCHIJFHOOFDSTUK 15 HET LEZEN EN HET SCHRIJVEN VAN EEN BESTAND OP DE SCHIJF Als gegevens uit een bestand moeten worden gelezen kan dat op twee manieren: 1. van begin tot eind (je hebt dan een sequentiële file) 2. in willekeurige volgorde (je hebt dan een random access file) Hier gaat het vooral om de sequentiële file. Als gegevens naar een bestand moeten worden geschreven, kan dit ook weer op twee manieren (bij een sequentiële file dus): 1. alles over de reeds bestaande gegevens schrijven (voor zover aanwezig) 2. alles achter de reeds bestaande gegevens zetten (voor zover aanwezig) Een voorbeeld van 1. is een bestand met gemiddelden van cijfers. Als er nieuwe cijfers zijn, worden de gemiddelden anders en moeten ze over de oude gegevens worden geschreven. Een voorbeeld van 2. is een bestand met gegevens over personen. Als er meer personen bij komen, moeten de gegevens aan het bestand worden toegevoegd. (Opmerking: voor het wijzigen van gegevens kun je het handigst gebruik maken van een random access file, omdat je dan op een bepaalde plaats in het bestand veranderingen kan aanbrengen. Als je geen random access file gebruikt, moet je om iets te wijzigen eerst het gehele bestand inlezen, dan veranderingen aanbrengen en dan alles weer wegschrijven.) BESTANDEN EERST OPENEN. Voordat je iets kunt doen met een bestand, moet het worden geopend. Dit gebeurt met het commando OPEN. Bij sequentiële files heb je de volgende drie mogelijkheden: OPEN "bestandnaam" FOR INPUT AS #n → lezen van gegevens OPEN "bestandnaam" FOR OUTPUT AS #n → schrijven van gegevens OPEN "bestandnaam" FOR APPEND AS #n → toevoegen van gegevens Hierin is #n het nummer van het bestand. Dit nummer varieert van 1 tot 255. Je kunt dus een aantal bestanden tegelijkertijd geopend hebben. Ieder bestand heeft zijn eigen nummer. Het schrijven naar een bestand. Tijdens het openen wordt het nieuwe bestand automatisch gemaakt op de schijf. Als het bestand reeds bestaat, zal met OUTPUT de inhoud verloren gaan en zullen met APPEND gegevens worden toegevoegd. Voor het schrijven naar een bestand zijn twee commando's beschikbaar: WRITE #n • gegevens worden gestructureerd naar de file geschreven • nieuwe gegevens komen op een volgende regel in de file • gegevens op regel worden gescheiden door komma's • strings worden tussen aanhalingstekens gezet voorbeeld: WRITE #1, "Jopie", 34 staat in file als; "Jopie",34 WRITE #1, "Anna", 28 staat in file als; "Anna",28 PRINT #n • gegevens worden achter elkaar gezet, zonder scheidingstekens • nieuwe gegevens komen op een volgende regel in de file • strings worden niet tussen aanhalingstekens gezet voorbeeld: PRINT #1, "Jopie"; 34 staat in file als; Jopie 34 PRINT #1, "Anna"; 28 staat in file als; Anna 28 Opmerking; Als je een komma(,) gebruikt in plaats van een puntkomma (;), wordt TAB(14) gebruikt. Vergelijk dit met het gewone PRINT A; B en PRINT A, B.

Page 40: Cursus programmeren in QuickBasic 4.5

38

In het volgende programma wordt een bestand opgeslagen waarin gegevens van personen staan. Deze gegevens zijn: de naam en de leeftijd. Eerst worden deze gegevens via het toetsenbord ingevoerd en opgeslagen in de array Naam$() en Leeftijd(). Vervolgens wordt het bestand opgeslagen als PERSOON.DAT. Opmerking: De drie letters achter de punt vormen de extensie. Hiermee kun je aangeven om wat voor soort bestand het gaat. Hieronder volgt een overzicht van een aantal veelgebruikte extensies met hun betekenis. .BAK Reservekopie van een bestand (BAcK�up) .BAS Programmabestand in BASIC (BASic) .DAT Bestand met gegevens (DATa) .DOC Tekstbestand (DOCument) .EXE Direct uitvoerbaar programmabestand (EXEcute) .HLP Bestand met hulpinformatie (HuLP) .TXT Tekstbestand (TeXT) 15.1 Een bestand schrijven naar de schijf15.1 Een bestand schrijven naar de schijf15.1 Een bestand schrijven naar de schijf15.1 Een bestand schrijven naar de schijf CLS DIM Naam$(5), Leeftijd(5) FOR i = 1 TO 5 'gegevens invoeren vanaf PRINT "Persoon"; i 'het toetsenbord INPUT "Naam: ", Naam$(i) INPUT "Leeftijd: ", Leeftijd(i) PRINT NEXT i OPEN "PERSOON.DAT" FOR OUTPUT AS #1 'PERSOON.DAT openen voor schrijven FOR i = 1 TO 5 WRITE #1, Naam$(i), Leeftijd(i) NEXT i CLOSE #1 'hiermee sluit je bestand #1 END Opmerkingen bij programma 15.1 • Het is ook mogelijk om naar de naam van het bestand te vragen (bijvoorbeeld

met INPUT Bestand$) en dan het bestand te openen met: OPEN Bestand$ FOR .... (etc).

• Let op dat hier WRITE gebruikt wordt. Hierdoor worden strings tussen "" gezet. Bij het inlezen van de gegevens in programma 15.2 voorkom je zo problemen. Probeer maar eens met PRINT #1. Je zult merken dat je in programma 15.2 foutmeldingen krijgt.

Opdracht bij programma 15.1 • Experimenteer met een andere manier om de gegevens vanaf het toetsenbord

in te voeren. Met andere woorden: maak je eigen lay-out. Het lezen van een bestand. Als een bestand voor lezen geopend wordt, moet het wel bestaan. Anders krijg je de foutmelding "File not found". Voor het lezen van gegevens zijn maar liefst drie commando's beschikbaar; INPUT$ #n Hiermee lees je een aantal karakters uit bestand #n. Voorbeeld: Invoer$ = INPUT$(20, #1). Met deze opdracht worden 20 karakters uit bestand #1 gelezen.

Als de opdracht een aantal malen herhaald wordt, worden steeds de volgende 20 karakters ingelezen. Enzovoort. Alle soorten karakters uit het bestand worden ingelezen, dus ook karakters die niet op het scherm getoond kunnen worden.

Page 41: Cursus programmeren in QuickBasic 4.5

39

INPUT #n Hiermee kun je zowel stringvariabelen als numerieke variabelen inlezen. Als een stringvariabele ingelezen moet worden, stopt de invoer zodra er een komma, een carriage return (CHR$(13)) of een line feed (CHR$(10)) gelezen wordt. Voorbeeld: Een bestand bevat de volgende tekst: Hallo, hoe gaat het met jou? Als je deze tekst wilt inlezen met INPUT #1, Tekst$, geldt dat Tekst$ = "Hallo", want de invoer stopt direct bij de komma. Er worden wel komma's gelezen door INPUT #n als in het bestand de tekst tussen aanhalingstekens staat. Voorbeeld: Een bestand bevat de volgende letterlijke tekst: "Hallo, hoe gaat het met jou?" Nu zal na inlezen met INPUT #1, Tekst$ gelden: Tekst$ = "Hallo, hoe gaat het met jou?". De aanhalingstekens kun je in het bestand krijgen door tekst weg te schrijven met WRITE #n, maar er is nog een derde leescommando waarbij dit niet nodig is.

LINE INPUT #n Hiermee wordt tekst, inclusief leestekens, ingelezen tot aan een carriage return (CHR$(13)) en line feed (CHR$(10)), of totdat er 255 tekens ingelezen zijn.

Je kunt dus zowel getallen als tekst (strings) lezen. Als je precies weet hoeveel gegevens er in het bestand staan, kun je ze allemaal met een FOR...NEXT-lus inlezen. Als je er meer wilt inlezen krijg je de foutmelding "Input past end of file". Je kunt dan beter de ingebouwde functie EOF(#n) gebruiken (EOF = End Of File). Er wordt dan automatisch bijgehouden wanneer alle gegevens ingelezen zijn. In het volgende programma wordt PERSOON.DAT gebruikt om gegevens in te lezen. 15.2 Een bestand lezen van de schijf15.2 Een bestand lezen van de schijf15.2 Een bestand lezen van de schijf15.2 Een bestand lezen van de schijf CLS DIM Naam$(5), Leeftijd(5) OPEN "PERSOON.DAT" FOR INPUT AS #1 'Openen voor lezen FOR i = 1 TO 5 'Het bestand "bevat" 5 personen INPUT #1, Naam$(i) 'Inlezen van de naam INPUT #1, Leeftijd(i) 'Inlezen van de leeftijd NEXT i CLOSE #1 ’Hiermee wordt bestand #1 gesloten FOR i = 1 TO 5 'Gegevens op het scherm zetten. PRINT "Persoon ";i; " :"; PRINT TAB(13); Naam$(i) PRINT TAB(13); Leeftijd(i); " jaar" PRINT NEXT i END Opmerkingen bij programma 15.2: Ook goed zou zijn: INPUT #1, Naam$(i), Leeftijd(i) Maar FOUT is: INPUT #1, Leeftijd(i), Naam$(i) (Snap je waarom?) Met CLOSE (zonder nummer) worden alle geopende bestanden gesloten.

Page 42: Cursus programmeren in QuickBasic 4.5

40

Als het aantal personen onbekend is, gebruik je EOF(#n) in plaats van FOR...NEXT: DO WHILE NOT EOF(#1) 'Doe, zolang het einde nog niet bereikt is, ..

INPUT #1, Naam$(x), Leeftijd(x) x = x + 1

LOOP EOF staat voor End Of File. Ook voor het lezen kun je naar de naam van het bestand vragen: INPUT "Naam van het bestand: ", Bestand$ OPEN Bestand$ FOR INPUT ..... (etc) Opmerking: Als je de naam van het bestand niet meer weet, kun je met de opdracht FILES alle bestanden op het scherm krijgen. Als je alle bestanden in C:\QB45\DATA met extensie .TXT wilt zien, type je in: * <F6> je komt dan in de Direct Mode; het gedeelte onder Immediate * FILES "C:\QB45\DATA\*.TXT" gevolgd door <Enter> * een willekeurige toets om weer in de Direct Mode te komen. * <F6> om weer terug te keren naar het programmeerscherm Een ander formaat voor het openen van bestanden is: OPEN "I", 1, "naam" → voor Input (lezen) OPEN "O", 1, "naam" → voor Output (schrijven) OPEN "A", 1, "naam" → voor Append (toevoegen)

Page 43: Cursus programmeren in QuickBasic 4.5

41

HOOFDSTUK 16 ZELF PROGRAMMA'S MAKEN (2)HOOFDSTUK 16 ZELF PROGRAMMA'S MAKEN (2)HOOFDSTUK 16 ZELF PROGRAMMA'S MAKEN (2)HOOFDSTUK 16 ZELF PROGRAMMA'S MAKEN (2) 1 Schrijf een programma dat m.b.v. een FOR...NEXT-lus om 5 namen vraagt

en ze in een array plaatst (de array Naam$() bijvoorbeeld). Maak het scherm schoon en zet de ingevoerde namen in omgekeerde volgorde op het scherm met zwarte tekst op een witte achtergrond.

2 Wijzig het programma van opdracht 1, zodat de ingevoerde namen alfa-

betisch gesorteerd worden en dan op het scherm worden gezet. Hint: een eenvoudige sorteermethode kun je maken met twee FOR...NEXT-lussen in elkaar. De eerste laat je lopen van 1 tot 4 (FOR j = 1 TO 4) en de tweede van j + 1 tot 5 (FOR i = j + 1 TO 5). Daarna vergelijk je twee namen (de ene met index i en de andere met j) en verwissel ze indien nodig: IF Naam$(j) > Naam$(i) THEN SWAP Naam$(j), Naam$(i).

3 Wijzig het programma van opdracht 2, zodat de ingevoerde namen gesorteerd

worden op lengte en dan op het scherm worden gezet. 4 Maak een programma waarbij je een cijfer tussen 0 en 9 moet invoeren.

De invoer moet direct geaccepteerd worden (dus GEEN <Enter> na de invoer), maar moet wel op juistheid gecontroleerd worden (iets anders dan 0 t/m 9 invoeren mag niet). Gebruik SELECT CASE om bij ieder ingevoerd cijfer een bepaalde mededeling op het scherm te zetten. Het programma moet stoppen als je 0 invoert.

5 Schrijf een programma dan om 5 getallen vraagt. Maak er positieve gehele

getallen van en bepaal welke deelbaar zijn door 3. Hint: als een getal deelbaar is door 3, dan is de rest na een integerdeling gelijk aan 0, dus gebruik zoiets als IF x MOD 3 = 0 THEN ...

6 Pas het programma van opdracht 5 aan, zodat van de 5 getallen alleen de

grootste en de kleinste worden getoond. Hint: het grootste getal vind je snel door een klein getal (Max = 0) te vergelijken met de ingevoerde getallen en te verwisselen indien nodig.

7 Pas het programma van opdracht 6 aan, zodat je door invoer van G of K

zelf kunt bepalen of je het grootste (G) of het kleinste (K) getal wilt zien.

8 Maak een programma waarbij een tekst moet worden ingevoerd. Daarna moet

die tekst achterste voren op het scherm worden afgedrukt. Voorbeeld: Hallo, hoe gaat het ⟶ teh taag eoh ,ollaH

9 Schrijf een programma waarbij een tekst wordt ingevoerd en laat daarna

op het scherm afdrukken hoeveel letters e er in die tekst voorkomen. 10 Verander het programma van opdracht 9 zodanig, dat van de ingevoerde tekst

de letters e in de tekst als punten worden weergegeven. Dus: Deze week geen huiswerk ⟶ D.z. w..k g..n huisw.rk

11 Wijzig het programma van opdracht 10 zodanig, dat nu alleen de letters

e worden weergegeven en de overige letters als punten. Dus: Deze week geen huiswerk ⟶ .e.e .ee. .ee e..

12 Maak een programma dat in een tabel alle ASCII-karakters (voor zover

mogelijk) op het scherm zet met hun waarde. De karakters die niet getoond kunnen worden, geef je weer met een spatie. Als alles niet op scherm past, moet je de mogelijkheid inbouwen dat je door het drukken op bijvoorbeeld

Page 44: Cursus programmeren in QuickBasic 4.5

42

de spatiebalk kunt wisselen tussen de twee tabellen (alles kan sowieso in twee tabellen die elk 128 karakters bevatten). Met <Esc> moet je het programma kunnen beëindigen. De lay out van de tabel bepaal je helemaal zelf.

13 Maak een programma dat steeds om een geheel getal vraagt (tussen -32768

en + 32768) en om een deler vraagt. Bepaal dan of het getal deelbaar is door die deler. Hint: de rest na de deling moet dan 0 zijn. Hierna moet je met <Enter> door kunnen gaan en met <Esc> stoppen.

14 Schrijf een programma dat steeds om een geheel getal vraagt en bepaalt

of dit getal een priemgetal is (het is dan nergens door deelbaar, behalve door 1 en door zichzelf). Ook nu geldt weer: <Enter> voor doorgaan en <Esc> voor stoppen. Hint: als je van bijvoorbeeld 83 moet bepalen of het een priemgetal is, hoelang ga je dan door met het ophogen van de deler?

15 Wijzig het programma van opdracht 14, zodat nu alle priemgetallen tussen

1 en 1000 naast elkaar op het scherm worden gezet (gebruik de opdracht PRINT USING "####"; priem;). Onderzoek alleen de oneven getallen. Als je bekend bent met de Zeefmethode van Erathostenes kun je het programma erg snel maken. Bij deze methode worden alle 3-, 5-, 7-vouden (etc) weggestreept uit alle oneven getallen tussen 1 en 1000. De getallen die dan over blijven zijn de priemgetallen.

16 Pas het programma van opdracht 15 aan, zodat nu alle priemgetallen kunnen

worden weggeschreven in een bestand op de schijf. 17 Maak een programma dat bepaalt welke reeks van opeenvolgende getallen

als som 100 oplevert. Voorbeeld: de reeks 4+5+6+7+8+9 heeft als som 39 en de reeks 20+21+22+23 heeft als som 86.

18 Verander het programma van opdracht 17 zodanig dat je eerst kunt invoeren

wat de som moet zijn. 19 Bij wiskunde heb je de stelling van Phytagoras geleerd; a2 + b2 = c2. In

bepaalde gevallen geldt deze formule voor gehele getallen: 32+42=52. We spreken dan van Phytagorese drietallen. Schrijf een programma dat deze drietallen bepaalt en op het scherm zet. Hint: Werk hier van rechts naar links. Dus laat c oplopen van 1 tot een bepaald maximum en bepaal of c2 te schrijven is als een som van twee kwadraten. Laat a en b in twee FOR...NEXT lussen oplopen totdat a > b (anders krijg je bij c = 5 ook als resultaat: 42+32=52). Zodra geldt dat a2 + b2 = c2 zet je dit volledig op het scherm. Het kwadraatje heeft als ASCII-waarde 253.

20 Maak een programma dat van een ingevoerd getal alle delers op het scherm

zet. Na een invoer van bijvoorbeeld 10140, moet het volgende op het scherm komen: 10140 =1x2x2x3x5x13x13.

De volgende programma's zijn wat moeilijker te programmeren. Je kunt je nu echt gaan uitleven en alles zo fraai mogelijk maken. Natuurlijk mag je alles ook simpel en sober houden, maar eigenlijk geldt:

M A A K E R W A T M O O I S V A N !

Page 45: Cursus programmeren in QuickBasic 4.5

43

21 Schrijf een programma waarbij je de volgende gegevens moet invoeren: beginkapitaal (in euro), rente (in procenten), aantal jaren (maximaal 20). Ieder jaar wordt bij het kapitaal de rente bijgeschreven (samengesteld interest). Voorbeeld; €1000,00 met 5% rente wordt na 1 jaar €1050,00; na 2 jaar €1102,50 (1050+5% van 1050); na 3 jaar €1157,63 (1102,50+5% van 1102,50). Het programma moet deze gegevens netjes in een tabel op het scherm afdrukken met een kader er omheen. Hint: probeer een formule te bedenken (of op te zoeken) waarmee je het kapitaal na ieder jaar snel kunt berekenen.

22 Ken je het spel Roulette? Zo ja, dan ga je een programma schrijven waarmee

je kunt uitzoeken of de nu volgende methode geschikt is om schatrijk te worden! Je begint met bijvoorbeeld €100,=. Je kiest voor het gehele spel één kleur uit (rood of zwart). De eerste inzet is €1,= op die kleur. Wat je daarna inzet wordt als volgt bepaald: als je wint (je krijgt dan je ingezette bedrag uitbetaald) blijft de inzet ongewijzigd, maar als je verliest (je bent dan je ingezette bedrag kwijt) VERDUBBEL je de inzet. Bepaal zelf hoe lang je dit wilt spelen.

23 Maak een programma waarmee je het volgende kaartspel kunt spelen: voor

je ligt een stapel met 52 speelkaarten. Alleen de bovenste kaart is zichtbaar. Je moet raden of de volgende kaart hoger of lager is dan de zichtbare kaart. Spreek met je zelf af of je alleen kijkt naar de waarde of ook naar de kleur. Als ook de kleur meetelt, geldt de volgende volgorde: schoppen > harten > ruiten > klaver. Als je juist raadt, krijg je punten (of geld). Van te voren moet je kunnen inzetten.

Het moeilijkste in dit programma is de manier om 52 kaarten op te slaan in array en om de kaarten te schudden. De simpelste manier is om alle kaarten een waarde te geven lopend van klaver aas (nr. 1) tot schoppen heer (nr. 52) en hier willekeurig een kaart uit te kiezen (met RND). Probleem hierbij is: hoe bepaal je dat kaart nr. 33 een harten 7 is? Deel 33 door 13 met een integerdeling (33 \ 13 = 2). De 2 hoort dan bij harten. De rest 33 - 2*13 (of 33 MOD 13) is de waarde. Denk er aan dat je iedere kaart maar één keer kunt kiezen. Geef daartoe de gekozen kaart de waarde 0. (Dit is de meest primitieve manier. Bedenk een betere!)

Hoe zet je de kaarten op het scherm? Het simpelste is weer de waarden als cijfers weer te geven (Aas=1, Boer=11, Vrouw=12, Heer=13) en de kleuren als letters of woorden. Mooier (en moeilijker te programmeren) is als je Aas als A of Aas weergeeft etc. De kleuren kun je ook met tekentjes weergeven: hart = CHR$(3), ruit = CHR$(4), klaver = CHR$(5) en schoppen = CHR$(6).

24 Schrijf een programma waarmee je MASTERMIND kunt spelen. Kies 4 getallen

uit een reeks van 6. Laat de computer de combinatie van 4 getallen bedenken en ook de aanwijzingen geven. Bijvoorbeeld 1 = juiste cijfer en juiste plaats; 0 is alleen juiste cijfer.

Page 46: Cursus programmeren in QuickBasic 4.5

44

HOOFDSTUK 17HOOFDSTUK 17HOOFDSTUK 17HOOFDSTUK 17 GRAFISCHE MOGELIJKHEDEN (1): INLEIDING EN LIJNENGRAFISCHE MOGELIJKHEDEN (1): INLEIDING EN LIJNENGRAFISCHE MOGELIJKHEDEN (1): INLEIDING EN LIJNENGRAFISCHE MOGELIJKHEDEN (1): INLEIDING EN LIJNEN DE SCHERMEN VAN EEN PC Tot dusver is er steeds met een scherm gewerkt waarop uitsluitend tekst geplaatst kan worden. We spreken dan van een tekstscherm. Nu kent BASIC ook een aantal grafische schermen. Het verschil tussen een tekstscherm en een grafisch scherm is dat een tekstscherm is opgebouwd uit 25 regels en 80 kolommen en een grafisch scherm is opgebouwd uit punten (pixels). Hoe meer punten een grafisch scherm bevat, des te hoger is de resolutie en des te 'fijner’ worden de grafische voorstellingen. Het gewenste scherm kies je met de opdracht SCREEN x. De keuze voor een grafisch scherm hangt af het aantal pixels, het aantal mogelijke kleuren (van voor- en of achtergrond) en van de weergave van tekst op het scherm. Met de grafische adapters van tegenwoordig komen de volgende schermen in aanmerking: scherm tekstformaat grafisch formaat SCREEN 0 80 x 25 niet grafisch SCREEN 12 80 x 30 640 x 480 pixels SCREEN 13 40 x 25 320 x 200 pixels Met SCREEN 13 heb je de meeste mogelijkheden om kleuren te variëren. Voor de programma’s in deze cursus is SCREEN 12 goed. HET ENE SCHERM IS HET ANDERE NIET De coördinaten van een scherm beginnen standaard linksboven met (0,0). Met SCREEN 12 heb je dan rechts beneden de coördinaten (639, 479). Bij het tekenen van grafieken is het handig als je zelf de coördinaten van het scherm kunt vastleggen. Dat kan met de opdracht WINDOW. Voor het tekenen van een grafiek met een verticale as (y-as) van -5 tot 10 en een horizontale as (x-as) van -4 tot 4 kan de opdracht WINDOW (-4, -5) – (4, 10) gebruikt worden. Op deze manier ligt het punt (-4, -5) links beneden en (4, 10) rechts boven. Lijnen tekenen kan met de opdracht LINE. 17.1 Lijnen tekenen17.1 Lijnen tekenen17.1 Lijnen tekenen17.1 Lijnen tekenen SCREEN 12 CLS FOR X = 0 TO 450 STEP 10 LINE (0, 0)-(600, X) 'lijn trekken van ... naar NEXT X 'van links boven naar rechts beneden SLEEP 3 'even wachten voor tweede gedeelte CLS WINDOW (0, 0)-(639, 199) 'coördinaten aanpassen menu: CLS COLOR 11 INPUT "Kies uit mogelijkheid 0 (stoppen), 1, 2, 3, 4, 5 of 6"; k SELECT CASE k 'variaties in lijnen tekenen CASE 0: END CASE 1 FOR X = 0 TO 250 STEP 10 LINE (X, 0)-(600, X), 7 'variatie 1 NEXT X CASE 2 FOR X = 0 TO 250 STEP 10 LINE (3 * X, 0)-(600, X), 7 'variatie 2 NEXT X

Page 47: Cursus programmeren in QuickBasic 4.5

45

CASE 3 FOR X = 0 TO 250 STEP 10 LINE (3 * X, 0)-(600, X), 7 'variatie 3 LINE (0, X)-(3 * X, 199), 7 NEXT X CASE 4 FOR X = 0 TO 637 STEP 13 LINE (0, X)-(639 - X, 0), 7 'variatie 4 LINE (X, 199)-(639, 199 - X), 7 NEXT X CASE 5 FOR X = 0 TO 300 STEP 10 LINE (X, X / 1.5)-(300 + X, 199 - X / 1.5), 7 'variatie 5 NEXT X CASE 6 FOR X = 0 TO 620 STEP 62 FOR Y = 0 TO 620 STEP 62 LINE (X, 0)-(620 - Y, 199), 7 'variatie 6 NEXT Y NEXT X END SELECT WHILE INKEY$ = "": WEND GOTO menu END Opdracht bij programma 17.1 • Start het programma met de code erbij en probeer iedere variatie te

begrijpen. Verander zonodig wat in de variaties en kijk wat het effect is. SNEL EEN RECHTHOEK IN ELKAAR DRAAIEN Als je vier lijnen met elkaar verbindt, kun je een rechthoek tekenen. Gelukkig heeft de LINE-opdracht een ingebouwde functie om rechthoeken te tekenen. Je geeft de coördinaten van linker bovenhoek en rechter benedenhoek en voegt een B toe (van Block) op de volgende manier:

LINE (x1, y1) - (x2, y2), , B Tussen de twee komma's kan een kleur�waarde ingevuld worden. De rechthoek kun je 'dicht' maken door BF toe te voegen (Block Fill). Zie programma 17.2. 17.2 Een rechthoek tekenen17.2 Een rechthoek tekenen17.2 Een rechthoek tekenen17.2 Een rechthoek tekenen SCREEN 12 CLS LINE (0, 0)-(150, 70), 3, B LINE (200, 120)-(400, 180), 6, BF END

Page 48: Cursus programmeren in QuickBasic 4.5

46

HOOFDSTUK 18HOOFDSTUK 18HOOFDSTUK 18HOOFDSTUK 18 GRAFISCHE MOGELIJKHEDEN (2): PSETGRAFISCHE MOGELIJKHEDEN (2): PSETGRAFISCHE MOGELIJKHEDEN (2): PSETGRAFISCHE MOGELIJKHEDEN (2): PSET WE ZETTEN DE PUNTJES OP DE i Als je een grafiek of kromme wilt weergeven op het scherm, is het prettig als je dit met puntjes kunt doen in plaats van lijntjes. Met PSET (x, y) kun je een punt zetten op de coördinaten x en y. Het programma 18.2 geeft een aantal voorbeelden. Nieuw hierin is de opdracht GOSUB. Voor iedere grafiek moet het assenstelsel aangepast worden. Deze herhaalde opdracht staat in een sub-routine met de naam XYas. Na GOSUB XYas worden eerst de opdrachten uitgevoerd die in de subroutine staan. Na RETURN keert het programma terug waar het gebleven was. Een eenvoudig voorbeeld ter illustratie. 18.1 18.1 18.1 18.1 HHHHet gebruik van GOSUBet gebruik van GOSUBet gebruik van GOSUBet gebruik van GOSUB CLS PRINT "Hallo. Hoe gaat het?" GOSUB Antwoord SLEEP 1 PRINT "Ook goed." END Antwoord: SLEEP 1 PRINT "Goed. En met jou?" RETURN Opdracht bij programma 18.1 • Verwijder END en kijk wat dit oplevert. Verklaring? Programma 18.2 maakt gebruik van een keuzemenu. Door het invoeren van een cijfer kun je kiezen uit zes grafieken. Iedere programmastap zou je nu moeten snappen. Het programma is vrij lang. Zorg er voor dat je geen fouten maakt bij het intypen. 18.2 Voorbeelden van het gebruik van PSET.18.2 Voorbeelden van het gebruik van PSET.18.2 Voorbeelden van het gebruik van PSET.18.2 Voorbeelden van het gebruik van PSET. SCREEN 12 pi = ATN(1) * 4 'manier om pi te berekenen DO CLS LOCATE 4 PRINT TAB(30); "Maak een keuze:" PRINT TAB(30); "---------------" FOR i = 1 TO 6 PRINT TAB(30); i; " grafiek"; i NEXT i PRINT TAB(31); "7 stoppen" LOCATE 20, 8 PRINT "Druk op een toets als de grafiek klaar is." DO i$ = INKEY$ LOOP UNTIL i$ > "0" AND i$ < "8" SELECT CASE i$ CASE "1" x = -7: y = 2 GOSUB XYas FOR x = -2 * pi TO 2 * pi STEP .05 y = SIN(x) PSET (x, y) NEXT x

Page 49: Cursus programmeren in QuickBasic 4.5

47

CASE "2" x = 22: y = 10 GOSUB XYas FOR t = -5 * pi TO 5 * pi STEP .02 x = t * COS(t) y = .5 * t * SIN(t) PSET (x, y) NEXT t CASE "3" x = 7: y = 1.5 GOSUB XYas FOR t = -2 * pi TO 2 * pi STEP .01 x = t * COS(t) y = SQR(ABS (t)) / 2 * SIN(t) PSET (x, y) NEXT t CASE "4" x = 1.5: y = 1.5 GOSUB XYas FOR t = 0 TO 2 * pi STEP .01 y = COS(4 * t) * COS(t) x = 2 * SIN(t) * COS(t) PSET (x, y) NEXT t CASE "5" x = 1.5: y = 1.5 GOSUB XYas FOR t = 0 TO 2 * pi STEP .005 y = COS(4 * t) * COS(t) x = COS(4 * t) * SIN(t) PSET (x, y) NEXT t CASE "6" x = 3: y = 1 GOSUB XYas FOR t = -2 * pi TO 2 * pi STEP .005 y = SIN(4 * t) * COS(.5 * t) x = t * SIN(t) * COS(t) PSET (x, y) NEXT t CASE "7" SCREEN 0: END END SELECT SOUND 100, 2 WHILE INKEY$ = "": WEND LOOP XYas: CLS WINDOW (-x, -y)-(x, y) LINE (-x, 0)-(x, 0) LINE (0, -y)-(0, y) RETURN Opmerking: SIN = sinus; COS = cosinus; ABS = absolute waarde; SQR = wortel

Page 50: Cursus programmeren in QuickBasic 4.5

48

HOOFDSTUK 19HOOFDSTUK 19HOOFDSTUK 19HOOFDSTUK 19 GRAFISCHE MOGELIJKHEDEN (3): DRAWGRAFISCHE MOGELIJKHEDEN (3): DRAWGRAFISCHE MOGELIJKHEDEN (3): DRAWGRAFISCHE MOGELIJKHEDEN (3): DRAW Een figuur tekenen met alleen maar LINE is erg omslachtig. Je kunt dan beter het veelzijdige commando DRAW gebruiken. Achter DRAW komt een string te staan. Dit kan zijn in de vorm van DRAW " .... " of DRAW A$. Beide manieren staan als voorbeeld in programma 19.1. Tip bij het intypen: Typ één keer "GOSUB wacht" in, sla het op in het geheugen met <Ctrl><Ins> en zet het iedere keer op het scherm met <Shift><Ins>. 19.1. De mogelij19.1. De mogelij19.1. De mogelij19.1. De mogelijkheden van DRAWkheden van DRAWkheden van DRAWkheden van DRAW SCREEN 12 CLS PSET (320, 100): GOSUB wacht 'zet punt op 320, 100 DRAW "u14": GOSUB wacht 'teken 14 pixels omhoog DRAW "l16": GOSUB wacht 'teken 16 pixels naar links DRAW "d20": GOSUB wacht 'teken 20 pixels omlaag DRAW "r40": GOSUB wacht 'teken 40 pixels naar rechts DRAW "e25": GOSUB wacht 'teken ze diagonaal (up, right) DRAW "f30": GOSUB wacht ' idem (down, right) DRAW "g50": GOSUB wacht ' idem (down, left) DRAW "hl5": GOSUB wacht ' idem (up, left) DRAW "m160,120": GOSUB wacht 'teken lijn naar punt 160,120 DRAW "bu70": GOSUB wacht 'ga 70 pixels omhoog (teken NIET) DRAW "m-20,40": GOSUB wacht 'ga 20 naar links en 40 omlaag DRAW "ne75": GOSUB wacht '75 diagonaal en keer terug DRAW "nm500,150": GOSUB wacht 'naar punt 500,150 en keer terug DRAW "l20": GOSUB wacht '20 naar links CLS PSET (320, 100): GOSUB wacht DRAW "a1l": GOSUB wacht 'draai vanaf nu alles 90° DRAW "u14": GOSUB wacht '14 omhoog?? Nee dus, gedraaid! DRAW "e40": GOSUB wacht 'diagonaal ook gedraaid. PSET (50, 50): GOSUB wacht 'zet punt op 50,50 DRAW "ta34u14": GOSUB wacht '14 omhoog en draai dit 34° DRAW "ta-58u30": GOSUB wacht '30 omhoog en draai dit -58° PSET (500, 120): GOSUB wacht 'zet punt op 500,150 DRAW "a0" 'zet de draaiing uit m$ = "u50 l50 d50 r50 h50 e25 f25 g50" DRAW m$ 'gebruik een string END wacht: WHILE INKEY$ = "": WEND RETURN Opmerkingen bij programma 19.1 • Uit dit programma zou duidelijk moeten zijn welke mogelijkheden je met DRAW

hebt. Zo niet, maak dan een eigen programma, waarin je zelf een aantal mogelijkheden onderzoekt. Of gebruik de help van QuickBASIC (met voor-beelden). Alle letters mogen overigens ook in hoofdletters worden gegeven.

• Bij het instellen van de hoek ("A") heb je de mogelijkheden "A0" t/m "A3", waarbij je iedere keer 90° verder draait.

• Bij "TA" kun je zelf de hoek instellen, maar die moet liggen tussen -360° en +360°.

• Kleuren instellen kan met "C".

Page 51: Cursus programmeren in QuickBasic 4.5

49

HET DRAAIENDE VIERKANT. Je kunt met het variëren van de hoek en de kleuren een voorwerp laten draaien. De hoek laat je steeds lopen van 0° tot 360° en het voorwerp teken je en wis je om en om (wissen met C0 = zwart). Het onderstaande programma is hier een voorbeeld van. 19.2 Een voorwerp laten roteren19.2 Een voorwerp laten roteren19.2 Een voorwerp laten roteren19.2 Een voorwerp laten roteren SCREEN 12 CLS V$ = "R80 D40 L80 U40" 'string voor een vierkant A = 0 'beginhoek instellen op 0° LOCATE 24, 25 PRINT "Druk op een toets om te stoppen."; DO PSET (320, 80) 'beginpunt op 320, 80 DRAW "C7 TA" + STR$(A) + V$ 'teken rechthoek (C7 = wit) DRAW "C0 TA" + STR$(A) + V$ 'wis rechthoek (C0 = zwart) A = (A + 10) MOD 360 'hoek wordt 10 graden meer LOOP WHILE INKEY$ = "" 'wacht op invoer END Toelichting bij programma 19.2 Het meest interessant in dit programma zijn de DRAW-opdracht en het variëren van de hoek. Eerst iets over die hoek. Een hoek steeds 10 graden groter laten worden kan met A = A + 10. Maar A mag niet meer zijn dan 360°. Dus zou je kunnen toevoegen: IF A = 360 THEN A = 0, maar veel eleganter is: A = (A + 10) MOD 360. A = de rest (als geheel getal) die overblijft als je A + 10 deelt door 360. In een overzichtje staat hoe A verandert: Oude waarde Berekening: Resultaat van A: (= nieuwe waarde van A): 0 (0+10)\360=0 rest = A = 10 - 0 = 10 10 (10+10)\360=0 rest = A = 20 - 0 = 20 20 (20+10)\360=0 rest = A = 30 - 0 = 30 350 (350+10)\360=1 rest = A = 360 – 360 = 0 Onthoud deze truc! Dan nog iets over de DRAW-opdracht. Van de hoek wordt een string gemaakt in de opdracht STR$(A). Deze string wordt samen met V$ opgeteld bij de andere string, zodat er zoiets staat als (stel A = 10):

DRAW "C7 TA10 R80 D40 L80 U40" ‘ en dat is precies wat de bedoeling was.

Page 52: Cursus programmeren in QuickBasic 4.5

50

HOOFDSTUK 20HOOFDSTUK 20HOOFDSTUK 20HOOFDSTUK 20 GRAFISCHE MOGELIJKHEDEN (4): CIRKELS EN ELLIPSENGRAFISCHE MOGELIJKHEDEN (4): CIRKELS EN ELLIPSENGRAFISCHE MOGELIJKHEDEN (4): CIRKELS EN ELLIPSENGRAFISCHE MOGELIJKHEDEN (4): CIRKELS EN ELLIPSEN DE VICIEUZE CIRKEL. Het is zeer eenvoudig om de computer een cirkel te laten tekenen. Typ hiervoor het volgende programma in: 20.1 Cirkels tekenen20.1 Cirkels tekenen20.1 Cirkels tekenen20.1 Cirkels tekenen SCREEN 12 CLS CIRCLE (320, 100), 50 CIRCLE (100, 50), 8 END Toelichting bij programma 20.1 Het zal duidelijk zijn dat je na CIRCLE tussen haakjes de coördinaten van het middelpunt aangeeft en daar achter de straal (in pixels). Probeer zelf maar eens wat andere cirkels te maken. Met een FOR...NEXT�lus kun je weer leuke effecten creëren. 20.2 Cirkels in een FOR...NEXT20.2 Cirkels in een FOR...NEXT20.2 Cirkels in een FOR...NEXT20.2 Cirkels in een FOR...NEXT----luslusluslus SCREEN 12 CLS FOR R = 0 TO 200 STEP 5 CIRCLE (320, 100), R NEXT R WHILE INKEY$ = "": WEND END Opdrachten bij programma 20.2 • Waartoe dient de WHILE...WEND-opdracht? • Verander de CIRCLE-opdracht in: CIRCLE (200 + R, 100), R en start opnieuw. • Verander de CIRCLE�opdracht in: CIRCLE (3 * R, R), R en start opnieuw. 20.3 Cirkels rondom het midden van het scherm20.3 Cirkels rondom het midden van het scherm20.3 Cirkels rondom het midden van het scherm20.3 Cirkels rondom het midden van het scherm SCREEN 12 CLS pi = ATN(1) * 4 FOR R = 5 TO 360 STEP 5 H = pi * R / 180 X = 300 - INT(150 * COS(H)) Y = 100 - INT(50 * SIN(H)) CIRCLE (X, Y), 50 NEXT R WHILE INKEY$ = "": WEND END Opdracht bij programma 20.3 • Verander de CIRCLE-opdracht in: CIRCLE (X, Y), R / 5 ER IS ER EEN JARIG ... Een taart is meestal rond. Als je een stuk taart neemt, is dat stuk een deel van een cirkel: een segment. Dergelijke taartstukken kun je ook door de PC laten tekenen.

Page 53: Cursus programmeren in QuickBasic 4.5

51

20.4 Cirkelsegmenten20.4 Cirkelsegmenten20.4 Cirkelsegmenten20.4 Cirkelsegmenten SCREEN 12 pi = ATN(1) * 4 CLS CIRCLE (100, 25), 50, 2, 0, pi / 2 CIRCLE (400, 25), 50, 3, -.01, -pi / 2 CIRCLE (100, 50), 75, 4, pi, 2 * pi CIRCLE (400, 50), 75, 5, -pi, -2 * pi CIRCLE (100, 120), 100, 6, 4 / 3 * pi, 5 / 3 * pi CIRCLE (400, 120), 100, 7, -4 / 3 * pi, -5 / 3 * pi END Toelichting bij programma 20.4 De volledige CIRCLE-opdracht ziet er als volgt uit: CIRCLE (X, Y), straal, kleur, beginhoek, eindhoek, assenquotiënt Hierin is X de x-coördinaat en Y de y-coördinaat. De laatste twee waarden in de CIRCLE-opdracht van programma 20.4 betreffen de begin- en de eindhoek van de cirkel. Deze hoek moeten worden weergeven in radialen. Hierbij geldt: 180° ≙ π radialen. Als deze waarden negatief zijn, wordt ook een lijnstuk naar het midden van de cirkel getrokken. Let op dat dit niet mogelijk is met 0 radialen. Vandaar dat in de tweede CIRCLE-opdracht -.01 gebruikt is. Experimenteer zelf met andere waarden. Met de laatste optie, het assenquotiënt, geef je de verhouding van de x- en y-straal aan. Eenvoudiger gezegd: door hier een bepaalde waarde in te vullen, krijg je een ellips. Zie programma 20.5. 20.5 Ellipsen20.5 Ellipsen20.5 Ellipsen20.5 Ellipsen SCREEN 12 CLS FOR i = 0 TO 4 CIRCLE (50 + i * 120, 50), 50, 2, , , 1 / (i + 1) CIRCLE (50 + i * 120, 150), 30, 14, , , (i + 1) / 5 NEXT i END Opdrachten bij programma 20.5 • Blijft er op één regel een bepaalde lengte (x of y) constant? • Experimenteer met andere verhoudingen. Leg uit waarom de verhouding 1 GEEN

cirkel oplevert. • Zoek uit welke verhouding je moet gebruiken om een cirkel te krijgen. • Experimenteer ook met segmenten van ellipsen (zie 20.4).

Page 54: Cursus programmeren in QuickBasic 4.5

52

HOOFDSTUK 21HOOFDSTUK 21HOOFDSTUK 21HOOFDSTUK 21 ZELF PROGRAMMA'S MAKEN (3)ZELF PROGRAMMA'S MAKEN (3)ZELF PROGRAMMA'S MAKEN (3)ZELF PROGRAMMA'S MAKEN (3) 1 Maak een programma waarmee je tegen iemand anders Boter, Kaas en Eieren

kunt spelen. Geef de negen vakjes een nummer, zodat je door het invoeren van een cijfer kunt aangeven welk vakje je kiest. De PC moet zelf kunnen bepalen of een kruisje of een rondje getekend moet worden. Probeer ook of de PC het einde van het spel kan vaststellen.

Nu volgen wat moeilijke opdrachten. Als je hier zonder al te veel moeite uit komt, kun je je met recht een gevorderd programmeur noemen! 2 Schrijf een programma dat het scherm in vakjes verdeelt met links en

beneden de coördinaten. Door de x- en y-coördinaat in te voeren moet het betreffende vakje wit gekleurd worden. Nogmaals invoeren van deze coördinaten moet het vakje weer zwart maken. Op deze manier kun je een bepaald patroon maken. Bepaal zelf in hoeveel vakjes je het scherm wilt verdelen. Gebruik indien nodig de WINDOW-opdracht.

3 Pas het programma van opdracht 2 aan, zodat je met de cursortoetsen over

de vakjes kunt "lopen". Afwisselend drukken op de spatiebalk moet het vakje wit en zwart kleuren.

4 Maak een tekenprogramma. Met de besturingstoetsen (op het numerieke

toetsenbord) moet je lijnen kunnen trekken (gebruik DRAW). Probleem hierbij is hoe het 'potlood' over het scherm te verplaatsen, zonder dat er een lijn getrokken wordt? Een onelegante manier is toch een lijn te tekenen, maar dan in het zwart. Dit is niet erg netjes, want gedeeltes van reeds getekende lijnen kunnen dan worden gewist. Het volgende probleem is dan direct: hoe weet je waar je bent op het scherm als je geen lijn trekt? Je zou onderin beeld de coördinaten van het punt waar je bent kunnen weergeven. Dit is niet erg praktisch, maar voorlopig de enige oplossing.

5 Verander het programma van opdracht 4, zodat je nu ook cirkels en

rechthoeken (al dan niet gevuld) kunt tekenen. Bijvoorbeeld dat je op C moet drukken voor een cirkel waarna je dan middelpunt en straal kun opgeven. Bij een rechthoek geef je bijvoorbeeld de coördinaten van de linker bovenhoek en de rechter benedenhoek. Gebruik B voor een gewone rechthoek (Block) en F voor een gevulde rechthoek (Fill).

6 Schrijf een programma waarmee je een kleine cirkel over het scherm laat

bewegen zoals een biljartbal over een biljarttafel beweegt. Gebruik dus de randen van het scherm als stootband. Laat de hoek van terugkaatsing iets groter of kleiner zijn dan van de hoek van inval. Los hierbij de volgende problemen op: de juiste richting bepalen na het raken van een rand; zorgen dat de cirkel niet van het scherm afloopt.