Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.06.2008, 16:45

Rechenoperationen per Konsole eingeben

Hi,

Ich möchte mir gerne ein Programm zum berechnen von Nullstellen schreiben und suche dafür die Möglichkeit eine Rechenoperation mit der Konsole einzugeben, so das diese dann als Rechenoperation erkannt wird und man das Ergebnis dieser Rechnung in einer Variabel speichern kann.

Ich denke mal nicht das es auf dem gezeigten Weg funktionieren könnte aber ich mache mal ein Beispiel wie ich mir das gedacht habe:

C-/C++-Quelltext

1
2
3
4
5
6
string Rechenoperation;
int x = 10;

cin >> Rechenoperation;  //z.b Eingabe x*x*x ""also x³"


y = Rechenoperation;


Kann man so etwas auf einfachem Wege verwirklichen? Ich hoffe es ist klar geworden worauf ich hinaus möchte..

Gruß Abc

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

24.06.2008, 17:33

Das kommt ganz drauf an, wie fest du den Benutzer einschränken willst mit der Eingabe.

Um einen Parser wirst du nicht drum herum kommen. Die Frage ist nur wie komplex der sein soll.

Wenn du Nullstellen berechnen willst, nehme ich mal an, dass du komplexere Funktionen einlesen willst.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

24.06.2008, 17:57

Also wenn du keinen kompletten Parser programmieren willst (und das ist garnicht mal so einfach) würde ich das ganze vielleicht etwas einschränken.

Von welcher Art von Funktionen willst du Nullstellen bestimmen? Ich kann mir vorstellen, dass sich das ganze auf Polynome n-ten Grades beschränken lässt.
Dann fragst du den Benutzer zuerst nach dem Grad, und danach nach den Koeffizienten.
Damit kannst du dir ganz einfach eine Methode schreiben die das Polynom berechnet.

4

24.06.2008, 18:36

boost::spirit2 ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

rootnode

Frischling

Beiträge: 92

Wohnort: Aachen, Pontstraße

Beruf: Student

  • Private Nachricht senden

5

25.06.2008, 23:11

Zitat von »"Deviloper"«

boost::spirit2 ...


Würde ich auch zu raten.

http://www.boost.org/doc/libs/1_35_0/libs/spirit/index.html Da findest du alle Infos.

6

05.07.2008, 15:51

Zitat von »"rootnode"«

Zitat von »"Deviloper"«

boost::spirit2 ...


Würde ich auch zu raten.

http://www.boost.org/doc/libs/1_35_0/libs/spirit/index.html Da findest du alle Infos.


Gibt es da nicht evtl auch eine ganz Einfache lösung??

So hab das Projekt jetzt seit langer Zeit wieder aufgegrifen und nun auch schon so gut wie alle Fehler gefunden, so dass er jetzt i.d.R alle Nullstellen findet bis auf 4 Nachkommastellen genau..

Das Probelm ist aber weiterhin noch die Benutzerunfreundlichkeit.. ich muss die Funktion f(x) immer von Hand vor dem kompelieren in die C++ Funktion reinschreiben:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int CCalc::Funktion(float x)
{
    //Hier FUnktion eintragen:


    //------------------------------------------


         fX = x*x*x*x-6*x*x+8;

    //------------------------------------------


  
  
  if (fX  >= -0.00000001 && fX <= 0.00000001)
  {
      return  0;
  }
  else if (fX < 0.00000000f)
  {
      return  1;
  }
   else if (fX > 0.0000000f)
  {
      return  2;
  }



}


Gibt es nicht evtl die möglichkeit, das ich an dieser Stelle des Programm bei Laufzeit einfach nach dem Gleichheitszeichen den Code ergänze mit irgend einer Eingabefunktion die dann in eine Rechenoperation umgewandelt wird?

Es wäre auch nicht schlimm wenn man die Funktionen, wie eine Rechenoperation eingeben muss. Ich hab da kaum Ansprüche..

C-/C++-Quelltext

1
 x*x*x*x-6*x*x+8

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

7

05.07.2008, 15:56

Naja, trenn den Eingabestring bei allen Rechenzeichen. Geh den einfach wie ein Array durch, und immer wenn du ein + , - , / oder * Zeichen findest, nimmst du die Zahl bis dorthin und merkst dir die entsprechende Rechenoperation.

std::string::substr ist dein Freund ;)

8

05.07.2008, 15:58

Zitat von »"Abcd1234"«


Gibt es nicht evtl die möglichkeit, das ich an dieser Stelle des Programm bei Laufzeit einfach nach dem Gleichheitszeichen den Code ergänze mit irgend einer Eingabefunktion die dann in eine Rechenoperation umgewandelt wird?


Nein, das geht nicht. Dann müsste es ja theoretisch neu kompiliert werden und jeder Benutzern müsste einen C++ kompilier installiert haben.
Lieber dumm fragen, als dumm bleiben!

9

05.07.2008, 16:04

Habe ich den auch die möglichkeit die gefundenen Rechenzeichen irgendwie in Variablen zu speichen und diese dann beim Zusamensetzen der Rechenoperation wieder zu verwenden:

C-/C++-Quelltext

1
f(x)=x+2


Hierbei müsste ich dann ja das Plus speichern wie ich das mache ist denk ich mal nicht so das Problem aber wie ich dann an anderer Stelle wieder ein + einsetze wüsste ich nicht..

10

05.07.2008, 16:43

Ungefähr so könnte eine Einfach Lösung aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int Zahl1, Zahl2;
char Rechenzeichen;

cin >> Zahl1 >> Rechenzeichen >> Zahl2;

switch(Rechenzeichen)
{
case '+':
 cout << Zahl1+Zahl2;
break;
case '-'
 cout << Zahl1-Zahl2;
break;
//usw.

}


Die Lösung ist natürlich mies, weil es eben nur für sehr einfache Rechnungen geht, aber so geht es grundsätzlich schonmal.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige