Es geht um ein Program für Pythagoras

Aufrufe: 555     Aktiv: 10.07.2023 um 21:59

0

Vervollständigen Sie das folgende Pascal-Programm, so dass es die folgende Spezifikation erfüllt.

Eingabe: x, y, z ∈ ℕ und x, y, z sind die Längen der Seiten eines Dreiecks

Ausgabe: r ∈ {true, false}

Nachbedingung: r ist genau dann true, wenn jedes Dreieck mit den Seitenlängen x, y und z einen rechten Winkel besitzt.

program pythagoras(input,output);

var x,y,z : integer; r : boolean;

begin readln(x); readln(y); readln(z);
writeln(r) end. das ist die Musterlösung bei der ich nicht weiß, wie und genau wo ich eine Eingabe machen muss r := (xx = (yy + zz)) or (yy = (xx + zz)) or ((xx + yy) = zz); Das ist mein Versuch bisher, der fehlgeschlagen ist. program pythagoras; var x,y,z : integer; r : boolean; r := (xx = (yy + zz)); begin readln(x); readln(y); redaln(z); writeln(r); end. Das Ganze soll auf Geany laufen. Dieser Editor hängt natürlich mit Pascal zusammen. Mit der Fehlermeldung komme ich aktuell nicht klar. Wer kann mir hier weiterhelfen. Danke im Voraus.

Diese Frage melden
gefragt

Punkte: 12

 

program pythagoras;
var
x,y,z : integer;
r : boolean;
r := (xx = (yy + z*z));
begin
readln(x);
readln(y);
redaln(z);
writeln(r);
end.

  ─   atideva 27.06.2023 um 21:35

Der Fehler liegt offenbar bei r :=...

  ─   atideva 27.06.2023 um 21:35

Hallo Erich, bin zeitlich aktuell arg eingespannt. Falls du keine Antwort von jemand anderem bekommst, versuche ich am Wochenende Zeit zu finden. Eine erste, ungetestete Einschätzung aber wäre, dass Du im Deklarationsbereich, also vor BEGIN eine Operation versuchst. Das kann m. M. nach der Compiler nicht. Operationen (r:=…) erst zwischen BEGIN und END. Versuch das mal. Gruß jobe.

  ─   jobe 29.06.2023 um 08:29
Kommentar schreiben
1 Antwort
0

Hallo Erich, wie ich vermutet habe. Im Deklarationsbereich wird alles als "Deklaration" interpretiert. Deshalb versucht der Compiler die Anweisung r := (xx = (yy + zz)); als Deklaration zu verarbeiten. Da er aber in der Zeile darüber schon ein „r :“ gefunden hat sagt er dir, dass das „r“ zweimal versucht wird zu definieren was natürlich nicht geht. Nächstes Problem: redaln(z); redaln gibt es nicht :-) Deine mathematische Anweisung „r := (xx = (yy + zz));)“ versteht weder der Compiler noch ich. Was willst du denn rechnen? Wie bestimmst du dass es ein rechtwinkliges Dreieck ist? Beachte: X := X+1; ist mathematischer Unfug – für den Compiler aber in allen mir bekannten Programmiersprachen eine gültige Rechenoperation. Die Zeile bedeutet: Nehme den Wert von X, addiere 1 drauf und speichere das Ergebnis wieder in X ab. Mit dieser Anweisung wird also „nur“ X um 1 erhöht. Vorgehensweise: die Rechenoperation(en) nach den readln() Anweisungen machen . Fürs Rechnen ist ja der Mathematiker zuständig ;-) Gruß jobe

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Das diese Eingabe so nichts bringt war mir irgendwann dann auch klar. Es geht im Grunde darum für den Pythagoras das so einzubauen, dass der Rechner weiß, was er zu tun hat. Es geht eben darum, dem Rechner zu sagen, dass das Quadrat von xx dasselbe ist wie yy+z*z. Und da bin ich noch am überlegen. Es kommen ja auch nur bestimmte ganze Zahlen in Frage, denn es ist ja nur von integer und nicht von real die Rede. Ich stelle es mir zwar nicht so sehr schwer vor, aber bis jetzt ist mir die passende Eingabe noch nicht klar.

  ─   atideva 30.06.2023 um 19:09

