Ukeoppgaver 12: 7.-13. november 2013

Oppgave 1

Denne oppgaven er hentet fra Eksamenssett 2009, Oppgave 9

Personopplysningsloven (10 poeng)

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.

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.

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.

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.

Oppgave 4

*Ordfrekvenser med Arrayer og tekster *

Tips: For ? bruke en hvilken som helst fil her, kan man bruke programmet fra oppgave "Fjern tegn fra tekst" for ? fjerne tegn. For ? telle antall unike ord i fila, kan man skrive kommandoen ipython i terminalen og skrive inn denne linja:

print len(set(w.lower() for w in open('eksempelfil').read().split()))

Og s? kan du sette inn tallet dette gir p? f?rste linje i tekst-fila du vil telle ord i.

a)

I denne oppgaven skal du lese inn en tekst/artikkel og telle forekomster av de forskjellige ordene. I f?rste linje i fila er det et heltall som sier hvor mange ulike ord det finnes. Du skal opprette et String-array hvor du legger inn de forskjellige ordene, og et int-array av samme lengde hvor du legger inn antall forekomster. ord[0] vil da ha frekvens[0] forekomster. For hvert ord du leser inn (med unntak av det f?rste), m? du sjekke om akkurat det ordet finnes i arrayet allerede. Hvis det ikke gj?r det, legger du det inn p? neste ledige plass. Hvis det finnes, ?ker du riktig indeks i frekvens-arrayet med 1. F.eks:

if(innlestOrd.equals(ord[i])) {
    frekvens[i]++;
}

I tillegg vil vi utelukke tegn (punktum og komma osv) og tall. Det kan ogs? l?nne seg ? gj?re om alle bokstavene i teksten til sm? bokstaver, slik at Det og det blir samme ord. Til slutt kan du sjekke hvilke ord som er de mest frekvente ordene ved ? l?pe gjennom arrayet p? nytt og finne hvilke tall i frekvens-arrayen som er st?rst. Du vil n? se at ordene det finnes flest av ikke alltid er de mest informative ordene. Hvis du vil kan du endre oppgaven til ? bare skrive ut ord som er lengre enn 3 bokstaver og se hva slags ord du n? f?r.

b) Klasser og objekter

Gitt klassen Orddata (se under), skal du lese inn denne fila, og telle de X ulike ordene som finnes der. Hvert ord skal lagres ved hjelp av klassen Orddata, som inneholder ordet og antall forekomster av dette ordet. ?verst i fila er det et heltall som sier hvor mange ord det er. Du skal opprette en array av Orddata som har samme lengde som antall ord i fila.

N?r du leser inn fila, skal du hver gang du finner et ord sjekke om du har lest dette f?r. Hvis du ikke har lest dette f?r, skal du opprette et nytt objekt av klassen Orddata som inneholder ordet og antall forekomster (f?rste gang 1). Hvis du har lest det f?r, skal du ?ke frekvensen i riktig Orddata-objekt med 1. Til slutt skal du sortere arrayet ved hjelp av Arrays.sort(). Da er arrayet sortert, og du kan se p? de 10 mest frekvente ordene ved ? se p? indeksene 0-9.

class Orddata implements Comparable<Orddata> {
    private String ord;
    private int forekomster;

    public Orddata(String ord) {
        this.ord = ord;
        forekomster = 1;
    }

    public String hentOrd() {
        return ord;
    }

    public int hentForekomster() {
        return forekomster;
    }

    public void nyForekomst() {
        forekomster++;
    }

    public int compareTo(Orddata x) {
       return x.hentForekomster() - forekomster;
    }
}
c) HashMap

I denne oppgaven skal vi erstatte arrayet fra forrige oppgave med et HashMap. Legg inn ordene inn i et HashMap der n?klene er String ord og verdiene er Orddata. For ? sortere ordene kan du bruke f?lgende kode, der du konverterer HashMappet til en array. S? sorterer du arrayet med Arrays.sort():

Orddata[] ordarray = ordsamling.values().toArray(new Orddata[0]);
Arrays.sort(ordarray);

S? skal du skrive ut de 10 mest frekvente ordene i fila.

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.

 

Hvis du har tilbakemeldinger til oppgavesettet kan du sende mail til ingridgg[a]ifi.uio.no

 

Publisert 11. nov. 2013 00:42