Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Oppgave a)En kan kategorisere innkapslingsmetoder som enten lese- eller endringsmetoder. Hva er den viktigste oppgaven til endringsmetodene, bortsett fra å utføre selve endringen?
Oppgave b)Gitt en Date-klasse med metoder getDay() for å lese datoens dag (1-31), getMonth() for måned (1-12) og getYear() for år (0-99). Skriv kode for en Person-klasse, med felt og innkapslingsmetoder for fødselsdato og kjønn. Kjønn skal kun kunne settes ved oppretting av Person-objektet, mens det for fødselsdatoen ikke er noen slik begrensning.
Oppgave c)Skriv kode for å lagre og innkapsle personnummer i Person-objekter. Du kan anta at fødselsdato og kjønn allerede er satt. Et personnummer består grovt sett av fødselsdatoen, et (vilkårlig) løpenummer og to kontrollsifre. Kontrollsifrene gjør det enklere å sjekke om et personnummer er ekte. Mer spesifikt er reglene for personnummer som følger: - Et personnummer består av 11 siffer, med følgende struktur: D1D2M1M2Y1Y2N1N2N3K1K2 (fargen illustrerer siffergruppene). - De seks første sifrene, D1D2M1M2Y1Y2, tilsvarer fødselsdatoens dag (1-31), måned (1-12) og år (0-99). - De tre neste sifrene, N1N2N3, kan antas å være vilkårlige, men N3 må være partall for kvinner og oddetall for menn. - De to siste sifrene, K1K2, er kontrollsifre, som hver for seg beregnes ut fra de foregående sifrene. Formellen for dem begge er 11 – (VS % 11)[1], hvor VS (veid sum) for K1 er D1*F1 + D2*F2 + … + N2*F8 + N3*F9 og VS for K2 er D1*G1 + D2*G2 + … + N3*G9 + K1*G10. F’ene og G’ene er oppgitt i tabellen under. Dersom formelen gir et ett-sifret resultat for både K1 og K2 så er personnummeret gyldig, mens gir formelen et to-sifret resultat for K1 og/eller K2, så er personnummeret ugyldig.
Introduser og bruk gjerne hjelpemetoder for å gjøre koden ryddigere.
Oppgave d)Beskriv hvordan du kan bruke en såkalt checked exception for å avverge at fødselsdatoen endres etter at personnummeret er satt! Hva slags konsekvenser vil dette ha for kode som kaller endringsmetoden for fødselsdatoen?
|
Expand | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Du skal implementere klasser for å representere informasjon ifm. gjennomføring av seriespill i sporter som fotball, håndball, volleyball osv. Klassen MatchResult skal representere informasjon om en kamp og dens resultatet, mens klassen LeagueTable skal representere et sett kamper og beregne serietabellen basert på kampresultatene. I del 2 skal vi begrense oss til tabeller for ferdigspilte fotballkamper. Et eksempel på to kampresultater og en tabell er vist nedenfor: Rosenborg - Lillestrøm: 4 - 4 Lillestrøm - Rosenborg: 1 - 5 Rosenborg 4 Lillestrøm 1 Som vi ser har Rosenborg fått totalt 4 poeng, 3 poeng for seier og 1 poeng for uavgjort, mens Lillestrøm har fått 1 poeng for den ene uavgjort-kampen. Tabellen utelater informasjon om mål for og imot og hjemme- og bortekamper. Tenk på helheten i løsningen før du går i gang med hver del. Kanskje kan det være lurt å begynne med c) før du skrive koden for a) og b). Det kan være lurt å ha i bakhodet at i del 3 skal koden generaliseres til å håndtere sporter med andre regler for å beregne tabeller og i del 4 skal koden håndtere at kamper kan legges inn i tabellen før de er ferdigspilt. Men la ikke dette gjøre koden i del 2 unødvendig komplisert. Oppgave a)a) Implementer MatchResult: - Representasjon og innkapsling av informasjon om navnene på hjemme- og bortelagene. Navnene skal ikke kunne endres etter at et MatchResult-objekt er laget. - Representasjon og innkapsling av informasjon om kampresultatet, dvs. antall hjemme- og bortemål. - Metodene isParticipant(String participant) for å spørre om (laget) participant spiller i denne kampen, isDraw() for å spørre om resultatet ble uavgjort og isWinner(String participant) for å spørre om (laget) participant vant denne kampen.
Oppgave b)Implementer LeagueTable: - Representasjon av (navnene til) alle lagene. Navnene skal ikke kunne endres etter at LeagueTable-objektet er laget. - Representasjon av informasjon om kampresultater, dvs. MatchResult-objekter. Det skal kun være lov å legge inn nye kamper, ikke fjerne dem. Det skal ikke være lov å legge inn kamper for lag som ikke er med i tabellen. - Metoden getParticipantPoints(MatchResult matchResult, String participant) som returnerer antall poeng som (laget) participant fikk for resultatet matchResult. Ta høyde for at participant faktisk ikke er med i matchResult. Tabellpoeng summeres basert på kampresultatene, og tabellen sorteres etter antall poeng, med laget med flest poeng øverst. Når et kampresultat legges inn, så skal tabellen oppdateres. Merk at du antageligvis vil trenge en klasse for å representere hver rad i tabellen, f.eks. kalt LeagueTableRow, som lagrer data om et lag og summen av poengene laget har fått for seier og uavgjort i sine kamper. Denne klassen kan implementere relevante grensesnitt ifm. sortering.
Oppgave c)Tegn et objekt/instansdiagram (figur som viser instansene i en objektstruktur og deres innhold) som tilsvarer tabellen over, for strukturen av MatchResult-, LeagueTable- og evt. LeagueTableRow-objekter.
Oppgave d)I en ordentlig fotballtabell så spiller også totalt antall mål for og imot og resultat i innbyrdes kamper inn på tabellen. Beskriv kort med tekst og kode hvordan du vil støtte dette.
|
Expand | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
Ulike sporter har ulike regler for poenggiving i både kamper og serietabeller og sortering av tabellene. I tennis er kampen slutt når én deltaker har vunnet 2 eller 3 sett for hhv. kvinner og menn, så sluttresultatet 1-0 finnes ikke i tennis. Fotball gir 3 tabellpoeng for seier, mens håndball gir 2. I noen sporter teller innbyrdes oppgjør før målforskjell ved sortering, mens det for andre er omvendt. Oppgave a)Forklar med tekst og kode hvordan du kan lage sport-spesifikke resultat-klasser, f.eks. TennisResult, som arver fra MatchResult og implementerer logikk for å håndheve sportens regler for poenggiving, bl.a. for å unngå registrering av ugyldige resultater. Beskriv også nødvendige endringer av MatchResult.
Oppgave b)Forklar med tekst og kode hvordan du kan lage sport-spesifikke tabell-klasser, f.eks. FootballLeagueTable og TennisTournamentTable, som arver fra LeagueTable og implementerer logikk iht. sportens regler for å beregne tabellpoeng. Beskriv også nødvendige endringer av LeagueTable.
|
Expand | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
Oppgave a)Hva slags generell teknikk kan anvendes for å sikre at en serietabell automatisk oppdateres hvis et MatchResult-objekt endres etter at det er lagt inn i tabellen? Forklar med tekst og kode hvordan du vil implementere støtte for dette. Fokusér på å forklare hvordan den generelle teknikken anvendes/tilpasses, ikke på å få logikken for poengberegning helt riktig (kan være litt intrikat i dette tilfellet).
Oppgave b)Forklar hvordan du vil teste at: - metoden isWinner(…) i 2 a) pkt. 3 er riktig implementert - innbyrdes sammenligning av tabellrader i 2 b) er korrekt - løsningen i 1 d) er korrekt Du trenger ikke skrive kode, men forklaringen må være detaljert nok til å illustrere testemetoden.
|