Länge und Stellen



  • Hallo, bin unsystematisch lernender, nur l. by doing.

    Mit welchem Befehl kann ich mir von einer Zahl, sagen wir die ersten beiden Ziffern geben lassen, und die letzte z.b. und gibt es sowas wie in Excel Länge (A1,2)?
    Bem. Gabe mit Array noch nichts gemacht ....

    Danke für die schnelle Antwort.



  • Hallo Bekell,

    ich würde mit IntToStr() oder FloatToStr() in eine Zeichenkette konvertieren und dann mit SubString() die gewünschten Stellen auslesen.

    Gruß

    Martin



  • Was ist nun falsch, das erste funktioniert, das zweite nicht.

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    int main (int argc, char * const argv[])
     {
     stringstream sstream;
     string s0;
     int var1 = 0;
     int var2 = 0;
    	for (int a=101; a<=199; a++)
    	 {
    	sstream << a; // Umwandeln in String
    	sstream >> s0;
    	cout<<"Inhalt von string s0: "<< s0 <<"\n";
    
    	string s1 = s0.substr(0,1);
    	cout<<"Inhalt von string s1: "<< s1 <<"\n";
    
    	string s2 = s0.substr(1,2);
    	cout<<"Inhalt von string s2: "<< s2 <<"\n";
    
    	sstream << s1; // umwandeln in Integer var
    	sstream >> var1;
    	sstream << s2;
    	sstream >> var2;
    	cout<<"Inhalt von var1: "<< var1 <<"\n";
    	cout<<"Inhalt von var2: "<< var2 <<"\n";
    
    	sstream.clear ();
    	}
    }
    


  • Hallo,

    Dein Problem ist der stringstream.
    Der operator << fügt neue Elemente dem stream zu. Dein stream wird also immer länger.
    Du hast wahrscheinlich die Funktion clear des streams falsch interpretiert. Hier wird der stream nicht geleert, sondern die Fehlerflags zurückgesetzt. Zum leeren eines streams nimmt man stream.str("");
    Ich kommentiere mal deinen Code:

    sstream << a; // Zufügen eines Eelemnts zum stream
        sstream >> s0; // Auslesen des streams. Da nur einelement drin ist wird das eof Flag gesetzt.
        cout<<"Inhalt von string s0: "<< s0 <<"\n";
    
        string s1 = s0.substr(0,1);
        cout<<"Inhalt von string s1: "<< s1 <<"\n";
    
        string s2 = s0.substr(1,2);
        cout<<"Inhalt von string s2: "<< s2 <<"\n";
    
        sstream << s1; // Weiteres nElement anhängen
        sstream >> var1; // Versuch ein Element auszulesen. eof Flag ist aber weiterhin gesetzt - Auslesen schlägt also fehl
        sstream << s2;
        sstream >> var2;
    


  • Das Umwandeln der Variable a in String und das Zerteilen klappt.
    Der Ausdruck sieht so aus:

    Inhalt von var2: 0
    Inhalt von string s0: 113
    Inhalt von string s1: 1
    Inhalt von string s2: 13
    Inhalt von var1: 0
    Inhalt von var2: 0
    Inhalt von string s0: 114
    Inhalt von string s1: 1
    Inhalt von string s2: 14

    insofern verstehe ich nicht:

    Dein stream wird also immer länger.

    Ich will die Strings s1 und s2 umwandeln in Intergervariable und nach var1 und var2 packen um damit zu rechnen....

    und das macht er nicht. Deswegen ist var 1 = 0 ....



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Umweg über Strings scheint mir ziemlich umständlich. Es dürfte mit

    unsigned first_two_digits(unsigned x) {
      while(x > 100) {
        x /= 10;
      }
    
      return x;
    }
    

    allemal schneller gehen. Das geht natürlich auch direkt:

    #include <cmath>
    
    unsigned first_two_digits(unsigned x) {
      double lx10 = std::floor(std::log10(static_cast<double>(x)));
      double px10 = std::pow(10, lx10 - 1);
    
      return x / static_cast<unsigned>(px10);
    }
    

    Ich habe allerdings meine Zweifel, dass das in der Realität tatsächlich einen Performancegewinn bringt. Gebencht habe ich es nicht.



  • Korrektur: Das muss natürlich

    while(x >= 100) {
    

    heißen.



  • Danke für die Tips. Habe letztlich das Programm zum Laufen bekommen. Mit der math Biblio... hab ich noch nicht gearbeitet. Könnte jemand mal die letzten verbesserungen erklären, also warum while statt der For-Shleife, was ist unsigned, was std: etc....



  • Bekell schrieb:

    Mit der math Biblio... hab ich noch nicht gearbeitet. Könnte jemand mal die letzten verbesserungen erklären, also warum while statt der For-Shleife, was ist unsigned, was std: etc....

    mathe-bibliothek: ist halt ein header, der viele nützliche funktionen mit sich bringt. doku findest du z.bsp. unter cplusplus.com

    unsigned: ist eine natürliche zahl.
    int == signed int == signed == ca. -2^31 ... 2^31
    unsigned = unsigned int == ca. 0 ... 2^32

    std:: (2 doppelpunkte) gibt den namespace an, in der die funktion gesucht werden soll:

    namespace my_ns
    {
      void my_func()
      {
      }
    }
    
    int main()
    {
      my_func(); //geht nicht, da nicht im globalen namespace
      my_ns::my_func(); //geht
    
    //geht auch:
      using namespace my_ns;
      my_func();
    }
    

    du wirst vermutlich bisher immer ein using namespace std; über deiner main-funktion haben und dich gewundert haben, welchen sinn diese zeile haben sollte - jetzt weißt du es hoffentlich gut genug, um den rest im buch deines vertrauens nachlesen zu können.

    zum thema lerning by doing: dafür ist c++ nicht gerade geeignet

    für was brauchst du denn die "sagen wir die ersten beiden Ziffern geben lassen, und die letzte"?
    willst du es als string oder lieber als int?
    ich nehme mal an, int reicht. für die ersten beiden ziffern hast du die lösung ja schon. die letzte ist ähnlich einfach:

    int letzte_ziffer(unsigned int value)
    {
      if(val <= 9)
        return val;
    
      return val%10;
    }
    

    bb



  • unskilled schrieb:

    int letzte_ziffer(unsigned int value)
    {
      if(val <= 9)
        return val;
    
      return val%10;
    }
    

    Machst du die if-Anweisung aus Performance-Gründen?



  • nö - was ergibt wohl 0%10? 😛
    und wenn ich schon ne abfrage auf 0 mache, kann ichs auch gleich so machen.



  • unskilled schrieb:

    nö - was ergibt wohl 0%10? 😛

    Äh...Null, was genau das gewünschte Ergebnis ist.



  • Danke, das Programm läuft, ist auch verständlich, wenn ich umständlich programmiere. Mir kommen manchmal mat. Fragen, zu B., wollte ich gerade wissen, wieviele Natürliche Zahlen es gibt, die einen Teiler ihrer selbst als mögliches Querprodukt in sich tragen: z. b. 735 ist so eine Zahl, denn 7 * 35 ist 245 und 245 * 3 = 735 ....

    .. das löse ich dann auf c++ mit x-code .... da ich bisher nur bis 999 gelöst habe, muß ich das für die höheren Bereiche noch optimieren, denn je mehr Stellen eine Zahl, desto mehr mögliche Querprodukte gibt es, u. a. das gmqp (größtmögliche Querprodukt) und das kmqp. Da ist noch viel zu forschen. Mir war letzte Woche aufgefallen, daß 18144 ein Vielfaches von 2592 ist, und 18*144 sind 2592 ... lustig, oder?

    Sowas interessiert nur Verrückte .... 😋

    Das schöne am Programmieren ist, daß durch leicht zu lösende Aufgaben im unteren Bereich das Programm kontrollieren kann, und wenn es läuft in die oberen Bereiche vorstoßen kann, wo es mit dem Kopf etwas langwieriger werden würde und die Gewissheit, daß der Computer richtig rechnet, solange wir seine Grenzen kennen.



  • seldon schrieb:

    unskilled schrieb:

    nö - was ergibt wohl 0%10? 😛

    Äh...Null, was genau das gewünschte Ergebnis ist.

    hab iwie auch gerad wieder dran gedacht und kam mir ein wenig doof vor 😃
    kA, was da mit mir los war 😃


Anmelden zum Antworten