LIACS >Kristian Rietveld >Courses >Programmeermethoden NA, Najaar 2017
headerimg

Banner image by Sebastian Niedlich on Flickr, CC BY-NC-SA 2.0


Programmeermethoden NA
Werkcollege 8: NumPy en Derde opgave I

Werkcollege 8 van het vak Programmeermethoden NA vindt plaats in de computerzalen van het Snellius-gebouw, op dinsdag 7 november 2017, van 11:00 tot 12:45 uur.

Voorbereiding

Als voorkennis wordt bekend verondersteld:
  • Inhoud colleges tot en met deze week, dus inclusief NumPy arrays.

Het eigenlijke werkcollege

NumPy oefeningen

Om bekend te raken met NumPy arrays, eerst een paar kleine oefeningen. Je kunt deze oefeningen maken in de interactieve-modus van Python. Vergeet na het opstarten van Python niet eerst import numpy as np uit te voeren.

Schrijf expressies om de volgende arrays te maken. Probeer tot een zo kort mogelijke expressie te komen. For-loops gebruiken is niet toegestaan. Ook mag je geen toekenningen doen aan individuele array elementen (maar wel aan slices).

Voorbeeld: [3., 3.5, 4., 4.5, 5., 5.5] kan worden gemaakt met de expressie np.arange(3, 6, 0.5).

  1. [ 1 4 7 10 13 16 19 22 25 28]
  2. [4 4 4 4 4 4]
  3. [1 2 3 1 2 3 1 2 3] (hint: je mag ook een lijst of array van elementen als waarde geven aan np.tile())
  4. [[ 1.  0.  0.  0.]
     [ 0.  1.  0.  0.]
     [ 0.  0.  1.  0.]
     [ 0.  0.  0.  1.]]
    
  5. [[ 9.  0.  0.]
     [ 0.  9.  0.]
     [ 0.  0.  9.]]
    
  6. [[1 2 3]
     [1 2 3]
     [1 2 3]]
    
  7.  [[ 0.  0.  0.  0.  0.]
      [ 0.  0.  1.  0.  0.]
      [ 0.  1.  2.  3.  4.]
      [ 0.  0.  3.  0.  0.]
      [ 0.  0.  4.  0.  0.]]
    
    (hint: je mag toekenningen aan slices gebruiken.)

Maak een array A als volgt: A = np.arange(25).reshape(5, 5) (we komen volgende week nog terug op wat reshape exact doet). Schrijf nu voor elk van de volgende slices van A de bijbehorende slice-expressie:

  1. 13
  2. [0 1 2 3 4]
  3. [1 3]
  4. [[ 0  4]
     [ 5  9]
     [10 14]
     [15 19]
     [20 24]]
    
  5. [[ 6  7  8]
     [11 12 13]
     [16 17 18]]
    

De derde programmeeropgave

De derde programmeeropgave bestaat uit een menu-programma en de invulling daarvan. Verder wordt al snel duidelijk dat er een nette functie moet komen om geldige menu-opties in te lezen. Het schrijven van het programma kan dan ook keurig in een aantal taken verdeeld worden.

Zo kan in eerste instantie het hoofdmenu gemaakt worden waarbij de keuze "Game of Life" leidt tot een regeltje op het scherm ("hier moet Game of Life komen" of "dit deel schrijft mijn labpartner"). De optie afsluiten kan het programma al daadwerkelijk afsluiten.

Op eenzelfde manier kan ook het submenu voor Game of Life al worden opgebouwd. De functies voor Game of Life en Angry Birds kunnen apart worden uitgewerkt (in aparte modules) en in een later stadium in het menu-programma worden geimporteerd en gebruikt. Als de opgave door twee personen gemaakt wordt kan hier verstandig worden samengewerkt.
De meesten kiezen ervoor om het menu geen memberfunctie van de klasse LifeWereld of AngryBirds te laten zijn.

Onderdelen waar deze week al aan kan worden gewerkt (de volgorde ligt overigens helemaal niet vast):

  1. Een functie om menu-keuzes in te lezen en te controleren. Zie ook de hint in de opdracht hoe er kan worden gecontroleerd of er inderdaad alleen een integer is ingevoerd en geen andere karakters.
  2. Het hoofdmenu met dummy-acties voor de gekozen opties. Op eenzelfde manier kan het submenu voor Life al worden gemaakt.
  3. Schrijf al een functie main die een functie voor het infoblokje aanroept en daarna het hoofdmenu start.
  4. Maak nu een klasse LifeWereld, zie ook de hint in de opdracht. Deze klasse heeft ondermeer een 2-dimensionaal array self.wereld met type np.bool8. En memberfuncties als afdrukken, schoon, random, doe_stap, enz. Hoogte, breedte, etc., zijn membervariabelen of attributen.
  5. Zorg ervoor dat de menu-opties goed aansluiten op de memberfuncties. Er zijn verschillende aanpakken mogelijk. In de functie die het menu implementeert kun je een object type LifeWereld aanmaken. Wanneer een menu-optie wordt gekozen roep je steeds een methode op dit object aan, bijvoorbeeld wereld.schoon().
  6. Maak de opties Schoon, Plaats Glider en Random. Schoon kan zelfs in 1 regel. De constructor __init__ zou schoon aan kunnen roepen om een lege wereld te initialiseren. Bij plaats glider kun je toekenning aan een slice toepassen.
  7. Schrijf de methode om de wereld af te drukken. Vervolgens kun je de menu-functie zo maken dat steeds de wereld wordt afgedrukt, gevolgd door de menu-opties op 1 regel.
  8. Maak de optie Een en methode doe_stap. Let erop dat je een hulparray gebruikt om zo alle wijzigingen "gelijktijdig" plaats te laten vinden. En maak de optie Gaan.
  9. En de rest ... mag je zelf verzinnen. Houd het simpel!