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

Odpowiedz Nowy wątek
2019-04-27 23:55
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!).
edytowany 1x, ostatnio: Skwierczaty, 2019-04-27 23:56

Pozostało 580 znaków

2019-04-28 00:23
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?

Pozostało 580 znaków

2019-04-28 01:02
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 :/

Pozostało 580 znaków

2019-04-28 01:13
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ę.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2019-04-28 01:29
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ć?

edytowany 1x, ostatnio: Afish, 2019-04-28 01:29

Pozostało 580 znaków

2019-04-28 09:12
1

Tutaj poprawna wersja: https://programuj.pl/snippet/[...]a-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

edytowany 1x, ostatnio: jwrabel, 2019-04-28 09:14

Pozostało 580 znaków

2019-04-28 10:55
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.

Pozostało 580 znaków

2019-04-28 11:03

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");
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2019-04-28 11:03

Pozostało 580 znaków

2019-04-28 11:27
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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