Skip to content
xenforo

Einführung in die imperative Programmierung

Content

fange im oktober mit einem bachelorstudium in mathe an als teilzeitstudent(neben einem in kuwi als vollzeitstudent).
hab mir jetzt mal die kurse lineare algebra 1 und eben "einführung in die imperative programmierung" bestellt....

gestern is das "büchlein" gekommen und ich kann ned wirklich was anfangen damit!
ich kenn mich am computer ned wirklich aus, was programmieren is weiß ich eigentlich überhaupt ned, kann ich mir auch nix drunter vorstellen...
und was is pascal? wo bekomm ich das her?

is der kurs überhaupt zu schaffen für so einen anfänger wie mich???

Comments

Der Kurs 'Einfuehrung in die imperative Programmierung' ist auch fuer einen Computerneuling machbar. Allerdings musst Du sehr viel Zeit fuer die Bearbeitung einplanen.

Der Kurs verwendet die Programmiersprache 'Pascal', die auch oft als 'Schulsprache' bezeichnet wird, weil viele Anfaengerfehler schon beim Uebersetzen des Programms in 'Computersprache' erkannt werden und nicht erst zur Programmlaufzeit Schwierigkeiten machen.

Im Internet findest Du jede Menge Informationen ueber 'Pascal'. Schau' einfach mal im 'Wikipedia' nach. Dort solltest Du dann auch weiterfuehrende Links finden, wie Du zu einer kostenlosen 'Pascal'-Version kommst. Im xSchreiben (Info-Schreiben) und in der Kurseinfuehrung stehen auch ein paar Zeilen zu dem Thema.

Weiß nur noch nicht ganz wie ich damit arbeiten soll.
im kurs selbst ist ja nicht dezitiert gesagt, ab wann man dann auch mit dem programm selber arbeiten soll!??! oder?
bin mittlerweile bei seite 39 und versteh bis hier alles sehr gut, aber ich frag mich dauernd, ob ich dieses pascal programm jetzt auch schon verwenden sollte!!!???

sind die lerneinheiten alle seperat zu behandeln und nur bei den AUFGABEN soll man dann das programm verwenden oder wie???

versteh das noch nicht ganz!

In dem Kurs wird Dir nicht gesagt, wann Du jetzt eine lokale Pascal-Installation verwenden sollst. Aber programmieren lernt man nicht nur durch das Lesen der Kurseinheiten. Spaetestens wenn Du dann selbst kleine Programme schreiben moechtest oder ein wenig experimentieren, brauchst Du die lokale Installation einer Pascal-Entwicklungsumgebung.

Um die Einsendeaufgaben zu loesen, wird keine lokale Installation benoetigt. Man kann die Loesungen auch mit jedem Editor schreiben und dann von dem Kursprotal testen lassen

Aha, so ist das also..
naja, du hast den kurs anscheinend eh auch gemacht, ab wann hast du damit begonnen ein bisschen herumzuspielen????

ich brauch also eine "lokale Installation einer Pascal-Entwicklungsumgebung"- allein das wort überfordert mich schon.
dann werd ich mich mal nach sowas umsehen.

und das letze heißt dass die einsendeaufgaben gar nicht mit dem pascal programm gelöst werden müssen, sondern "einfach" nur in "Textform"???

