Entwickler-Ecke
Free Pascal - Fehler bei Pythagoras-Programm
Atideva - Mo 10.07.23 16:39
Titel: Fehler bei Pythagoras-Programm
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Program pythagoras; var x,y,z : integer; begin writeln ('Berechnen Sie die Seite x*x des Dreiecks');
readln(x) > y und Z; readln(y) > x und z; readln(z) > z und x; r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);z)) end. |
Dieses Program wird bei freepascal nicht kompiliert. Die Fehlerangabe wie folgt. Ich habe aktuell keine Ahnung, was ich genau ändern muss, um das Program zu kompilieren zu können. Es geht um den Lehrsatz des Pythagoras, der soweit ja bekannt sein dürfte. Grüße Erich
Zitat: |
pythagoras.pas(7,15) Error: Illegal expression
" (7,13): Warning: Variable "y" does not seem to be initialized
" (7,11): Error: Incompatible types: got "untyped" expected "LongInt"
" (7,15): Syntax error, ";" expected but "identifier UND" found
|
Moderiert von Th69: Delphi-Tags hinzugefügt
Moderiert von Th69: Quote-Tags hinzugefügt
Moderiert von Th69: Titel geändert (war "Es geht um den Pythagoras").
Andreas_500 - Mo 10.07.23 17:40
Hallo Atideva,
Versuch es mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| VAR a, b, c: Extended;
Begin Write('a = ? '); ReadLn(a);
Write('b = ? '); ReadLn(b); c:= Sqrt(Sqr(a) + Sqr(b));
WriteLn('c = ', c); ReadLn; End. |
Das ist zwar mit Delphi, aber es müßte auch mit FreePascal funktionieren.
Grüße, Andreas
jaenicke - Di 11.07.23 11:03
Atideva hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Program pythagoras; var x,y,z : integer; begin writeln ('Berechnen Sie die Seite x*x des Dreiecks');
readln(x) > y und Z; readln(y) > x und z; readln(z) > z und x; r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);z)) end. |
Dieses Program wird bei freepascal nicht kompiliert. |
Was hat der Quelltext mit Pascal oder Free Pascal zu tun?
Sinspin - Di 11.07.23 14:04
Na? Ne Hausaufgabe bekommen aber im Unterricht nicht aufgepasst?
Sind nicht eigentlich mittlerweile überall Ferien?
Das ist kein Quelltext, sondern eine Beschreibung dessen was umgesetzt werden muss. Wenn du das zum Quellen bringen willst muss das noch ein bisschen kochen.
Bei pythagoras musst du aufpassen, das ist so alt, das zerfällt beim Kochen leicht zu Staub.
Meißt helfen ein paar IF und THEN damit es stabiler wird.
Atideva - Mi 12.07.23 21:44
Ich wollte eigentlich auf Andreas antworten. Um die Situation zu klären. Ich bin Mathe Student an der Fernuni Hagen. Da ich kei Abi habe besuche ich aktuell die Präsenz VL.Mathe selbst läuft einigermaßen befriedigend. Da ich aber noch nie mit Prgrammieren zu tun hatte, und fast alle Mathe Studenten an der Fenuni offenbar schon damit etwas Erfahrung haben, funktioniert das bei mir aktuell noch nicht richtig. Die Übung selbt hatte garnicht zum Ziel den Satz des Pythagoras auch anzuwenden.Die Aufgabe war wie folgt eigentlich gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| program pythagoras(input,output);
var x,y,z : integer; r : boolean;
begin readln(x); readln(y); readln(z);
r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);
writeln(r); end. |
Das habe ich zuerst falsch gelesen oder falsch interpretiert. Deshalb war und ist leider noch immer meine Überlegung, wie ich dass mit den if ...then false or if.. then true.
Das Skript ist für einen Programmierneuling nicht unbedingt so gut nachvollziehbar. Ich habe dann eben weiterbrobiert und komme mit der Fehler meldung in Zeile 3(6) "illegarer charcater nicht klar. Die gganze 3. Zeile ist rot untersrichen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| program Beratung; var x,y,z : integer;
r : boolean; begiin if x > 0 and y > 0 then z true; if x <= 0 and y <= 0 then z false; readln z := x*x + y*y ; end. |
Ist es möglich, mir zu sagen, was falsch ist und wie ich es mit welcher Eingabe genau korrigiweren kann
Moderiert von Th69: Delphi-Tags hinzugefügt
jaenicke - Do 13.07.23 07:01
Atideva hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| program Beratung; var x,y,z : integer;
r : boolean; begiin if x > 0 and y > 0 then z true; if x <= 0 and y <= 0 then z false; readln z := x*x + y*y ; end. |
Ist es möglich, mir zu sagen, was falsch ist und wie ich es mit welcher Eingabe genau korrigiweren kann |
Die Frage ist, was du mit dem Quelltext erreichen wolltest.
Du prüfst als erstes, ob x und y größer als 0 sind. Diese haben aber noch keinen Wert bekommen. Das kannst du mit einem Fahrschein vergleichen, den du abstempeln musst. Du schaust nach der Uhrzeit des Stempels, bevor du ihn überhaupt abstempelst.
Wenn das der Fall ist, führst du "
z true;" aus. Meintest du
z := True;? Das geht aber nicht, denn du kannst einen boolschen Wert (true oder false) nicht an eine Zahl (z, ein Integerwert, also ein Zahlenwert) zuweisen. Was ginge, wäre
r := true;.
Du solltest einmal überlegen, was du machen möchtest, ganz ohne Quelltext. Also z.B.:
- Ich möchte, dass der Benutzer einen Wert für x eingibt.
- Ich möchte, dass der Benutzer einen Wert für y eingibt.
- Ich möchte prüfen, ob der Wert für x größer als 0 ist und ansonsten einen Fehler anzeigen.
- ...
Danach kannst du dann jeweils schauen, wie du das im Quelltext umsetzen kannst. Dabei kann dir z.B. diese Einführung helfen:
https://lp.embarcadero.com/delphi-einfuehrung-objectpascal
Insbesondere solltest du die einzelnen Punkte einzeln umsetzen und prüfen, ob das kompiliert und tut, was du möchtest.
Die Fehlermeldung illegal character dürfte eher daher rühren, dass du etwas z.B. aus einer PDF-Datei kopiert und in den Quelltext eingefügt hast. Dabei hast du dann genau das mit kopiert, was da steht: Einen illegal character, sprich ein unpassendes Zeichen. Das kann ein falsches Leerzeichen sein oder ähnliches. Da kannst du einfach alle Leerzeichen einmal entfernen und wieder eingeben, ebenso den Zeilenumbruch, dann sind solche Zeichen weg.
Andreas_500 - Do 13.07.23 10:29
Hallo Atideva,
Du solltest etwas systematischer vorgehen, wenn Du solche mathematischen Aufgabenstellungen programmieren willst. Im Falle "Pythagoras" würde ich so vorgehen:
1): Aufgabenstellung präzise definieren
Was ist gegeben, was konkret will ich berechnen?
2): Skizze machen
- Rechtwinkliges Dreieck zeichnen, Seiten mit Symbolen versehen.
- Übliche Symbole sind
a: Kathete b: Kathete, c: Hypotenuse
- Bitte passende Mathematik-Bücher benutzen!
3): Notwendige Formeln zusammentragen
z. B. c^2 = a^2 + b^2 c = Wurzel(a^2 + b^2)
4): Lösungsweg auf dem Papier "zu Fuß" (= manuell) ausarbeiten
5): Manuellen Lösungsweg in Pascal umsetzen
- Gegebene Daten sollen eingelesen werden, berechnete Werte ausgeben
- Datentypen festlegen für die Variablen a, b, und c.
Integer (= Nur ganze Zahlen) sind hier NICHT sinnvoll, denn eine Seitenlänge von z.B. 3,5 m wäre nicht möglich!
Also: Datentype
Extended (höchstmögliche Genauigkeit) oder
Double wählen etc.
- Danach kannst Du Dir Gedanken machen, welche Eingaben sinnvoll sind, welche nicht und baust Überprüfungen
If .. Then ein das Programm ein.
6): Du mußt mindestens Grundkenntnisse in der Programmierspreche Pascal haben.
Der Computer nimmt alles 100%-ig genau und versteht nur eine gewisse Anzahl von Anweisungen (= Befehlen).
In Deinem Programm die 6. Zeile kann er nicht verstehen, weil Du Dich vertippt hast:
Korrekt muß es heißen
begin mit einem i! usw. usf.
Zum Lernen könntest Du neben Sebastian’s Empfehlungen auch noch ein kostenloses E-Book verwenden: Es ist leider nur noch im Web-Archiv zu finden. Hier ist die letzte Auflage aus dem Jahr 2013:
http://web.archive.org/web/20140208135147/https://www.delphi-treff.de/downloads/e-book/
Das ist zwar für Delphi, aber die Pascal-Sprachelemente funktionieren auch in Free-Pascal.
Wünsche Dir viel Erfolg!
Grüße
Andreas
jaenicke - Do 13.07.23 11:48
Das ist die alte Version des von mir geposteten E-Books. Dieses wurde auf den neuesten Stand gebracht und neu veröffentlicht, wie auch am Delphi-Treff Logo im Buch sowie dem entsprechenden Hinweis deutlich erkennbar ist:
Zitat: |
Basierend auf dem Lehrbuch des Delphi-Treff von den Autoren:
FLORIAN HÄMMERLE, MARTIN STROHAL, CHRISTIAN REHN, ANDREAS HAUSLADEN |
Andreas_500 - Do 13.07.23 14:41
Das war mir nicht bekannt, Sebastian. :oops:
gurusmi - Do 13.07.23 15:48
Atideva hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| program pythagoras(input,output); var x,y,z : integer; begin writeln ('Berechnen Sie die Seite x*x des Dreiecks');
readln(x) > y und Z; readln(y) > x und z; readln(z) > z und x; r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);z)) end. |
|
Mit dem Fehler hat der Compiler durchaus recht. Wenn man das Programm zeilenweise von oben nach unten liest, stellt man sofort fest, daß mit dem readln(x) die Variable X initialisiert wurde. Die Variable Y ist zu dem Zeitpunkt dieser Zeile noch nicht initialisiert worden. Deshalb haut es den Compiler beim zweiten Teil der Zeile ">y und Z;" auf die Schnauze. Y und Z werden erst in den darauffolgenden Zeilen initialisiert.
Atideva - Do 13.07.23 15:49
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Program Pythagoras; var x,y,z : integer; r : boolean; begin if x > 0 and y > 0then z true; if x <= 0 and y <= 0 then z false; readln z := x*x + y*y; end. |
Das ist das aktuelle Programm, das nicht kompiliert wird. Zuerst hatte ich nach
boolean das
; vergessen. Bei diesem Fehlercode hieß es in der 3.Zeile 6. Spalte illegaler character. Ich hatte dann hinter
boolean das
; hinzugefügt, und dann gab es den Fehlercode (5,1) illegaler character. Diese Zeilen waren genauso geschrieben, wie sie auch zusammen mit der ML, in der es allerdings nicht darum ging, die Hypotenuse mittels Pythagors auszurechnen. Und die korrekt Lösung sah dann so aus. Bei
begin kann ich nichts ändern, weil dass ja richtig ist, ich vermute jetzt weitere Fehler, die noch nicht angezeigt werden, warum auch immer.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| program pythagoras(input,output);
var x,y,z : integer; r : boolean;
begin readln(x); readln(y); readln(z);
r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);
writeln(r); end. |
Moderiert von Th69: Delphi-Tags hinzugefügt
Andreas_500 - Do 13.07.23 16:46
Zitat: |
... es allerdings nicht darum ging, die Hypotenus mittels Pythagors auszurechnen
|
Das kann man nicht immer erraten... :D
Jede Aufgabe beginnt mit einer konkreten
Aufgebenstellung. Und die hast Du uns verschwiegen. So waren wir auf Rätselraten angewiesen.
Du solltest
selbstsprechende Variablennamen verwenden und bei der Eingabe hinschreiben was konkret eingegeben werden soll, damit der Benutzer weiß, war erwartet wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ... Write(’Hypotenuse x = ? ’); ReadLn(x);
Write(’Ankathete y = ? ’); ReadLn(y);
Write(’Gegenkathete z = ? ’); ReadLn(z); ... |
Und auch das Ergebnis im Klartext formulieren:
Delphi-Quelltext
1:
| WriteLn(’Die Konsitenz der Eingabedaten x, y, und z ist: ’, r); |
Noch ein Tipp: Deinen Pascal-Code solltest Du wegen der besseren Lesbarkeit zwischen
Delphi-Tags
schreiben, damit es schön formatiert wird.
Andreas_500 - Do 13.07.23 20:07
@ Sebastian Jänicke
Ich habe mal den von Dir empfohlenen Link getestet, Sebastian:
https://lp.embarcadero.com/delphi-einfuehrung-objectpascal
Abgesehen davon, daß sich mein Werbeblocker sofort eingeschaltet und das Laden der Seite zunächst blockiert hat:
habe ich mich mit allen den geforderten persönlichen Daten heute um 15:25 Uhr (also vor mehr als 4 Stunden) angemeldet. Ich erhielt zwar sofort die Meldung
"Form was submitted! Thank you for submission.", aber
einen Download-Link habe ich bisher nicht erhalten.
Ist es nur bei mir so, oder ist
https://lp.embarcadero.com/delphi-einfuehrung-objectpascal etwa nur
für Daten-Phising konzipiert?
Ähnlich negative Erfahrungen habe ich gemacht mit
„Das Kapitel 8 - Mobile Anwendung Souffleur mit Delphi ist zum kostenfreien Download verfügbar.“ auf:
https://lp.embarcadero.com/delphilernen?utm_source=Eloqua&utm_medium=email&utm_content=Learn-Delphi-eBook-DACH-210621
als ich mich in einem ähnlichen Prozedere am
21.06.2021 (also vor mehr als 2 Jahren) registriert habe, aber vollkommen leer ausging und bis heute
gar nichts bekommen habe.
Vielleicht liest hier auch Matthias Eißing von Embarcadero mit und kann u.U. intervenieren...
Danke & Grüße
Andreas
jaenicke - Do 13.07.23 22:27
Das steht auf der Seite aber drauf, dass sie mit manchen Anbietern Probleme haben. Da kannst du nur eine andere Mailadresse nehmen. Bei manchen kommen die Mails einfach nicht an, das Problem habe ich auch bei eigenen Mails manchmal.
Bei Microsoft (outlook.com) funktioniert es z.B. meistens, bei GMX oder web.de kommt relativ viel nicht an (dafür halt deren eigene Werbung sehr gut :twisted: ).
Andreas_500 hat folgendes geschrieben : |
Vielleicht liest hier auch Matthias Eißing von Embarcadero mit und kann u.U. intervenieren... |
Nein, der liest nur drüben in der Delphipraxis mit, kann aber am Verhalten der E-Mail-Anbieter auch nichts ändern.
gurusmi - Sa 15.07.23 12:49
Atideva hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Program Pythagoras; var x,y,z : integer; r : boolean; begin if x > 0 and y > 0then z true; if x <= 0 and y <= 0 then z false; readln z := x*x + y*y; end. |
Das ist das aktuelle Programm, das nicht kompiliert wird. Zuerst hatte ich nach boolean das ; vergessen. Bei diesem Fehlercode hieß es in der 3.Zeile 6. Spalte illegaler character. Ich hatte dann hinter boolean das ; hinzugefügt, und dann gab es den Fehlercode (5,1) illegaler character. Diese Zeilen waren genauso geschrieben, wie sie auch zusammen mit der ML, in der es allerdings nicht darum ging, die Hypotenuse mittels Pythagors auszurechnen. Und die korrekt Lösung sah dann so aus. Bei begin kann ich nichts ändern, weil dass ja richtig ist, ich vermute jetzt weitere Fehler, die noch nicht angezeigt werden, warum auch immer.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| program pythagoras(input,output);
var x,y,z : integer; r : boolean;
begin readln(x); readln(y); readln(z);
r := (x*x = (y*y + z*z)) or (y*y = (x*x + z*z)) or ((x*x + y*y) = z*z);
writeln(r); end. | |
Im ersten Codeschnipsel hätte ich zuerst einmal die Zeilen 6 & 7 korrigiert.
In zeile 6 fehlt ein Blank und eine Zuweisung.
In Zeile 7 fehlt ebenso eine saubere Zuweisung.
In Zeile 8 fehlt der Zeilenabschluß (
;)
Im zweiten Codeschnipsel hätte ich drei weitere temporäre Boolean-Variablen verwendet, um die Zuweisung einzukürzen. Bei einem derartigen Spaghetti-Code bzw. Programmierstil hätte mich jeder meiner Dozenten so schnell geschlachtet, daß ich nicht gewußt hätte, wie ich heiße.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!