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

_亚博娱乐官网_亚博pt手机客户端登录

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