Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   kurvendiskussion linearer Funktionen mit Delphi (https://www.delphipraxis.net/179365-kurvendiskussion-linearer-funktionen-mit-delphi.html)

user14 2. Mär 2014 20:06

kurvendiskussion linearer Funktionen mit Delphi
 
Hallo an die Welt da draußen! Ich bin ein verzweifelter Informatik-nicht-könner. Ich hab mich jetzt entschlossen, eine Kurvendisskussion für lineare Funktionen mit DELPHI durchzuführen. Allerdings weiß ich nicht, wie ich starten soll und wie es dann weiter geht. Kann mir jemand einen ersten Ansatz geben?
Ich würde mich freuen, wenn wir von ganz vorn anfangen. Natürlich möchte ich möglichst viel selbst machen, sodass ich es letztlich vielleicht doch verstehe. Aber selbst für das Formular hab ich sooooo viele Ideen.. Das Problem ist nur, dass ich nicht weiß, was für mich bzw für den Computer später am sinnvollsten ist. Ich weiß nicht, was bei dem Programm noch alles auf mich zukommen wird. Würde mich also freuen, wenn ihr mir helfen könntet. Lg :wink:

BUG 2. Mär 2014 20:25

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Zitat:

Zitat von user14 (Beitrag 1250326)
Allerdings weiß ich nicht, wie ich starten soll und wie es dann weiter geht. Kann mir jemand einen ersten Ansatz geben?

Mach das Gleiche, was du auf dem Papier machen würdest. Dann programmiere das nach :wink:

Medium 3. Mär 2014 01:08

AW: kurvendiskussion linearer Funktionen mit Delphi
 
So komplett ohne grundlegenden Ansatz können wir hier auch nur schwer helfen. Was du dir zuerst überlegen solltest ist: Was für Funktionen sollen nachher behandelt werden? In welcher Form sollen diese eingegeben werden? Ist grafische Darstellung gewünscht? Welche Berechnungen sollen mit einer gegebenen Formel angestellt werden? Wann sollen diese gemacht werden? Wie soll das Ergebnis dargestellt werden? (Textliste, vorgegebene Ausgabefelder, Markierungen an einem Graphen, etc. pp.)

Ein grobes "Outline" müsstest du schon mindestens machen, damit man ungefähr weiss, auf was es nachher hinauslaufen könnte, bzw. wovon man dir erstmal abraten sollte. Auch wäre wichtig zu erfahren wir groß dein Kenntnisstand so in etwa ist. Man kann fast jede Aufgabe entweder sehr einfach und "dirty" lösen, oder softwaretechnisch sauber und universell lösen wie es in einem Lehrbuch stehen sollte. Letzteres erfordert meist einen guten Happs mehr Wissen und Methode.

Bis zu dem Punkt wo du dir genau überlegt hast was der User nachher wo eingeben, und was er wo und wann als Ergebnis nachher sehen soll, und einem ersten ernsten Formular-Entwurf solltest du schon einmal kommen, bevor wir hier über die eigentliche Umsetzung (oder Umbauung) der genauen Funktionalitäten reden können. Das grobe Konzept können wir dir nicht abnehmen.

user14 4. Mär 2014 19:29

AW: kurvendiskussion linearer Funktionen mit Delphi
 
so. Ich hab jetzt so die ersten Ansätze und wahrscheinlich hab ich mir das alles viel zu kompliziert vorgestellt.
Ich hätte da (bis jetzt) eine konkretere Frage.

Also erstmal kurz zur Aufklärung. In dem Programm muss man ein m (für den Anstieg der Funktion) und ein n (für die Verschiebung gegen y-Achse) eingeben. (allgemeine Form y=m*x+n)
Das Programm soll meiner Meinung nach einen showmessage ausgeben, wenn der User vergisst m einzugeben. Außerdem soll das Programm auch dann arbeiten, wenn für n kein Wert angegeben wurde.
Habt ihr eine Idee? :)

BUG 4. Mär 2014 19:57

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Ehrlich gesagt wundere ich mich schon, was man bei linearen Funktionen großartig an Kurvendiskussion machen kann ... im Grunde kann nur die Schnittpunkte mit den Achsen berechnen :gruebel:

