
Jak obliczyć kolor oczu?
Podstawy teoretyczne
Podstawy teoretyczne zostały podane tutaj
Klasy
Klasa KolorOczu
package koloroczu;
public class KolorOczu {
private KolorOczu() {
}
/**
* pierwsze dwie litery - allele pierwszego genu (gey)
* następne dwie litery - allele drugiego genu (bey2)
* pierwszy niebieski, następne dwa - zielony, reszta - brązowy
*/
private final static String[] genotypy = {"ggbb", "GGbb", "Ggbb", "GGBB",
"GgBB", "ggBB", "GGBb", "GgBb", "ggBb"};
private final static String[] koloryOczu = {"blue", "green", "brown"};
/**
* Krzyżuje genotypy, gdy znamy kolor oczu partnerów
* i chociaż jednego z rodziców. Podajemy kolory oczu
* (płeć nie ma znaczenia):
*
* @param father1- rodzic pierwszy badanej osoby
* @param mother1 - rodzic drugi badanej osoby
* @param person1 - badana osoba. Zakładamy, że jej kolor oczu jest pewny, tzn.
* jeśli z danych rodziców i person1 wynika konflikt kolorów to
* dane rodziców traktujemy jako niepewne
* @param person2 - partner/ka badanej osoby. Zakładamy, że jej kolor oczu
* jest pewny, tzn. jeśli z danych rodziców i person2 wynika konflikt
* kolorów to dane rodziców traktujemy jako niepewne
* @param father2 - rodzic pierwszy partnera
* @param mother2 - rodzic drugi partnera
* @return - zwraca tabelę wystąpień genotypów odpowiadającą
* kolejnością tabeli 'genotypes'. Ostatnia liczba w tabeli jest sumą
* poprzednich.
*/
public static int[] crossEyes(String mother1, String father1,
String person1, String person2, String mother2, String father2) {
//TODO
return null;
}
/**
* Sprawdzamy jakie kolory może mieć drugi z rodziców, jeśli znamy kolor oczu
* drugiego z rodziców i kolor oczu dziecka
*
* @param p1Color - znany kolor oczu rodzica
* @return - tablica podająca czy kolor jest dopuszczalny. Kolory ułożone są
* w kolejności jak w tablicy 'kolorOczu'
* @param chColor - kolor oczu dziecka
*/
public static boolean[] possibleColors(String chColor, String p1Color) {
boolean[] p2Colors = new boolean[3];
switch (chColor) {
case "blue":
if (p1Color.equals("green")) {
p2Colors[1] = true;
p2Colors[2] = false;
p2Colors[2] = true;
} else {
p2Colors[1] = true;
p2Colors[2] = true;
p2Colors[2] = true;
}
break;
case "green":
if (p1Color.equals("blue")) {
p2Colors[1] = false;
p2Colors[2] = true;
p2Colors[2] = true;
} else {
p2Colors[1] = true;
p2Colors[2] = true;
p2Colors[2] = true;
}
break;
case "brown":
if (p1Color.equals("blue")) {
p2Colors[1] = false;
p2Colors[2] = false;
p2Colors[2] = true;
} else if (p1Color.equals("green")) {
p2Colors[1] = true;
p2Colors[2] = false;
p2Colors[2] = true;
} else {
p2Colors[1] = true;
p2Colors[2] = true;
p2Colors[2] = true;
}
break;
}
return p2Colors;
}
/**
* Sprawdza czy podany kolor oczu istnieje w tabeli
* 'koloryOczu'.
*
* @param kolor - kolor do zbadania
* @return - true jeśli kolor istnieje, false - w przeciwnym
* przypadku
*/
public static boolean colorExists(String kolor) {
for (String s : koloryOczu) {
if (s.equals(kolor)) {
return true;
}
}
System.out.println("Taki kolor nie istnieje.");
return false;
}
/**
* Metoda używana, gdy znamy tylko kolory oczu partnerów
*
* @param fColor - kolor oczu ojca
* @param mColor - kolor oczu matki
* @return - zwraca tabelę wystąpień genotypów w kolejności
* tabeli 'genotypes'.
*/
public static int[] crossEyes(String fColor, String mColor) {
int[] tabl = new int[10];
if ((!colorExists(fColor) || (!colorExists(mColor)))) {
return null;
}
switch (fColor) {
case "blue":
switch (mColor) {
case "blue": {
String[][] tabl1 = crossGenes(genotypy[0], genotypy[0]);
int[] tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
break;
}
case "green": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int i = 1; i < 3; i++) {
tabl1 = crossGenes(genotypy[0], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
}
break;
}
case "brown": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int i = 3; i < 9; i++) {
tabl1 = crossGenes(genotypy[0], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
}
break;
}
}
break;
case "green":
switch (mColor) {
case "blue": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int i = 1; i < 3; i++) {
tabl1 = crossGenes(genotypy[0], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
}
break;
}
case "green": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int i = 1; i < 3; i++) {
tabl1 = crossGenes(genotypy[1], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
}
break;
}
case "brown": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int j = 1; j < 3; j++) {
for (int i = 3; i < 9; i++) {
tabl1 = crossGenes(genotypy[j], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int k = 0; k < 9; k++) {
tabl[k] += tabl2[k];
}
}
}
break;
}
}
break;
case "brown":
switch (mColor) {
case "blue": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int i = 3; i < 9; i++) {
tabl1 = crossGenes(genotypy[0], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int j = 0; j < 9; j++) {
tabl[j] += tabl2[j];
}
}
break;
}
case "green": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int j = 1; j < 3; j++) {
for (int i = 3; i < 9; i++) {
tabl1 = crossGenes(genotypy[j], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int k = 0; k < 9; k++) {
tabl[k] += tabl2[k];
}
}
}
break;
}
case "brown": {
String[][] tabl1 = null;
int[] tabl2 = null;
for (int j = 3; j < 9; j++) {
for (int i = 3; i < 9; i++) {
tabl1 = crossGenes(genotypy[j], genotypy[i]);
tabl2 = countGenes(tabl1);
for (int k = 0; k < 9; k++) {
tabl[k] += tabl2[k];
}
}
}
break;
}
}
break;
}
for (int i = 0; i < tabl.length - 1; i++) {
tabl[9] += tabl[i];
}
return tabl;
}
/**
* Metoda używana, gdy znamy genotypy krzyżowanych osób.
* Zwraca macierz 4 x 4 zawierającą genotypy potomstwa;
*
* @param fGenotype - genotyp pierwszej osoby
* @param mGenotype - genotyp drugiej osoby
* @return - macierz 4 x 4 zawierającą genotypy potomstwa
*/
public static String[][] crossGenes(String fGenotype, String mGenotype) {
if ((!genotypeExists(mGenotype) || (!genotypeExists(mGenotype)))) {
return null;
}
String[] fGametes = {
fGenotype.substring(0, 1).concat(fGenotype.substring(2, 3)),
fGenotype.substring(0, 1).concat(fGenotype.substring(3, 4)),
fGenotype.substring(1, 2).concat(fGenotype.substring(2, 3)),
fGenotype.substring(1, 2).concat(fGenotype.substring(3, 4))};
String[] mGametes = {
mGenotype.substring(0, 1).concat(mGenotype.substring(2, 3)),
mGenotype.substring(0, 1).concat(mGenotype.substring(3, 4)),
mGenotype.substring(1, 2).concat(mGenotype.substring(2, 3)),
mGenotype.substring(1, 2).concat(mGenotype.substring(3, 4))};
String[][] array = new String[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
String a = sort(fGametes[i].substring(0, 1),
mGametes[j].substring(0, 1));
String b = sort(fGametes[i].substring(1, 2),
mGametes[i].substring(1, 2));
array[i][j] = a.concat(b);
}
}
return array;
}
/**
* Zlicza liczbę poszczególnych genotypów potomstwa
*
* @param cross - macierz genotypów uzyskana przy użyciu metody
* countGenes (
* @return - tablica 10 liczb. Zawiera liczby genotypów ułożone
* w takiej kolejności jak w tablicy 'genotypes'. Ostatnia liczba
* jest sumą. Częstość genotypu oblicza się przez podzielenie jednej
* z dziewięciu liczb przez sumę.
*/
public static int[] countGenes(String[][] cross) {
int[] tabl = new int[10];
int sum = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 9; k++) {
if (cross[i][j].equals(genotypy[k])) {
tabl[k]++;
sum++;
}
}
}
tabl[9] = sum;
}
return tabl;
}
/**
* Sprawdza i podaje kolor oczu dla podanego genotypu
*
* @param genotyp - badany genotyp zgodny z tablicą 'genotypes'
* @return - zwraca kolor oczu dla podanego genotypu
*/
private static String getColor(String genotyp) {
if (genotyp.contains("B")) {
return "brown";
} else {
if (genotyp.contains("G")) {
return "green";
} else {
return "blue";
}
}
}
/**
* Sprawdza i podaje kolory dla tablicy genotypów
*
* @param cross - tablica genotypów uzyskana przy użyciu metody
* crossGenes(String[][]);
* @return - macierz 4 x 4 podającą kolory oczu w miejsce genotypów
*/
public static String[][] getColors(String[][] cross) {
String[][] kolory = new String[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
kolory[i][j] = getColor(cross[i][j]);
}
}
return kolory;
}
/**
* Zamienia tablicę rozkładu genów na tablicę rozkładu
* kolorów
*
* @param liczbaGenow - tablica rozkładu genów uzyskana przy
* użyciu metody countGenes()
* @return - zwraca tablicę liczb podającą liczbę kolorów oczu
* potomstwa w kolejności tablicy 'koloryOczu'
*/
public static int[] getColors(int[] liczbaGenow) {
int[] tabl = new int[4];
for (int i = 0; i < genotypy.length; i++) {
String color = getColor(genotypy[i]);
switch (color) {
case "blue":
tabl[0] += liczbaGenow[i];
break;
case "brown":
tabl[2] += liczbaGenow[i];
break;
case "green":
tabl[1] += liczbaGenow[i];
break;
}
}
for (int j = 0; j < 3; j++) {
tabl[3] += tabl[j];
}
return tabl;
}
/**
* Zlicza wystąpienia kolorów u potomstwa.
*
* @param colors - tablica kolorów uzyskana przy użyciu metody
* getColors(String[][])
* @return - tablica podająca liczbę kolorów u potomstwa ułożona
* w kolejności tablicy 'koloryOczu'. Ostatnia liczba jest sumą
* trzech poprzednich. Częstość można obliczyć dzieląc jedną z trzech
* liczb przez sumę.
*/
public static int[] countColors(String[][] colors) {
int[] tabl = new int[4];
int sum = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 3; k++) {
if (colors[i][j].equals(koloryOczu[k])) {
tabl[k]++;
sum++;
}
}
}
}
tabl[3] = sum;
return tabl;
}
/**
* Sprawdza czy podana konfiguracja kolorów oczu rodziców z kolorem
* oczu dziecka jest prawidłowa (dopuszczalna). Zakładamy, że kolor oczu
* dziecka jest prawdziwy.
*
* @param childColor - kolor oczu dziecka
* @param p1Color - kolor oczu pierwszego rodzica
* @param p2Color - kolor oczu drugiego rodzica
* @return - true jeśli konfiguracja jest dopuszczalna, false w przeciwnym
* przypadku. Jeśli konfiguracja jest niepoprawna, to źle są podane
* kolory oczu rodziców. Jeśli kolory oczu rodziców są poprawne to ojciec
* nie jest faktycznie biologicznym ojcem.
*/
public static boolean controlParents(String childColor, String p1Color,
String p2Color) {
switch (childColor) {
case "blue":
if (p1Color.equals("green") && (p2Color.equals("green"))) {
//System.out.println(
// "Przynajmniej jedna z osób nie jest Twoim rodzicem");
return false;
}
case "green":
if (p1Color.equals("blue") && (p2Color.equals("blue"))) {
//System.out.println(
// "Przynajmniej jedna z osób nie jest Twoim rodzicem");
return false;
}
case "brown":
if (p1Color.equals("blue") && (p2Color.equals("blue"))) {
//System.out.println(
// "Przynajmniej jedna z osób nie jest Twoim rodzicem");
return false;
} else if (p1Color.equals("green") && (p2Color.equals("green"))) {
// System.out.println(
// "Przynajmniej jedna z osób nie jest Twoim rodzicem");
return false;
} else if ((p1Color.equals("blue") && p2Color.equals("green"))
|| (p1Color.equals("green") && p2Color.equals("blue"))) {
// System.out.println(
// "Przynajmniej jedna z osób nie jest Twoim rodzicem");
return false;
}
}
return true;
}
/**
* Sprawdza czy podany genotyp istnieje
*
* @param genotyp - genotyp do zbadania
* @return - true jeśli genotyp istnieje, false - w przeciwnym
* przypadku
*/
public static boolean genotypeExists(String genotyp) {
for (String s : genotypy) {
if (s.equals(genotyp)) {
return true;
}
}
System.out.println("Taki genotyp nie istnieje.");
return false;
}
/**
* Ustawia prawidłową kolejność gamet w stringu
* określającym genotyp
*
* @param a - gameta pierwsza
* @param b - gameta druga
* @return - genotyp z gametami ułożonymi
* we właściwej kolejności
*/
private static String sort(String a, String b) {
int aa = a.charAt(0);
int bb = b.charAt(0);
if (bb < aa) {
return b.concat(a);
}
return a.concat(b);
}
/**
* Drukuje tablicę intów na konsoli
*
* @param array - wypisywana tablica
*/
public static void print(int[] array) {
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
System.out.print(array[i]);
} else {
System.out.print(array[i] + ", ");
}
}
System.out.print("]");
System.out.println();
}
/**
* Drukuje tablicę obiektów na konsoli
*
* @param array - wypisywana tablica
*/
public static <T> void print(T[] array) {
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
System.out.print(array[i]);
} else {
System.out.print(array[i] + ", ");
}
}
System.out.print("]");
System.out.println();
}
/**
* Drukuje wskazaną macierz obiektów na konsoli
*
* @param plist Object[][] - macierz obiektów
*/
public static void print(Object[][] plist) {
for (Object[] temp : plist) {
for (Object o : temp) {
System.out.print(o + " ");
}
System.out.print("\n");
}
}
}
Klasa Main1
package koloroczu;
public class Main1 {
public static void main(String[] args) {
//Gdy znamy genotypy partnerów
String mGenotype = "ggbb";
String fGenotype = "ggbb";
System.out.println("Genotypy potomstwa:");
String[][] cross1 = KolorOczu.crossGenes(fGenotype, mGenotype);
KolorOczu.print(cross1);
System.out.println(
"Rozkład wystąpień genotypów w odniesieniu do tabeli 'genotypes':");
int[] cg = KolorOczu.countGenes(cross1);
KolorOczu.print(cg);
System.out.println("Kolory oczu potomstwa:");
String[][] kolory = KolorOczu.getColors(cross1);
KolorOczu.print(kolory);
System.out.println(
"Rozkład wystąpień kolorów oczu w odniesieniu do tabeli 'koloryOczu':");
int[] kol = KolorOczu.countColors(kolory);
KolorOczu.print(kol);
}
}
Po uruchomieniu klasy na konsoli otrzymujemy:
Genotypy potomstwa: ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb ggbb Rozkład wystąpień genotypów w odniesieniu do tabeli 'genotypes': [16, 0, 0, 0, 0, 0, 0, 0, 0, 16] Kolory oczu potomstwa: blue blue blue blue blue blue blue blue blue blue blue blue blue blue blue blue Rozkład wystąpień kolorów oczu w odniesieniu do tabeli 'koloryOczu': [16, 0, 0, 16]
Klasa Main2
package koloroczu;
public class Main2 {
public static void main(String[] args) {
//Gdy znamy kolory oczu partnerów, a nic nie wiemy
//o kolorach oczu ich rodziców
System.out.println(
"Rozkład genotypów według tablicy 'genotypy'. Ostatnia cyfra to suma.");
int[] tabl = KolorOczu.crossEyes("brown", "brown");
KolorOczu.print(tabl);
System.out.println("Rozkład kolorów. ");
System.out.println(
"Kolory są w kolejności tabl 'kolory oczu'. Ostatnia cyfra to suma.");
int[] kolory = KolorOczu.getColors(tabl);
KolorOczu.print(kolory);
}
}
Po uruchomieniu klasy na konsoli otrzymujemy:
Rozkład genotypów według tablicy 'genotypy'. Ostatnia cyfra to suma. [18, 18, 36, 90, 180, 90, 36, 72, 36, 576] Rozkład kolorów. Kolory są w kolejności tabl 'kolory oczu'. Ostatnia cyfra to suma. [18, 54, 504, 576]
Klasa Main3
package koloroczu;
public class Main3 {
public static void main(String[] args) {
//Gdy znamy kolory oczu partnerów, a nic nie wiemy
//o kolorach oczu ich rodziców
int[] tabl = KolorOczu.crossEyes("brown", "brown");
System.out.println("rozkład kolorów. ");
System.out.println(
"Kolory są w kolejności tabl 'koloryOczu'. Ostatnia cyfra to suma.");
int[] kolory = KolorOczu.getColors(tabl);
KolorOczu.print(kolory);
}
}
Po uruchomieniu klasy na konsoli otrzymujemy:
rozkład kolorów. Kolory są w kolejności tabl 'koloryOczu'. Ostatnia cyfra to suma. [18, 54, 504, 576]
