Hoppa till huvudinnehållet
Institutionen för informationsteknologi

Förslag på projektuppgifter

Inledning

Nedan följer ett antal större programmeringsuppgifter. En av dessa uppgifter ska lösas och senare presenteras på ett seminarium (se särskilda anvisningar för detta). Egna idéer till uppgifter är välkomna.

Uppgiften ska lösas i grupper om två. Det maximala antalet grupper som får välja en och samma uppgift är begränsat.

Slutredovisning

En skriftlig rapport med programlistningar ska lämnas in i två exemplar 29 maj kl 10.15 till Pavel, postfacket på plan 4, hus 1, vid kopiatorerna. Anders tilldelar varje grupp en seminarietid. Listan över seminarietider anslås senast 29 maj 15.00. Önskemål om en viss tid accepteras inte, annat än av mycket starka skäl, såsom exempelvis att någon vill undvika en viss tid pga. av en nära släktings studentexamen eller liknande. Den som lämnar sådana önskemäl ska på begäran kunna visa dokument som styrker argumentet. Sådana önskemål ska lämnas på ett separat blad, fasthäftat först i båda exemplaren av den inlämnade rapporten.

Muntligt samarbete mellan grupper är tillåtet och rekommenderat, så länge olika uppgiftslösningar "inte liknar varandra". Samarbete med grupper som löser samma uppgift ska redovisas i rapporten.

I rapporten ska åtminstone följande punkter ingå:

  • En försättsida, med projektets titel, projektdeltagarnas namn och personnummer, samt egenhändiga namnteckningar av samtliga projektdeltagare.
  • En beskrivning av uppgiften
  • En översikt av uppgiftslösningen
  • Begränsningar i den genomförda lösningen
  • Antaganden utöver uppgiftsformuleringen samt förklaringar till varför dessa antaganden gjorts och varför de är rimliga
  • Kortfattad redogörelse för muntligt samarbete med grupper med samma uppgift
  • Beskrivning av och motivering till valda klasser
  • Beskrivning av metoder
  • Förslag till förbättringar, vidareutveckling etc.
  • Erfarenheter och slutsatser
  • Användarhandledning
  • Anvisningar till någon som vill provköra ert program
  • Uppgifter om var filerna finns och vad den heter. Tänk på accessrättigheterna. Dina filer ska vara läsbara för samtliga, när projektet är klart. Det innebär att samtliga dina kurskamrater ska kunna läsa och ladda hem dessa. Kontrollera gärna att du har gjort rätt, genom att be en kurskamrat kontrollera, att du har satt läsrättigheterna rätt. Felaktiga läsrättigheter, så att dina kurskamrater inte kan läsa din färdiga uppgift vid inlämningen innebär automatiskt att uppgiften underkänns

Det finns inga formella krav på rapportens ommfattning. 4 -5 sidor utöver försättssidan är rimligt, men både kortare eller längre rapporter kan motiveras.

Dessutom ska programlistningar lämnas in.

Rapporten får skrivas på svenska eller engelska.

Uppgiftslösningen

Lösningen ska spegla god programmeringssed för objektorienterad programmering, och ska på ett relevant sätt spegla klassbegreppet.


Du behöver inte använda en mer avancerad in och utmatning än den som ges av paketet extra.* annat än för de uppgifter där det uttryckligen anges att ett grafiskt eller mer avancerat användarsnitt ska användas. Du behöver heller inte kontrollera indata annat än i de uppgifter då detta anges som ett krav.


Du kan också göra din bildskärmshantering mycket enkel och mycket ful. Det är tillfyllest om skärmen skrivs om för varje drag i samband med spel, reservation i samband med bokning etc. som visas, om inte uppgiftstexten specificerar något annat.