Im Prinzip musst dein Programm das Folgende tun:
  1. die Eingabe in Gleitkommazahlen (double) umwandeln
  2. die Achsenschnittpunkte berechnen
  3. die errechneten Werte wieder in Strings umwandeln und ausgeben
Wobei benötigst du Hilfe?

user14 4. Mär 2014 20:17

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Ja, allzuviel gibt es da wahrscheinlich nicht zu tun.
Bis jetzt hab ich das auch alles soweit, also mit den Schnittpunkten, etc.
Allerdings hätte ich gern, dass Delphi auch die Schnittpunkte ausgibt, wenn ich kein n eingegeben habe. Bis jetzt ist es so, dass ich für beide Variablen einen Wert eingeben muss...

Medium 5. Mär 2014 01:13

AW: kurvendiskussion linearer Funktionen mit Delphi
 
"Kein Wert für n" ist bei dir gleichbedeutend mit "n bekommt den Wert 0"? (Matehmatisch sind das zwei Paar Schuhe, das aber nur am Rande.) Wenn es bei leerer Eingabe 0 sein soll, prüfe vor dem Berechnen ob das Edit-Feld leer ist, und setze in diesem Fall n=0, sonst auf den Wert, der im Feld steht.

Volker Z. 5. Mär 2014 01:16

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Hallo,

Zitat:

Allerdings hätte ich gern, dass Delphi auch die Schnittpunkte ausgibt, wenn ich kein n eingegeben habe. Bis jetzt ist es so, dass ich für beide Variablen einen Wert eingeben muss
Du kannst Delphi schon dazu "überreden" in einem solchen Fall (fehlende Ordinate) Schnittpunkte auszugeben - dazu musst Du nur Dein Programm entsprechend implementieren.

Eine fehlende Ordinate (Variable n = 0) in Deiner Polynomfunktion ersten Grades heißt doch letztlich nichts anderes als: Es gibt definitiv keine Verschiebung in Y-Richtung - oder: Die Gerade geht sicher durch den Ursprung.

Zitat:

[...] Ich weiß nicht, was bei dem Programm noch alles auf mich zukommen wird [...]
Naja, dass kann ich Dir jetzt auch nicht wirklich (vorher)sagen, aber: Wenn sich die Problemstellung nicht grundlegend ändern sollte - urplötzlich Polynome höheren Grades oder gar andere Funktionen (e^x, ln (x), sin (x), cos (x) etc.) "diskutiert" werden sollen -, dann wird wohl nicht viel mehr dazu kommen, und dann heißt das:

Zitat:

[...] Natürlich möchte ich möglichst viel selbst machen, sodass ich es letztlich vielleicht doch verstehe [...]
Da ist Dein Ansatz wirklich mehr als löblich ist(!) und es ließe sich letztlich alles recht einfach auflösen mit (Pseudocode, ich lass die Code-Tags mal bewusst weg [oh, Bob, was für ein gepfriemel]):

Steigung = LeseSteigung;
Ordinate = LeseOrdinate;
wenn Steigung nicht definiert oder Null und Ordinate nicht angeben oder Null dann
   ZeigeNachricht: "f (x) = 0! Das ist jetzt aber nicht wirklich Ihr Ernst oder?"
ansonsten
   wenn Steigung nicht definiert oder Null dann
      ZeigeNachricht: "Schnittpunkte: Keine Nullstelle, mit der Y-Achse bei Ordinate (0; Ordinate)"
   ansonsten
      wenn Ordinate nicht definiert oder Null dann
        ZeigeNachricht: "Schnittpunkte: Nullstelle bei (0; 0), keine mit der Y-Achse"
   ansonsten
        ZeigeNachricht: "Schnittpunkte: Nullstelle bei (-Berechne (Ordinate geteilt durch Steigung); 0) und mit der Y-Achse bei (0; Ordinate)")


Jetzt noch alles in ein Delphi-Äquivalent gegossen, fertig.

Sollten sich doch noch Fragen ergeben, dann helfen die Kollegen - auch ich - gerne weiter


Gruß

