Frage zu Schleife



  • Wo kann man das den noch genauer nach lesen, so was man das auch versteht?^^



  • fragefrage schrieb:

    Wo kann man das den noch genauer nach lesen, so was man das auch versteht?^^

    Was genau denn? Also eine ASCII-Tabelle findest du überall, z.B. hier: http://www.asciitable.de/tabelle.html

    Jedes Zeichen (druckbare und nicht druckbare) entspricht einem Zahlencode in der ASCII-Tabelle, so wie die '0' eben gleich 48 ist. Ein Leerzeichen ist ne 32, wenn du auf deine ESC-Taste drückst, ist das der Code 27, ein 'A' ist die 65 usw. Du kannst das in einem Texteditor/Word/sonstwas ausprobieren: halte die ALT-Taste gedrückt und gib währenddessen eine 4 und eine 8 ein. ALT-Taste loslassen... tada! Es wird an die Cursorposition eine '0' geschrieben. In C/C++ ist die Grenze zwischen char und int ziemlich dünn (anders, als in Sprachen wie Basic), sie werden lediglich etwas anders interpretiert. Aber du kannst mit chars genauso rechnen wie mit ints, da ein char letztlich auch nur ein Ganzzahlenwert ist.
    Im Beispiel sieht es ja so aus, dass aus einem Zeichen '0', also char(48), der Wert 48 gemacht werden soll. Deshalb müssen eben 48 abgezogen werden...



  • Hi fragefrage,

    auch wenn das die Frage nicht beantwortet.... aber was ist aus dem guten, alte

    #include <iostream>
    using namespace std;
    
    int main() {
      long int wert;
    
      cout<<"Geben Sie die binäre Zahlendarstellung ein: ";
      cin>> hex >> wert;
      cout<<"Dezimaler Wert: "<<wert;
      return 0;
    }
    

    geworden ?
    😉

    Also der Code, den Du da gefunden hast, ist nicht gerade ein Beispiel für guten Code (falsche main()-Signatur, non-Std-Funktionen, unnötige Portabilitätseinschränkungen (ASCII), ...) ...
    ...vielleicht solltest Du Dich nicht allzu lange mit ihm beschäftigen.

    Gruß,

    Simon2.



  • Es ging um die Eingabe von binären, nicht hexadezimalen, Werten. Ansonsten aber ein schönes Beispiel. 😉



  • Schade das die STL nur eine komfortable Ausgabe von binären Daten (als String) erlaubt und keine für die die Eingabe...

    #include <bitset>
    #include <iostream>
    
    int main(int argc, char*argv[]){
       int t;
       std::cin >> t;
       std::cout << "in binär: " << std::bitset<32>(t).to_string() << std::endl;  
    }
    


  • _matze schrieb:

    Es ging um die Eingabe von binären, nicht hexadezimalen, Werten. Ansonsten aber ein schönes Beispiel. 😉

    😮 🙄
    OK - hatte aus "Binärzahl" -> "Binärdaten" -> "Hexzahlen" gelesen.

    Tja - falsch eben.

    Gruß,

    Simon2.



  • _matze schrieb:

    fragefrage schrieb:

    Wo kann man das den noch genauer nach lesen, so was man das auch versteht?^^

    Was genau denn? Also eine ASCII-Tabelle findest du überall, z.B. hier: http://www.asciitable.de/tabelle.html

    Jedes Zeichen (druckbare und nicht druckbare) entspricht einem Zahlencode in der ASCII-Tabelle, so wie die '0' eben gleich 48 ist. Ein Leerzeichen ist ne 32, wenn du auf deine ESC-Taste drückst, ist das der Code 27, ein 'A' ist die 65 usw. Du kannst das in einem Texteditor/Word/sonstwas ausprobieren: halte die ALT-Taste gedrückt und gib währenddessen eine 4 und eine 8 ein. ALT-Taste loslassen... tada!

    Das geht allerdings nur mit den Ziffern auf dem Nummernblock!



  • Fellhuhn schrieb:

    Schade das die STL nur eine komfortable Ausgabe von binären Daten (als String) erlaubt und keine für die die Eingabe...

    #include <bitset>
    #include <iostream>
    
    int main(int argc, char*argv[]){
       int t;
       std::cin >> t;
       std::cout << "in binär: " << std::bitset<32>(t).to_string() << std::endl;  
    }
    

    Das kann man aber echt leicht bauen:

    template<size_t size>
    std::ostream& operator<<(std::ostream& ostr, const std::bitset<size>& set)
    {
        ostr << set.to_string();
        return ostr;
    }
    
    template<size_t size>
    std::istream& operator>>(std::istream& istr, std::bitset<size>& set)
    {
        std::string input;
        istr >> input;
        try
        {
            std::bitset<size> tmp(input);
            set = tmp;
        }
        catch(...)
        {
            istr.setstate(std::ios::failbit);
        }
        return istr;
    }
    

    Nur so hingeklatscht.



  • [borat]
    naaaaaiiiissss
    [/borat]
    👍 😋

    Jetzt wäre nur noch die Frage, ob man das direkt in einen Manipulator á la hex umpulen könnte, mit dem man dan direkt in ein long lesen kann.
    Vielleicht mit einem wrapper (z.B. "bin"), in den man mittels operator>>(istream&, bin&) einliest und der dann einen eigenen operator>>(bin const&, T&) für verschiedene Typen anbietet ?
    Aber damit geht dann irgentwie der istream-Parameter flöten und man kann nicht mehr "anhängen", .... hmmmmmmm.
    Muss mal nachsehen, wie std::hex das macht.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ...

    Meinst Du sowas:

    unsigned long a;
        std::cin >> std::hex >> a;
    

    ??
    Das geht doch so schon.

    Edit:
    Achso, bezogen auf bin. Okay.



  • Ich versuch das gerade mal aufm Papier auszurechnen ....

    Aber ohne Erfolg 😞

    Die Eingabe soll sein: 101

    Das Ergebniss wäre ja dann 5

    cout<<"Geben Sie die binäre Zahlendarstellung ein: ";
      cin>>bin;
    
    for (wert=i=0; i<3 ; i++)
    
      wert=wert*2+bin[i]-48;
    

    Für die erste Zahl:
    Aber das ist denk ich mal falsch _
    wert = 0 * 2 + 1 ??*-+ 1?? -48



  • So langsamm komm ich der Sache glaub ich näher^^

    cout<<"Eingabe: ";
      cin>>bin;
    
            for (wert=i=1; i<2 ; i++)
            {
            wert_1 = 1*2 + bin[1];
            }
    

    Wenn man dort jetzt eingibt: 11

    Dann bekommt man als Ergebniss 51

    Aber was passiert hier ? bin[1]

    Was wird da gerechnet ?

    bin wäre hier ja 1 oder ? weil man ja eine 1 eingibt ...

    wert = 1*2 + bin * + / 1 ???

    Ich weiss jetzt halt nicht wie der daraus auf 51 kommt.



  • Wenn du "11" eingibst, sollte das Ergebnis 3 sein. Und da steht bin[i] und nicht bin[1]. Wenn du die Schleife schon auflöst, dann bitte richtig.

    Korrekt wäre:

    wert = 0
    wert = 02 + 1; // + (bin[0] - '0')
    wert = 1
    2 + 1; // + (bin[1] - '0')

    Also wert == 3

    Und bei einer Eingabe von 1101
    wert = 0
    wert = 02 + 1; // + (bin[0] - '0')
    wert = 1
    2 + 1; // + (bin[1] - '0')
    wert = 32 + 0; // + (bin[2] - '0')
    wert = 6
    2 + 1; // + (bin[3] - '0')

    Also wert == 13



  • fragefrage schrieb:

    So langsamm komm ich der Sache glaub ich näher^^

    cout<<"Eingabe: ";
      cin>>bin;
    
            for (wert=i=1; i<2 ; i++)
            {
            wert_1 = 1*2 + bin[1];
            }
    

    ...

    Ich weiss jetzt halt nicht wie der daraus auf 51 kommt.

    Wie willst du der Sache näher kommen, wenn du die Funktion komplett veränderst? Und das nicht zum Guten! Hier kommst du auf 51, weil du jetzt einfach 1*2 (2) und bin[1] (also vom Eingabestring "11" den char an Stelle 1, also '1') addierst. '1' ist gleich 49 (denke an den ASCII-Code), wenn du da nicht 48 subtrahierst, kommst du eben nicht vom char '1' auf den Wert 1, sondern es ist nunmal der Wert 49. So ergibt sich deine 51.

    Wenn du hier leichte Verständnisschwierigkeiten hast, dann zerlege den Ausdruck doch in mehrere Teile, dann wird's vielleicht einfacher:

    for (wert=i=0; bin[i] ; i++) {
    
      //Ziffer, die im letzten Durchlauf mit Wertigkeit 1 (x^0) gehandelt wurde, wird
      //nun "hochgestuft" (x^0 => x^1, x^1 => x^2 usw.), so dass am Ende jede Ziffer
      //nach ihrer korrekten Stellung ins Ergebnis eingeflossen ist. Nur die letzte
      //Ziffer (ganz rechts) wird als x^0==1 behandelt.
      wert=wert*2;  
    
      //Hier fließt die aktuelle Ziffer ins Ergebnis ein, erst mal mit Wertigkeit 1.
      //Die eventuelle Aufwertung kommt im nächsten Durchlauf. Die 48 müssen
      //subtrahiert werden, um vom ASCII-Zeichen auf den int-Wert zu kommen.
      wert+=(bin[i]-48);
    


  • Wenn eingabe 11 ist:

    cout<<"Eingabe: ";
    cin>>bin;
    
      for (wert=i=0; bin[i] ; i++) 
    
        wert=wert*2+bin[i]-48;
    

    wert = 02 + bin[i] - 48;
    wert = 1
    2 + bin[i] - 48;

    Ich weiss jetzt halt nicht was bei bin[i] steht.

    Oder ist das hier bin[i] ??
    wert = 0*2 + 1; // + (bin[0] - '0')

    Ich müsste halt mal wissen wie man das Komplett hinschreibt ....

    wert_1 : bin = 1 i = 0
    wert_2 : bin = 1 i = 1

    Aber wie schreibt man das dann als gleichung ?

    wert_1 = 02 + bin[i] - 48;
    wert_2 = 1
    2 + bin[i] - 48;

    So ?

    wert_1 = 02 + 1 + 0 - 48;
    wert_2 = 1
    2 + 1 + 1 - 48;

    Wert_1 : Die erste 1 soll bin sein und die 0 danach i
    Wert_2 : Die zweite soll bin sein und die 1 danach i

    Nur schreibt man jetzt dazwischen 10 //1 = bin 0 = i
    1
    1 //1 = bin 0 = i

    Oder + - / ........ ???



  • fragefrage schrieb:

    Ich weiss jetzt halt nicht was bei bin[i] steht.

    😕

    Du liest bin per cin ein. Das ist ein String, ein char-Array. Die einzelnen Elemente eines Arrays kannst du per []-Operator bekommen.

    char bin[]="123";  //char-Array mit 4 Elementen (das vierte ist die abschließende Null, die das String-Ende markiert)
    char c=bin[0];  //c ist '1'
    c=bin[1];       //c ist '2'
    c=bin[2];       //c ist '3'
    c=bin[3];       //c ist 0 (nicht '0'!)
    

    In den eckigen Klammern kann natürlich auch eine Variable stehen, so wie in deinem Beispiel. In einer for-Schleife sieht das dann so aus:

    //Im ersten Schleifendurchlauf ist i==0, so dass c==bin[i]==bin[0]=='1' ist.
    //Im zweiten Durchlauf ist es dann so: c==bin[i]==bin[1]=='2' usw.
    for(int i=0;i<strlen(bin);i++) {
      char c=bin[i];
    }
    

    Klar?


Anmelden zum Antworten