| Autor |
Beitrag |
newbie333
      
Beiträge: 43
|
Verfasst: Do 04.06.09 18:33
Hi,
ich habe folgendes Problem:
Wir sollen zwischen Anweisung, Ausdruck, Wert und Datentyp unterscheiden können und auch eine Aussage darüber machen, ob das angegebene korrekt ist oder nicht.
Ich hab schon bei google gesucht und sicherlich auch lange alleine darüber nachgedacht, aber unsere Verbesserung in der Schule hat mich leicht verwirrt..
Deshalb fände ich es sehr nett, wenn mir hier jemand helfen könnte!
Danke schon mal im Vorraus.
Label1.top+Edit1.left ist ein Ausdruck, oder? Und ich denke mal er ist korrekt.
Bin aber - wie gesagt unsicher.
Label1.top := Edit1.text ist eine falsche Anweisung, da sich die Datentypen unterscheiden.. integer und string?
hierzu fällt mir auch noch eine Frage ein: Woher weiß ich denn wann einem Ausdruck integeroder realzugeordnet wird, wenn da jetzt nur Label1.topsteht?
Button1.height := 0.5*Button2.height ist das eine korrekte Anweisung?
und das größte Problem:
'100' Wert? Ausdruck? Auf jedenfall vom Typen string.
Wäre nett, wenn mir jemand behilflich sein könnte!
Moderiert von Narses: Delphi-Tags hinzugefügt.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 04.06.09 18:44
newbie333 hat folgendes geschrieben : | | Label1.top := Edit1.text ist eine falsche Anweisung, da sich die Datentypen unterscheiden.. integer und string? |
Korrekt.
newbie333 hat folgendes geschrieben : | | Button1.height := 0.5*Button2.height ist das eine korrekte Anweisung? |
Falsch. Oder hast du schon mal halbe Pixel gesehen?
newbie333 hat folgendes geschrieben : | | '100' Wert? Ausdruck? Auf jedenfall vom Typen string. |
IMHO ein Wert.
Grüße,
Marc
|
|
Tropby
      
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: Do 04.06.09 18:49
| Zitat: | | Woher weiß ich denn wann einem Ausdruck integeroder realzugeordnet wird, wenn da jetzt nur Label1.topsteht? |
In Delphi siehst du wenn du mit der Maus über den Ausdruck gehst (in den neueren Versionen) von welchem Typ der der Ausdruck ist.
z.B. bei Label1.top steht : System.Integer
Sonst siehst du auch wenn du hinter Label1 den Punkt machst ja so eine Liste. Dort steht dann auch von welchem Typ das ist.
Aber sowas wie top, left, height, width sind normalerweise immer ganze Zahlen da man ja schlecht ein Object wie schon gesagt auf halbe Pixel setzten kann.
_________________ Tropby
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Do 04.06.09 18:50
Na dann vielen Dank
--- Moderiert von Narses: Beiträge zusammengefasst---
Das dumme daran ist halt, dass wir bei der Arbeit auf Blätter schreiben müssen und nicht in Delphi
Danke.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 04.06.09 19:26
Moin und  im Forum!
newbie333 hat folgendes geschrieben : | | Wir sollen zwischen Anweisung, Ausdruck, Wert und Datentyp unterscheiden können |
Ich sehe das so (Kurzfassung, keinen Anspruch auf Vollständigkeit): - Datentyp
Das ist nicht leicht zu erklären grob gesagt: Definition, wie ein Stück Speicher zu verwenden ist, also z.B. ob darin eine Ganzzahl im Bereich von -32768..32767 gespeichert werden kann oder ob es sich um eine Kette von Buchstaben handelt.
Zu einem Datentyp gehören auch die Operatoren, die darauf anwendbar sind. Beispiel: Beim Datentyp Real ist der Operator "geteilt" erlaubt, beim Datentyp String ist er verboten (weil unsinnig).
- Wert
Eine Konstante (im Laufzeitsinn, nicht zur Entwurfszeit, um direkt entsprechenden Kommentaren vorzubeugen), die (zumindest in Delphi) einen Datentyp hat. Beispiele: 123 [Integer], 'Hallo' [String], 1.41 [Real]
Man könnte auch sagen: ein Exemplar aus dem Wertebereich des Datentyps.
- Variable
Ein benannter Speicherort, der (zumindest in Delphi) einen Datentyp hat und einen Wert dieses Datentyps aufnehmen (speichern) kann. Beispiele: var Ganzzahl: Integer; var Wort: String;
- Ausdruck
Eine beliebige Kombination aus [Konstanten, Variablen, Funktionsergebnissen], die bei mehr als einem Element mit geeigneten Operatoren verknüpft sein müssen. Beispiele: 1+2+3, 'Hallo '+'du '+' da!'
Ein Ausdruck ist wie eine Formel in der Mathematik zu sehen, analog hat ein Ausdruck in Delphi zum Zeitpunkt der Ausführung durch die CPU einen Wert.
- Anweisung
Ein "Arbeitsauftrag" für die CPU (bisher gab es noch nix zu tun, Werte, Variablen und Ausdrücke können in einem Programm nicht alleine stehen). Beispiel: MeineIntVar := 123; Allgemein: <Variable> := <Ausdruck>; wobei im Beispiel der Ausdruck nur aus einer Konstanten besteht (auch das ist ein korrekter Ausdruck).
Anderes Beispiel: MeineStrVar := 'Hallo '+IntToStr(123); Hier ist der Ausdruck aus einer Konstanten und einem Funktionsergebnis zusammengesetzt.
Achtung! Es gibt natürlich noch mehr Anweisungstypen, nicht nur Variablenzuweisungen, wie hier im Beispiel.
Jetzt kannst du nochmal deine Fragen durchgehen und die Antworten entsprechend formulieren, dann können wir dir sagen, ob du´s verstanden hast.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Robii
      
