Funktion MAX

B

Bizepsbenny

Gast
Hallo zusammen.
Ich bin ein Programmier-Anfänger (PASCAL) und wollte auf diesem Weg einmal fragen, ob mir jemand die Aufgabe verständlich erklären kann? Bildschirmfoto vom 2017-10-28 15-41-12.pngBildschirmfoto vom 2017-10-28 15-41-26.png

Danke und Grüße

BB
 
eigentlich sollte es über google kein problem darstellen herauszufinden, was die funktion max anstellt.
 
Hallo,

danke für die Antwort.

Klar, ich habe schon verstanden, was die Funktion max bewirkt, sie findet die größte Zahl in einem Feld.
Ich finde nur kein Ansatz, um mit den Programmstücken ein Programm zu erstellen. Hast du da vllt einen Vorschlag?

Danke für die Antwort.
Gruß
BB
 
Bizepsbenny schrieb:
Ich finde nur kein Ansatz, um mit den Programmstücken ein Programm zu erstellen.

Was meinst du damit? Die Aufgabe ist wie folgt: Lese den Quellcode und verstehe, was die Funktion max macht. Wenn du das verstanden hast, sind im zweiten Bild fünf Code-Schnipsel aufgeführt, die jeweils die Funktion max aufrufen. Du sollst nun herausfinden, bei welchen Aufrufen der Funktion max es eventuell zu Problemen kommen kann und bei welchen eben nicht.
 
@Nase

Ich meinte damit, um die Code-Schnipsel per Compiler zu testen zu können, muss ich ja noch ein komplettes Programm erstellen.

Aber dein Ansatz ist auch gut.

Also ich habe schonmal (einigermaßen) verstanden, dass die Funktion den Parametern "ParFeld, von, bis " integer-Werte zuweist.

In die Variable "Wert", wird die erste eingegebene Integer-Zahl "von" gespeichert. Für "von+1" bis "bis" wird eine Schleife durchlaufen lassen. Wenn die Schleife auf einen Wert trifft, der größer als der in "Wert" gespeicherte ist, wird dieser in Wert gespeichert und überschreibt den alten. Als max hat man somit den größten Wert des Feldes.

Stimmt das einigermaßen?

Gruß
BB
 
Die Funktion gibt den größten Eintrag aus einem Integerarray aus, das stimmt und ist auch einigermaßen intuitiv für eine Funktion namens max. Danach ist aber in der Aufgabenstellung nicht gefragt.

Vielleicht hilft es dir ja, dir die textuellen Angaben nochmal mathematisch aufzuschreiben:
tIndex ∈ [1, Grenze], wobei Grenze als konstante, natürliche Zahl gegeben ist. Und tFeld[tIndex] ∈ ℤ.
Die Funktion hat einen gewissen gültigen Definitionsbereich über Ihre Parameter.
Die Frage ist, in welchen der gegebenen Codeauszüge dieser Definitionsbereich bei den gegebenen Größen keinesfalls verlassen wird. Einen Compiler brauchst du dazu nicht, vielmehr sollst du die Codeschnipsel selbst analysieren.
 
@simpsonsfan

Ja, diese Anschauung hilft mir schon eher, ansonsten ist der Quelltext für mich bisher eher unübersichtlich. Kann man tFeld[tIndex] auch als Teilmenge von Z auffassen?

PS: Hast du schon eine Lösung?

Gruß
BB
 
Du kannst in diesem Kontext tFeld als Teilmenge von ℤ auffassen. Es ist mathematisch nicht ganz richtig, da Mengen definitionsgemäß ungeordnet sind und Arrays/Vektorfelder geordnet. Und bei den Aufgaben hier spielt die Reihenfolge der Einträge durchaus mal eine Rolle. Du kannst dir aber in dem Fall, wenn es dir hilft, tFeld gedanklich nochmal in mehrere Teilmengen aufteilen.
Edit: wobei ein einzelnes Element tFeld[tIndex] definitionsgemäß dann natürlich eine Teilmenge der ganzen Zahlen darstellt, mit eben nur einem Element.
Ich habe die Lösung, aber es würde dir natürlich nicht helfen, wenn ich es dir hier einfach hinklatsche.
Nur so viel noch, man muss nich wissen, wie die for-Schleife in Pascal in einem gewissen Grenzfall reagiert, musste ich zumindest nachschauen, siehe hier.
 
