Formel und Wert vergleichen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Formel und Wert vergleichen

Beitrag von erikafuchs »

Hallo Leute - ein gutes Neues Jahr zusammen.

Könnt ihr mir wieder mal helfen:

In meinem Rechentrainer (den hier wahrscheinlich inzwischen fast jeder kennt) müssen meine Schüler u.A. das Volumen von Zylindern und Kegeln berechnen. Dazu sollen sie eine Rechnung so eingeben wie sie es im Taschenrechner eingeben würden. Also z.B. "2,3²*5,1*pi:3" (für einen Kegel mit dem Radius 2,3 und einer Höhe von 5,1). Bisher habe ich alle möglichen Eingaben als Text miteinander verglichen. Da es aber sehr viel Möglichkeiten dafür gibt ist das nicht so toll. Ich wandele jetzt also das obige Beispiel in "2,3^2*5,1*Pi()/3" um und vergleiche das Ergebnis mit dem vorgegebenen. Mir ist nichts Besseres eingefallen, als diese Eingabe in ein Tabellenfeld einzutragen und mit einem zweiten Tabellenfeld, in dem der Wert steht, zu vergleichen:

Code: Alles auswählen

eSheet.getCellByPosition(6,1).formula="=" & eing
eSheet.getCellByPosition(6,2).value=erg	
Das klappt aber irgendwie nicht. Im Feld 6,1 steht "zwar "=2,3^2*5,1*Pi()/3", es wird aber der Fehler "#name" angezeigt. Wenn ich die Eingabe händisch kopiere und wieder einfüge klappt es aber. Muss ich die Zelle erst berechnen lassen? Oder geht das auch einfacher?

Pit
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Formel und Wert vergleichen

Beitrag von Toxitom »

Hey Erica,

Nutze statt .formula .formulalocal - dann klappt es auch mit der Eingabe ;))

vieel Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Formel und Wert vergleichen

Beitrag von erikafuchs »

Lieber Tom,
danke schonmal, aber ich brauche mehr Hilfe:

Code: Alles auswählen

eSheet.getCellByPosition(6,1).formulalocal="=" & eing
eSheet.getCellByPosition(6,3).value=erg	
print  eSheet.getCellByPosition(6,1).value 
gibt immer noch "0" aus und die Zelle 6,3 zeigt immer noch "#name" - was mache ich verkehrt?

Kann ich nicht möglicherweise auch im Makro direkt "Wert(Formel(Eingabe)) = Ergebnis" vergleichen - ohne die Formel und den Wert in ein Tabellenfeld einzutragen?
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Formel und Wert vergleichen

Beitrag von Toxitom »

Hey Erika,
- was mache ich verkehrt?
keine Ahnung. Nutze ich Deine Codeschnipsel, so funktioniert es einwandfrei:
Screenshot_2.png
Screenshot_2.png (9.7 KiB) 4919 mal betrachtet
Screenshot_1.png
Screenshot_1.png (6.28 KiB) 4919 mal betrachtet
nun weiss ich nicht, was Deine Variable "erg" ist - und was Du damit übergibst. Da musst Du mehr Code liefern.
Kann ich nicht möglicherweise auch im Makro direkt "Wert(Formel(Eingabe)) = Ergebnis" vergleichen
Nein. Es gibt zwar auch in Basic eine Möglichkeit, die eingebauten Calc-Funktionen direkt aufzurufen, dazu musst Du aber die englischen Bezeichnungen übergeben und entsprechende Parameter. Solche "Rechenaufgabe" sind so ohne weiteres nicht lösbar.

Ich finde Deine Methode gut und sicher. Kannst ja als Ziel eine ausgeblendete Tabelle nutzen oder überlagerst die anzusprechenden Zellen mit einer Flächengrafik.

VG Tom

Ergänzung: Prüfe mal, wie die Zelle in Calc formatiert ist: Falls Du die bereits als "Text" formatiert hast, wied die Formel auch als "Text" eingetragen - dann ergibt die Abfrage value natürlich Null. In dem Fall formatiere die Zelle wieder mit "Standard" oder eben "Zahl" und lass dann erst das Makro laufen.
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Formel und Wert vergleichen

Beitrag von erikafuchs »

Jau, letzt klappt es! (Fast perfekt)
mein Programm ist leider über die Jahre etwas unübersichtlich geworden. Es hat jetzt fast 15000 Zeilen. Irgendwo weiter oben habe ich in einem Sonderfall das Komma durch einen Punkt ersetzt und das führte zu "#name" - der Punkt war mir nicht aufgefallen.
Aber nochwas - die beiden ausgelesenen Zahlen haben eine unterschiedliche Anzahl von Dezimalstellen - der Vergleich schlägt fehl Hier etwas mehr Code:

Code: Alles auswählen

		'erg=Pi*Radius/10*Radius/10*Hoehe/30		("Radius" und "Hoehe" werden zufällig erzeugt )         	
		eSheet=ThisComponent.sheets.getByName("Zahlwort")
		eSheet.getCellByPosition(6,1).formulaLocal="=" & eing
		eSheet.getCellByPosition(6,2).value=erg	
		if  eSheet.getCellByPosition(6,1).value  =  eSheet.getCellByPosition(6,2).value then
			print "stimmt"
		else
			print eSheet.getCellByPosition(6,1).value & " = " & eSheet.getCellByPosition(6,2).value
		end if		
... Die erste Zelle hat 4 bis 5 Dezimalstellen, die zweite mehr. Das kann ich durch Runden auffangen, es würde mich aber interessieren warum das so ist. Die Formatierung der Zellen hat da wahrscheinlich keinen Einfluss, sie beinflusst ja meines Wissens nur die Darstellung dort.
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Formel und Wert vergleichen

Beitrag von Toxitom »

Hallo Erika,
Aber nochwas - die beiden ausgelesenen Zahlen haben eine unterschiedliche Anzahl von Dezimalstellen - der Vergleich schlägt fehl
jupp, das ist so. Die interne Genauigkeit ist ja deutlich höher - als die, die angezeigt wird. Hängt von den verwendeten Typen ab - und von dem mapping auf die C++ typen. Das ist die größte Herausforderung beim Rechnen mit Fliesskommazahlen. Ein Rechner kann nicht exakt rechnen!

Es gibt diverse Techniken, das abzufangen - aber eine exakte Genauigkeit wirst Du nur mit Ganzzahlen hinbekommen. Lösung könnte also so aussehen:

- Einigung auf wieviel Stellen nach dem Komma die Zahl passen muss.
- abschätzen, wie groß die Zahl maximal werden kann.
- eine long-Variable defineiren (kann nur ganze Zahlen aufnehmen)
- die Ergebniswerte mit einem Faktor multiplizieren - also z.b. 1000 bei dreistelliger Genauigkleit - und der jeweiligen longvariablen zuweisen
- die dann entsprechend vergleichen. -> jetzt gibt es True oder False :)

Eine andere Strategie geht mit Ungenauigkeiten um: Du vergleichst nicht die beiden Werte an sich, sondern die nimmst die Differenz (Wert a - Wert b) und vergleichst das (absolute) Ergebnis mit einem < oder > zu einem von Dir gewählten Grenzwert.

Die "Rundungstechnik" geht auch, ist aber meist ungenauer.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Formel und Wert vergleichen

Beitrag von erikafuchs »

Lieber Tom,
vielen Dank für deine Mühe.
Pit
Antworten