Twitter: @grzegg
Kategoria: java, Tagi: - - - .

Java – trzy dodatkowe zadania dotyczące tablic

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:

  1. Skopiowanie wartości z komórki pierwszej do zmiennej.
  2. Skopiowanie wartości z komórki ostatniej do pierwszej.
  3. 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