user14 5. Mär 2014 16:56

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Erstmal vielen Dank für eure Antworten:)

Ich hab gerade nochmal verschiedene Befehlslisten durchgeschaut, bin aber nicht so richtig fündig geworden. Gibt es einen Befehl,in dem ich sagen kann: z.B. if y no value ?
oder muss ich das irgendwie umschreiben?
LG :)

Volker Z. 5. Mär 2014 23:15

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Hallo,

Zitat:

Ich hab gerade nochmal verschiedene Befehlslisten durchgeschaut [...] Gibt es einen Befehl,in dem ich sagen kann: z.B. if y no value ? oder muss ich das irgendwie umschreiben?
:gruebel:

Ich rate da jetzt mal fröhlich ins Blaue rein:
Delphi-Quellcode:
s := GetSlope; // GetSlope liefert die Steigung, was auch immer der User eingeben hat, oder 0, wenn die Eingabe nicht gültig ist
y := GetYAxis; // GetYAxis liefert die Verschiebung in Y-Richtung, was auch immer [...]
if (s = 0.0) and (y = 0.0) then
  ShowMessage ('f (x) = 0! Das ist jetzt aber nicht wirklich Ihr Ernst oder?');
else
  [...]
Geht das in Deine Richtung?

Gruß

Medium 5. Mär 2014 23:44

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Was in einem Edit-Feld eingegeben wird ist Text. Text ist eine Aneinanderreihung von Buchstaben (bzw. Zeichen allgemein). Deswegen muss dieser auch mit Str[ing]ToInt[eger]() oder Str[ing]ToFloat[ingPoint]() in eine für den Computer als solche verständliche Zahl umgewandelt werden. (String = Zeichenkette aka Text; Integer = Ganzzahl; Floating Point = Zahl mit Nachkommaanteil)

Jetzt überlege dir mal, welche Zeichen in welcher Reihenfolge in einem Text stehen dürfen, um bei einer Umwandlung als "Zahl" zu gelten. Alles andere ist dein "no value". (Ja, Handarbeit.)

(Es gibt Funktionen, die helfen das kürzer hinzuschreiben. Aber dir ist erheblich mehr geholfen, wenn du das Konzept überhaupt erst mal verstanden hast.)

user14 6. Mär 2014 15:53

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Ja, so in die Richtung geht es. Allerdings kennt Delphi bei mir den Befehl nicht an...
Ich hab das jetzt so versucht, dass ich sage
if m='' then...

Jetzt hab ich das Problem, dass ich zum einen m mit real definiert habe, es aber für das if... then boolean sein muss...
kann man das so definieren, dass es boolean und real sein kann?


Variante 2 die ich ausprobiert habe, läuft darauf hinaus, dass ich noch eine Variable dazugenommen habe (k) und sie als boolean definiert habe.
Der Quellcode soll ungefähr so aussehen, dass, wenn der User eine Eingabe macht k:=true. Wenn nicht dann k= false. und wenn k dann false ist m=1...

Jetzt weiß ich aber nicht, wie ich das schreiben kann...:/

LG

user14 6. Mär 2014 19:47

AW: kurvendiskussion linearer Funktionen mit Delphi
 
@ Medium

Ich hab schon verstanden, was floattostr etc. bedeutet. Aber Danke nochmal für deine Erklärung.
Eigentlich geht es mir gerade mehr darum, dass ich nicht weiß, wie ich gewisse Dinge dem Computer verständlich machen soll.

Mein Programm sieht bis jetzt so aus, dass es zwingend notwendig ist, in die Gleichung mx+n die Parameter m und n einzugeben- und da auch unbedingt beide. Wenn jetzt einer dieser beiden fehlt, weil m z.B. sowieso eine 1 ist oder es anderseits kein n gibt, dann arbeitet das Programm nicht. Bis jetzt ist es darauf ausgelegt, mit beiden zu arbeiten. Das klappt auch alles ganz gut, wenn ich beide Werte eingebe.
Und wenn eben nicht beide Werte eingegeben sind, dann soll das Programm selbstständig erkennen, dass es eine 1 einzusetzen hat, wenn kein m eingegeben wurde. Gleiches gilt auch für n-nur dass es n als 0 erkennen soll.

