Rechnung aus String berechnen



  • SeppJ schrieb:

    Wie viel Ahnung hast du vom Programmieren? Das ist nämlich einigermaßen kompliziert und du klingst eher so, als wärst du Anfänger.

    Nun ja ich würde mich noch zu den Anfängern zählen. Bisheriger Wissensstand ist folgender:

    Schleifen
    if-Bedinungen
    ASCII code
    Arrays( Mehrdimensional)
    Pointer
    Klassen



  • DirkB schrieb:

    Wenn du nur Polynome berechnen möchtest, kannst du das mit den Koeffizienten machen.

    Diese speicherst du in einem Vector.
    Die Funktion BerechnePolynom bekommt dann als Parameter den Vector und den Wert für x.

    BTW, ist dir das Horner-Schema bekannt? https://de.wikipedia.org/wiki/Horner-Schema

    Oder du nimmst eine Scriptsprache. Die können oft auch Strings ausführen.

    danke für die Hilfe!
    Soweit bin ich aktuell

    #include <iostream>
    #include<cstdlib>
    #include<cmath>
    #include<string>
    
    using namespace std;
    
    void Ausgabe(int Zähler1,int Zähler2,int Zahl[], char Zeichen[])	//Ausgabe Funktion
    {
    	for (int l = 0; l < Zähler1; l++)
    	{
    		cout << Zahl[l];
    	};
    	for (int m = 0; m < Zähler2; m++)
    	{
    		cout << Zeichen[m];
    	};
    
    }
    
    void main()
    {
    	string G = "5*x+2";
    	string neu=G;
    
    	int Zähler1=0;
    	int Zähler2=0;
    
    	for (int n = 0; n < G.length(); n++)
    	{
    		if (G.at(n) == 'x')
    			neu.replace(n, 1, "1");
    	};
    
    	char *ar = new char[G.length()];
    
    	for (int i = 0; i < G.length(); i++)			// Einzelne Zeichen des Strings werden in einem Array gespeichert.
    	{
    		ar[i] = neu.at(i);
    	};
    
    	for (int j = 0; j < G.length(); j++)			//Array Größe für Zahlenarray und Zeichenarray
    	{
    		if (ar[j] > 47 && ar[j] < 58)
    			Zähler1++;
    		else
    			Zähler2++;
    	};
    	int *Zahl = new int[Zähler1];					//Erstelle einen Array für alle Zahlen und einen für alle Zeichen.
    	char *Zeichen = new char[Zähler2];
    
    	for (int k = 0; k < G.length(); k++)			
    	{
    		if (ar[k] > 47 && ar[k] < 58)				//Array befüllen mit Zahlen
    			Zahl[k] = neu.at(k)-48;
    		else
    			Zeichen[k] = G.at(k);					//Array befüllen mit Zeichen
    	};
    
    	Ausgabe(Zähler1, Zähler2, Zahl, Zeichen);
    
    	system("PAUSE");
    };
    

  • Mod

    new für Arrays? Wo hast du denn das gelernt?

    Nimm unbedingt std::vector!

    Programmier nicht weiter, bevor du das nicht geändert hast und verstanden hast, warum man niemals new so einsetzt wie hier. Und lern auf keinen Fall mit dem Buch/Lehrer weiter, der dir das so beigebracht hat.



  • 47, 48 und 58 sind Magic-Numbers. Man kann sich zwar denken, was die bedeuten, muss man aber nicht, weil man dafür '0'-1, '0' und '9'+1 schreiben kann.
    Oder man nimmt nur '0' und '9' und ändert den Vergleich von > auf >= bzw. < auf <=.
    Besser noch man nimmt gleich die Funktion isdigit()

    Du musst aber noch deine Zifferfolgen irgendwie in Zahlenwerte umwandeln. (Aus "123" wird 123)
    Dafür gibt es aber schon fertige Funktionen.
    Die solltest du auch nehmen, weil die schon mit negativen und Fließkommazahlen umgehen können.
    Damit sparst du auch gleich den oberen Teil.

    Was ist dir wichtiger?
    Das parsen der Eingabe oder das integrieren der Daten.

    Mit deinem Code kommst du bei beidem nicht weiter.



  • DirkB schrieb:

    47, 48 und 58 sind Magic-Numbers. Man kann sich zwar denken, was die bedeuten, muss man aber nicht, weil man dafür '0'-1, '0' und '9'+1 schreiben kann.
    Oder man nimmt nur '0' und '9' und ändert den Vergleich von > auf >= bzw. < auf <=.
    Besser noch man nimmt gleich die Funktion isdigit()

    Du musst aber noch deine Zifferfolgen irgendwie in Zahlenwerte umwandeln. (Aus "123" wird 123)
    Dafür gibt es aber schon fertige Funktionen.
    Die solltest du auch nehmen, weil die schon mit negativen und Fließkommazahlen umgehen können.
    Damit sparst du auch gleich den oberen Teil.

    Was ist dir wichtiger?
    Das parsen der Eingabe oder das integrieren der Daten.

    Mit deinem Code kommst du bei beidem nicht weiter.

    Danke, das Parsen der Eingabe wäre mir schon wichtig, ich glaube aber, dass das noch etwas zu früh für meinen Wissensstand ist.
    Ich werde jetzt mal ein wenig kleiner Anfangen und nicht die rechnung in nem String einlesen, sondern als double Werte welche ich x,x^2 und x^3 zuordne.
    Wenn ich das geschafft habe Post ich den Code, vieleicht interessiert es ja noch den ein oder anderen.
    Nochmal vielen vielen Dank für die SCHNELLE Hilfe



  • Nun bin ich das ganze mal anders angegangen. Anstatt eines Strings gibt der Benutzer die Koeffizienten einer Polynomfunktion 3. Grades oder niedriger und die Grenzen des Integrales ein. Diese Werte habe ich dann verwendet um das bestimmte Integral der Funktion zu berechnen. Und es Funktioniert 🙂

    Geht sicherlich kürzer und man könnte die Simpsonregel verwenden aber die Ergebnisse sind doch schon ziemlich gut:)

    Das mit dem String werde ich sicherlich nochmals versuchen aber dazu benötige ich erstmal mehr Grundkenntnisse.

    Falls jemand ein solches Programm bereits geschrieben hatt kann er es hier natürlich gerne Posten, aber vorerst arbeite ich an diesem Programm weiter.

    Grüße codex

    Anbei der Quellcode:

    #include <iostream>
    #include<cstdlib>
    #include<cmath>
    
    using namespace std;
    
    double Integral(double xx3, double xx2, double xx1, double b, double x1, double x2, double segment);
    
    void main()
    {
    	double xx3;
    	double xx2;
    	double xx1;
    	double b;
    	double x1;
    	double x2;
    	double segment;
    
    	cout << "Bitte x^3 Wert eingeben:\t";
    	cin >> xx3;
    	cout << "Bitte x^2 Wert eingeben:\t";
    	cin >> xx2;
    	cout << "Bitte x Wert eingeben:\t\t";
    	cin >> xx1;
    	cout << "Y-Abstand eingeben:\t\t";
    	cin >> b;
    	cout << "Ihre Funktion lautet:\t" << "(" << xx3 << ")x^3+(" << xx2 << ")x^2+(" << xx1 << ")x+(" << b << ")" << endl << endl;
    	cout << "Bitte die untere Grenze in x eingeben:\t";
    	cin >> x1;
    	cout << "Bitte die obere Grenze in x eingeben:\t";
    	cin >> x2;
    
    	segment = (x2 - x1) / 100000;
    
    	cout << Integral(xx3, xx2, xx1, b, x1, x2, segment);
    	system("PAUSE");
    
    };
    
    double Integral(double xx3, double xx2, double xx1, double b, double x1, double x2, double segment)
    {
    	double erg = 0;
    
    	for (double i = x1; i <= x2; i = i + segment)
    	{
    		erg = erg + (xx3*pow(i, 3) + xx2*pow(i, 2) + xx1*pow(i, 1) + b)*segment;
    
    	};
    
    	return erg;
    };
    


  • SeppJ schrieb:

    new für Arrays? Wo hast du denn das gelernt?

    Nimm unbedingt std::vector!

    Programmier nicht weiter, bevor du das nicht geändert hast und verstanden hast, warum man niemals new so einsetzt wie hier. Und lern auf keinen Fall mit dem Buch/Lehrer weiter, der dir das so beigebracht hat.

    Ich glaube das Thema muss ich nochmals im Skript nachschlagen. Hast du eventuell ein Tipp wo man im Internet gute Infos bekommt ohne nen Kurs oder Buch zu kaufen?



  • codex0101 schrieb:

    SeppJ schrieb:

    new für Arrays? Wo hast du denn das gelernt?

    Nimm unbedingt std::vector!

    Programmier nicht weiter, bevor du das nicht geändert hast und verstanden hast, warum man niemals new so einsetzt wie hier. Und lern auf keinen Fall mit dem Buch/Lehrer weiter, der dir das so beigebracht hat.

    Ich glaube das Thema muss ich nochmals im Skript nachschlagen. Hast du eventuell ein Tipp wo man im Internet gute Infos bekommt ohne nen Kurs oder Buch zu kaufen?

    ich kann z.B. empfehlen: Der C++-Programmierer: C++ lernen – professionell anwenden – Lösungen nutzen von Ulrich Breymann

    ist zwar recht dick, aber man muss ja nicht alles in einem Tag lernen. Jedenfalls findest du dort alles wesentliche, was du wissen musst. Und zwar gut erklärt.



  • codex0101 schrieb:

    Das mit dem String werde ich sicherlich nochmals versuchen aber dazu benötige ich erstmal mehr Grundkenntnisse.

    Falls jemand ein solches Programm bereits geschrieben hatt kann er es hier natürlich gerne Posten, aber vorerst arbeite ich an diesem Programm weiter.

    Falls es dich interessiert, hier im Forum gibt es einen Artikel zum Thema Interpreterbau auch am Beispiel eines Matheparsers. Da kannst du ja mal anlesen, um ein Gefühl zu bekommen, was du dir vorgenommen hast.

    https://www.c-plusplus.net/forum/268247



  • Hallo codex0101,

    du kannst auch einfach meinen Funktionsparser benutzen, s. Probleme mit Funktionsparser.



  • ich denke, einen Parser zu schreiben ist jetzt noch etwas zu viel.
    Man sollte ja stets im "Flow" bleiben - also nicht zu schwer, nicht zu leicht, andernfalls verliert man den Spaß an der Sache.

    Viel einfacher wäre z.B. die polnische Notation. Da schreibt man z.B. + 3 4 statt 3+4. Das macht das Einlesen einfach: man weiß sofort, dass man es mit der Addition zu tun hat. Dann liest man weiter, und liest die erste Zahl ein. Dann die zweite. Schließlich kann man das Ergebnis berechnen.


Anmelden zum Antworten