Department of Information and Computing Sciences

Departement Informatica Onderwijs
Bachelor Informatica Informatiekunde Kunstmatige intelligentie Master Computing Science Game&Media Technology Artifical Intelligence Business Informatics

Onderwijs Informatica en Informatiekunde

Vak-informatie Informatica en Informatiekunde

Imperatief programmeren

Website:website met extra informatie
Vakcode:WIIMP
Studiepunten:5.72 ECTS (=4 oude studiepunten)
Periode:periode 5 (week 20 t/m 27, d.w.z. 13-5-2002 t/m 5-7-2002; herkansing week 34)
Deelnemers:tot nu toe 53 inschrijvingen
Rooster:Dit is een oud rooster!
vormgroeptijdweekzaaldocent
college   wo 09-1120-26 BBL-107a Jeroen Fokker
 
vr 09-1120-21,23,25 BBL-107a
vr 13-1522 BBL-107a
combisessie groep 1 do 11-1320-27 BBL-468 Jeroen Fokker
 
vr 11-1320-27 BBL-468
groep 2 wo 11-1320-27 BBL-468 Jeroen Fokker
 
vr 13-1520-21,23-27 BBL-468
groep 3 wo 11-1320-27 BBL-461
vr 13-1520-21,23-27 BBL-461
groep 4 wo 11-1320-27 BBL-458
vr 13-1520-21,23-27 BBL-458
opgavenuur   vr 09-1122 Rup-038
24 EDUC-alfa
26 EDUC-gamma
Periode:periode 2 (week 44 t/m 51, d.w.z. 29-10-2001 t/m 21-12-2001; herkansing week 10)
Deelnemers:tot nu toe 156 inschrijvingen
Rooster:Dit is een oud rooster!
vormgroeptijdweekzaaldocent
college   ma 13-1544-50 EDUC-theta Jeroen Fokker
 
wo 11-1344-46,48-50 Rup-blauw
47 WENT-blauw
combisessie groep 1 ma 15-1744-50 BBL-458 Jeroen Fokker
 
wo 13-1544-50 BBL-458
groep 2 ma 15-1744-50 BBL-461 Arjan van IJzendoorn
Reinier Meerwaldt
  
wo 13-1544-50 BBL-461
groep 3 ma 15-1744-50 BBL-468 Hans Philippi
Jacob Kleerekoper
  
wo 13-1544-50 BBL-468
groep 4 ma 15-1744-50 BBL-471 Zeger Knops
Ronald Treur
  
wo 13-1544-50 BBL-471
groep 5 wo 09-1144-50 BBL-458 Eelco Visser
Paul Domen
  
do 11-1344-50 BBL-458
groep 6 wo 09-1144-50 BBL-461 Niels Reijngoud
Robert van Herk
  
do 11-1344,47-50 BBL-461
do 13-1545-46 BBL-468
BBL-471
groep 7 wo 09-1144-50 BBL-468 Herman Haverkort
Paul Rijneveld
  
do 13-1545 BBL-468
vr 11-1344,46-50 BBL-458
groep 8 wo 09-1144-50 BBL-471 Remco Veltkamp
Lukas Spee
  
do 13-1545 BBL-471
vr 11-1344,46-50 BBL-461
groep 9 di 13-1544-50 BBL-458 Han-Wen Nienhuys
Andrew Koster
  
do 09-1145 BBL-468
vr 09-1144,46-50 BBL-458
groep 10 di 13-1544-50 BBL-461 Mart Kolthof
Niels van der Velden
  
do 11-1345 BBL-468
vr 13-1544,46-50 BBL-468
groep 11 di 09-1144-50 BBL-458 Rogier van Eijk
Stijn Prompers
  
do 11-1345 BBL-471
vr 13-1544,46-50 BBL-471
groep 12 di 09-1144-50 BBL-461 Jeroen Fokker
 
