Hilfe habe bald Klausur



  • Hast du denn schon mal versucht, die Compiler-Fehlermeldungen (die du leider nicht gepostet hast) zu interpretieren und daraus zu schließen, was du so alles falsch gemacht hast? Das wäre schon mal Schritt Nr. 1.

    Kleine Hinweise:

    - Du kannst Variablen nicht verwenden, wenn du sie nicht vorher deklariert hast (denn dann gibt es sie einfach nicht), bei dir z.B. das Array x.

    - Wenn du mehrere Werte einlesen willst, musst du das in einer Schleife machen.

    - Jede Anweisung wird mit einem Semikolon abgeschlossen.

    - Der Code ist das katastrophalste, was ich seit langem gesehen habe, sorry. Du solltest besser noch mal (?) deine Unterlagen intensiv studieren und dir wenigstens die grundlegensten Grundlagen aneignen. Ansonsten wirst du wohl kein funktionsfähiges Programm zustande bringen. Das ist nicht böse gemeint, sondern einfach die Wahrheit.



  • sum += (1/x[i]);
    }
    cout<<"Mittelwert:"<<(n+1)/sum<<endl;
    

    stimmt das so 😕 das n+1 könnte auch n sein und dann die schleife bis <=n oder? ach da muß man eben bischen frickeln 🙂



  • und wird doch nicht verwendet oder 😕

    #include <vector>
    #include <fstream>
    #include <cmath>
    


  • xham=n/( 1/x1 + 1/x2+ 1/x3..1/xn)

    x1 x2 xn ??

    Schreib hier mal die richtige Formel^^


  • Mod

    kann_kein_cpp schrieb:

    und wird doch nicht verwendet oder 😕

    #include <vector>
    #include <fstream>
    #include <cmath>
    

    Vermutlich (oder besser: hoffentlich) soll x ein vector sein.



  • ich hab einfach mal drauf losgetipt.. da ich zuwenig ahnung habe..

    und um zu Zeigen das ich mich zumindest bemüht habe..

    in Qbasic hab ich es fast hinbekommen...

    aber in C++ komm ich nciht drauf, ich will nicht unverschämt sein, aber kann mir jemand die lösung geben, damit ich es nachvollziehen kann??



  • O_o schrieb:

    xham=n/( 1/x1 + 1/x2+ 1/x3..1/xn)

    x1 x2 xn ??

    stimmt schon oder?


  • Mod

    Maxbandel schrieb:

    in Qbasic hab ich es fast hinbekommen...

    Zeig doch mal. Dann können wir dir beim Übersetzen helfen.

    aber in C++ komm ich nciht drauf, ich will nicht unverschämt sein, aber kann mir jemand die lösung geben, damit ich es nachvollziehen kann??

    Nein, bestimmt nicht. Außerdem ist das sehr wohl unverschämt. Du kannst dich höchstens darauf gefasst machen, dass gleich eine extrem cplusplusige Lösung gepostet wird, die alle Schikanen der STL ausnutzt und somit das Programm in einem eleganten Einzeiler löst. Oder ein Monstrum mit TMP, welches zehn Minuten compiliert und dabei schon alle möglichen Eingaben durchrechnet. Jedenfalls nur Sachen die dir keiner glaubt.



  • Maxbandel schrieb:

    und um zu Zeigen das ich mich zumindest bemüht habe.. in Qbasic hab ich es fast hinbekommen...

    na dann zeig das doch mal 🙂



  • qbasic_lover schrieb:

    Maxbandel schrieb:

    und um zu Zeigen das ich mich zumindest bemüht habe.. in Qbasic hab ich es fast hinbekommen...

    na dann zeig das doch mal 🙂

    Genau, zeig mal. Dann brauchen wir dir nur die defines zu basteln, die deinen Code mit nem C++-Compiler übersetzbar machen. 😉



  • okay einen Moment



  • CLS
    REM $ DYNAMIC
    DIM feld! (1,2)
    sum=0
    INPUT "Geben Sie die Anzahl der Messwerte an.";n
    REDIM feld!(n,2)
    FOR i = 1 TO N
    INPUT "geben sie den Messwert an";x[i]
    sum = x/ (sum +1/x[i])
    NEXT i
    PRINT" xharm:" sum
    END

    also, er ließt mir dann die von mir angegebene Anzahl von Messwerten ein, nur das schwirigste habe ich nicht hinbekommen, das er dann die angegebenen Messwerte in der berechnung berücksichtigt wenn ich das [i] hinter dem x weglasse bezieht er sich logischer weise nur auf den letzten Messwert..



  • ich sehe grade ich hab den falschen versuch gepostet..

    #include <iostream>
    #include <string>
    #include <cmath>
    #include <vector>
    using namespace std;
    float HarmonischenMittelwert(vector<float>x,int n)
    {
    float sumd=0;
    for (int i=0 ; i<n ; i++ )
    {
    sumd=sumd+ (1/x);
    }
    return n/sumd;
    }

    int main()
    {
    int n;
    cout<<"Berechnung des Massentraegheitsmomentes von Wellen."<<endl<<endl;
    cout<<"Anzahl der Messwerte: ";
    cin>>n; cout<<'\n';
    vector <float> x(n);
    for (int i=0 ; i<n ; i++ )
    {
    cout<<"x" <<i+1<< " = ";
    cin>>x;
    }
    cout<<'\n';
    cout<<"Harmonische Mittelwert = "<<HarmonischenMittelwert(x,n)<<endl<<endl;
    return 0;
    }



  • cin>>x;
    
    sumd=sumd+ (1/x);
    

    probier mal x[i], da du die elemente im container dividieren möchtest


  • Mod

    Ok, übersetzen wir mal. Erstmal fangen wir mit dem Grundgerüst eines C++ Programms an. wir werden Ein-/Ausgabe und Felder brauchen, also können wir schonmal iostream und vector einbinden und aus Faulheit machen wir noch using namespace std:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    }
    

    Und nun übersetzen wir:
    `CLS

    REM $ DYNAMIC

    `
    Brauchen wir nicht.

    DIM feld! (1,2)
    Das ist schon eher etwas. Aber wozu ist die zweite Dimension gut? Da ich das nicht verstehe, lasse ich sie mal weg. In C++ ist das dann:

    vector<double> feld;
    

    Aber da man in C++ Variablen erst da deklariert wo man sie braucht und nicht am Anfang verschieben wir das auf später. Wozu du überhaupt ein Feld benötigst, verstehe ich zwar auch nicht ( ⚠ Das ist ein Hinweis auf die richtige Lösung, aber bloß nicht weitersagen), aber ich lasse es erstmal drin, weil es bei der Übersetzung deines Programms nötig ist.

    sum=0
    Das ist double sum=0; . Aber brauchen wir auch erst später.

    INPUT "Geben Sie die Anzahl der Messwerte an.";n
    Ok, endlich kann's wirklich losgehen. Ein-Ausgabe kannst du ja, da muss ich nicht viel erklären:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
      cout << "Geben Sie die Anzahl der Messwerte an: " << flush;
      unsigned int anzahl_messwerte;    // Variablen müssen in C++ anders als in Basic immer deklariert werden. Außerdem ist 'n' völlig nichtssagend, in C++ benutzt man sprechende Namen.
      cin >> anzahl_messwerte;
    }
    

    REDIM feld!(n,2)
    Endlich spielt das Feld eine Rolle. Also können wir uns die Deklaration von oben schnappen. Und das REDIM können wir bei vector gleich als Parameter übergeben. Außerdem ändern wir den Namen auf etwas sinnvolles:

    vector<double> messwerte(anzahl_messwerte);
    

    `FOR i = 1 TO N

    ...

    NEXT i `
    Das kann man quasi 1:1 übernehmen, wenn man die Syntax ändert und an die Deklaration der variablen denkt:

    for (int i=0; i<anzahl_messwerte; ++i)
    {
    }
    

    Ebenso die Ausgabe am Schluss:

    cout << "xharm: " << sum << endl;
    

    Gucken wir uns das innere der Schleife an:
    `INPUT "geben sie den Messwert an";x[i]

    `
    Auch direkt übertragbar, aber den Text kann man auch schöner machen:

    cout << "Geben sie den " << i+1 << ". Messwert an: " << flush;
    cin >> messwerte[i];
    

    P.S.: ⚠ Warum heißt das bei dir auf einmal x? Oben war das noch feld!. Das kommt davon wenn man nichtssagende Namen benutzt zudem noch in einer Sprache die bei fehlenden Deklarationen nicht von einem Schreibfehler ausgeht sondern sich irgendwas ausdenkt.

    Und das schlimmste zum Schluss:
    sum = x/ (sum +1/x[i])
    Das kann ich nicht übersetzen. Das kann doch auch in Basic unmöglich gültig sein. Das macht überhaupt keinen Sinn. Soll das vielleicht
    sum = n/ (sum +1/x[i])
    heißen?
    Falls ja, wäre dies:

    sum = anzahl_messwerte / (sum + 1/messwerte[i]);
    

    Und somit das gesamte Programm:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
      cout << "Geben Sie die Anzahl der Messwerte an: " << flush;
      unsigned int anzahl_messwerte; 
      cin >> anzahl_messwerte;
    
      vector<double> messwerte(anzahl_messwerte);
      double sum = 0;
    
      for (unsigned int i=0; i<anzahl_messwerte; ++i)
      {
        cout << "Geben sie den " << i+1 << ". Messwert an: " << flush;
        cin >> messwerte[i];
        sum = anzahl_messwerte / (sum + 1/messwerte[i]);
      }
    
      cout << "xharm: " << sum << endl;
    }
    

    Dies ist die Übersetzung deines Programmes. Und wenn wir dies nun laufen lassen, stellen wir fest:

    Es kommt völliger Blödsinn raus.

    Das liegt daran, weil deine Formel völliger Mist ist. Du hast in der Aufgabenstellung doch schon die Formel angegeben bekommen und dies hier hat absolut nichts mit der richtigen Formel gemeinsam. Da dies einer der Kernpunkte des Problems ist, überlasse ich dies aber erstmal dir.



  • hat ein bischen gedauert, ja ich bin/war etwas eingerostet aber das feuer ist gleich wieder ausgebrochen, wie am ersten tag 😃

    CLS
    INPUT "Geben Sie die Anzahl der Messwerte an: " n
    LET sum = 0
    LET inp = 0
    FOR i = 1 TO n
      INPUT "geben sie den naechsten messwert ein: " inp
      LET sum = sum + (1/inp)
    NEXT i
    LET sum = n/sum
    PRINT "Harmonisches Mittel:"
    PRINT sum
    END
    

    @edit ohne cls gibts kein basic 🤡
    @edit2 jetzt jagts mich bitte nicht gleich vom hof ich post auch kein basic mehr



  • schonmal Vielen dank für deine Mühe mir mein Qbasic zu Übersetzten VORALLEM so ausführlich!!
    ich habe da aus einigen Beispielaufgaben etwas zusammengeschneidert..

    also zu dem einen teil, ja es sollte natürlich n und nicht x sein..

    ich versteh nicht was an der formel falsch ist.. wenn ich es mim taschenrechner ausrechne komme ich auch auf ein anderes ergebnis (also hast du natürlich recht was die Formel angeht)

    wenn wir zum Beispiel den annehmen das wir 3 Messungen machen,
    1. Messwert 3
    2. Messwert 2
    3. Messwert 3

    würde dir Formel doch:

    3 / ( (1/3)+ (1/2)+ (1/3) ) heißen

    bei:

    sum = anzahl_messwerte / (sum + (1/messwerte[i])
    3 [müsste stimmen] / so und DA muss ja mein fehler liegen, irgendwie komm
    ich noch nicht drauf..

    es sollte eig. 2,57 rauskommen..



  • gefällt dir mein basic code nicht 😕 es kommt auch 2.57143 raus 😞



  • sum = (sum + (1/3);
    sum = (sum + (1/2);
    sum = (sum + (1/3);
    sum = anzahl_messwerte / sum;
    


  • no_code schrieb:

    hat ein bischen gedauert, ja ich bin/war etwas eingerostet aber das feuer ist gleich wieder ausgebrochen, wie am ersten tag 😃

    CLS
    INPUT "Geben Sie die Anzahl der Messwerte an: " n
    LET sum = 0
    LET inp = 0
    FOR i = 1 TO n
      INPUT "geben sie den naechsten messwert ein: " inp
      LET sum = sum + (1/inp)
    NEXT i
    LET sum = n/sum
    PRINT "Harmonisches Mittel:"
    PRINT sum
    END
    

    @edit ohne cls gibts kein basic 🤡
    @edit2 jetzt jagts mich bitte nicht gleich vom hof ich post auch kein basic mehr

    was ist den inp? da mekert er bei mir..


Anmelden zum Antworten