Palindrome ermitteln



  • wort = wort.UpperCase() ;//ok, nur grossbuchstaben. das macht es einfacher.
    for(int a=1;a<=test;a++)
    {
      if((wort[a]<65)||(wort[a]>90))
        wort.Delete(wort[a],1);
        while(wort.Pos(' '))//möp. haust ja nur leerzeichen raus.
          {
            wort.Delete(wort.Pos(' '),1) ;
            test = wort.Length() ;
          }
      }
      for(int x=1;x<=test;x++)
        inv.Insert(wort[x],1) ;
      if(wort==inv)
        ShowMessage("Palindrom") ;
      else
        ShowMessage("Kein Palindrom") ;
    
    }
    

    hau nicht raus, was du als schrott erkennst, sondern kopiere rein, was du als gut erkennst. dann geht dir weniger schrott durch die lappen.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString ewort = edt_eingabe->Text ;
      ewort = ewort.UpperCase() ;
      int test = ewort.Length() ;
      for(int a=1;a<=test;a++)//laufen die indizes echt von 1 bis Length oder 
      {//von 0 bis Length-1?
        if((wort[a]>='A')||(wort[a]<='Z')) //besser als 65 und 90 zu lesen
          ewort+=wort[a];
      }
      AnsiString inv;
      for(int x=1;x<=test;x++)//indizes immernoch 1 bis Length?
        inv.Insert(wort[x],1) ;
      if(wort==inv)
        ShowMessage("Palindrom") ;
      else
        ShowMessage("Kein Palindrom") ;
    
    }
    


  • eigentlich habe ich gedacht hier wird einem geholfen. Zu deinem Spruch schreib nichts auf so ein niveau begebe ich mich nicht. Nur soviel, DU bist wahrscheinlich als der Programmierer überhaupt auf die Welt gekommen.

    volkard schrieb:

    hau nicht raus, was du als schrott erkennst, sondern kopiere rein, was du als gut erkennst. dann geht dir weniger schrott durch die lappen.

    Trotzdem danke für die Mühe!



  • nxer schrieb:

    eigentlich habe ich gedacht hier wird einem geholfen. Zu deinem Spruch schreib nichts auf so ein niveau begebe ich mich nicht. Nur soviel, DU bist wahrscheinlich als der Programmierer überhaupt auf die Welt gekommen.

    volkard schrieb:

    hau nicht raus, was du als schrott erkennst, sondern kopiere rein, was du als gut erkennst. dann geht dir weniger schrott durch die lappen.

    Trotzdem danke für die Mühe!

    mal nicht gleich eingeschnappt sein.
    mit "schrott" meinte ich alle nicht-buschtabe. also leerzeichen, apostropfs, punkt, komma, rufzeichen, anführungszeichen und so fort.
    diesen schrott willste ja erstmal aus deinem strinbg raushauen. du haust zur zeit nur leerzeichen raus. kannst nun das programm erweitern, daß es nicht nur leerzeichen raushaut, sondern auch apostropfs, punkt, komma, rufzeichen, anführungszeichen und so fort.
    aber das wäre doch zu aufwendig. deshalb schrieb ich: hau nicht raus, was du als schrott erkennst, sondern kopiere rein, was du als gut erkennst.
    also hau nicht alle sonderzeichen, apostropfs punkte, kommans und rufzeichen raus, sonder kopiere die guten zeichen. kopiere nur die buchstaben, dann bleibt der ganze schrott schon auf der strecke.

    und jetzt sei wieder lieb und gck dir nochmal meinen code an. der ist bestimmt nicht fehlerfrei, weil ich den wiedermal nicht getestet habe vorm abschicken. aber vielleicht hilft er die ja trotzdem.



  • OK.....sorry wegen meiner Reaktion...aber deine Antwort war für mich eindeutig zweideutig.

    Ich werde es auf jeden fall mal ausprobieren.

    Was meinst du eigentlich mit: //laufen die indizes echt von 1 bis Length oder
    {//von 0 bis Length-1?

    Trotzdem würde mich mal interessieren wieso ich die Zeichen nicht löschen kann!

    vielen dank schon mal...und nochmal SORRY



  • nxer schrieb:

    Was meinst du eigentlich mit: //laufen die indizes echt von 1 bis Length oder
    {//von 0 bis Length-1?

    in den meisten c++-dialekten ist es üblich, daß die buchstaben eines strings str von str[0] bis str[str.leghth()-1] gehen. mich würde es gelinde gesagt wundern, wen borland einen sonderweg ginge und die buchstaben von str[1] bis str[length()] hätte. dein code scheint aber davon auszugehen, daß sie von 1 bis length gehen.

    Trotzdem würde mich mal interessieren wieso ich die Zeichen nicht löschen kann!

    kannste auch, jetzt wo ich es nochmal überlege.

    dein suchen nach leerzeichen hat mich verwirrt. dachte, dann müssen man gleich auch noch nach rufzeichen, nach apostrophs und so weiter suchen. ist ja unfug.
    einfach deinen weg gehen und löschen und sogar gar nicht nach leerzeichen gucken. einfach jeden nicht-buchstaben wegmachen. sei es apostropf oder leerzeichen oder sonstewas.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString wort = edt_eingabe->Text ;
      wort = wort.UpperCase() ;
      AnsiString inv ;
      int test = wort.Length() ;
    
      for(int a=1;a<=test;a++)
      {
        if((wort[a]<65)||(wort[a]>90))
          wort.Delete(wort[a],1);
    /*      while(wort.Pos(' ')) diese schleife bringt nix (oder nicht genug)
          {
            wort.Delete(wort.Pos(' '),1) ;
            test = wort.Length() ;
          }*/ 
          test = wort.Length() ; //und das hier muss aus der while-schleife raus!
      }
      for(int x=1;x<=test;x++)
        inv.Insert(wort[x],1) ;
      if(wort==inv)
        ShowMessage("Palindrom") ;
      else
        ShowMessage("Kein Palindrom") ;
    
    }
    

    vielleicht war's das schon.



  • noch mal ich.....

    hat ich sehr logisch angehört. Doch leider funktioniert das nicht. Die leerzeichen, geschweige denn Kommata oder Apostrophs werden nicht gelöscht.
    Habe mal in einer ASCII Tabelle geschaut, dort sind auch keine leerzeichen aufgeführt.

    Habe noch mal probiert ein Komma direkt ohne Palindrom oder so zu löschen...No Chance

    Noch irgendeine idee???

    danke schon mal!



  • Hallo

    Schau dir doch in der Hilfe mal die Memberfunktionen von AnsiString an.
    Das Delete müsste in deiner Schleife so wort.Delete(a,1); aussehen. Desweiteren gibt es auch noch die schöne Funktion StringReplace. Da kannst du auch beliebige Zeichen gegen Nichts tauschen (sprich löschen). Vielleicht ist es hier besser diesen Post nach Borland C++ Builder zu verschieben.

    @volkard
    Das mit dem Laufindex ist schon richtig. Der beginnt bei AnsiString bei 1. Das liegt an der Kompatibilität zur Klasse String bei Object Pascal (die VCL besteht ja daraus).

    Ciao

    PS.
    Wenn du innerhalb einer Schleife nach Length löschen willst, solltest du besser von hinten beginnen. Sprich rückwärts durchlaufen.



  • Es funktioniert einfach nicht. Die Kommatas und Apostrophs lassen sich einfach nicht löschen, hat jemand von euch noch eine idee???

    Help....nxer



  • Mal ne ganz blöde Idee: kann es sein, dass deine Funktionen nur mit dem einfachen ASCII Zeichensatz was anfangen können? AnsiString kenn ich zwar net, hört sich aber so an. Dieser Zeichensatz nutzt lediglich 7 Bits. Dein Apostroph (schreibt man das noch so oder doch mit f) hat jedenfalls den Hexwert b4 und liegt damit ausserhalb des gültigen Bereichs. Ich nutze normalerweise den ' (hex 27) als Apostroph. Probiers einfach mal damit und guck ob's dann immer noch net geht.



  • ne hat nichts gebracht...die zeichen werden einfach nicht geloescht.
    Müsste doch eigentlich mit der ASCII abfrage funktionieren!

    Vielen dank für dein Mühe

    nxer



  • hallo.
    hab auch mal versucht, sowas zu schreiben.
    das mit komma bzw apostroph löschen klappt, in der palindrom-funktion ist ein fehler. war jetzt zu faul, mir alles durchzulesen, deshlab poste ich einfach mal das ganze programm, vielleicht könt ihr was davon gebrauchen.

    //palindrom.cpp
    
    #include <iostream.h>
    
    bool palindrom(int l, int r);
    void change(void);
    
    const int  MAX = 40;
    
    char satz[MAX];
    char satz2[MAX];
    
    int main(void)
    {
    
    int i=0;
    
    //satz füllen
    
    if(palindrom(0,MAX))
     cout << "Palindrom" << endl;
    else
    cout << "Kein Palindrom" << endl;
    
    return 0;
    };
    
    bool palindrom(int l, int r)
    {
    	if((r-l == 2) && (satz2[l] == satz2[r]))
    		return true;
    	else if(r-l < 2)
    		return true;
    	else if(satz2[l] == satz2[r])
    	{
    		palindrom(l+1,r-1);
    	}
    	else
    		return false;
    }
    
    //Leerzeichen etc. entfernen.
    void change(void)
    {
    int d = 0;
    char zeichen;
    	for(int i = 0;i < MAX; i++)
    	{
    		if(((satz[i] >= 65) && (satz[i] <= 90)) | ((satz[i] >= 97) && (satz[i] <= 122)))
    		{
    			if((satz[i] >= 97) && (satz[i] <= 122))
    				zeichen = satz[i] - 32;
    			else
    				zeichen = satz[i];
    
    			satz2[d] = zeichen;
    			d++;
    		}
    	}
    }
    


  • Ich würde das dann so machen:

    #include <iostream>
    #include <string>
    
    std::string palindrom(std::string& text)
    {
    	std::string newtext;
    	for(unsigned int i = 0; i < text.length(); i++)
    	{
    		if(isalpha(text[i]) || text[i] == ' ') // wie Windalf
    			newtext += text[i]; // wie volkard
    	}
    	return newtext;
    }
    
    int main()
    {
    	std::string text = "m%$e$i096n n52a&/m§$e §$i45.,s342t <<|/*-t§$!e458s12?=)t}}";
    	std::cout << palindrom(text);
    }
    


  • Hi Leute,

    hab mal eine Nacht drüber geschlafen, und siehe da auf einmal klappt es.

    Wen es interessiert:

    AnsiString wort = edt_eingabe->Text ;
      wort = wort.UpperCase() ;
      AnsiString inv ;
      AnsiString ewort ;
    
      for(int a=1;a<=wort.Length();a++)
      {
        if((wort[a]>='A')&&(wort[a]<='Z'))
          ewort+=wort[a];
      }
      int test = ewort.Length();
      for(int x=1;x<=test;x++)
        inv.Insert(ewort[x],1) ;
      if(ewort==inv)
        ShowMessage("Palindrom") ;
      else
        ShowMessage("Kein Palindrom") ;
    

    Vielen dank für eure hilfe

    Gruss

    nxer


Anmelden zum Antworten