Oppgavesettet: Ukeoppgaver 12.
Oppgave merket med n?kkelsymbol er plukket ut som spesielt representativ for de viktigste temaene fra ukens forelesning, og alle b?r ha som minimumsm?l ? l?se denne selvstendig.
Oppgave 1 -Personopplysningsloven
Denne oppgaven er hentet fra Eksamenssett 2009, Oppgave 9
Restaurant Den Sultne Akademiker ?nsker ? ?ke omsetningen. De tenker da ? sette sammen en del informasjon de allerede har fra kundene; navn, kredittkortnummer, hvilke menyer de har bestilt og hvor mye maten kostet. Denne informasjonen supplerer restauranten s? med informasjon de nner p? internett, som adresse, yrke og skatteinformasjon fra skattelistene. Restauranten har s? tenkt ? lage m?nedens to-p?-topp ved ? gi et gratis m?ltid til b?de den gjesten som forrige m?ned har spist mest i forhold til sin skattbare inntekt og den som har brukt absolutt mest penger sist m?ned p? Den Sultne Akademiker . Navnet p? de to vinnerne vil bli lagt ut p? hjemmesida til restauranten og tilskrevet personlig. Kan restauranten fritt lagre, bruke og o entliggj?re slike opplysninger? Redegj?r kort for hvordan Personopplysningsloven regulerer denne typen bruk av persondata. Nevn de relevante paragrafene som b?r tas med i vurderingen med begrunnelse for hvorfor de er relevante i denne sammenheng.
L?sningsforslag
Bryter §8 om samtykke og saklig begrunnet innsamling av data - ingen avtale med gjestene, heller ikke n?dvendig for restaurantens drift. Ivaretar neppe den registrertes interesse. Bryter klart med §11 pkt. a (pga. brudd §8) og pkt. c - data brukes til et klart annet form?l (reklame) enn det var samlet inn for (betalig av m?ltider) uten samtykke. Det st?r heller ikke at restaurantgjestene har gitt sitt samtykke til denne type offentliggj?ring. Den bryter ogs? med §11 pkt b - dette er skattedata som samles inn som ikke er saklig at en restaurant samler inn (selv om skattedata er offentlig). § 8 Behandling av personopplysninger skal bare gj?res etter samtykke og v?re saklig begrunnet, m? v?re n?dvendig for: a) Oppfylle avtale med den registrerte c) Ivareta den registrertes interesser e) ? ut?ve offentlig myndighet f) ? ivareta en berettiget interesse som overstiger den registrertes interesse § 11. Grunnkrav til behandling av personopplysninger Den behandlingsansvarlige skal s?rge for at personopplysningene som behandles a) bare behandles n?r dette er tillatt etter § 8 og § 9, b) bare nyttes til uttrykkelig angitte form?l som er saklig begrunnet i den behandlingsansvarliges virksomhet, c) ikke brukes senere til form?l som er uforenlig med det opprinnelige form?let med innsamlingen, uten at den registrerte samtykker, d) er tilstrekkelige og relevante for form?let med behandlingen, og e) er korrekte og oppdatert, og ikke lagres lenger enn det som n?dvendig ut fra form?let med behandlingen, jf. § 27 og § 28.
Oppgave 2 - Fjern tegn fra tekst med I/O og String
a)
N? skal du skrive et program som leser inn en tekst fra fil, fjerner alle skilletegn (punktum, komma, sp?rsm?lstegn osv) og skriver den nye teksten til en ny fil. Disse tegnene skal fjernes:
char[] skilletegn = {'.', ',' ,'?', '!', '"', '(', ')', ':', ';', '/'};
Eksempel:
Innfil: Hallo! WORLD.Bye, see you later (I think?) Utfil: Hallo WORLD Bye see you later I think
Test programmet ved ? lime inn selvvalgt tekst inn i en fil.
L?sningsforslag
Oppgaven er gjort med Scanner, men den vil v?re nesten helt lik med easyIO
import java.util.Scanner; import java.io.File; import java.io.PrintWriter; class FjernTegn { public static void main(String[] args) { try { Scanner les = new Scanner(new File(args[0])); String teksten = ""; char[] skilletegn = {'.', ',' ,'?', '!', '"', '(', ')', ':', ';', '/'}; char[] nytekst; while(les.hasNext()) { teksten += les.nextLine() + "\n"; } nytekst = teksten.toCharArray(); for(int i = 0; i < nytekst.length; i++) { for(int j = 0; j < skilletegn.length; j++) { if(nytekst[i] == skilletegn[j]) { nytekst[i] = ' '; } } } PrintWriter skriv = new PrintWriter(new File(args[1])); skriv.print(new String(nytekst)); skriv.close(); } catch (IOException e) { System.err.println("Whoops! Noe gikk galt."); } } }
b)
Det er ogs? en annen m?te ? gj?re denne oppgaven, vi kan bruke ascii-verdiene til tegnene. Sl? opp i en ascii-tabell (f.eks ved ? google det), og se at bokstaver har verdiene 65-90 og 97-122. Du kan n? g? igjennom hele teksten, og bytte alle andre tegn med et mellomrom. Husk at du ogs? m? teste om tegnene er ?, ? eller ? hvis du leser gjennom norske filer.
L?sningsforslag
import java.util.*; import java.io.*; class FjernTegn2 { public static void main(String[] args) { try { Scanner les = new Scanner(new File(args[0])); String teksten = ""; int[] bokstaver = {65, 90, 97, 122}; char[] nytekst; while(les.hasNext()) { teksten += les.nextLine() + "\n"; } nytekst = teksten.toCharArray(); for(int i = 0; i < nytekst.length; i++) { if(nytekst[i] < bokstaver[0] || nytekst[i] > bokstaver[1] && nytekst[i] < bokstaver[2] || nytekst[i] > bokstaver[3]) { if(nytekst[i] != '?' || nytekst[i] !='?' || nytekst[i] != '?') { nytekst[i] = ' '; } } } PrintWriter skriv = new PrintWriter(new File(args[1])); skriv.print(new String(nytekst)); skriv.close(); } catch (IOException e) { System.err.println("Whoops! Noe gikk galt."); } } }
Oppgave 3 - Tre sm? kinesere med l?kker og String
I den kjente barnesangen tre sm? kinsere synger man f?rst verset normalt f?r man bytter ut alle vokalene med a, s? e og s? i osv. Teksten finner du her: http://www.barnesanger.no/tre-sma-kinesere.html.
Skriv et program som lagrer teksten og alle vokalene og s? skriver ut hele sangen. F?rste gang skriver den ut verset slik som det orginalt er, andre gangen byttes alle vokaler ut med en a ("Tra sma kanasara ..."), tredje gangen med e osv. Utskriften skal se noe slikt ut:
Tre sm? kinesere p? H?jbro plass satt og spilte p? en kontrabass. S? kom en konstabel, spurte hva det var, tre sm? kinesere p? H?ybroplass. Tra sma kanasara p? hajbra plass satt a spalta pa an kantrabass sa kam an kanstabel, sparta hva da var tra sma kanasara p? hajbra plass Tre sme kenesere... osv
NB: Utbytting av vokalene kan gj?res veldig enkel ved hjelp av metodene til klassen String (se Java-dokumentasjonen), men pr?v ? skrive hele denne delen selv f?r du pr?ver med de ferdiglagde metodene.
L?sningsforslag
class TreSmaa{ public static void main(String[] args) { String treesmaa = "Tre sm? kinesere p? H?jbro plass \n" + "satt og spilte p? en kontrabass.\n" + "S? kom en konstabel, spurte hva det var, \n" + "tre sm? kinesere p? H?ybroplass."; char[] vokaler = {'a', 'e', 'i', 'o', 'u', 'y', '?', '?', '?'}; boolean funnet = false; for (int j = 0; j < vokaler.length; j++){ for (int i = 0; i < treesmaa.length(); i++){ funnet = false; for (int k = 0; k < vokaler.length; k++){ if(treesmaa.charAt(i) == vokaler[k]){ System.out.print(vokaler[j]); funnet = true; } } if(!funnet){ System.out.print(treesmaa.charAt(i)); } } System.out.println(); } for(int j = 0; j < vokaler.length; j++){ for(int i = 0; i < treesmaa.length(); i++){ char l = treesmaa.charAt(i); if (l == 'a' || l == 'e' || l == 'i'){ l = vokaler[j]; } System.out.print(l); } } System.out.println(treesmaa); } }
Oppgave 6
Kasino med HashMap, klasser og objekter
Oppgaven bygger p? oppgaven om "Kort og Kortstokk" fra tidligere ukeoppgaver, s? gj?r den hvis du ikke har gjort den. N? skal du utvide med en klasse Kasino, som har et HashMap av Kortstokker og et array med 20 Dealere. Tilsammen har kasinoet 100 kortstokker, s? i konstrukt?ren skal Kasino opprette 100 kortstokker og legge disse i HashMap-en. For ? gj?re dette m? du lage en ID i hver Kortstokk. Dette kan v?re int-variabler fra 0-99. S? m? du tildele hver Dealer en Kortstokk, og da m? hver Kortstokk som blir tildelt en Dealer taes ut av hashmapet. N?r kasinoet ?pner, begynner hver Dealer ? dele ut kortene, som igjen kaller metoden bruk i kortstokken. Hvis en dealer har en kortstokk som mangler kort m? denne kortstokken byttes ut.
L?sningsforslag
L?sningsforslaget baserer seg p? l?sningsforslaget til oppgaven som var gitt ved Ukeoppgavesett-9. Denne tar for seg litt mer enn hva som er n?dvendig
import easyIO.*; class KortstokkOppgave{ public static void main(String[] args){ Kortstokk kortstokk = new Kortstokk(); kortstokk.lagKortstokk(); kortstokk.skrivUt(); Dealer hansen = new Dealer(kortstokk); if(hansen.grundigSjekk()){ System.out.println("Alle kortene er der"); }else{ System.out.println("Noen kort mangler!"); } hansen.stokk(); if(hansen.grundigSjekk()){ System.out.println("Alle kortene er der"); }else{ System.out.println("Noen kort mangler!"); } kortstokk.skrivUt(); In in = new In(); // Faa Antall spillere fra brukeren System.out.print("Antall spillere: "); int antallSpillere = in.inInt(); // Hopper over et linjeskift: in.inLine(); // Faa antall kort per spiller fra brukeren System.out.print("Antall kort per spiller: " ); int antallKort = in.inInt(); // Hopper over et linjeskift: in.inLine(); // Navn paa spillere: String[] navn = new String[antallSpillere]; for (int i = 0; i < navn.length; i++){ System.out.print("Skriv navn p? spiller: "); navn[i] = in.inLine(); } hansen.delUtTilSpillere(antallSpillere, antallKort, navn); hansen.beSpillereViseKort(); } } // NYTT! class Kasino{ HashMap<String, Kortstokk> kortstokker = new HashMap<String, Kortstokk>(); Dealer[] dealere = new Dealer[20]; Kasino(){ for (int i = 0; i < 100; i++){ String kortstokknavn = "k"+i; // Gir navn som vi kan bruke i hashmapen Kortstokk k = new Kortstokk(); kortsokker.put(kortstokknavn, k); } } void delUtKortstokkTilDealer(){ // skaffer en iterator til ? iterere over de ulike n?klene til kortstokkene vi har laget Iterator<String> kortstokkIT = korstokker.keySet().iterator(); int antallDealere = 0; // G?r gjennom s? lenge det finnes flere kortstokker i HashMap // eller s? lenge vi ikke har laget alle dealerne while(kortstokkIT.hasNext() && antallDealere < 20){ String kortstokkID = korstokkIT.next(); // Finner en kortstokk til dealeren Kortstokk kortstokk = korstokker.get(kortstokkID); // Oppretter dealer -legg merke til at vi m? ha noe i konstrukt?ren dealere[antallDealere] = new Dealer(kortstokk); // Fjerner korstokken fra Hashmap-en kortstokker.remove(korstokkID); antallDealere++; } } // Antar vi mottar id-en til dealeren som trenger en ny kortstokk void nyKorstokkTilDealer(int i){ // plukker ut en ledig korstokk fra HashMap String[] korstokkIDArray = myHashMap.keySet().toArray(); String s = values[0]; Korstokk k = korstokker.get(s); // Gir korstokk til dealer dealere[i].korstokk = k; // Fjerner kortstokken korstokker.remove(s); } } class Spiller{ Kort[] mineKort; String navn; Spiller(String navn){ this.navn = navn; } void mottaKort(Kort[] mineKort){ this.mineKort = mineKort; } void visFramKort(){ System.out.print(navn + ": "); for (Kort k: mineKort){ k.skrivUt(); } } } class Dealer{ Spiller[] spillere; Kortstokk stokk; Dealer(Kortstokk stokk){ this.stokk = stokk; } // En grundig maate aa sjekke alle kortene: boolean grundigSjekk(){ boolean funnet[] = new boolean[52]; for (int i = 0; i < funnet.length; i++){ Kort sjekkKort = stokk.kortstokk[i]; int plassering = 0; if (sjekkKort.type.type.equals("Hjerter")){ int basis = 0; plassering = basis + sjekkKort.tall-1; }else if (sjekkKort.type.type.equals("Ruter")){ int basis = 13; plassering = basis + sjekkKort.tall-1; }else if (sjekkKort.type.type.equals("Spar")){ int basis = 26; plassering = basis + sjekkKort.tall-1; }else if (sjekkKort.type.type.equals("Klover")){ int basis = 39; plassering = basis + sjekkKort.tall-1; } // Sjekker om kortet allerede er funnet: if (funnet[plassering]){ return false; }else{ funnet[plassering] = true; } } // Sjekker at alle plassene er true for (int i = 0; i < funnet.length; i++){ // Funnet en tom plass if (!funnet[i]){ return false; } } return true; } // En rask maate a sjekke alle kortene: boolean sjekkAlle(){ for (Kort k: stokk.kortstokk){ // Hvis et kort mangler vil det vaere enn tom plass if (k == null) { return false; } } return true; } void stokk(){ // Lager en tom kortstokk Kort[] stokket = new Kort[52]; Random random = new Random(); // Teller for indeks i den nye stokken int nyStokkTeller = 0; for (int i = 52; i > 0; i--){ // velger ut et tilfeldig kort fra en tilfeldig indeks i stokken: int randomIndeks = random.nextInt(i); // Putter dette kortet i den nye stokken stokket[nyStokkTeller++] = stokk.kortstokk[randomIndeks]; // Flytter det siste tallet i den gamle kortstokken // slik at stokken blir en mindre // Siste plassen ligger paa i-1 stokk.kortstokk[randomIndeks] = stokk.kortstokk[i-1]; } // Oppdaterer til slutt kortstokken stokk.kortstokk = stokket; } void delUtTilSpillere(int antallSpillere, int antallKort, String[] spillernavn){ spillere = new Spiller[antallSpillere]; int kortstokkTeller = 0; for (int i = 0; i < antallSpillere; i++){ spillere[i] = new Spiller(spillernavn[i]); Kort[] spillerKort = new Kort[antallKort]; for (int j = 0; j < antallKort; j++){ spillerKort[j] = stokk.kortstokk[kortstokkTeller++]; } spillere[i].mottaKort(spillerKort); } } void beSpillereViseKort(){ for (Spiller s: spillere){ s.visFramKort(); } } } class Kortstokk{ Kort[] kortstokk; String[] typer; Kortstokk(){ kortstokk = new Kort[52]; typer = new String[4]; typer[0] = "Hjerter"; typer[1] = "Ruter"; typer[2] = "Spar"; typer[3] = "Klover"; } void lagKortstokk(){ for (int i = 0; i < 52; i++){ kortstokk[i] = new Kort(new Type(typer[i/13]), (i%13+1) ); } } void skrivUt(){ for (Kort k : kortstokk){ k.skrivUt(); } } } class Kort{ Type type; int tall; Kort(Type type, int tall){ this.type = type; this.tall = tall; } void skrivUt(){ System.out.println(type.type + " " + tall); } } class Type{ String type; // Denne inneholder hva slags type kortet er Type(String type){ this.type = type; } }
Tilbakemelding p? dette oppgavesettet kan du sende p? mail til ingridgg [a] ifi.uio.no