Hallo Erich, Compiler sind dumm. Ihnen muss man alles genau erklären und sie können sie außer +-: im Standard keine mathematische Operationen. Hierfür haben die Compiler Bibliotheken mit Funktionen für Dinge wie mathematische Operationen. Zum Wurzel ziehen brauchst du z.B. die Funktion sqrt(). Versuche nicht deinen Compiler mit möglichst komplizierten Ausdrücken an seine Grenzen zu bringen. Der Compiler ist eine Maschine. Sie lässt sich dadurch nicht beeindrucken. Mach einfach, in Anlehnung an meine Antwort, mehrere Anweisungen wie z.B. x:=xx; zum Quadrieren. Wenn du dann alle Quadrate gemacht hast kannst du einen if then else für die Bestimmung von r benutzen. So habe ich die Aufgabe implementiert und geht problemlos. Ein Hinweis noch: die readln() haben keine Textausgabe. Wenn du das Programm startest siehst du nur einen Cursor, sonst nichts. Mach vor dem readln() noch einen writeln() mit einem Hinweis was zu tun ist. Sei bitte vorsichtig mit „ist gleich“ in IFs. Computer sind keine Taschenrechner wenn du mit NICHT Integer Zahlen operierst ist 10.0 / 3.0 * 3.0 nicht mehr unbedingt 10.0 und ein Vergleich auf „ist gleich 10.0“ wird dann fehlschlagen. Gruß jobe.

  ─   jobe 01.07.2023 um 11:08

Da ich noch immer an dieser Aufgabe dran bin, hier eine Antwort, die ich im Kurs Einführung in das imperative Programimieren an der Fernuni Hagen gestellt habe. Ich habe gefragt, wie ich denn den Pythagoras hier vervollständigen könne, da doch auch real Zahle vorkommen könnten.
Wieso willst Du hier eine integer Zahl raus bekommen?

Die variablendeklarationen sind in dem Beispiel vorgegeben

x,y,z: integer:
r : boolean:

Das einlesen der Werte ist ebenfalls vorgegeben
readln(x)
readln( y)
readln(z)

Das heisst die variablen x, y und z enthalten bereits integer werte, die du nur verarbeiten sollst, und dann entsprechend dem ergebnis die variable r auf true oder false setzten also ein boolsches ergebins liefern.

Diese kannst due entweder wie in der ML. gezeigt in einer Zeile machen, oder du brichst/bringst die aufgabenstellung runter in die 3 varianten (x,y,zjeweils vertauscht), nutzt ein if und setzt dann damit r explizit.

Vom prinzip her ist es aber (wie in der ML.)damit getan, die aufgabenstellung mit mathematischen mitteln zu lösen als Logikgleichung und dann das ergebnis einfach r zuzuweisen.

Die ML. r := (xx = (yy + zz)) or (yy = (xx + zz)) or ((xx + yy) = z*z)

Hast Du evt. eine Ahnung wie das mit dem verarbeiten und oder dem vertauschen und denn entsprechenden zuweisen gemeint sein kann. Ich habe zwar dort jetzt auch noch mal nachgefragt, aber das kann dort dauern, und ich selbst habe da im Moment leider etwas ein Brett vor dem Kopf, obwohl ich nicht glaube, dass das so kompliziert ist, aber ich komme eben nicht drauf.

  ─   atideva 07.07.2023 um 23:01

