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