Många uppgifter blir lättare att lösa eller, i vissa fall, kräver programspråkskonstruktioner som inte är centrala i kursen och som inte är detaljstuderade i undervisningen. Exempel på sådana konstruktioner är arrayer med fler dimensioner än en (såsom matriser) eller arrayer som innehåller objekt ur klasser. Inga av dessa konstruktioner är komplicerade, men en lässtund i Skansholm kan rekommenderas. Olika "exotiska" eller "märkliga" konstruktioner, som förvisso existerar i Java behövs inte för någon uppgift och rekommenderas inte heller.

Bestäm dig för en ambitionsnivå och håll dig till den. Att låta uppgiften växa volymmässigt ger dig inte några större meriter. Att göra ett dåligt arbete innebär att uppgiften måste kompletteras eller blir underkänd och skapar extra, onödiga problem.

Ett gott råd

Vi rekommenderar varmt att du diskuterar din lösningsstruktur (val av klasser, viktiga metoder och fält) med Pavel, innan du börjar koda större avsnitt. På så sätt kan du säkert undvika många strukturella problem med din lösning. Utnyttja handledningstiderna.

Om uppgiften blir för stor

Om du tycker att det känns som om uppgiften "växer" eller att du inte "rår på den", finns det möjligheter att "beskära uppgiften". Sådana beskärningar (eller förenklingar i formuleringen) ska göras i dialog med Pavel och ska noga dokumenteras. Att "inte hinna med" eller "chansa" och lämna in ofullständiga lösningar/rapporter är däremot inte acceptabelt. Anstånd med inlämningen kan inte heller beviljas, pga av seminarierna.

Uppgifter

Uppgifterna nedan är skissartat formulerade. Du kommer att själv vara tvungen att göra antaganden av olika slag. Dessa ska redovisas. Rimliga antaganden, som du kan förklara och motivera vid en fråga godkänns.

Texterna "Lätt" eller "Svår" hänvisar till betygssystemet.

1. Egen uppgift

Välj själv en uppgift. "Hangman" är ett typiskt exempel på en lagom stor uppgift, som är ett lämpligt projekt, så länge in och utmatningen sköts enkelt.

Lätt eller svår beroende på val av uppgift och ambitionsnivå. Om du vill välja en egen uppgift skicka då ett mail där du på ett par rader beskriver uppgiften till Anders och Pavel.

2. Fia med knuff

Implementera det gamla brädspelet "Fia med knuff" med en datormotståndare.

I spelplanen nedan har blå inte fått ut någon pjäs, medan Gul har fått ut tre varav en redan är i boet.

 

          000
          0r0
  G = 3   0rY    R = 3
          0r0             
          Rr0
0 0 0 0 0 0 0 0 0 Y 0 0
0 g g g g     y Y y y 0 
0 0 G 0 0 0 0 0 0 0 0 0
          0b0
          0b0
  B = 4   0b0     Y = 1
          0b0
          000  

 

Reglerna är enkla: Plupparna rör sig moturs, kan knuffa ut motståndarens pluppar, man får endast gå ut på en 6a. Man får slå ett extra slag på en 6a (dock högts tre gånger i rad). Den spelare som först får in sina pluppar i boet har vunnit.

Datormotståndaren behöver inte vara smart, utan ska enbart hålla sig till reglerna.

Människospelare (tre stycken) ska dock kunna välja vilken plupp de flyttar på, ta eller gå in i boet med.

Programmet ser ut vinnare samt håller reda på hur många pluppar som är inne.

Svår.

3. Platsbokning på SJ


Skriv ett program som hjälper SJ med platsbokning i en järnvägsvagn. När programmet startas ska användaren ange vilken vagn som ska bokas. (Systemet kan således enbart göra bokningar i en vagn i taget.) På skärmen ska bilden nedan (eller en liknande bild) ritas upp. Bokade platser ska sedan markeras på ett rimligt sätt.


--------------------------------------

| 1   5   9  13   |   17  21  25  29 |
| 2   6  10  14   |   18  22  26  30 |
|    Tyst kupé    | Nalle tillåten   |
| 3   7  11  17   |   19  23  26  31 |
| 4  10  12  18   |   20  24  28  32 |

