View Full Version : [Runde 3] - 3150 Kreuzung von Wunderblumen
kenn mich bei folgenden nicht aus:
wie wird ein dominanter Erbgang durchgeführt ?
in der Aufgabenstellung steht:
Wurde ein dominanter Erbgang durchgefuehrt, geben Sie bei der Ausgabe "d" aus, ansonsten "i" fuer intermediärer Erbgang. Bei der Ausgabe nach einem dominantem Erbgang sollen nun die Buchstabenkombinationen, die noch dominante Farben (d.h. Großbuchstaben) enthalten, in die entsprechenden richtigen Kleinbuchstabenkombinationen umgewandelt werden. (z. B.: BG -> bg, Rb -> rr, Gg -> gg, Br -> bb).
wie komme ich von BG auf bg, Rb usw...?
was kommt raus, wenn die eingabe z.B. rb rG ist?
ich danke im voraus
Hier 2 Teilbeispiele zu deinem Programm, vielleicht helfen sie dir weiter...
http://eprog.sourceforge.net/eprog/1170/0126051/
http://eprog.sourceforge.net/eprog/1170/0004444/
mfg
Ansich sollte Vererbung nicht so besonders schwer zu verstehen sein - allerdings werd ich aus den Angaben nicht wirklich schlau ... was genau ist gegeben und was gesucht?
Vielleicht koenntest du ja einen Link mit deiner Spezifikation machen oder einen größeren Teil der Angabe posten.
http://eprog.sourceforge.net/eprog/3150/Erb.html (http://eprog.sourceforge.net/eprog/3150/Erb.html)
dort ist die ganze angabe,
was ich jetzt nicht genau weiß ist, welchen unterschied es bei einem dominantem zu einem intermediären Erbgang gibt.
bei einem intermediären ist es einfach: aus bg rb wird br bb gr gb, einfach nur jeder buchstabe mit jeden kombiniert, aber bei einem dominanten(also wenn großbuchstaben vorkommen) weiß ichs nicht
allgemein gilt:
intermediär: nur Kleinbuchstaben (z.B:bg bb).
dominant: Groß- und Kleinbuchstaben kombiniert (z.B.: RR Bg).
nur 2. Mendelsches Gesetz: unterschiedliche Anlagen (z.B.: bb Rg)
1. und 2. Mendel.Gesetz: nur Grundfarben(z.B.: RR gg)
In jedem Fall musst du die gegebenen Blumen kreuzen:
das geht am einfachsten so:
Bsp:gegeben: GG Rg
du machst:
| R g
------------
G| GR Gg
|
G| GR Gg
...also alles mit allem kreuzen.
So wuerdest du GR Gg GR Gg erhalten.
In Kleinbuchstaben ist das: gr gg gr gg
Du siehst, dass gr und gg jeweils doppelt auftreten, also fasst du zusammen: 2gr 2gg
(die Reihenfolge ergibt sich aus dem ersten Auftreten der jeweiligen Kombination).
anderes Beispiel:
RR gg
1. Mendel.G.:
Uniformitaetsgesetz: alle sind gleich
| g g
------------
R| Rg Rg
|
R| Rg Rg
dann noch mal kombinieren:
| R g
------------
R| RR Rg
|
g| gR gg
hier erhaelst du also: RR Rg gR gg
die Großbuchstaben entfernen: rr rr rr gg
(bei Rg ist R dominant und du sollst hier ja nur die dominante Farbe anschreiben )
zusammenfassen: 3rr gg
Hoffe, das hilft etwas
danke vench,
es ist ja so einfach, nur war ich schon von den ganzen buchstaben sehr verwirrt, nochmals danke
als ergebnis hab ich z.b.
bb bb gr bb
wie mach programmiere ich das, dass
3 bb gr
ausgegeben wird?
hi leute
noch ne frage zur dominanz!
also wenn ich z.b. "RR gg" als eingabe habe dann bekomme ich aber nur
RR RR RR RR --> rr rr rr rr (nach umwandlung in kleinbuchstaben)
--> "4rr" heraus, oder? sobald eine farbe dominant ist und die andere intermediär gibts als lösung nur die dominante?!
wie programmier ich denn das am besten?
mfG Shinobi
wie programmier ich denn das am besten?
schau mal auf http://www.kiesler.at/article42.html
hi leute
noch ne frage zur dominanz!
[...]
mfG Shinobi
wie Vench geschrieben hat:
bei einer eingabe von Grundfarben z.B: RR gg treten 1. und 2. mendelsches gesetz in Kaft.
Werden nur die reinen Grundfarben rot, blau oder gelb eingegeben, müssen Sie sowohl das 1. als auch das 2. Mendelsche Gesetz anwenden; d.h. Sie kombinieren zuerst die Eingabe richtig, und kombinieren von den vier (gleichen) erhaltenen Blumen wiederum zwei miteinander (2. Mendelsches G.) (und zwar die erste und zweite Wunderblume!). Das Ergebnis soll(en) nur die Blume(n) nach Anwendung beider Gesetze sein! Weiters schreiben Sie "1 2" fuer 1. und 2. Mendelsches Gesetz.
also RR gg -> Rg Rg Rg Rg -> 1. und 2. Blume kombinieren -> Rg Rg wieder kombinieren -> RR Rg gR gg -> wegen dominanz -> rr rr rr gg -> 3rr rg 1 2 d
auf kiesler.at wurde leider nur das Runde 1 Wunderblumen Beispiel behandelt. Hier gehts um runde 3, das sich schon ein wenig davon unterscheidet.
Ich habe auch dieses beispiel und bin schon fast fertig damit. Was mir aber noch fehlt: derzeit habe ich noch beispielsweise so eine ausgabe: rr rr rr gg oder rr rg gr gg. Wie mach ich das, damit ich 3rr gg und rr 2rg gg erhalte? Vielleicht kann mir ja wer auf die Sprünge helfen, danke!
das heißt, wenn ich nur die grundfarben R, G, B eingabe kommt mendel 1 2.
aber welche sinn hat dann die ganze dominanz? ich dachte wenn ich folgendes eingabe: RR gg
ist die lösung: RR RR RR RR weil das dominante R das g überlagert.
aber es kommt Rg Rg Rg Rg raus? dann spielt die dominanz keine rolle, oder?
das spielt die eingabe von großbuchstaben da nur eine rolle bei der überprüfung ob die eingabe richtig ist und nicht bei der kreuzung. da bleibt doch alles gleich, oder?
thx
@Shinobi: Was genau ist deine Frage?
Meinst du die Schreibweise beim Zwischenergebnis zwischen 1. und 2. mal kreuzen?
ich dachte wenn ich folgendes eingabe: RR gg
ist die lösung: RR RR RR RR weil das dominante R das g überlagert.
(1) hier waere das Ergebnis: rr rr rr rr (also in Kleinbuchstaben); ist aber eh egal, da:
(2) man soll ja nur das Endergebnis/die Ausgabe in lauter Kleinguchstaben anschreiben. vergl:
Bei der Ausgabe nach einem dominantem Erbgang sollen nun die Buchstabenkombinationen, die noch dominante Farben (d.h. Großbuchstaben) enthalten, in die entsprechenden richtigen Kleinbuchstabenkombinationen umgewandelt werden. (z. B.: BG -> bg, Rb -> rr, Gg -> gg, Br -> bb). Daher kreuzt du beim 2.Mal so, als wäre deine Angabe Rg Rg gewesen und wandelst erst dieses Ergebnis in lauter Kleinbuchstaben um.
Hoffe, die Frage richtig verstanden zu haben
die frage war zwar etwas anders gemeint, aber jetzt versteh ich das mit der dominanz endlich. hab immer einen denkfehler dabei begangen.
also wenn ich "RR rb" eingebe, dann kommt Rr Rb Rr Rb heraus und dann wird wegen der dominanz alles wo ein großes "R" enthalten ist zu "rr rr rr rr"
nur wie ich die ausgabe mit diesem "4rr" machen soll weiß ich noch nicht...
mfG Shinobi
oh mann ich checks trotzdem nicht so wirklich!
ich weiß zwar wie die vererbung funktioniert aber es gibt da ja so viele verschiedene fälle die man beachten muss.
Eingabe: Rr gg
Ergebnis: RR Rg gR gg --> rr 2gr gg 1 2 d
oder: Rr Gg
Ergebnis: RR Rg GR Gg --> 2rr gr gg 1 2 d
wenn die dominanz nur einmal vorkommen kann wäre es ja einfacher aber bei so vielen möglichkeiten blick ich nicht durch wie ich das programmieren soll. jeden einzelnen fall in eine if-anweisung zu setzen ist doch keine lösung!?
oder mache ich einen denkfehler und stelle mir das ganze zu kompliziert vor?
bitte kann mir einer ne hilfe geben sonst zuck ich aus...
thx
auf kiesler.at wurde leider nur das Runde 1 Wunderblumen Beispiel behandelt. Hier gehts um runde 3, das sich schon ein wenig davon unterscheidet.
Da gibt's mehrere Varianten davon? Hmmm. Man lernt nie aus... :-)
ich weiß zwar wie die vererbung funktioniert aber es gibt da ja so viele verschiedene fälle die man beachten muss.
Eingabe: Rr gg
Ergebnis: RR Rg gR gg --> rr 2gr gg 1 2 d
oder: Rr Gg
Ergebnis: RR Rg GR Gg --> 2rr gr gg 1 2 d
Rr gg --> wird zu Rg Rg rg rg (davon nur die ersten 2. wunderblumen wieder miteinander kreuzen) --> RR Rg gR gg das ist dann --> rr rr rr gg also ist die ausgabe --> 3 rr gg 1 2 d
wie ich das mit dem zusammenfassen bei der endausgabe mache, weiß ich auch nicht,
das problem ist dabei das z.b. rb gleich br usw. ist
Paulchen
04-01-2005, 12:59
du kannst ja die buchstaben in jedem wort sortieren, sodass aus rb auch br wird
und dann brauchst du nur mehr zählen, wie oft welches wort vorkommt
du kannst ja die buchstaben in jedem wort sortieren, sodass aus rb auch br wird
und dann brauchst du nur mehr zählen, wie oft welches wort vorkommt wie programmiert man das im java? hab schon viel herumprobiert bin aber leider noch nicht dahinter gekommen
Paulchen
04-01-2005, 15:48
Nehmen wir an, wir haben ein String-Array Worte, in welchem die einzelnen Ergebnisse der Kreuzung gespeichert sind. Wir wollen nun, dass durch die folgende Zeile die Buchstaben in jedem einzelnen Wort aufsteigend sortiert werden:
sort(Worte);
Diese Methode sort macht nun nichts anderes als dass es in einer for-Schleife die einzelnen Worte durchgeht, jeweils in ein Character-Array zerlegt, dieses Array durch den Aufruf einer weiteren Methode sortiert, und das Ergebnis dann wieder als String im Array speichert:
private void sort(String[] Worte) {
for(int a=0; a<Worte.length; a++) {
char[] Wort = Worte[a].toCharArray();
sort(Wort);
Worte[a] = new String(Wort);
}
}
Die Methode sort, welche hier aufgerufen wird, unterscheidet sich von dieser in dem Punkt, dass sie als Argument kein String-Array, sondern ein Character-Array erhält; diese Methode soll die Elemente des übergebenen Character-Arrays aufsteigend sortieren, hier soll sie den bekannten BubbleSort-Algorithmus verwenden (ist nicht der schnellste, aber der anschaulichste), zu finden auf http://de.wikipedia.org/wiki/BubbleSort:
private void sort(char[] Wort) {
for(int a=0; a<Wort.length-1; a++)
for(int b=0; b<Wort.length-a-1; b++)
if(Wort[b] > Wort[b+1]) {
char austausch = Wort[b];
Wort[b] = Wort[b+1];
Wort[b+1] = austausch;
}
}
Wird absteigende Sortierung gewünscht, so ist
if(Wort[b] > Wort[b+1])
durch
if(Wort[b] < Wort[b+1])
zu ersetzen.
Nun ist das Programm einmal in der Lage, die Buchstaben in den Worten aufsteigend zu sortieren. Weiters gewünscht ist jedoch, dass gleiche Buchstabenfolgen zusammengefasst werden und nur einmal, gefolgt von der Anzahl des Auftretens, ausgegeben werden.
Wir könnten nun zwei Arrays definieren; eines speichert die vorkommenden Worte, und eines speichert die Häufigkeit, mit der diese Worte auftreten. Es wäre hier jedoch von Vorteil, wenn man leicht überprüfen könnte, ob in der Liste ein bestimmtes Element bereits enthalten ist. Außerdem wissen wir ja anfangs nicht, wie viele unterschiedliche Worte es gibt; freilich könnten wir als Obergrenze die Anzahl der Worte insgesamt annehmen, aber das halte ich nicht für elegant. Also ist so etwas wie ein dynamisch wachsendes Array gefragt, also die viel gepriesene ArrayList.
Für deren Einsatz muss einmal die entsprechende Klasse importiert werden:
import java.util.ArrayList;
Dann machen wir uns, nachdem wir mit
sort(Worte);
sortiert haben, daran, zwei ArrayLists zu definieren:
ArrayList<Integer> Anzahlen=new ArrayList<Integer>();
ArrayList<String> VorkommendeWorte=new ArrayList<String>();
Die zweite soll speichern, welche Worte vorkommen, und die erste, wie oft diese vorkommen.
Gehen wir also das Array Worte durch:
for(int a=0;a<Worte.length;a++) {
if(!VorkommendeWorte.contains(Worte[a])) {
VorkommendeWorte.add(Worte[a]);
Anzahlen.add(1);
} else
Anzahlen.set(VorkommendeWorte.indexOf(Worte[a]),Anzahlen.get(VorkommendeWorte.indexOf(Worte[a]))+1);
}
Hier wird jedes Wort im Array behandelt; ist es noch nicht in VorkommendeWorte enthalten, wird es hinzugefügt, die entsprechende Anzahl wird auf 1 gesetzt. Ist es schon enthalten, so wird die entsprechende Anzahl um 1 erhöht.
Haben wir das geschafft, fehlt noch die Ausgabe:
for(int a=0;a<VorkommendeWorte.size();a++) {
if(Anzahlen.get(a)>1) EprogIO.print(Anzahlen.get(a)+" ");
EprogIO.print(VorkommendeWorte.get(a));
if(a<VorkommendeWorte.size()-1) EprogIO.print(" ");
}
EprogIO.println();
Hier wird jedes Wort ausgegeben, welches sich in VorkommendeWorte befindet; ist die Anzahl größer als 1, wird diese ausgegeben, ansonsten nicht.
Abgeschlossen wird die Ausgabe schließlich nicht mit einem Leerzeichen, sondern mit einem Zeilenumbruch.
Ein vollständiges Programm, welches alle hier geschilderten Verfahren beinhaltet und deren Funktion zeigt, könnte wie folgt aussehen:
import eprog.*;
import java.util.ArrayList;
public class sort {
public static void main(String[] args) {
String[] Worte={"rg", "gr", "rr"};
sort(Worte);
ArrayList<Integer> Anzahlen=new ArrayList<Integer>();
ArrayList<String> VorkommendeWorte=new ArrayList<String>();
for(int a=0;a<Worte.length;a++) {
if(!VorkommendeWorte.contains(Worte[a])) {
VorkommendeWorte.add(Worte[a]);
Anzahlen.add(1);
} else
Anzahlen.set(VorkommendeWorte.indexOf(Worte[a]),Anzahlen.get(VorkommendeWorte.indexOf(Worte[a]))+1);
}
for(int a=0;a<VorkommendeWorte.size();a++) {
EprogIO.print(Anzahlen.get(a)==1?"":Anzahlen.get(a)+" ");
EprogIO.print(VorkommendeWorte.get(a));
if(a<VorkommendeWorte.size()-1) EprogIO.print(" ");
}
EprogIO.println();
}
private static void sort(String[] Worte) {
for(int a=0;a<Worte.length;a++) {
char[] Wort=Worte[a].toCharArray();
sort(Wort);
Worte[a]=new String(Wort);
}
}
private static void sort(char[] Wort) {
for(int a=0;a<Wort.length-1;a++)
for(int b=0;b<Wort.length-a-1;b++)
if(Wort[b]>Wort[b+1]) {
char austausch=Wort[b];
Wort[b]=Wort[b+1];
Wort[b+1]=austausch;
}
}
}
wow danke Paulchen! :thumb:
werd das morgen durchackern
Nehmen wir an, wir haben ein String-Array Worte, in welchem die einzelnen Ergebnisse der Kreuzung gespeichert sind. Wir wollen nun, dass durch die folgende Zeile die Buchstaben in jedem einzelnen Wort aufsteigend sortiert werden:
Cooles Ding! Ich hab Dir auf meiner Site Autor-Rechte gegeben, wenn Du magst kannst Du das ganze auf Control Panel - Site Content - Article Manager als neuen Artikel reinklopfen. Konserviert für die Ewigkeit, quasi :-)
Schreib vielleicht auch noch einen Absatz "Über den Autor" dazu...
@paulchen
die lösung sieht ja sehr gut aus, aber ich bekomme viele fehlermeldungen weil er z.b. der ".add(1)" nicht kennt und ähnliches...
vielleicht kann noch jemand anders seinen lösungscode, oder wenigstens ausschnitte davon posten. das programm funzt bei mir jetzt super, bis auf die ausgabe halt.
die idee hinter der lösung ist sehr gut! oder gibts noch andere vorschläge?
bin für alles offen und will das programm endlich abgeben und finishen.
greets shinobi
@paulchen
die lösung sieht ja sehr gut aus, aber ich bekomme viele fehlermeldungen weil er z.b. der ".add(1)" nicht kennt und ähnliches...
vielleicht kann noch jemand anders seinen lösungscode, oder wenigstens ausschnitte davon posten. das programm funzt bei mir jetzt super, bis auf die ausgabe halt.
die idee hinter der lösung ist sehr gut! oder gibts noch andere vorschläge?
bin für alles offen und will das programm endlich abgeben und finishen.
greets shinobi
bei mir genauso
die lösung sieht ja sehr gut aus, aber ich bekomme viele fehlermeldungen weil er z.b. der ".add(1)" nicht kennt und ähnliches...
Welches JDK verwendest Du? Die Lösung von paulchen setzt JDK 1.5 voraus bzw. die "Adding Generics" extension (=die Beta-Version davon). Und: Was ist denn die genaue Meldung?
Imho sollte das schon so funktionieren.
Paulchen
06-01-2005, 10:52
Bei mir funktioniert es jedenfalls (JDK 1.5).
Wenn man ein JDK hat, das noch keine Generics unterstützt, muss man entweder auf eines umsteigen, welches das kann, oder man muss den Code ein wenig umschreiben:
So schreibt man dann statt
ArrayList<String> VorkommendeWorte=new ArrayList<String>();
kurz
ArrayList VorkommendeWorte=new ArrayList();
Allerdings ist dann beim Kompilieren keine Überprüfung auf korrekte Daten-/Objekttypen möglich; die ArrayList speichert dann einfach Objekte vom Typ Object, die beim Abrufen entsprechend gecastet werden müssen:
String irgendwas=(String)VorkommendeWorte.get(a);
Verzichtet man allerdings unter 1.5 auf die Verwendung von Generics, so gibt der Compiler eine entsprechende Warnmeldung aus; dazu sollte es schon zwei Threads in diesem Forum geben (Suchfunktion).
Ich habe in meinem Code die für 1.5 einwandfrei verwendbare Version gewählt, da ich einerseits mit 1.5 arbeite und andererseits 1.5 von der EPROG-Leitung vorgeschlagen wird.
also leute ich bin auf ne andere lösung gestossen und die scheint mir um einiges einfacher als die von paulchen.
aber nix gegen paulchen! die lösung is auch ne gute variante.
checkt mal den link
http://www.java-forum.org/de/viewtopic.php?p=68625
die ausgabe ist zwar nicht ganz perfekt aber die äderungen sind minimal.
das array setzt aber voraus das man die 4 blumen schon alphabetisch geordnet hat (also gb --> bg, rg --> gr, ...)
das habe ich mittels charAt() gelöst
if (Var.charAt(0) > Var.charAt(1))
{
Var = Var.substring(1,2) + Var.substring(0,1);
}
also wenn der 1. buchstabe kleiner als der 2. ist dann einfach vertauschen...
meine lösung sieht wie folgt aus:
Arrays.sort(Endausgabe);
String Blume = Endausgabe[1];
int Anzahl = 1;
for( int i = 2; i < Endausgabe.length; i++)
{
if( Endausgabe[i].equals(Blume))
{
Anzahl++;
}
else
{
if (Anzahl == 1)
EprogIO.print(Blume + " ");
else
EprogIO.print(Anzahl + Blume + " ");
Blume = Endausgabe[i];
Anzahl = 1;
}
}
if (Anzahl == 1)
EprogIO.print(Blume + " ");
else
EprogIO.print(Anzahl + Blume + " ");
EprogIO.println(Endausgabe[0]);
ich fange erst ab dem array[1] zu zählen an weil das array auch beihnaltet ob es " 1 2 d" , "2 i"... ist.
wer das nicht will setzt einfach String Blume = Endausgabe[0] und i = 1 !!!
hoffe ihr könnt damit was anfangen
lg shinobi
nach dem alphabetischen sortieren hab ichs etwas anders gemacht
In der folgenden Schleifenkonstruktion werden die bereits nach dem Alphabet sortierten Blumen miteinander
* verglichen. Die 1. mit der 2., dann 1 mit 3, 1 mit 4,
* 2 mit 3, 2 mit 4 und 3 mit 4. Bei gleichen Blumen wird
* die Anzahl inkrementiert und die flag im Array auf true
* gesetzt. Bei der Ausgabe von einzelnen Blumen wird dann
* mittels der flag ueberprueft, ob die ausgegeben wird,
* oder nicht.
*/
String[] outArray = new String[5];
outArray[0] = sort1;
outArray[1] = sort2;
outArray[2] = sort3;
outArray[3] = sort4;
int Anzahl = 1; // Anzahl gleicher Blumen
// flag Kennzeichnetin einem Array, welche Blume nicht mehr auszugeben ist
boolean[] flag = new boolean[5];
int j = 1;
for (int i = 0; i < 4; i++)
{
for (j = 1; j < 5; j++)
{
if (i < j && outArray[i].equals(outArray[j]))
{
Anzahl++;
flag[j] = true;
}
} // End of inner for
if (Anzahl > 1)
{
EprogIO.print(Anzahl + outArray[i] + " ");
Anzahl = 1;
} else {
if(!flag[i])
{
EprogIO.print(outArray[i] + " ");
}
}
} // End of outer for
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.