Autor Beitrag
belinea1337
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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, 40);
  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:
ausblenden Quelltext
1:
283  0   7  0					

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 :/
ausblenden volle Höhe Delphi-Quelltext
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..19of 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;
    //drittpuffer := copy(zweipuffer);
    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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 21.01.09 00:35 
Das Programm habt ihr so vorgegeben bekommen? Und da wundern sich manche noch über die Pisa Ergebnisse... :roll: :lol:

Egal, zu deinem Quelltext:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 21.01.09 00:41 

_________________
PROGRAMMER: A device for converting coffee into software.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 21.01.09 17:45 
Sorry wegen den Crossposts, aber ich bin echt verzweifelt :(

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das Programm habt ihr so vorgegeben bekommen? Und da wundern sich manche noch über die Pisa Ergebnisse... :roll: :lol:
[...]

Ja, die Hauptunit haben wir so vorgegeben bekommen, das DateioperationenSolar ist von mir. Was ist denn mit der Hauptunit?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
[...]
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 21.01.09 18:07 
Also, ich geb dir mal ein Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
ReadLn(solarfile, puffer);
// Ich lese eine Zeile
Volt := Copy(puffer, 1, Pos(#9, puffer) - 1);
// Ich kopiere von Position 1 bis ein Zeichen vor der Position des Tabs
// (der zweite Parameter ist die Länge des zu kopierenden Abschnitts).
Delete(puffer, 1, Pos(#9, puffer));
// Ich lösche dies inkl. des Tabs.
Delete(puffer, 1, Pos(#9, puffer));
// Dies wiederhole ich, die Angabe (die 0) muss ich ja vorher nicht auslesen.
ErsteZahl := Copy(puffer, 1, Pos(#9, puffer) - 1);
// Ich kopiere wieder alles bis vor dem nächsten Tab.

// Und wenn du das jetzt löschst bleibt ja schon nur die letzte Zahl noch übrig.


user profile iconbelinea1337 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 21.01.09 18:30 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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 :/

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
[...]
Ich sag lieber nix weiter dazu.

Haha, ist das Programm von ihm so schlecht? :)

Vielen Dank bereits im Vorraus!

belinea1337

Moderiert von user profile iconNarses: Zitat gekürzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 21.01.09 18:43 
user profile iconbelinea1337 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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);
// puffer = '283  0   7  0'
// Volt = ''
// ErsteZahl = ''
Volt := Copy(puffer, 1, Pos(#9, puffer) - 1);
// puffer = '283  0   7  0'
// Volt = '283'
// ErsteZahl = ''
Delete(puffer, 1, Pos(#9, puffer));
// puffer = '0   7  0'
// Volt = '283'
// ErsteZahl = ''
Delete(puffer, 1, Pos(#9, puffer));
// puffer = '7  0'
// Volt = '283'
// ErsteZahl = ''
ErsteZahl := Copy(puffer, 1, Pos(#9, puffer) - 1);
// puffer = '7  0'
// Volt = '283'
// ErsteZahl = '7'
Vielleicht macht es das etwas klarer. ;-)
belinea1337 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 21.01.09 19:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
[...]Vielleicht macht es das etwas klarer. ;-)

Ja, dankeschön! Jetzt könnte ich es ja so programmieren, dass er nur prüft welche Zahl jetzt im Puffer an 1. Stelle steht und dann das ganze ungefähr so aussieht:
ausblenden Delphi-Quelltext
1:
2:
if puffer(1) = 7 then //Greift man so auf den Puffer an 1. stelle zu?
VoltInt7 := VoltInt7+StrToInt(Volt);

Wäre allerdings relativ unschön und ich müsste das ganze ja von 7 bis 18 hinschreiben. Gibt es da eine elegantere Lösung? :/

belinea1337
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.