Beiträge: 236
|
Verfasst: Do 04.06.09 19:52
Spannend. Jetzt habe auch ich etwas dazugelernt.So etwas kommt auch bei uns in der Arbeit dran.
Grüße.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 04.06.09 20:13
"Wert" ist auch der einzige Begriff der vier, der mir nicht geläufig ist. Spontan hätte ich es mit "Literal" (oder auch "Ausdruck") gleichgesetzt.
Narses hat folgendes geschrieben : | Wert
Eine Konstante (im Laufzeitsinn, nicht zur Entwurfszeit, um direkt entsprechenden Kommentaren vorzubeugen), die (zumindest in Delphi) einen Datentyp hat. Beispiele: 123 [Integer], 'Hallo' [String], 1.41 [Real]
Man könnte auch sagen: ein Exemplar aus dem Wertebereich des Datentyps. |
Also ein konstanter Ausdruck, d.h. 1+2+3 wäre auch einer?
Lustig wird's, wenn sich die Begriffe überlappen  :
Wert ist immer auch ein Ausdruck, jedenfalls nach jeder Definition in diesem Thread.
Bestimmte Ausdrücke können auch als Anweisungen benutzt werden, z.B. Funktionsaufrufe: IntToStr(123) ist eine vollständige (und äußerst sinnvolle) Anweisung, 1 = 0 keine.
_________________ >λ=
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 04.06.09 20:25
Moin!
Kha hat folgendes geschrieben : | Narses hat folgendes geschrieben : | Wert
Eine Konstante (im Laufzeitsinn, nicht zur Entwurfszeit, um direkt entsprechenden Kommentaren vorzubeugen), die (zumindest in Delphi) einen Datentyp hat. Beispiele: 123 [Integer], 'Hallo' [String], 1.41 [Real]
Man könnte auch sagen: ein Exemplar aus dem Wertebereich des Datentyps. | Also ein konstanter Ausdruck, d.h. 1+2+3 wäre auch einer? |
Ein Ausdruck hat (zur Laufzeit) einen Wert, ein Ausdruck ist keiner.
Kha hat folgendes geschrieben : | Lustig wird's, wenn sich die Begriffe überlappen :
Wert ist immer auch ein Ausdruck, jedenfalls nach jeder Definition in diesem Thread. |
Andersrum wird ein Schuh draus, ein Ausdruck hat immer einen Wert.  Denn: ein Wert kann aus beliebig vielen Ausdrücken hervorgehen. Trivalität: eine (zur Entwurfszeit) Konstante ist auch ein Ausdruck. Du hast - genau genommen - eine Ausdruckskonstante angegeben (real wird der Compiler das in eine einzelne Konstante übertragen).
Kha hat folgendes geschrieben : | | Bestimmte Ausdrücke können auch als Anweisungen benutzt werden, z.B. Funktionsaufrufe: IntToStr(123) ist eine vollständige (und äußerst sinnvolle) Anweisung, 1 = 0 keine. |
Ich sagte ja, "kein Anspruch auf Vollständigkeit"...  Die Be wertung eines Ausdrucks kann eben auch mit Arbeit für die CPU verbunden sein.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Do 04.06.09 21:17
Also wenn ich das richtig verstanden habe, würde ich das so machen:
27 ist ein Ausdruck UND ein Wert vom Typ integer
label1.top+Edit1.left ist ein Ausdruck vom typ integer, der korrekt ist
'HALLO' ist ein string, und ein Wert + Ausdruck? und ebenfalls korrekt
label2.left := label1.top eine korrekte Anweisung vom typ integer?
'100' Ein string, wert + ausdruck?
Edit1.left = 2*Label2.top-5 ein korrekter Ausdruck vom Typ boolean?
true ist ein korrekter ausdruckvom typ boolean .. auch ein Wert?
'false' wert, string, korrekt.. ausdruck?
(man sieht: ich versteh den unterschied zwischen Ausdruck und Wert noch nicht ganz)
Label1.caption ist ein korrekter ausdruck vom typ string
button1.heiht := 0.5*Button2.height ist eine falsche Anweisung vom typ integer/real
2*(Edit1.left+'75') ist ein falscher ausdruck, da unterschiedliche typen: string und integer
label1.visible := (Edit1.text= 'Hallo') ist eine korrekte Anweisung vom typ boolean
Danke für die Mühe!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 04.06.09 21:51
Narses hat folgendes geschrieben : | Kha hat folgendes geschrieben : | Narses hat folgendes geschrieben : | Wert
Eine Konstante (im Laufzeitsinn, nicht zur Entwurfszeit, um direkt entsprechenden Kommentaren vorzubeugen), die (zumindest in Delphi) einen Datentyp hat. Beispiele: 123 [Integer], 'Hallo' [String], 1.41 [Real]
Man könnte auch sagen: ein Exemplar aus dem Wertebereich des Datentyps. | Also ein konstanter Ausdruck, d.h. 1+2+3 wäre auch einer? | Ein Ausdruck hat (zur Laufzeit) einen Wert, ein Ausdruck ist keiner.  |
Ah, natürlich. Irgendwie hatte ich bei dir Laufzeit und Entwurfszeit genau vertauscht gelesen  . Mathematisch gefasst also: Ein Datentyp ist eine Menge (plus dazugehörige Operationen), ein Wert Element davon. Und '100' wäre dann ein Literal (= Ausdruck), das einen bestimmten Laufzeitwert repräsentiert.
Narses hat folgendes geschrieben : | Kha hat folgendes geschrieben : | Lustig wird's, wenn sich die Begriffe überlappen :
Wert ist immer auch ein Ausdruck, jedenfalls nach jeder Definition in diesem Thread. | Andersrum wird ein Schuh draus, ein Ausdruck hat immer einen Wert. |
Ja, die Aussage von mir hat sich dann natürlich gegessen  . Ich hatte nur auf Ebene der Sprachdefinition überlegt.
Narses hat folgendes geschrieben : | Kha hat folgendes geschrieben : | | Bestimmte Ausdrücke können auch als Anweisungen benutzt werden, z.B. Funktionsaufrufe: IntToStr(123) ist eine vollständige (und äußerst sinnvolle) Anweisung, 1 = 0 keine. | Ich sagte ja, "kein Anspruch auf Vollständigkeit"...  |
Es ging mir auch nicht darum, deine Definition zu vervollständigen, mein Beispiel der Funktionsaufrufausdrucksanweisung  war schließlich auch nur eines von mehreren Überlappungsmöglichkeiten  .
Narses hat folgendes geschrieben : | | Die Bewertung eines Ausdrucks kann eben auch mit Arbeit für die CPU verbunden sein. |
Da der Ausdruck eben impure sein könnte, genau. Und Ausdrücke, die (auf höchster Ebene) eindeutig keine Nebeneffekte besitzen können, werden von der Sprache eben nicht als Anweisung zugelassen.
/add
newbie333 hat folgendes geschrieben : | | 27 ist ein Ausdruck UND ein Wert vom Typ integer |
Das, was bei dir im Quelltext steht, also die Syntax, ist ein Ausdruck. Bei der Auswertung zur Laufzeit wird daraus ein Wert.
newbie333 hat folgendes geschrieben : | | label2.left := label1.top eine korrekte Anweisung vom typ integer? |
Bei einer Zuweisung müssen die zwei Typen natürlich kompatibel sein, aber allgemein besitzt eine Anweisung keinen Datentyp.
newbie333 hat folgendes geschrieben : | | Edit1.left = 2*Label2.top-5 ein korrekter Ausdruck vom Typ boolean? |
Und zur Laufzeit eben wieder ein Wert wie jeder Ausdruck.
_________________ >λ=
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Do 04.06.09 22:03
Ok, dankeschön.
Aber wenn ich in der Arbeit bei jedem Ausdruck auch Wert hinschreibe ist das dann richtig oder falsch?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 04.06.09 22:09
Ich würde dir einen Haken geben  aber ich fürchte fast, dass dein Lehrer das etwas anders definiert als Narses. Hast du denn von ihm eine Definition oder Beispiele, bei denen Ausdruck und Wert nicht zusammen gegeben sind?
_________________ >λ=
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 04.06.09 23:29
Moin!
newbie333 hat folgendes geschrieben : | | 27 ist ein Ausdruck UND ein Wert vom Typ integer |
Theoretisch - ja.  Aber man wendet hier das Minimalprinzip an und würde 27 (nur) als Wert bezeichnen.
newbie333 hat folgendes geschrieben : | | Aber wenn ich in der Arbeit bei jedem Ausdruck auch Wert hinschreibe ist das dann richtig oder falsch? |
Kha hat folgendes geschrieben : | | aber ich fürchte fast, dass dein Lehrer das etwas anders definiert als Narses. |
Ich denke, er wird auch das Minimalprinzip verfolgen wollen.
Kha hat folgendes geschrieben : | | Hast du denn von ihm eine Definition oder Beispiele, bei denen Ausdruck und Wert nicht zusammen gegeben sind? |
Das wäre natürlich die einzig sichere Methode, das rauszufinden. Sollte dein Lehrer sich ausdrücklich nicht an das Minimalprinzip halten wollen, würde ich sagen, dass er sich auf sehr dünnes Eis begibt und das im Unterricht besser gut belegbar gefordert haben sollte.
newbie333 hat folgendes geschrieben : | | label1.top+Edit1.left ist ein Ausdruck vom typ integer, der korrekt ist |
Kha hat folgendes geschrieben : | | allgemein besitzt eine Anweisung keinen Datentyp. |
Das würde ich auch so sehen, ein Ausdruck ist typenlos, erst der Wert hat den Typ. Demnach würde ich als "korrekte Antwort" formulieren: ... ist ein korrekter Ausdruck, der einen Wert vom Typ Integer hat.
newbie333 hat folgendes geschrieben : | | 'HALLO' ist ein string, und ein Wert + Ausdruck? und ebenfalls korrekt |
Mein Vorschlag: ... ist ein Wert vom Typ String. Werte können nicht nicht korrekt sein, sie sind einfach das, was sie sind  und damit immer korrekt (also weglassen).
newbie333 hat folgendes geschrieben : | | label2.left := label1.top eine korrekte Anweisung vom typ integer? |
... ist eine korrekte Anweisung. Welchen Typ der Wert dieser hat, ist auf den ersten Blick nicht klar zu erkennen (innerhalb der VCL wäre der transportierte Wert Integer, aber das steht ja so nicht als Vorgabe dabei  ).
newbie333 hat folgendes geschrieben : | | '100' Ein string, wert + ausdruck? |
Das solltest du jetzt wieder selbst beurteilen können.
newbie333 hat folgendes geschrieben : | | Edit1.left = 2*Label2.top-5 ein korrekter Ausdruck vom Typ boolean? |
Also Boolean auf keinen Fall, es wird ja kein Wahrheitswert gebildet. Ich würde sagen: ... ist eine korrekte Anweisung, bei der ein Ausdruck, der einen Wert vom Typ Integer hat, zugewiesen wird.
newbie333 hat folgendes geschrieben : | true ist ein korrekter ausdruckvom typ boolean .. auch ein Wert?
'false' wert, string, korrekt.. ausdruck? |
Das müsstest du eigentlich auch wieder selbst hinkriegen.
newbie333 hat folgendes geschrieben : | | Label1.caption ist ein korrekter ausdruck vom typ string |
Das ist in meinen Augen ein dämliches Beispiel/Aufgabe, weil hier die Grenzen etwas verwischen. In meinen Augen ist das eine Variable (genauer: eine Klasseneingenschaft, und spätestens hier zeigt der Lehrer kein gutes didaktisches Geschick mehr  ). Aber ich vermute, er möchte hören: ... ist ein korrekter Ausdruck, der einen Wert vom Typ String hat.
newbie333 hat folgendes geschrieben : | | button1.heiht := 0.5*Button2.height ist eine falsche Anweisung vom typ integer/real |
... ist eine fehlerhafte (=nicht ausführbare) Anweisung, da der Ausdruck einen Wert vom Typ Real liefert, aber das Ziel der Zuweisung ein Speicherplatz vom Typ Integer ist (wenn man mal wieder die VCL unterstellt).
newbie333 hat folgendes geschrieben : | | 2*(Edit1.left+'75') ist ein falscher ausdruck, da unterschiedliche typen: string und integer |
... ist ein nicht bewertbarer Ausdruck, da die Typen der Werte nicht kompatibel sind.
newbie333 hat folgendes geschrieben : | | label1.visible := (Edit1.text= 'Hallo') ist eine korrekte Anweisung vom typ boolean |
... ist eine korrekte Anweisung, bei der ein Ausdruck, der einen Wert vom Typ Boolean liefert, zugewiesen wird (auch hier unterstellen wir mal wieder die VCL).
newbie333 hat folgendes geschrieben : | | (man sieht: ich versteh den unterschied zwischen Ausdruck und Wert noch nicht ganz) |
Kha hat folgendes geschrieben : | | Bei der Auswertung zur Laufzeit wird daraus ein Wert. |
Das ist der entscheidende Gedanke: ein Ausdruck ist sowas wie die Anleitung, wie man zu einem Wert kommt (im einfachsten Fall ist es bei einer Konstanten der Wert selbst, sonst muss die CPU halt ran und den Wert zur Laufzeit bestimmen/ausrechnen).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 05.06.09 00:27
Narses hat folgendes geschrieben : | newbie333 hat folgendes geschrieben : | | 27 ist ein Ausdruck UND ein Wert vom Typ integer | Theoretisch - ja. Aber man wendet hier das Minimalprinzip an und würde 27 (nur) als Wert bezeichnen.  |
Dann wäre "Ausdruck" ja nie eine korrekte/minimale Antwort  . Eigentlich sollte man das Ganze auf die drei Compile-Time-Begriffe Typ/Ausdruck/Anweisung (wobei es "Typ" natürlich auch zur Laufzeit gibt, s.u.) beschränken, einen parallelen Begriff einer anderen Ebene hinzuzufügen macht wenig Sinn. Und genau deswegen gehe ich davon aus, dass der Lehrer eine andere und wahrscheinlich auch nicht ganz saubere Version von "Wert" vertritt  ("Literal" ist immmer noch mein heißester Tipp).
Narses hat folgendes geschrieben : | Sollte dein Lehrer sich ausdrücklich nicht an das Minimalprinzip halten wollen, würde ich sagen, dass er sich auf sehr dünnes Eis begibt und das im Unterricht besser gut belegbar gefordert haben sollte.  |
Dass er zwischen Anweisungen und Ausdrücken unterscheidet, finde ich schon beeindruckend, aber wir sprechen hier immer noch über einen Info-Lehrer an einem Gymnasium  . Da werden auch mal Punkte abgezogen, weil die Lehrkraft keine "while not"-Schleife kennt  .
Narses hat folgendes geschrieben : | newbie333 hat folgendes geschrieben : | | label1.top+Edit1.left ist ein Ausdruck vom typ integer, der korrekt ist |
Kha hat folgendes geschrieben : | | allgemein besitzt eine Anweisung keinen Datentyp. | Das würde ich auch so sehen, ein Ausdruck ist typenlos, erst der Wert hat den Typ. Demnach würde ich als "korrekte Antwort" formulieren: ... ist ein korrekter Ausdruck, der einen Wert vom Typ Integer hat.  |
Das war auf Anweisungen bezogen  . Einem Ausdruck würde ich den Compile-Time-Typ zuordnen, eben den, der vom Compiler zur Typprüfung benutzt wird, im Gegensatz zum Run-Time-Typ des eigentlichen Wertes, der erst bei der Auswertung bekannt ist (was natürlich erst bei Polymorphie eine Rolle spielt). So wird es auch bei ASTs dargestellt sein.
Narses hat folgendes geschrieben : | newbie333 hat folgendes geschrieben : | | Edit1.left = 2*Label2.top-5 ein korrekter Ausdruck vom Typ boolean? | Also Boolean auf keinen Fall, es wird ja kein Wahrheitswert gebildet. |
Das ist ein Vergleich, keine Zuweisung  .
Narses hat folgendes geschrieben : | newbie333 hat folgendes geschrieben : | | Label1.caption ist ein korrekter ausdruck vom typ string | Das ist in meinen Augen ein dämliches Beispiel/Aufgabe, weil hier die Grenzen etwas verwischen. In meinen Augen ist das eine Variable (genauer: eine Klasseneingenschaft, und spätestens hier zeigt der Lehrer kein gutes didaktisches Geschick mehr ). Aber ich vermute, er möchte hören: ... ist ein korrekter Ausdruck, der einen Wert vom Typ String hat.  |
Es ist ein valider "Memberzugriffsausdruck"  . Und "Variable" ist doch gar kein Begriff, den er unterscheiden muss, also würde ich auch einen Variablenzugriff eindeutig als Ausdruck klassifizieren. Die Eigenschaft an sich könnte man als "TLabel.Caption" repräsentieren, aber eine Syntax gibt es dafür ja nicht.
_________________ >λ=
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 05.06.09 00:40
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Sa 20.06.09 11:06
Danke, hat geklappt in der Arbeit 
|
|
|