Binärzaehler



  • Wieder mal mehrere Stunden Zeitverschwendung der Studenten für eine Aufgabe, die man korrekt in 30 Sekunden und 3 Zeilen lösen kann...



  • @dooni da jedesmal wenn eine 1 gefunden wird, die Ausgabe „anzahl der einsen“ kommt, ist diese Ausgabe wohl an der falschen Stelle.

    Die darf nicht kommen wenn du eine 1 gefunden hast, sondern erst dann, wenn du alle gezählt hast.



  • @out is ja gut....ich bin halt anfänger und etwas langsam...



  • Das war nicht an dich gerichtet, sondern an deinen Lehrer. Du kannst ja nichts dafür, dass er euch nur Misst beibringt.



  • @out sagte in Binärzaehler:

    Das war nicht an dich gerichtet, sondern an deinen Lehrer. Du kannst ja nichts dafür, dass er euch nur Misst beibringt.

    Warum Mist? (Wer viel miSSt, miSSt MiSt!)

    1. Das dauert mehr als 30 Sekunden, auch wenn du std::bitset meinst. Das müsste man nämlich auch erst einmal erklären bzw. die Referenz dazu durcharbeiten.
    2. Ich finde, dass es gar keine schlechte Aufgabe ist, zumal sie zeigt, wie man sowas selbst berechnen kann. Und die for-Loop wird ebenfalls gleich mitgeübt.

    Nur weil es irgendwo was fertiges gibt, ist es trotzdem gut, auch einmal selbst Dinge zu tun.



  • @wob sagte in Binärzaehler:

    @out sagte in Binärzaehler:

    Das war nicht an dich gerichtet, sondern an deinen Lehrer. Du kannst ja nichts dafür, dass er euch nur Misst beibringt.

    Warum Mist? (Wer viel miSSt, miSSt MiSt!)

    Danke 😉

    @wob sagte in Binärzaehler:

    Nur weil es irgendwo was fertiges gibt, ist es trotzdem gut, auch einmal selbst Dinge zu tun.

    An sich finde ich es auch gut, mal etwas selbst nachzubauen. Das Problem ist nur, dass den Studenten der richtige C++ Weg gar nie gezeigt wird und sie dann denken, dass das Nachbauen der C++ Weg ist. Ich hätte kein Problem mit solchen Aufgaben, wenn der Lehrer auf beide Wege einginge.



  • Endlich funktioniert das Programm
    Durch Üben kann man viel lernen
    So sieht das Programm aus

    #include<iostream>
    
    #include<cmath>
    #include <limits.h>
    
    using namespace std;
    
    int main()
    {
    	int einsen=0;
    	unsigned int Eingabe=0;
    
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        cout<<"Geben Sie eine Zahl ein: ";
        cin>>Eingabe;
        cout<<Eingabe<<":";
        for (int i=bits_int-1; i >= 0; i--)
        {
        	feld[i]=Eingabe%2;
        	Eingabe/=2;
        }
    	for(int i=0; i<bits_int;i++)
    	{
    	    cout<<feld[i] ;
    	    if (feld[i]== 1){
    
    		++einsen;}}
    		cout<<"  anzahl der einsen"<< einsen;
    
        return 0;}
    
    
    

    Ich möchte nun die Zeilen von feldi[i] und anzahl der einsen trennen
    wenn ich jetzt

     cout<<feld[i] <<endl;
    
    

    Dann zeit er das so
    0
    0
    0
    0
    .
    .
    1
    0
    0
    0
    anzahl der einsen 1



  • @dooni Dann überleg mal, warum das so ist.
    Was macht bloß das endl



  • @DirkB sagte in Binärzaehler:

    @dooni Dann überleg mal, warum das so ist.
    Was macht bloß das endl

    endl ist doch dafür, dass er eine neue Zeile anfängt



  • @dooni sagte in Binärzaehler:

    @DirkB sagte in Binärzaehler:

    @dooni Dann überleg mal, warum das so ist.
    Was macht bloß das endl

    endl ist doch dafür, dass er eine neue Zeile anfängt

    Was kannst du also machen, dass die 0 und 1 in einer Reihe kommen und dann eine neue Zeile anfängt?

    endl macht noch mehr, es gibt den Ausgabepuffer aus.
    Für eine neue Zeile reicht '\n'



  • @DirkB ok

     cout<<feld[i]<<'\n';
    
    

    das habe ich verwendet, tut daselbe



  • @dooni habs heraus bekommen



  • @dooni sagte in Binärzaehler:

    @DirkB ok

     cout<<feld[i]<<'\n';
    
    

    das habe ich verwendet, tut daselbe

    Nein, nicht dasselbe. den Unterschied bemerkst du nur nicht


  • Gesperrt

    Voll krass, Jungs. Die Aufgabenstellung "Binärzähler" ist weitaus weniger trivial, als um was es hier inzwischen geht, nämlich wie man C++ in den Griff kriegt. Made my day. 😀



  • Die Aufgabe soll jetzt erweitert werden und zwar die Bits einsetzen
    Ich habe die beiden Varianten verwendet
    val |= (1 >>n); // Setzt das n-te Bit auf 1
    val &= ~(1 >> n); //Setzt das n-te Bit auf 0 (AND NOT)
    Ich habs versucht umzusetzen, aber klappt nicht

    #include<iostream>
    #include<cmath>
    #include <limits.h>
    
    using namespace std;
    
    int main()
    {
        int einsen=0;
        unsigned int Eingabe=0;
    
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        cout<<"Geben Sie eine Zahl ein: ";
        cin>>Eingabe;
        cout<<Eingabe<<":";
        for (int i=bits_int-1; i >= 0; i--)
        {
            feld[i]=Eingabe%2;
            Eingabe/=2;
        }
        for(int i=0; i<bits_int;i++)
        {
            cout<<feld[i];
            if (feld[i]== 1){
    
            ++einsen;
            }
            }
    
            cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
         int n;
          unsigned int val;
    
        if(n>=0 || n <=31){
             cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
            cin>>n;
            if (n==0){
    val |= (1 >>n); // Setzt das n-te Bit auf 1
    
    if (n==1){
    val &= ~(1 >> n); //Setzt das n-te Bit auf 0 (AND NOT)
    
    }
    }
            cout<<"Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<<val;
    
            
    
        }
    
    
        return 0;}
    
    


  • @dooni schalte den Warnlevel bom Compiler auf Maximum.
    Beachte die Warnungen und behebe deren Ursache.

    Wofür steht n?



  • @DirkB sagte in Binärzaehler:

    schalte den Warnlevel bom Compiler auf Maximum.

    👍 !!!

    Und dann formatiere deinen Code anständig! Das sollte jeder gute C++-Editor automatisch können - und wenn nicht, dann nimm am besten clang-format. In deinem Code hat man ja überhaupt keinen Überblick, was wo aufgerufen wird.



  • @DirkB sagte in Binärzaehler:

    schalte den Warnlevel bom Compiler auf Maximum.

    n steht für die Bitnummer von 0 bis 31
    meinst du int nmax=31;
    int nmin=0;



  • Du hast doch schon alles in feld stehen. Wenn du stattdessen val nehmen möchtest, müsstest du val direkt nach dem Lesen von Eingabe initialisieren (Eingabe wird ja anschließend verändert).
    Allerdings stimmt schon deine Erklärung zum Bitsetzen/Bitlöschen nicht, da 1 jeweils um n Stellen nach links verschoben werden müsste.



  • @dooni sagte in Binärzaehler:

    n steht für die Bitnummer von 0 bis 31

    Du möchtest vielleicht gerne, dass n dafür steht, aber dein n ist uninitialisiert.

         int n;
    (...)
        if(n>=0 || n <=31){
             cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
            cin>>n;
    
    

    ist doch offensichtlich nicht richtig. Erst n vergleichen, dann n einlesen?


Anmelden zum Antworten