Midterm, nov.2007                            Meno a priezvisko: __________________
                                                          
  skupina: 2ai_

[1 bod] Program pozostáva z následujúcich troch tried (sú v súboroch A.java, B.java, Foo.java), pričom B je podtrieda triedy A:

public class A {}
public class B extends A {}

public class Foo {
  public static int foo(A x, A y) { return 1; }
  public static int foo(A x, B y) { return 3; }
  public static int foo(B x, B y) { return 2; }

  public static void main(String args[]) {
    System.out.print(foo(new A(), new A()));
    System.out.print(foo(new B(), new A()));
    System.out.print(foo(new A(), new B()));
    System.out.print(foo(new B(), new B()));
  }
}
Ktoré z tvrdení je podľa Vás pravdivé:
program sa nedá skompilovať, vyhlási chybu ! Akú (slovne):
program sa dá skompilovať, ale pri behu vyhlási chybu ! Akú (slovne):
program sa dá skompilovať aj pustiť a vypíše:
niečo ine:
__________________________________________________________________________

[1 bod] Následujúci program:

public class Hoo {
  private int i = j;
  private int j = 10;
  public static void main(String args[]){
      System.out.println((new Hoo()).i);
  }
}
sa nedá skompilovať ! Prečo (slovne):
program sa dá skompilovať, ale pri behu vyhlási chybu ! Akú (slovne):
program sa dá skompilovať aj pustiť a vypíše:
niečo ine:
________________________
__________________________________________________

[1 bod] Pred skončením následujúceho programu sa vypíše hodnota poľa

public static void main(String[] args) {
  int[] pole = { 2, 4, 1, 0, 6, 7 };
  pole[1] = pole[5] + 6;
  pole[0]++;
  pole[5] = pole[1]-6;
  // tu vypise pole
}

ktorá je:
2, 12, 1, 0, 6, 7
12, 4, 1, 0, 0, 7
3, 13, 1, 0, 6, 7
13, 4, 1, 0, 13, 1
niečo ine:
__________________________________________________________________________

[1 bod] Čo je výsledkom následujúceho programu, ktorý pozostáva z troch tried:

public class A {
  public static int n = 0;
  public A() {
    n += 1;
    n *= 10;
  }
}
public class B extends A {
  public B() {
      n += 5;
      n *= 50;
  }
}
public class C {
  public static void main(String[] args) {
    B b = new B();
    System.out.println(A.n);
  }
}
250
750
11
2510
niečo ine:
______________
____________________________________________________________

[1 bod] Následujúci program vypíše priložený výstup:

public class M {
  public static int moo(int m) {
    if (m > 0)
      return 2*moo(m/2)+(1-m%2);
    else
      return 0;
  }
  public static void main(String[] args) {
    for(int i=0; i<20; i++)
      System.out.println("moo("+ i + ")=" + moo(i));
  }
}

moo(0)=0
moo(1)=0
moo(2)=1
moo(3)=0
moo(4)=3
moo(5)=2
moo(6)=1
moo(7)=0
moo(8)=7
moo(9)=6
moo(10)=5
moo(11)=4
moo(12)=3
moo(13)=2
moo(14)=1
moo(15)=0
moo(16)=15
moo(17)=14
moo(18)=13
moo(19)=12

Čo je výsledkom metódy moo(49):

12
15
14
13
niečo ine:
__________________________________________________________________________

[1 bod] Následujúci program vypíše  výstup:

public class S {
  static int n = 0;
  int m;
  public S(int m) {
    this.m = m;
    this.m += this.m;
    n <<= 1;
    n += m;
  }
  public static void main(String[] args) {
    new S(1);
    new S(1);
    new S(0);
    new S(1);
    System.out.println(S.n);
  }
}

12
15
14
13
niečo ine:
__________________________________________________________________________

[2+2+2+2+1 body] Akiste viete sčítavať viac-ciferé čísla, napríklad:

 123456789
+987654321
___________
1111111110
Sčitujeme aj násobíme od najnižších rádov smerom k vyšším...Vašou úlohou je zimplementovať triedu pre narábanie s veľkými číslami:

V distrubucii javy existuje modul implementujúci veľkú nadmnožinu operácií z tohoto testu, ktorý nesmiete použiť.

Zadanie:
Definujte triedu BigNum, ktorá vie reprezentovať max. 1000 mieste nezáporné dekadické číslo. Zvolená reprezentácia je na vás, pre účely písomky postačí reprezentácia v poli, po jednotlivých desiatkových cifrách (v desiatkovej sústave, t.j. napr. ako pole cifier {1,2,3,..., 9} vo vami zvolenom poradí). Šikovnejšej reprezentácii sa medze nekladú, ale efektívnosť nie je kritériom...

Úlohy (progam píšte na zadnú stranu (y) týchto zadaní):
1) Pre triedu BigNum, ktorá vie reprezentovať max. 1000 mieste nezáporné dekadické číslo, definujte základný konštruktor BigNum(int i) a textovú reprezentáciu-metódu String toString(). [2 body] Príklad, ktorý musí zbehnúť: BigNum bn = new BigNum(123456); System.out.println(bn); a vypíše 123456.

2) Definujte metódu void add(BigNum bn), ktorá pripočíta bn k this, t.j. this := this+bn    [2 body]

3) Napíšte kód ktorý vypočíta súčet 2^0 + 2^1 + 2^2 + ... 2^99 použitím vašej triedy BigNum [2 body]
hint: 2^57 = 2^56 + 2^56
hint: 2^0 + 2^1 + 2^2 + ... 2^15 = 65535

4) Definujte metódu void mult(int i), ktorá vynásobí this malým nezáporným  číslom i <= 10, t.j. this := this*i  [2 body]

5) Napíšte kód ktorý vypočíta 100 faktoriál použitím vašej triedy BigNum [1 bod]