Dziwne zachowanie tablicy gdy wartość jednego elementu jest mniejsza od 0

0

Witam,
zauważyłem dziwne zachowanie tablicy którego całkowicie nie rozumiem. Przykład wygląda następująco:

public class Klasa {
public static void main(String[] args){

    int[] tab = new int[10];
    StdOut.println("Elementy tablicy:  ");
    for (int i=0;i<tab.length;i++){
        tab[i] = i*2;
        StdOut.print(tab[i] + " ");
    }

  // tab[0] = 3;
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;
    for (int j=0;j<tab.length;j++){
        if         (tab[j] > max) max = tab[j];
        else if (tab[j] < min) min = tab[j];
    }

    StdOut.println();
    StdOut.println("Min = " + min) ;
    StdOut.println("Max = " + max);
}

}

  • pierwszym dziwnym zachowaniem jest fakt gdy tab[0] ma wartość 0 lub mniejsza program nie potrafi wyliczyć wartości minimalnej.
  • drugim jeszcze dziwniejszym jest to że pierwszy element tablicy w ogóle nie może być wartością minimalną(nawet gdy ta wartość jest dodatnia!).
0
 if         (tab[j] > max) max = tab[j];
        else if (tab[j] < min) min = tab[j];

Co jeżeli element jest jednocześnie aktualnym max i min?

0
Afish napisał(a):
 if         (tab[j] > max) max = tab[j];
        else if (tab[j] < min) min = tab[j];

Co jeżeli element jest jednocześnie aktualnym max i min?

Jeżeli w tablicy jest więcej niż jeden element to min i max będzie takie same a jeżeli element jest tylko jeden to wracam do drugiego problemu :/

1

Odpal to sobie pod debuggerem i prześledź wykonanie krok po kroku. Alternatywnie możesz też użyć "println debugging", czyli np w ifach przed przypisaniem wypisać wartości na konsolę.

0
Skwierczaty napisał(a):

Jeżeli w tablicy jest więcej niż jeden element to min i max będzie takie same a jeżeli element jest tylko jeden to wracam do drugiego problemu :/

Napiszę bardziej łopatologicznie: jeżeli element jest jednocześnie min i max, to które gałęzie ifów powinny się wykonać?

1

Tutaj poprawna wersja: https://programuj.pl/snippet/a510d43a-d41a-442b-9e6e-3cb0b76e9ac5
Błąd polegał na tym, że miałeś sprawdzanie minimum w else sprawdzania maksimum, a co za tym idzie - jeśli dana liczba była nowym maksimum to program już nie sprawdzał czy nie jest ona przypadkiem tez minimum. U Ciebie liczby są rosnąco więc każda kolejna jest nowym maksimum - żadna liczba nie została sprawdzona jako minimum. W miarę jasne czy dokładniej Ci opisać?

Uwagi:

  1. Używanie tego StdOut jest raczej złą praktyką, przyzwyczajaj się do standardowego System.out
  2. Zawsze dodawaj klamry ({}) do ifów i elseów
0

Dziękuję za pomoc, problem został rozwiązany. Na jednym z wątków o javie było wspomniane żeby uważać na tablice i nie szukać w niej logiki stąd tyle wątpliwości z mojej strony. Jeszcze mam pytanie o Std, co w nim jest nie tak? Autor książki (Programowanie w języku java, wydanie II) napiera żeby korzystać tylko z tego.

4

Na jednym z wątków o javie było wspomniane żeby uważać na tablice i nie szukać w niej logiki stąd tyle wątpliwości z mojej strony.

Błąd był w twoim kodzie, a nie w tablicach. Tablice nie strzelają focha, ani nie zachowują się niedeterministycznie. Nie powinieneś o nich mieć jakichś dziwacznych przekonań. Zwłaszcza iż tablice w Javce są bezpieczne - przez to, że referencje i indeksy tablic są zawsze sprawdzane od razu poleci exception przy buffer overflow/ buffer underflow/ dereferencji nulla/ itd

Jeszcze mam pytanie o Std, co w nim jest nie tak? Autor książki (Programowanie w języku java, wydanie II) napiera żeby korzystać tylko z tego.

Z StdOut jest ten sam problem co z każdą egzotyczną klasą - uczysz się jej wykorzystania, a potem ci się to nie przyda. Sprawdziłem jak wygląda ten StdOut - nie deleguje 1:1 do System.out, więc możesz nabrać błędnych przekonań o działaniu System.out jeśli założysz, że działa tak samo jak StdOut.

Jeśli w danej klasie często korzystasz z System.out to możesz skrócić sobie kod robiąc import static java.lang.System.out, np: https://www.ideone.com/5bSMAt

import static java.lang.System.out;
 
public class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
		out.println("Hello, world without System. before out.println");
	}
}
0

Dzięki jeszcze raz za pomoc. Teraz już w spokoju mogę zamknąć temat :)

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