Zuletzt bearbeitet:
Moin,

es würde mir in der Hinsicht helfen, dass ich morgen bis 12 Uhr die Lösung einsenden muss, um Punkte für die Klausurzulassung im Februar zu bekommen. ;)

Einzig die Zeit ist etwas knapp, um es ausführlich zu verstehen.

Mache Fernstudium.

Zum Thema: Soweit ich es sehe, wird die Bedingungsvariable der for-Schleife doch geändert, was nicht erlaubt ist oder? Dann wäre die Antwort: A, B, C, D, E.

Gruß
BB
 
Zuletzt bearbeitet:
Die Schleife ist erstmal überhaupt nicht das Problem. Fang vorne an und schau dir den Funktionsaufruf an. Welche Werte werden denn der Funktion max überhaupt als Parameter übergeben? Und liegen diese Werte in einem für die Funktion gültigen Bereich?

Erstelle dir ein Feld mit zehn (zehn, weil GRENZE = 10 und tIndex = 1..GRENZE) Werten. Z.B. Feld[0] = 234, Feld[1] = 78, Feld[3] = 0, usw. Dann nimm dir den Funktionsaufruf der Codeschnipsel und setze dort die konkreten Werte ein.

Was würde da also stehen, wenn du die entsprechenden Werte in max(Feld, Feld[0], Feld[GRENZE]) einsetzt? Und sind die Werte, die für die Parameter "von" und "bis" eingesetzt werden, gültig? Schaue dazu auf das erste Bild, was unter "Konstanten-, Typ- und Variablenvereinbarungen" steht.
 
@Nase

Hi,

also zum ersten Teil:
Als Parameter werden Werte aus tFeld (ParFeld) und tIndex (von, bis) übergeben. Und der gültige Wertebereich der Funktion ist integer, also liegen sie alle im Wertebereich, richtig? Ich gehe davon aus, mit Wertebreich ist der Ergebnistyp im Funktionsaufruf gemeint? Nach der Klammer.

Achso, und die Codeschnipsel sind alles Funktionsaufrufe?
Das hatte ich auch noch nicht gecheckt.

Wieviele Felder muss ich erstellen? Das ist mir noch nicht klar.

Gruß
BBBildschirmfoto vom 2017-10-29 16-43-00.png
 
Zuletzt bearbeitet:
Nein, der Wertebereich aus der Aufgabenstellung ist der Definitionsbereich der Eingangsparameter.
Um es noch etwas deutlicher zu sagen: Wenn du z.B. ein Array Feld[1..10] mit zehn Einträgen und einem Index von 1 bis 10 hast, dann ist etwa ein Zugriffsversuch test = Feld[33] oder test = Feld[-4] illegal.

Ach und der Hinweis mit dem Verhalten der for-Schleife sollte darauf abzielen, was passiert, wenn da mal sowas stünde
for i:= 11 to 10 do ParFeld ...
wie aber dem Link zu entnehmen ist, wird dann einfach gar nichts ausgeführt, also stellt das kein Problem dar.

Und jedesmal, wenn in den Codeschnipseln aus den Antwortmöglichkeiten max steht, dann ist das ein Funktionsaufruf deiner vorher definierten Funktion max.

Hier übrigens mal ein Beispiel an Eingangsdaten, für die in mindestens einem der Antwortmöglichkeiten Probleme auftreten könnten:
Code:
Feld[1] = -20
Feld[2] = 0
Feld[3] = 1
Feld[4] = 37
Feld[5] = 4
Feld[6] = 5
Feld[7] = -11
Feld[8] = 0
Feld[9] = 18
Feld[10] = 9
 
Zuletzt bearbeitet:
@Bizepsbenny: Nicht so ganz. Du wirfst da einige Dinge durcheinander.

function max(...) : integer
Das hier definiert den Datentyp der Funktion. Die Funktion soll also einen Integer als Ergebnis liefern. Würde die Funktion etwas anderes zurückgeben (Float, String, ...), dann wäre das ein Programmfehler.

function max(ParFeld : tFeld, ...)
Hier ist ParFeld eine Variable vom Datentyp tFeld. Der Datentyp tFeld ist unten auf Bild 1 angegeben als array[tIndex] of integers, also als ein Array mit insgesamt zehn Integers (Ganzzahlen). Array kannst du mit Feld übersetzen, bezeichnet also sprachlich das Gleiche.