Pascal ist ja kein Programm, sondern eine Programmiersprache. Du kannst auch ganze Programme von Hand in Pascal schreiben, dann kannst du sie eben bloß nicht ausprobieren.
Sieh mal in die Newsgroup zum Kurs (feu.informatik.kurs.1618), da wird schon heftig diskutiert und Free Pascal als plattformübergreifender Compiler empfohlen, den gibts bei [url=https://www.freepascal.org]Free Pascal - Advanced open source Pascal compiler for Pascal and Object Pascal - Home Page[/url] kostenlos zum Runterladen. Unbedingt brauchen tust du im Prinzip gar keinen, wie ja schon gesagt wurde...du schreibst für die Einsendeaufgabe eben was in Pascal und gibst es in WebAssign ein, dann siehst du ja, was passiert.

Aha, vielen dank, jetzt wird mir das ganze schon um einiges klarer!!

phkr1 wrote:

aha, so ist das also..
naja, du hast den kurs anscheinend eh auch gemacht, ab wann hast du damit begonnen ein bisschen herumzuspielen????

Ich hatte schon 'Pascal' in meinem Erststudium und arbeite seit Jahren als Softwareentwickler. Da hatte ich mir damals eine lokale Installation gespart, die Einsendeaufgaben mit einem Texteditor geschrieben und dann mit WebAssign getestet

Okay, mittlerweile kann ich mit den begriffen, pascal, compiler usw etwas anfangen.
aber was ist web assign? auch ein compiler???

phkr1 wrote:

aber was ist web assign? auch ein compiler???

Das 'WebAssign' ist ein Portal der FernUni. Darueber sendest Du Deinen Einsendeaufgaben ein. Das Portal muesste im Infoschreiben beim Thema 'Einsendeaufgaben' beschrieben sein.

Wenn Du in den Einsendeaufgaben ein Programm schreiben sollst, dann kopierst Du zum den Quellcode in ein Textfeld im 'WebAssign'. Deine Programm wird dann kompiliert und ausgefuehrt. Ueber die Ausgabewerte und eventuelle Fehler wirst Du informiert. Wenn das Programm wie gewuenscht arbeitet, sendest Du es ueber den 'WebAssign' Deine Loesung auch an die FernUni.

Alles klar!

hab jetzt schon turbo pascal und mich damit schon ein bisschen gespielt.
einsendeaufbabe 4 war kein problem für mich, nur bei 5 häng ich jetzt.
da find ich gar keinen guten ansatz! kann mir da wer einen tipp geben?

mfg philipp

phkr1 wrote:

... nur bei 5 häng ich jetzt.
da find ich gar keinen guten ansatz! kann mir da wer einen tipp geben?

Meinst Du die Aufgabe 5 im Aufgabenheft 1? (Aufteilung eines Centbetrag)

Wieweit bist Du schon mit Deiner Lösung? Was genau ist Dein Problem? Das Einlesen des Betrag, das Ausgeben des Ergebnis, die Berechnung der Aufteilung etc.?

Ja, das mein ich...
naja, weiß gar nicht, wie ich da anfangen soll und mich irritiert irgendwie, dass nur einmal die Anweisung "write" vorkommen darf!

das nur einmal die "write" bzw. die "writln" - Anweisung benutzt werden darf, zeigt ja auch das Beispiel unter der Aufgabe. Das ist ja nur ein Zeile der Ausgabe. Also kannst Du zum Beispiel zum Ausgeben des Ergebnisses keine Schleife nutzen, in der "write" vorkommt, sondern musst den ganzen Ausgabestring vorher sammeln und in einem ausgeben.

Der Anfang:
Mach Dir mal Gedanken darüber wie "möglichst wenige" Geldstücke zustandekommen. Wie könnte man den eingegebenen Betrag dahingehend überprüfen? Wie würdest Du das ohne Programmierung, also nur mit Hilfe von Papier und Bleistift lösen? Wenn Du das hast, kannst Du erst loslegen mit dem programmieren.

lg, Katharina

Hm, okay, werd ich morgen mal überdenken, jetzt bin ich schon zu müde dazu....

muss man mit einem ausschnittstypen arbeiten?

phkr1 wrote:

muss man mit einem ausschnittstypen arbeiten?

Den Typ brauchst Du nicht. Welchen Bereich moechtest Du denn in dem Ausschnittstyp definieren?

Hab mir jetzt die Musterlösung angesehen- wusste nicht dass es eine solche gibt, sonst hätte ich euch hier nicht genervt- schaut ganz einleuchtend aus (auch wenn ich selbst nie drauf gekommen wäre). Nur eins versteh ich nicht....
Warum beginnt der Anweisungsteil mit den Wertzuweisungen
Betrag := 0;
Fuenfziger := 0;
Zwanziger := 0;
Zehner := 0;
Fuenfer := 0;
Zweier := 0;
Einer := 0;

??????

Das versteh ich nicht ganz...
was passiert, wenn man das zb weglässt und den rest des programms gleich lässt???
wofür braucht man das?

um sicher zu gehen welchen Startwert die Variablen haben werden sie auf Null gesetzt. Ansonsten hängt es nähmlich vom Compiler ab ob sie definiert auf Null gesetzt werden oder einen zufälligen Wert haben der bei Programmstart gerade im entsprechenden Speicherplatz steht.

Grüße
Stefan

Achso, verstehe....
wären die einzelnen cent-beträge nicht auf null gesetzt, dann würde am ende bei der ausgabe für jene cent-beträge, die nicht belegt sind (bei eingabe 50 zb alle außer der ersten stelle) kein nuller stehen, sondern irgendein andrer wert!!!
das versteh ich!
aber warum muss man das bei betrag und rest auch machen?

phkr1 wrote:

achso, verstehe....
wären die einzelnen cent-beträge nicht auf null gesetzt, dann würde am ende bei der ausgabe für jene cent-beträge, die nicht belegt sind (bei eingabe 50 zb alle außer der ersten stelle) kein nuller stehen, sondern irgendein andrer wert!!!
das versteh ich!
aber warum muss man das bei betrag und rest auch machen?

Hi,

ich habe mich in Pascal noch nicht eingearbeitet, aber arbeite mit anderen Sprachen.

bei einigen anderen Programmiersprachen muss man diese Wertzuweisungen machen weil sonst Compilerfehler wegen undefinierter Werte auftreten (z.B. in C++ bei char) , oder schlicht und ergreifend Müll drin steht.

Da man sich bei Müll(das ist dann der zufällige Wert, der gerade an der Stelle im Speicher rumstand, wo der Speicherplatz für Deine Variable reserviert wurde) aber nicht draufverlassen kann, was dahintersteht kann das böse Programmfehler hervorrufen, is ja klar.

Ganz ehrlich gesagt, kann ich mich auch oft im Laufe von umfangreicheren Prozeduren auch zwischendurch nicht erinnern (oder es gibt verwirrende if-Konstrukte, wo es nicht ganz klar wird), ob ich Variablen schon einen Wert zugewiesen habe, deswegen deswegen mache ich das schon am Anfang mit irgendeinem Wert, der später auf keinen Fall gebraucht wird, bei int z.B. oft mit 0 oder -1. Und deswegen auch bei tWert und tRest auch, auch wenn sie später auf jeden Fall überschrieben werden, nur um sicher zu gehen.

lg, Katharina

phkr1 wrote:

Hab mir jetzt die Musterlösung angesehen- wusste nicht dass es eine solche gibt, sonst hätte ich euch hier nicht genervt- ...

Warum nerven? Das Forum ist unter anderem auch dazu da, um Deine Fragen zu beantworten. Nur die Musterloesung anzuschreiben, bringt einen ja auch nicht weiter. Es bleiben dann immer noch Fragen oder es kommen neuen.

Also keine Hemmung und her mit den Fragen

Alles klar...

dann gleich mal die nächste frage

kurseinheit II, seite 87, beispiel 4.1.2.2.:

da hab ich so meine problemchen

versteh nicht, warum die while schleife überhaupt zu einem ende kommt. das dürfte doch erst dann passieren, wenn x = y wird und das passiert doch nie, oder?

und was anderes, was ist zb wenn ich die zahlen 88 und 23 eingebe...
ggT wäre hier 1! aber darauf würde man mit diesem programm gar nicht kommen, oder???

Hm, habs jetzt abgeschrieben in turbo pascal augeführt...
und es funktioniert sowohl für die zahlen 36 und 78, als auch für die zahlen 88 und 23...
versteh ich überhaupt nicht

Und die eof Tastenkombination versteh ich auch überhaupt nicht

Wasfür eine eof-Tastenkombination? Beschreib Dein Problem mal genauer. Welche Seite? Meinst Du EndOfFile?

phkr1 wrote:

und die eof Tastenkombination versteh ich auch überhaupt nicht

phkr1 wrote:

und die eof Tastenkombination versteh ich auch überhaupt nicht

Zum Vergleich schau' Dir das Beispiel 4.1.3.1 auf Seite 90 an. Dort soll die Folge mit der Eingabe einer '0' abgeschlossen werden. Dieses Verfahren hat aber den Nachteil, dass in der Folge keine '0' als gueltiger Wert eingegeben werden kann. Deshalb wird im Beispiel 4.1.3.3 auf Seite 92 die Eingabe mit der 'eof'-Tastenkombination abgeschlossen. Nun ist auch die '0' ein gueltiger Eingabewert.

Das 'eof' bedeutet 'End of File' und damit werden das Ende von Dateien und Streams gekennzeichnet. Das 'eof' kann nur ueber eine Tastenkombination eingegeben werden (abhaengig vom verwendeten Betriebssystem, siehe Seite 91 unten) und kommt somit bei Eingaben nicht vor. Editoren schreiben beispielsweise selbststaendig die Kennung an 's Ende der Dateien. Du kannst es nur sehen, wenn Du die Darstellungen von Steuerzeichen einschaltest.

In Pascal gibt es eine 'eof'-Funktion, die diese Kennung abfragt. Der Rueckgabewert der Funktion ist 'true', wenn das Ende des Stream bzw. Datei erreicht ist.

phkr1 wrote:

kurseinheit II, seite 87, beispiel 4.1.2.2.:

da hab ich so meine problemchen

versteh nicht, warum die while schleife überhaupt zu einem ende kommt. das dürfte doch erst dann passieren, wenn x = y wird und das passiert doch nie, oder?

und was anderes, was ist zb wenn ich die zahlen 88 und 23 eingebe...
ggT wäre hier 1! aber darauf würde man mit diesem programm gar nicht kommen, oder???

Schreib' Dir die Zwischenergebnisse der Schleife doch mal auf einen Zettel. Du wirst sehen, dass 'x' und 'y' wirklich am Ende gleich sind ;)

Schau' mal im Wikipedia unter '[URL="https://de.wikipedia.org/wiki/Euklidischer_Algorithmus"]Euklidischer Algorithmus[/URL]'. Dort wird das mathematische Prinzip des simplen Algorithmus erklaert

Kannst du mir das mal "vorrechnen"... wie das dann aussehen würde bei diesen beiden angegebenen zahlenpaaren?
ich blick nämlich jetzt gar nimma durch...

und überhaupt, bisher ging alles flüssig, aber jetzt seit seite 95 oder so komm ich gar nimma weiter....
wird mir auf einmal alles viel zu komplex...

Und was ist auf seite 102 bei beispiel 4.2.1.6 mit "Initialisierung der Zähler" bzw seite 103 bei beispiel 4.2.1.7 mit "initialisierung" gemeint.
diese schritte verstehe ich nicht!!!

Initialisierung bedeutet im Allgemeinen die Zuweisung eines Anfangswertes an eine Variable (oder wie in den Beispielen an die Elemente eines Arrays, was auf das gleiche hinausläuft). Tut man das nicht, hat die Variable in der Regel einen mehr oder weniger zufälligen Inhalt ...

Okay, der euklidische algorithmus ist mir jetzt doch klar geworden, hatte da einen denkfehler!
und auch das initialisieren versteh ich jetzt...

hab aber schon wieder das nächste problem...
geht um beispiel 4.1.2.1 und beispiel 4.1.2.2

und bei beiden jeweils um das while statement:
beim ersten beispiel lautet dieses:

while Zahl <> 0 do
begin
if Zahl < Minimum then
Minimum := Zahl;
[U] readln (Zahl)[/U]
end

beim zweiten Beispiel:

while x <> y do
if x > y then
x:= x - y
else
y:= y - x;
[U][COLOR=Black]writeln (x, '.')[/COLOR][/U]
end

In beiden Statements verwirren mich die beiden unterstrichenen Befehle etwas, DENN:
im ersten Beispiel wird der[U] readln (Zahl)[/U] Befehl nach jedem Schleifendurchlauf einmal ausgeführt (wenn ich das richtig verstehe).
Im zweiten Beispiel allerdings wird der [U]writeln (x,'.')[/U] Befehl nur einmal und zwar ganz am Ende, nach ABBRUCH der Schleife ausgeführt...

WARUM???
denn optisch sehe ich keinen Unterschied, die genannten Befehle folgen jeweils nach einem Semikolon (;) !!!!

Und da bin ich wieder:
nächstes problem:

beispiel 4.2.7.1:

verstehe die erste if-bedingung nicht...
was passiert da genau?

meinst Du Beispiel 4.2.1.7? 4.2.7.1 gibts nicht,

Welches if? Dieses:

begin
if not vorhanden[Zeichen] then
begin
vorhanden[Zeichen]:=true,
gesamt := gesamt+1
end;
.
.
.
end
?

Was verstehst Du daran nicht? Wie weit kommst Du? Ich erklärs Dir gern, nur weiß ich nicht wo ich anfangen soll.

Und noch was. Bleib Ruhig, mach Dir keinen Stress. Programmieren lernt man nur durch Programmieren. Und das muss erstmal sacken, das erschließt sich einem nicht mal eben. Ich habe Wochen dafür gebraucht und ich war keinesfalls langsam. Den Kurs einfach nur auf die Schnelle durchzuackern reicht leider nicht. Nimm Dir Zeit, das Semester hat noch nicht mal begonnen.

lg, Katharina

phkr1 wrote:

okay, der euklidische algorithmus ist mir jetzt doch klar geworden, hatte da einen denkfehler!
und auch das initialisieren versteh ich jetzt...

hab aber schon wieder das nächste problem...
geht um beispiel 4.1.2.1 und beispiel 4.1.2.2

und bei beiden jeweils um das while statement:
beim ersten beispiel lautet dieses:

while Zahl <> 0 do
begin
if Zahl < Minimum then
Minimum := Zahl;
[U] readln (Zahl)[/U]
end

beim zweiten Beispiel:

while x <> y do
if x > y then
x:= x - y
else
y:= y - x;
[U][COLOR=Black]writeln (x, '.')[/COLOR][/U]
end

In beiden Statements verwirren mich die beiden unterstrichenen Befehle etwas, DENN:
im ersten Beispiel wird der[U] readln (Zahl)[/U] Befehl nach jedem Schleifendurchlauf einmal ausgeführt (wenn ich das richtig verstehe).
[COLOR=Green][COLOR=DarkOrange]Ja, das ist richtig. Erst wird der Wert aus "Zahl" in eine andere Variable namens Minimum geschrieben. Danach wird der Wert von Zahl mit dem eingelesenen Wert überschrieben. Und das bei jedem Durchlauf wenn Zahl < Minimum ist.[/COLOR]
[/COLOR]
Im zweiten Beispiel allerdings wird der [U]writeln (x,'.')[/U] Befehl nur einmal und zwar ganz am Ende, nach ABBRUCH der Schleife ausgeführt...
[COLOR=DarkOrange]Auch das ist richtig, da ja nur [B]DER [/B]ggT gesucht wird, kann auch nur [B]ein [/B]x ausgegeben werden.[/COLOR]

[COLOR=DarkOrange]Der Unterschied zwischen beiden Konstrukten ist, dass die erste while-Schleife ein begin - end beinhaltet und die zweite nicht. Zwischen begin - end kann eine [U]Folge[/U][/COLOR] [COLOR=DarkOrange]von Anweisungen stehen, wenn ich das im Kurstext richtig interpretiere. Sieh mal Seite 55 unter zusammengesetzte Anweisungen nach.
[/COLOR]
WARUM???
denn optisch sehe ich keinen Unterschied, die genannten Befehle folgen jeweils nach einem Semikolon (;) !!!!

Siehe oben

lg, Katharina

Ich hab eh keinen stress.. ich frag hald nur gleich gern amal nach! :)

