Ukeoppgaver 4:  12. - 18. sep (INF1000 - Høst 2012)

Metoder, flerdimensjonale arrayer og design av programmer med mer enn en klasse   (kapittel 7.1-7.7, 5.7 i "Rett på Java" 3. utg.)

[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.

NB! Denne uken er det merket to oppgaver som nøkkeloppgaver: De adresserer hvert sitt tema fra ukens pensum, og begge er svært sentrale for arbeidet med oblig 2.

Oppgaver


  1. Utskrift og sum av oddetalls-array: kap. 5, oppg. 1-2 (side 99)
    (a) Skriv et program som inneholder en heltalls-array med følgende elementer: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19.  Programmet skal inneholde en løkke som skriver ut indeksen og verdien for alle elementene i arrayen.

    (b) Sum av elementene i en array: Vi bruker her samme array som i forrige oppgave: Beregn summen av elementene og skriv ut resultatet.


  2. Søke etter tall i array:
    (a) Utvid programmet fra forrige oppgave slik at det ber bruker taste inn et tall, og deretter skriver ut en beskjed om det inntastede tallet finnes eller ikke finnes i arrayen.

    (b) Legg også til en løkke som skriver ut alle verdiene i arrayen som er mindre enn det inntastede tallet.


  3. [Nøkkeloppg.]: Flerdimensjonal array:
    To-dimensjonale arrayer brukes på samme måte som en-dimensjonale, men har to sett med klammer, og gjennomgås best ved hjelp av to nestede for-løkker, som vist i følgende program:
    import easyIO.*;
    class Array2D {
       public static void main(String[] args) {
    
            int[][] b = new int[3][4];
    
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 4; j++) {
    
                    b[i][j] = i * j;
    
                    System.out.println(<Hva mangler her?>);
                }
            }
       }
    }
    Arrayen kan illustreres slik:
      0 1 2 3
    0_
    1_
    2_
    KJØREEKSEMPEL:
    > java Array2D     
    b[0][0] = 0
    b[0][1] = 0
    b[0][2] = 0
    b[0][3] = 0
    b[1][0] = 0
    b[1][1] = 1
    b[1][2] = 2
    b[1][3] = 3
    b[2][0] = 0
    b[2][1] = 2
    b[2][2] = 4
    b[2][3] = 6
    (a) Hvor mange elementer er det plass til i arrayen b vist over?
    (b) Hva er array-indeksene til array-elementene i tredje kolonne, og hvilke verdier får disse elementene i programmet over?
    (c) Fullfør println-setningen i programmet ovenfor slik at det gir utskriften vist under "Kjøreeksempel".
    (d) Har det noen betydning for hvordan programmet utføres om du tenker deg/ tegner første indeks som rad eller kolonne?

  4. inLine(), inChar(), og ordreløkke:
    Lag et program som spør bruker etter et navn.  Programmet leser navnet inn ved hjelp av inLine() (hvis du bruker EasyIO) eller med nextLine (hvis du bruker Scanner); og "fyller" så skjermen med navnet ved å skrive det ut 100 ganger.  Videre skal programmet spørre bruker om hun vil gi et nytt navn (j/n).  Svaret leses nå med .inChar() hvis du bruker EasyIO, og hvis det er 'j' gjentas hele prosessen; hvis svaret ikke er 'j' avsluttes programmet.  Kjøreeksempel:
    Skriv et navn: Ola Nordmann
    Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann O
    la Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ol
    a Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola  ...osv...
    Gi nytt navn? (j/n): j
    Skriv et navn:
    



  5. [Nøkkeloppg.]: Metoder:
    (a) Endre strukturen til programmet ditt fra oppgave 4 slik at det følger den typen programstruktur som vi skal bruke i Oblig 2 (vist i skissen nedenfor), og i eksemplene fra forelesningen for uke 4), dvs. med en liten kontrollklasse øverst, etterfulgt av en egen klasse for datastruktur og metoder.  Hele programmet med begge klassene lagres i én fil, kalt Navn100.java (dvs. navnet til klassen med metoden main()).  Lag bare én metode i den andre klassen, kalt ordreløkke(), som gjør alt som står i oppgave 4.
    import easyIO.*;
    
    class Navn100 {
        public static void main(String[] args) {
            Hjelpeklasse hj = new Hjelpeklasse();
            hj.ordreløkke(); // Kjører metoden ordreløkke() i hjelpeklassen
        }
    }
    
    class Hjelpeklasse {
        // Klargjøring for innlesing/utskrift, gjelder for hele klassen:
        In tast = new In();
        Out skjerm = new Out();
    
        String navn;
    
        void ordreløkke() {
            char giNyttNavn = 'j'; // Startverdi
    
            while (giNyttNavn != 'n') {
                // - Be bruker taste et navn og les det inn med .inLine();
                // - Utskrift av navn 100 ganger.
                // - Spør om bruker vil "Gi nytt navn? (j/n):", og .inChar("\n\r"):
    
    
            }
        }
    }
    
    Mer info: Grunnen til at vi skriver programmet på denne måten med to klasser vil bli klarere når vi kommer til kapittel 8, men har sammenheng med at vi ønsker å lage gode "objektorienterte" program der vi jobber med "objekter". 

    (b) Flere metoder: Endre programmet slik at koden som skriver ut navnet 100 ganger flyttes til en egen metode kalt utskrift().  Husk å legge inn et kall på metoden på det stedet i programmet du flyttet koden fra.

    (c) Inn-parameter: Endre programmet slik at det også spør bruker hvor mange ganger navnet skal skrives ut.  Verdien som bruker taster skal overføres som parameter til metoden utskrift() som du lagde i del (b).  Endre også metoden utskrift(..) slik at den tar imot argumentet ved hjelp av parameteren int antall, slik:  void utskrift(int antall) {

  6. Robot: Klasse med metode med en parameter
    Her skal du benytte samme programstruktur som beskrevet i forrige oppgave, med en klasse som inneholder deklarasjon av metoden main, og en som inneholder deklarasjonen av øvrige metoder.
    (a) Skriv en klasse SiHei som inneholder en main-metode. Lag en ny klasse Robot og deklarer en metode i denne som heter hilsen, og som skriver en tekst ut på skjermen. Metoden skal ha en String-parameter som angir hvilken tekst som skal skrives ut. Metoden skal ikke returnere noe.
    (b) Legg et kall på metoden hilsen fra main-metoden i SiHei, med teksten "Hallo, jeg er roboten Tux" som aktuell parameter. Test at programmet ditt skriver ut teksten "Hallo, jeg er roboten Tux" på skjermen.

  7. Tips til Emacs: (for spesielt interesserte)
    • Emacs-forkortelser: Legg til følgende fem linjer i din ~/.emacs-fil:
      (define-abbrev-table 'java-mode-abbrev-table '(
          ("psv" "public static void main(String[] args) {" nil 0)
          ("sop" "System.out.println" nil 0)
      ))
      (abbrev-mode 1)
      Deretter starter du Emacs på nytt. Når du skriver psv i et Java-program (etterfulgt av mellomrom eller linjeskift) så vil det nå bli utvidet til: public static void main(String[] args) {, og tilsvarende for sop etterfulgt av (.  Legg gjerne til flere forkortelser. 
    • Undo: For å angre siste redigering trykk C-_ (dvs. Ctrl-understrek), eller klikk på ikonet med bilde av en «bøyd pil» øverst i Emacs-vinduet.
    • Copy/paste: For å kopiere tekst fra et hvilket som helst sted på skjermen til Emacs, start med å markere teksten ved hjelp av musa. Deretter flytter du mus-pekeren til det stedet i Emacs-vinduet der du vil lime inn teksten, og trykker musens midt-knapp (dvs. hjul-tasten) rett ned. Ferdig! Du trenger altså ikke trykke Ctrl-c eller høyreklikk > Copy for å velge teksten i Emacs, det er nok å markere det.
    • Cut/paste: Hvis du vil klippe bort tekst og flytte det til et annet sted i Emacs-vinduet: markér teksten; trykk Delete-tasten eller C-w for å klippe det bort; flytt tekst-markøren til ønsket sted; og trykk Insert-tasten eller C-y for å lime inn.
    • Splittet vindu: For å kunne se to filer samtidig kan du dele Emacs-vinduet i to ved å trykke C-x 2 ("C-" står for Ctrl-tasten). For å gå tilbake til å vise én fil klikk med musa på ønsket del av splitt-vinduet og trykk C-x 1.
    • Flere vinduer: For å åpne et ekstra-Emacs-vindu slik at du kan se to filer samtidig enda lettere trykk C-x 52. Husk C-x C-f for å åpne en fil i det nye vinduet.
    • Innrykk: Du kan la Emacs sette riktig innrykk i hele programmet ved å trykke C-x h og deretter velge i menyene øverst: Java > Indent Line or Region.
    • Flere tips til Emacs kan du finne i Emacs-oppgavene fra Forkurs i informatikk




Tibakemelding om dette oppgavesettet kan du skrive i bloggen eller sende på mail til siriamj [a] ifi.uio.no