www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Pascal" - Programm
Programm < Pascal < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Pascal"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Programm: wortumkehr (pascal)
Status: (Frage) beantwortet Status 
Datum: 15:57 Mi 13.04.2005
Autor: Sand-of-Time

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

        
Bezug
Programm: Antwort
Status: (Antwort) fertig Status 
Datum: 16:36 Mi 13.04.2005
Autor: Bastiane

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
[banane]


Bezug
                
Bezug
Programm: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 17:09 Mi 13.04.2005
Autor: Sand-of-Time

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

Bezug
                        
Bezug
Programm: eine Antwort
Status: (Antwort) fertig Status 
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




Bezug
                        
Bezug
Programm: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 18:48 Mi 13.04.2005
Autor: FriedrichLaher

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.

Bezug
                        
Bezug
Programm: offene Frage
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 19:24 Do 14.04.2005
Autor: schneckchen_moeh

Hallo Sand-of-Time,

schreib doch bitte noch mal, was dir noch konkret unklar ist.
Würd dir ja schon gern weiterhelfen...

Gruß Isi

Bezug
                        
Bezug
Programm: Funktionen in Pascal
Status: (Antwort) fertig Status 
Datum: 00:01 Sa 16.04.2005
Autor: ChristophErnst

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

Bezug
                
Bezug
Programm: Mitteilung zu Antwort
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                        
Bezug
Programm: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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" :)


Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Pascal"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.mathebank.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]