hm, ich kann ned beschreiben, was ich daran ned verstehe...
einfach, was diese anweisungen für einen sinn machen, womit ich dadurch hinkomme usw...

okay, die letzte erklärung zu den while schleifen kommt mir logisch vor..
also liegt der unterschied nur an dem begin und end!?!

[FONT=Courier New]begin
if not vorhanden[Zeichen] then
begin
vorhanden[Zeichen]:=true,
gesamt := gesamt+1
end;
.
.
.
end[FONT=Courier New]if not vorhanden[Zeichen] ist ein boolscher Ausdruck. Das Feld im Array mit dem Index "[FONT=Courier New]Zeichen" ist entweder true oder false. [FONT=Courier New]
if not vorhanden[Zeichen] bedeutet also nichts weiter als [FONT=Courier New]if vorhanden[Zeichen]=false. Hier geht es im speziellen darum einen eingelesenen String mit einem Array, welches die Kleinbuchstaben von a - z enthält zu vergleichen und rauszufinden, was er für Buchstaben enthält.

[FONT=Courier New]
begin
vorhanden[Zeichen]:=true,
gesamt := gesamt+1
end;

hier wird das Array vorhanden mit dem Index Zeichen auf true gesetzt, wenn obige Bedingung also [FONT=Courier New]if not vorhanden[Zeichen] wahr ist. Dann wird die integer-Variable gesamt um eins hochgezählt.
[FONT=Courier New]

