enthält CString Buchstabe,Zahl,Operator,...?



  • Hi Leute,
    ich nehme mal an, dass es für mein Problem eine ziemlich einfache Lösung gibt - nur ich komme nicht drauf.

    Also folgendes:
    Ich habe einen CString, nennen wir ihn mal "m_sGleichung". Der enthält nun eine Gleichung, z.b. "x5-5x2+2x-15 = 0". Ich möchte jetzt prüfen, ob ein Zeichen, ein Buchstabe, eine Zahl, ein '=,+,...' Zeichen oder eine Klammer(rund oder eckig) ist.

    Also, ich habe mir da folgendes überlegt: Vielleicht könnte man es über ASCI machen (ich weiß nur nicht wie). Ich habe nämlich keine Lust ewig viel Code zu schreiben und zu testen: ist es ein 'A', ist es ein 'B',...u.s.w.

    Ich habe mir das ungefähr so gedacht:

    for(int iIndex = 0;iIndex < m_sGleichung.GetLength();iIndex++) //m_sGleichung ist der CString
    {
    if(TestBuchstabe(m_sGleichung.GetAt(iIndex))) // Eine Funktion, die ein char übernimmt und einen boolschen Wert zurückgibt
    {
    ...
    }
    if(TestZahl(m_sGleichung.GetAt(iIndex))) // analog zu obigem
    {
    ...
    }
    if(TestOperator(m_sGleichung.GetAt(iIndex)))
    {
    ...
    }
    if(TestKlammer(m_sGleichung.GetAt(iIndex)))
    {
    ...
    }
    }
    

    Hat irgendjemand schon mal so etwas ähnliches programmiert oder eine Idee oder irgend etwas, was mir weiterhelfen könnte ?

    Vielen Dank im Voraus

    mfg takeiteasy



  • IMHO hast du die Lösung schon gepostet, nur, das du die kleinen feinen Funktionen ala TestBuchstabe... noch ausprogrammieren mußt....



  • Hallo,

    im Prinzip ist die Lösung sich ein Array anzulegen und dieses durczugehen. Ich habe mal für meine Anwendung diesen Code verwendet, vielleicht hilft er ja weiter:

    CString v_zahl = "1234567890";
    CString v_zeichen = "abcdefghijklmnopqrstuvwxyz";
    CString v_oper = "^!%&*+-#/=.,";
    CString v_formator = " ";
    CString v_klammern = "()";

    CString teststring = "x5-5x2+2x-15*(4) = 0";
    int i,j;

    for( i=0; i<=teststring.GetLength()-1; i++)
    {
    //Teste Zeichen
    for( j=0; j<=v_zeichen.GetLength(); j++)
    {
    if(teststring.GetAt(i)==v_zeichen.GetAt(j)){
    MessageBox("Zeichen");
    break;
    }
    }

    //Teste Zahl
    for(j=0;j<=v_zahl.GetLength();j++)
    {
    if(teststring.GetAt(i)==v_zahl.GetAt(j)){
    MessageBox("Zahl");
    break;
    }
    }

    //Teste Oper
    for(j=0;j<=v_oper.GetLength();j++)
    {
    if(teststring.GetAt(i)==v_oper.GetAt(j)){
    MessageBox("Operator");
    break;
    }
    }

    //Teste Formator
    for(j=0;j<=v_formator.GetLength();j++)
    {
    if(teststring.GetAt(i)==v_formator.GetAt(j)){
    MessageBox("Leerzeichen");
    break;
    }
    }

    //Teste Klammer
    for(j=0;j<=v_klammern.GetLength();j++)
    {
    if(teststring.GetAt(i)==v_klammern.GetAt(j)){
    MessageBox("Klammern");
    break;
    }
    }
    }



  • @Ocrana
    Wie siehts mit Code-Tags aus?

    ... verkürzte Ocrana-Version:

    CString v_zeichen = "abcdefghijklmnopqrstuvwxyz";
    CString v_oper = "^!%&*+-#/=.,";
    CString v_formator = " ";
    CString v_klammern = "()";
    
    CString teststring = "x^5-5x^2+2x-15*(4) = 0";
    
    for( int i=0; i<=teststring.GetLength()-1; i++)
    {
      TCHAR z = teststring[i];
      //Teste Zeichen
      if( v_zeichen.Find( z))
        MessageBox("Zeichen");
      else //Teste Zahl
      if( isdigit( z))
        MessageBox("Zahl");
      else //Teste Oper
      if( v_oper.Find( z))
        MessageBox("Operator");
      else //Teste Formator
      if( v_formator.Find( z))
        MessageBox("Leerzeichen");
      else  //Teste Klammer
      if( v_klammern.Find( z))
        MessageBox("Klammern");
    }
    

    [ Dieser Beitrag wurde am 10.12.2002 um 09:07 Uhr von RenéG editiert. ]



  • DANKE euch beiden für eure schnellen Antworten !!!!

    DANKE DANKE DANKE DANKE !!!!!!!!!!!!!!!!!!!!!!!!!!!



  • Das ist nicht ganz richtig.

    CString::Find gibt -1 zurück wenn er nix gefunden hat.

    Es muss also

    if(v_zeichen.Find(z) >= 0)
    //oder
    if(v_zeichen.Find(z) != -1)
    

    heißen.



  • Oh, sollte natürlich überall ein Ausrufezeichen vor den Finds sein!



  • Original erstellt von RenéG:
    Oh, sollte natürlich überall ein Ausrufezeichen vor den Finds sein!

    :p
    Das haut dann aber auch nicht hin! 😃



  • @Nemesyzz
    Doch, da Find 0 zurückgibt, wenn der Buchstabe gefunden wurde!



  • Original erstellt von RenéG:
    @Nemesyzz
    Doch, da Find 0 zurückgibt, wenn der Buchstabe gefunden wurde!

    Nee! 🙄
    z.B. v_zeichen, Buchstabe ist 'b' Rückgabe: 1 (c == 2, d == 3,...)



  • Uups, ich glaub, die Weihnachtsfeiern diese Woche haben doch zu sehr reingehauen *mirandieStirngreif* 😃


Anmelden zum Antworten