Problem mit switch case
-
SpiGAndromeda schrieb:
ok danke ich werd das gleich mal umsetzten...
ich wollte mal noch wissen, ob es möglich ist, dass zu verkürzen,Sicher. Du könntest damit angangen, daß Du erzählst, wie Du auf die Zahlen kommst. Vielleicht gibt es einen einfacheren Weg.
Und dann schreib mal alle Möglichkeiten geordnet auf in der Art
25 25 25 -> 18
25 25 26 -> 14
...
-
OK
das ganze Programm ist zu übersetzen von DNA und RNA Sequenzen in Aminosäuresequenzen. Dazu wird eine Eingabe getätigt, die aber hier nicht weiter von belang ist. Nur so viel....das ganze ist dann eine Sequenz ohne Leerzeichen.
Insegsamet gibt es ja 20 Aminosäuren + Start und Stopp die codiert werden könne. Sprich es gibt 22 "Aminosäuren" die rauskommen können. Allerdings gibt es 64 anordnungsmöglichkeiten für die Basen A,C,G,U. Daher und da es bisher keinen mathematischen Algorithmus gibt der mir bekannt wäre hielt ich eine switch-case Schleife für am sinnvollsten: hier noch einmal der Quelltext der gesamten Mehtoden damit ihr euch ein Bild machen könnt.Her werden Variablen definiert, die ich die ganze Methode über brauch und es wird ermittelt wie viele Tripletts im String sind, also wie oft die switch-case Anweisung durchlaufen werden muss.
wxString Teilstring, AS_String (wxT("00")); long int Gewicht; int Beginn=0; unsigned int durchlaeufe=itsSequenz.Length()/3;
Hier beginnt dann die for-Schleife und ich die 4 Basen wandle ich in Zahlen um, weil die switch-case Anweisung ja nur mit diesen arbeiten kann und danach wandle ich die Strings noch in long int um
for (unsigned int durchlauf=0; durchlauf<durchlaeufe; durchlauf++) { wxString Triplett_aktuell; Triplett_aktuell=itsSequenz.Mid(Beginn, 3); Triplett_aktuell.Replace("A", "25", true); Triplett_aktuell.Replace("C", "26", true); Triplett_aktuell.Replace("G", "27", true); Triplett_aktuell.Replace("U", "28", true); wxString Base1, Base2, Base3; long int Base1_Zahl, Base2_Zahl, Base3_Zahl; Base1=Triplett_aktuell.Mid(0,2); Base1.ToLong(&Base1_Zahl); Base2=Triplett_aktuell.Mid(2,2); Base2.ToLong(&Base2_Zahl); Base3=Triplett_aktuell.Mid(4,2); Base3.ToLong(&Base3_Zahl);
Hier ist dann die schon bekannte switch-case Anweisung
switch (Base1_Zahl) { case 25: switch (Base2_Zahl) { case 25: switch (Base3_Zahl) { case 25 | 27: AS_String="18"; break; case 26 | 28: AS_String="14"; break; }break; case 26: AS_String="11"; break; case 27: switch (Base3_Zahl) { case 25 | 27: AS_String="19"; break; case 26 | 28: AS_String="10"; break; }break; case 28: switch (Base3_Zahl) { case 25 | 26 | 28: AS_String="05"; break; case 27: AS_String="13"; break; }break; }break; case 26: switch (Base2_Zahl) { case 25: switch (Base3_Zahl) { case 25 | 27: AS_String="17"; break; case 26 | 28: AS_String="20"; break; }break; case 26: AS_String="06"; break; case 27: AS_String="19"; break; case 28: AS_String="04"; break; }break; case 27: switch (Base2_Zahl) { case 25: switch (Base3_Zahl) { case 25 | 27: AS_String="15"; break; case 26 | 28: AS_String="16"; break; }break; case 26: AS_String="02"; break; case 27: AS_String="01"; break; case 28: switch (Base3_Zahl) { case 25 | 26 | 28: AS_String="03"; break; case 27: AS_String="22"; break; }break; }break; case 28: switch (Base2_Zahl) { case 25: switch (Base3_Zahl) { case 25 | 27: AS_String="11"; break; case 26 | 28: AS_String="22"; break; }break; case 26: AS_String="10"; break; case 27: switch (Base3_Zahl) { case 25: AS_String="21"; break; case 26 | 28: AS_String="12"; break; case 27: AS_String="09"; break; }break; }break; }
die Zahlen von 1 bis 22 sind dabei die Aminosäure. Das wird dann noch in einer anderen Methode decodiert.
Zum Schluss wird das Triplett aus dem Eingabestring noch durch den Code der Aminosäure ersetzt.
Beginn+=2; Triplett_aktuell.Replace("25", "A", true); Triplett_aktuell.Replace("26", "C", true); Triplett_aktuell.Replace("27", "G", true); Triplett_aktuell.Replace("28", "U", true); itsSequenz.Replace(Triplett_aktuell, AS_String, false); }
die Schleife wird so oft durchleufen, bis nur noch codierte Aminosäuren enthalten sind.
-
Zu den Switches:
Da es nur 64 Möglichkeiten gibt, reicht eigentlich ein Array aus. Den Index bestimmt du indem du A, C, G und U als 0, 1, 2 und 3 darstellst und dann die zweite Stelle mit 4 und die dritte mit 16 mal nimmst.
-
moment
das raff ich nicht ganz
-
SpiGAndromeda schrieb:
das raff ich nicht ganz
Du sollst eine Look-Up-Table verwenden ... http://de.wikipedia.org/wiki/Lookup-Tabelle ... dann müsste es aber auch mit einem Dictionary funktionieren
allerdings habe ich noch nicht ganz verstanden wie die Aminodinges codiert werden
-
das mit den dictionarys hört sich gut an....ich hab aber leider keine Anhnung wie ich sowas umsetze und ich hab auch nen wenig gegooglet und bin da leider auch nicht schlau draus geworden.
wäre schön, wenn mir jemand das mal erklären könnte, oder zumindest ne URL wo mans nachschaun kann
-
Schreibe doch mal die Zuordnung von allen 20 Triplets zu Aminosaeuren als Tabelle auf.
-
Hier?
es sind 64 Tripletts und die werden 20 Aminosäuren zugeordnet.
AUU 05
AUC 05
AUA 05
AUG 13
ACU 11
ACC 11
ACA 11
ACG 11
AAU 14
AAC 14
AAA 18
AAG 18
AGU 10
AGC 10
AGA 19
AGG 19
GUU 03
GUC 03
GUA 03
GUG 22
GCU 02
GCC 02
GCA 02
GCG 02
GAU 16
GAC 16
GAA 15
GAG 15
GGU 01
GGC 01
GGA 01
GGG 01
UUU 07
UUC 07
UUA 04
UUG 04
UCU 10
UCC 10
UCA 10
UCG 10
UAU 08
UAC 08
UAA 21
UAG 21
UGU 12
UGC 12
UGA 21
UGG 09
CUU 04
CUC 04
CUA 04
CUG 04
CCU 06
CCC 06
CCA 06
CCG 06
CAU 20
CAC 20
CAA 17
CAG 17
CGU 19
CGC 19
CGA 19
CGG 1901 Gly Glycin
02 Ala Alanin
03 Val Valin
04 Leu Leucin
05 Ile Isoleucin
06 Pro Prolin
07 Phe Phenylalanin
08 Tyr Tyrosin
09 Trp Tryptophan
10 Ser Serin
11 Thr Threonin
12 Cys Cystein
13 Met Methionin
14 Asn Asparagin
15 Glu Glutamin
16 Asp Asparaginsäure
17 Gln Glutaminsäure
18 Lys Lysin
19 Arg Arginin
20 His Histidin21 Stopp
22 StartDasss ich das in Zahlen codiert habe, hat die bewandnis, dass ich anderen Funktionen die Zahlen in Ein - und Dreibuchstabenform und in die Trivalnamen decodiere. Also die Zahlen so lassen am besten.
-
In C# gibt es bereits eine Klasse, in der du diese Zuordnung abspeichern kannst, siehe hier z.B.: http://dotnetperls.com/dictionary-keys . Du erstellst also ein Dictionaryobjekt und speicherst die Zuordnung wie folgt:
d.Add("AUU",5) d.Add("AUC",5) ...
Dann kannst du die zugehoerige Aminosaeure mittels
amino = d["AUU"]
Das Beispiel bezieht sich aber auf die Programmiersprache C# und nicht auf C++/CLI. Aber aehnliche Container sind hier auch vorgefertigt. In C++ heisst der Container map. Wie es bei dem Mischmasch C++/CLI ausschaut, weiss ich aber nicht.
-
Zwischen C# und C++/CLI gibts bezüglich der verwendbaren Typen aus dem Framework keine Unterschiede.
Also benutze einfach System::Collections::Generic::Dictionary<..>
Hier ist die Doku dazu: http://msdn.microsoft.com/en-us/library/xfhwa508.aspxSimon