do 09-1145 BBL-471
vr 09-1144,46-50 BBL-461
Inhoud:Als je een computer instrueert met opdrachten, doe je aan imperatief programmeren ('t kan ook anders, maar dan programmeer je functioneel, en dat is een ander vak). In dit vak leer je de programmeertaal Java, waarin opdrachten gebundeld worden in zogeheten methoden, die een object bewerken. Het is daarmee tevens een inleiding in objectgeoriënteerd programmeren.

We bekijken hoe je het geheugen verandert, en hoe je keuze en herhaling programmeert. Je beschrijft zelf nieuwe soorten objecten met daarbij behorende methoden, maar maakt ook kennis met de bij Java horende standaard-methoden. Aan de orde komen onder andere packages om interactieve user-interfaces (waaronder web-applets) te maken, om animaties te maken met een thread, en om files te manipuleren.

In het college worden enkele grotere programma's besproken als voorbeeld van toepassingen: taalherkenning door letterfrequentie-analyse, een grafische bitmap-editor, en een route-zoeker. Daarbij zien we dan meteen waarom het handig is om object-klassen hiërarchisch te ordenen, en hoe je rijen objecten in een array kunt zetten.

Literatuur:Jeroen Fokker, Imperatief programmeren, collegedictaat versie 2001.
Werkvorm:Hoorcollege (waarin nieuwe concepten en voorbeelden worden gepresenteerd), en een combinatie werkcollege/practicum (waarin je zelf oefent met het ontwerpen en schrijven van programma's en delen daarvan) Elk van deze drie vormen twee maal twee contactuur per week. Daarbuiten onbegeleid practicumwerk om de practicumopdracht te voltooien.
Toetsvorm:Bij het tentamen mag geen literatuur worden gebruikt, met uitzondering van de appendix van het diktaat (die wordt verstrekt bij de tentamenopgaven).
periode 2: Schriftelijk tentamen en 2 verplichte programmeeropgaven. De practicumcijfers P1 en P2 moeten beide >=6 zijn (anders is het eindcijfer maximaal 4). Het tentamencijfer wordt opgehoogd met (P1+P2-12)/8 punt, d.w.z. maximaal 1 bonuspunt bovenop het tentamencijfer bij een "uitstekend" practicum. (Het eindcijfer kan echter niet meer dan 10 worden). Herkansing voor het tentamen in maart, waarbij de practica geldig blijven.
periode 5: Het vak wordt beoordeeld aan de hand van drie toetsen (T1,T2,T3) en drie practica (P1,P2,P3). Het totaalcijfer voor de toetsen (T) is 0.2*T1+0.3*T2+0.5*T3 en evenzo voor de practica (P). Het eindcijfer voor het vak is dan (T+P)/2 onder de voorwaarde dat P≥5 en T≥5. Afronding gebeurt op halven boven de zes en op helen onder de zes, dus 5.5 wordt 6 en 5.4 wordt 5. Als een van de zes cijfers ontbreekt, blijft het vak 'onvoltooid'.
Als herkansing kan er een extra practicumopdracht worden gemaakt, die je kunt inzetten voor een van P1, P2 en P3 (om een onvoldoende of een ontbrekend cijfer te vervangen). Hetzelfde geldt voor de toetsen. Herkansings-practicum en -toets gaan over de hele stof, ongeacht voor welk van de drie hij als vervanging geldt.
Deelcijfers uit periode 2 kunnen niet in periode 5 worden gebruikt.
Inspanningsverplichting voor aanvullende toets:Om aan de aanvullende toets te mogen meedoen is ontbreken van ten hoogte 1 toetsactiviteit toegestaan.
Beschrijving:Dit is het eerste programmeer-vak, voorkennis anders dan elementaire computergebruiksvaardigheid is niet vereist. Aan de hand van (steeds ingewikkeldere) voorbeeldprogramma's wordt de syntax en semantiek van de belangrijkste constructies van Java behandeld. Vanaf het begin wordt object-georiënteerde modellering van de probleemstelling gebruikt. Een aantal standaard-libraries van Java wordt gebruikt, in het bijzonder AWT, waarmee interactieve muisgestuurde programma's gemaakt kunnen worden. Achtereenvolgens komen aan de orde (per genummerd item circa 1 college):
  1. Programma's:
    • Imperatief programmeren t.o.v. andere paradigma's (programma bestaat uit opdrachten om variabelen in het geheugen te veranderen)
    • Compiler versus interpreter; edit-compile-run cyclus
    • Kort Hello-programma (als applet, m.b.v. paint); opbouw van een programma: `opsomming van klassen, elke klasse een bundeling van methoden, elke methode een bundeling van opdrachten'.
    • Syntax en semantiek van methode-aanroep
    • Gebruik van een ontwikkelomgeving (momenteel JCreator)
  2. Variabelen:
    • Enkele methoden van klasse Graphics, als voorbeeld van het gebruik van een standaard-klasse
    • Gebruik van variabelen, om herhaling van numerieke constanten te vermijden
    • Toekenningsopdracht, declaratie, het type int
    • Layout- en naamgevingsconventies
    • Definitie van nieuwe methoden om te abstraheren van herhaalde blokken code
    • Definitie van parameters om methoden flexibeler te maken
  3. Interactie:
    • Parametriseren van een applet
    • De klasse String, conversie van int naar String
    • Opbouw van user-iterface met Button en Scrollbar
    • Event-listeners
  4. Iteratie:
    • Het while- en for-statement
    • Het type boolean, vergelijkingen, logische operatoren
    • Casus: renteberekening (met I/O via TextFields)
  5. Keuze:
    • Het if-statement
    • Toepassingen van `if': onderscheiden van Buttons, controle van teksten, berekenen van minimum
    • Casus: tekenen en nulpuntsbepaling van parabool
  6. Objecten en klassen:
    • Klasse als beschrijving van een object, declaratie van objectvariabelen
    • Casus: deeltje met plaats en snelheid als object
    • Eenvoudige animatie met Thread en sleep
  7. Inheritance:
    • Subklasse: toevoegen van nieuwe variabelen en methoden
    • Verschil tussen `is a' en `has a'
    • Interface-componenten als voorbeeld van klasse-hierarchie
    • User interface ontwerp met Layout-managers
    • Casus: 4-functie calculator
  8. Strings en arrays:
    • Het type char versus klasse String
    • Creatie en gebruik van strings
    • Casus: bepalen van letterfrequenties in een tekst (array als turf-tabel)
  9. Stand-alone applicaties:
    • Menu's en dialogen
    • Exceptions afhandelen
    • File I/O
    • Casus: triviale teksteditor
    • Console (command-line style) I/O
    • Casus: grep
  10. Eenvoudige algoritmen:
    • Zoek de kleinste in een array
    • Grote casus: herken de taal van een tekst op grond van een vergelijking van letterfrequenties (tevens een voorbeeld van een `lerend' programma)
  11. Modellering:
    • Image, 2D-array
    • Grote casus: bitmap-editor, met aparte klassen voor het abstracte model (array van booleans), de manipilatie daarvan, en de representatie op het scherm (in feite dus een kennismaking met het MVC-model)
    • Casus: Game of Life als voorbeeld van animatie
  12. Eenvoudige datastructuren:
    • De klassen Vector, Stack, StringTokenizer
    • Casus: de opbouw van een wegen-netwerk met klassen Weg, Stad (naam plus vector met uitgaande wegen), en Land (vector met steden)
    • Slot-casus: een route-zoekalgoritme in het wegen-netwerk
  13. Uitloop, vragenuur
  14. Optionele extra: C++ voor Java-kenners
Enkele didactische keuzen die gemaakt zijn in bovenstaande opzet:
  • Java als eerste taal
    • Meteen objectgeoriënteerd (daarom geen Pascal)
    • Sterk getypeerd dus beginners-vriendelijk (daarom geen C++)
    • Platform-onafhankelijk (daarom geen Delfi-Pascal of MFC-C++)
    • Uitbreidbaar, ook qua klassen (daarom geen Visual Basic of Javascript)
    • Mainstream (daarom geen Smalltalk of IYFTL)
  • Voorbereidend op vervolgvakken
    • Kiem wordt gelegd voor `nette' OO-aanpak, algoritmen en datastructuren, concurrency
    • Alle taalconstructies worden zelf geschreven en begrepen, geen gebruik van visuele wizards
    • Liever meer verschillende concepten en ideeën dan uitputtend alle standaard-methoden, -operatoren en taalconstructies
  • Voorbeeld-gebaseerd
    • Elk nieuwe concept wordt geillustreerd met een typisch voorbeeld
    • Voorbeeldprogramma's zijn gekozen als illustratie, en zijn daarom niet te veel opgetuigd met leuke extra'tjes die de aandacht te veel opeisen
    • De vier grotere casussen (editor/grep, taalherkenning, bitmapeditor, route-zoeker) demonstreren verschillende toepassingsgebieden en probleem-aanpakken (je kunt er zelfs de studierichtingen Alg, TKI, MTI en IenM in herkennen!)
  • Lichtgewicht OO
    • OO vanaf het begin; dit is niet iets wat je later kunt toevoegen
    • Niet te veel nadruk op OO-modellering (dus geen hoofdstuk 0 over het dierenrijk)
    • Leer hergebruiken: aanroep van methoden voor definitie ervan, maar definiëren en parametriseren van nieuwe methodes toch nog eerder dan while- en if-statement, arrays enz.
    • Klassen en methoden vroeg, maar inheritance pas wat later
  • Grafisch georiënteerd
    • Directere feedback van wat er gebeurt
    • Event-drive I/O-model belangrijker dan Stream-I/O
    • Gebruik van Thread wel voor eenvoudige animatie, maar geen aandacht voor synchronisatie-perikelen
wijzigen?