Zadanie z książki

0

Dzień dobry,

Mam takie zadanie:
"Pomieszane komunikaty.
Obok zamieszczono prosty program w Javie. Brakuje w nim dwóch fragmentów. Twoim zadaniem jest dopasowanie proponowanych bloków kodu z wynikami który program wygeneruje po wybraniu kodu.

public class Mix4 { 
  int licznik = 0;

  public static void main(String[] args) {
    int ilosc = 0;
    Mix4[] m4a = new Mix4[20];
    int x = 0;
    while (_____) {
      m4a[x] = new Mix4();
      m4a[x].licznik = m4a[x].licznik + 1;
      ilosc = ilosc + 1;
      ilosc = ilosc + m4a[x].mozeNowa(x);
      x = x + 1;
    }
    System.out.println(ilosc + " " + m4a[1].licznik);
  }

  public int mozeNowa(int indeks) {
    if (_____) {
      Mix4 m4 = new Mix4();
      m4.licznik = m4.licznik + 1;
      return 1;
    }
    return 0;
  }
}

Proponowane bloki kodu:
Do wstawienia w miejsce while i if:

  1. x < 9 , indeks < 5
  2. x < 20 , indeks < 5
  3. x < 7 , indeks < 7
  4. x < 19 , indeks <1

Możliwe dane wynikowe:

  1. 14 7
  2. 9 5
  3. 19 1
  4. 14 1
  5. 25 1
  6. 7 7
  7. 20 1
  8. 20 5

Mam nad tym mega zagwozdkę i wydaje mi się że nie da się tego zrobić, bo nie widzimy metody licznik, a dodatkowo na wstępie licznik jest zdefiniowany jako 0.
Czy ktoś mógłbym mi "łopatologicznie" wytłumaczyć jak to zrobić/zabrać się za to, bo osobiście ugrzązłem próbując powyższy kod skompilować.

p.s. w załączniku zdjęcie z książki.

0

Wstaw wszystkie mozliwe kombinacje:) (16) i Obserwuj wyniki.

0

O jakiej metodzie licznik mówisz? Jeśli jednak chodzi Ci o zmienną licznik to gdzie jej nie widzisz? Co z tego, że jest zdefiniowany jako 0? Może jednak spróbuj to przepisać do jakiegoś IDE i skompilować.

0

No właśnie ;-) https://ideone.com/YC0Vaz

0

ok, program się kompiluje.
do tej pory spotkałem się z tym że zapis .licznik to wywołanie metody na obiekcie i w tą stronę kombinowałem.

jednak proszę Was o jeszcze chwile cierpliwości. drodzy Koledzy, mam teraz problem z tym, że nie wiem jak tą nową wiedzę zastosować. to że program działa, bardzo mnie to cieszy, ale to że nie wiem jak bardzo mnie smuci ;)

pogrzebałem trochę w kodzie aby dowiedzieć się co i jak i jako komentarze wpisałem moje zagwozdki:

class Mix4 {
    int licznik = 0;

    public static void main(String[] args) {
        int ilosc = 0;
        Mix4[] m4a = new Mix4[20];
        int x = 0;

        System.out.println(m4a[0]);
        // Do tego miejsca wszsytko kapuje.
        // Mam tablicę typów Mix4 o nazwie m4a z 20 elementami
        // wartoś eleemntów to "null"

        while (x < 9) {
        // jeśli usunę pętle while program przestaje działać
        // Błąd: NullPointerException
        // czyli wywołanie metody na wartości "null"
        // ale .licznik to nie metoda
        // i jak while zostanie to program działa
            m4a[x] = new Mix4();
            m4a[x].licznik = m4a[x].licznik;
            x++;
        }
        System.out.println("z .licznik = " + m4a[1].licznik);
        // wydruk to wartość 0 - w ogóle nie wiem czemu
        System.out.println("bez .licznik = " + m4a[1]);
        // wydruk to Mix4@14ae5a5 - co to za dziwna wartość?
            }
}

dodatkowo stworzyłem coś prostego, ale to już w ogóle nie działa:
title

reasumując... w ogóle nie potrafię rozgryźć zapisu .licznik jako "niemetody".

z góry THX za wyjaśnienia.

0

Co Ty pleciesz? Zapis zapis.licznik nigdy nie jest wywołaniem metody na obiekcie.

       System.out.println("z .licznik = " + m4a[1].licznik);
       // wydruk to wartość 0 - w ogóle nie wiem czemu

Zadeklarowałeś

int licznik = 0;

nigdzie nie zmieniłeś wartości pola licznik i dziwisz się, że to pole ma wartość zero?

        System.out.println("bez .licznik = " + m4a[1]);
        // wydruk to Mix4@14ae5a5 - co to za dziwna wartość?
//zapis
System.out.println("bez .licznik = " + m4a[1]);
//jest równoważny z
System.out.println("bez .licznik = " + m4a[1].toString());

Ponieważ nie napisałeś w klasie Mix4 własnej metody toString, to została użyta metoda z klasy bazowej Object. A ta metoda wypisuje: typObiektu + @ + referencja.

0

class Mix4{
      int licznik = 0;

      void zwiekszLicznik() {
            licznik++;
      }
}

Załóżmy że mamy zmienną mix4:

Mix4 mix4 = new Mix4;


// zmiana wartosci zmiennej składowej (bezpośrednio):
mix4.licznik = 3;

// wywolanie funkcji zwiekszajaca zmienna licznik
mix4.zwiekszLicznik();

W swoim przykładzie (ze screena) próbowałeś odwołać się zmiennej licznik na elemencie tablicy intów.
Nie zadziałało Ci to, bo zmienna typu int, to tylko liczba, nie ma zmiennych składowych.

0

coś zaczyna mi świtać :)

po pierwsze: wywoływanie metody ma postać .licznik(); w moim .licznik nie ma ().
w dalszej rozkminie, mam kod:

class Pies {
    
    void szczekaj(int iloscSzczekniec) {
        while (iloscSzczekniec > 0) {
            System.out.println("Hau Hau");
            iloscSzczekniec--;
        }
    }

    public static void main(String[] args) {
	Pies burek = new Pies();
        burek.szczekaj(5);
    }
}

** iloscSzczekniec** to zmienna składowa metody szczekaj, tak??

"dziwa wartość" jest już prawie dla mnie jasna. rozumiem że zachodzi dziedziczenie z klasy [CIACH!], ale dlaczego drukuje się ta wartość a nie "null" tak jak w pierwszej komendzie println??

0

Przerób sobie tę książkę i Wskoczysz na wyższy level javy, bo tak mozna się motać w prostych rzeczach w nieskończoność.

1 użytkowników online, w tym zalogowanych: 0, gości: 1