Okay, alles klar...
hab jetzt kurseinheit II auch durch und großteils verstanden, da es die einsendeaufgaben dazu noch nicht gibt, werd ich mich heute mit ein paar in der kurseinheit gestellten aufgaben beschäftigen.

ein paar begriffliche schwierigkeiten hab ich aber noch:

1) Datentypen: Was bedeutet vordefinierter/ strukturierter/ unstrukturierter/ nicht vordefinierter??? Verwechsle das immer, bzw bin ich mir mittlerweile gar nicht mehr sicher, was was bedeutet!!!

2) Muss-Regel 15: Die Laufvariable wird innerhalb einer for-Anweisung nicht manipuliert!! -Was soll das heißen?

und nochwas:
gerade ist eine neue sendung von der Fernuni bei mir eingegangen...
und zwar die erste lerneinheit zu lineare algebra 1 zusammen mit ein paar andren heften, von denen ich gar nicht weiß wofür die gut sein sollen:

so zb INFO 01 vom 16.09.2008:
ein dünnes heftchen mit verschiedenen kursbeschreibungen usw...- was soll ich damit tun?

dann "Studien- und Prüfungsinformationen für Bachelorstudiengänge von der Fakultät für Kultur u Sozialwissenschaften (mein Hauptstudium wird ja KUWI sein), aber das is so dick, dass ich ma gar ned vorstellen kann was ich da noch alles erfahren soll.

