tablice dwuwymiarowe - Jak znaleźć największą i najmniejszą liczbę w tablicy dwuwymiarowej?

tablice dwuwymiarowe - Jak znaleźć największą i najmniejszą liczbę w tablicy dwuwymiarowej?
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Część
mam za zadanie zrobić:
zadeklaruj macierz o wymiarach 5x8, wypelnij ja liczbami losowymi z zakresu 10-90, znajdz najwieksza i najmniejsza wartosc oraz srednia arytmetyczna sprawdz czy wiecej jest liczb mniejszych od 50 czy wiekszych badz rownych 50.

mój kod na ten moment wyglada następująco:

Kopiuj
int[][] macierz6 = new int[5][8];
Random rand = new Random();
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
int aryt = 0;
int wiecej = 0;
int mniej = 0;

for (int i = 0; i < macierz6.length; i++) {
    for (int j = 0; j < macierz6[i].length; j++) {
        macierz6[i][j] = rand.nextInt(10, 90);
        System.out.print(macierz6[i][j] + " ");
        aryt += ((macierz6[i][j]) / (5 * 8));
    }
    System.out.println();
    for (int[] numbers : macierz6) {
        for (int number : numbers) {
            if (number < max) {
                max = number;
            }
            if (number > min) {
                min = number;
            }
        }
    }
    for (int[] liczby : macierz6) {
        for (int liczba : liczby) {
            if (liczba >= 50) {
                wiecej++;
            }
            if (liczba < 50) {
                mniej++;
            }
        }
    }
}
System.out.println("arytmetyczna: " + aryt);
System.out.println("najmniejsza liczba: " + max);
System.out.println("najwieksza liczba: " + min);
System.out.println("wiecej niz 50: " + wiecej);
System.out.println("mniej niz 50: " + mniej);

w konsoli dostaje taka informacje zwrotna:

Kopiuj
78 65 87 78 67 37 16 55 
44 61 75 76 85 35 67 83 
56 76 18 19 80 69 84 48 
21 44 38 81 72 44 74 19 
12 48 26 22 31 72 87 53 
arytmetyczna: 35
najmniejsza liczba: 0
najwieksza liczba: 87
wiecej niz 50: 78
mniej niz 50: 122

i problem mam z:
najmniejsza liczba
liczba powyżej 50 i poniżej 50

będę wdzięczny za podpowiedź :)

dalbajob
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 149
2

Pomyliłeś min z max. Pętle do liczenia "wiecej" i "mniej", które przechodzą po całej macierzy, umieściłeś w środku pętli for (int i = 0; i < macierz6.length; i++) i dlatego dostajesz za duży wynik.

Gorąco sugeruję, abyś nauczył się uważnie analizować swój kod i go debugować, tj. sprawdzać czy dany kawałek kodu robi to, co powinien, np. dodając println do wypisywania wartości zmiennych. Bo no offense, ale ten babol z min i max nawet widać na goły rzut oka :)

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6824
2

Po pierwsze podziel kod na metody. Rozdziel tworzenie tablicy od operowania na niej. Obecnie twoje obliczenia robią dokładnie nie to co oczekujesz:

Kopiuj
for (int i = 0; i < macierz6.length; i++) {
    for (int j = 0; j < macierz6[i].length; j++) {
        macierz6[i][j] = rand.nextInt(10, 90);
        System.out.print(macierz6[i][j] + " ");
        aryt += ((macierz6[i][j]) / (5 * 8));
    }
//…
}

Dla każdego rzędu w macierzy wyznaczasz losowy element, a następnie oddajesz do aryt wartość tego elementu podzieloną przez 40. Dwie rzeczy bez sensu:

  • użycie mnożenia, które wykorzystuje STAŁE, pomimo że używasz macierz6.length i macierz6[i].length. W dodatku przy tworzeniu samej macierzy też wykorzystujesz te liczby. Wywal to do stałych na poziomie klasy.
  • średnią arytmetyczną liczy się w inny sposób. Suma wszystkich elementów przez ich ilość.

Ten kod też jest funkcjonalnie zły, bo wyliczasz ilość większych i mniejszych za każdym razem, gdy wchodzisz do nowego rzędu. Zwróć uwagę, gdzie kończy się pętla po i.

Po drugie, czy musisz zrobić te wszystkie obliczenia w jednym przebiegu? Jeżeli tak, to, jak masz już wygenerowaną macierz, możesz spróbować pokombinować z zagnieżdżoną pętlą. Jeżeli nie masz takiego ograniczenia, to zawsze możesz transformować macierz do formy jednowymiarowej, zamienić na strumień (IntStream) i obliczyć odpowiednie wartości za pomocą metod ze strumienia.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2398
2

Tak poza tym, deklarujesz:

Kopiuj
int aryt = 0;

Jaka jest średnia arytmetyczna liczb: 11 i 12 ?

Co otrzymasz?

Kopiuj
aryt = (11+12)/2;
System.out.println(aryt);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.