Ukeoppgaver 4:  20. - 24. sep (INF1000 - H?st 2010)

Teori for Oblig 2: Mer om l?kker og arrayer (kap. 4 - 5); og metoder (kap. 7.1 - 7.9)

M?l
F? ?velse i teorien som trengs for ? l?se Oblig 2.  Hovedtema i obligen er l?kker, arrayer, og metoder uten parametre, og f?lgende oppgaver gir nyttig trening i dette slik at du blir bedre i stand til ? l?se obligen.

Oppgaver til teoritimen

  1. Enkle l?kker med tall:
    (a) Nedtelling: Lag et program med en l?kke som teller ned fra 10 til 0.  Bruk en teller-variabel med startverdi 10 og redusér den med 1 i hver gjennomgang av l?kka.  Utskriften skal bli:
     ...10 ...9 ...8 ...7 ...6 ...5 ...4 ...3 ...2 ...1 ...0
    

    (b) Dobling: Lag en l?kke som starter med ? skrive ut tallet 2, og deretter dobler tallet, skriver det ut, og gjentar prosessen helt til 10 tall er skrevet ut.  Bruk en teller-variabel "i" som teller de 10 gangene, og en annen variabel for tallet som ganges med 2 i hver omgang av l?kka og skrives ut.  Utskriften skal bli:
    2  4  8  16  32  64  128  256  512  1024
    

    (c) Tabell: Lag to nestede for-l?kker som gir f?lgende utskrift.  Det skal bare skrives ut ett tall av gangen, som skal v?re verdien til telleren i den ytre l?kka (som g?r fra 1 til 3 og skal hete rad) ganget med telleren i den indre l?kka.
    1  2  3  4
    2  4  6  8
    3  6  9  12
    


  2. 2D-array (to-dimensjonal array) med tall:
    (a) Utskrift: Lag to nestede for-l?kker som setter inn f?lgende verdier i en 2D-array og skriver de ut.  Arrayen skal deklareres slik: int[][] tabell = new int[3][4];. Se oppgave nr. 1 (c) over for tips om disse verdiene.  Husk at indeksene i arrayen starter fra 0, ikke 1.  Verdien i tabell[2][3] skal v?re 12.
    1  2  3  4
    2  4  6  8
    3  6  9  12
    

    (b) Sum av kolonne: Skriv programkode som beregner summen av verdiene i hver kolonne i ovennevnte array og skriver summene ut.  Dette ligner p? en deloppgave i oblig 2!
    6 12 18 24

    (c) S?k etter tall: Utvid programmet slik at det ber bruker taste inn et tall og deretter ser om tallet finnes i arrayen.  Hvis tallet finnes skal alle array-indeksene der det ligger skrives ut, hvis ikke skal det gis beskjed om at tallet ikke finnes. 
    Hvilket tall s?ker du: 8
    Tallet finnes i tabell[1][3]


  3. Blokker og skop:
    Hvilke av disse programmene er lovlige?
    class Prog1 {
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                int n = k + 1;
            }
            System.out.println(n);
        }
    }
    
    class Prog2 {
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                int n = k + 1;
            }
            if (k < 0) {
                System.out.println(n);
            }
        }
    }
    
    class Prog3 {
        public static void main(String[] args) {
            int k = 0;
            if (k >= 0) {
                k++;
                System.out.println(k);
            }
        }
    }
    


  4. inLine(), inChar(), og ordrel?kke:
    Lag et program som sp?r bruker etter et navn.  Programmet leser navnet inn vha. inLine();, 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("\n\r"), og hvis det er 'j' gjentas hele prosessen; hvis svaret er 'n' 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:
    
    Tips til Oblig 2: Legg merke til det som st?r i parentesene til .inChar("\n\r") ovenfor.  Dette angir at inChar skal hoppe over evt. linjeskift (\n) eller vognretur (\r) som bruker har tastet inn, og i stedet lese inn en vanlig bokstav fra tastatur, f.eks. 'j'.  Det samme b?r du gj?re i deloppgave 1 (c) i oblig 2.


  5. Metoder:
    (a) Endre strukturen til programmet ditt fra oppgave nr. 4 over slik at det f?lger malen fra oblig 2 (vist i skissen nedenfor), dvs. med en liten kontrollklasse ?verst, etterfulgt av en egen klasse for metodene.  Hele programmet med begge klassene lagres i én fil, kalt Navn100.java (dvs. navnet til klassen med metoden main()).  Lag bare én metode i hjelpeklassen, kalt ordrel?kke(), som gj?r alt som st?r i nr. 4 ovenfor.
    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".  I denne skissen er det fem pekere til objekter: args[], hj, tast, skjerm, og navn.

    (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 vha. parameteren int antall, slik:  void utskrift(int antall) {

Oppgaver til terminaltimen

  1. L?kker: Gangetabell
    (a) Lag et program som ber bruker taste inn et tall, og skriver ut gangetabellen for det tallet, ganget med 1, 2, osv. til 12.  Hvis bruker taster inn 5 skal resultatet se slik ut:
    5 x 1 = 5
    5 x 2 = 10
    5 x 3 = 15
    5 x 4 = 20
    5 x 5 = 25
    5 x 6 = 30
    ...osv...
    (b) Endre programmet slik at utskriften av gangetabellen lages i en egen metode.  Sett opp programmet med to klasser som vist i nr. 5 ovenfor.


  2. L?kker: Fibonacci-tallene
    Lag et program som skriver ut de 15 f?rste tall i Fibonaccif?lgen.  F?lgen er definert ved at de to f?rste tall er 0 og 1, og hvert neste tall er summen av de to foreg?ende.  Utskriften skal bli:
    0  1  1  2  3  5  8  13  21  34  55  89  144  233  377
    


  3. Arrayer, inLine(), inChar(), og enkle metoder:
    (Samme oppgaver som i nr. 2, 4, og 5 for teoritimen.) 


  4. Fortsett med Oblig 2:
    Tips: Begynn med ? l?se foreg?ende oppgave (?Arrayer, inLine(), ...?).  Der vil du finne problemstillinger som ligner mye p? det som skal gj?res i Oblig 2, men litt enklere slik at obligen blir lettere ? gj?re etter at du har l?st disse oppgavene.


  5. Ekstraoppgave:
    (a) Endre strukturen i Fibonacci-programmet du lagde ovenfor slik at det f?lger malen fra oblig 2 (vist ogs? ovenfor i oppgave nr. 5 for teoritimen), med en kontrollklasse ?verst, etterfulgt av en hjelpeklasse for metodene.  Bruk tre metoder i hjelpeklassen: en ordrel?kke som skriver ut f?lgende meny, og en metode for hvert av de 2 menyvalgene:
    1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen
    2. Test om et tall h?rer til f?lgen
    
    Metoden for ordre 2 ber bruker taste inn et tall, og g?r s? i en l?kke som genererer Fibonacci-tallene frem til det bruker-inntastede tallet.  Deretter gis det melding til bruker om tallet h?rte til f?lgen eller ikke.  Mer info: Fibonacci-tallene forekommer mye i naturen, bl.a. i tregrener, blomster, kongler og kaniner.

    (b) (middels vanskelig)  Utvid ordre 2 slik at den ogs? sier hvilket Fibonacci-tall er n?rmest det bruker-inntastede tallet.



  6. Ukens n?tt: (veldig vanskelig!)
    Lag en metode som skriver ut alle anagrammer av et ord p? 4 bokstaver som ligger i en char-array.  Anagrammene skal ha de samme 4 bokstavene, i alle mulige rekkef?lger og uten ? gjenta noen bokstav.  For eksempel, hvis ordet er deklarert som f?lger, er 4 av anagrammene som vist under, og totalt 24.
    char[] ord = { 'A', 'R', 'N', 'E' };
    
     Kj?reeksempel:
     ARNE
     AREN
     ANRE
     ANER
     ...20 ord til...
    
    Tips: En m?te ? l?se dette p? er med nestede l?kker som i utgangspunktet kan g? innom alle mulige kombinasjoner, inkludert AAAA, AAAE, osv. men slik at det bare blir utskrift av de med 4 forskjellige bokstaver.  Bruk den tomme strengen "" og + i utskriftssetningen for ? konvertere char-ene til tekst: System.out.println("" + ord[3] + ord[2] ···

L?sningsforslag

Her kan du finne l?sningsforslag til disse oppgavene. Det anbefales ? l?se oppgavene p? egen h?nd f?r du studerer l?sningsforslagene.


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