POWRÓT NA STRONĘ SZKOŁY

Tablice indeksowane numerycznie

Wykonamy kilka skryptów, w których zademonstrujemy operacje na tablicach indeksowanych numerycznie.

Ćwiczenie 2_4_0_1. Znajdowanie wartości maksymalnej w tablicy liczb - przykład 1

Należy znaleźć wartość maksymalną w tablicy generowanej za pomocą funkcji liczby() utworzonej podczas poprzednich zajęć. Zastosuj kod PHP:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  $max=$liczby[0];
  if (count($liczby)==1) echo 'Największą liczbą jest '.$max;
  else
  {
    echo 'Największą liczbą spośród liczb: '.$max.', ';
    for ($i=1;$i<count($liczby);$i++) 
    {
      echo $liczby[$i];
      if ($i<count($liczby)-1) echo ', ';
      if ($liczby[$i]>$max) $max=$liczby[$i]; 
    }
    echo ' jest liczba '.$max;
  }
?>

Zasada działania jest prosta. Zakładamy, że że pierwszy elemeny tablicy jest największy. Następnie, w każdym obiegu pętli, porównujemy aktualnie największą wartość z kolejnym, następnym elementem tablicy - jeżeli ten element jest większy od aktualnie największej wartości, to przypisujemy ten element zmiennej przechowującej wartość maksymalną.

Ćwiczenie 2_4_0_2. Znajdowanie wartości maksymalnej w tablicy liczb - przykład 2

Zadanie jak poprzednie, tylko tym razem zastosujemy inną metodę. Będziemy działać następująco:

  1. Porównamy dwa pierwsze elementy tablicy - jeżeli drugi element jest większy od pierwszego lub jemu równy, to nic nie robimy, natomiast jeżeli jest mniejszy, to przestawiamy elementy pierwszy z drugim. W wyniku tej operacji drugi element jest większy (lub równy).
  2. Porównujemy drugi element z trzecim i ewentualnie przestawiamy je, tak jak w punkcie 1. W wyniku tej operacji trzeci element ma największą wartość spośród elementów od pierwszego do trzeciego (jeżeli wszystkie elementy mają tę samą wartość, to jest to jednocześnie wartość największa).
  3. Porównania i przestawienia opisane w punktach 1 i 2 wykonujemy w pętli. Ostatnią, braną pod uwagę parą, będą elementy przedostatni i ostatni.

Zauważ, że w wyniku opisanych wyżej operacji, wartość maksymalna przesuwała się w kierunku ostatniego elementu tablicy, po zakończeniu pętli ostatni element tablicy ma wartość maksymalną. Można to prównać do bąbelka powietrza, który wypływa na powierzchnię wody. Spokojnie, w tej chwili nie mam jakiegoś poetyckiego natchnienia. Ten sposób znajdowania wartości maksymalnej jest podstawą tzw. sortowania bąbelkowego (ang. bubble sort). Zajmujemy się tym, ponieważ zagadnienie to należy do kanonu programowania.

Najpierw uzupełnijmy plik moje_funkcje.php o definicje następujących funkcji:

function zamiana(&$a, &$b)
{
  if ($a==$b) return;
  $tmp=$a;
  $a=$b;
  $b=$tmp;
}

Ta funkcja zamienia między sobą wartościami, dwie zmienne. Zwróć uwagę na obecność ampersandów przy argumentach, ponieważ mamy przekazywanie przez referencję. Zmienna tymczasowa $tmp jest zainicjowana po to, aby przechować wartość zmiennej $a, której jest przypisywana wartość zmiennej $b.

function zamien($max, &$a, &$b)
{
  if ($max && $a>$b) zamiana($a,$b);
  else if (!$max && $a<$b) zamiana($a,$b);
}

Ta funkcja korzysta z funkcji poprzedniej aby zamienić wartościami dwie zmienne, ale tylko wtedy gdy:

  1. $max===true - tzn. chcemy aby druga zmienna była większa od pierwszej lub jej równa;
  2. pierwsza wartość jest większa od drugiej.

Argument typu logicznego $max, wprowadzono po to, aby tę funkcję można było stosować zarówno do znajdowania wartości największej jak i do znajdowania wartości najmniejszej.

Kod PHP realizujacy nasze zadanie jest następujący:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  if (count($liczby)>1) 
  {
    echo 'Największą liczbą spośród liczb: ';
    for ($i=0;$i<count($liczby);$i++)
    {
      echo $liczby[$i];
      if ($i<count($liczby)-1) echo ', ';
    }
    for ($i=0;$i<count($liczby)-1;$i++) 
    zamien(true,$liczby[$i], $liczby[$i+1]);
    echo ' jest liczba '.$liczby[count($liczby)-1];
  }
  else echo 'Tablica ma jeden element o wartości '.$liczby[0]; 
?>

Ćwiczenie 2_4_0_3. Sortowanie bąbelkowe (bubble sort)

