Dzisiaj umieszczam trzy dodatkowe zadania wraz z rozwiązaniami do części ćwiczeń kursu „Wstęp do programowania” poświęconej tablicom. Dwa z nich dotyczą tablic jednowymiarowych, trzecie tablicy dwuwymiarowej.
Zadania i rozwiązania
Zadanie 1 – odwracanie tablicy
Jest to klasyczny problem dotyczący tablic.
- Stwórz tablicę 10-elementową, wypełnioną liczbami.
- Odwróć kolejność liczb w tablicy.
- Wydrukuj zawartość tablicy.
Zanim przejdziesz do wskazówek, spróbuj sam rozwiązać zadanie.
Wskazówki
Ogólna idea odwracania zawartości tablicy test taka: ostatni element zamienia się miejscami z pierwszym, następnie przedostatni z drugim itd. aż dojdziemy do środka tablicy. Tu proces się zatrzymuje, gdybyśmy poszli dalej odwrócilibyśmy to co już odwrócone, a przecież nie o to chodzi.
Jednak w zamianie wartości tkwi pewien problem. Jeśli po prostu skopiowalibyśmy wartość z komórki ostatniej do pierwszej, to od razu stracilibyśmy wartość z komórki pierwszej. Uprzednio trzeba więc umieścić tą wartość w zmiennej tymczasowej, z której następnie ją pobierzemy aby umieścić w ostatniej komórce.
Zamiana więc będzie przebiegała w trzech krokach:
- Skopiowanie wartości z komórki pierwszej do zmiennej.
- Skopiowanie wartości z komórki ostatniej do pierwszej.
- Skopiowanie wartości ze zmiennej do komórki ostatniej.
Dla „wzrokowców” dodatkowo obrazek ilustrujący ten proces:
Później proces się powtarza dla komórki drugiej i przedostatniej itd…
Tu trafiamy na kolejny problem. Łatwo jest uzyskać indeks komórki pierwszej, drugiej, trzeciej itd., będzie to po prostu wartość i
z klasycznej pętli for
. Ale jak uzyskać indeksy kolejnych komórek od końca?
Magiczna formuła będzie wyglądała tak: tablica.length-1-i
. Zastanów się dlaczego. Szczegółowe wyjaśnienie w kodzie.
Kod
class OdwracanieTablicy { public static void main(String[] args) { int[] tablica = {1,2,3,4,5,6,7}; // zmienna "tymczasowa" która będzie tymczasowo przechowywać wartości int tmp; int l = tablica.length; System.out.print("Przed odwróceniem: "); for (int i: tablica) System.out.print(i+" "); // petla od 0 do l/2 ponieważ zamieniamy raz element // ostatni z pierwszym, przedostatni z drugim itd, // aż dojdziemy do środka tablicy. for (int i = 0; i < l/2; i++) { // kopiowanie wartości z tablicy do zmiennej tmp = tablica[i]; // kopiowanie wartości do kolejnych komórek z miejsca l-1-i bo: // l: (długość tablicy) // -1: bo ostatni indeks w tablicy jest // o 1 mniejszy niż nr. ostatniego indeksu // -i: przesuwamy się o 1 od końca do środka tablica[i]=tablica[l-1-i]; // kopiowanie wartości ze zmiennej "tymczasowej" do komórki // z której pobrano wartość i skopiowano o do komórki o indeksie i tablica[l-1-i]=tmp; } System.out.print("nPo odwróceniu: "); for (int i: tablica) System.out.print(i+" "); } }
Zadanie 2 – obliczanie wariancji
Tym razem obliczymy wariancję dla zestawu liczb, które mogą być np. pomiarami.
- Stwórz tablicę 1-wymiarową, wypełnioną liczbami typu double.
- Oblicz i wydrukuj wariancję dla tego zestawu liczb.
Wzór na wariancję wygląda tak:
Gdzie:
- s2 – wariancja
- xi – kolejny pomiar
- xs – średnia z pomiarów
- N – liczba pomiarów
Zanim przejdziesz do wskazówek, spróbuj sam rozwiązać zadanie.
Wskazówki
Kolejne pomiary, to właśnie kolejne liczby w naszej tablicy.
Jak widać potrzebna będzie najpierw średnia z pomiarów, a do jej policzenia musimy mieć sumę wszystkich elementów. Można to zrobić przy użyciu pętli iterującej po tablicy, jak robiliśmy to poprzednio. Sumę dzielimy przez liczbę elementów w tablicy, otrzymując średnią.
Następnie trzeba obliczyć sumę kwadratów różnicy xi-xs
. Na razie nie poznaliśmy jeszcze niezwykle pomocnego w obliczeniach pakietu Math, więc do uzyskania drugiej potęgi użyjemy po prostu mnożenia.
Ponieważ będziemy odejmować średnią od kolejnych pomiarów, znów zastosujemy pętlę.
Reszta jest trywialna.
Kod
class Wariancja { public static void main(String[] args) { double[] tablica = {1.0,2.0,2.5,4.0,3.7,3.5,2.3,2.5,3.6}; double suma=0.0; double srednia=0.0; double sumaRoznic=0.0; int N = tablica.length; double wariancja; // Obliczanie sumy elementów w tablicy for (int i = 0; i < N; i++) { suma+=tablica[i]; } System.out.println("Suma: "+suma); // Obliczanie średniej wartości w tablicy srednia = suma/N; System.out.println("Średnia: "+srednia); // Obliczanie sumy kwadratów różnic wartości i średniej for (int i = 0; i < N; i++) { sumaRoznic+=(tablica[i]-srednia)*(tablica[i]-srednia); } System.out.println("Suma różnic: "+sumaRoznic); // Obliczanie wariancji wariancja = sumaRoznic/(N-1); System.out.println("Wariancja: "+wariancja); } }
Zadanie 3 – Obliczanie średnich wartości z kolumn w tablicy
Tym razem wyobraźmy sobie, że mamy tabelę z danymi, podobną do takich jakich używamy np. w arkuszach kalkulacyjnych. W naszym przypadku będzie to po prostu tablica dwuwymiarowa 10×10 wypełniona wartościami od 0 do 99 (patrz „Java – tablice cz. II (07)„). Następnie trzeba będzie obliczyć średnie z wartości w poszczególnych kolumnach (a raczej w tym co wyobrażamy sobie jako kolumny).
Podsumowując zadanie:
- Stwórz tablicę 100-elementową, dwuwymiarową: 10×10 i wypełnij ją liczbami od 0-99
- Oblicz średnie dla liczb znajdujących się w kolejnych kolumnach (dla każdej kolumny osobna średnia)
Zanim przejdziesz do wskazówek, spróbuj sam rozwiązać zadanie.
Wskazówki
Jak wypełnić tabelę, można przeczytać tutaj.
Teraz będziemy musieli obliczyć średnie, a do ich obliczenia, jak wiadomo, konieczne będą najpierw sumy elementów.
Ponieważ będziemy chcieli przechować sumy wartości z poszczególnych kolumn, a także średnie. Stworzymy w tym celu dwie, jednowymiarowe tablice. Ich długość będzie odpowiadała długości wymiaru tablicy który uznajemy za rząd, czyli 10 (zresztą w naszym przykładzie tyle samo jest kolumn co rzędów).
Następnie, utworzymy dwie zagnieżdżone pętle, podobne do tych które zastosowaliśmy do wypełniania tablicy.
W pętli zewnętrznej pobierane są rzędy, a w pętli wewnętrznej wartości z kolumn, które będą dodawane do wartości z tablicy przechowującej sumy elementów. Po przejściu wszystkich rzędów otrzymamy tablicę z sumami kolumn.
Teraz pobieramy kolejne wartości z tablicy z sumami i dzielimy je przez 10 (liczba elementów), a wyniki umieszczamy w tablicy przechowującej średnie.
Pozostaje wypisać wartości średnich.
Oczywiście nie jest to jedyna możliwa droga rozwiązania problemu. Jak już uporasz się z tym sposobem, zastanów się na przykład, czy nie można by się obyć bez tablicy przechowującej sumy wartości?
Kod
class SrednieKolumn { public static void main(String[] args) { int[][] tablica = new int[10][10]; double[] sumy = new double[10]; double[] srednie = new double[10]; int licz=0; // Wypełnianie tablicy wartościami d 0 do 99 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { tablica[i][j]=licz++; } } // Obliczanie sum wartości w kolumnach // i to indeks rzędu, przy każdej iteracji pętli zewnętrznej // pobierane są rzędy for (int i = 0; i < 10; i++) { // j to indeks kolumny, więc w tablicy sumy[] obliczane są // sumy wartości z kolumn tablicy tablica[] o takich samych indeksach for (int j = 0; j < 10; j++) { // przy każdej iteracji pętli wewnętrznej, pobierane są // wartości komórek z kolejnych kolumn i dodawane // do wartości w tablicy sumy[] sumy[j]=sumy[j]+tablica[i][j]; } } // Z tablicy sumy pobierane są kolejne sumy wartości, // dzielone przez liczbę rzędów, obliczone w ten // sposób wartości kopiowane są do tablicy srednie[] for (int i = 0; i < 10; i++) { srednie[i]=sumy[i]/10; } for (double s: srednie) System.out.print(s+" "); } }
Leave a Reply
You must be logged in to post a comment.