--------------------------------------

Man bokar genom att fylla i ett eller flera platsnummer, eller genom att ange önskemål (såsom fönster mm) om platserna. Därefter ritas skärmen om med det aktuella bokningsläget. När man inte vill boka mer, skrivs en eller vid behov flera platsbiljetter ut (på bildskärmen) med ungefär följande utseende:

Platsbiljett
Sth - Göteborg 9.05
Plats 19
Nallekupé
Gång

Lätt utan ett grafiskt användarsnitt. Svår med ett grafisk användarsnitt.

4. Räkna med stora tal (2 pers)

Ta fram ett program som kan räkna med stora tal. Begränsningar, om de införs, ska ha sin utgångspunkt i radlängder vid inmatning eller dylikt, inte i lagringskapacitet i en viss variabler av en viss typ. Du ska speciellt se till att du väljer en bra klasstruktur i denna uppgift.

Programmet ska klara addition, subtraktion och multiplikation.

Exempel på dialog:


Räknesätt: +
Tal 1: 87345171325167
Tal 2: 5319213411
87345171325167 +  5319213411 =  873457032465078


Ledning: Klassen Vector kan vara värd att studera

Lätt.

5. Spelet Life

En familj av encelliga organismer lever i en platt (tvådimensionell) värld. Celler föds och dör enligt givna regler. Beroende på utgångsläget kan en koloni expandera, dö ut eller nå ett stabilt tillstånd.

Uppgiften består i att göra en simulator där man simulerar en godtycklig uppsättning celler i världen. I en tvådimensionell värld har celler (normalt) åtta platser för grannar. Du bör kunna hantera minst 20* 20 = 400 celler. Simuleringen bör skrivas ut på skärmen (på ett enkelt sätt) efter varje steg.

Levnadsregler för cellerna:

· En cell överlever till nästa generation om den har två eller tre grannar. Har den färre dör den av ensamhet, om den har fler dör den av överbefolkning och svält.
· I en tom cell, som har exakt tre grannar kommer en ny cell att födas till nästa generation.
· Cellerna föds och lever bara i den simulerade världen, inte utanför den.

Några kul starttillstånd för en koloni:


 *  *
 ****
*    *  
* ** *             
*    * 
 ****    

Cheshirekatten från
Alice i underlandet.
Efter ett par generationer
återstår den grinande munnen


 *               
  *
*** 

Glidare
Rör sig snett uppåt


    *
    *             
*    *
*****

Rymdskeppet
Rör sig i sidled.

Lätt utan ett grafiskt användarsnitt. Svår med ett grafisk användarsnitt.

6. Romerska årtal

Skriv ett program som omvandlar "siffertal" till romerska årtal och tvärtom. Årtalen ska kunna variera från 1 till 3999. Systemet ska reager ordnat på inmatning av större årtal eller år 0.

 

Vill du konvertera till romerskt eller till arabiskt [r/a]? r
Årtal:     1990
1990 skriv MCMXC
Vill du konvertera ett nytt tal [j/n]? n

De romerska talen skrivs I, V, X, L, C, D, M och motsvarar 1, 5, 10, 50, 100, 500, 1000. Kombinationer som IV betecknar 4, IX betyder 9, XC 90 etc. I övrigt adderas bokstäverna. Läs gärna mer.

Låt programmet avgöra om det inmatade talet är romerskt eller ett tal (arabiskt). Ledning: Titta på klassen String och/eller Skansholms paket extra.

Varning: Det kanske behövs en del eftertanke för att få en bra klasstruktur. Trots detta, en lätt uppgift.

7. Blocket

Gör ett elektronisk annonsforum som Blocket eller Tradera. Programmet ska ha ett grafiskt, mycket primitivt användarsnitt men bör trots det ha grundläggande funktioner för att hantera annonser och kunna söka bland annonser.

