- groep een (di 13-15, do 11-13)
- groep twee (di 15-17, do 13-15)
herkansingsopdracht (ter vervanging van 1 van de vier kleine projecten)
Schrijf een programmaSociaal.java dat gegeven
een 2-dimensionaal grid van spelers voorzien van ballen,
als doel heeft de ballen rijkelijk gelijkelijk (zie onder voor een technische uitleg van deze vooralsnog vage notie) over de spelers te verdelen.
Daartoe kunnen spelers herhaaldelijk een bal aan een van hun buren
(volgens het grid) aanbieden.
Een mogelijke beginsituatie van een grid van 2 rijen bij
3 kolommen waarin 2*3*2 (d.w.z. 12) ballen in het spel zijn, is:
waar de rode pijlen de buurrelatie weergeven. Iets preciezer dient uw programma aan de volgende eisen te voldoen:
- het programma heeft als input 3 command-line argumenten, respectievelijk: het aantal rijen (r), het aantal kolommen (k), en het (gemiddeld) aantal ballen per speler (b).
-
Vervolgens worden r*k*b ballen op willekeurige wijze over
de r*k spelers verdeeld (b.v. de bovenstaande situatie
kan ontstaan uit een aanroep
java Sociaal 2 3 2), wordt deze situatie afgedrukt (op een door u te bepalen, maar duidelijke, wijze), en begint het spel. -
U dient de
Spelers van het spel als threads te modelleren. Er is geen centrale controle. -
Iedere speler weet (d.w.z. heeft velden of methoden die dat modelleren)
alleen hoeveel ballen hij bezit en wie z'n directe buren zijn
(tussen 2 (in de hoeken) en 4 (niet aan de randen)).
I.h.b. weet hij niet wie er nog meer in het veld zitten, of zelfs wat de dimensies van het veld zijn, of hoeveel ballen er in het spel zijn. -
Iedere speler heeft een methode
public boolean balhebben(Speler buur)die aangeroepen kan worden door een buur om een bal aan te bieden, en die door de speler geaccepteerd wordt (aangegeven via de return-waardentrue, waarbij hij dan 1 optelt, en de aanbiedende buur 1 aftrekt, van hun respectievelijke aantallen ballen, en deze transactie afgedrukt wordt) alleen als de buur op dat moment ten minste 2 ballen meer heeft dan de speler zelf. -
Iedere speler heeft een methode
public int aantalballen()die door een buur aangeroepen kan worden. - Een eindtoestand wordt bereikt als geen paar van naburige spelers bestaat zodanig dat het verschil tussen hun aantallen ballen groter is dan 1 (`bijna gelijkheid'). Uw programma hoeft niet te detecteren of zo'n eindtoestand bereikt is, maar dient het wel aan te geven steeds als een speler bijna gelijk is aan z'n buren in bovenstaande zin, en dan dient ook het aantal ballen dat die speler op dat moment bezit afgedrukt te worden.
Schrijf uw programma (de run methode van Speler) zo dat een willeurige
beginsituatie altijd resulteert in een situatie
waarin de ballen bijna gelijkelijk over de spelers verdeeld zijn.
B.v. een mogelijke uitkomst voor het bovenstaande voorbeeld is:
U mag naar believen methoden (ook de boven gespecificeerde)
synchronized maken (maar voorkom deadlocks!).
Bonuspunten kunnen verdiend worden door ofwel een eindtoestand
te detecteren, ofwel het algoritme uit te breiden zodat altijd
totale gelijkheid (waarin alle spelers precies evenveel
ballen hebben) bereikt wordt.
Dit programma dient zelfstandig (dus niet in tweetallen) gemaakt te worden. Lever uw codes voor vrijdag 24 februari 17:00 in bij de docent.
Opmerking voor het inleveren (27-01-2012)
Test voor het inleveren uw programma! Controleer in ieder geval dat het doet wat het zou moeten doen voor enige eenvoudige formules zoals b.v. new En(new Atoom(1),new Niet(new Atoom(1))) (onvervulbaar dus Herbrand normaalvorm 0), new Of(new Atoom(1),new Niet(new Atoom(1))) (tautologie dus Herbrand normaalvorm 1), new Of(new Atoom(1),new Niet(new Atoom(2))) (contingent), new Exof(new Exof(new Waar(),new Atoom(1)),new Atoom(1)) (tautologie dus Herbrand normaalvorm 1). Probeer zelf 5 andere interessante formules om mee te testen uit.Practica 14-16 (donderdag 19, dinsdag 24, donderdag 26 januari 2012)
-
Werk aan de eindopdracht.
Probeer de klassen geschikt in een package/packages te plaatsen.
Lever het voor het eind van de periode (vrijdag 27 januari 2012, 17:00 uur Utrechtse tijd), in op het adres: java-eind@phil.uu.nl.
Nota bene: u mag de gegeven interface op geen enkele manier veranderen. U dient hem te gebruiken zoals gegeven.
Practicum 13 (donderdag 12 januari 2012)
-
Werk aan deel 1 van de vierde inleveropgave,
Inleveropgave:
- deel 1: implementeer de interface Formule.java zodanig dat het testprogramma Test.java volgens de specificatie werkt. Aanvulling 13-1-2012: Het programma kan een uitzondering gooien, zoals beschreven, die RuntimeException uitbreidt, d.w.z. u kunt daartoe de basisklasse OnvoldoendeBedeling.java naar wens/geschikt uitbreiden.
- deel 2 (optioneel, voor bonus): toon de stapsgewijze transformatie naar Herbrand normaalvorm in een GUI (zie b.v. de eenvoudige GUI bij de eindopdracht van vorig jaar).
Practicum 12 (dinsdag 10 januari 2012)
- (input/output en exceptions)
Pas een versie van het life programma (b.v. die van het hoorcollege van 8 december 2011) zodanig aan dat, achtereenvolgens:- de uitvoer naar een bestand life.txt wordt geschreven in plaats van naar het scherm;
- de uitvoer zowel naar het scherm als naar het bestand life.txt wordt geschreven;
- het programma na iedere iteratie wacht tot de gebruiker enter intoetst voor aan de volgende iteratie te beginnen;
- het programma optioneel een command-line argument heeft dat dan specificeert uit welk bestand de beginsituatie gelezen dient te worden;
-
Werk verder aan de derde inleveropgave.
Probeer de klassen geschikt in een package/packages te plaatsen.
Lever het voor donderdag 12 januari 2011, 9:00 uur Utrechtse tijd, in op het adres: java-3@phil.uu.nl
Practicum 11 (donderdag 5 januari 2012)
- (packages) Plaats de klassen van de practicumopgaven van dinsdag geschikt in packages.
-
Werk verder aan de derde inleveropgave.
Probeer de klassen geschikt in een package/packages te plaatsen.
Lever het voor donderdag 12 januari 2011, 9:00 uur Utrechtse tijd, in op het adres: java-3@phil.uu.nl. Vermeld in het commentaar van (ieder!) ingeleverd programma uw naam en studentnummer.
Practicum 10 (dinsdag 3 januari 2012)
- (abstract classes en javadoc)
Beschouw de interface IText.java en de abstracte klasse AText.java die alleen het leegmaken van de tekst (de methode clear) implementeert en de overige methoden abstract laat.- Bestudeer de code, compileer het (genereer java bytecode mbv javac) en maak het commentaar op (genereer html mbv javadoc), en bekijk het resulterende bestand index.html in een webbrowser.
- Schrijf een klasse Text.java die AText.java uitbreidt zodanig dat TestText.java runnen het in het commentaar beschreven effect heeft. Voorzie de klasse van geschikt javadoc commentaar en bekijk de gegenereerde index.html van alle klassen (mbv javadoc *.java) in een browser.
-
(dynamic dispatch)
inheritance kan in combinatie met dynamic dispatch gebruikt worden om gedrag dat afhankelijk is van een type zonder if-statements te modelleren. Concreet:- Beschouw de klasse Mens.java die een boolean veld isMan heeft om aan te geven of het een man dan wel een vrouw betreft, die ook gebruikt wordt bij het afdrukken van een Mens object met behulp van toString. Het programma TestMens.java illustreert het gebruik van de klasse Mens door een rijtje van 3 mensen, een man twee vrouwen, aan te maken en dat rijtje af te drukken.
- In plaats van een boolean te gebruiken kunnen we ook een klasse Mens1.java uitbreiden tot twee subklassen Man.java en Vrouw.java, ieder met een geschikte toString methode zodanig dat het runnen van het programma TestMens1.java hetzelfde effect heeft als eerder, waarbij nu geen conditionele statement (?:) meer gebruikt wordt, maar als het ware door de objecten zelf bepaald wordt hoe ze afgedrukt worden. Schrijf de klassen Man.java en Vrouw.java.
-
(voor liefhebbers)
Het bovenstaande kan tot in het extreme doorgevoerd worden. Een voorbeeld hiervan zijn de volgende klassen die Life implementeren zonder dat er ook maar een conditionele statement of expressie aan te pas komt (in ruil daarvoor zijn er wel meer klassen): Getal.java, Nul.java, Een.java, Twee.java, Drie.java, Vier.java, Hokje.java, Levend.java, Veld.java en TestLife.java. Probeer te begrijpen en verklaren hoe en waarom dit programma werkt.
- Werk verder aan de derde inleveropdracht.
Practicum 9 (dinsdag 13 december 2011)
- (interface)
Beschouw de interface IText.java
en geef twee implementaties van deze interface:
- de eerste
StringTextslaat de tekst op als eenString - de tweede
ArrayTextslaat de tekst op als een array vanchar's. - Beide programma's dienen de correct uitvoer te geven bij het testprogramma TestText.java.
- de eerste
- (inheritance)
Doe opgave 7.2 uit het boek:
Create a subclass ofTwoDShapecalledCircle. Include anarea()method that computes the area of the circle and a constructor that usessuperto initialize theTwoDShapeportion.
Opmerking: alle programma's uit het boek zijn op de site van de uitgever te vinden, zie de homepage van deze cursus (klik op de ietwat schreeuwerige downloads linksonder, zoek dan op Java: A Beginner's Guide, Fourth Edition etc.). - Begin te werken aan de de derde inleveropgave, zie onder.
Inleveropgave 3 voor het vak Imperatief en Objectgeorïenteerd Programmeren voor CKI
De inleveropgave is op 2 januari geupdatet! Lees de opgave nogmaals goed door!
Het doel van deze opgave is het simuleren van een ecosysteem waarin konijnen en vossen in een predator-prooi relatie leven. Het is de bedoeling dat je vier klassen schrijft.
-
Schrijf een abstracte klasse
Dierwelke de interface IDier.java (update: 2-1) implementeert. InDieris alleen de methodeloopgeïmplementeerd; de andere methoden blijven abstract. -
Schrijf een klasse
Konijnwelke de abstracte klasseDieruitbreidt.Konijnimplementeert de volgende methoden:-
Een methode
verjaarmet grenswaarde voor de leeftijd van 12 en kans om te stervenpks. -
Een methode
plantVoortwaarbij konijnen na zich voortgeplant te hebben zich voor de komende 3 tijdstappen niet meer kunnen voortplanten. Het lamprei verschijnt op een willekeurige plek in de omgeving. -
Een methode
eet. In onze implementatie van een ecosysteem eten konijnen niet (konijnen zijn vegetariers), dus deze methode is leeg. -
(update: 2-1) Een methode
getGegeten. In onze implementatie van een ecosysteem eten konijnen niet (konijnen zijn vegetariers), dus deze methode returnt een opvullingswaarde. -
(update: 2-1) Een methode
resetGegeten. In onze implementatie van een ecosysteem eten konijnen niet (konijnen zijn vegetariers), dus deze methode is leeg.
-
Een methode
-
Schrijf een klasse
Voswelke de abstracte klasseDieruitbreidt.Vosimplementeert de volgende methoden:-
Een methode
verjaarmet grenswaarde voor de leeftijd van 24 en kans om te stervenpvs. -
Een methode
eetwelke ten hoogste één naburig konijn verwijdert met kanspvek. -
Een methode
plantVoortwaarbij vossen na zich voortgeplant te hebben zich voor de komende 6 tijdstappen niet meer kunnen voortplanten, en deze twee vossen samen tenminste drie konijnen gegeten moeten hebben. Na voortplanten wordt het aantal konijnen dat elk gegeten heeft teruggezet op nul. De welp verschijnt op een willekeurige plek in de omgeving. -
(update: 2-1) Een methode
getGegetenwelke het aantal genoten consumpties tot nog toe van deze vos teruggeeft. -
(update: 2-1) Een methode
resetGegetenwelke de teller van het aantal genoten consumpties van deze vos terug op nul (0) zet.
KonijnenVoshetzelfde zijn, mogen inDiergezet worden. U mag zelf hulpmethoden definiëren, maar denk hierbij aan de mogelijkheid om methoden private/protected te maken. Maak bijvoorbeeld elke methode die niet in de interface voorkomt private. -
Een methode
-
Schrijf een klasse
Ecosysteemwelke de interface IEcosysteem.java implementeert. Deze klasse begint als volgt:double pks = 0.3; // kans Konijn Sterft double pvs = 0.4; // kans Vos Sterft double pvek = 0.9; // kans Vos Eet Konijnen heeft eenIDier[][]als representatie van de wereld. Bedenk zelf een oplossing om correct met randen om te gaan (voor inspiratie, zie Game of Life uit practicum 5). Schrijf een constructor voorEcosysteemvan de vormEcosysteem(int hoogte, int breedte, int aantalKonijnen, int aantalVossen)
die de wereld initialiseert en de konijnen en de vossen een willekeurige plaats in het ecosysteem geeft. Schrijf een methode voorEcosysteemgenaamdrundie één tijdstap (een jaar verder gaan) simuleert. In elke tijdstap:- kunnen vossen konijnen opeten;
- kunnen dieren zich voortplanten;
- kunnen dieren sterven of ouder worden; en
- zet elk levend dier een stap naar een willekeurig aangrenzend leeg veld.
Schrijf eentoString-methode voorEcosysteemdie een begrijpelijke representatie van het ecosysteem uitvoert, met op de regel daaronder het aantal levende konijnen en vossen.
pks, pvs en pvek
zodat de populatie meestal na 80 generaties nog leeft (minstens 2 konijnen en 2 vossen).
Zet dit in commentaar bij deze variabelen in Ecosysteem.
Commentaar voor deze klassen dient in de stijl van javadoc geschreven te worden,
zoals al gedaan is voor de interfaces.Lever deze vier klassen plus de javadoc in als een zipbestand met als naam studentnummer.zip.
Opmerkingen
-
Schrijf, om zelf te kunnen testen dat uw ecosysteem aan het bovenstaande voldoet,
een testklasse met een
main, die een aantal tijdstappen van het programma uitvoert. Je kan hierin bijvoorbeeld elke 10de tijdstap het veld printen, of het aantal vossen en konijnen. Deze klasse is vrij in te vullen en hoeft niet ingeleverd te worden.
-
Voor de generatie van willekeurige getallen, zie
de methode
randomuit de klasseMath. - Het bovenstaande legt lang niet alles van het ecosysteem vast. Beargumenteer in het commentaar steeds de design decisions die u neemt.
Bonusopgaven:
-
Vind een combinatie van
pks,pvsenpveken constructorargumenten die met grote kans in de 400ste generatie nog leven bevat (tenminste 2 konijnen en 2 vossen). -
Schrijf een alternatieve constructor voor
Ecosysteemmet een vijfde argumentint konijnenholen. Zorg ervoor dat er in een ecosysteem gemaakt met deze constructor het gegeven aantal konijnenholenbojecten is, waarvoor geldt:- Als een konijn op een konijnenhol stapt, komt hij uit een willekeurig ander konijnenhol waar geen vossen in de directe omgeving van zitten (aangrenzende cellen).
Practicum 8 (donderdag 8 december 2011)
-
hetzelfde als maandag 5 december.
Practicum 7 (maandag 5 december 2011)
- (static)
Zie de laatste opdracht van donderdag. Doe die eerst als
u hem nog niet gedaan had. Of ga anders uit van de
volgende basale oplossing (van het eerste onderdeel)
na haar bestudeerd te hebben:
Persoon.java en
Vriendenkring.java.
Voeg een statisch veldstatic int totaalaantal
toe aan de klassePersoonen maak uw code zo dattotaalaantalop ieder moment het totaal aantal gecreeerde personen tot op dat moment is. Voeg ook een veldboolean geslacht
aan de klasse, die het gesslacht van de persoon representeert. - (private)
Pas de programma's zodanig aan dat alle velden
van de klasse
Persoonprivate zijn. - (toString)
Schrijf een methode zodanig dat als een object
van type
Persoonafgedrukt wordt, de naam, het geslacht, en alle directe vrienden van die persoon afgedrukt worden. -
Pas de klasse
Persoonaan zodanig dat iedereen willekeurig veel vrienden en vriendinnen kan hebben. Schrijf ook een methodeboolean bevrienden(Persoon p)
waarvan aanroepen ervoor zorgt dat persoon p aan de vrienden van deze persoon toegevoegd wordt en dietrueals waarde teruggeeft (ten teken dat deze persoon inderdaad p als vriend(in) wil). - Werk verder aan de tweede inleveropgave. Lever het voor maandag 12 december 2011, 15:00 uur Utrechtse tijd, in op het adres: java-2@phil.uu.nl. Vermeld in het commentaar van (ieder!) ingeleverd programma uw naam en studentnummer.
Practicum 6 (donderdag 1 december 2011)
- (Arrays) Doe Project 5-1 uit het boek, maar dan voor selection sort in plaats van bubble sort. Selection sort werkt door een nieuwe array van getallen te maken (van dezelfde lengte) en uit de originele rij van getallen steeds het kleinste getal te nemen (selecteren), dat eruit weg te halen en toe te voegen aan de nieuwe rij. Dus b.v. op de array {3,1,4} wordt eerst 1 geselecteerd, dan 3 uit de resterende array {3,4} en ten slotte 4 uit {4}.
- (Strings)
Schrijf (zelf) een (programma met) methode
draaiomdie een gegeven String omdraait. B.v. de String "tafel" geeft als waarde "lefat" terug. Wat is de signatuur van de methode? Schrijf zowel een iteratieve (m.b.v. een loop) als een recursieve variant. - (Objecten)
Schrijf een klasse
Persoondie twee veldenvriendinenvriendvan typePersoonheeft en een veldnaamvan typeString. Schrijf vervolgens een programmaVriendenkringdat voor een gegeven object van typePersoonde namen van de gehele vriendenkring van die persoon afdrukt (zonder dubbelen; vrienden van vrienden etc. behoren ook tot de vriendenkring). Schrijf een methodecheckdie checkt of de informatie voor een vriendenkring consistent is in de zin dat vriendschappen altijd wederzijds zijn. Idem maar dan zodanig dat een persoon niet zowel vriend van een iemand als vriendin van iemand anders kan zijn. - Werk verder aan de tweede inleveropgave.
Practicum 5 (dinsdag 28 november 2011)
-
Maak achtereenvolgens de volgende varianten van
het op het hoorcollege gemaakte programma Life.java
voor de Game of Life (zie de hoorcollege pagina).
(U kunt dat als basis voor de aanpassingen nemen,
maar mag natuurlijk ook uw eigen programma schrijven.)
- De `wereld' in het op het college gemaakte programma is een torus in de zin dat de cellen geheel rechts grenzen aan de cellen geheel links, en idem voor onder en boven. Pas het programma aan (zonder de wereld groter te maken) zodat dat niet het geval is, en de cellen aan de randen dus minder buren hebben (anders gezegd, zodat de cellen buiten de grenzen als dood gezien worden).
-
Doe hetzelfde als in het voorgaande onderdeel, maar
nu door de wereld `groter te maken' door een `rand
van dode cellen' toe te voegen (een 5 bij 5 array te maken)
en alleen opvolgertoestanden te berekenen voor cellen
die niet aan (die nieuwe) rand liggen.
Welke van deze twee oplossingen heeft uw voorkeur en waarom? - Pas het programma aan, zodat het werkt voor een willekeurig aantal rijen en een willekeurig aantal kolommen, d.w.z. het werkt door die aantallen slechts op 1 plaats in het programma aan te passen, en test het door een zogeheten glidergun te maken.
- Werk aan de onderstaande tweede inleveropgave (dinsdag om 11:00 geplaatst).
Tweede Inleveropgave
Deze opdracht gaat over een simpel soort woordpuzzels, die uit twee elementen bestaan:-
Een verzameling woorden W, die zijn opgebouwd uit kleine letters uit het Latijnse alfabet.
(Lees over het Latijnse alfabet op wikipedia. Woorden worden gerepresenteerd als Strings. Lees Hoofdstuk 5.8 uit het boek en de String API.) - Een grid (= een rechthoekig vlak, opgebouwd uit hokjes) G met afmetingen hoogte x breedte. Elk hokje in G bevat een kleine letter uit het Latijnse alfabet.
De puzzel moet voldoen aan een aantal correctheidscriteria:
Voor W moet gelden:
- De chars in de strings zijn kleine letters uit het Latijnse alfabet.
- Hetzelfde woord mag niet meerdere keren voorkomen in W.
- Het lege woord, "", mag niet voorkomen in W.
- De strings in de tweedimensionale array bevatten allemaal precies 1 char, die een kleine letter uit het Latijnse alfabet is.
-
Alle rijen hebben dezelfde lengte, evenals alle kolommen.
(G moet een rechthoek zijn. Het mag een vierkant zijn zoals in het onderstaande voorbeeld maar dat hoeft niet.)
- W = {"boom","ma","maat","kas","kast","as","boek","boot"}.
- G = {{"b","o","e","k"},{"o","o","z","a"},{"o","j","o","s"},{"m","a","a","t"}}.
-
Het programma bevat een methode
boolean isCorrectWords(String[] words)
die nagaat of de correctheidscriteria voorwordsgelden. Voor de hierboven gedefinieerde invoer W heeft deze methode dus als output:true
-
Het programma bevat een methode
boolean isCorrectGrid(String[][] grid)
die nagaat of de correctheidscriteria voorgridgelden. Voor de hierboven gedefinieerde invoer G heeft deze methode dus als output:true
-
Het programma bevat een methode
int[] check(String word, String[][] grid)
die voor een (correct) woord en een (correct) grid, de coördinaten teruggeeft waar het woord zich in het grid bevindt en de richting, als een array van drieints bestaande uit respectievelijk de rij, de kolom, en de richting (HORIZONTAAL == 1, VERTICAAL == 2, DIAGONAAL == 3, komt niet voor == 0).
B.v. voor het woord "as" en het grid G dient de methode een array met waarde (rij) 1 op index 0, (kolom) 3 op index 1, en (VERTICAAL) 2 op index 2 terug te geven. -
Het programma bevat een methode
String[][] solve(String[] words, String[][] grid)
die ieder woord uitwordsopzoekt ingriden haakjes zet om de letters die bij het woord horen, en het resultaat en de coördinaten van de gevonden woorden afdrukt en teruggeeft. Voor de hierboven gedefinieerde invoer dient de methode exact de volgende uitvoer te geven:(((b))) (o) (e)(((k))) (o) (o) z (((a))) (o) j (o)(((s))) (((m)))((a))(a)(((t))) boom --> {(0,0),VERTICAAL)} ma --> {(3,0),HORIZONTAAL)} maat --> {(3,0),HORIZONTAAL)} kas --> {(0,3),VERTICAAL)} kast --> {(0,3),VERTICAAL)} as --> {(1,3),VERTICAAL)} boek --> {(0,0),HORIZONTAAL)} boot --> {(0,0),DIAGONAAL)}en het, van haakjes voorziene, grid als waarde terug te geven. Een string "a" in het invoergrid, waarvan de 'a' voorkomt in een woord uitwords, komt er in de uitvoer dus als "(a)" uit. Als een bepaalde letter in hetgridonderdeel is van meerdere woorden uitwords, dan is het de bedoeling dat er voor elk woord uitwordswaarvan de letter op die plaats onderdeel is, 1 paar haakjes om de letter heen komt te staan.
Hetgridmoet zodanig geprint worden, dat alle letters netjes onder elkaar staan. Daaronder moeten dewordsonder elkaar worden geprint, met achter ieder woord de coördinaten ingridwaarop dat woord begint en de richting waarin het woord loopt, ook precies in het hierboven gespecificeerde formaat. (Dit specificeert niet wat de uitvoer moet zijn als een woord niet precies een keer voorkomt. Maak daar zelf, in het commentaar gemotiveerde, zinvolle keuzes.)
-
Schrijf methodes
int[] checkTorus(String word, String[][] grid)
enString[][] solveTorus(String[] words, String[][] grid)
die hetzelfde doen als de eerdere methodes maar dan voor "om het grid heen gewikkeld" zoeken. B.v. wordt dan het woord "ko" in het grid G gevonden, DIAGONAAL op rij 0, kolom 3. (Maak zelf een (gemotiveerde) keuze of een woord "in z'n eigen staart kan bijten" dus of het woord "tenten" gevonden wordt in het grid {{"t","e","n"}}.) - Het hierboven gespecificeerde uitvoerformaat is niet ideaal: er wordt zowel een van haakjes voorzien grid afgedrukt, als de coördinaten en richting waar de woorden gevonden zijn. Noch alleen het grid weergeven noch alleen de coördinaten en richtingen weergeven zou inzichtelijk zijn (je wilt direct kunnen zien in het grid waar welk woord gevonden is). Een inzichtelijk uitvoerformaat vinden is niet gemakkelijk getuige het geklieder in woordzoek puzzels in kranten. Zo'n (wel) inzichtelijk uitvoerformaat vinden en programmeren geldt eveneens als bonus (dus laat je creativiteit de vrije loop!).
Practicum 4 (donderdag 24 november 2011)
-
Schrijf een recursieve versie Omgekeerdrec
van het programma Omgekeerd uit practicum 3.
Dat wil zeggen, zowel de methode
omgekeerdals de methodeomkerendienen recursief te zijn (ze mogen in het bijzonder geen gebruik maken van loop constructies zoals while, do, for). -
Schrijf een programma dat een getal omkeert in het zestien-tallig
stelsel en vervolgens afdrukt (weer in het zestien-tallig stelstel),
waarbij alleen gebruik gemaakt wordt van het
afdrukken van karakters (dus niet van het
afdrukken van getallen).
Hint: gebruik switch. -
Werk verder aan uw inleveropgave.
Lever het voor maandag 28 november 2011, 15:00 uur Utrechtse tijd, in op het adres: java-1@phil.uu.nl. Vermeld in het commentaar van (ieder!) ingeleverd programma uw naam en studentnummer.
Practicum 3 (dinsdag 22 november 2011)
- Als u de opgaven van Practicum 2 nog niet af heeft, maak die dan eerst af.
- Probeer vervolgens het eerste onderdeel van de inleveropgave te schrijven, evt. afgewisseld met de volgende opgaven.
- Pas het op het hoorcollege geschreven programma Ggd.java (te downloaden van de hoorcollege pagina) aan tot een programma GggKgv.java dat ook een methode heeft om het kgv (kleinste gemene veelvoud) van getallen te berekenen. Test uw methode door het kgv van een aantal interessante paren getallen te berekenen. (Wat is de footprint/signature van de kgv methode? Komt de al geschreven methode ggd van pas voor het berekenen van het kgv?)
-
Schrijf een programma Omgekeerd dat
een methode met signature
void omgekeerdafdrukken(int getal)
heeft die een gegeven positief getal omgekeerd afdrukt, b.v. op 15, 2200, 0, 507 respectievelijk 51,0022,0,705 oplevert. (Bedenk eerst hoe u een getal splits in z'n laagste decimaal en de tienvouden; herhaal dit vervolgens voldoende vaak.) Voeg vervolgens een methodeint omkeren(int getal)
toe die het omgekeerde getal als resultaat oplevert. Test uw programma steeds.
Practicum 2 (donderdag 17 november 2011)
Oefenopgaven
-
Schrijf een programma Kwadraten
dat achtereen volgens
1, 1+3, 1+3+5, 1+3+5+7, ..., 1+3+5+7+9+...+99
afdrukt.
Is de naam van het programma in overeenstemming met de uitvoer en waarom? -
Schrijf een programma Deel
dat van twee gehele getallen vast stelt of
het eerste deelbaar is door het tweede.
B.v. voor 5 en 7 dient er uitgevoerd te worden:
5 deelt 7 niet (rest 2), en voor 2 en 6 dient er uitgevoerd te worden:2 deelt 6 (2 * 3 = 6).
Bedenk zelf wat er zou dienen te gebeuren in andere gevallen (negatieve getallen, nul). -
Schrijf een programma Kwadraattot
dat een methode
void kwadraattot(int n)
heeft die voor een willekeurig niet negatief getal n de kwadraten van de getallen 1 tot en met n afdrukt.
Test uw methode door hem voor verschillende waarden van n aan te roepen. -
Schrijf een programma Deelt
dat een methode
boolean deelt(int n,int m)
heeft die voor willekeurige gehele getallen n en m true geeft dan en slechts dan als n een deler van m is.
Test uw methode door hem voor interessante waarden van n en m aan te roepen. (Wat zijn interessante waarden en waarom?)
Eerste Inleveropgave
Schrijf een programma Palindromen dat de volgende methoden bevat:-
Een methode
int decNaarBin(int x)
die een willekeurig positief geheel getal x omzet naar een ander getal dat, als het afgedrukt wordt (als decimaal getal) de binaire representatie van x geeft (zonder nullen aan het begin). Bijvoorbeeld wordt 4 omgezet naar 100, 5 naar 101, 15 naar 1111 en 70 naar 1000110.
(Lees over binaire representaties op wikipedia.) -
Een methode
boolean checkPalindroom(int x)
die van een willekeurig positief getal bepaalt of het een palindroom is, dwz of het getal van rechts naar links gelezen (in decimale notatie) hetzelfde is als het getal van links naar rechts gelezen. Vb van palindromen: 2, 262, 1771, 24542, 1657887561. Maar niet: 81, 200, 24524. De methode geeft een boolean terug die true is als het getal een palindroom is en false anders.
(Lees over palindromen op wikipedia.) -
Zet als eerste statement van de main methode van het programma een definitie van de vorm
int x = ...;
waar voor x willekeurige positieve getallen ingevuld moet kunnen worden. Van zo'n willekeurig getal moet als uitvoer worden gegeven, achtereenvolgens:- de decimale representatie van het getal
- de binaire representatie van het getal, als berekend m.b.v. de methode decNaarBin
- of de decimale representatie van het getal palindromisch is, als bepaald m.b.v. de methode checkPalindroom
- of de binaire representatie van het getal, palindromisch is.
- 1 geeft als uitvoer: 1 1 ja ja
- 21 geeft als uitvoer: 21 10101 nee ja
- 212 geeft als uitvoer: 212 11010100 ja nee
- 300 geeft als uitvoer: 300 100101100 nee nee
- Bonus: Zorg dat de main method, behalve bovenstaande output, ook als output alle decimale getallen van 0 t/m 500 levert die zowel decimaal, als binair als in het octale stelsel palindromisch zijn. Output moet dus van de vorm zijn: 1, 3, 5, 7, 9, 15, ..., 495. (getal gevolgd door komma, spatie en daarna weer een getal). Voor het omzetten van binaire getallen naar getallen in het octale stelsel mag een extra methode geschreven worden.
- Je mag geen API-functionaliteit gebruiken behalve dan die nodig is voor uitvoer (System.out.print/System.out.println), en ook geen gebruik maken van String variabelen.
- Vermeld in het commentaar van ieder ingeleverd programma je naam en studentnummer;
- De uitvoer dient exact in het formaat zoals boven aangegeven te zijn.
- U heeft drie practica de tijd om aan deze opgave te werken.
- Ga de beoordelingscriteria na voor uw programma.
Voor gevorderden (optioneel)
Schrijf een programma Quine waarvan het enige dat het doet is dat het zichzelf afdrukt. Iets preciezer, uw programma dient aan de volgende eisen te voldoen:-
Het uitvoeren van de commandline instructies:
$ javac Quine.java $ java Quine > Quine.txt $ diff -s Quine.java Quine.txt
dient als uitvoer te leveren:Files Quine.java and Quine.txt are identical
Ter verduidelijk, het Unix commando diff kan gebruikt worden om te testen of twee bestanden, hier de broncode Quine.java en de uitvoer Quine.txt van het programma, gelijk zijn of niet. - U mag alleen gebruik maken van operaties op Strings, en escape codes. In het bijzonder mag u: - geen gebruikmaken van kennis van unicode-codepoints - geen gebruikmaken van input (b.v. een programma dat de broncode van het programma zelf inleest en afdrukt is niet toegestaan). - het bestand Quine.java niet veranderen door het runnen van het programma Quine.
Practicum 1 (dinsdag 15 november 2011)
Het doel van het practicum is te zorgen dat iedereen practicum kan doen (kan inloggen) en op basis niveau vertrouwd raakt met de edit-compile-test cyclus, en met basale Java syntax.-
Het compileren en executeren van Java programma's gebeurt
in een zogeheten terminal, zoals gedemonstreerd op het hoorcollege.
Op de practicumcomputers kunt u een terminal programma vinden in de map
Utilities van de map Applications. Start een terminal.
Java programma's dienen met een zogeheten editor aangemaakt te worden
(dus geen tekstverwerkingsprogramma's, ihb geen Word).
Er zijn vele editors op de practicumcomputers geinstalleerd,
bv in Network Applications staan: SubEthaEdit, TextMate, TextWrangler,
Aquamacs Emacs, en nog vele andere. Start een editor en
open het bestand HelloWorld.java.
Compileer het door in de terminal in te tikken
javac HelloWorld.java
Als dit geen foutmelding oplevert (dat zou zo behoren te zijn), levert dit een nieuw bestand HelloWorld.class op, dat u kunt uitvoeren door in de terminal in te tikkenjava HelloWorld
Als nu in de terminalHello World!
verschijnt heeft u zojuist uw eerste Java programma uitgevoerd. Verander vervolgens het uitroepteken in het programma (in de editor) in een vraagteken, en doorloop de bovenstaande cyclus (compileren, uitvoeren) nogmaals om te zien dat er danHello World?
in de terminal verschijnt. -
Doe opgave 1.9 uit het boek (blz. 34):
The moon's gravity is about 17 percent that of earth's.
Write a program that computes your effective weight on the moon.
(Een gemakkelijke manier is om uit te gaan van een bestaand programma, zoals b.v. HelloWorld en dat aan te passen (in uw favoriete editor).)
beoordelingscriteria (inleveropdrachten)
- Het betreft individuele opdrachten (op de vierde opdracht na).
- leesbaarheid (maximaal 5 punten aftrek)
- correctheid (maximaal 10 punten aftrek)
- runbaarheid (niet runbaar, niet hoger dan een 5)
- gebruik van standaard APIs (verplicht vanaf 2de opgave)
(maar verboden bij eerste inleveropgave) - stijl
- correctheid voor randgevallen (bv lege input)
- motiveer steeds, in het commentaar, design-decisions die u maakt