function max(..., von, bis : tIndex)
Die Variablen von und bis sind hier vom Datentyp tIndex. Du findest den Datentyp wieder unten auf Bild 1. tIndex ist definiert als Bereich von 1..GRENZE, wobei GRENZE = 10 ist. Also ist tIndex ein Wertebereich von 1 bis 10. Damit müssen auch die Variablen von und bis innerhalb dieses Wertebereichs liegen.

Zu der Frage, wieviele Felder es gibt: Es gibt ein Feld. Dieses Feld kann 10 Integer-Werte aufnehmen. Welche 10 Werte im Feld stehen, ist laut Aufgabe undefiniert ("egal, welche integer-Werte im Feld vorkommen"). Diese Formulierung ist auch ein Knackpunkt bei der Aufgabe.

Bild 2 gibt dir verschiedene Aufrufe der Funktion max vor. Die Unterschiede sind in den Werten, die den Parametern von und bis übergeben werden, zu finden. Deine Aufgabe ist es, zu überprüfen, ob diese Parameter gültig/zulässig sind, also innerhalb des Bereichs 1 bis 10 liegen.
Als Beispiel wird in Aufgabe A die Funktion max aufgerufen mit von = Feld[1] und bis = Feld[GRENZE]. Du musst jetzt also beantworten, welche konkreten Wert hinter Feld[0] und Feld[GRENZE] stehen könnten und ob die Funktion max damit korrekt ausgeführt werden kann.
 
Zuletzt bearbeitet von einem Moderator:
Ok ich habe immer noch nicht alles gecheckt (Ist mega schwer), aber eure Hilfe ist super!

Also, ich habe verstanden, dass die Funktionsaufrufe so aufgebaut sind max (Feld, von, bis).


Aber mit Bereich ist was konkret gemeint. Bezieht sich das 1-10 auf

Feld[1]
Feld[2]
Feld[3]
Feld[4]
Feld[5]
Feld[6]
Feld[7]
Feld[8]
Feld[9]
Feld[Grenze]

also es kann kein Feld[-1 ] und kein Feld[11] geben?

Oder bezieht es sich auf die Werte der Felder 1-Grenze?





Gruß
BB
 
Zuletzt bearbeitet:
Grundsätzlich richtig. Aber bevor du überhaupt zur Schleife kommst, passiert ja noch mehr. Nimm dir mal das Feld von simpsonsfan und probier Zeile für Zeile aus, was die Funktion max macht.
 
@Nase
Danke für die Antwort, hatte meinen letzten Beitrag schon editiert, mir fallen keine richtigen Fragen mehr ein ;-)

Also ok, ich nehme das Feld von simpsonsfan und setze es in A ein

A) w := max(Feld, -20, 9)

das müsste dann den Wert 9 ausgeben oder wie?

Gruß
BB
 
Von der Idee her schon sehr schön. Du hast den Funktionsaufruf richtig gestaltet. Überleg dir aber noch einmal, was die Variablen von und bis bedeuten.

Um es sprachlich anders darzustellen, überlege dir folgendes: Du hast ein Buch vor dir. Ein Buch besteht aus mehreren Seiten. Jede Seite hat eine Seitennummer. Du kannst also sowas formulieren wie: „Lese Seite 5“ oder „Lese die Seiten 3 bis 7“. Oder: „Lese Buch[5]“. Die „5“ ist dabei die Seitenzahl — man könnte die auch Index nennen. Jetzt nehmen wir an, dein Buch hat genau 10 Seiten. Könntest du dann sagen, dass du die Seiten -20 bis 9 lesen kannst? Das ist nämlich das, was von und bis aussagen.
 
Nein, das könnte ich nicht sagen, da in diesem Fall von und bis den Wertebereich verlasen würden.
Möglich wäre zb.:

w := max (Feld, -20, -11)
 
Ja ok, ich bin so hohl: w := max(Feld,1, 10) geht oder alles was "kleiner ist"

w := max(Feld, 3, 6) usw.

Klar sorry, macht ja auch nur so Sinn.

Also ist die Funktion nur aufrufbar, für Werte 1..GRENZE (10)

Das heißt, es gibt mindestens ein Programmstück das ich finden muss, für das der Wertebereich nicht verlassen wird, egal welche Werte ich für von und bis einsetze?

Ist das die Aufgabenstellung?
 
Zurück
Oben