- Grzegorz Góralski – strona własna - https://ggoralski.pl -

Java [41] – Zadanie: wpływ mutacji na frekwencje alleli

Zadanie programistyczne będzie dotyczyć symulacji wpływu mutacji na frekwencje (częstości) występowania alleli.

Nieco więcej na ten temat można znaleźć w mojej prezentacji [1] a także w odpowiedniej literaturze.

Teoria:

Rozpatrujemy dwa allele: A i a.

Frekwencję allelu A oznaczamy jako p, frekwencję a jako v.

Wartość frekwencji alleli może się mieścić między 0 a 1, przy czym:

p + q = 1

Allel A może mutować w allel a i odwrotnie.

Allel A mutuje w a z częstością u.

Allel a mutuje w A z częstością v.

Wartości u i v mieszczą się w zakresie 0 – 1.

Frekwencja allelu a bedzie wynosiła w następnym pokoleniu:

q1 = q + pu

Zatem zmiana p będzie wynosić:

∆q = pu

Analogicznie:

p1 = p + qv

∆p = qv

Zadanie:

Napisz program, który pobierze od użytkownika wartości:

Następnie program powinien przez zadaną liczbę pokoleń pokazywać kolejne wartości p i qa także ∆p i ∆q.

Java [22] – Zadania: obliczanie wartości π metodą Monte Carlo i na inne sposoby

Posted By Grzegorz On In java,programowanie | No Comments

Tym razem zadania dotyczące obliczania wartości π. Najpierw spróbujemy użyć metody Monte Carlo a następnie bardziej klasycznych (i efektywnych) sposobów.

Zadanie 1: Obliczanie wartości π metodą Monte-Carlo

Czasem badając jakieś zjawisko nie jesteśmy w stanie po prostu wyliczyć wyniku. Na przykład nie znamy odpowiednich wzorów lub badany proces jest zbyt skomplikowany. W takich przypadkach z pomocą przychodzi metoda Monte Carlo. Jej twórcą jest, wspomniany wcześniej przy okazji automatów komórkowych, Stanisław Ulam. Nazwa, pochodzi od znanej dzielnicy Monako, dawniej będącej symbolem hazardu (dzisiaj raczej jest nim Las Vegas). Skoro hazard, to przypadek i prawdopodobieństwo. W końcu badania nad prawdopodobieństwem rozpoczęły się właśnie od analizy gier hazardowych. W ten sposób dochodzimy do sedna omawianej metody. Opiera się ona bowiem o losowanie wartości istotnych dla badanego zjawiska/obiektu/procesu w oparciu o znany rozkład tych wartości. Czyli, w uproszczeniu, tworzymy jakąś symulacje w której generujemy „przypadkowe” zdarzenia, których prawdopodobieństwo powinno możliwie odpowiadać występującym w rzeczywistości a następnie obserwujemy i analizujemy otrzymane wyniki.

Do klasycznych przykładów możliwego zastosowania metody Monte Carlo należy obliczanie wartości π. Oczywiście znane są dokładniejsze i bardziej wydajne metody [2] wyliczenia wartości tej stałej, do czego zresztą jeszcze wrócimy. Na razie zaprzęgniemy do pracy przypadek.

Zacznijmy od prostego rysunku koła o promieniu r wpisanego w w kwadrat:


Skoro promień koła wynosi r to bok kwadratu wynosi 2 r. Zatem wzory na pola obu figur będą wyglądać następująco:

Pole koła:

Pole kwadratu:

Stosunek pól obu figur możemy zapisać następująco:

Czyli:

Z czego wynika, że wartość π wynosi:

Tak więc, znając stosunek obu pól można wyznaczyć wartość π. Jak jednak go wyznaczyć używając zdarzeń losowych?

Wyobraźmy sobie, że nasz rysunek używamy jako tarczy strzeleckiej. Nie staramy się jednak strzelać w jakiś konkretny punkt, na przykład w środek, ale w jakiekolwiek, przypadkowo wybrane miejsce. Po jakimś czasie nasza tarcza mogłaby wyglądać na przykład tak:


Teraz dochodzimy do sedna. Jeśli strzały są przypadkowe to stosunek liczby trafień w obrębie koła do stosunku wszystkich trafień (czyli wewnątrz kwadratu) powinien odpowiadać stosunkowi pól obu figur.

Teraz przejdźmy do projektowania programu.
Z powyższych rozważań wynika, że program powinien:

  1. Zasymulować określoną liczbę „strzałów”, czyli wygenerować „punkty” mieszczące się w „wirtualnym kwadracie”,
  2. Następnie sprawdzić ile z punktów mieści się w obrębie „wirtualnego koła”,
  3. Obliczyć stosunek punktów mieszczących się w kole do wszystkich
  4. Obliczyć wartość π mnożąc wyliczony stosunek przez 4.