und dann noch eines "Prüfungsinformationen Mathematik und Informatik":
das hat glaub ich 400 seiten mit blätter in weiß,gelb,grün,blau,rot,...
muss ich das auch alles lesen???

(okay, ich hab mich jetzt grad wieder extrem dumm gestellt, aber vielleicht können mir eingeweihte ja gute infos zu diesen dingen geben!!!)

Was die Prüfungsinformationen angeht, schau mal in die Inhaltsverzeichnisse, dann siehst Du was für Dich relevant ist. :D

Es gibt auf der Webassign-Seite Übungsaufgaben, hast Du die schon gesehen?

Laufvariablen in for-Schleifen sollen nicht manipuliert werden, weil es die Anzahl der Schleifendurchläufe direkt beeinflusst. Wenn ich eine For Schleife mit Laufvariable x von 1 bis <= 10 habe, dann läuft die Schleife 10 mal durch. Setze ich aber mitten in der Schleife x=1 auf x=5, läuft die Schleife nur noch 6 mal, wenn ich michjetzt nicht verzählt habe. Das ist nicht immer sinnvoll.

lg, Katharina

Hm, versteh ich ned wirklich, scheint aber auch nicht so wichtig zu sein, oder???
läuft sie hald dann nur sechsmal, ist doch egal!? :)

