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+" ");
}
}
@grzegg
(2 votes, average: 4,00 out of 5)
Leave a Reply
You must be logged in to post a comment.