Z powyższych punktów dwa ostatnie są trywialne, natomiast pierwsze dwa mogą sprawić problemy początkującemu programiście.
Co to właściwie znaczy, że program powinien wygenerować „punkty”? Można to rozwiązać w ten sposób, że losujemy dwie liczby o wartości od 0 do długości boku kwadratu, które będą odpowiadały współrzędnym x i y.
Następnie trzeba sprawdzić czy punkt o wylosowanych współrzędnych mieści się w obrębie koła. Można tu wykorzystać wzór wykorzystywany w definicji okręgu [3], wg. której okrąg to zbiór punktów (x, y) spełniających równość:


Gdzie: x0 i y0 to współrzędne środka okręgu.

Ponieważ środek okręgu możemy ustalić w punkcie 0,0 układu współrzędnych, wzór można uprościć:


Nas jednak interesują punkty znajdujące się także wewnątrz okręgu, czyli w polu koła. Te punkty spełniają warunek:


Zauważ, że jeśli mówimy o stosunku pola koła i kwadratu, to będzie on taki sam dla ćwiartek obu figur:


Takie rozwiązanie będzie łatwiejsze do zaiplementowania, zwłaszcza jeśli przyjmiemy, że r = 1. Wtedy każda ze współrzędnych punktów będzie mieściła się w zakresie od 0 do 1, a do losowania liczb w tym zakresie znamy już odpowiednie metody [4].

Napisz program, który będzie wyliczał wartość π przy użyciu 100, 1000, 10 000, 100 000 oraz 1000 000 punktów a następnie wypisze obliczone wartości oraz ich dokładność, czyli różnice między wyliczonymi wartościami a znaną wartością π, którą możesz pobrać np. używając klasy Math [4].



Zadanie 2: Dokładniejsze obliczanie wartości π

Jak wspomniałem wyżej, w praktyce obliczanie π metodą Monte Carlo nie jest najlepszym z możliwych rozwiązań. Do tego typu obliczeń można używać różnych wzorów, ich przegląd można znaleźć np. na stronie Wikipedii poświęconej π [2]. Zauważ, że w większości mają one charakter iteracyjny. Należy pamiętać, że nie można wyliczyć i zapisać dokładnej wartości π, zatem w praktyce otrzymuje się mniej lub bardziej dokładne przybliżenia z mniejszą lub większą liczbą cyfr po przecinku.

Zadanie polega na napisaniu programu, który użyje kilku (co najmniej trzech) sposobów obliczania wartości π (np. (np. Leibnitza, Wallisa i Newtona) dla podanej przez użytkownika liczby kroków i porówna ich dokładność.
Dodatkowo, spróbuj napisać metodę z użyciem pętli i drugą metodę z wykorzystaniem rekurencji do wybranych wzorów.

Uwaga: nie stosuj metody rekurencyjnej dla dużej liczby iteracji ( ~ 10000 i wyżej), ponieważ może to spowodować błąd przepełnienia stosu (błąd: java.lang.StackOverflowError).

Java – zadania do prezentacji 1-6 cz. I

Posted By Grzegorz On In java,programowanie | No Comments

Część I zadań do zakresu materiału znajdującego się prezentacjach 1-6 kursu z programowania Javy [5], obejmujących m. in.: zmienne, instrukcje wyboru, operatory logiczne, pętle, wprowadzanie danych z klawiatury, tablice jednowymiarowe. Zadania starałem się podać w kolejności od najłatwiejszych do najtrudniejszych, choć to rzecz względna ;-).

  1. Silnia: Napisz program obliczający silnię
    Zasada działania:

      Użytkownik podaje liczbę, program oblicza silnię

  2. Pola figur: Napisz program, który oblicza pole figur: koła, kwadratu, prostokąta.
    Zasada działania:

    1. Po uruchomieniu użytkownik widzi menu z którego wybiera rodzaj figury.
    2. Następnie program prosi o podanie wymaganych wartości do obliczenia pola figury.
    3. Program wyświetla pole figury i pyta czy jeszcze raz, czy zakończyć pracę i stosownie do wybranej opcji wraca od początku lub kończy działanie.
  3. Lista studentów: Zapisz program obsługujący listę studentów i ich numery.
    Zasada działania:

    1. Użytkownik podaje liczbę studentów w grupie.
    2. Następnie podaje kolejno imię i nazwisko (jako jeden ciąg znaków) każdego z nich.
    3. Studenci otrzymują kolejne numery porządkowe od 1 wzwyż.
    4. Pokazuje się menu w którym uzytkownik wybiera czy chce sprawdzić numer czy imię i nazwisko studenta czy też chce zakończyć.
    5. Jeśli użytkownik wybrał koniec, to program kończy działanie.
    6. Jeśli użytkownik podaje chce poznać numer studenta to wpisuje jego imię i nazwisko i otrzymuje jego numer porządkowy (od 1).
    7. Jeśli użytkownik chce poznac imię i nazwisko studenta to wpisuje jego numer a program podaje wypisuje imię i nazwisko własciwe dla podanego numeru porządkowego
    8. Program powraca do punktu d.

  4. Roztwory: Napisz program, który pomaga przygotowanie roztworu wodnego o określonym stężeniu procentowym (wagowym).

    Zasada działania:

    1. Program pyta użytkownika o docelową objętość roztworu i stężenie procentowe substancji – np. uzytkownik wprowadza informację, że chce 20 ml roztworu 6%.
    2. Program wyświetla objętość wody (zakładamy, że 1ml = 1g) oraz wagę substancji rozpuszczonej potrzebnej do wykonania roztworu.
    3. Program powtarza działanie aż do chwili, kiedy uzytkownik zechce go zakończyć.
    4. Dodatkowo: rozszerzyć funkcjonalność programu, tak aby działał także dla innych rozpuszczalników (inna gęstość).

  5. Liczby: Napisz program, który działa tak:
    1. Użytkownik podaje 10 liczb.
    2. Program sprawdza, czy są one posortowane od największej do najmniejszej.
    3. Program podaje największą i najmniejszą liczbę.
    4. Prosi użytkownika o podanie liczby i sprawdza, czy znajduje się ona w tabeli.

  6. Mierzenie i ważenie organizmów: Napisz program w którym użytkownik podaje wysokość organizmu oraz jego wagę a następnie program podaje odpowiednie dane.
    Zasada działania:

    1. Użytkownik deklaruje ile maksymalnie może być danych (zmierzonych i zważonych organizmów).
    2. Następnie wprowadza kolejno wysokość oraz wagę każdego organizmu.
    3. Po wprowadzeniu danych (może ich być mniej niż wcześniej zadeklarowana maksymalna wartość) program wypisuje:
      • Średni wzrost dla zbadanej próby.
      • Średnią wagę dla zbadanej próby.
      • Wartość minimalną i maksymalną dla obu parametrów.
      • Współczynnik waga/wzrost dla każdego organizmu.
      • Średni współczynnik waga/wzrost dla wszystkich organizmów.

