13. Vilken är störst?

Att arbeta med stor mängd  siffror som lagras i  arrayer är vanligt inom programmering.  I p5.js finns funktioner som underlättar för kontroll av värden i en array.
max()  returnerar det största värdet i en array
min()   returnerar det minsta värdet i en array

Skriv följande program i editorn och se resultatet i konsolen

let nums = [2,6,1,9,2000,7,3,8,0,-82];
function setup() {
console.log(max(nums));
console.log(min(nums));
}

För att räkna ut summan av alla värden i en array kan en for-loop användas. En variabel behövs för att hålla värdet för totala summan. Variabelns värde sätts initialt till 0.

let nums = [2,6,1,9,2000,7,3,8,0,-82];
let total = 0; 
function setup() {
 for(let i = 0; i < nums.length; i++){
    total += nums[i];
 }
 console.log(total);
}

 Använd koden och lägg till kod för att beräkna medelvärdet av alla tal i arrayen.
Medelvärde = summan av alla värden delat på antal värden.
Tips: 
Skapa en variabel för medelvärdet . Antal värden i arrayen får du  av nums.length

Sortera en array

När man ska sortera en array med siffror kan man inte använda sort() direkt utan ett tillägg. Funktionen sort() behandlar all data som text och sorterar i alfabetisk ordning. Med siffror så tittar den bara på första siffran och sorterar efter den. Om du har en array med tal som består av flersiffriga tal så sorterar den efter den första och ”25” blir då större än ”100”.

För att sortera används en jämförelsefunktion tillsammans med sort()

nums.sort(function(a,  b)
{
return a - b
});

Funktionen jämför talen i arrayen (två element åt gången) och ger det första talet namnet a och det andra talet namnet b.
Sen subtraheras b från a. Om resultatet är ett positivt tal kommer talen att skifta plats i arrayen. Om resultatet är ett negativt tal,  eller noll, kommer talen att stå kvar på sin plats.

EX.
[ 4, 2, 1, 3 ]       a = 4     b = 2      a  –  b = 2  (positivt tal) alltså byter talen plats
[ 2, 4, 1, 3 ]       a = 4     b  = 1     a  –  b  = 3  (positivt tal) alltså byter talen plats
[ 2, 1, 4, 3 ]       a = 4     b  = 3     a  –  b  = 1   (positivt tal) alltså byter talen plats
[ 2, 1, 3, 4 ]       a = 2     b =  1      a  –  b  = 1   (positivt tal) alltså byter talen plats
[ 1, 2, 3, ]       a = 2     b = 3      a  –  b  = -3 ( negativt tal) talen står kvar
[ 1, 2, 3, ]       a = 1     b = 2       a  –  b =  -1   ( negativt tal) talen står kvar
[ 1, 2, 3, Arrayen är sorterad

Den array som sorteras ändras och om man vill ha kvar en osorterad kopia av arrayen måste man skapa den själv först. Det görs med funktionen slice().
Funktionen slice() används för att skapa en ny array av delar av en array. Som argument anges från vilket index element ska tas och fram till vilket index (inte inkluderat).  Exempel från sorterade arrayen ovan:
slice(1, 3)   kommer att skapa en ny array  bestående av elementen [ 2, 3 ]

Om man som argument i slice() bara skriver 0 så kommer hela arrayen att kopieras.

let nums = [3,5,2,1,4];
function setup() {
   let clone = nums.slice(0);// skapar en kopia av array nums med namnet clone
   nums.sort(function(a, b) {
       return a - b;
   });
   console.log(nums);
   console.log(clone);
}

För att sortera en array i omvänd ordning ( det största talet först ) används en liknande funktion men med skillnaden att man tar b – a istället.

array.sort(function(a, b)
{
 return b-a
});

Nu när arrayen är sorterad kan medianen beräknas. Medianen får vi genom att vi sorterar värdena i storleksordning och väljer ut det mittersta värdet. om arrayen består av ett jämnt antal element beräknas medianen som medelvärdet av de två element som ligger närmast mitten.

Först tar vi reda på om arrayen har ett jämnt eller ojämnt antal element.
Om man subtraherar 2  från ett jämnt tal med  tillräckligt många gånger kommer det till slut att bli noll. Det finns en bra operator för att räkna ut det som heter modulo och betecknas i programmering.
EX
25 % 2 =  1    (ojämnt tal)
30 % 2 = 0   (jämnt tal)

Så för att kunna räkna ut medianen så måste vi ha  olika kod för om arrayen har jämnt eller ojämnt antal element. Här kan vi använda if och else 

För ett öjämnt antal element så är det talet i mitten av arrayen som är medianen. Det talet kan vi få genom att ta fram dess index. om man använder arrayens längd -1 och delar den på 2 så får man index för mellersta talet.

EX
let nums = [ 1, 2, 3, 4, 5 ];
index              0  1   2   3  4
nums.length = 5   eftersom index börjar på 0 måste vi dra av 1 frän längden   vi får då 4 kvar 4 delat på 2 är 2. Index 2 är alltså medianen

if(nums.length % 2 == 1){ //ojämnt antal element
  median = nums[(nums.length - 1) / 2];
}

Om det är ett jämnt antal element så måste vi komma åt de två mellersta elementen och addera dem och sen dela summan med 2.

Första elementet fås genom att ta arrayens längd, dela den på 2 och sen dra ifrån 1

EX
let nums = [ 1, 2, 3, 4, 5, 6 ];
index              0  1   2   3  4  5
nums.length = 6   delat på 2 är 3. För att komma åt index 2 så subtraherar vi 1

nums[nums.length / 2 - 1]

Andra elementet fås genom att ta arrayens längd delat på 2

EX
let nums = [ 1, 2, 3, 4, 5, 6 ];
index              0  1   2   3  4  5
nums.length = 6   delat på 2 är 3.

nums[nums.length / 2 ]

Hela koden för att sortera en array och beräkna median

let nums = [3,2,1,4,5,6];
let median= 0;
function setup() {
let clone = nums.slice(0);// skapar en kopia av array nums med namnet clone

nums.sort(function(a, b) {
return a - b;
});
if(nums.length % 2 == 1){
median = nums[(nums.length - 1) / 2];
}else{
median = (nums[nums.length / 2 - 1] + nums[nums.length / 2 ]) / 2;
}
console.log(nums);
console.log(median);
}

 Skriv koden själv och testa att ändra antal element i arrayen för att se att det fungerar både med jämnt och ojämnt antal element.