home *** CD-ROM | disk | FTP | other *** search
/ RUN Flagazine: Run 7 / run7.zip / LES7GWB.ASC < prev    next >
Text File  |  1992-09-27  |  24KB  |  458 lines

  1.  
  2.  
  3.                          De GWBASIC-Interpreter (7)
  4.  
  5.                                   Arrays
  6.  
  7. Vooral in programma's met een zekere veelzijdigheid spelen arrays de 
  8. hoofdrol. De nederlandse vertaling voor 'array' is: lijst van elementen. 
  9. We kunnen in een GWBASIC-programma werken met lijsten die gevuld zijn met 
  10. numerieke (getallen) of alfanumerieke (tekst) informatie. Voorbeelden van 
  11. arrays zijn:
  12. - De namen van de maanden.
  13. - Datums van verjaardagen.
  14. - Maten van een bouwwerk.
  15. - Uitkomsten van berekingen.
  16. - Machinetaalinstructies
  17. De eerste twee voorbeelden betreffen teksten of strings; de laatste drie 
  18. gaan over cijfermateriaal.
  19.  
  20. Dimensioneren
  21.  
  22. Om een array in een programma te kunnen opnemen, moet hij worden 
  23. gedeclareerd nog voordat het werken met de array begint. Het is u allang 
  24. opgevallen dat ook in de meeste RUN-programma's de eerste regel(s) 
  25. allerlei interne zaken regelen zoals:
  26. CLS:KEY OFF:SCREEN 9:COLOR 14,0
  27. en heel vaak zit daar ook bij zoiets als:
  28. DIM MAANDEN$(12),DAGEN$(7).
  29. Met de opdracht DIM dimensioneren we de array of de arrays die we in het 
  30. betreffende programma zullen gebruiken. Dat wil zeggen dat het
  31. DIM-statement er voor zorgt dat er in het geheugen ruimte wordt
  32. gereserveerd om de lijst van elementen op te nemen.
  33. GWBASIC is daar erg precies in en staat niet toe dat er voorbij de 
  34. opgegeven lijst nog iets wordt toegevoegd. Wordt dit door het programma 
  35. toch geprobeerd dan volgt de foutmelding die we allemaal wel eens hebben 
  36. gekregen:
  37. SUBSCRIPT OUT OF RANGE.
  38. Het is dus zaak goed na te denken en te plannen hoe we met arrays gaan 
  39. werken.
  40. We beginnen met een zeer eenvoudig voorbeeld om het gebruik van de array 
  41. duidelijk te maken. In een lijst van elementen worden de daarin op te 
  42. nemen elementen genummerd. Dat heeft grote voordelen want het betekent 
  43. voor de praktijk dat de elementen voor een programma verwerkbaar worden. 
  44. Een mogelijke verwerking is dat een lijst met achternamen kan worden 
  45. gesorteerd op alfabetische volgorde. Een andere mogelijkheid is dat de dag 
  46. van de week wordt berekend met een cijfer. Is dit cijfer bekend en 
  47. vastgelegd in een numerieke variabele dan kan het dienst doen om de 
  48. dagnaam direct uit de array op te halen. Stel dat het programma een waarde 
  49. berekent en toekent aan de variabele: Dagnr dan kan de bijbehorende 
  50. dagNAAM direct uit de stringarray worden opgehaald met:
  51.  
  52. PRINT DAGEN$(Dagnr)
  53.  
  54. In het nu volgende voorbeeld laten we het programma aan de gebruiker om de 
  55. dagen van de week vragen. De in te voeren tekststrings worden verzameld in 
  56. de string-array: DAGEN$(n).
  57.  
  58. ╔════════════════════════════════════╗ Nevenstaand programmaatje maakt ge-
  59. ║ 10 CLS:KEY OFF:DIM DAGEN$(7)       ║ bruik van de technieken die we in de
  60. ║ 20 FOR A=1 TO 7                    ║ voorgaande lessen hebben doorgrond
  61. ║ 30   GOSUB 100                     ║ (en geoefend): de FOR/NEXT-loop en 
  62. ║ 40 NEXT A                          ║ de subroutine. De dagen van de week
  63. ║ 50 CLS                             ║ laten we in de subroutine invoeren 
  64. ║ 60 PRINT "De dagen van de week:"   ║ en opslaan in de array DAGEN$(n). 
  65. ║ 70 FOR A=1 TO 7                    ║ Merk op dat de eerste FOR/NEXT-loop
  66. ║ 80 PRINT A;DAGEN$(A)               ║ de invoer en het opslaan bestuurt
  67. ║ 90 NEXT A:END                      ║ en tegelijk voor de nummering zorg
  68. ║ 100 INPUT DAGEN$(A)                ║ draagt.
  69. ║ 120 RETURN                         ║ Vraag: Hoeveel elementen kan de
  70. ╚════════════════════════════════════╝ stringarray DAGEN$(7) bevatten? 
  71. U antwoordt: zeven. Fout! Heeft u vergeten dat computers niet bij 1 maar 
  72. bij 0 beginnen te tellen? DAGEN$(1) bevat het element "Maandag" maar er 
  73. bestaat ook een element DAGEN$(0). In dit geval is dit een leeg element 
  74. maar het bestaat wel degelijk.
  75. In de directe modus van GWBASIC kunt u alle acht elementen ondervragen 
  76. nadat u dit oefenprogrammaatje hebt ingetypt en geRUNd. Dit kan er 
  77. allemaal gebeuren:
  78.  
  79. Ok
  80. PRINT DAGEN$(3)
  81. Woensdag
  82. Ok
  83. PRINT DAGEN$(0)
  84. Ok
  85. PRINT DAGEN$(8)
  86. SUBSCRIPT OUT OF RANGE
  87. Ok
  88.                                  ┌─────┐
  89. ┌────────────────────────────────┤ TIP ├───────────────────────────────────┐
  90. │                                └─────┘                                   │
  91. │ GWBASIC laat toe dat arrays met minder dan elf (0 tot en met 10)         │
  92. │ elementen niet hoeven te worden gedimensioneerd met de DIM-opdracht. Sla │
  93. │ geen acht op deze 'vrijheid'. Dimensioneer altijd, ook al zou een array  │
  94. │ uit slecht twee of enkele elementen bestaan.                             │
  95. │ De reden om altijd de DIM-opdracht te gebruiken is dat COMPILERS als     │
  96. │ TurboBASIC, PowerBASIC en QuickBasic elke  niet-gedimensioneerde array   │
  97. │ tijdens het compileerproces signaleren en daartegen bezwaar maken. Bij   │
  98. │ het gebruik van veel kleine, niet-geDIMde arraytjes kan dit veel         │
  99. │ gecorrigeer achteraf betekenen.                                          │
  100. └──────────────────────────────────────────────────────────────────────────┘
  101.  
  102. In de regel waarin we arrays dimensioneren hoeft de DIM-opdracht slechts 
  103. één keer te worden gegeven. De te dimensioneren arrays kunnen door 
  104. komma's worden gescheiden. Bijvoorbeeld:
  105.  
  106. 110 DIM DAGEN$(7),MAANDEN$(12),A(25)
  107.  
  108. Inlezen van DATA
  109.  
  110. Het werken met lijsten IN een programma heeft veel voordelen. Zowel 
  111. numerieke als alfanumerieke arrays zullen een programma echt tot leven 
  112. laten komen. Voordat we hiervan een voorbeeld geven, moeten we ons nog 
  113. bezig houden met de vraag: hoe wordt een array in een programma gevuld 
  114. met informatie? Er zijn vier mogelijkheden:
  115. 1. Het programma genereert de informatie zelf, zoals bij fractals.
  116. 2. Het programma haalt de informatie via INPUT of LINE INPUT op bij de 
  117.    gebruiker.
  118. 3. Het programma haalt de informatie op uit een bestand op schijf.
  119. 4. De programmeur verschaft zijn programma de informatie zelf in de vorm 
  120.    van DATA.
  121.  
  122. De laatste mogelijkheid wordt ook in RUN-programmaatjes veel gebruikt. 
  123. Daarom gaan we er hier wat dieper op in. We leren daarom een nieuwe 
  124. GWBASIC-opdracht: READ plus de opdracht die nauw met READ is verbonden: 
  125. RESTORE.
  126. Wanneer we een programma ontwikkelen dat direct al de beschikking moet 
  127. hebben over een gevulde array dan kunnen we zo'n array al direct na de 
  128. directe opdracht RUN laten vullen. We kunnen dat doen met een aantal 
  129. voorbereidende programmaregels. Stel dat we een array van zeven 
  130. tekstelementen willen met de namen van de dagen van de week.
  131. We beginnen uiteraard met de tekstarray DAGEN$(n) netjes te dimensioneren:
  132.  
  133. 10 CLS:KEY OFF:DIM DAGEN$(7)
  134.  
  135. Vervolgens kunnen we de tekstelementen DAGEN$(1) tot en met DAGEN$(7) in 
  136. een aantal afzonderlijke regels 'invullen':
  137.  
  138. 20 DAGEN$(1) = "Maandag"
  139. 30 DAGEN$(2) = "Dinsdag"
  140.  
  141. enzovoort maar zo hoort het niet. We hebben niet voor niets in een vorige 
  142. les de techniek van de FOR/NEXT-kringloop geleerd. Een loopje van 7 doet 
  143. het veel eleganter (en sneller) mits de READ-opdracht ook daadwerkelijk 
  144. iets te 'lezen' heeft. Het leesvoer voor zo'n lees-loop brengen we onder 
  145. in regels met DATA:
  146.  
  147. 1000 DATA Zondag,Maandag,Dinsdag
  148. 1010 DATA Woensdag,Donderdag,Vrijdag
  149. 1020 DATA Zaterdag
  150.                                   ┌─────┐
  151. ┌─────────────────────────────────┤ TIP ├───────────────────────────────────┐
  152. │                                 └─────┘                                   │
  153. │ DATA-regels mogen overal in de programmalisting staan. Het zijn passieve  │
  154. │ regels die uitsluitend vanuit de READ-opdracht worden benaderd. De goede  │
  155. │ gewoonte schrijft echter voor dat DATA-regels overzichthalve bovenin of   │
  156. │ onderin de listing worden geplaatst.                                      │
  157. └───────────────────────────────────────────────────────────────────────────┘
  158.  
  159. Met deze DATA-regels kan het vullen vanuit de kringloop als volgt in zijn 
  160. werk gaan:
  161.  
  162. 20 FOR A=1 TO 7
  163. 30   READ DAGEN$(A)
  164. 40 NEXT A
  165.  
  166. Daarmee is de tekstarray gevuld en zal een opdracht elders in het 
  167. programma als: PRINT DAGEN$(7) als resultaat de inhoud van het aangewezen 
  168. tekstelement opleveren: Zaterdag.
  169. READ is nogal kritisch voor wat de hoeveelheid DATA betreft. Geven we 
  170. meer DATA op dan READ hoeft te lezen dan is dat geen bezwaar. Maar o wee 
  171. als READ in een FOR/NEXT-loop ook maar één DATA-element te kort komt. Dat 
  172. zal het geval zijn wanneer we regel 1020 van het voorbeeld zouden 
  173. vergeten.
  174. GWBASIC heeft daar een enorme hekel aan. Als hij zeven DATA moet lezen en 
  175. hij vindt er slechts zes of nog minder dan gooit hij subiet het bijltje 
  176. er bij neer door de programma-afwerking te onderbreken en de programmeur 
  177. op het slordige van zijn programmeergedrag te wijzen met de foutmelding:
  178.  
  179. OUT OF DATA.
  180.  
  181. Een- of meermalig?
  182.  
  183. DATA kunnen met READ slechts één keer worden gelezen. Dat is genoeg, zult 
  184. u zeggen maar dat hoeft niet altijd zo te zijn. Stel dat we om welke 
  185. reden dan ook in een programma twee tekstarrays wensen met de dagen van 
  186. de week als tekstelementen.
  187. De dimensionering zou er dan aldus kunnen uitzien:
  188.  
  189. 10 CLS:KEY OFF:DIM DAGEN$(7),WEEK$(7)
  190.  
  191. Als dit zo zou zijn, zouden we dubbele DATA-regels nodig hebben en twee 
  192. FOR/NEXT-loops om ze in te lezen. Dat zou een beetje klunzig zijn. We 
  193. kunnen volstaan met enkele DATA voor meermalig gebruik. Daartoe moeten we 
  194. voorkomen dat de DATA na de eerste inlezing uit het geheugen worden 
  195. verwijderd en beschikbaar blijven voor een volgende READ. Voorkomen dat 
  196. DATA na lezing verloren gaan doen met de opdracht RESTORE:
  197. ┌───────────────────────────────────────────────────────────────────────────┐
  198. │                           20 FOR A=1 TO 7:READ DAGEN$(A):NEXT A           │
  199. │                           30 RESTORE                                      │
  200. │                           40 FOR A=1 TO 7:READ WEEK$(A):NEXT A            │
  201. │                           50 FOR A=1 TO 7:PRINT DAGEN$,WEEK$:NEXT A       │
  202. │                           60 END                                          │
  203. └───────────────────────────────────────────────────────────────────────────┘
  204. Zoals eerder opgemerkt kunnen we een programma ook zelf de informatie 
  205. voor een array laten genereren. We gebruiken de array dan voor opslag van 
  206. gegevens. Een voorbeeldje maakt dit duidelijk.
  207. ┌───────────────────────────────────────────────────────────────────────────┐
  208. │   10 CLS:KEY OFF:DIM KWADRATEN(25)                                        │
  209. │   20 PRINT "Dit programma berekent vanaf een startgetal 25 kwadraten"     │
  210. │   30 PRINT:INPUT "Startgetal";A%                                          │
  211. │   40 FOR A=1 TO 25                                                        │
  212. │   50   KWADRATEN(A)=A%^2                                                  │
  213. │   60   A%=A%+1                                                            │
  214. │   70 NEXT A                                                               │
  215. │   80 PRINT "25 Kwadraten vanaf ";A%-25;":"                                │
  216. │   90 FOR A=1 TO 25                                                        │
  217. │   100  PRINT SQR(KWADRATEN(A));CHR$(253);" = ";KWADRATEN(A)               │
  218. │   110 NEXT A                                                              │
  219. │   120 END                                                                 │
  220. └───────────────────────────────────────────────────────────────────────────┘
  221. Tweedimensionale arrays
  222.  
  223. Een lijst is een gegevensverzameling met slechts een dimensie: van boven 
  224. naar beneden. Een matrix is een gegevensverzameling met twee dimensies: 
  225. van boven naar beneden en van links naar rechts. Voorbeelden van matrices 
  226. (matrices is het meervoud van matrix) zijn: het schaakbord met 8 x 8 = 64 
  227. velden en de tabel die uit twee of meer kolommen bestaat.
  228.  
  229. Ook in GWBASIC kunnen we werken met tweedimensionale arrays. Voor een 
  230. schaakbord dimensioneren we dan bijvoorbeeld:
  231. DIM BORD(8,8)
  232. Om aan te geven dat de tweedimensionale array voor numerieke waarden 
  233. bestaat uit 8 regels bij 8 kolommen. Zelfs zouden we in GWBASIC een 
  234. ruimtelijk of driedimensionaal schaakprogramma kunnen schrijven. In 
  235. plaats van een plat, tweediensionaal schaakbord gebruiken we dan de 
  236. driedimensionale kubus en we dimensioneren hoogte, breedte en diepte als:
  237. DIM BORD(8,8,8)
  238. Het is zelfs zo sterk dat GWBASIC geen enkel probleem zou hebben met een 
  239. vierdimensionaal of een multidimensionaal schaakbord en dus ook niet met 
  240. de declaratie:
  241. DIM BORD(8,8,8,8,8)
  242. Alleen wijzelf zouden er problemen mee krijgen want wie kan zich een 
  243. voorstelling maken van een schaakbord met vijf dimensies?
  244. We blijven realistisch en kunnen ons beter beperken tot voorlopig 
  245. matrices want dat is al moeilijk genoeg.
  246. We hebben het al gehad over dagen van de week en namen van maanden. In 
  247. dit verband is de maandkalender een uitstekend voorbeeld van een matrix 
  248. want in feite is een kalender niets meer dan een gewone tabel van datums.
  249.  
  250. Programma-ontwikkeling
  251.  
  252. We zijn nu toe aan het ontwikkelen, schrijven, testen en vervolmaken van 
  253. een echt programma. Met de kennis en ervaring die u tot nu toe hebt 
  254. opgedaan, moet dat mogelijk zijn.
  255.  
  256. Het ontwikkelen van een programma begint met de geboorte van een idee. Op 
  257. het moment dat een idee ontstaat, is het nog vaag en vormloos. Het werpt
  258. een probleem op dat we met de computer willen oplossen.
  259. Programma-ontwikkeling voltrekt zich langs het volgende traject:
  260.  
  261. - Idee
  262. - Probleemanalyse (wat willen we)
  263. - Systeemontwerp (is het programmeerbaar en zoja: Hoe?)
  264. - Coderen en documenteren (programmaregels schrijven)
  265. - Testen
  266. - Debuggen (fouten verbeteren en verbeteringen aanbrengen)
  267. - Compileren
  268.  
  269. Idee
  270.  
  271. Het idee voor ons programma is als volgt: Voor de aardrijkskundeles moet 
  272. er een stukje software komen dat de leerling een kwis laat spelen. De kwis 
  273. moet hem parate kennis bijbrengen over landen en hun hoofdsteden.
  274.  
  275. Wat willen we?
  276.  
  277. Het programma moet de naam van een willekeurig land op het scherm zetten 
  278. en vragen welke de hoofdstad van dat land is. In vervolgprogramma wordt 'n
  279. hoofdstad gegeven en dan luidt de vraag van welk land dit de hoofdstad is.
  280. Het programma zet telkens vijf genummerde antwoorden op het scherm waaruit
  281. de leerling een keus kan maken. Een van de vijf is het correcte antwoord
  282.  
  283. Systeemontwerp
  284.  
  285. Landen en hoofdsteden plaatsen we in DATA-regels. Er zijn twee stringarrays
  286. nodig: een met landen en een met hoofdsteden. Het nummer van het land in 
  287. de landenarray correspondeert met de steden-array. Daardoor kunnen we de 
  288. antwoorden van de gebruiker controleren op juistheid.
  289. In een FOR/NEXT-loop kunnen we tien vragen stellen. Dat betekent dat het
  290. hoofdgedeelte van het programma zich binnen deze kringloop gaat afspelen.
  291. Een randomizer kiest vijf mogelijke antwoorden waaronder een goede.
  292. We kiezen voor het multiple choice-principe. Er verschijnt een willekeu-
  293. rig land en een genummerd lijstje van vijf hoofdsteden.
  294. Dit lijstje met mogelijke antwoorden moet aan twee belangrijke eisen vol-
  295. doen:
  296. 1. De ware hoofdstad moet er in worden opgenomen.
  297. 2. Er moet voor worden gezorgd dat een willekeurig gekozen hoofdstad niet
  298.    meermalen in dat lijst voorkomt. (Moeilijk...!)
  299.  
  300. Er zijn tien vragen per kwis in de FOR/NEXT-loop. Het bijhouden van het 
  301. aantal goede of foutieve antwoorden is geen probleem en het weergeven van
  302. de uitslag evenmin.
  303. Conclusie: het probleem is programmeerbaar in GWBASIC.
  304.  
  305. Coderen en documenteren
  306.  
  307. ┌─────────────────────────────────────────────────────────────────────────┐
  308. │ 100 REM AARDRIJKSKUNDELES GWBASIC KARAKTER-GEORIENTEERD                 │
  309. │ 110 CLS:KEY OFF                                                         │
  310. │ 120 REM arrays dimmen voor landen, hoofdsteden, opgavelijstje en uitslag│
  311. │ 130 DIM LAND$(20),STAD$(20),LIJST$(5),Q(10)                             │
  312. │ 140 REM LANDEN IN LAND$()                                               │
  313. │ 150 DATA ALGERIJE,EGYPTE,FINLAND,ZWEDEN,NOORWEGEN                       │
  314. │ 160 DATA IERLAND,IJSLAND,PORTUGAL,SPANJE,CHILI                          │
  315. │ 170 DATA PERU,BULGARIJE,HONGARIJE,ALBANIE,POLEN                         │
  316. │ 180 DATA ARGENTINIE,NIEUW ZEELAND,DUITSLAND,CANADA,FILIPPIJNEN          │
  317. │ 190 REM HOOFDSTEDEN IN STAD$()                                          │
  318. │ 200 DATA ALGIERS,KAIRO,HELSINKI,STOCKHOLM,OSLO                          │
  319. │ 210 DATA DUBLIN,REYKJAVIK,LISSABON,MADRID,SANTIAGO                      │
  320. │ 220 DATA LIMA,SOFIA,BUDAPEST,TIRANA,WARSCHAU                            │
  321. │ 230 DATA BUENOS AIRES,WELLINGTON,BONN,OTTAWA,MANILA                     │
  322. └─────────────────────────────────────────────────────────────────────────┘
  323.  
  324. Het voorbereidende huiswerk is gedaan; tot zo ver moet ons programma duide-
  325. lijk zijn.
  326.  
  327. Nu worden de twee parallelle tekstarrays: LAND$() en STAD$() gelezen en
  328. gevuld in een geneste of dubbele FOR/NEXT:
  329.                                                                             
  330. ┌──────────────────────────────────────────────────────────────────────────┐
  331. │ 240 REM INLEZEN LANDEN IN LAND$() EN HOOFDSTEDEN IN STAD$()              │
  332. │ 250 FOR A=1 TO 2                                                         │
  333. │ 260   FOR B=1 TO 20                                                      │
  334. │ 270     IF A=1 THEN READ LAND$(B) ELSE READ STAD$(B)                     │
  335. │ 280   NEXT B                                                             │
  336. │ 290 NEXT A                                                               │
  337. └──────────────────────────────────────────────────────────────────────────┘
  338.  
  339. Omdat we veelvuldig willekeurige getallen onder de tien en de vijf nodig
  340. hebben, maken we daarvan user defined functions in DEF FN:
  341.  
  342. ┌──────────────────────────────────────────────────────────────────────────┐
  343. │ 300 REM RANDOMIZER AAN EN USER DEFINED FUNCTIONS VOOR RANDOM GETALLEN    │
  344. │ 310 RANDOMIZE TIMER                                                      │
  345. │ 320 DEF FN RAND1=INT(RND*20)+1:'----------------------> GETAL ONDER DE 20│
  346. │ 330 DEF FN RAND2=INT(RND*5)+1 :'----------------------> GETAL ONDER DE 5 │
  347. └──────────────────────────────────────────────────────────────────────────┘
  348.  
  349. Nu begin de hoofd-FOR/NEXT.
  350.  
  351. ┌──────────────────────────────────────────────────────────────────────────┐
  352. │ 340 REM HOOFDLOOP VOOR 10 VRAGEN                                         │
  353. │ 350 FOR A=1 TO 10                                                        │
  354. │ 360 LOCATE 7,10:PRINT "Vraag:";A                                         │
  355. │ 370 LOCATE 9,10:PRINT "Wat is de hoofdstad van: ";                       │
  356. │ 380   Q(A)=FN RAND1:'---------------------> VARIABELE Q(a) KIEST EEN LAND│
  357. │ 390   PRINT LAND$(Q(A)):'-----------> PLAATS EEN WILLEKEURIG GEKOZEN LAND│
  358. │ 400   R=FN RAND2:'--> VARIABELE R (1 - 5) KIEST PLAATS HOOFDSTAD IN LIJST│
  359. │ 410   REM GENESTE LOOP VOOR PLAATSING HOOFDSTEDEN IN LIJST$()            │
  360. │ 420   FOR B=1 TO 5                                                       │
  361. │ 430     LIJST$(B)=STAD$(FN RAND1)                                        │
  362. │ 440     IF B=R THEN LIJST$(B)=STAD$(Q(A))                                │
  363. │ 450     LOCATE B+8,50:PRINT B;"- ";LIJST$(B);SPACE$(10)                  │
  364. │ 460   NEXT B                                                             │
  365. │ 470 REM GENESTE LOOP TER VOORKOMING VAN DUBBELE STEDEN IN LIJST$()       │
  366. │ 480 FOR C=1 TO 5                                                         │
  367. │ 490   FOR D=C+1 TO 5                                                     │
  368. │ 500     IF LIJST$(C)=LIJST$(D) THEN B=0:GOTO 420:'HETZELFDE? OVERNIEUW!  │
  369. │ 510   NEXT D                                                             │
  370. │ 520 NEXT C                                                               │
  371. │ 530 LOCATE 16,16:PRINT "Toets (1,2,3,4 of 5)? ";                         │
  372. │ 540 I$=INKEY$:IF I$="" THEN 540                                          │
  373. │ 550 IF I$="" OR INSTR("12345",I$)=0 THEN BEEP:GOTO 530                   │
  374. │ 560 I=VAL(I$):'-----> Numerieke variabele I nodig voor verdere verwerking│
  375. │ 570 LOCATE 16,16:PRINT "Uw antwoord: ";LIJST$(I);                        │
  376. │ 580 IF LIJST$(I)=STAD$(Q(A)) THEN S=S+1:PRINT " is correct":GOTO 600     │
  377. │ 590 SOUND 500,3:PRINT " is onjuist"                                      │
  378. │ 600 T=TIMER+1:WHILE T>TIMER:WEND:CLS:'----------------> Wacht een seconde│
  379. │ 610 NEXT A                                                               │
  380. └──────────────────────────────────────────────────────────────────────────┘
  381.  
  382. Het bovenstaande deel van ons programma bevat de 'body' van de kwis. Be-
  383. studeer de flow op uw gemak en laat alles tot u doordringen zodat het
  384. programma volledig transparant wordt. Waar nodig en nuttig zijn REMS 
  385. toegevoegd achter een apostofje. Zoals het (eigenlijk) hoort, is de
  386. gehele FOR/NEXT-loop constructie gestructureerd opgezet om het over-
  387. zicht te behouden. De inspringingen helpen bij het begrijpen soms inge-
  388. wikkelde kringlopen die verstrengeld (genest) zijn.
  389.  
  390. Na de Hoofdloop (A) zijn tien vragen gesteld en tien antwoorden vergaard in
  391. de numerieke array Q(10). We kunnen dus nu een overzicht geven van de op-
  392. gave: De gevraagde hoofdsteden en hun bijbehorende hoofdsteden:
  393.  
  394. ┌─────────────────────────────────────────────────────────────────────────┐
  395. │ 620 REM OVERZICHT VAN DE TIEN OPGAVEN - VOLGORDE IN ARRAY Q(10)         │
  396. │ 630 CLS                                                                 │
  397. │ 640 FOR A=1 TO 10                                                       │
  398. │ 650   LOCATE A,3                                                        │
  399. │ 660   PRINT "De hoofdstad van ";LAND$(Q(A));" is: ",STAD$(Q(A))         │
  400. │ 670 NEXT A                                                              │
  401. └─────────────────────────────────────────────────────────────────────────┘
  402.  
  403. De rest is simpel. In het tellertje van de numerieke variabele S hebben we
  404. de goede antwoorden geteld. Dus:
  405.  
  406. ┌─────────────────────────────────────────────────────────────────────────┐
  407. │ 680 REM DE UITSLAG                                                      │
  408. │ 690 LOCATE 12,10:PRINT "U beantwoordde";S;"van de";A-1;"vragen correct" │
  409. │ 700 END                                                                 │
  410. └─────────────────────────────────────────────────────────────────────────┘
  411.  
  412. Type dit programma niet klakkeloos over om het vervolgens te runnen. Bestu-
  413. deer en begrijp elke regel. Het is zeer goed als u vindt of denkt dat het
  414. ook anders, korter of beter kan. Als u dat denkt, ga dan in de praktijk na
  415. of dat zo is. Onderzoek onthult en maakt u wijzer en steeds meer ervaren.
  416. Probeer het programma uit te breiden met meer landen en hoofdsteden. De 
  417. bedoeling is dat u gaat inzien hoe een programma tot stand komt: vanaf het 
  418. eerste idee tot en met de laatste wijzigingen.
  419. Probeer zelf ook een idee te ontwikkelen en ga na of het al programmeerbaar
  420. is met de kennis van GWBASIC waarover u nu al beschikt.
  421.  
  422. Opmaak: Lijnen en kleuren
  423.  
  424. Het programma vindt u op deze RUN-disk onder de naam: AARDR.BAS. Het loopt
  425. goed maar u zult het met me eens zijn dat het er niet uit ziet.
  426. In de volgende les op RUN Flagazine 7 gaan we ons verdiepen in kleuren en 
  427. lijnen: de attributen waarmee we karakter-georienteerde programma's een 
  428. mooi en verantwoord uiterlijk geven. We gaan ditzelfde programma dan ver-
  429. der uitbreiden en zodanig opmaken dat we er mee voor de dag kunnen komen.
  430.  
  431.  
  432.                                                            Wordt vervolgd
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456. ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  457.  
  458.