Veröffentlicht 14. März 201114 j Hallo, mithilfe der Rechteckregel soll ein Programm als Funktion in C geschrieben werden zur Ermittlung des Integrals für eine gegebene Anzahl von Messwerten. Die Parameter der Funktion lauten: getIntegral ( float messwerte[], int anzahl, float a, float b ; a und b sind die Intervallgrenzen, anzahl ist die anzahl der Messwerte. Ich habe mal mein Programm angehängt, es ist aber nicht als Funktion geschrieben. Wie schreibe ich denn so was als Funktion? Bei einer Funktion habe ich ja definierte Schnittstellen, d.h. als Input habe ich die Messwerte, die anzahl und die Intervallgrenzen, output ist das berechnete Integral. Das angehängte Programm funktioniert zwar, aber mit der Array-definition gibt es Probleme ( float messwerte[anzahl]), kann ich in dem Array keine Variable angeben? Bin für jede Hilfe dankbar! Gruss MichaelNumerische Integration nach dem Rechteckverfahren.doc
14. März 201114 j mithilfe der Rechteckregel soll ein Programm als Funktion in C geschrieben werdenDein Programm ist C++. Namespace, <iostream>, cin und cout gibt's in C nicht. Sollte aber nicht weiter tragisch sein, das kann man recht einfach nach C portieren. Ich habe mal mein Programm angehängt, es ist aber nicht als Funktion geschrieben. Wie schreibe ich denn so was als Funktion?Verlagere den Berechnungsteil in eine eigene Funktion, die du dann aus main aufrufst. Das angehängte Programm funktioniert zwar,Das möchte ich bezweifeln. Da ist ein Bezeichner n, der nirgends deklariert ist. Aber ich gehe mal davon aus, dass das anzahl sein soll. aber mit der Array-definition gibt es Probleme ( float messwerte[anzahl]), kann ich in dem Array keine Variable angeben?In C++ nicht. In C geht das (wenn der Compiler den neuesten Standard unterstützt).
14. März 201114 j Es wäre schön, wenn Du passende Sourcecode Dateien anhängen würdest, denn eine Worddatei kann man weder mit gcc noch g++ kompilieren.
14. März 201114 j Ich mach das einfach mal, hat ja nicht jeder Word: //Numerische Integration nach dem Rechteckverfahren # include <iostream> using namespace std; int main() { int anzahl, i; float a, b; cout <<"Eingabe Anzahl Messwerte:"; cin >> n; float messwerte[anzahl]; cout <<"Eingabe untere Intervallgrenze:"; cin >> a ; cout <<"Eingabe obere Intervallgrenze:"; cin >> b ; for ( i=0; i<n; ++i) { cout <<"Eingabe "<<i<<" . Wert:"; cin >> messwerte[i]; } float h =(b-a)/anzahl; double getIntegral = 0; for ( i=0; i<anzahl; ++i) { getIntegral = getIntegral + messwerte[i]*h; } cout <<" Integral =" <<getIntegral<<endl; system("pause"); return 0; }[/code]Tja, in der Form ist der Code um den Faktor 40 kleiner. Und jeder kann ihn lesen und bearbeiten, ohne potentiell schädliche Dateien in proprietären Formaten runterladen zu müssen
14. März 201114 j Hallo, Danke für die schnellen Antworten. Ja, 'n' ist falsch, da gehört 'anzahl' hin. Ich versuche mal den Berechnungsteil in eine eigene Funktion zu packen und melde mich dann wieder. Gruss wanne60
15. März 201114 j Hallo, Ich habe nun einfach eine Funktion geschrieben, die die angegebenen Parameter aus einem main-Programm übernimmt. Ist das korrekt? //Numerische Integration nach dem Rechteckverfahren # include <iostream> using namespace std; double getIntegral ( float messwerte[], int anzahl, float a, float b, double Integral ) { float h =(b-a)/anzahl; Integral = 0; for ( i=1; i<=anzahl; ++i) { Integral = Integral + messwerte*h; return Integral; } } Danke und Gruss wanne60
15. März 201114 j Ist das korrekt? //Numerische Integration nach dem Rechteckverfahren # include <iostream> using namespace std;Wie ich schon sagte, <iostream> und namespace gibt's in C nicht, das ist C++. Den Integral-Parameter brauchst du nicht, da tut's eine lokale Varialbe. Und die return-Anweisung muss aus der Schleife raus, sonst springst du gleich im ersten Durchlauf aus der Funktion.
15. März 201114 j Hallo Klotzkopp, Was meinst du mit lokaler variable, was muß dann hinter die return-Anweisung? Wie teile ich der Funktion mit, was an das aufrufende Programm übergeben wird? Gruss wanne60
15. März 201114 j Was meinst du mit lokaler variableSo was wie h. Das ist eine lokale Variable. was muß dann hinter die return-Anweisung?Nichts, hinter der return-Anweisung ist die Funktion beendet. Die return-Anweisung muss hinter die Schleife. Wie teile ich der Funktion mit, was an das aufrufende Programm übergeben wird?Mit der return-Anweisung.
16. März 201114 j Hallo Klotzkopp, Ich habe die return-Anweisung nach der Schleife angeordnet. Verstanden habe ich nicht, ob in der Funktionsdeklaration nun noch eine variable rein muß, in der das Ergebnis der Funktion abgelegt wird? In meinem Programm ist das ja die variable Integral. //Numerische Integration nach dem Rechteckverfahren # include <iostream> using namespace std; double getIntegral ( float messwerte[], int anzahl, float a, float b, ) { float h =(b-a)/anzahl; double Integral = 0; for ( i=1; i<=anzahl; ++i) { Integral = Integral + messwerte*h; } return ; } Danke und Gruss wanne60
16. März 201114 j Verstanden habe ich nicht, ob in der Funktionsdeklaration nun noch eine variable rein muß, in der das Ergebnis der Funktion abgelegt wird?Nein, dafür gibt es den Rückgabewert. Die Parameter sind in erster Linie die Eingabedaten der Funktion, der Rückgabewert die Ausgabe. In meinem Programm ist das ja die variable Integral.Beachte, dass die Variable Integral deiner main-Funktion nichts mit der Variablen Integral in der getIntegral-Funktion zu tun hat, nur weil die zufällig denselben Namen haben. Das sind lokale Variablen, d.h. ihr Gültigkeitsbereich beschränkt sich auf den enthaltenden Block. Du musst übrigens bei der return-Anweisung angeben, was zurückgegeben werden soll. Was da vorher stand, war schon richtig.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.