Kräver ett grafisk användarsnitt för poäng. Lätt uppgift.

8. Kontaktförmedling

Som extraknäck startar du Uppsala kontaktförmedling, som specialiserar sig på ensamma hjärtan bland studenter. Skriv programmet som behövs. Personer ska kunna läsas in, tas bort etc., men coskå skrivas och matchas. Det ska med andra ord vara programmet som föreslår vilka som ska gå på en dejt.

Lätt med text-användarsnitt, svårt med grafiskt.

9. Yahtzee

Implementera Yahtzee för en spelare. (Om ni vill spela flera stycken kan ni köra flera instanser av programmet.)

Spelets mål:
Få så hög poäng som möjligt!

Spelregler:
1. Yahtzee spelas i rundor (13 st). Se beskrivningen av en spelrunda nedan.
2. Poängen bokförs löpande i ett formulär. Se exempel nedan.
3. Varje poängkategori får endast användas en gång. Om man inte uppfyller kravet för att få poäng i en given kategori, får man 0 poäng där.
4. Poängkategorierna delas in i två grupper: topp och botten. Det är helt enkelt kategorierna i den övre respektive nedre delen av formuläret.
5. Bonus: när/om ens toppsumma överskrider 62 poäng får man en engångsbonus på 35 poäng, som bokförs i dedikerat fält på formuläret.

Spelrundan:
Varje spelrunda går till som följer.
1. Rulla 5 tärningar. Plocka bort alla oönskade tärningar, rulla om dessa. Rulla om på samma sätt en gång till, om du vill. Man får alltså rulla om maximalt 2 ggr.
2. Tärningarnas utfall efter steg 1 kallar vi för denna rundas resultat. Vi kan beskriva resultatet som en påse (bag) av tärningsutfall, det vill säga en mängd med repetitioner.
3. Välj en hittills ovald poängkategori för ditt resultat. Poängen bokförs på formuläret.

Så här beräknas poängen för resultat:
Ettor: 1 p per etta.
Tvåor: 2 p per tvåa.
o.s.v.
Sexor: 6 p per sexa.
Triss: resultatets summa, om det innehåller ett triss.
Fyrtal: resultatets summa, om det innehåller ett fyrtal.
Liten stege: 30 p om resultatet är {1, 2, 3, 4, 5}.
Stor stege: 40 p om resultatet är {2, 3, 4, 5, 6}.
Kåk: resultatets summa om det är en kåk, d.v.s. ett triss och ett par.
Yahtzee: 50 p om resultatet är ett femtal.
Chans: resultatets summa.

T.ex. skulle resultatet {3, 3, 3, 4, 6} ge 19 p som Triss, 0 p som Fyrtal, och 9 p som Treor.

Implementationstips
Man kan "rulla tärningarna" på t.ex. följande sätt. Tärningarnas utfall och antalet kvarstående omrullningar visas. Användaren kan välja vilka tärningar som ska rullas om.

--------------------------------------------------

6  3  5  6  6   (1 omrullning kvar)
Tärningar markerade för omrullning: 2, 3

 

1-5    markera/avmarkera respektive tärning
space  rulla
enter  välj poängkategori
--------------------------------------------------

I exemplet ovan skulle användaren troligen behålla 6:orna, för att satsa på någon av Sexor, Triss, Fyrtal, Yahtzee, Kåk eller Chans. Det beror förstås på vilka poängkategorier som var kvar.

Varje runda ska poängformuläret skrivas ut. Förslagsvis som följer.

 

--------------------
Ettor
Tvåor              4
Treor
Fyror
Femmor
Sexor

BONUS (topp > 62)

Toppsumma          4

--------------------

Triss             19
Fyrtal
Liten stege       30
Stor stege
Kåk
Yahtzee
Chans
Bottensumma       49
--------------------
Total poäng       53

Svår uppgift

Uppdaterad  2006-05-26 15:25:17 av Anders Berglund.