und wer erklärt mir das mit den datentypen jetzt???

phkr1 wrote:

hm, versteh ich ned wirklich, scheint aber auch nicht so wichtig zu sein, oder???
läuft sie hald dann nur sechsmal, ist doch egal!? :)

und wer erklärt mir das mit den datentypen jetzt???

doch, das mit der Laufvariable ist sehr wichtig. Nimm mal an du machst sowas wie
for i = 1 to 100 do
i = i+1;

sowas ist absolut verboten, weil i die Laufvariable ist und ihr ausschließlich durch die Abarbeitung der Schleife ein neuer Wert zugewiesen werden darf. Wenn du das mal gedanklich durchgehst (du kannst es auch zu Testzwecken programmieren) möchtest du ja bei einer Ausgabe alle Zahlen von 2 bis 101 ausgegeben haben. Bekommst du so aber nicht, weil du den Wert der Laufvariable innerhalb der Schleife veränderst.
Ich bin zwar noch nicht wieder so weit im Kurstext, aber wann würdest du denn einen undefinierten Datentyp programmieren? Du weist doch einer Variable von Anfang an einen Typ zu wie z.B. integer.
Strukturierte Datentypen sind Zeiger, arrays, records, unstrukturierte demnach integer, real, boolean, string.

Ich hoffe das hilft dir etwas.

LG
Gabi

MarieCurie wrote:

doch, das mit der Laufvariable ist sehr wichtig. Nimm mal an du machst sowas wie
for i = 1 to 100 do
i = i+1;

sowas ist absolut verboten, weil i die Laufvariable ist und ihr ausschließlich durch die Abarbeitung der Schleife ein neuer Wert zugewiesen werden darf. Wenn du das mal gedanklich durchgehst (du kannst es auch zu Testzwecken programmieren) möchtest du ja bei einer Ausgabe alle Zahlen von 2 bis 101 ausgegeben haben. Bekommst du so aber nicht, weil du den Wert der Laufvariable innerhalb der Schleife veränderst.

Und wenn ich mir bewusst bin, dass ich nicht die Zahlen von 2 bis 101 bekomme, wenn ich i zwischendurch verändere? Nee, begründet hast du damit überhaupt nichts.

Das ist eine reine Stilregel, die sich technisch nicht begründen lässt. Sonst würde der Compiler das gar nicht erst zulassen.

Was nicht heißt, dass es eine schlechte Regel ist. Es ist sinnvoll, zwischen Schleifen zu unterscheiden, deren Durchlaufzahl von vornherein bestimmt (oder wenigstens beschränkt) ist, oder die potentiell unendlich lange laufen können. Aus dem Grund würde ich für erstere Art möglichst for benutzen und while (bzw. repeat...until) für den Rest.

chris* wrote:

