Binärzaehler



  • Halli Hallo,
    ich soll einen Code schreiben, der Dezimalzahlen in Binärzahlen umrechnet.
    Soweit hat es funktioniert.
    Ich soll jetzt die Anzahl der einsen im Binäzahl rechnen.
    Ich habe mehrmals versucht, aber klappt nicht.

    #include <iostream>
    #include<cmath>
    
    using namespace std;
    int main()
    {
        int i;
        int Eingabe=0;
    
        cout<<"Geben Sie eine Zahl ein"<<endl;
        cin>>Eingabe;
    
     cout<<"Eingabe: ";
    
    
    int feld[32];
    
    
        for (i=31;i>=0;i--){
            feld[i]=Eingabe%2;
            Eingabe/=2;
        }
    
           for (i=0;i<32;i++){
    
    
    
         cout<<feld[i];}
    
    
    
    int einsen=0;
    
    while (i!=0){
        if((i%10)!=0){
           einsen++;}
    
    
    cout<<einsen<<endl;
    }
        return 0;
    }
    
    

    hat jemand vielleicht einen Vorschlag für mich.
    Ich saz lange am Programm und kann nicht weiter kommen.
    Ich werde mich auf jede Hilfe freuen.



  • bei einsen ist i 32 ( noch von Zeile 24)
    Aber warum nimmst du da die Zählvariable?

    Schau doch im feld nach



  • da hast du recht mit dem i
    Ich soll feld[i] nehmen.
    weil ich bis jetzt desie Variante kenne.
    Ich habe auch im Googl gesucht, habe keine passende Variande gefunden.



  • Ich würde mich nicht auf int = 32 Bit verlassen...

    #include <iostream>
    #include <cmath>
    #include <climits>
    [...] 
    const int bits_int = sizeof(int) * CHAR_BIT;
    int feld[bits_int];
    [...]
    

    hat aber jetzt nicht konkret mit deinem Problem zu tun...



  • @dooni

    Du könntest ja gleich in der ersten Schleife die einsen mitzählen:

    [...]
        int einsen=0;
        const int bits_int = sizeof(int) * CHAR_BIT;
        int feld[bits_int];
    
        for (int i=bits_int-1; i >= 0; i--)
        {
          int m = Eingabe % 2;
          feld[i] = m;
          if (m == 1) 
            ++einsen;
    
          Eingabe/=2;
        }
    [...]
    

    ...und eigentlich die Ausgabe der binären Zahl auch...



  • @dirkski Also ich habe es so gemacht wie du es geschrieben hast.
    Die Bitzahl wird von links nach rechts gelesen und liest die Anzahl der Einsen nicht.

    #include <cmath>
    #include <climits>
    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--)
        {   
          int m = Eingabe % 2;
          feld[i] = m;
          if (m == 1) 
            ++einsen;
    
          Eingabe/=2;
        
        
          
     
          
              cout<<feld[i];
              cout<<"Anzahl der einsen sind"<<einsen;
        
        
    }
        return 0;
    }
    
    
    


  • Also ich habe das Programm ein bisschen umgeschrieben

    
    #include<cmath>
    
    using namespace std;
    
    int main()
    
    {
    
    
    
    int einsen=0;
    
    int Eingabe=0;
    
    int i;
    
    
    
           
    
        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 zwar die Bitzahl, aber die einsen werden nicht gerechnet



  • 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.



  • 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.