| Autor |
Beitrag |
Semptic
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 08.12.09 12:10
Guten Morgen beisammen,
ich hab folgendes Problem, und zwar überspringt mein Programm den read Befehl ( read(Regal[i].Name), Zeile 4  nach dem ersten Durchlauf jedes mal (also 4 mal), als ob ich nichts Eingeben und Enter drücken würde.
Hier ein bild wie es aussieht.
Hier mal der ganze Quellentext der damit was zu tun hat (Der teil in dem der Fehler stecken muss Zeile 44-69):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| TYPE Bauteil = record Name: String[5]; Nummer: Integer; Stueck: Integer; Preis: Real; Lieferdatum: Array[1..3] of Integer; end;
Lager = Array[1..5] of Bauteil;
procedure TForm_Leistungsnachweis.Button_Aufgabe_03Click(Sender: TObject); Var Regal:Lager; i: Integer;
procedure Ausgabe(bauteil: Bauteil); begin writeln('Name: ', bauteil.Name:5, ' Nummer: ', bauteil.Nummer:5, ' Stueckzahl: ', bauteil.Stueck:3, ' Preis: ', bauteil.Preis:5:2, ' Lieferdatum: ', bauteil.Lieferdatum[1], '.', bauteil.Lieferdatum[2], '.', bauteil.Lieferdatum[3]); end;
function Gesamtwert(Regal: Lager):real; var Summe: Real; i: Integer; begin Summe := 0; for i:= 1 to 5 do begin Summe := Summe + Regal[i].Stueck*Regal[i].Preis; end; result := Summe; end;
begin writeln('Bestueckung eines Regals mit Waren'); writeln('');
i:= 1; repeat writeln('Ware ', i, ':');
write('Name: '); read(Regal[i].Name);
write('Nummer: '); read(Regal[i].Nummer);
write('Stueckzahl: '); read(Regal[i].Stueck);
write('Preis: '); read(Regal[i].Preis);
writeln('Lieferdatum':15); write('Tag: '); read(Regal[i].Lieferdatum[1]); write('Monat: '); read(Regal[i].Lieferdatum[2]); write('Jahr: '); read(Regal[i].Lieferdatum[3]);
writeln(''); i := i+1; until (i > 5);
writeln('Kontrolle:'); for i:= 1 to 5 do begin Ausgabe(Regal[i]); end;
writeln('Gesamtwert des Regals: ', Gesamtwert(Regal):5:2);
writeln('');
end; |
Ich hoffe das ihr mir helfen könnt.
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Semptic am Di 08.12.09 14:33, insgesamt 1-mal bearbeitet
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Di 08.12.09 13:56
Herzlich willkommen im Delphi-Forum!
Also erst mal nur so als Frage:
Dein Regal ist vom Typ Lager - und Dein Lager ist einfach nur ein Array, oder was ist das?
Es wäre also schön, wenn Du uns das mal genauer darstellst.
|
|
Semptic 
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 08.12.09 14:33
Sorry des hab ich beim Kopieren übersehen, habs editiert.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| TYPE Bauteil = record Name: String[5]; Nummer: Integer; Stueck: Integer; Preis: Real; Lieferdatum: Array[1..3] of Integer; end;
Lager = Array[1..5] of Bauteil; |
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Di 08.12.09 15:00
Nimm mal readln statt read. Wahrscheinlich ist das Problem dann weg. Read wird von Konsole nur in ganz seltenene Fällen gebraucht.
Gruß Gammatester
|
|
Semptic 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mi 09.12.09 15:07
Erstmal danke für die schnelle Hilfe und auch danke denn genau das war der Fehler.
Super bin echt Happy, denn auf des währ ich selber nich gekommen.
|
|
McDanielz
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 11.12.09 12:04
So Hallo erstmal. Ich muss genau die gleiche Aufgabe lösen, doch bei mir klappt das trotz readln befehl nicht
hier mein qelltext:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.Button1Click(Sender: TObject); type Bauteil=record Name:string[5]; Nummer:integer; Stueck:integer; Preis:real; Lieferdatum:array[1..3] of integer; end; Lager=array[1..5] of Bauteil; var Regal:Lager; i:integer; x:string;
begin for i:=1 to 5 do begin writeln('Bauteil Nr',i); write('Name:'); readln(x); write('Nummer:'); readln(Regal[i].Nummer); write('Stueck:'); read(Regal[i].Stueck); write('Preis:'); read(Regal[i].Preis); writeln('Lieferdatum:'); write('Tag:'); read(Regal[i].Lieferdatum[1]); write('Monat:'); read(Regal[i].Lieferdatum[2]); write('Jahr:'); read(Regal[i].Lieferdatum[3]); end; end; |
weder mit read noch mit readln funktionierts. ab dem 2. durchlauf wird der readbefehl übersprungen. Das muss irgendwie an dem stringtyp liegen, denn die integertypen werden nicht übersprungen. Aber warum funktioniert das beim ersten Durchgang?
P.S. Wie lustig dass jemand aus meinem Studiengang hier genau das gleiche gefragt hat.
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
McDanielz
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 11.12.09 12:09
Ok es funktioniert wenn man alle read befehle durch readln ersetzt. Trotzdem hätte ich gerne eine Erklärung dafür.
Danke!
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 11.12.09 13:16
Die Onlinehilfe ist nicht nur dazu da, daß die Installationspakete größer werden (Hervorhebung von mir):
Delphi 6: | Zitat: | With a type string variable:
Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes True; it does not skip to the next line after reading. If the resulting string is longer than the maximum length of the string variable, it is truncated.
After the first Read, each subsequent Read sees the end-of-line marker and returns a zero-length string. |
Oder wenn's auf Deutsch besser gefällt, hier die von Borland Pascal: | Zitat: | Bei einer Stringvariablen:
Read liest alle Zeichen bis auschließlich der nächsten Zeilenendemarkierung oder bis Eof(f) True ist. Nach dem Lesen geht Read nicht zur nächsten Zeile. Ist der gelesene String länger als die String-Variable, wird er abgeschnitten.
Read überspringt das Zeilenende nicht. Nach dem ersten Read stößt also jedes folgende Read auf das Zeilenende und gibt einen String der Länge 0 zurück. |
Gruß Gammatester
|
|
McDanielz
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 11.12.09 13:27
|
|