Und wenn ich mir bewusst bin, dass ich nicht die Zahlen von 2 bis 101 bekomme, wenn ich i zwischendurch verändere? Nee, begründet hast du damit überhaupt nichts.
[COLOR=Magenta]was ergibt sowas für einen Sinn?[/COLOR]

Das ist eine reine Stilregel, die sich technisch nicht begründen lässt. Sonst würde der Compiler das gar nicht erst zulassen.
[COLOR=Magenta]ok, das Beispiel ist sehr unglücklich. Nehmen wir mal an da steht ....i = 5;
Das ist nicht nur eine reine Stilregel sondern schon begründet i nur als reine Laufvariable zu verwenden.
[/COLOR]
Was nicht heißt, dass es eine schlechte Regel ist. Es ist sinnvoll, zwischen Schleifen zu unterscheiden, deren Durchlaufzahl von vornherein bestimmt (oder wenigstens beschränkt) ist, oder die potentiell unendlich lange laufen können. Aus dem Grund würde ich für erstere Art möglichst for benutzen und while (bzw. repeat...until) für den Rest.

mag sein, daß es im Einzelfall keine Rolle spielt die laufvariable anderweitig zu benutzen, aber man sollte sich das von Anfang an abgewöhnen.
[COLOR=Black]LG
Gabi
[/COLOR]

Das ist nicht nur eine reine Stilregel sondern schon begründet i nur als reine Laufvariable zu verwenden.

Wie ist es denn begründet?

Was tut denn das Programm, wenn du i als Laufvariable von 1 bis 100 in der schleife einsetzt und dann auf einmal die Variable i benutzt und ihr den Wert 5 zuweist?

LG
Gabi

I ist dann 5. Was weiter passiert, hängt davon ab, was in der Schleife noch so drin steht. Wenn das alles ist, also in jedem Schleifendurchlauf wieder passiert, hast du wohl eine Endlosschleife, weil i so nie über 100 kommt.

Nein, das Programm bricht einfach ab mit einem Fehler, weil es nicht weiß was es mit i tun soll. i wäre ja sozusagen doppelt belegt, einmal mit einem fest zugewiesenen Wert und einmal als Zählvariable in der Schleife.

LG
Gabi

Ähh, ich leg jetzt bei Pascal nicht meine Hand ins Feuer, aber normalerweiseist das so, wer zuletzt der Variable einen Wert zuweist, hat gewonnen. Der Laufzeitumgebung ist das völlig wurscht. Aber ich lass mich gern vom Gegenteil überzeugen.

lg, Katharina

MarieCurie wrote:

nein, das Programm bricht einfach ab mit einem Fehler, weil es nicht weiß was es mit i tun soll. i wäre ja sozusagen doppelt belegt, einmal mit einem fest zugewiesenen Wert und einmal als Zählvariable in der Schleife.

LG
Gabi

MarieCurie wrote:

nein, das Programm bricht einfach ab mit einem Fehler, weil es nicht weiß was es mit i tun soll. i wäre ja sozusagen doppelt belegt, einmal mit einem fest zugewiesenen Wert und einmal als Zählvariable in der Schleife.

Pascal ist eine imperative Programmiersprache (deshalb heißt der Kurs ja auch so). imperare heißt soweit ich weiß befehlen, d.h. das Konzept ist, dass das Programm sich deinen Befehlen fügt. :) Dass das Programm nicht weiß, was es tun soll, kommt -- nach dem erfolgreichen übersetzen -- nicht vor.

Ich hab leider kein Pascal da, um es auszuprobieren (und der Gnu Pascal Compiler auf dem bonsai streikt), aber wenn du du Kurs gerade belegt hast:

program Loop(input, output);
var i : Integer;
begin
for i := 1 to 10 do
begin
writeln(i);
i := 10;
end;
end.

Ich erwarte die Ausgabe

1

also bei mir auf Free Pascal compiliert das nicht und bricht mit einem fatal Error ab. Nehme ich die Zuweisung i := 10; raus dann läuft es.
Jetzt kommt für mich die interessantere Frage, nehmen wir mal an es liefe...
Ich habe gesehen du hast dein Posting noch mal verbessert ;)
Ausgabe 1, hm....es ist zwar der erste Schleifendurchlauf, aber du hast ja vorher 10 zugewiesen, wodurch die Schleife abbricht, weil das Ende erreicht ist, ich würde also als Ausgabe 10 erwarten und nicht 1. Was sagen denn die Anderen?

LG
Gabi

MarieCurie wrote:


