Programm < Pascal < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Hallo,
ich habe mal wieder ein Problem. Ich verstehe in einem Programm einige Zeilen nicht. zuerst der gesamte quellcode.
PROGRAM Wortumkehr;
VAR
w : string;
FUNCTION umgekehrt (wort: string): string;
VAR
kopf : char;
BEGIN
IF length (wort) = 0 THEN
umgekehrt := ''
ELSE BEGIN
kopf := wort [1];
delete (wort, 1, 1);
umgekehrt := umgekehrt (wort) + kopf
END
END;
BEGIN
REPEAT
write ('Wort: ');
readln (w);
writeln ('Gespiegelt: ', umgekehrt (w));
UNTIL w = 'exit';
readln
END.
das ist das gesamte programm.
umgekehrt := umgekehrt (wort) + kopf
diese zeile versteh ich einfach nicht. Wenn ich das mit papier und stift mache, kommt da was ganz falsches raus und wozu dieses (wort)? also die klammern und überhaupt was soll da das umgekehrt? Ich versteh einfach gar nichts von dieser zeile :(. Dann gibt es noch eine zweite.
writeln ('Gespiegelt: ', umgekehrt (w));
okay das da umgekehrt als ausgabevariable angegeben ist, versteh ich aber was hat da ein w zu tun. Niemand hat doch w einen wert zugewiesen :S und dann ist das auch wieder in klammern.
Ich wäre sehr dankbar um hilfe. Danke im voraus!
Sand-of-Time
|
|
|
|
Hallo Stephan!
> PROGRAM Wortumkehr;
>
> VAR
> w : string;
>
> FUNCTION umgekehrt (wort: string): string;
>
> VAR
> kopf : char;
> BEGIN
> IF length (wort) = 0 THEN
> umgekehrt := ''
> ELSE BEGIN
> kopf := wort [1];
> delete (wort, 1, 1);
> umgekehrt := umgekehrt (wort) + kopf
> END
> END;
>
> BEGIN
> REPEAT
> write ('Wort: ');
> readln (w);
> writeln ('Gespiegelt: ', umgekehrt (w));
> UNTIL w = 'exit';
> readln
> END.
>
> das ist das gesamte programm.
> umgekehrt := umgekehrt (wort) + kopf
> diese zeile versteh ich einfach nicht. Wenn ich das mit
> papier und stift mache, kommt da was ganz falsches raus
> und wozu dieses (wort)? also die klammern und überhaupt was
> soll da das umgekehrt? Ich versteh einfach gar nichts von
> dieser zeile :(. Dann gibt es noch eine zweite.
Ich verstehe die Zeile darüber nicht so ganz:
delete (wort, 1, 1);
Was genau soll das bedeuten? Ich würde vermuten, dass man von dem Wort einfach das erste Zeichen abschneidet, aber warum steht da dann zweimal ne 1?
Jedenfalls würde ich deine Problemzeile folgendermaßen verstehen:
Das "umgekehrt" ist eine rekursive Funktion, und zwar wird das erste Zeichen einfach weggenommen und als letzte drangehängt (deswegen steht da am Ende deiner Zeile "+kopf", und mit dem "Restwort" wird das Gleiche gemacht. D. h., das "umgekehrt (wort)" bedeutet, dass die Funktion umgekehrt nun auf das "wort", was ja jetzt nur noch ein "Restwort" ist (denn der "kopf" wurde ja abgeschnitten) angewendet wird, was heißt, dass hier wiederum das erste Zeichen abgeschnitten wird usw.
Vielleicht als Beispiel mal das Wort hallo:
kopf:=h
umgekehrt:=umgekehrt(allo)+h
kopf:=a
umgekehrt:=(umgekehrt(llo)+a)+h
kopf:=l
umgekehrt:=(umgekehrt(lo)+l)+a+h
kopf:=l
umgekehrt:=(umgekehrt(o)+l)+l+a+h
kopf:=o
umgekehrt:=(umgekehrt()+o)+l+l+a+h
so mal nur in Kurzform. Verstehst du das? Jedenfalls haben wir das damals glaube ich so programmiert.
> writeln ('Gespiegelt: ', umgekehrt (w));
>
> okay das da umgekehrt als ausgabevariable angegeben ist,
> versteh ich aber was hat da ein w zu tun. Niemand hat doch
> w einen wert zugewiesen :S und dann ist das auch wieder in
> klammern.
Also, so ganz kenne ich mich damit nicht aus (was ist das eigentlich für eine Programmiersprache?), aber ich würde das mal so verstehen:
die Eingabe ist eine Variable w. Nun steht im Quellcode zuerst aber mal nur eine Funktion - die hat so im Allgemeinen eigentlich noch gar nichts wirklich mit dem Programm zu tun, man muss sie erst im Programm aufrufen, damit irgendetwas geschieht. Und genau das wir in deiner Zeile mit dem "umgekehrt(w)" gemacht. Die Funktion "umgekehrt" wird auf das Eingabewort w angewendet, womit das w natürlich letztendlich auch einen Wert erhält.
Verstehst du es jetzt? Ansonsten frag nochmal nach, dann versuche ich mein Glück noch einmal.
Viele Grüße
Bastiane
|
|
|
|
|
Ich habe vieles verstanden, aber auch einiges nicht. Es ist die programmiersprache pascal. Ich mir ist noch einiges unklar.
Wieso steht beispielsweise da ein mal umgekehrt:=... wenn das keine Variable ist? Ich hab jetzt ja verstanden, dass umgekehrt durch das umgekehrt (w) aufgerufen wird. heißt dass, das er wert, der in w steht dann in die variable wort gespeichert wird. Aber mir ist eines unklar. er speichert dann ja den wert aus umgekehrt in w und dann das ergebnis des prozesses unbekannt in w. DAs versteh ich. :) Und ich fragem ich auch noch wieso kann er dann umgekehrt einen wert zuweisen, wenn es keine variable ist. Ich wollte ein mal den wert von um... aufrufen lassen, aber das ging nicht. Ich blick da nicht so wirklich durch. ich habe auch dein beispiel verstanden. Aber wenn da steht kopf:=... dann gibt er doch dem kopf jedes mal einen neuen wert wie kann dann der alte erhalten bleiben? und hmmmm auch wenn das irgendwie gehen würde, wieso setzt er dann den neuen buchstaben aus kopf immer vor und nicht hinter den alten von kopf. So viele fragen... Ich hoffe du kannst mir weiterhelfen.
Liebe grüße Sand-of-Time
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:47 Mi 13.04.2005 | Autor: | iftpr |
moin.
also zuerst: pascal ist nicht meine programmiersprache, ist auch schon eher antik. aber ähnlich sind sich programmiersprachen immer...
wenn eine funktion einen wert zurückgeben soll -und das ist ja bei deinem programm der fall- dann ist der name der funktion (ohne klammern dahinter) automatisch eine variable vom typ des rückgabewertes. deine funktion "umgekehrt (wort: string): string" erwartet also einen String als eingabeparameter und gibt einen String zurück (wenn die funktion beendet ist). der string, der zurückgegeben wird heißt eben auch "umgekehrt" - das ist eine eigenart von pascal.
was passiert ist folgendes:
bei $umgekehrt:=$ wird (innerhalb der funktion umgekehrt!) der variablen $umgekehrt$ ein wert zugewiesen. bei $umgekehrt := ''$wird ein leeres wort zugewiesen, bei $umgekehrt := umgekehrt (wort) + kopf$ wird der string zugewiesen, den die funktion $umgekehrt$, aufgerufen mit dem wert, der in variable $wort$ steht, zurückliefert. daran wird der string angehängt, der in der variable $kopf$ steht.
dann zu deiner 2. frage (wegen $kopf := ... $)
innerhalb der funktion bekommt die variable den betreffenden wert, also hier das erste zeichen von $wort$. wird die funktion dann wenige zeilen später erneut aufgerufen, so heißt die variable zwar immer noch $kopf$, aber wir befinden uns dann in einem anderen gültigkeitsbereich! die variable $kopf$ ist also NUR innerhalb der funktion gültig - und wenn wir die funktion erneut aufrufen ist damit dann auch eine neue variable $kopf$ gemeint. es wird in $kopf$ also immer nur der erste buchtabe des jeweils an die funktion übergebenen strings gespeichert - deshalb funktioniert auch das beispiel.
alles klar???
hoffe, ich hab es nicht zu kompliziert erklärt...
till
|
|
|
|
|
Die Zuweisung an "umgekehrt" bestimmt den Wert den die Funktion "umgekehrt"
zurückgibt.
Im Hauprogramm, das die Funktion umgekehrt aufruft
wird mit readln ein Wert in die Variable w eingelesen.
Die Variable kopf in der Funktion "umgekehrt" und auch der Parameter
und der Parameter w erhalten für jeden Aufruf der Funktion neuen
Speicherplatz der erst freigegeben wird, wenn die Funktion
zurückgekehrt ist - also wenn der Parameter die leere String war.
|
|
|
|
|
Hallo Sand-of-Time,
schreib doch bitte noch mal, was dir noch konkret unklar ist.
Würd dir ja schon gern weiterhelfen...
Gruß Isi
|
|
|
|
|
Hi SandOfTime
Eine Funktion in Programmiersprachen ist ähnlich gebaut wie eine mathematische Funktion: Sie hat einen (oder mehrere) Eingabewert(e) (in Mathe: x). Mit diesem Wert tut sie etwas (wie eine math. Funktion f), errechnet einen Ausgabewert oder Rückgabewert (in Mathe: y). Diesen Wert gibt sie zurück. In Pascal funktioniert diese Rückgabe nun wie eine Zuordnung, also mit einem := Das y ist dann gerade der Name der Funktion.
Beispiel: Eine Funktion soll den Eingabewert quadrieren und dieses Quadrat ausgeben. Sie soll quadr heissen:
Definition:
function quadr(x: real): real; {das 2. real ist der Datentyp d. Rückgabewerts}
begin
quadr := x*x; {Der Ausgabewert der Funktion ist damit x*x}
end;
Im Hauptprogramm kann diese Funktion nun verwendet werden:
writeln(quadr(5)); {Hier wird 25 geschrieben.}
d:=sqrt(quadr(3)+quadr(4)); {d ist damit 5}
usw.
OK?
Herzlichst
Chris
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:47 Mi 13.04.2005 | Autor: | wizzar |
Hi,
entschuldige die Kritik, aber hinsichtlich der Aussage:
> Und genau das wir in deiner Zeile mit dem "umgekehrt(w)" gemacht. Die Funktion "umgekehrt" wird auf das Eingabewort w
> angewendet, womit das w natürlich letztendlich auch einen Wert erhält.
würde ich gern anmerken dass durch umgekehrt(w) der variablen w kein wert zugewiesen wird; ansonsten könnte man das programm ja nur durch eingabe von "tixe" ordnungsgemäß beenden ;)
Gruß, wizzar
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:11 Mi 13.04.2005 | Autor: | Lizard |
Hallo,
ach, immer diese Pascal-Fragen ;)
> entschuldige die Kritik, aber hinsichtlich der Aussage:
>
> > Und genau das wir in deiner Zeile mit dem "umgekehrt(w)"
> > gemacht. Die Funktion "umgekehrt" wird auf das Eingabewort
> > w angewendet, womit das w natürlich letztendlich auch einen
> > Wert erhält.
>
> würde ich gern anmerken dass durch umgekehrt(w) der
> variablen w kein wert zugewiesen wird; ansonsten könnte man
> das programm ja nur durch eingabe von "tixe" ordnungsgemäß
> beenden ;)
Das ist korrekt. Um mal das Rätselraten um die Zuweisung zu beenden, in dem Abschnitt
BEGIN
REPEAT
write ('Wort: ');
readln (w);
writeln ('Gespiegelt: ', umgekehrt (w));
UNTIL w = 'exit';
readln
END
geschieht die Zuweisung von Werten an w natürlich in der Anweisung "readln (w);", die bedeutet: Lies einen Wert vom Eingabeprompt ein, und weise ihn w zu.
Außerdem würde ich gerne noch etwas aufgreifen:
> > delete (wort, 1, 1);
> Was genau soll das bedeuten? Ich würde vermuten, dass man von dem
> Wort einfach das erste Zeichen abschneidet, aber warum steht da dann
> zweimal ne 1?
"Lösche ab Position 1 genau 1 Zeichen" :)
|
|
|
|