[Pascal] Record Eingabe Problem

hexler

Ensign
Registriert
Aug. 2004
Beiträge
138
Hallo,

ich hab versucht eine Aufgabe umzusetzen, bei der eine Art Patienten-Datenbank erstellt werden sollte mit dem RECORD Type. Bei der Eingabe läuft jedoch irgendwas schief :(

Mein Programm:
Code:
TYPE medi = RECORD
                menge: integer;
                haufigkeit: integer;
                END;

TYPE patient = RECORD
                pname: String[15];
                zimmer: integer;
                medikament: Medi;
                END;

CONST n = 3;
VAR     daten: array[1..n] of patient;
        i: integer;

BEGIN

//Eingabe Patientdaten
writeln('eingabe von ',n,' Patienten');
for i:=1 to n do  BEGIN
  write('Eingabe Patient ',i, ' Name: ');
  read(daten[i].pname);
  write('Zimmer:');
  read(daten[i].zimmer);
  write('Medikament Mege:');
  read(daten[i].medikament.menge);
  write('Medikament Haeufigkeit:');
  read(daten[i].medikament.haufigkeit);
END;

Wenn ich das Programm ausführ, dann kommt die Eingabeaufforderung für den Namen nur beim ersten Durchlauf der for Schleife. Bei den folgenden Durchläufen wird die Eingabe einfach übersprungen und ein lehrer String in daten.name geschrieben :(

Gibt es für Strings irgend nen anderen Befehl außer read O.o Ich weiß nicht wieso er das read in der for schleife dann einfach überspringt...


Ps: ich wünsch euch nen Guten Rutsch ins neue Jahr !
 
Probiers mal mit einem "Readln" nach dem letzten Einlese-Vorgang.

Code:
.
.
.
  write('Medikament Haeufigkeit:');
  read(daten[i].medikament.haufigkeit);
  readln;
END;
Zudem weis ich aus eigener Erfahrung, das Pascal sich manchmal bei Schleifen des FOR-Types übernimmt, manchmal wird nur ein Durchlauf (in der Regel der Letzte) durchgeführt und so nen Quatsch. Abhilfe schafft hier meist nur der Wechsel auf einen anderen Schleifentyp.
 
Zuletzt bearbeitet:
das liegt daran, dass read bei zahlen das abschließende "enter" in dem buffer lässt und diese bei dem dann folgenden read für den string als ende des strings interpretiert wird.
wenn du alle "read"-aufrufe durch "readln" ersetzt funktioniert es.

EDIT war wohl jemand schneller...
 
danke. readln am Ende der Schleife funktionert :)

Pascal hat scho komische Anwandlungen :freak:
 
nein, komisch ist es nicht. es ist nur eine konsequenz der read-funktion. die liest nur das ein, was du ihr sagst. wenn du eine zahl einlesen willst, tut sie das und sobald ein steuerzeichen kommt, bricht es ab. die beiden/das eine zeilenendzeichen sind/ist keine ziffer sondern steuerzeichen und verbleiben daher im zeichenbuffer.
read garantiert dir desweiteren, dass es versucht irgendetwas sinnvolles einzulesen. das ist bei einem string auch einer leerer string, daher bricht es auch bei steuerzeichen vor der ersten buchstaben ab (wie in deinem code). bei zahlen gibt es jedoch keine leeren zahlen, daher werden steuerzeichen vor der ersten ziffer ignoriert.
um also eine zahl, die alleine in einer zeile ist, auszulesen, musst du pascal genau das sagen und der befehl dafür ist readln und nicht read.
 
Zurück
Oben