Hallo Erich, erstmal ist der Code der ML nicht kompilierfähig. Meine Pascal Kenntnisse sind so ca. 35 Jahre alt, aber meines Wissens geht Quadrieren nicht mit xx oder yy. Wie soll das auch gehen? Der Compiler denkt bei xx an eine Variable die nicht deklariert ist und meldet Identifier not found wo er Recht hat. xx ist nicht deklariert. Ich vermute mal, dass mit xx eigentlich xx gemein ist. Wenn du also zwischen die x, y und z wie ganz rechts in der ML gezeigt ein““ setzt weiß der Compiler was du willst und macht das richtig. Also so: r := (xx = (yy + zz)) or (yy = (xx + zz)) or ((xx + yy) = zz); Ich persönlich halte nicht so viel von solchen Horroranweisungszeilenkonstruktionen ;-) Ich hätte erst die Quadrate berechnet und dann mit einer IF Anweisung r bestimmt. Vermutlich haben sie das in ihrer Antwort gemeint. Verarbeiten: x:=xx; y:=…. Vertauschen: IF (x=y+z) or (y=x+z) or (…. Hoffe es hilft. Gruß jobe

  ─   jobe 09.07.2023 um 11:37

Program pythagoras;
var
x,y,z : integer;
begin
writeln ('Berechnen Sie die Seite x des Dreiecks');
dann : ('x > 0, y > 0, z > 0 und x > y und z > 0');
(xx = (yy + zz))
readln(x) > y und Z;
readln(y) > x und z;
readln(z) > z und x;
if : r := (x
x = (yy + zz)) then true
if : r := (yy = (zz + xx)) or (zz = (xx + yy)) then false
end.
In der Zeile unterhalb von writeln muss der Fehler liegen. Es geht um die Identifikation der Variablen und ich weiß zumindest noch nicht, wie das geht. Was die Multiplikation angeht, so orientiere ich mich jetzt an diesem Teil des Kurstextes der Fernuni.
Der Standarddatentyp integer
Dieser Typ definiert ein Intervall der ganzen Zahlen; jeder Wert dieses Typs ist
folglich eine ganze Zahl. Wie in Abschnitt 3.4 "Zahlen" bereits gesagt, steht in jeder
Implementierung von Pascal nur ein beschränktes Intervall der ganzen Zahlen als
Wertebereich für den Typ integer zur Verfügung. Die Darstellung von integer-Zahlen wurde im Abschnitt 3.4 "Zahlen" beschrieben.
Der Datentyp integer verfügt über die folgenden arithmetischen Standardoperationen:
+ Addition,
- Subtraktion,
Multiplikation,
div ganzzahlige Division ohne Rest und
mod Restbildung bei ganzzahliger Division.
Ich habe mich bis jetzt versucht , an diesem Program zu orientieren. Mir ist allerdings nicht klar, wie ich den Identifizierer von dem Program "Kreisumfang" auf das Program "Pythagoras" übertragen kann.

Grüße
Erich

  ─   atideva 09.07.2023 um 19:49

Hallo Erich, die Zeile unter dem writeln() verstehe ich leider gar nicht. So wird’s dem Compiler auch gehen. Was willst du denn mit dieser Zeile bezwecken? Wenn du eine weitere Zeile als Erklärung ausgeben willst musst du sie wie darüber in einen writeln() packen. Wenn die Zeile (xx = (yy + zz))ebenfalls erklärender Text sein soll, gilt auch hier das eben gesagte. Ich gebe dir jetzt mal den Code der so bei mir läuft und hoffentlich alles berücksichtigt. Mache ich nicht gerne. Man soll ja was lernen, aber ich fürchte wir stecken irgendwie in einer Sackgasse. Wenn das Programm läuft kannst du es ja analysieren und mit try and error manipulieren.
Program pythagoras;
var
x,y,z : integer;
r : boolean;

begin
writeln('Berechnen Sie die Seite x des Dreiecks');
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.
Hoffe du kommst damit weiter. Bei Fragen, fragen. Gruß jobe
PS Wichtig!!! Was mir gerade eben erst auffällt ist, dass der ach so tolle Editor des Forums die Eingabe x mal x als xx darstellt. Erst, wenn man x space mal space x eingibt wird es korrekt dargestellt.

  ─   jobe 09.07.2023 um 21:37

Ich habe heute auch nochmal im Kurs Einführung in die imperative Programmierung meine Problematik geschildert. Darauf hat mir jemand eine Kopie zugeschickt, die ich dann als Programm übernommen habe, und es hat funktioniert. Und zwar wie folgt:
program pythagoras(input,output);

var
x,y,z : integer;
r : boolean;

begin
readln(x);
readln(y);
readln(z);

r := (xx = (yy + zz)) or (yy = (xx + zz)) or ((xx + yy) = z*z);

writeln(r);
end. Ich wollte die ganze Zeit an einem Program arbeiten, bei dem ich dann Zahlen eingeben kann um die Hypotenuse zu berechnen , und das war gar nicht gefragt. Ich habe offenbar die Aufgabe nicht so verstanden, wie sie gemeint war.
Grüße
Erich

  ─   atideva 10.07.2023 um 21:59

Kommentar schreiben