Überprüfen ob Eingabe binär ist



  • Habe das Ganze zu einer for-Schleife umgewandelt:

    for(int i=10; bzahl%i==(0||1); i*=10){
            if(bzahl%i==(0||1)){
                bzahl/=10;
                printf("%i\n",bzahl);
                ist_bzahl=true;
            }else{
                ist_bzahl=false;
            }
        }
    

    Problem ist jetzt, dass aus der for-Schleife gesprungen wird, sobald eine "0" kommt.

    Kann mir jemand vielleicht entgegenkommen und mir einen kleinen Ansatz geben?



  • Ohne auf den Algorithmus zu gucken:

    bzahl%i==(0||1)
    

    Huh? Großer Käse. Du willst vermutlich schreiben "wenn bzahl%i eine 0 oder eine 1 liefert", aber das geht so nicht.

    (bzahl%i==0 || bzahl%i==1)
    


  • Ich habe jetzt noch ein wenig was ausprobiert.

    Wenn ich die Zahl trennen kann mit:

    while(bzahl){
                printf("%i ", bzahl%10);   //Nur zu Kontrolle
                bzahl/=10;
        }
    

    Warum funktioniert dann folgendes nicht?

    while(bzahl){
                printf("%i ", bzahl%10);
            if(bzahl%10==0 || bzahl%10==1){
                ist_bzahl=true;
            }else{
                ist_bzahl=false;
            }
                bzahl/=10;
        }
    

    Als Beispiele gebe 11001101, 120011, 1 und 2 ein.
    Für alle Fälle außer 120011 funktiert mein Quellcode.


  • Mod

    Deine Testprozedur lässt arg zu wünschen übrig, wenn du nur diese 4 Fälle testest und das für ausreichend hältst. Probier mal beliebige Zahlen aus, die mit 1 beginnen. Das Ergebnis sollte dir einen starken Hinweis auf deinen Fehler geben.



  • if(bzahl%10 > 1)
    

    Das einzubauen kriegst du schon hin...



  • Im Zweifel gib dir mal jede Stelle einzeln auf dem Bildschirm aus und dazu was Dein Algorithmus gerade darüber denkt ob die Eingabe eine Binärzahl ist oder nicht. Teste dann damit die Zahl 120120120.



  • Ich verstehe zwar wo der Fehler liegt, aber mir fällt absolut keine Lösung ein.

    Für folgendes erhalte ich das richtige Ergebnis für alle Zahlen die nicht binär sind:

    do{
            if(bzahl%10==0 || bzahl%10==1){
                bzahl/=10;
                ist_bzahl=true;
            }else{
                ist_bzahl=false;
            }
        }while(ist_bzahl==true);
    

    Und für das hier, erhalte ich das richtige Ergebnis für alle Zahlen die binär sind:

    do{
            if(bzahl%10==0 || bzahl%10==1){
                bzahl/=10;
                ist_bzahl=true;
            }else{
                ist_bzahl=false;
            }
        }while(bzahl);
    

    Ich verzweifle echt an dieser warscheinlich richtig einfachen Aufgabe..

    Danke aber schon mal für die vielen Tipps.



  • Check mal die Schleifenbedingung.



  • Danke nochmal an alle die mir geholfen haben.

    Schlussendlich habe ich ein Ergebnis, dass die Aufgabenstellung erfüllt:

    #include <stdio.h>
    
    int main() {
        int bzahl;
        scanf("%i", &bzahl);
    
        bool ist_bzahl;
        // Hier ihr Programmcode:
        do{
            if(bzahl%10==0 || bzahl%10==1){
                bzahl/=10;
                ist_bzahl=true;
            }else{
                ist_bzahl=false;
            }
        }while(bzahl && ist_bzahl==true);
    
        printf("%i", ist_bzahl);
    }
    

    Grüße
    Tr0ubleGum



  • int bzahl = 120120120;
    bool ist_bzahl = true;
    while(bzahl)
    {
    	printf("%i ", bzahl%10);
    	if(bzahl%10 > 1)
    	{
    		ist_bzahl=false;
    		break;
    	}
    	bzahl/=10;
    }
    printf("%s", ist_bzahl ? "bin" : "nicht bin" );
    

    Und noch etwas knackiger:

    int bzahl = 120120120;
    bool ist_bzahl = true;
    while(bzahl && ist_bzahl)
    {
    	printf("%i ", bzahl%10);
    	ist_bzahl = bzahl % 10 <= 1;
    	bzahl/=10;
    }
    printf("%sbin", ist_bzahl ? "" : "nicht " );
    


  • schrittweise optimierung, toll 👍 ( 😋 )
    (haskell-)

    Prelude> reverse "1234"
    "4321"
    Prelude>
    


  • nachtfeuer schrieb:

    schrittweise optimierung, toll

    Und auch noch betrunken um halb fünf morgens...

    Ist eigentlich auch nur einer meiner von rapso reklamierten Einzeilern. 😉



  • @OP: schau dir den Trick von EOP gut an. Er setzt den Wert der Entscheidungsvariable am Anfang einmal auf true und wenn eine nicht-binäre stelle auftaucht, dann setzt er sie auf false. Es kann ihm daher gar nicht passieren, dass er aus versehen wieder von false auf true zurück stellt. Sowas in der Art wirst Du, sofern Du weiterhin mit Programmierung zu tun hast, noch häufig brauchen.



  • Ist ja eigentlich nicht wirklich ein Trick.
    tricky ist nur die geschickte Ausnutzung der Operatorenrangfolge im Schleifenkörper.



  • EOP schrieb:

    Ist ja eigentlich nicht wirklich ein Trick.

    Stimmt, wenn es mehr als einmal funktioniert, ist es eine Technik. 😉
    Und zwar offensichtlich eine, die dem OP fehlt.


Anmelden zum Antworten