Meine if-then Versuche sind bis jetzt gescheitert und so langsam aber sicher gehen mir auch die Ideen aus, wie ich das noch lösen könnte.

LG

Bjoerk 6. Mär 2014 22:22

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Delphi-Quellcode:
M := StrToFloatDef(EditM.Text, 1);
N := StrToFloatDef(EditN.Text, 0);

Medium 6. Mär 2014 23:14

AW: kurvendiskussion linearer Funktionen mit Delphi
 
Bjoerk hat jetzt die Vereinfachungen vorweg genommen. Dennoch die Erklärung warum dein Ansatz nicht ging:

Zitat:

Zitat von user14 (Beitrag 1250960)
if m='' then... [...] m mit real definiert

Genau das ist das Problem:
"m" ist real, "''" ist ein String. Ein "if" will einen Boolean. Delphi ist insbesondere für seine Typsicherheit bekannt - heisst: Wenn eine Operation ein Boolean erwartet, muss auch ein Boolean da stehen. Es reicht nicht, wie bei vielen Scriptsprachen oder manchen anderen Sprachen, dass dort ein Wert steht, der sich ggf. als Boolean interpretieren ließe. Delphi ist da sehr streng, was allgemein als großer Vorteil gesehen wird. (Man wird gezwungen sich um die Art seiner Daten genaue Gedanken zu machen, so dass u.U. ungewollte implizite Konversionen nicht zu bösen Überraschungen führen.)

In deinem Fall darfst du also
Delphi-Quellcode:
if m='' then
nicht machen, da du dort
Delphi-Quellcode:
if real=string then
machst, was schon mal nicht geht. Eine Zahl ist mit einer Zeichenkette nicht vergleichbar, auch wenn 0 und '' (für dich) erstmal gleichwertig klingen. (Sind sie nicht aus Sicht des Computers, und das ist auch gut so.) Desweiteren wird dann bemängelt, dass dort kein Boolean ist, weil der Vergleich bereits nicht funktioniert hat. Ein gültiger(!) Vergleich endet immer in einem Boolean: Entweder er ergibt wahr oder falsch. Kann kein Vergleich gemacht werden, so kann man weder "wahr" noch "falsch" aussagen, und folglich ist dies keine "Boolsche Aussage" mehr.

Der Text in deinem Edit-Feld dagegen ist ein String, den man mit "''" vergleichen kann. Und genau das ist auch die Stelle, an der der Vergleich greifen muss - also einen Schritt zuvor, in dem "m" seinen Wert überhaupt erst bekommt:
(Beispielhaft)
Delphi-Quellcode:
procedure Foo;
var
  m: Double; // Real = Double in aktuellen Delphi-Versionen. Real ist ein alter Typ, den es eigentlich nur noch zur Abwärtskompatibilität gibt. Es ist i.A. besser direkt "Single" oder "Double" zu verwenden.
begin
  if Edit1.Text = '' then
    m := 0
  else
    m := StrToFloat(Edit1.Text);
 
  DoStuffWithM;
end;
StrToFloatDef() macht vereinfacht gesagt genau das: Es versucht den übergebenen Text in eine Zahl umzuwandeln. Wenn dies aus welchen Gründen auch immer nicht funktioniert (lies: Der Text ist keine bekannte/gültige Schreibweise für eine gebrochene Zahl), dann wird statt dessen der im letzten Parameter gegebene Wert zurück gegeben, und kein Fehler ausgelöst, der das Programm unterbricht wie bei StrToFloat(). Es ist daher auch allgemeiner einsetzbar als der direkte Vergleich mit "''", da auch z.B. "Hubert hat ein neues Auto" zu "0" würde. Mir war nur sehr wichtig, dir näher zu bringen was unterschiedliche Datentypen sind, und warum es wichtig ist diese möglichst genau einzuhalten, und zu erklären, warum Delphi dich hier anmeckert. (Ich halte sehr wenig vom kommentarlosen Hinschreiben fertiger Lösungen, die einem keine Chance lassen etwas dabei zu lernen.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz