Binärzaehler



  • Ich habe das mal kurz bei ideone formatiert:
    https://ideone.com/E9NENw
    Der Fehler sollte dir eigentlich sofort auffallen und dir vielleicht auch zwei Dinge zeigen: Erstens Variablen immer so lokal wie möglich halten und zweitens etwas Arbeit in die Formatierung des Codes stecken.


  • Gesperrt

    Probier mal das:

    #include <iostream>
    using namespace std;
    
    void bin (unsigned n)
    {
        if (!n)
            return;
        bin (n>>1);
        putchar (n&1 ? '1' : '0');
    }
    
    int main()
    {
        bin (1);
        cout<<"\n";
        bin (2);
        cout<<"\n";
        bin (3);
        cout<<"\n";
        bin (4);
        cout<<"\n";
        bin (5);
        cout<<"\n";
        // .. und so weiter
    }
    
    


  • @yahendrik weil ich die i als variable deklariert habe,
    ich habe die int i; gelöscht

    #include<cmath>
    #include <limits.h>
     
    using namespace std;
     
    int main()
    {
    	int einsen=0;
    	int Eingabe=0;
    	
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        cout<<"Geben Sie eine Zahl ein"<<endl;
        cin>>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;
     
    }
    
    

    er zeigt jetzt diesen fehler
    main.cpp:34:12: error: ‘i’ was not declared in this scope
    if (feld[i]== 1)
    Ich bin noch einen Anfänger und lerne es gerade



  • for(int i=0; i<bits_int;i++)
    	{cout<<feld[i];} // { ist der Beginn des Schleifenkörpers, } das Ende
    
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
    }
    

    Die Überprüfung von feld[i] möchtest du aber ebenfalls in der Schleife haben. Und so konnte dir der Compiler auch helfen, den Fehler zu finden.

    for(int i=0; i<bits_int; i++)
    {
        cout<<feld[i];
    
        if(feld[i]==1)
        {
          ...
        }
    }
    

    Im Grunde könntest du natürlich auch alles mit einer Schleife machen.

    Aber tu dir selber einen Gefallen: Öffnende geschweifte Klammern können auch in der gleichen Zeile stehen (es gibt viele Leute, die das so machen), schließende geschweifte Klammern jedoch nie (siehe den Code oben).



  • @yahendrik
    jetzt habe ich die Schleife geändert

    #include <limits.h>
     
    using namespace std;
     
    int main()
    {
    	int einsen=0;
    	int Eingabe=0;
    	
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        cout<<"Geben Sie eine Zahl ein"<<endl;
        cin>>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;
     
    }
    
    
    

    Geben Sie eine Zahl ein
    4
    00.............01 anzahl der einsen100



  • Okay, ich bin raus.



  • @dooni Mach dich auf wikipedia mal über „Einrückungsstil“ schlau..

    Da suchst du dir einen aus und formatierst deinen Code entsprechend.



  • Das liegt wohl an seinem Editor, daß er Tabs und Leerzeichen gemischt hat (und einfach per C&P hier übernommen hat).

    @dooni: Das sieht aber nicht danach aus, daß du die Schleife geändert hast!?!



  • @Th69

    for(int i=0; i<bits_int;i++)
    	{
    		cout<<feld[i];
    
    	
    	if (feld[i]== 1)
    	{
    		++einsen;
    		cout<<"  anzahl der einsen"<< einsen;
    	}
    }
        return 0;
    
    }
    
    

    Die Schleife habe ich geändert, hat nichts gebracht



  • Inwiefern hat das nichts gebracht?

    Möchtest du denn jedesmal (in der Schleife) die Ausgabe haben oder nur einmalig danach?



  • @Th69 sagte in Binärzaehler:

    Inwiefern hat das nichts gebracht?

    Möchtest du denn jedesmal (in der Schleife) die Ausgabe haben oder nur einmalig danach?

    Er gibt nicht aus, was ich möchte
    Er soll die Dezimalzahl lesen und die in Binärzahl umrechnen und dann die einsen im Binärcode rechnen.
    Das wird am Bildschirm angezeigt
    Geben Sie eine Zahl ein
    4
    00.............01 anzahl der einsen100



  • @dooni Das passt zu dem, was du programmiert hast.

    Gib doch mal eine Zahl ein, die mehr als eine 1 in Binätdarstellung hat. Z.B. 15



  • @DirkB
    so zeit er es an
    000...........01 anzahl der einsen11 anzahl der einsen21 anzahl der einsen31 anzahl der einsen ist 4 und ist auch richtig, aber was er vor und dazwischen angezeigt wurde verstehe ich net.



  • 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


Anmelden zum Antworten