Imperative Programmierung KE2
Hallo,
habe mal eine Frage zum Beispiel 4.1.1.2 in KE2.
Im Beispiel wird ein eigener Datentyp
tNatZahl = 0..maxint ;
definiert und damit die Variable
i: tNatZahl ;
als Laufvariable deklariert.
Gibt es dafür einen bestimmten Grund dafür oder dient es nur der Übung?
Gibt es im Programmablauf bzw. im Programm selbst einen Unterschied diesbezüglich?
Das Programm funktioniert auch wenn kein eigener Typ definiert wird und die Variable i als integer deklariert wird.
Danke schon mal für die Antworten.
Frank
Comments
Stefan Obermaier
Contributions on this page: 1
View profileman könnte es so formulieren: sofern Dein Programm korrekt ist, besteht kein Unterschied zwischen i: tNatZahl oder integer. Wenn Du aufgrund eines Programmfehlers i einen negativen Wert zuweißt, bekommst du entweder eine Fehlermeldung des Compilers oder der Laufzeitumgebung.
Grüße
Stefan
Hacki
Contributions on this page: 5
View profileHmm.. na gut. Werd das dann mal so hinnehmen :)
Ich finde, wenn jedesmal ein eigener Typ definiert wird, können sich nicht nur Fehler einschleichen, sondern das Programm wird auch unübersichtlicher.
Hacki
Contributions on this page: 5
View profileHabe aber schon eine neue Frage:
Im Beispiel 4.2.1.6 werden die Anzahl der Vokale und Konsonanten in einem Satz bestimmt. Hier ein Programmauszug:
...
read (Zeichen) ;
while Zeichen <> '.' do
begin
if (Zeichen >= 'a') and (Zeichen <= 'z') then
begin
Anzahl [Zeichen] := Anzahl [Zeichen] + 1 ;
Gesamtzahl := Gesamtzahl + 1
end; {if}
read (Zeichen)
end; {while-Schleife}
...
In dem Programm wird der Satz auf die Variable "Zeichen" eingelesen, welche vom Typ char ist. Die Frage ist jetzt, woher das Programm weiß, dass es jeden einzelnen Buchstaben zählen soll bzw. jede Stelle von links nach rechts bearbeitet bis ein Punkt kommt? Welche Funktion impliziert denn dieses Verhalten? Habe im Heft nichts genaues gefunden dazu. Die if-Bedingung sagt ja nur aus, das der Inhalt von if zwischen 'a' und 'z' ausgeführt wird.
Danke schon mal für die Antworten.
Gruß Frank
chris*
Contributions on this page: 2
View profileEs wird gar nicht der Satz eingelesen, sondern immer nur ein Zeichen nach dem anderen. Und genau in der Einlesereihenfolge werden die Zeichen bearbeitet.
Das sollte schon vom Datentyp her klar sein, Zeichen ist char, also ein Einzelzeichen.
Hacki
Contributions on this page: 5
View profileDa stimme ich dir erst mal zu, aber wie genau arbeitet das Programm?
Wenn ich einen Satz eingebe beginnt die Bearbeitung ja erst, wenn ich mit Enter bestätigt habe. Das Einlesen geschieht auf der Variablen "Zeichen", welche als char definiert ist. Der Typ char ist mir auch aus C++ bekannt und der Typ ist auch dort nur für ein Zeichen gedacht. Da die Variable aber nicht als array angelegt ist, wo werden dann die anderen Zeichen abgelegt?
Vor Eintritt in die while-Schleife wird ja ein (das Erste) Zeichen eingelesen und in der Schleife ausgewertet. Der letzte Schritt vor Ende der Schleife ist dann das erneute Einlesen eines Zeichens. Wieso wird dann aber das zweite Zeichen, usw. eingelesen? Im Programm ist ja an keiner Stelle eine Zählvariable deklariert, die für das Hochzählen der Positionen im Satz verantwortlich ist. Es scheint also automatisch zu funktionieren. Wenn dem so ist, hätte das ruhig mal im Heft erwähnt werden können.
chris*
Contributions on this page: 2
View profileDas ist relativ kompliziert zu erklären und hat auch nicht so besonders viel mit der Programmiersprache zu tun. Aber in C++ ist es einfacher zu erklären, ich hoffe, du hast nichts dagegen, wenn ich das in C++ erkläre?
Das Ein/Ausgabekonzept von C++ basiert auf sogenannten Streams. Ein Stream (z.B. sind cin, cout Streamobjekte) enthält in sich einen Streambuffer. Anfangs ist der Streambuffer leer. Liest du jetzt ein Zeichen ein (z.B. per cin.get()) dann ruft der Streambuffer eine Lowlevel-Routine des Betriebssystems auf, um den Puffer erstmal wieder zu füllen. Normalerweise arbeitet diese zeilenorientiert, d.h. sie liefert solange Zeichen, bis man Enter drückt. Die ganze Zeile steht jetzt im Streambuffer, und dein cin.get() liefert dir das erste Zeichen davon zurück. Beim nächsten get() bekommst du sofort das nächste Zeichen. Das ganze geht solange, bis der Puffer leer ist, dann muss wieder das Betriebssystem gefragt werden.
Da sind jetzt einige Annahmen drin, die nicht unbedingt immer gelten müssen, aber zum Verständnis dürfte es genügen.
In Pascal ist es im Grunde das gleiche, nur dass man in die ganze Pufferei keinen derartigen Einblick hat. Da gibt es halt read und readln als Frontend, der Rest passiert irgendwie im Hintergrund.
Hacki
Contributions on this page: 5
View profileDanke für die Antwort. Denke das hilft erst mal. Hätte mir im Heft trotzdem mal einen Hinweis darauf gewünscht. Wenn das als Aufgabe gestellt wird, fände ich persönlcih den Schluss auf dieses Programmverhalten sehr schwer. Im Prinzip ist er ganze Kurs ja sehr ausführlich und grundlegend erklärt. An so etwas fehlt es dann aber wieder. Naja.
Nochmal danke für die Antworten.
Gruß Frank