Hilfe habe bald Klausur
-
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
ENDalso, 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
-
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:
`CLSREM $ 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 istdouble 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 3wü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 mehrwas ist den inp? da mekert er bei mir..
-
NATÜRLICH gefällt er mir.. nur scheinbar habe ich eine andere Version, die Nimmt deine leider nicht an.
-
int n; double sum = 0.0,inp; ..."inp" ist eine ganz normale double variable
interpretiert hab ichs mit yabasic da ging in kate nur das CLS nicht

-
aso, das erklärt auch warum du kein ";" verwendenet hast.. DANKE!!
-
ja das ; brachte bei mir iwie fehler, hab schon bischen von deinem gespickt

-
Also ich Hab jetzt noch etwas rumgetüftelt.. ich glaub ich versteh einfach nicht wie der das Programm die Formel umsetzt..
hab jetzt mal noch nen zwischenschritt eingebaut, aber da kommt dann auch nur blödsin bei rum..
#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];
double zwischenschritt;
zwischenschritt= 1/messwerte[i];
cout<<zwischenschritt;
sum = anzahl_messwerte / (zwischenschritt);
}cout << "xharm: " << sum << endl;
}ich habe mir extra den zwischenschritt mal ausgeben lassen, die Ergebnisse stimmen alle soweit, nur muss er die dann addieren nur wie ich das am besten anstelle weiß ich leider nicht..
-
mit:
zwischenschritt= (1/messwerte[i])+(1/messwerte[i+1]);
bekomm ich auch nen fehler..
-
maxbandel schrieb:
mit:
zwischenschritt= (1/messwerte[i])+(1/messwerte[i+1]);
bekomm ich auch nen fehler..
Das klingt nach einem klaren Fall für einen Schreibtischtest. Denk dir 5 Zahlen aus, berechne den harmonischen Durchschnitt. Dann nimmst du an, dass du alle Zahlen eine nach der anderen bekommst. Was machst du mit jeder neuen Zahl, wenn du als Hilfsmittel einen Taschenrechner mit einer Speichertaste hast? Kommst du auf das gleiche Ergebnis?
P.S.: Und lies dir mal diesen Thread durch: Mit Aussagen wie "bekomm ich auch nen fehler.." kann niemand etwas anfangen. Falsches Ergebnis? Laufzeitfehler? Compilerfehler? Wenn du dem Leser so wenig Information gibst, ist niemand motiviert dir zu helfen, denn du willst offensichtlich keine Hilfe sondern eine Lösung.