Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Funktionsaufruf (Funktion aus cmath) über Eingabeaufforderung übernehmen.     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
kosmokatze
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.09.2009
Beiträge: 2
Beitrag kosmokatze Mitglied 19:30:37 16.09.2009   Titel:   Funktionsaufruf (Funktion aus cmath) über Eingabeaufforderung übernehmen.            Zitieren

Hallo zusammen,

meine Diplomarbeit erfordert die Einarbeitung in C++. Das ist die erste Programmiersprache die ich lerne. Bisher klappt es recht gut und es macht mir auch (noch) viel Spaß. Doch nun zu meinem Problem.

Ich hab mir einen Integrator geschrieben (Euler-Polygonzugverfahren und klassisches Runge-Kutta-Verfahren). Man geht dabei von einer Differentialgleichung der Form y'=f(x,y) aus.

Jetzt würde ich gern den Ausdruck f(x,y) auf der rechten Seite (z.B. x*cos(x)) über eine Eingabeaufforderung, also in der Art
C/C++ Code:
#include <cmath>
.
.
cout << "Bitte f(x,y) eingeben: ";
cin >> rightSide;
.
.
C/C++ Code:
#include <cmath>
.
.
cout << "Bitte f(x,y) eingeben: ";
cin >> rightSide;
.
.
C/C++ Code:
#include <cmath>
.
.
cout << "Bitte f(x,y) eingeben: ";
cin >> rightSide;
.
.

in den Integrator übernehmen. Das hätte den Vorteil, dass man den Code nicht für jedes Problem umschreiben und neu kompilieren müsste. Allerdings hab ich nicht den geringsten Schimmer, wie ich das realisieren könnte.

Ist es denn überhaupt möglich, die Idee umzusetzen?
Hab auch schon Google befragt, aber nichts in dieser Richtung gefunden.
Wäre toll, wenn mir jemand einen Anstoß geben könnte, wie man das eventuell umsetzen kann.

Gruß
Kosmokatze
drakon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 6809
Beitrag drakon Mitglied 19:37:33 16.09.2009   Titel:              Zitieren

Phu.. Möglich ist das schon, allerdings ein Haufen arbeit, die du dir wahrscheinlich so nicht machen willst. ;)

Wenn du eine oder ein paar vorgegeben Funktionen hast, respektive dich auf variable Konstanten beschränkst, dann geht es recht gut, aber ich nehme mal an, dass du jede beliebige Funktion haben willst, oder?

Da würde ich dir eine Skriptsprache empfehlen, mit welcher du dann die Funktion schreibst und in deinem Programm nutzen kannst. z.B Lua:
http://www.lua.org/

Oder aber auch Python:
http://www.python.org/
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 2111
Beitrag Th69 Mitglied 18:23:44 17.09.2009   Titel:              Zitieren

Unter http://www.bitel.net/dghm1164/downloads/FctParser-Sources.zip habe ich einen Funktionsparser abgelegt. Dieser ist zwar mit dem Borland C++ Builder (und dessen VCL-Klassen) geschrieben, aber mit wenigen Änderungen kannst du ihn einfach übernehmen:
- std::string statt AnsiString
- std::exception statt Exception
Mehr müßte nicht nötig sein...

Dann einfach mittels
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
FunctionParser fp;
std::string sFct = "x*cos(x)"; // <- variabel
FctValue x = 3.14; // <- variabel (z.B. in einer Schleife)
try
{
  FctValue y = fp.Parse(sFct.c_str(), x);
}
catch(EFctParser e)
{
  std::cout << e.what();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
FunctionParser fp;
std::string sFct = "x*cos(x)"; // <- variabel
FctValue x = 3.14; // <- variabel (z.B. in einer Schleife)
try
{
FctValue y = fp.Parse(sFct.c_str(), x);
}
catch(EFctParser e)
{
std::cout << e.what();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
FunctionParser fp;
std::string sFct = "x*cos(x)"; // <- variabel
FctValue x = 3.14; // <- variabel (z.B. in einer Schleife)
try
{
  FctValue y = fp.Parse(sFct.c_str(), x);
}
catch(EFctParser e)
{
  std::cout << e.what();
}

aufrufen.

Falls dir noch Funktionen fehlen, so kannst du diese in dem Array 'aFct' einfach hinzufügen.

P.S: Viel Glück bei deiner Diplom-Arbeit!


Zuletzt bearbeitet von Th69 am 18:25:35 17.09.2009, insgesamt 1-mal bearbeitet
drakon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 6809
Beitrag drakon Mitglied 20:32:36 17.09.2009   Titel:              Zitieren

Das sieht interessant aus.
Sehe ich mir auch mal bei Gelegenheit an. ;)

thx for sharing.
kosmokatze
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.09.2009
Beiträge: 2
Beitrag kosmokatze Mitglied 08:05:32 18.09.2009   Titel:              Zitieren

Vielen Dank für die Antworten und den Parser.
Hab mir den Code mal angesehen, da scheint viel Arbeit drin zu stecken. Hätt ich definitiv noch nicht bewerkstelligen können.

Python bzw. Lua werd ich mir mal bei Gelegenheit anschauen. Konzentriere mich jetzt aber erstmal auf´s Wesentliche.

Gruß
Kosmokatze


Zuletzt bearbeitet von kosmokatze am 08:10:17 18.09.2009, insgesamt 1-mal bearbeitet
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 2111
Beitrag Th69 Mitglied 13:56:58 26.10.2009   Titel:              Zitieren

Da ich diesen Beitrag jetzt wieder gelesen habe (Verlinkung von http://www.c-plusplus.de/forum/viewtopic.php?p=1798186):
Es waren nur so ca. 1-2 Tage (ich hatte damals - vor ca. 10 Jahren - einfach mal auf die Schnelle einen C-Code nach C++ übertragen - der ursprüngliche C-Code war Teil eines Compilers, den ich auf dem Amiga zuerst in Assembler und danach noch mal in C programmiert hatte).
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 4053
Beitrag knivil Mitglied 14:49:49 26.10.2009   Titel:              Zitieren

Und hier glaube genau dein Problem, mit flex und bison als Parser geloest mit kleiner Projektbeschreibung:

http://fara.cs.uni-potsdam.de/~schugk/myStud/numerik/beleg/

_________________
If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Funktionsaufruf (Funktion aus cmath) über Eingabeaufforderung übernehmen.   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.