Løsningsforslag - oppgaver i Avsnitt 1.4.3


Oppgave 1

  Double x = new Double(3.14);  // gammel måte
  Double y = 3.14;              // autoboksing

  double d = x;     // avboksing

  Boolean b = new Boolean(true);   // gammel måte
  Boolean c = true;                // autoboksing

  Character[] a = {'A','B','C','D','E'};  // autoboksing
  char tegn = a[2];   // avboksing

Oppgave 2

Noen eksempler:

  String s = Integer.toUnsignedString(-1);
  String t = Integer.toUnsignedString(Integer.MIN_VALUE);
  System.out.println(s + " " + t);  // 4294967295 2147483648

  int k1 = -1 / 10;                        // kvotient k1 = -(1/10) = 0
  int k2 = Integer.divideUnsigned(-1,10);  // kvotient
  System.out.println(k1 + " " + k2);       // 0 429496729

  int d1 = Integer.compare(-1, 1);
  int d2 = Integer.compareUnsigned(-1, 1);
  System.out.println(d1 + " " + d2);       // -1 1
  

Metodekallet Integer.compare(-1, 1); returnerer -1. Det er slik det skal være siden -1 er mindre 1. Men metodekallet Integer.compareUnsigned(-1, 1); returnerer 1. Binærkoden til -1 har 32 1-biter. Men det er tallet 4294967295 når vi ser bort fra fortegn. Men 4294967295 er større enn 1. Dermed returnerer metoden 1.

Oppgave 5

  public static void skriv(Object[] a, int fra, int til)
  {
    fratilKontroll(a.length,fra,til);

    for (int i = fra; i < til; i++) System.out.print(a[i] + " ");
  }

  public static void skriv(Object[] a)
  {
    skriv(a,0,a.length);
  }

  public static void skrivln(Object[] a, int fra, int til)
  {
    skriv(a,fra,til);
    System.out.println();
  }

  public static void skrivln(Object[] a)
  {
    skrivln(a,0,a.length);
  }
  public static void bytt(Object[] a, int i, int j)
  {
    Object temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  } 

Oppgave 7

  double[] d = {5.7,3.14,7.12,3.9,6.5,7.1,7.11};
  Double[] b = new Double[d.length];

  // hvert element b lages som en instans av class Double
  for (int i = 0; i < b.length; i++) b[i] = d[i];  // autoboksing

  Tabell.innsettingssortering(b);
  Tabell.skrivln(b);  // se Oppgave 5

Oppgave 8

Hvis du har tilgang til begge metodene i et program, vil metodekallet f(1,1); føre til at kompilatoren gir en feilmelding som denne: Reference to f is ambiguous. Both method f(int,Integer) og method f(Integer,int) match. Det kommer av at hvis den første f-en skal brukes, må det andre 1-tallet konverteres til en Integer. Hvis derimot den andre f-en skal brukes, må de første 1-tallet konverteres til en Integer. Det ene er ikke noe riktigere enn det andre. Derfor er det tvetydig.

Hvis en av metodene tas vekk, vil metodekallet f(1,1); bli utført. Det er det samme hvilken som tas vekk.

En kan bestemme hvem av dem som skal brukes ved å konvertere ett av tallene til en Integer:

  f(1, (Integer)1);  // nå brukes f(int a, Integer b)
  f((Integer)1,1);   // f(Integer a, int b)
  

Oppgave 9

  public static void main(String... args)
  {
    BigInteger[] b = new BigInteger[10];
    b[0] = new BigInteger("12345678987654321");
    b[1] = new BigInteger("12121212121212121");
    b[2] = new BigInteger("12312312312312312");
    b[3] = new BigInteger("98765432123456789");
    b[4] = new BigInteger("11111111111111111");
    b[5] = new BigInteger("88888888888888888");
    b[6] = new BigInteger("98989898989898989");
    b[7] = new BigInteger("98798798798798798");
    b[8] = new BigInteger("99988877766655544");
    b[9] = new BigInteger("98899889988998899");

    int k = Tabell.maks(b);
    System.out.println(b[k]);

    System.out.println("");

    Tabell.innsettingssortering(b);
    for (BigInteger x : b) System.out.println(x);
  }

Oppgave 10

  public static void main(String... args)
  {
    BigDecimal[] b = new BigDecimal[5];
    b[0] = new BigDecimal("11111111111111.1");
    b[1] = new BigDecimal("11111111111111.11111");
    b[2] = new BigDecimal("11111111111111.11");
    b[3] = new BigDecimal("11111111111111.1111");
    b[4] = new BigDecimal("11111111111111.111");

    int k = Tabell.maks(b);
    System.out.println(b[k]);

    System.out.println("");

    Tabell.innsettingssortering(b);
    for (BigDecimal x : b) System.out.println(x);
  }