Java – trzy dodatkowe zadania dotyczące tablic

Posted By Grzegorz On In java,programowanie | No Comments

Dzisiaj umieszczam trzy dodatkowe zadania wraz z rozwiązaniami do części ćwiczeń kursu „Wstęp do programowania” [6]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.

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.

Wzór na wariancję wygląda tak:

Gdzie:

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) [8]„). 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:

Zanim przejdziesz do wskazówek, spróbuj sam rozwiązać zadanie.

Wskazówki

Jak wypełnić tabelę, można przeczytać tutaj [8].
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+" ");
	}
}

Ćwiczenia z genetyki – zadania do cz. III

Posted By Grzegorz On In genetyka | No Comments

W sekcji Genetyka – ćwiczenia umieściłem prezentację z zadaniami do cz. III ćwiczeń.;

Ćwiczenia z genetyki – prezentacje i dodatkowe zadania

No Comments

W sekcji “Genetyka-ćwiczenia” umieściłem uaktualnioną wersję prezentacji dotyczącą frekwencji allelu oraz genotypów i prawa Hardy’ego-Weinberga, prezentację z zadaniami do frekwencji i prawa H-W, a także dodatkowy zestaw zadań z rozwiązaniami do II części ćwiczeń.]]–>

Dodatkowe zadania do cz. I ćwiczeń

Posted By Grzegorz On In genetyka | No Comments

Zgodnie z obietnicą, zamieściłem w sekcji Genetyka-ćwiczenia dodatkowe zadania do cz. I ćwiczeń, wraz z rozwiązaniami.

Można więc sprawdzić zwoje umiejętności przed kolokwium ;-)

Dodatkowo umieściłem tablicę wartości chi kwadrat [9].;

Java – zadania (02) do cz. 1-7

Posted By Grzegorz On In java,programowanie | No Comments

Zamieszczam kolejne zadania dotyczące przede wszystkim operacji na tablicach dwuwymiarowych.
Przy okazji informuję, że uaktualniłem poprzednie posty o rozwiązania zadań, tam gdzie ich jeszcze nie było.

