Komme bei einer Aufgabe bzgl. String und Array nicht mehr weiter



  • Hallo liebe Gemeinde.

    Heute habe ich eine Aufgabe bekommen, bei der ich nicht mehr weiter weiß.

    Die Aufgabe lautet wie folgt:

    Gegeben ist eine Messreihe bestehend aus 15 oder weniger Gleitkommazahlen im Bereich zsichen 2.0 und 12.0.

    1. Erstellen Sie eine Konsolenanwendung mit Einleseschleife, welche diese Zahlen über die Konsole in ein geeignetes Array bringen.

    Nebenbedingungen: Jede Zahl soll zunächst als String eingelesen werden.
    Werte außerhalb des Berreichs werden einfach überlesen. Ein leerer String soll die Schleife beenden.

    2. Schreiben Sie eine Ausgabeschleife, welche genau die Anzahl der eingelesenen Werte ausgibt und zwar in folgender Formatierung:
    Beispiel mit 8 Werten:
    1: 2.23
    2: 4.50
    ...
    8: 3.88
    also Index und Wert mit Tabulatoren getrennt un der wert mit zwei Nachkommastellen.

    3. ...

    Ich tue mich schon bei der ersten Teilaufgabe sehr schwer.

    Hier einmal ein Code, den ich aufgesetzt habe:

    #include <iostream>
    #include <cstream>
    using namespace std;
    
    #define MAX_ANZAHL 15
    
    int main()
    {
      int i;
      float Messpunkte[15];
    
      cout << " Messreihe! " << endl;
      cout << "Bitte geben Sie 15 Werte zwischen 2.0 und 12.0 ein!" << endl;
    
      for (i=0; i<MAX_ANZAHL, i++)
      {
        cin >> Messpunkte[i];
      }
    
      return 0;
    }
    

    Irgendwie tue ich mich schwer, die Zahlen als String anzusehen ... Ich dachte iummer, dass man String nur bei Zeichenketten verwendet??

    Wie muss ich den Code umändern, um

    1.) den Bereich zwischen 2.0 und 12.0 einzustellen?
    2.) die Zahlen als String einzulesen?
    3.) die Schleife mit einen leeren String zu beenden?

    Danke schon mal für die Antworten.

    Gruß

    Max



  • Ein Paar Vorschläge:

    Ein String kann eine Zahl enthalten. Mit bspw. einem Stringstream kann man diesen String in diese Zahl umwandeln (steht auch nochmal in der FAQ) und umgekehrt.

    Wenn du auf zwei Nachkommastellen genau ausgeben willst, guck dir mal std::setprecision an.

    Wenn du eine Schleife schreibst, dann kannst du die Länge des Strings als Bedingung nutzen. oder einfach in der Schleife abfragen und verlassen, wenn die Länge 0 ist....



  • #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>
    using namespace std;
    
    int main()
    {
      cout << " Messreihe! " << endl;
      cout << "Bitte geben Sie 15 Werte zwischen 2.0 und 12.0 ein!" << endl;
    
      vector<float> values;
    
      while( values.size() != 15 )
      {
        string buffer; 
        cin >> buffer;
    
        stringstream ss(buffer);
        float value;
        if( ss >> value )
        {
            if( value >= 2 && value <= 12 )
              values.push_back( value );
        }
      }
    }
    

    Hilft das dir ?



  • Dein Code ist zwar sehr interessant, aber er hilft mir nicht wirklich, da ich nicht weiß, was Du mit Vector meinst?? Sorry, aber das hatte ich noch nicht...



  • Die halbe Hausaufgabe habe ich ja schon für dich gemacht 😉

    Schau dir std::vector an und wenn du es unbedingt mit CArrays machen musst tausch vector aus gegen:

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    int main()
    {
      cout << " Messreihe! " << endl;
      cout << "Bitte geben Sie 15 Werte zwischen 2.0 und 12.0 ein!" << endl;
    
      float values[14];
      int counter = 0;
    
      while( ( sizeof( values ) / sizeof(float) ) != 14 )
      {
        string buffer;
        cin >> buffer;
    
        if( buffer.size() == 0 )
            break;   
    
        stringstream ss(buffer);
        float value;
        if( ss >> value )
        {
            if( value >= 2 && value <= 12 )
            {
                values[counter] = value;
                counter++;
            }
        }
      }
    }
    


  • UPS

    if( buffer.lenght() == 0 )
    

  • Mod

    sizeof( values ) / sizeof(float) ➡ sizeof( values ) / sizeof(*values)
    🙂



  • Ganz ehrlich, hätte ich gewusst dass ich auch Komplettlösungen posten darf...

    #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>
    #include <iterator>
    #include <iomanip>
    
    int main()
    {
            std::vector<float> vec;
            for(std::string str;vec.size() < 15;)
            {
                    std::getline(std::cin, str);
    
                    if(!str.length())
                            break;
    
                    std::istringstream stream(str);
    
                    float const f = *std::istream_iterator<float>(stream);
                    if(f >= 2 && f <= 12)
                            vec.push_back(f);
            }
    
            std::cout << std::fixed << std::setprecision(2);
            for(size_t i = 0;i < vec.size();++i)
                    std::cout << i + 1 << ".\t" << vec[i] << '\n';
    }
    


  • toll er weiß nicht mal was std::vector ist und dann kommst du mir sowas 😃



  • meepmeep schrieb:

    toll er weiß nicht mal was std::vector ist und dann kommst du mir sowas 😃

    🤡 🤡
    Ich kann natürlich auch eine einfachere Lösung basteln, aber die wird dann etwas länger...



  • Ich wollte keine Komplettlösung, sondern ehrlich gesagt "nur" Tipps, wie ich meinen Code umändern muss, damit da was gescheites raus kommt...

    Nichts gegen euch... aber bei zwei Drittel der Codes frage ich mich, warum das so gemacht worden ist....

    Wie schon geschrieben, ich will keine Komplettlösung ... sondern viel mehr Tipps und Tricks...

    Also nochmal ganz konkret... was ist an meinem Code falsch?????



  • Dein Code ist nicht falsch, er ist einfach "an der Aufgabenstellung vorbei".
    (Und er hat ein paar Unschönheiten, z. B. Makros für Konstanten)

    Ich habe dir ein paar Tips gegeben, btw.


  • Mod

    silent_max schrieb:

    Also nochmal ganz konkret... was ist an meinem Code falsch?????

    Die Aufgabenstellung verlangt eben den Umweg über einen String. Das ist keine tolle Aufgabenstellung, aber ist nun einmal so. Du hast es so gelöst, wie ein normaler Mensch das machen würde.

    Vorgeschlagene Änderungen, der Reihe nach vorzunehmen:
    0. Eine Ausgabe einbauen, damit du die Programmfunktion kontrollieren kannst
    - Erst einmal eine einfache Ausgabe, nicht gleich wie in Aufgabe 2
    1. Auf String umstellen:
    - String mit getline einlesen
    - String in Stringstream stopfen
    - Zahl aus dem stringstream holen
    - Zahl wie gehabt speichern
    2. Abbruchbedingung umformulieren. Die Aufgabenstellung verlangt Abbruch bei einer leeren Zeile.
    - Dafür baust du eine Prüfung ein.
    3. Wertebereich prüfen. Die Zahlen sind nur gültig zwischen 2 und 12.
    - Dafür baust du eine Prüfung ein
    - Achtung mit den Indizes! Bei einer Eingabe im falschen Bereich darf der Zählindex des Arrays nicht weiter gesetzt werden, sonst hast du später Lücken drin. hierfür bietet es sich an, die for-Schleife durch eine passende while- oder do-while-Schleife zu ersetzen.
    4. Die Ausgabe so gestalten wie in Aufgabe 2:
    - Dazu sollten schon genügend Hinweise gekommen sein.


Anmelden zum Antworten