Hilfe bei Buchstabenhäufigkeit



  • Also mit fgets() ist die Eingabe noch leichter, und vor allem ist sie nicht kaputt.



  • Ich würd einfach alle ASCII Zeichen einmal überprüfen:

    int charcount(char const* str, char chr)
    {
        int c = 0;
        while( *str )  {
            if(*str == chr) 
                ++c;
        }
        return c;
    }
    
    bool vergleich(char const * str1, char const * str2)
    {
        for(int i=1; i<128; ++i) {
            if(charcount(str1, i) !=  charcount(str2, i) )
                return 0;    
        }
        return 1;
    }
    


  • @timer:

    oh, sorry, ich hab vergessen die Zeile

    if (zeile1[i] = zeile1_Vorkommen[])
    

    rauszulöschen, das war nur ein Versuch. Auch in der Deklaration soll die Zweite Zeile natürlich zeile2 heißen, statt 2x zeile1



  • @FireFlow, Craw, TactX

    Vielen Dank auch für euere Antworten.

    Ich hab mich glaube ich etwas schlecht ausgedrückt in der Problemstellung: Es geht nicht darum, dass die Strings komplett gleich sein sollen, sondern dass jeder Buchstabe gleich oft vorkommt, sprich auch Permutationen sind zulässig: Die beiden Strings "Helm" und "Lehm" sollten also z.B. auch akzeptiert werden...



  • @Craw

    Kann es sein das zu mit deiner Aussage
    Zitat:
    Ausgabe: "Ja", falls in den beiden Sätzen jeder Buchstabe genau gleich oft vorkommt und sonst kein weiterer Buchstabe vorkommt

    meinst ob die String gleich sind? Wenn ja geht das ganze viel leichter

    Nein, komplett gleich müssen sie nicht zwingend sein. Es können auch Permutationen sein



  • andi234 schrieb:

    Ich hab mich glaube ich etwas schlecht ausgedrückt in der Problemstellung: Es geht nicht darum, dass die Strings komplett gleich sein sollen, sondern dass jeder Buchstabe gleich oft vorkommt, sprich auch Permutationen sind zulässig: Die beiden Strings "Helm" und "Lehm" sollten also z.B. auch akzeptiert werden...

    na, dann muss man nur buchstaben zaehlen:

    int chars[256]={0};
    for(int i=0; i<length; ++i)
    {
      chars[string[i]]++;
    }
    

    damit kannst du mal alle zeichen zaehlen.

    dass fuer beide strings und dann die beiden chars-arrays vergleichen 🙂

    ist jetzt natuerlich nicht ganz optimiert, weil bei dir ja nicht alle 256 ascii zeichen vorkommen werden, aber ne simple und schnelle loesung ist's trotzdem 🙂



  • Übrigens solltest du dich für diese Aufgabe entscheiden, ob du mit char-Arrays (char zeile[300];) oder char-Zeigern (char*zeile=malloc(300);...free(zeile);) arbeitest - du deklarierst dein Variable aktuell als "Array von char-Zeigern".



  • @Shade Of Mine

    Aber soweit ich Deinen Quellcode verstehe sagt mir der doch nur ob die beiden Strings gleich viele Buchtaben haben und nicht ob sie auch gleich viele As, Bs, Cs usw. haben, oder?



  • andi234 schrieb:

    @Shade Of Mine

    Aber soweit ich Deinen Quellcode verstehe sagt mir der doch nur ob die beiden Strings gleich viele Buchtaben haben und nicht ob sie auch gleich viele As, Bs, Cs usw. haben, oder?

    Der Code von ihm sagt dir nur die Häufigkeiten der Auftretenden ASCII Zeichen in einem String.

    Du kannst das auch umschreiben, vielleicht siehst dus dann besser.

    int chars[256]={0};
    int idx;
    for(int i=0; i<length; ++i)
    {
    idx = string[i]; 
    chars[idx] = chars[idx]+1;
    }
    


  • So, habs jetzt hingekriegt. Vielen Dank für euere Hilfe!!

    int main() { 
    
        int i = 0;
        int x = 0;
        char zeile1[300];
        char zeile2[300];
        char buchstaben_z1[95];
        char buchstaben_z2[95];
    
        for (i = 0; i < 95; i++){
    	    buchstaben_z1[i] = 0;
    	    buchstaben_z2[i] = 0;
        }
    
        printf("Bitte 1. Zeile eingeben:");
        i = 0;
        /*Zeile 1 einlesen*/
        do{
    	    zeile1[i]=getchar();
    	    x = zeile1[i]-32;
    	    if (x < 0 || x > 94){
    		   break;
    	    }
    	    buchstaben_z1[x]++;
    	    i++;
    
        } while(1);
    
        printf("\nBitte 2.Zeile eingeben: ");
        i = 0;
        /*Zeile 2 einlesen*/
        do{
    	   zeile2[i] = getchar();
    	    x = zeile2[i]-32;
    	    if (x < 0 || x > 94){
    		   break;
    	    }
    	    buchstaben_z2[x]++;
    	    i++;
        }while(1);
    
        //Vergleich
        for ( i = 0; i < 95; i++)
        {
    	    printf("%d %d\n", buchstaben_z1[i], buchstaben_z2[i]);
    	    if (buchstaben_z1[i] != buchstaben_z2[i])
    	    {
    		    printf("Nein");
    		    exit(0);
    	    }
        }
    
        printf("Ja");
        return 0;
    }
    

Anmelden zum Antworten