Problem mit switch case



  • Hi Leute,

    ich hab da mal folgenden Quelltext:

    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;
                                            }
                                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;
                                            }
                                case 28: 
                                    switch (Base3_Zahl)
                                            {
                                                case 25 | 26 | 28: AS_String="05"; break;
                                                case 27: AS_String="13"; 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;
                                            }
                                case 26: AS_String="06"; break;
                                case 27: AS_String="19"; break;
                                case 28: AS_String="04"; 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;
                                            }
                                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;
                                            }
                            }
                case 28:
                    switch (Base2_Zahl)
                            {
                                case 25: 
                                    switch (Base3_Zahl)
                                            {
                                                case 25 | 27: AS_String="11"; break;
                                                case 26 | 28: AS_String="22"; 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;
                                            }
                            }
            }
    

    also eine ziemlich große und ineinander verschachtelte switch case Anweisung.
    Durch etliches probieren und Variablen beobachten hab ich festgestellt, dass AS_String den richtigen Wert annimmt, aber grundsätzlich, auch in "case 28" von "switch (Base1_Zahl)" reingeht, obwohl die variable nicht den Wert 28 hat. In meinem speziellen Fall hat die Variable den Wert 27. Ich kann also einfach nicht erklären, warum AS_String immer auf immer 09 wird.

    Wäre schön, wenn ihr mir helfen könntet.

    mfg
    SpiGAndromeda



  • SpiGAndromeda schrieb:

    dass AS_String den richtigen Wert annimmt, aber grundsätzlich, auch in "case 28" von "switch (Base1_Zahl)" reingeht

    weil das äußere switsch keine breaks hat.



  • ok danke ich werd das gleich mal umsetzten...

    ich wollte mal noch wissen, ob es möglich ist, dass zu verkürzen, weil das meiner Meinung nach ziemlich umständlich, laufzeitaufwendig und auch irgendwie unprofessionell wirkt.



  • Hallo,

    das dürfte auch noch ziemlich falsch sein, denn du erwartest doch nicht etwa, dass die Bedingungen mit dem "|"-Operator (z.B.: 25 | 27) das bewirken, was du denkst, soll heissen,

    switch (Base3_Zahl)
                                            {
                                                case 25 | 27: AS_String="18"; break;
                                                case 26 | 28: AS_String="14"; break;
                                            }
    

    bedeutet nicht, dass der 1.Fall "angesprungen" wird, wenn Base3_Zahl 25 oder 27 ist. Üblicherweise löst man das durch ein "fall-through"-Konstrukt:

    case 25: // hier kein break, fall-through
    case 27: // hier die Anweisungen, die für beide Fälle gelten, und ein
             break;
    

    MfG,

    Probe-Nutzer



  • 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 19

    01 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 Histidin

    21 Stopp
    22 Start

    Dasss 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.aspx

    Simon


Anmelden zum Antworten