Languages

Java - metoda nie dodaje poprawnie liczb, pomoc potrzebna

5 points
Asked by:
Marcin
2478

Zosta┼éem poproszony o rozwi─ůznie problemu. Jak naj┼éatiwej wyja┼Ťni─ç ten problem?┬áProblem opisze poni┼╝ej.

Potrzebuje pomocy przy sumowaniu tablicy int├│w, mam kod:

public class SumowanieTablicy {

    public static void main(String[] args) {

        int suma = 0;
        int[] stanKonta = {10, 20, 30};
        System.out.println(suma); // 0
        sumownie(suma, stanKonta);
        System.out.println(suma); // 0
    }

    static void sumownie(int suma, int[] stanKonta) {
        for (int i = 0; i < stanKonta.length; i++) {
            suma += stanKonta[i];
        }
    }
}

Wynik:

0
0

 

1 answers
8 points
Answered by:
Marcin
2478

Naprawa tego problemu polega na tym, ┼╝e maj─ůc sum─Ö typu int, nie powinni┼Ťmy jej przekazywa─ç do metody jako parametr, tylko sum─Ö definowa─ç w metodzie i zwraca─ç z return.

public class SumowanieTablicyFix {

    public static void main(String[] args) {

        int[] stanKonta = {10, 20, 30};

        int suma = sumownie(stanKonta);
        System.out.println(suma); // 60
    }

    static int sumownie(int[] stanKonta) {
        int suma = 0;
        for (int i = 0; i < stanKonta.length; i++) {
            suma += stanKonta[i];
        }
        return suma;
    }
}

Wynik:

60

Wyja┼Ťnienie - warto┼Ť─ç vs referencja

Ca┼éy b┼é─ůd w kodzie wynika z tego, ┼╝e w javie typy proste przekazywane s─ů poprzez warto┼Ťci a obiekty i tablice przez referencje. Bardzo cz─Östo na pocz─ůtku jest z tym do┼Ť─ç du┼╝o problem├│w, tzn ze zrozumieniem tego, jak to do ko┼äca dzia┼éa. Polecam bawi─ç si─Ö przyk┼éadami i zrozumie─ç to na przyk┼éadach. Teorie tylko poczyta─ç, aby wspomaga─ç przyk┼éady.

Tutaj znalaz┼éem ciekawy gif obrazuj─ůcy r├│┼╝nic─Ö pomi─Ödzy przekazywaniem argument├│w do metody┬áprzez warto┼Ť─ç a przekazywaniem przez referencje.

https://twitter.com/codingninja4/status/1300942494637723648

Na tym gifie widzimy kubek kawy i co si─Ö z nim dzieje kiedy przekazujemy go do metody. Kiedy kubek kawy przekazwywany jest przez 'value' - warto┼Ť─ç, to dzia┼éamy na kopi. Czyli przekazujemy naszej metodzie zmienn─ů suma z warto┼Ťci─ů 0, w metodzie zmieniamy t─ů warto┼Ť─ç na 5 i z metody nie zwracamy nic (metoda nie ma return, ma void-a). Wtedy po wyj┼Ťciu z metody, spowrotem do funkcji main, nasza zamienna b─Ödzie wynosi┼éa 0. Tutaj w┼éa┼Ťnie trzeba u┼╝ywa─ç return i przypisa─ç w main nasz─ů zmienn─ů do int-a.

Przykład:

public class PrzekazywanieInta {

    public static void main(String[] args) {

        int liczba = 2;
        System.out.println("Krok A: " + liczba); // 2

        tenIntSieNieZmieni(liczba);

        // i tutaj nasza zmienna się nie zmieniała na 5, tylko wynosi nadal 2
        // poniewa┼╝ typy proste int, double, boolean tak dzia┼éaj─ů w javie
        System.out.println("Krok D: " + liczba); // 2
    }

    static void tenIntSieNieZmieni(int liczba) {
        System.out.println("Krok B: " + liczba); // 2
        liczba = 5;

        // tylko przez chwile w tej metodzie nasza liczba wynosi 5
        // obiecuje, ┼╝e nabierze to sensu z czasem
        System.out.println("Krok C: " + liczba); // 5
    }
}

Wynik:

Krok A: 2
Krok B: 2
Krok C: 5
Krok D: 2

W komentarzach postara┼éem si─Ö to wyja┼Ťni─ç maksylanie prosto dla pocz─ůtkuj─ůcego programisty.

A teraz przykład, który ma metodę z return i nasza zmienna się zmieni.

public class PrzekazywanieIntaNaprawione {

    public static void main(String[] args) {

        int liczba = 2;
        System.out.println("Krok A: " + liczba); // 2

        liczba = tenIntSieNieZmieni(liczba);

        System.out.println("Krok D: " + liczba); // 5
    }

    static int tenIntSieNieZmieni(int liczba) {
        System.out.println("Krok B: " + liczba); // 2
        liczba = 5;

        System.out.println("Krok C: " + liczba); // 5

        return liczba;
    }
}

Wynik:

Krok A: 2
Krok B: 2
Krok C: 5
Krok D: 5

Ten przyk┼éad mo┼╝e mie─ç zastosowanie, gdy np przekazujemy do metody int-a i mamy jakie┼Ť warunki np je┼Ťli liczba jest r├│wna 2 to zmie┼ä j─ů na 5, a je┼Ťli nie to nic nie r├│b. I je┼Ťli nie u┼╝yjemy return i nie przypiszemy tej liczy w main, to nasza liczba niestety si─Ö nie zmieni.

Warto po─çwiczy─ç to na przyk┼éadach bardzo ma┼éych z 1 zmienn─ů. I zrobi─ç ich z 20 sztuk. Plus da─ç sobie czas na oswojenie z tym. Czasem programi┼Ťci z rocznym do┼Ťwiadczeniem pope┼éniaj─ů takie b┼é─Ödy.

Je┼Ťli b─Öd─ů jakie kolwiek problemy ze zrozumieniem, dodaj pytanie z przyk┼éadowym kodem, bardzo ch─Ötnie pomog─Ö┬á👍.

0 comments Add comment
Hey ­čĹő
Would you like to know what we do?
  • Dirask is a friendly IT community for learners, professionals and hobbyists to share their knowledge and help each other in extraordinary easy way.
  • We welcome everyone,
    no matter what the experience,
    no matter how basic the question is,
    this community will help you.