home *** CD-ROM | disk | FTP | other *** search
/ RUN Flagazine: Run 12 / run12.zip / LES12GWB.ASC < prev    next >
Text File  |  1994-05-04  |  27KB  |  404 lines

  1.                            Les 12  GW/QBasic
  2.  
  3.                       DEF FN: Zelf functies maken                           
  4.  
  5. Zowel GW- als QBasic bieden de programmeur veel meer functies dan de be-
  6. langrijkste die tot nu toe in deze vervolgcursus zijn behandeld. Er zijn
  7. legio naslagboeken die ze opsommen en met voorbeeldjes toelichten.
  8. Aanvankelijk zal iedere enigszins gevorderde programmeur menen dat Basic zó
  9. veel functies bevat dat je er alles in kunt programmeren wat een mens maar
  10. bedenken kan. Toch mist de GW/QBasic-programmeur veel van de weelde aan mo-
  11. gelijkheden waarover de QuickBasic en PowerBasic programmeurs beschikken.
  12. U houdt dat nog tegoed tot het moment waarop u zelf gaat merken dat u aan
  13. de Basic-interpreters tekort gaat komen.
  14. Veel functies moeten in gewoon Basic moeizaam worden geprogrammeerd en uit-
  15. geschreven waarvoor in PowerBasic met een enkel commando kan worden vol-
  16. staan. Een voorbeeld is het sorteren van arrays. Daarvoor moet een stukje
  17. programma worden geschreven in een SUB of Subroutine. In PowerBasic bestaat
  18. daarvoor een ingebouwde functie: ARRAY SORT Arraynaam().
  19. Een ander voorbeeld is de processor-onafhankelijke wachtlus.
  20.  
  21. Wait a second                                                               
  22.  
  23. Wanneer u in uw programma een tekst of een voorstelling enkele seconden
  24. wilt laten staan zonder dat de gebruiker daarop kan ingrijpen, wordt in
  25. GWBasic vaak de loze FOR/NEXT-loop gebruikt:
  26.  
  27. FOR A=1 TO 50000:NEXT A                                                     
  28.  
  29. Als u dit loopje op uw 286-PC hebt getest en bijgesteld en u bent tevreden
  30. over de wachtduur, houdt u uzelf voor de gek. Als uw programma met dit
  31. soort wachtlussen op een trage PC/XT wordt gedraaid, duren uw wachtlussen
  32. 'eeuwigheden'. Op een snelle 486-PC op een kloksnelheid van 50 MHz zijn ze
  33. in minder dan een oogwenk voorbij.
  34. Nee, dan heeft de PowerBasic-programmeur het heel wat gemakkelijker. Om een
  35. wachttijd van twee seconden te krijgen schrijft hij:
  36.  
  37. DELAY 2                                                                     
  38.  
  39. met als resultaat: exact twee seconden oponthoud, ongeacht het type PC en
  40. de kloksnelheid waarop zijn programma draait.
  41. Toch kunt u ook in GW/QBasic een processor-onafhankelijke wachtloop inbou-
  42. wen als u gebruik maakt van de microtimer die op de systeemklok loopt. Deze
  43. timer geeft pulsen die Basic kan tellen. Het gaat dan wel een stuk ingewik-
  44. kelder dan in PowerBasic:
  45.  
  46. 10 REM TIJDLOOP VOOR TWEE SECONDEN                                          
  47. 20 T=TIMER + 2:' SYSTEM TIME PLUS 2 SEC                                     
  48. 30 WHILE T > TIMER                                                          
  49. 40 WEND                                                                     
  50.  
  51. Als u in uw programma meermalen een wachttijd van twee seconden wilt ge-
  52. bruiken, maakt u van dit programmastukje uiteraard een subroutine. Maar
  53. wat nu als u de ene keer één, de volgende keer vijf en dan weer drie se-
  54. conden wilt laten wachten? Even veel subroutines met Timers aanmaken?
  55. Natuurlijk niet. U mist nu een functie die met een variabele instelbaar
  56. is, zoals in: DELAY n.
  57. Programeertaalarmoede? Niet helemaal. U kunt functies zelf maken. Dat wil
  58. zeggen dat u GW/QBasic zelf kunt uitbreiden met extra commando's maar dan
  59. moet u ze wel zelf bedenken en definiëren.
  60.  
  61. Doe 't zelf                                                                 
  62.  
  63. Eerlijk gezegd is DEF(ine) F(unctio)N een moeilijk onderwerp. Dat zal ook   
  64. wel de reden zijn dat er in GW/QBasic-programma's zo weinig gebruik van
  65. wordt gemaakt. Jammer, want het is een zeer krachtig gereedschap, zij het
  66. dat zelf gemaakte functies in GW/Q maar heel klein kunnen zijn. In een
  67. Basic-compilertaal kunnen DEF FN's zich over meer dan één programmaregel
  68. uitstrekken.
  69. Omdat dit onderwerp wat lastig is, beginnen we met een simpel voorbeeld.
  70. In een programma hebben we om de haverklap een numerieke variabele nodig
  71. waarin een willekeurig gekozen (random) geheel (integer) getal onder de
  72. 10 moet staan.
  73. U weet hoe dat normaal moet:
  74.  
  75. 10 RANDOMIZE TIMER                                                          
  76. 20 X = INT(RND*10)                                                          
  77. 30 PRINT X                                                                  
  78.  
  79. Nu kunnen we hier een subroutine van maken en deze telkens aanroepen als
  80. we een getal onder de 10 in de variabele X willen hebben maar met een zelf
  81. gemaakte functie kan het ook:
  82.  
  83. 10 RANDOMIZE TIMER                                                          
  84. 20 DEF FN GETAL = (INT(RND*10))                                             
  85. 30 PRINT "Een willekeurig getal onder de 10 is:";                           
  86. 40 PRINT FN GETAL
  87.  
  88. Experimenteer hiermee en als u het begint te begrijpen, bestudeer dan het
  89. volgende voorbeeld.
  90.  
  91. In een programma willen we een tekstje lang genoeg op 't scherm laten staan
  92. zodat het rustig kan worden gelezen. Daarvoor hebben een leestijd van vijf
  93. seconden getimed. Deze vijf seconden moeten dus processor-onafhankelijk
  94. zijn en op elke PC ook exact vijf seconden duren.
  95.  
  96. 10 REM TEKST BLIJFT 5 SECONDEN OP HET SCHERM STAAN                          
  97. 20 CLS                                                                      
  98. 30 DEF FN WACHT = TIMER + 5                                                 
  99. 40 LOCATE 10,1                                                              
  100. 50 PRINT "U krijgt precies vijf seconden de tijd om deze tekst te lezen."   
  101. 60 T = FN WACHT                                                             
  102. 70  WHILE T > TIMER                                                         
  103. 80     LOCATE 1,5:PRINT "T = ";T
  104. 90     LOCATE 2,1:PRINT "TIMER = ";TIMER                                    
  105. 100 WEND                                                                    
  106. 110 BEEP                                                                    
  107. 120 LOCATE 10,1                                                             
  108. 130 PRINT SPACE$(80)                                                        
  109. 140 LOCATE 10,1                                                             
  110. 150 PRINT "De leestijd van vijf seconden is voorbij."                       
  111. 160 END                                                                     
  112.  
  113. Meer DEF FN-voorbeelden                                                     
  114.  
  115. Voorbeelden zijn als plaatjes in een boek: ze kunnen ingewikkelde zaken in
  116. één oogopslag duidelijk maken.
  117. In een financieel programma worden BTW-percentages berekend. Hiervoor maken
  118. we gebruik van een zelf gedefinieerde functie:
  119.  
  120. 100 REM BTW-BEREKENING
  121. 110 DEF FN BTW(X) = X * .175                                                   
  122. 120 INPUT "17,5 % BTW over welk bedrag";Bedrag                                   
  123. 130 PRINT "De BTW over";Bedrag;"bedraagt:";                                      
  124. 140 PRINT USING "#####.##";FN BTW(Bedrag)                                           
  125.  
  126.                                LET OP                                       
  127.  
  128. Het is mogelijk gegevens uit te wisselen tussen de definiërende functie
  129. (DEF FN) en de vragende functie (FN). Laat ik proberen dat duidelijk te
  130. maken aan de hand van een voorbeeld en een schemaatje.
  131. Eerst het voorbeeld:
  132. We schrijven een educatief programma waarin we de gebruiker bij zijn voor-
  133. en achternaam willen noemen. Zo'n programma begint altijd met een soort
  134. kennismaking:
  135.  
  136.                           Hoe is je naam?                                   
  137. [LINE INPUT NAAM$]
  138.  
  139. De bedoeling is dat de gebruiker zijn voornaam invoert en dat zal meestal
  140. ook wel gebeuren maar niets is zo onvoorspelbaar als het gedrag van een
  141. computergebruiker. We moeten er rekening mee houden dat hij zijn voor- en
  142. achternaam zal invoeren:
  143.  
  144.                           Hoe is je naam? Johan van der Heijden             
  145.  
  146. en het programma antwoord nu heel plichtmatig:
  147.  
  148. [PRINT]                                                                     
  149.                           Dag Johan van der Heijden                         
  150.  
  151. Dergelijke dingen kunnen we 'fool proof' (klunsvast) maken met een DEF FN.
  152. Dit is het programma:
  153.  
  154. 100 CLS 
  155. 110 DEF FN X$(NAAM$)=LEFT$(NAAM$,INSTR(NAAM$," "))                          
  156. 120 LOCATE 12,13:LINE INPUT "Wat is je naam? ";NM$                          
  157. 130 NM$=NM$+" "                                                             
  158. 140 LOCATE 14,13:PRINT "Hallo ";FN X$(NM$)                                  
  159.  
  160. De uitvoering van dit programma gaat zoals we dat willen:
  161.  
  162.                           Wat is je naam?  Peter van de Boogaard            
  163.  
  164.                           Hallo Peter                                       
  165.  
  166. In de DEF FN is een stringbewerking toegepast met LEFT$. Gezocht is naar de
  167. eerste spatie omdat die de voornaam scheidt van de achternaam of -namen.
  168. Dat eerste stuk hebben we nodig omdat dit een voornaam is.
  169. Er kan alleen iets fout gaan wanneer de gebruiker het toch goed doet en al-
  170. léén zijn voornaam invoert. Daarom wordt in regel 130 voor alle zekerheid
  171. nog een spatie aan NM$ toegevoegd. Daarmee kan de DEF FN onder alle omstan-
  172. digheden zijn werk doen.
  173. Om de DEF FN goed te laten functioneren moet hij de invoerstring hebben.
  174. Die ontvangt hij in: (NAAM$) achter X$. Als 'doorgeefluik' fungeert de in-
  175. voerstring NM$. Wanneer FN in regel 140 wordt aangeroepen wordt eerst de
  176. ingevoerde string NM$ in NAAM$ geplaatst. Het resultaat in NAAM$ wordt de
  177. voornaam volgens de formule van de DEF FN. Dit resultaat wordt weer terug-
  178. geplaatst in X$(NM$) in regel 140.
  179.  
  180.  
  181.  
  182.              ┌───────────────┐                    ┌───────────────┐
  183.              │             ──┴─     ──────────────┴────────────   │
  184.              │   DEF FN X$(NAAM$) = LEFT$(NAAM$,INSTR(NAAM$," ")) │
  185.              └──────────────────────────────────┐                 │
  186.                                                ─┴─                │
  187.                  LINE INPUT "Wat is uw naam? ";NM$ (Kees de Boer) │
  188.                                                                   │
  189.                                                                   │
  190.                  PRINT "Hallo ";FN X$(NM$)         (Kees)         │
  191.                                 ─────┬───                         │
  192.                                      └────────────────────────────┘
  193.  
  194.                                  ┌──────────┐                               
  195. ┌────────────────────────────────┤ INSTRING ├─────────────────────────────┐ 
  196. │                                └──────────┘                             │ 
  197. │  De gebruikte tekstbewerking met INSTR in het bovenstaande schema be-   │ 
  198. │  hoeft enige toelichting.                                               │ 
  199. │  INSTR is een machtig middel om in een gegeven tekststring (de z.g.     │ 
  200. │  target- of doelstring) de positie van een andere string (de zoek-      │ 
  201. │  string) te bepalen. Zowel target- als zoekstring kunnen gewone strings │ 
  202. │  zijn zoals "Flagazine", als elementen uit een tekstarray: TXT$(n).     │ 
  203. │  Als we willen weten waar in de string: "RUN Flagazine" de hoofdletter  │ 
  204. │  F van Flagazine begint omdat we het stukje van de string "RUN" willen  │ 
  205. │  weghalen om alleen "Flagazine" over te houden, moeten we eerst de      │ 
  206. │  plaats in de string bepalen:                                           │ 
  207. │                                                                         │ 
  208. │                          Y = INSTR("RUN Flagazine","F")                 │ 
  209. │                                                                         │ 
  210. │  In dit geval krijgt de variabele Y de waarde 5. Op positie 5 van       │ 
  211. │  de string: "RUN Flagazine" begint een woord dat met "F" begint.        │ 
  212. │  Vervolgens kunnen we dat stringstukje isoleren met:                    │ 
  213. │                                                                         │ 
  214. │                          X$ = MID$("RUN Flagazine",Y)                   │ 
  215. │                                                                         │ 
  216. │  waarna X$ het deel van de string: "Flagazine" zal bevatten.            │ 
  217. │  Zoals uit de DEF FN-constructie blijkt, kan INSTR ook worden ingebed   │ 
  218. │  in een LEFT$, RIGHT$ of MID$-constructie maar dat is in de praktijk    │ 
  219. │  soms wel even puzzelen en proberen maar lukken doet 't altijd!         │ 
  220. └─────────────────────────────────────────────────────────────────────────┘ 
  221.  
  222. Juist die kleine handigheidjes                                              
  223.  
  224. Een random getal, een stukje tekstbewerking, een berekening met variabelen
  225. en meer van die handigheidjes die je zo maar te binnen kunnen schieten, le-
  226. nen zich vrijwel altijd voor een DEF FN. Ook als onderdeel van ingewikkel-
  227. der berekeningen kunnen ze van groot nut zijn. In sommige gevallen kan een
  228. DEF FN een complete algoritme bevatten en in feite is deze functie daarvoor
  229. ook bedoeld.
  230. Dat wil niet zeggen dat DEF FN zaligmakend is. Soms kunt u kiezen tussen
  231. twee of meer mogelijkheden. Als u van een getal in een variable de schrijf-
  232. wijze met twee decimalen achter de komma wilt weergeven, kunt u dat met een
  233. DEF FN doen maar ook met een PRINT USING "####.##"
  234. Beide hebben hun voor- en nadelen. Bij PRINT USING "####.##" krijgt u van
  235. elk getal de gevraagde schrijfwijze, dus ook van een integer getal. Als
  236. dit getal bijvoorbeeld 100 is dan geeft de PRINT USING dit weer als:
  237. 100.00. Het nadeel is hier dat het aantal hekjes voor de punt maatgevend
  238. is. Wordt het weer te geven getal als gevolg van de berekening groter dan
  239. 9999 dan hebt u met deze PRINT USING een probleem omdat u dan vóór de deci-
  240. male punt hekjes te kort komt.
  241. Dit nadeel heeft nu niet wanneer u onderstaand programmaatje bestudeert.
  242. Het heeft een DEF FN voor het weergeven van getallen met twee decimalen:
  243.  
  244. 10 CLS:KEY OFF                                                              
  245. 20 DEF FN AFROND(X)=FIX(X*100 + SNG(X)/2)/100                               
  246. 30 INPUT "Hoeveel guldens zijn er";X                                        
  247. 40 PRINT "Dit delen we door 3:";X=X/3:PRINT X                               
  248. 50 PRINT "Ieder krijgt ";CHR$(159);:PRINT FN AFROND(X)                      
  249. 60 END                                                                      
  250.  
  251. Het nadeel van deze benadering is dat wanneer de variabele X na deling door
  252. 3 toevallig een geheel getal wordt, de FN AFROND geen decimalen met x.00
  253. kan laten zien zoals PRINT USING "####.##" dat weer wel doet.
  254.  
  255. Nog twee handigheidjes                                                      
  256.  
  257. Ik heb nog twee voorbeelden van 'kleine handigheidjes' die zich bij uitstek
  258. lenen voor DEF FN:
  259. In Turbo- en PowerBasic kunnen we een ingevoerde tekst heel gemakkelijk om-
  260. zetten naar kapitalen met UCASE$ en van kapitalen naar onderkast met LCASE$.
  261. GWBasic is niet zo rijk maar het kan natuurlijk met een DEF FN. In het on-
  262. derstaand programmaatje wordt de invoer van een tekst geaccepteerd. In de
  263. FOR/NEXT-loop wordt eerst gekeken of het teken valt tussen de ASC-waarden
  264. 61 tot en met 122 (a tot en met z). Als dit zo is wordt uit de FN de con-
  265. versie naar het kapitale equivalent geprint:
  266.  
  267. ┌─────────────────────────────────────────────────────────────────────────┐
  268. │  100 REM DEF FN VOOR SELECTIEVE TEKSTOMZETTING NAAR KAPITALEN           │ 
  269. │  110 CLS:KEY OFF:SCREEN 0,0                                             │ 
  270. │  120 DEF FN KAPITAAL = ASC(X$)-32:REM TREK 32 AF VAN DE ASCI-WAARDE     │ 
  271. │  130 PRINT "Voer een tekst in:":LINE INPUT A$:PRINT                     │ 
  272. │  140 FOR A%=1 TO LEN(A$)                                                │ 
  273. │  150  X$=MID$(A$,A%,1):X=ASC(X$)                                        │ 
  274. │  160  IF X < 123 AND X > 96 THEN PRINT CHR$(FN KAPITAAL); ELSE PRINT X$;│ 
  275. │  170 NEXT A%                                                            │ 
  276. └─────────────────────────────────────────────────────────────────────────┘
  277.  
  278. Het tweede voorbeeld is eveneens uit het leven gegrepen. Hoe vaak komt het
  279. niet voor dat de netheid van een programma vereist dat tekstregels keurig
  280. middenin de schermregel worden gezet. Vaak laat de programmeur dan zijn
  281. timmermansoog meewerken maar de regel blijft van kracht: Meten is weten;
  282. gissen is missen...
  283. Gecentreerde tekstregels worden voortaan consequent ook DAADWERKELIJK in
  284. het midden geplaatst met de DEF FN uit dit voorbeeldprogrammaatje:
  285.  
  286. ┌────────────────────────────────────────────────────────────────────────┐
  287.             100 REM DEF FN VOOR REGELCENTRERING                         
  288.             110 CLS:KEY OFF:SCREEN 0,0                                  
  289.             120 DEF FN MIDDENIN = INT(80-LEN(X$)/2)                     
  290.             130 X$="Hoofdstuk 1"                                          
  291.             140 LOCATE 3,FN MIDDENIN:PRINT X$                             
  292.             150 X$="Het ontstaan der soorten door natuurlijke selectie"   
  293.             170 LOCATE 5,FN MIDDENIN:PRINT X$                             
  294.             175 X$="Door Charles Darwin"                                  
  295.             176 LOCATE 7,FN MIDDENIN:PRINT X$                             
  296.             180 COLOR 0,7:LOCATE 25,1:PRINT SPACE$(80);                   
  297.             190 X$="Toets <Enter> voor vervolg"                           
  298.             200 LOCATE 25,FN MIDDENIN:PRINT X$;                           
  299.             210 WHILE INKEY$<>CHR$(13):WEND:COLOR 7,0:END                 
  300. └────────────────────────────────────────────────────────────────────────┘  
  301.  
  302. Grafisch DEF FN-nen                                                         
  303.  
  304. Er is veel mogelijk met DEF FN's. De ene DEF FN mag de andere aanroepen en
  305. ook is het is mogelijk om handig gebruik van een DEF FN te maken in een
  306. FOR/NEXT-loop. Voordelen van het gebruik van DEF FN's is dat de programma-
  307. code kleiner wordt en het programma zelf merkbaar sneller.
  308.  
  309. Nevenstaand stukje programma in  100 REM GRAFISCH EFFECTJE                  
  310. GWBasic speelt zich af in EGA    110 CLS:KEY OFF:SCREEN 9                   
  311. (Screen 9). In dit programma     120 DEF FN PUNT1=A MOD 6.28                
  312. worden door de FN's het begin-   130 DEF FN PUNT2=(A+.25) MOD 6.28          
  313. en eindpunt berekend van de cir- 140 FOR A=1 TO 175                         
  314. kelbogen. Het voordeel van de-   150 CIRCLE(320,175),A,13,FN PUNT1,FN PUNT2 
  315. ze werkwijze is dat het pro-     160 NEXT A                                 
  316. gramma klein blijft en aanzien-
  317. lijk sneller loopt dan wanneer een andere methode wordt toegepast.
  318.  
  319. Compileromgevingen                                                          
  320.  
  321. In 'hogere' Basics als TurboBasic, QuickBasic en PowerBasic en in beschei-
  322. denere mate QBasic is meer mogelijk met DEF FN.
  323. In GWBasic moet de DEF FN beperkt blijven tot één regel. In een compiler-
  324. omgeving daarentegen kunnen uitgebreidere functies worden gecomponeerd.
  325. Een voorbeeld is een zelfgemaakte functie voor het berekenen van facultei-
  326. ten van getallen vanuit een DEF FN in TurboBasic. Faculteiten zijn, zoals
  327. u weet, exploderende vermenigvuldigingen. De faculteit van 5 bijvoorbeeld,
  328. is 1 * 2 * 3 * 4 * 5 en wordt geschreven als: 5! en geeft als uitkomst 120.
  329. De algoritme daarvoor kan in een compilertaal in een meerregelige DEF FN
  330. worden ondergebracht en naar hartelust worden aangeroepen.
  331. Zo ziet de DEF FN voor faculteitsberekeningen eruit in TurboBasic. Let op
  332. dat niet voor niets van double precision variabelen (#) gebruik is gemaakt
  333. omdat bij grotere faculteitsberekeningen de resultaten tot ver boven de ui-
  334. terste grens van integers (65536) zullen uitstijgen. Met dubbele precisie
  335. gaat de getallen tot een hoogte van: TIEN TOT DE MACHT 308! Dit aantal is
  336. zeer groot. Veel groter zelfs dan er aantal elementaire deeltjes zijn in
  337. het heelal!
  338.  
  339. $STACK &H7FFF 'Er moet nogal wat ruimte op de stack worden gereserveerd     
  340.  
  341. Totaal# = 1                                                                 
  342.  
  343. DEF FN Factoren#(I#)   'Aanvang Functie                                     
  344. Totaal# = Totaal# * I#                                                      
  345.   IF I# > 1 THEN                                                            
  346.     S# = FN Factoren#(I# - 1)                                               
  347.   END IF                                                                    
  348. FN Factoren# = Totaal#                                                      
  349. END DEF                'Einde Functie.                                      
  350.  
  351. De DEF FN is meerregelig en wordt met END DEF afgesloten. Vervolgens kan
  352. onderstaand programmaatje van deze zelf gedefinieerde functie gebruik ma-
  353. ken:
  354.  
  355. PRINT "Geef het getal voor de factorenberekening: ";                        
  356. INPUT J%                                                                    
  357.  
  358. PRINT FN Factoren#(J%)                                                      
  359.  
  360. Opmerking: In dit geval wordt de zelf gedefinieerde functie in zichzelf
  361. aangeroepen. Dit wordt recursiviteit genoemd.
  362.  
  363. Tot besluit                                                                 
  364.  
  365. DEF FN's zijn bedoeld om er van te profiteren. Dat betekent dat u, voordat
  366. u gaat programmeren eerste eens even rustig moet nadenken over de te vol-
  367. gen strategie. Programmeren is en blijft plannen nadat het programmeer-
  368. idee is geboren en om een concrete vorm vraagt.
  369. Programmeren is dus niet met een half uitgewerkt idee achter de PC gaan
  370. zitten, GWBasic opstarten en al vast maar beginnen met:
  371.  
  372. 100 CLS:KEY OFF:SCREEN 9
  373.  
  374. en tijdens het schrijven wel zien hoe het idee verder uitgewerkt wordt.
  375. Deze werkwijze is typisch van onervaren beginners die dan ook typisch
  376. programma's bakken met een spaghetti-structuur. Aan de vele GOTO's is
  377. meestal te zien dat ze tijdens het schrijven van het programma voor al-
  378. lerlei onvoorziene omstandigheden lapmiddelen moeten inbouwen. Zo zeer
  379. zelfs dat ze later geen wijs meer kunnen worden uit hun eigen kronkel-
  380. structuren.
  381. Programmeren is eerst en vooral ontwerpen en plannen. Het coderen is eigen-
  382. lijk maar bijzaak. Tijdens het plannen vraagt de programmeur dingen af als:
  383. Welke subroutines ga ik gebruiken en nu ook: welke functies komen in aan-
  384. merking voor een zelf te maken DEF FN.
  385.  
  386. In de volgende Les 13 van deze beginnerscursus gaan we weer op de grafische
  387. toer. Gastdocent Koos van Egmond (bekend van Lingo, Boggle, PseudoRubic
  388. en nog meer grafische hoogstandjes uit de Flagazines) zal dan met voorbeel-
  389. den de geheimen van WINDOW en WINDOW SCREEN ontraadselen: een belangrijk    
  390. onderdeel in GW- en andere Basics waar velen mee worstelen.
  391. Het belooft een zeer geanimeerde en bovenal leerzame les te worden.
  392.  
  393. Tot de volgende les en... vergeet niet te experimenteren met DEF FN. Spel
  394. en experiment leiden naar inzicht en ten slotte naar slim gebruik.
  395. Het wordt nu trouwens ook de hoogste tijd dat de cursisten eens blijk ge-   
  396. ven van hun vorderingen in de Basic-programmeertaal. Schroom vooral niet    
  397. uw zelf gemaakte progjes op een disketje te zetten en op te sturen naar     
  398. RUN, Postbus 338, 2160 AH Lisse of in ons BBS TeleRUN te uploaden.          
  399. U krijgt altijd een reactie en diskettes sturen we ook terug, dus daar
  400. hoeft u niet wakker van te liggen.
  401. Uw inzendingen zijn voor de redaktie belangrijke stimulansen om door te
  402. gaan met deze cursus.
  403.  
  404.