Zielony Smok - logo witryny

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]