wanne60 Geschrieben 14. März 2011 Geschrieben 14. März 2011 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 Zitieren
Klotzkopp Geschrieben 14. März 2011 Geschrieben 14. März 2011 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). Zitieren
flashpixx Geschrieben 14. März 2011 Geschrieben 14. März 2011 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. Zitieren
Klotzkopp Geschrieben 14. März 2011 Geschrieben 14. März 2011 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 Zitieren
wanne60 Geschrieben 14. März 2011 Autor Geschrieben 14. März 2011 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 Zitieren
wanne60 Geschrieben 15. März 2011 Autor Geschrieben 15. März 2011 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 Zitieren
Klotzkopp Geschrieben 15. März 2011 Geschrieben 15. März 2011 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. Zitieren
wanne60 Geschrieben 15. März 2011 Autor Geschrieben 15. März 2011 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 Zitieren
Klotzkopp Geschrieben 15. März 2011 Geschrieben 15. März 2011 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. Zitieren
wanne60 Geschrieben 16. März 2011 Autor Geschrieben 16. März 2011 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 Zitieren
Klotzkopp Geschrieben 16. März 2011 Geschrieben 16. März 2011 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.