Zadania

  1. Poniżej podano dane pomiarowe dla 5 populacji (po 10 pomiarów) dotyczące liczby młodych urodzonych przez samicę.

    populacja 1: 7,8,4,6,7,8,5,4,5,4
    populacja 2: 9,9,8,7,8,6,7,8,8,9
    populacja 3: 5,6,7,7,6,5,6,5,7,8
    populacja 4: 9,8,9,8,7,8,9,9,8,7
    populacja 5: 7,5,4,5,4,7,6,5,8,6

    Zadania:

    • Umieść te dane w programie i oblicz dla każdej z populacji średnią, zaokrąglaną do liczb całkowitych w dół (podpowiedź: jeśli wynik dzielenia, który zawiera część dziesiętną przypiszemy do zmiennej typu int to część ułamkowa zostanie odcięta).
    • Narysuj na ekranie histogram poziomy 
na którym znają się średnie i słupki pokazujące 
te średnie:

      5 *****
      7 *******
      6 ******
      8 ********
      5 *****

  2. Napisz program który pobierze od użytkownika liczbę, po czym wypisze na ekranie trójkąt Pascala o zadanej liczbie rzędów. Wartość każdej komórki, oprócz skrajnych 1, niech oblicza sumując sąsiednie komórki z rzędu powyżej.

    Dodatkowo: niech wypisze po lewej numer rzędu a po prawej sumę elementów w rzędzie. (podpowiedzi: zob. prezentację [10])

    0   .  .  .  .  .  .  .  .  1  .  .  .  .  .  .  .  .   1
    1   .  .  .  .  .  .  .  1  .  1  .  .  .  .  .  .  .   2
    2   .  .  .  .  .  .  1  .  2  .  1  .  .  .  .  .  .   4
    3   .  .  .  .  .  1  .  3  .  3  .  1  .  .  .  .  .   8
    4   .  .  .  .  1  .  4  .  6  .  4  .  1  .  .  .  .   16
    5   .  .  .  1  .  5  . 10  . 10  .  5  .  1  .  .  .   32
    6   .  .  1  .  6  . 15  . 20  . 15  .  6  .  1  .  .   64
    7   .  1  .  7  . 21  . 35  . 35  . 21  .  7  .  1  .   128
    8   1  .  8  . 28  . 56  . 70  . 56  . 28  .  8  .  1   256

Prezentacja (pdf) – zadania z odpowiedzią na zadanie 1 i podpowiedziami do zadania 2 (odpowiedź pojawi się później) [10]


Kody

Zadanie 1

Dane pomiarowe dla 5 populacji są wpisz do tabeli, oblicz średnią zaokrąglaną w dół dla każdej populacji a następnie wydrukuj poziomy histogram (pełna treść – patrz wyżej).


// tablica z danymi - w rzędach dane
// dla poszczególnych populacji
int[][] dane={
		{7,8,4,6,7,8,5,4,5,4},
		{9,9,8,7,8,6,7,8,8,9},
		{5,6,7,7,6,5,6,5,7,8},
		{9,8,9,8,7,8,9,9,8,7},
		{7,5,4,5,4,7,6,5,8,6}};
// w tej tablicy będziemy przechowywać
// średnie dla poszczególnych populacji
int[] srednie = new int[5];
int suma;
int i=0;
int sumaWszystkich=0;

// Pętla w której pobieramy "rzędy" - w każdym
// są dane dla jednej populacji
for (int tab[] : dane) {
	// zmienna w której przechowujemy sumę wartości
	suma=0;
	// pętla która pobiera kolejne dane dla populacji
	// a następnie je po kolei sumuje
	for (int d : tab) { 
		// każda kolejna wartość jest dodawana do 
		// otrzymanej poprzednio sumy i przypisywana
		// do zmiennej suma
		suma=suma+d; 
		}
	// obliczmy średnią dla populacji a następnie
	// wpisujemy obliczoną wartośc do tablicy w której
	// przechowujemy średnie dla populacji
	srednie[i]=suma/tab.length;
	// teraz będziemy obliczać dane dla nastepnej populacji 
	// więc zwiększamy i o 1
	i++;
}

// Rysujemy poziomy histogram

// Pobieramy kolejne wartości z tabeli przechowującej
// średnie z kolejnych populacji
for(int j : srednie) {
	// wypisujemy wartość średniej
	System.out.print(j+" ");
	// pętla która wykonuje się tyle razy ile wynosi średnia
	// za każdym obrotem pętli drukowany jest znak *
	for (int k=0; k<j;k++) { 
		System.out.print("*"); 
		}
	// kiedy został wydrukowany "słupek" dla populacji
	// trzeba przejśc  do nowej linii
	System.out.println();	
}

Przykładowe zadania do cz. III ćwiczeń z genetyki

Posted By Grzegorz On In Uncategorized | No Comments

Do sekcji Gentyka-ćwiczenia wrzuciłem przykładowe zadania do cz. III ćwiczeń z genetyki (dobór, mutacje, efektywna wielkość populacji).;

Genetyka – przykładowe zadania

No Comments

Umieściłem na stronie ćwiczeń z genetyki prezentację z przykładowymi zadaniami do cz. I ćwiczeń. ]]–>