HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL Delprøve Kandidatnr: Prøvedato: 2. mars 2005 Varighet: 3 timer (9:00 12:00) Fagnummer: LO196D Fagnavn: Videregående programmering med prosjekt Klasse(r): 1DA 1DB Studiepoeng: 16 Faglærer(e): Mildrid Ljosland og Truls Fretland Hjelpemidler: Alle skriftlige, kalulator Oppgavesettet består av: 2 oppgaver og 6 sider (inkludert forside og vedlegg) Vedlegg består av: 3 sider Merknad: Oppgaveteksten kan beholdes av studenter som sitter eksamenstiden ut. Lykke til!
Oppgave 1(60 %) I denne oppgaven skal vi behandle temaet kortspill. I vedlegg 1 finnes programkode for to klasser, Kort og Kortspill. I vedlegg 2 finnes det meste av et grafisk grensenitt for et slikt kortspill, samt skjermbilder av hvordan spillet utvikler seg. I oppgave a og b trenger du bare vedlegg 1, mens vedlegg 2 vil bli nyttige i oppgave c. Du trenger ikke å sette deg i detalj inn i alle metodene, poenget er å se hva som finnes og ta i bruk det du trenger. I tillegg til de to viste klassene, skal vi ha klassen Spiller. Sammenhengen mellom de tre klassene er vist i diagrammet under. Kortspill startspiller finnspiller stokkkortene spillenrunde evn. andre metoder 1 består av 52 1 * Spiller har antallstikkvunnet finnantallstikkvunnet økantallstikkvunnet finnkort nyttkort fjernkort tostring 1 * har Kort verdi finnverdi finnkortverdi finnkortnavn finnfarge finnfargenavn tostring a) Programmer klassen Spiller som vist i figuren over. finnantallstikkvunnet() returnerer verdien av antallstikkvunnet, mens økantallstikkvunnet() øker verdien på denne variabelen med 1. Hvor mange kort en spiller har, vil variere både med hvor mange spillere det er, og hvor langt de er kommet i spillet. Metoden finnkort() skal returnere alle de kortene spilleren har, mens nyttkort() og fjernkort() henholdsvis legger til og fjerner et kort fra denne spilleren. Kort-objektet skal ikke opprettes i nyttkort(), og det forsvinner ikke når det fjernes fra spilleren - det skal hele tiden finnes i Kortspill sin liste over alle kort. tostring() skal skrive ut antall stikk vunnet samt hvilke kort spilleren har. Løsning: class Spiller { private ArrayList<Kort> kort = new ArrayList<Kort>(); private int antallstikkvunnet = 0; public ArrayList<Kort>finnKort() { return kort; public int finnantallstikkvunnet() { return antallstikkvunnet; public void økantallstikkvunnet() { antallstikkvunnet++; public void nyttkort(kort kortet) { kort.add(kortet); public boolean fjernkort(kort kortet) { int indeks = kort.indexof(kortet); 2
if (indeks >= 0) { kort.remove(indeks); return true; else return false; public String tostring() { String res = "Antall stikk vunnet: " + antallstikkvunnet + "\n"; for (Kort etkort : kort) res += etkort + "\n"; return res; b) Programmer en konstruktør til Kortspill. Den skal opprette de 52 forskjellige kortene samt et antall spillere gitt ved et argument til konstruktøren. Den skal også sørge for å dele ut alle kortene til spillerne. Dette skal gjøres ved først å stokke kortene, deretter dele ut ett og ett kort til hver spiller (på samme måte som man vanligvis gjør det i et virkelig kortspill). public Kortspill(int antallspillere) { allekort = new Kort[52]; spillere = new ArrayList<Spiller>(); for (int i=0; i < allekort.length; i++) { allekort[i] = new Kort(i); for (int i = 0; i < antallspillere; i++) { spillere.add(new Spiller()); stokkkortene(); delut();. public void delut() { int spillernr = 0; for (int i = 0; i < allekort.length; i++) { Spiller denne = spillere.get(spillernr); denne.nyttkort(allekort[i]); spillernr = (spillernr + 1) % spillere.size(); c) Som du ser av vedlegg 2 og 3, består det grafiske grensesnittet av et felt for hver spiller samt en knapp til å trykke på. I spillerfeltene vises hvor mange stikk spilleren har vunnet og hvilke kort han/hun har på nåværende stadium i spillet. Hver hver gang knappen trykkes, skal en runde spilles. Ved å studere programkoden kan du finne ut at det mangler to ting, nemlig metoden setttekster() og klassen Knappelytter. Disse to tingene skal du programmere slik at spillerfeltene oppdateres (se utviklingen i skjermbildene) samt at knappen blir utilgjengelig når alle kortene er brukt. public void setttekster() { /* Vilkårlig hvilken spiller som plasseres hvor, velger å la nr 0 være vest, osv. */ Spiller vest = spill.finnspiller(0); Spiller sør = spill.finnspiller(1); Spiller øst = spill.finnspiller(2); 3
Spiller nord = spill.finnspiller(3); vesttekst.settext(vest.tostring()); sørtekst.settext(sør.tostring()); østtekst.settext(øst.tostring()); nordtekst.settext(nord.tostring()); if (vest.finnkort().size() == 0) enrunde.setenabled(false); /* Antar at alle går tom for kort samtidig */ private class Knappelytter implements ActionListener { public void actionperformed(actionevent hendelse) { spill.spillenrunde(); setttekster(); 4
Oppgave 2 (40 %) - Numerikk Numerisk integrasjon. Ta med nok mellomregning til at fremgangsmetoden kommer tydelig frem. Alle deloppgavene teller like mye, dvs. 10% hver. a) Gitt integralet I = 2 1 e x x dx. (1) Bruk Simpsons metode med n = 10 til å estimere verdien (S 10 ) av integralet (I). Angi svaret med 4 desimaler. Svar: Funksjonen som skal integreres er f(x) = ex x, og nedre grense a = 1 og øvre grense b = 2. Regner ut intervall-lengden: h = b a n = 2 1 = 0.1 (2) 10 Så skal funksjonsverdien beregnes i punktene x i = a + ih. Den estimerte verdien er da gitt ved: S 10 = h 3 (f(x 0) + 4f(x 1 ) + 2f(x 2 ) + 4f(x 3 ) + 2f(x 4 ) + 4f(x 5 ) + 2f(x 6 ) + 4f(x 7 ) + 2f(x 8 ) + 4f(x 9 ) + f(x 10 )) = 0.1 (f(1.0) + 4f(1.1) + 2f(1.2) + 4f(1.3) + 2f(1.4) 3 + 4f(1.5) + 2f(1.6) + 4f(1.7) + 2f(1.8) + 4f(1.9) + f(2.0)) 3.0591 Angitt med 4 desimaler er S 10 3.0591. b) Det er oppgitt at (e x /x) = e x (x 1 2x 2 + 2x 3 ). Estimer en øvre skranke for feilen i approksimasjonen, E S = I S 10. Svar: For å finne en øvre skranke for feilen trenger vi å finne maksimum av den fjerdederiverte til f(x). Bruker da den oppgitte andrederiverte og deriverer den 2 ganger til: f (x) = e x (x 1 2x 2 + 2x 3 ) + e x ( x 2 2( 2)x 3 + 2( 3)x 4 ) f (x) = e x (x 1 3x 2 + 6x 3 6x 4 ) (3) f (4) (x) = e x (x 1 3x 2 + 6x 3 6x 4 ) + e x ( x 2 3( 2)x 3 + 6( 3)x 4 6( 4)x 5 ) f (4) (x) = e x (x 1 4x 2 + 12x 3 24x 4 + 24x 5 ) (4) Deretter tegner vi opp grafen til f (4) på lommeregneren og ser at den har størst abosluttverdi i startpunktet a = 1. Dermed er K f (4) (1) = e 1 (1 1 4 1 2 + 12 1 3 24 1 4 + 24 1 5 ) = e(1 4 + 12 24 + 24) = 9e 24.5 5
Innsatt i den øvre skranken for feilen i Simpsons metode gir dette: En øvre skranke for feilen E S er 1.4 10 5. K(b a)5 E T 180n 4 (5) 24.5(2 1)5 = 180 10 4 1.4 10 5 Oppgave c er flervalgsoppgave. Angi kun ett alternativ. Svaret skal ikke begrunnes. Rett svar gir 10% uttelling, ubesvart gir 2% uttelling og feil svar eller flere svar gir 0% uttelling. c) Med hvilken faktor vil antallet intervaller n endres dersom intervall-lengden (b a) dobles og den øvre skranken for feilen forblir uendret? (Avrundet til to desimaler) A. 2,00 B. 2,38 C. 2,83 D. 4,35 E. Ingen av disse Svar: La c = b a være den opprinnelige intervall-lengden. La ĉ = 2c være den doble intervall-lengden. Tilsvarende er n det opprinnelige antall intervaller og ˆn er det nye antall intervaller. Da skal de to øvre skrankene for feilen være like; Kc 5 180n 4 = c 5 Kĉ5 180ˆn 4 n 4 = (2c)5 ˆn 4 ˆn 4 n 4 = 25 ˆn n = 4 2 5 2, 38 Så antall intervaller må økes med en faktor 2, 38, dvs. alternativ B. d) Gitt følgende java-klasse: import static java.lang.math.*; public class Simpson{ // funksjonen som skal integreres static double f( double x ){ return exp(x)/x; /* metoden finner en tilnærmet verdi av integralet av funksjonen f fra nedre grense a, til øvre grense b, ved hjelp av Simpsons metode og n delintervaller. */ 6
static double integrer(double a, double b, int n){ double h = (b-a)/n; // skrittlengden double s0 = f(a) + f(b); // endepunktene med vekt 1 double s1 = 0; for (int i=1; i < n ; i++) s1 += (i%2+1)*f(a+i*h); // vektingen alternerer mellom 2 og 1 return (s0+2*s1)*h/3; public static void main(string args[]){ System.out.println(integrer(1, 2, 10)); Implementer metoden integrer(double a, double b, int n) slik at når programkoden over kjøres, så skrives verdien av S 10 ut til skjerm. 7
Vedlegg 1 import java.util.*; class Kort { private int verdi; public Kort(int startverdi) { verdi = startverdi; public int finnverdi() { return verdi; // Verdier fra 0 og oppover public int finnkortverdi() { return verdi % Kortspill.kortnavn.length; public String finnkortnavn() { return Kortspill.kortnavn[finnKortverdi()]; public int finnfarge() { return verdi / Kortspill.kortnavn.length; public String finnfargenavn() { return Kortspill.fargenavn[finnFarge()]; public boolean equals(kort detandre) { return finnverdi() == detandre.finnverdi(); public String tostring() { return finnfargenavn() + " " + finnkortnavn(); class Kortspill { public static final String[] kortnavn = {"to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni", "ti", "knekt", "dronning", "konge", "ess"; public static final String[] fargenavn = {"Kløver", "Ruter", "Hjerter", "Spar"; private Kort[] allekort; private ArrayList<Spiller> spillere(); private int startspiller = 0; public Spiller finnspiller(int nr) { if (nr >= 0 && nr < spillere.size()) return spillere.get(nr); else return null; public void stokkkortene() { /* Her stokkes kortene slik at de kommer i tilfeldig rekkefølge. Denne metoden skal du IKKE programmere, bare anta at finnes. */ public void spillenrunde() { /* Her leverer alle spillerne fra seg ett kort Det beregnes hvem av dem som har vunnet runden, og dennes variabel antallstikkvunnet økes med 1. Det kan også tenkes at variabelen startspiller endres, gjerne slik at den som vant forrige stikk (runde), skal starte neste. Denne metoden skal du IKKE programmere, bare anta at finnes. 8
*/ Vedlegg 2 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.arraylist; class Valgvindu extends JFrame { private Kortspill spill; private JButton enrunde = new JButton("Spill en runde"); private JTextArea vesttekst = new JTextArea(); private JTextArea sørtekst = new JTextArea(); private JTextArea østtekst = new JTextArea(); private JTextArea nordtekst = new JTextArea(); public Valgvindu() { spill = new Kortspill(4); setlayout(new GridLayout(3,3)); setdefaultcloseoperation(jframe.exit_on_close); add(new JLabel()); // Tomt felt add(nordtekst); add(new JLabel()); add(vesttekst); add(enrunde); enrunde.addactionlistener(new Knappelytter()); add(østtekst); add(new JLabel()); add(sørtekst); add(new JLabel()); setttekster(); pack(); class TestSpill { public static void main(string[] args) { Valgvindu test = new Valgvindu(); test.setvisible(true); 9
10