• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JS Największa liczba z tablicy

VPS Starter Arubacloud
0 głosów
9,888 wizyt
pytanie zadane 26 marca 2018 w JavaScript przez TerryCrow Początkujący (340 p.)
edycja 26 marca 2018 przez TerryCrow

Witajcie ponownie, ostatnio mam dużo pytań ale jesteście na prawdę bardzo pomocni i dzięki temu zaczynam coraz więcej rozumieć. Tym razem mam pytanie które nurtuje mnie gdy chcę na "chłopski rozum" pojąć taki kod:

var max = 0;
var tablica = [1,2,3,4,5,6,7,8,9,10];

for (var i=0; i < tablica.length; i++) {
    if (max <= tablica[i]) {
        max = tablica[i];
    }
}
console.log("Najwieksza liczba z tablicy to:", max);

Kod ten który wypisuje w konsoli największą liczbę z tablicy. Kod działa poprawnie ale analizując go krok po kroku nie mogę zaskoczyć dlaczego jest tu ten warunek if (max <= tablica[i]). Na samym początku jest zadeklarowana wartość zmiennej max na 0 a więc jak to działa? Czytając na mój rozum wychodzi mi tak: "jeśli max (który w tym wypadku wynosi 0 jest mniejszy bądź równy tablica[i]  (któraś liczba z tablicy) to ma wykonać się funkcja, która przypisuje jakąś liczbę do max. I nagle wyskakuje że zmienna max przechowuje największą liczbę... masakra pewnie strasznie namieszałem ale albo ja jestem jakiś ciemny albo całkiem źle na to patrzę. Czy ktoś byłby uprzejmy jakoś to wytłumaczyć? i może opisać to w takim języku naturalnym co tu zachodzi w tym kodzie? Nie rozumiem po prostu jakim sposobem w zmiennej max gdzie z początku było zero znajduje się największa liczba z tej tablicy.

2 odpowiedzi

0 głosów
odpowiedź 26 marca 2018 przez BT101 Stary wyjadacz (12,540 p.)
wybrane 26 marca 2018 przez TerryCrow
 
Najlepsza
To bardzo proste. Przy każdym obrocie pętli jest sprawdzane czy liczba jest większa lub równa zmiennej max jeżeli jest większa lub równa to przypisujemy jej nowa wartość.

Innymi słowy lecimy po każdej liczbie z tablicy, jeżeli liczba jest większa to przypisujemy do zmiennej max wartość.

Po wyjściu z pętli mamy do zmiennej max przypisaną największą wartość.
komentarz 26 marca 2018 przez TerryCrow Początkujący (340 p.)
Po takim wytłumaczeniu to faktycznie wydaje się proste :) Dzięki. Nie wiem dlaczego tak ciężko mi idzie zaczajenie tych pętli.
komentarz 26 marca 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Nie wiem dlaczego tak ciężko mi idzie zaczajenie tych pętli

Kartka, długopis i spróbuj rozpisywać każdą iterację. Serio, to na prawdę wiele Ci pomoże. Teraz posługuję się JS na co dzień, ale pamiętam swoje początki z programowania więc nie piszę tego "z powietrza" :)

komentarz 9 kwietnia 2018 przez TerryCrow Początkujący (340 p.)
Mam jeszcze jedno pytanie trochę związane z tym zadaniem więc nie chcę tworzyć kolejnego tematu. Wiem już jak otrzymać w konsoli wynik wypisujący największą liczbę z tej tablicy a gdybym chciał wyciągnąć ze zbioru nie największą ale np "drugą największą"? w tym przypadku nie 10 a 9? Mógłbyś jakoś nakierować?
komentarz 9 kwietnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

A to można podejść na wiele sposobów. Jednym z nich jest po prostu posortowanie elementów i pobranie przedostatniego.

const arr = [5,8,7,12,5,9,12];

const unique = [...new Set(arr)].sort((a,b) => a - b);

unique; //[5, 7, 8, 9, 12]

Rodzi się tylko parę pytań. Na przykład czy interesują Cię tylko unikalne wartości? Jeśli tak to można to łatwo osiągnąć przy użyciu obiektu Set().

Następnie sortuję od min do max.

Teraz już tylko dobranie się do przedostatniego elementu, oczywiście z odpowiednim zabezpieczeniem na wypadek pustej tablicy albo tablicy jednoelementowej itp.

komentarz 9 kwietnia 2018 przez TerryCrow Początkujący (340 p.)
Generalnie nie chodzi mi tu o przedostatni element tablicy tylko drugi największy. Np jeśli tablica składałaby się z elementów [1,8,3,6,9,2] gdzie największym elementem jest "9" to żeby w konsoli wypisał się wynik powiedzmy "drugim największym elementem z tej tablicy jest 8"
komentarz 9 kwietnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Na przykład coś takiego:

function fn(numbers) {
    if(
	    !Array.isArray(numbers) 
	    || !numbers.length 
	    || !numbers.every(n => typeof n === 'number')
    ) {
        throw Error('Błędna tablica!');
    }
    const nums = [...new Set(numbers)].sort((a,b) => a - b);
    return (nums.length > 2) ? nums[nums.length-2] : nums[0];
};

fn([5,8,7,12,5,9,12]); //9
fn([5,8,7,12,5,9]);    //9
fn([5,8,7]);           //7
fn([5,8]);             //5
fn([5]);               //5

fn([]);                // Error: Błędna tablica!
fn(['a', 'b', 'c']);   //Error: Błędna tablica!

To tak na szybko pisane, więc trzeba by jeszcze nad tym popracować i nadać jakąś sensowną nazwę, ale nie mam teraz głowy do tego więc sam sobie coś wymyśl w miejsce "fn" :)

 

komentarz 9 kwietnia 2018 przez TerryCrow Początkujący (340 p.)
Ok dzięki :) pogłówkuję
0 głosów
odpowiedź 26 marca 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Zobacz sobie dodając konsolę:

const tablica = [5,8,7,12,5,9,12];

for (var i=0; i < tablica.length; i++) {
	console.log(`max: ${max}, current: ${tablica[i]}`);
    if (max <= tablica[i]) {
        max = tablica[i];
    }
}

//Zrzut z konsoli:
max: 10, current: 5
max: 10, current: 8
max: 10, current: 7
max: 10, current: 12
max: 12, current: 5
max: 12, current: 9
max: 12, current: 12

a tak dla ciekawostki to samo w nieco krótszej formie:

const tablica = [5,8,7,12,5,9,12];

const max = Math.max(...tablica);

max; //12

Ale tutaj musiałbyś poznać już metody obiektu Math i tzw. operator spread więc to tak na przyszłosć :)

komentarz 26 marca 2018 przez TerryCrow Początkujący (340 p.)
Dzięki, jeszcze długa droga przede mną. Na razie chcę to wszystko zrozumieć zanim będę mógł dobrze używać. Jeszcze nie doszedłem do tych "$" (dolarów :) )
1
komentarz 26 marca 2018 przez Tomek Sochacki Ekspert (227,510 p.)

No to:

console.log('max: ' + max + ', current: ' + tablica[i]);

Małymi kroczkami i wszystko ogarniesz :) Jest trochę stronek do nauki JS np. codewars ale jeszcze trochę poucz się podstaw jak pętle itp. żeby nie zrazić się za szybko takimi stronami i zadaniami jakie tam są.

Podobne pytania

0 głosów
1 odpowiedź 2,513 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
2 odpowiedzi 2,338 wizyt
pytanie zadane 1 września 2017 w JavaScript przez Karol Loczeski Użytkownik (820 p.)
0 głosów
1 odpowiedź 6,051 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...