also bei mir auf Free Pascal compiliert das nicht und bricht mit einem fatal Error ab. Nehme ich die Zuweisung i := 10; raus dann läuft es.

Dann hat es ja doch einen technischen Grund. Kannst du vielleicht mal die Fehlermeldung posten, und die genaue Stelle, an der sie auftritt? Das würde mich brennend interessieren.


Jetzt kommt für mich die interessantere Frage, nehmen wir mal an es liefe...
Ich habe gesehen du hast dein Posting noch mal verbessert ;)
Ausgabe 1, hm....es ist zwar der erste Schleifendurchlauf, aber du hast ja vorher 10 zugewiesen, wodurch die Schleife abbricht, weil das Ende erreicht ist, ich würde also als Ausgabe 10 erwarten und nicht 1.

Die Ausgabe steht ja vor der Zuweisung, zu dem Zeitpunkt ist i noch 1. Danach ist i = 10, also ist das Ende der Schleife erreicht, und sie bricht ab. Ich hatte zuerst einen Denkfehler und irgendwie gedacht, dass es noch einen weiteren Durchlauf gibt, wo dann 10 ausgegeben werden würde.

Das Programm bricht ab in Zeile 7 "Illegal assignement to for -loop variable "i" . There were 1 errors compiling module stopping. Fatal : compilation aborted. "
Mei Englisch st zwar nicht mehr besonders gut, aber ich würde das übersetzen mit "unerlaubte Zuweisung an die Variable i. Ein Fehler hat die Übersetzug des Moduls gestoppt, Übersetzung abgebrochen.", aber du wirst schon wissen was das bedeutet.
Mit der Ausgabe hast du sicher recht, erst würde 1 ausgegeben und dann durch die Zuweisung von 10 die Schleife nach diesem ersten Durchlauf gestoppt.
Ich stehe eh leider ein wenig auf Kriegsfuß mit Programmierung, was sicher daran liegt, daß ich allenfalls Programme abtippe aber nichts daran verändern mag geschweige denn irgendwas selber entwickeln. Da fehlt wohl ein wenig das Vertrauen in mich selber.
Theoretisch interessiert mich das allerdings sehr.

LG
Gabi

MarieCurie wrote:

das Programm bricht ab in Zeile 7 "Illegal assignement to for -loop variable "i" . There were 1 errors compiling module stopping. Fatal : compilation aborted. "
Mei Englisch st zwar nicht mehr besonders gut, aber ich würde das übersetzen mit "unerlaubte Zuweisung an die Variable i. Ein Fehler hat die Übersetzug des Moduls gestoppt, Übersetzung abgebrochen.", aber du wirst schon wissen was das bedeutet.

Leider ja. Ich widerrufe feierlich. :dunce::tuedelue:

Und ich habs mal kurz recherchiert. Es scheint so zu sein, dass die Sprachdefinition von Pascal aussagt, dass die for-Schleife genau den angegebenen Bereich durchläuft. Manche Implementationen erzwingen das dadurch, dass sie es von vornherein verbieten, die Schleifenvariable im Körper zu verändert. FreePascal tut das anscheinend. Andere benutzen wohl eine versteckte Schleifenvariable, so dass in meinem Beispiel dann 1mal 1 und 9mal 10 ausgegeben werden würde.

Möglicherweise verhält sich Turbo Pascal hier abweichend und lässt sowas einfach zu, so dass sich die Kursautoren genötigt sahen, diese Muss-Regel zu formulieren.

schon wer EA 2.2 versucht???
habe keinen blassen schimmer wie das funktionieren soll, hab eh auch gerade in der Newsgroup des Kurses gepostet, aber ich versuchs jetzt auch noch hier!!!

wo kann ich die Musterlösungen für 01613 ansehen!? zu überprüfung??

Mich wundert auch, dass sie im OKB noch nicht angezeigt werden - weil ja eine Zeile drüber steht, dass sie zugänglich sein sollten.

lg Leo

[IMG]https://iixii.funpic.de/uni/loesungen.png[/IMG]

Ich habe die Musterlösungen gefunden.
Sie stehen unter

[LIST]
[*][B][URL="https://online-uebungssystem.fernuni-hagen.de/six/StudentenStartSeite/01613/WS09/"]Aufgabenübersicht[/URL][/B]
[/LIST]
und nicht unter

[LIST]
[*][B][URL="https://online-uebungssystem.fernuni-hagen.de/six/StudentenKorrekturSeite/01613/WS09/"]Korrekturen und Musterlösungen[/URL][/B]
[/LIST]