Lärare: Markus Saers.
UPPSALA UNIVERSITET
Inst. f. lingvistik och filologi
Kurssidan
Uppsala universitet
Hoppa över länkar

Svårare övningsuppgifter 1

Sätt gärna tänderna i någon av dessa. Jag hjälper naturligtvis till om du har några frågor.

Stack

En stack är en väldigt vanlig datastruktur, som bygger på samma princip som lagen om anställningsskydd: först in = sist ut. Det är med andra ord en samling där man kan lägga in och ta ut element, och när man tar ut ett element är det det senast inlagda man får.

Skapa en klass som heter IntStack, och som använder en vektor av heltal för att representera stacken. Om utrymmet tar slut ska den befintliga vektorn ersättas med en ny som är 10 % större. Givetvis ska de befintliga elementen bevaras. Klassen ska ha tre publika metoder: void push(int i), int top() och int pop(). Detta är de tre traditionella metoderna man applicerar på en stack. Metoden ”push” betyder att man lägger något på stacken, ”top” betyder att man tittar på det some ligger överst på stacken och ”pop” betyder att man tar bort det översta elementet på stacken. Vanligtvis låter man ”pop” returnera det element som den tog bort, men vill du går det bra att istället för int pop() implementer void pop(). Ett alternativs namn för ”top” är ”peek”. Implementera gärna det istället/också.

Som jag hintat ovan så brukar man implementera stacker så att de har lite mer utrymme än vad som minimalt krävs för att hålla alla elementen. Det betyder också att man är tvungen att hålla reda på var i vektorn det översta elementet befinner sig.

Testa

Skriv en class StackTest som lägger in ett par heltal i stacken, och sedan poppar coh skriver ut dem. Kontrollera att ordningen stämmer.

Utbyggnad

Nog är det bra att ha en stack som kan hålla heltal, men det vore än bättre att ha en som kunde hålla godtyckliga element. Läs på om ”generics” genom att google efter exempelvis &rquo;tutorial Java generics”, och gör om klassen så att den utnyttjar generics. Döp om den till Stack, och observera att det inte går att skapa vektorer av generiska typer, utan du blir tvungen att använda en annan samling. Kolla igenom java.util och leta rätt på någon som har egenskaper som liknar Javas inbyggda vektorer.

Testa din utbyggnad genom att skapa en klass som läser in strängar från standard input (med ex. Scanner), pushar dem på en sträng-stack, och sedan poppar dem en i taget. Kontrollera att ordningen är korrekt.

Riktigt intressant blir det först när man pushar och poppar om vart annat. Skapa en testklass som läser från standard input, när den läser en sträng ska den pushas, när den läser ett heltal ska den poppa så många strängar från stacken. Kontrollera så att stacken fungerar korrekt.

Ja, jag vet

Det finns redan en Stack-klass i java.util, men det är fortfarande lärorikt att implementera det själv.

Dokumentera!

Gör en utförlig dokumentation av klassen. Läs på om olika taggar man kan använda i samband med dokumentationen. Försök sätta dig in i vad en framtida användare kan tänkas behöva/vilja ha ut av dokumentationen. Testa programmet javadoc på din klass, och titta på resultatet. Om du lyckas publicera din dokumentation på webben kan jag agera användare och kolla ifall allt jag kan tänkas vilja veta framgår. Ett tips kan vara att använda ”directory-flaggan”, så att du kan styra var alla filerna hamnar (det blir ganska många).

Sun har en bra tutorial om javadoc. [html]

Ritprogram!

Vi har ju gjort en hel del olika former som vi ritat ut på ett SimpleWindow. Denna klass innehåller lite annat smått och gott också (t.ex. delay() som vi använde till Sierpinskitriangeln). Den kan också lyssna efter händelser. Det finns två typer av händelser: keyEvent och mouseEvent. Använd tangenthändelser för att avgöra vad användaren vill rita (t.ex. 'R' för rektangel), och lyssna sedan efter tillräckligt många mushändelser för att kunna rita ut den önskade formen.

Huvuddelen av programmet torde bestå i

while (true) { w.waitForEvent(); // Ta reda på vad det var för händelse och hantera den }

Hör gärna av dig om du kommer på en bättre lösning.

Skapa gärna metoder för utritande av de olika formerna (en som väntar på två mushändelser och sedan ritar ut en rektangel mellan de erhållna koordinaterna). Funder över hur man vet att en polygon fått tillräckligt många punkter... en idé är att användaren trycker på någon knapp när det räcker med punkter.

Man behöver också något sätt att öka coh minska linjebredden (trycka på '+' eller '-' kanske), samt något sätt att byta färg (antigen fasta knappar för olika färger, eller någon knapp för att cirkla igenom en förutbestämd lista med färger). Skriva gärna ut hur datorn tolkade händelserna på konsolen (System.out eller System.err).

Cirklar

Jag hittade en websida som beskriver hur man kan rita ut cirklar genom att dra ett antal linjer. Sidan använder något som kallas ActionScript (har ingen aning om vad det är), men det går ganska enkelt att omvandla till Java. Implementera en cirkelklass och lägg till den till ritprogrammet. [html]

En intressant egenhet är att man kan styra hur många linjer som ska ritas ut. Denna klass kan alltså användas för att rita liksidiga trianglar, kvadrater, pentagoner, hexagoner, septagoner, oktagoner, och vad det nu heter efter det. Utnyttja det här i ditt ritprogram, så att du några liksidiga månghörningar blir möjliga att rita.

För att kunna rita ut en cirkel krävs två musklick: ett för att ta reda på var mitten ska vara, och en för att beräkna hur stor radien ska vara (avståndet mellan punkter blir radien om det andra klicket ska ligga på omkretsen).