Autor |
Beitrag |
belinea1337
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 21.01.09 00:13
Hallo!
Ich habe ein ziemlich großes Problem. Habe die Aufgabe aus verschiedenen Dateien die Daten auszulesen und diese dann auszugeben. Ich habe bereits ein vorgefertigtes Hauptprogramm, welches ich nicht verändern darf und soll dazu die Unit "DateioperationenSolar" erstellen.
Hier ist der Code aus der vorgegebenen Unit:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) MittelwerteStringGrid: TStringGrid; MaxWertLabeledEdit: TLabeledEdit; MaxZeitLabeledEdit: TLabeledEdit; ErgebnisseSpeichernButton: TButton; BeendenButton: TButton; EinlesenButton: TButton; MonatComboBox: TComboBox; TagComboBox: TComboBox; MonatLabel: TLabel; TagLabel: TLabel; procedure BeendenButtonClick(Sender: TObject); procedure EinlesenButtonClick(Sender: TObject); procedure ErgebnisseSpeichernButtonClick(Sender: TObject); private procedure DatumErfassen(Var Datum: String); end;
var Form1: TForm1;
implementation {$R *.dfm} Uses DateioperationenSolar;
Var DateiDatum : String; StundenMittel : TStundenMittel; Maximum : TDatensatz;
procedure TForm1.BeendenButtonClick(Sender: TObject); begin Application.Terminate end;
procedure TForm1.EinlesenButtonClick(Sender: TObject); Var Stunde : Integer; begin DatumErfassen (DateiDatum); DatenEinlesen (DateiDatum, StundenMittel, Maximum); MaxWertLabeledEdit.Text := FloatToStr(Maximum.Wert); MaxZeitLabeledEdit.Text := IntToStr(Maximum.Stunde) + ' : ' + IntToStr(Maximum.Minute); For Stunde := ersteStunde To letzteStunde Do Begin MittelwerteStringGrid.Cells [0,Stunde - ersteStunde + 1] := IntToStr(Stunde); MittelwerteStringGrid.Cells [1,Stunde - ersteStunde + 1] := FloatToStrF(StundenMittel [Stunde], ffNumber, 4, 0); End; end;
procedure TForm1.ErgebnisseSpeichernButtonClick(Sender: TObject); Var ErgebnisDatei: TextFile; ErgebnisdateiName: String; begin DatenSpeichern (StundenMittel, Maximum, DateiDatum); end;
procedure TForm1.DatumErfassen(Var Datum: String); begin Datum := IntToStr (1 + TagComboBox.ItemIndex) + '_' + IntToStr (1 + MonatComboBox.ItemIndex); end;
end. |
So, das ganze soll aus Dateien ausgelesen werden, die in dem Format "1_6.DAT" oder "17_6.DAT" vorliegen.
In den Dateien gibt es Werte, die in dem Format vorliegen:
Quelltext
Der erste Wert, gibt den Volt-Wert an, die 0 gibt nichts an (ist in jeder Zeile 0) und der letzte Wert die Uhrzeit. Das ganze ist mit Tabs getrennt.
Das Programm soll jetzt den Mittelwert von den einzelnen Stunden berechnen und man soll den Tag auswählen können. Das Problem ist, unser Lehrer hat uns quasi nichts dazu erklärt und ehrlich gesagt kann keiner die Aufgabe lösen. Ich denke mal, die Aufgabe ist nicht wirklich schwer, aber wenn man nicht erklärt bekommt wie es geht, kann man es ja auch nicht lösen :/
Ich habe bereits einen Teil von DateioperationenSolar programmiert, allerdings funktioniert da noch nicht wirklich etwas und ich glaube auch mein Ansatz ist falsch.
Hier mal kurz mein Ansatz, allerdings kann man wahrscheinlich alles verwerfen :/
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:
| unit DateioperationenSolar;
interface
const ersteStunde = 7; letzteStunde = 19;
type TStundenMittel = array[7..19] of real; TDatenSatz = Record wert: real; Stunde: integer; Minute: integer; end;
procedure DatenEinlesen (D:string;s: TStundenMittel; M:TDatenSatz); procedure DatenSpeichern (s: TStundenMittel; M: TDatenSatz; D: String);
implementation
procedure DatenEinlesen (D:string; s: TStundenMittel; M:TDatenSatz); type TFeldtyp = array of string; var solarfile: Textfile; puffer: string; i: integer; n: integer; zweipuffer: TFeldtyp; laenge: integer; drittpuffer: TFeldtyp; wert: TFeldtyp; ersteabschneidstelle: integer; abschneidstelle: integer; begin AssignFile(solarfile, D + '.dat'); reset(solarfile); repeat Read (solarfile,puffer); Inc(n); zweipuffer[n]:= puffer; laenge := length(zweipuffer[n]); for i:= 1 to laenge do begin if zweipuffer[n] = '#9' then
begin ersteabschneidstelle := abschneidstelle; abschneidstelle := i; drittpuffer[i] := copy(zweipuffer, ersteabschneidstelle, abschneidstelle); end; end; until EoF (solarfile); closefile(solarfile); for i:=1 to n do end;
procedure DatenSpeichern (s: TStundenMittel; M: TDatenSatz; D: String); begin end;
end. |
Ich hoffe ihr könnt mir helfen! Vielen Dank im Vorraus!
belinea1337
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.01.09 00:35
Das Programm habt ihr so vorgegeben bekommen? Und da wundern sich manche noch über die Pisa Ergebnisse...
Egal, zu deinem Quelltext: Delphi-Quelltext 1:
| Read (solarfile,puffer); | Du willst ja vermutlich eine Zeile einlesen. Das geht mit ReadLn statt Read.
Weißt du wie du debuggst? Du setzt mit F5 einen Haltepunkt in der ersten Zeile (bei dir AssignFile(...); ) und führst dann das Programm aus. Wenn das Programm dann an der Stelle mit dem Haltepunkt ankommt, dann kommt Delphi zum Vorschein und du kannst mit F8 zeilenweise den Quelltext ausführen.
Je nach Delphiversion reicht es die Maus über Variablen zu halten um den Wert angezeigt zu bekommen. Du kannst auch eine Ausdruck markieren und Strg + F7 drücken um den Wert angezeigt zu bekommen.
So siehst du was passiert und du kommst vielleicht weiter.
|
|
Xentar
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 21.01.09 00:41
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.01.09 00:50
Zu den Crossposts habe ich schon etwas in der DP geschrieben, dort gibts nämlich noch einen:
www.delphipraxis.net/post991270.html
Crossposts sollten angegeben werden. Denn überall denken jetzt Leute darüber nach und schreiben etwas dazu statt nachschauen zu können ob es anderswo schon Antworten gibt...
Im Delphi-Treff wird deine Frage deshalb vermutlich gesperrt werden, weil du die Crossposts nicht angegeben hast. (EDIT: gerade passiert)
|
|
belinea1337
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 21.01.09 17:45
Sorry wegen den Crossposts, aber ich bin echt verzweifelt
jaenicke hat folgendes geschrieben : | Das Programm habt ihr so vorgegeben bekommen? Und da wundern sich manche noch über die Pisa Ergebnisse...
[...] |
Ja, die Hauptunit haben wir so vorgegeben bekommen, das DateioperationenSolar ist von mir. Was ist denn mit der Hauptunit?
jaenicke hat folgendes geschrieben : | [...]
Weißt du wie du debuggst? Du setzt mit F5 einen Haltepunkt in der ersten Zeile (bei dir AssignFile(...); ) und führst dann das Programm aus. Wenn das Programm dann an der Stelle mit dem Haltepunkt ankommt, dann kommt Delphi zum Vorschein und du kannst mit F8 zeilenweise den Quelltext ausführen.
Je nach Delphiversion reicht es die Maus über Variablen zu halten um den Wert angezeigt zu bekommen. Du kannst auch eine Ausdruck markieren und Strg + F7 drücken um den Wert angezeigt zu bekommen.
So siehst du was passiert und du kommst vielleicht weiter. |
Danke für den Tipp, aber das hilft mir leider nicht weiter, weil ich überhaupt keine Ahnung habe wie ich das ganze programmieren soll. Irgendwie muss ich ja sagen, dass die ersten Werte als Volt-Werte speichert und die letzten Werte als Zeitangaben, aber ich weiß wirklich nicht einmal ansatzweise wie ich das machen soll.
Hoffe ihr könnt mir helfen! :/
Vielen Dank!
belinea1337
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.01.09 18:07
Also, ich geb dir mal ein Beispiel: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ReadLn(solarfile, puffer); Volt := Copy(puffer, 1, Pos(#9, puffer) - 1); Delete(puffer, 1, Pos(#9, puffer)); Delete(puffer, 1, Pos(#9, puffer)); ErsteZahl := Copy(puffer, 1, Pos(#9, puffer) - 1);
|
belinea1337 hat folgendes geschrieben : | Ja, die Hauptunit haben wir so vorgegeben bekommen, das DateioperationenSolar ist von mir. Was ist denn mit der Hauptunit? |
Ich sag lieber nix weiter dazu.
|
|
belinea1337
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 21.01.09 18:30
jaenicke hat folgendes geschrieben : | Also, ich geb dir mal ein Beispiel: |
Dankeschön! Allerdings habe ich noch ein paar Fragen. Was genau wird jetzt in ErsteZahl reinkopiert? Die Stunde? Oder auch die Minuten? Das Ganze muss ja jetzt in eine Zählschleife, wenn ich jetzt allerdings einfach eine Zählschleife einfüge, dann überschreibt er ja Volt immer, also nehme ich an muss ich am Ende noch hinzufügen:
Delphi-Quelltext 1:
| VoltInt := VoltInt+StrToInt (Volt); |
So, jetzt macht er das z.B. 720 mal (so viele Zeilen hat die Solardatendatei) dann hat VoltInt zwar die kompletten Voltwerte zusammengerechnet, allerdings muss ich ja irgendwie angeben, dass er das für jede Stunde einzeln macht. Also muss ich ihm sagen er soll das machen bis als Wert in der .DAT Datei vorkommt "8 0" und dann soll er das ganze in eine neue Variable schreiben. Und wieder hänge ich fest, weil ich programmiertechnisch nicht weiß, wie ich das umsetzen soll :/
jaenicke hat folgendes geschrieben : | [...]
Ich sag lieber nix weiter dazu. |
Haha, ist das Programm von ihm so schlecht?
Vielen Dank bereits im Vorraus!
belinea1337
Moderiert von Narses: Zitat gekürzt
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.01.09 18:43
belinea1337 hat folgendes geschrieben : | Allerdings habe ich noch ein paar Fragen. Was genau wird jetzt in ErsteZahl reinkopiert? Die Stunde? Oder auch die Minuten? |
Ich schreibe mal in Kommentaren was wann wo drin ist: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| ReadLn(solarfile, puffer); Volt := Copy(puffer, 1, Pos(#9, puffer) - 1); Delete(puffer, 1, Pos(#9, puffer)); Delete(puffer, 1, Pos(#9, puffer)); ErsteZahl := Copy(puffer, 1, Pos(#9, puffer) - 1); | Vielleicht macht es das etwas klarer.
|
|
belinea1337
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 21.01.09 19:47
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.01.09 21:22
Du bekommst als zweiten Parameter doch eine Variable vom Typ TStundenMittel übergeben. Dort sollst du das ja hineinspeichern, oder? TStundenMittel ist ein array[7..19] of real, d.h. du kannst direkt auf die einzelnen Einträge des Arrays zugreifen.
Du kennst doch Arrays, oder?
www.christian-stelzm...crashkurs.htm#arrays
de.wikibooks.org/wik...lphi:_Pascal:_Arrays
Insgesamt empfehle ich dir den Crashkurs, zu desses Teil über Arrays der erste Link auch führt:
crashkurs.christian-stelzmann.de
Wenn ich das richtig verstanden habe, dann hast du in den Dateien mehrere Einträge zu jeder Stunde, und deren Mittelwert sollst du in den Parameter vom Typ TStundenMittel (bei dir S) speichern, oder?
Dann könntest du dir in einem Array merken wie viele Einträge zu den einzelnen Stunden gehören, und in S die Summe speichern. Am Ende musst du dann nur noch aus der Anzahl in deinem Zusatzarray und der Summe in S den Mittelwert errechnen.
|
|
|