Løsningsforslag ukeoppg. 12: 7.-13. november 2013

Oppgavesettet: Ukeoppgaver 12.

[Nøkkeloppg.]: 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

Publisert 21. nov. 2013 11:17 - Sist endret 21. nov. 2013 11:20