L?sningsforslag ukeoppg. 4:  14. - 18. sep (INF1000 - H?st 2009)

Teori for Oblig 2: Mer om l?kker og arrayer (kap. 4 - 5); og metoder (kap. 7.1 - 7.9)
NB! Husk at l?sningene dine ikke trenger ? v?re like med disse for ? v?re riktige.  Det er vanlig i programmering at samme oppgave kan l?ses p? mange forskjellige m?ter, og alle disse er ok p? INF1000 s? lenge svaret er riktig.

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) 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
    
    class Bombe {
       public static void main(String[] args) {
    
           for (int teller = 10; teller >= 0; teller--) {
    	   System.out.print(" ..." + teller);
           }
           System.out.println();
       }
    }
    

    Java-nedtelling: (kun for spesielt interesserte)  Hvis du vil legge inn 1-sekunds pause f?r hvert tall skrives ut kan du skrive "Thread.sleep(1000); // Vent 1000 millisek." inne i for-l?kka og endre "(String[] args)" til "(String[] args) throws Exception".  Exceptions er ikke pensum men omtales i kap. 18.  Bare kap. 1 - 9 (og litt av 12) er pensum.

    (b) Lag en l?kke som skriver ut de 10 f?rste potensene av 2 (2, 2×2, 2×2×2, osv).  Bruk en teller-variabel "i" som teller de 10 gangene, og en variabel "potens2" 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
    
    class PowersOf2 {
       public static void main(String[] args) {
    
           int potens2 = 1;
           for (int i = 0; i < 10; i++) {
    	   potens2 = potens2 * 2;
    	   System.out.print(potens2 + "  ");
           }
           System.out.println();
       }
    }
    

    (c) 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) ganget med telleren i den indre l?kka.
    1  2  3  4
    2  4  6  8
    3  6  9  12
    
    class DobbelLoop {
       public static void main(String[] args) {
    
           int produkt = 1;
           for (int i = 1; i <= 3; i++) {
    	   for (int j = 1; j <= 4; j++) {
    	       produkt = i * j;
    	       System.out.print(produkt + "  ");
    	   }
    	   System.out.println();
           }
       }
    }
    


  2. L?kker: Hva blir skrevet ut?
    Avgj?r uten ? bruke datamaskin hva som blir skrevet ut n?r f?lgende programsetninger utf?res.
    //(a)
           int a = 10;
           while (a < 20) {
               a += 4;
           }
           System.out.println("a = " + a);
    
    
    a = 22
    //(b)
           int sum = 0;
           for (int b = 1; b < 6; b += 2) {
               sum += b;
           }
           System.out.println("sum = " + sum);
    
    
    sum = 9
    
    
    //(c)
           int produkt = 1;
           for (int c = 1; c < 4; c++) {
               produkt = produkt * c;
    	   System.out.println(produkt);
           }
    
    1
    2
    6
    //(d)
           for (int d = 3; d >= 1; d--) {
               for (int e = 1; e <= 3; e++) {
                   System.out.println(d + e);
               }
           }
    
    4
    5
    6
    3
    4
    5
    2
    3
    4
    //(e)
           int teller = 0;
           for (int ytre = 0; ytre < 3; ytre++) {
               teller++;
               for (int indre = 0; indre < 3; indre++) {   
                   teller++;
               }
           }
           System.out.println(teller);
    
    12


  3. Arrayer med tall:  (Oblig-relevant!)
    (a) Lag en l?kke som setter inn de 10 f?rste oddetall i f?lgende array.  La telleren i l?kka g? fra 0 til 9, og i hver gjennomgang av l?kka setter du inn én verdi i arrayen, beregnet som telleren ganget med 2 pluss 1.
    int[] oddetall = new int[10];
    
    class Oddetall {
        public static void main(String[] args) {
    	int[] oddetall = new int[10];
    	for (int i = 0; i < 10; i++) {
    	    oddetall[i] = i * 2 + 1;
    	    System.out.println(oddetall[i]);
    	}
        }
    }
    

    (b) Produkt av verdier != 0: Anta at arrayen verdier[] og variabelen produkt er deklarert som vist under.  Lag en l?kke som g?r gjennom verdiene i arrayen, og hver gang den kommer til en verdi som ikke er 0 ganger du verdien med produkt og lagrer resultatet i samme variabel (produkt).  Utskriften til slutt skal v?re 240 (dvs. 2×4×10×3).
    int[] verdier = { 0, 2, 4, 0, 0, 10, 0, 3 };
    int produkt = 1;
    // L?kke:
    for (                                       ) {
    
    }
    System.out.println(produkt);
    
    class VerdierIkke0 {
        public static void main(String[] args) {
    
    	int[] verdier = { 0, 2, 4, 0, 0, 10, 0, 3 };
    	int produkt = 1;
    	// L?kke:
    	for (int i = 0; i < verdier.length; i++) {
    	    if (verdier[i] != 0) {
    		produkt = produkt * verdier[i];
    	    }
    	}
    	System.out.println(produkt);
        }
    }
    

    (c) 2D-array: Lag to nestede for-l?kker som setter inn f?lgende verdier i en 2D-array deklarert som: int[][] tabell = new int[3][4];, slik at tabell[0][0] blir 1, tabell[2][3] blir 12, osv.  Husk at indeksene i arrayen starter fra 0, ikke 1.
    1  2  3  4
    2  4  6  8
    3  6  9  12
    
    class Array2D {
       public static void main(String[] args) {
    
           int[][] tabell = new int[3][4];
    
           for (int i = 0; i < 3; i++) {
    	   for (int j = 0; j < 4; j++) {
    	       tabell[i][j] = (i + 1) * (j + 1);
    	       System.out.print(tabell[i][j] + "  ");
    	   }
    	   System.out.println();
           }
       }
    }
    

    (d) Sum i kolonner: Skriv programkode som beregner summen av verdiene i hver kolonne i ovennevnte array og skriver summene ut (6 12 18 24).  Dette ligner p? en deloppgave i oblig 2!
           for (int kol = 0; kol < 4; kol++) {
    	   int sumkol = 0;
    	   for (int rad = 0; rad < 3; rad++) {
    	       // ...(fyll inn resten)...
    	   }
    	   // ...(fyll inn resten)...
           }
           // ...(fyll inn resten)...
    


  4. Array med String-er: Hva blir skrevet ut?  Og hvorfor?  (Oblig-relevant!)
    class NavneArray {
       public static void main(String[] args) {
    
           String[] navn = { "Anne", "Kari", "Ole", null };
    
    //(a)
           System.out.println(navn[1] + navn[navn.length/2]);
    
    
    KariOle
    
    
    //(b)
           for (int i = 0; i < navn.length; i++) {
               // Testen "!= null" sikrer at neste ledd ikke blir null.equals(..)
               if (navn[i] != null
                   && (navn[i].equals("Ole") || navn[i].equals("Anne")) ) {
                   System.out.println(i);
               }
           }
    
    
    
    0
    2
    //(c)
           int indeks = 0;
           boolean funnet = false;
           while (indeks < 4 && !funnet) {
               if (navn[indeks].equals("Kari")) {
                   funnet = true;
               }
               indeks++;
           }
           System.out.println(indeks);
    
    
    2
    
    
    //(d)
           String[] andreNavn = { "Per", "Anne", "Ole" };
           for (int i = 0; i < 4; i++) {
               for (int j = 0; j < 3; j++) {
                   // Testen "!= null" sikrer at andre ledd ikke blir null.equals(..)   
                   if (navn[i] != null && navn[i].equals(andreNavn[j])) {
                       System.out.println(i + " " + j);
                   }
               }
           }
       }
    }
    
    0 1
    2 2


  5. inLine(), inChar(), og ordrel?kke:  (Oblig-relevant!)
    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:
    
    import easyIO.*;
    class Navn100 {
       public static void main(String[] args) {
           In tast = new In();
           Out skjerm = new Out();
    
           char svar = 'j'; // Startverdi
           while (svar != 'n') {
    
    	   skjerm.out("Skriv et navn: ");
    	   String navn = tast.inLine();
    
    	   for (int i = 0; i < 100; i++) {
    	       skjerm.out(navn + " ");
    	   }
    	   skjerm.outln();
    
    	   skjerm.out("Gi nytt navn? (j/n): ");
    	   svar = tast.inChar("\n\r");
           }
       }
    }
    
    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.


  6. Metoder: (basert p? forelesningen uke 4 (PDF), lysark side 28)  (Oblig-relevant!)
    (a) Endre strukturen til programmet ditt fra punkt 5. 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 punkt 5. 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 svar = 'j'; // Startverdi
    
            while (svar != 'n') {
                // - Be bruker taste et navn og les det inn med .inLine();
    	    skjerm.out("Skriv et navn: ");
    	    navn = tast.inLine();
    
                // - Utskrift av navn 100 ganger.
    	    for (int i = 0; i < 100; i++) {
    		skjerm.out(navn + " ");
    	    }
    	    skjerm.outln();
    
                // - Sp?r om bruker vil "Gi nytt navn? (j/n):", og .inChar("\n\r"):
    	    skjerm.out("Gi nytt navn? (j/n): ");
    	    svar = tast.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.
    import easyIO.*;
    class Navn100 {
        public static void main(String[] args) {
            Hjelpeklasse hj = new Hjelpeklasse();
            hj.ordrel?kke();
        }
    }
    class Hjelpeklasse {
        In tast = new In();
        Out skjerm = new Out();
    
        String navn;
    
        void ordrel?kke() {
            char svar = 'j';
            while (svar != 'n') {
    	    // Be bruker taste et navn og les det inn med .inLine():
    	    skjerm.out("Skriv et navn: ");
    	    navn = tast.inLine();
    
                // Kaller metoden utskrift():
    	    utskrift();
    
                // - Sp?r om bruker vil "Gi nytt navn? (j/n):"
    	    skjerm.out("Gi nytt navn? (j/n): ");
    	    svar = tast.inChar("\n\r");
            }
        }
        void utskrift() {
    	for (int i = 0; i < 100; i++) {
    	    skjerm.out(navn + " ");
    	}
    	skjerm.outln();
        }
    }
    

    (c) Inn-parameter: Endre programmet slik at String-variabelen navn n? deklareres inne i metoden ordrel?kke() (og ikke "globalt" ? dvs. f?r alle metodene, som vist ovenfor), og slik at verdien av denne variabelen blir overf?rt til metoden utskrift(..) vha. et argument i kallet.  Endre ogs? begynnelsen av metoden utskrift(..) slik at den tar imot argumentet vha. parameteren String navn, slik:  void utskrift(String navn) {
    import easyIO.*;
    class Navn100 {
        public static void main(String[] args) {
            Hjelpeklasse hj = new Hjelpeklasse();
            hj.ordrel?kke();
        }
    }
    class Hjelpeklasse {
        In tast = new In();
        Out skjerm = new Out();
    
        void ordrel?kke() {
            char svar = 'j';
            while (svar != 'n') {
    	    // Be bruker taste et navn og les det inn med .inLine():
    	    skjerm.out("Skriv et navn: ");
    	    String navn = tast.inLine();
    
                // Kaller metoden utskrift():
    	    utskrift(navn);
    
                // - Sp?r om bruker vil "Gi nytt navn? (j/n):"
    	    skjerm.out("Gi nytt navn? (j/n): ");
    	    svar = tast.inChar("\n\r");
            }
        }
        void utskrift(String navn) {
    	for (int i = 0; i < 100; i++) {
    	    skjerm.out(navn + " ");
    	}
    	skjerm.outln();
        }
    }
    


  7. Metode med inn og ut-parametre: kap. 7, oppg. 2 (side 133)
    Lag en metode som regner ut hypotenusen c i en rettvinklet trekant n?r vi g?r ut fra Pytagoras formel: c2 = a2 + b2 der a og b er lengden p? katetene ? de to andre sidene i trekanten.  Vi bruker a og b som parametre til metoden.  Du trenger da ? kalle kvadratrotmetoden i Math.sqrt(double_verdi) i den metoden du lager.  Returner verdien c som verdien p? metoden.  Test metoden ved ? kalle den i en dobbel for-l?kke for alle kombinasjoner av a og b med heltallsverdiene fra 1.0 til og med 6.0, og skriv ut svarene.
    double finnHypotenus(double a, double b) {
        ...
    
        return c;
    }
    
    Tips: Kallet p? metoden kan se slik ut:  double c = finnHypotenus(a, b); 
    class Hypotenus {
        public static void main(String[] args) {
    	HypotenusMetoder h = new HypotenusMetoder();
    	h.start();
        }
    }
    class HypotenusMetoder {
        void start() {
    	for (double a = 1; a <= 6; a++) {
    	    for (double b = 1; b <= 6; b++) {
    		double c = finnHypotenus(a, b);
    		System.out.printf("a=%.1f, b=%.1f  gir c=%.3f\n", a, b, c);
    	    }
    	}
        }
    
        double finnHypotenus(double a, double b) {
    	double c = Math.sqrt(a * a + b * b);
    	return c;
        }
    }
    
    KJ?REEKSEMPEL:
    a=1.0, b=1.0  gir c=1.414
    a=1.0, b=2.0  gir c=2.236
    a=1.0, b=3.0  gir c=3.162
    a=1.0, b=4.0  gir c=4.123
    a=1.0, b=5.0  gir c=5.099
    a=1.0, b=6.0  gir c=6.083
    a=2.0, b=1.0  gir c=2.236
    a=2.0, b=2.0  gir c=2.828
    a=2.0, b=3.0  gir c=3.606
    a=2.0, b=4.0  gir c=4.472
    a=2.0, b=5.0  gir c=5.385
    a=2.0, b=6.0  gir c=6.325
    a=3.0, b=1.0  gir c=3.162
    a=3.0, b=2.0  gir c=3.606
      ...osv...
    a=6.0, b=5.0  gir c=7.810
    a=6.0, b=6.0  gir c=8.485
    


  8. Metode med array som inn-parameter: kap. 7, oppg. 3 (side 134)
    Lag en metode double gjennomsnitt(int[] a) som summerer alle elementene i heltallsarrayen a, og som returnerer (det aritmetiske) gjennomsnittet av verdiene i a.
    // Dette eksemplet viser en lignende programstruktur men med bare én klasse.
    // Vi slipper ? bruke to klasser ved ? la objekt-pekeren "gj" referere til
    // den samme klassen som den selv og main-metoden er plassert i.
    class Gjennomsnitt {
    
        public static void main(String[] args) {
    	Gjennomsnitt gj = new Gjennomsnitt();
    	gj.testGjennomsnitt();
        }
    
        void testGjennomsnitt() {
    	int[] a = { 1, 2, 2, 1, 0, 3 };
    	double snitt = gjennomsnitt(a); // Argument: arraynavnet uten klammer
    	System.out.println("Gjennomsnittet er: " + snitt);
        }
    
        double gjennomsnitt(int[] a) {
    	int sum = 0;
    	for (int i = 0; i < a.length; i++) {
    	    sum += a[i];
    	}
    	return (double) sum / a.length;
        }
    }
    
    KJ?REEKSEMPEL:
    Gjennomsnittet er: 1.5
    

Oppgaver til terminaltimen

  1. L?kker og metoder: 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
    
    class Fibonacci {
        public static void main(String[] args) {
    
    	int nestSiste = 0;
    	int siste = 1;
    	// Skriver ut de to f?rste tall:
    	System.out.print(nestSiste + "  ");
    	System.out.print(siste + "  ");
    
    	// Skriver ut 3. til 15. tall i f?lgen:
    	for (int i = 3; i <= 15; i++) {
    	    int tmp = siste; // Midlertidig variabel
    	    siste = siste + nestSiste;
    	    nestSiste = tmp;
    	    System.out.print(siste + "  ");
    	}
    	System.out.println();
        }
    }
    


  2. Arrayer, inLine(), inChar(), og enkle metoder:  (Oblig-relevante!)
    (Samme oppgaver som i punkt 3., 4., 5., og 6. for teoritimen.) 


  3. Start 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.


  4. Metoder med inn- og ut-parametre:
    (Samme oppgaver som i punkt 7. og 8. for teoritimen.)  Slike metoder trengs ikke i oblig 2.


  5. Ekstraoppgave:
    (a) Endre strukturen i Fibonacci-programmet du lagde ovenfor slik at det f?lger malen fra oblig 2 (vist ogs? ovenfor i punkt 6. 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.
    import easyIO.*;
    
    class Fibonacci {
        public static void main(String[] args) {
            FibonacciMetoder fib = new FibonacciMetoder();
            fib.ordrel?kke();
        }
    }
    
    class FibonacciMetoder {
        In tast = new In();
        Out skjerm = new Out();
    
        void ordrel?kke() {
            int ordre = 0;
    
            while (ordre != 3) {
    	    // Meny:
                skjerm.outln("1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen");
                skjerm.outln("2. Test om et tall h?rer til f?lgen");
    
    	    // Leser kommando fra bruker:
                skjerm.out("Velg kommando (3=Avslutt): ");
                ordre = tast.inInt();
    
                switch (ordre) {
                    case 1: skriv15Fib(); break;
                    case 2: testFibTall(); break;
                    default: break;
                }
    	    System.out.println();
            }
        }
    
        void skriv15Fib() {
    	int nestSiste = 0;
    	int siste = 1;
    	System.out.print(nestSiste + "  ");
    	System.out.print(siste + "  ");
    
    	for (int i = 3; i <= 15; i++) {
    	    int tmp = siste; // Midlertidig variabel
    	    siste = siste + nestSiste;
    	    nestSiste = tmp;
    	    System.out.print(siste + "  ");
    	}
    	System.out.println();
        }
    
        void testFibTall() {
    	skjerm.outln();
    	skjerm.out("Skriv et tall for ? teste om det er Fibonacci-tall: ");
    	int inntastet = tast.inInt();
    
    	int nestSiste = 0;
    	int siste = 1;
    	int i = 2; // i: Plass i Fib.f?lgen til n?v?rende "siste"
            // S? lenge "siste" er < enn inntastet generér neste Fib.-tall:
    	for ( ; siste < inntastet; i++) {
    	    int tmp = siste;
    	    siste = siste + nestSiste;
    	    nestSiste = tmp;
    	}
    	if (siste == inntastet) {
    	    System.out.println(inntastet + " er Fibonacci-tall nr. " + i);
    	} else if (inntastet == 0) {
    	    System.out.println(inntastet + " er Fibonacci-tall nr. 1");
    	} else {
    	    System.out.println(inntastet + " er IKKE et Fibonacci-tall.");
    	}
        }
    }
    
    KJ?REEKSEMPEL:
    > java Fibonacci
    1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen
    2. Test om et tall h?rer til f?lgen
    Velg kommando (3=Avslutt): 1
    0  1  1  2  3  5  8  13  21  34  55  89  144  233  377  
    
    1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen
    2. Test om et tall h?rer til f?lgen
    Velg kommando (3=Avslutt): 2
    
    Skriv et tall for ? teste om det er Fibonacci-tall: 233
    233 er Fibonacci-tall nr. 14
    
    1. Skriv ut de 15 f?rste tall i Fibonaccif?lgen
    2. Test om et tall h?rer til f?lgen
    Velg kommando (3=Avslutt): 2
    
    Skriv et tall for ? teste om det er Fibonacci-tall: 234
    234 er IKKE et Fibonacci-tall.
    

    (b) (middels vanskelig)  Utvid ordre 2 slik at den ogs? sier hvilket Fibonacci-tall er n?rmest det bruker-inntastede tallet.
  6. Send gjerne l?sningsforslaget ditt til josek [at] ifi.uio.no, s? legger jeg det ut her.


  7. 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] ···
    Send gjerne l?sningsforslaget ditt til josek [at] ifi.uio.no, s? legger jeg det ut her.

    L?sning med lang char-array, laget av Arnab Kumar (arnabkd) i gr. 2:

    class Nott {
        public static void main(String[] args) {
    	new Nott().ukas(new char[] { 'A', 'R', 'N', 'E' });
        }
    
        void ukas(char[] word) {
    	char[] pA = new char[1024]; // 4 * (4*4*4*4)
    	int x = 0;
    
    	for (int i = 0; i < 4; i++) {
    	    for (int j = 0; j < 4; j++) {
    		for (int k = 0; k < 4; k++) {
    		    for (int l = 0; l < 4; l++) {
    			/* Tar vare p? alle permutasjoner i en char array */
    			pA[x] = word[i];
    			x++;
    			pA[x] = word[j];
    			x++;
    			pA[x] = word[k];
    			x++;
    			pA[x] = word[l];
    			x++;
    		    }
    		}
    	    }
    	}
    
    	/* Printer ut alle tilfeller der pA[i], pA[i+1], pA[i+2], pA[i+3]
    	   IKKE er like. Etter ? ha sjekket dette, s? sjekker den videre fra
    	   i+4 til i+7 og s? videre.
    	   Dvs den sjekker IKKE at i+4==i+3, fordi det er nemlig lov. (pga i+3
    	   og i+4 havner ikke i samme anagram) */
    	for (int i = 0; i < 1024; i = i + 4) {
    	    boolean first = pA[i] == (pA[i + 1])
    		|| pA[i] == (pA[i + 2]) || pA[i] == (pA[i + 3]);
    	    boolean second = pA[i + 1] == (pA[i + 2])
    		|| pA[i + 1] == (pA[i + 3]);
    	    boolean third = pA[i + 2] == (pA[i + 3]);
    	    boolean check = first || second || third;
    
    	    if (check != true) {
    		System.out.println(i + ") " + pA[i] + "" + pA[i + 1] + ""
    				   + pA[i + 2] + "" + pA[i + 3]);
    	    }
    	}
        }
    }
    



Kommentarer om dette oppgavesettet kan du sende til josek [at] ifi.uio.no