PHP dysponuje całym arsenałem funkcji operujących na tablicach. O sortowanie tablic też nie musimy się martwić. W dalszym toku nauki będziemy testować funkcje wbudowane służące do pracy z tablicami. Nie zwalnia to nas jednak od znajomości podstawowych algorytmów oraz umiejętności pracy z tablicami. W tym ćwiczeniu poznamy działanie klasycznego algorytmu sortowania. Wykorzystamy funkcję liczby() oraz zamien(), stosowane w poprzednich ćwiczeniach. Dla większej przejrzystości, zdefiniowano funkcję pokaz_tablice_num() wyświetlającą kolejne elementy tablicy indeksowanej numerycznie (od zera). Umieść tę definicje w pliku zewnętrznym.

function pokaz_tablice_num($tekst, $tablica)
{
  echo $tekst;
  for ($i=0;$i<count($tablica);$i++)
  {
    echo $tablica[$i];
    if ($i<count($tablica)-1) echo ', ';
  }
}

Skrypt sortujący wygląda następująco:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  if (count($liczby)>1) 
  {
    pokaz_tablice_num('Elementy niesortowane: ', $liczby);
    
    for ($i=count($liczby)-1;$i>0;$i--) 
    for ($j=0;$j<$i;$j++) 
    zamien(true,$liczby[$j], $liczby[$j+1]);

    pokaz_tablice_num('<br />Elementy posortowane rosnąco: ', $liczby);
  }
  else echo 'Tablica ma jeden element o wartości '.$liczby[0]; 
?>

Pętla wewnętrzna wykonuje dokładnie to, co w poprzednim ćwiczeniu - przesuwa największy element na koniec tablicy. Pytanie: gdzie jest ten koniec? Na początku będzie to ostatni element tablicy, potem przedostatni i tak dalej aż do drugiego elementu (o indeksie 1, ponieważ numerujemy od zera). Indeks ostatniego elementu jest licznikiem $i pętli zewnętrznej.

Ćwiczenie 2_4_0_4. Zamiana kolejności elementów tablicy

Teraz, dla relaksu, wykonamy proste zadanie. Zamienimy kolejność elementów tablicy. Kod PHP wykonujący to zadanie:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  pokaz_tablice_num('Elementy tablicy: ', $liczby);
  for ($i=count($liczby)-1;$i>=0;$i--) 
  $liczby_przestawione[]=$liczby[$i];
  pokaz_tablice_num('<br />Przestawione elementy tablicy: ', $liczby_przestawione);
?>

Tablicę $liczby czytamy od ostatniego elementu do pierwszego, tworząc jednocześnie tablicę $liczby_przestawione. Tablica $liczby jest indeksowana od zera, więc indeks ostatniego elementu będzie o 1 mniejszy od liczby elementów tej tablicy.

Ćwiczenie 2_4_0_5. Zamiana wartości elementów tablicy

Tak jak w poprzednich ćwiczeniach, należy wygenerować tablicę $liczby, a następnie zamienić wszystkie liczby nieparzyste na kolejne parzyste. Wyświetlić informację o liczbie dokonanych zamian. Kod PHP wykonujący to zadanie:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  $ile_zamian=0;
  pokaz_tablice_num('Elementy tablicy: ', $liczby);
  foreach ($liczby as $index=>$liczba) if ($liczba%2===1) 
  {
    $liczby[$index]+=1;
    $ile_zamian++;
  }
  pokaz_tablice_num('<br />Elementy tablicy: ', $liczby);
  echo '<br />Liczba elementów zmienionych: '.$ile_zamian;
?>

Jak zbadać czy liczba jest nieparzysta? Reszta z dzielenia przez 2 liczby nieparzystej wynosi 1.

Ćwiczenie 2_4_0_6. Usuwanie elementów tablicy spełniających dany warunek

Tak jak w poprzednich ćwiczeniach, należy wygenerować tablicę $liczby, a następnie usunąć z tej tablicy wszystkie liczby nieparzyste. Wyświetlić informację o liczbie elementów parzystych. Kod PHP wykonujący to zadanie:

<?php
  require_once('../moje_funkcje.php');
  $liczby=liczby();
  pokaz_tablice_num('Elementy tablicy: ', $liczby);
  $tmp=$liczby;
  $liczby=array();
  $ile_parzystych=0;
  foreach ($tmp as $liczba) if ($liczba%2===0) 
  {
    $liczby[]=$liczba;
    $ile_parzystych++;
  }
  pokaz_tablice_num('<br />Elementy parzyste: ', $liczby);
  echo '<br />Liczba elementów parzystych: '.$ile_parzystych;
?>

Tym razem sprawdzamy, czy dana liczba jest parzysta. $tmp jest tablicą pomocniczą, której przypisujemy tablicę $liczby. Instrukcja $liczby=array(); zeruje tablicę $liczby, po wykonaniu tej instrukcji tablica $liczby nie posiada elementów.


Jeżeli zapomniałeś jak przygotować i gdzie zapisywać pliki testowe: