numerische Integration

3Cyb3r

Erfahrenes Mitglied
Hiho muss bis morgen in der Schule nurmerische Integration Simpson und Newtown Verfahren fertig haben( Trapez und Parabel Formeln).
Ich habe soweit alles fertig Eingabe...
Mein Problem ist nun das ich eine Eingabe haben möchte wo man die zu integrierende Funtion einträgt.
Bislang habe ich die Funktion immer in meineSourcecode festgelegt.
wenn ich z.b.
sin(x)*sqrt(x) habe
muss in ich erkenne aha
und:
Code:
float f(float x)
{
		return sqrt(x) * sin(x);
}

wenn ich nun etwas anderes eingebe muss sich dies Fuktion ändern.
Ich hatte schon an eine switch case Anweisung gedacht aber da gäbe es bei verketten unendlich viele möglichkeiten.
Hat jemand eine Idee?
 
Zuletzt bearbeitet:
string zu c befehl

Hi
Ich hab eine eingabe z.b.
sin(x) als string.
wie mache ich aus diesem string ein Befehl der während der laufzeit aufgerufen wird?
als wenn ich das in den code schreiben würde ständ dann da sin(x);.
Also ich muss wissen wie ich eine Funktion die in eine srtring steht ausführe.

Das Problem ist cc ist keine Interpreter Sprache und ich glaubnicht das Python Script
kompatibel mitm TI ist-.-. Wie macht das denn dann ein Taschenrechner?

Oder kennt jemand ein Tutorial Code Assembler Interpreter für so etwas welchen ich integrieren kann (wie eine Funktion)?
 
Hm also du musst das ganze dann schon parsen ... dann das ganze einfach in folgendes packen:
C++:
typedef struct function {
    typedef double (*fn_type)(double);
    fn_type call;
    const char* string;
} function_t;

function_t registered[] = { {&sin, "sin"}, {&cos, "cos"} };
double call_function(const char* string, const double value)
{
    function_t* ptr_end = registered + sizeof(registered) / sizeof(function_t);
    for (function_t* ptr_it = registered; ptr_it != ptr_end; ++ptr_it)
        if (strcmp(string, ptr_it->string) == 0) return (*(ptr_it->call))(value);
    /* error handling */
}

int main()
{
    printf("%d", call_function("sin", 90));
}
...
 
Da wirst du wohl nicht anders können als einen Interpreter dafür zu schreiben...
ob das bis morgen geht?

Edit: Hab irgendwie nicht mitgekriegt, dass da schon zwei Beiträge sind...:confused:
 
Zuletzt bearbeitet:
Hoppala, plötzlich ist alles verschoben... :)

Naja, mein Senf auch noch:

Hi.

Du müßtest von deinem Ausdruck einen Syntaxbaum im Speicher erstellen den du dann immer wieder auswerten kannst.

Siehe http://www.tutorials.de/forum/1138857-post5.html

Da hat RedWing allerdings nur ein einfacher Parser für math. Ausdrücke ohne Variablen und Funktionsaufrufe programmiert. Es dann nochmal schwieriger wenn du solche Elemente erlaubst.

Du könntest allerdings eine Zuordnung von Strings zu unären Funktion (bzw. Funktionszeigern) definieren und dann die entsprechende Funkton aufrufen.

C:
typedef  double (*unary_func) (double); 

unary_func func = NULL;

if (func_name == "sin") {
  func = &sin;
} else if (func_name == "cos") {
  func = &cos;
} else if 
...

// irgendwann später:
(*func)(argument);
Gruß
 
Ich bin verwirrt Devdevil könntest du vielleicht einmal ein luffähiges Beispiel posten?
Was genau soll fn_type oder eher wie sollte sie aussehen?
 
Zuletzt bearbeitet:
Hi.
Ich bin verwirrt Devdevil könntest du vielleicht einmal ein luffähiges Beispiel posten?
Was genau soll fn_type oder eher wie sollte sie aussehen?
fn_type ist ein Funktionszeiger-Alias. Du mußt lediglich die typedef Anweisung aus dem struct herausnehmen und die entsprechenden Headerdateien einbinden, dann läuft das Bsp. von DevDevil bereits. \edit: Allerdings muss der Formatstring natürlich %f, %e oder %g sein.

Gruß
 
Zuletzt bearbeitet:
Ok hab das mal beim msvs 6.0 getestet funtkioniert einwandfrei :(.
Allerdings meckert der TI C Kompiler gnadelos rum.
TIGCC IDE ist das.

Code:
typedef double (*fn_type)(double);

->>Expected specifier-qualifier-list before 'typedef'.

Code:
function_t registered[] = { {&sin, "sin"}, {&cos, "cos"} };

->>'sin' undeclared here (not in a function).
->>'cos' undeclared here (not in a function).

C99 mode is das
 
Zurück