@@ -9,217 +9,32 @@ interface
99uses
1010 Classes
1111, SysUtils
12- { $IFDEF FPC}
13- , Contnrs
14- { $ELSE}
15- { $ENDIF}
16-
1712;
1813
19- type
20- { TWeatherStation }
21- PWeatherStation = ^TWeatherStation;
22- TWeatherStation = record
23- FStation: String[100 ];
24- FMin: Int64;
25- FMax: Int64;
26- FTot: Int64;
27- FCnt: Integer;
28-
29- end ;
30- { TBaseline }
31- TBaseline = class (TObject)
32- private
33- FInputFile: String;
34- FStationNames: TStringList;
35- FHashStationList: TFPHashList;
36- procedure AddToHashList (AStation: String; ATemp: Int64);
37- procedure BuildHashList ;
38- function RoundEx (x: Currency): Double;
39- protected
40- public
41- constructor Create(AInputFile: String);
42- destructor Destroy; override;
43-
44- procedure Generate ;
45- published
46- end ;
47-
48- { $IFNDEF FPC}
49- TStringArray = array of Utf8String;
50- TWriteBufStream = TFileStream;
51- { $ENDIF}
14+ function RoundExDouble (const ATemp: Double): Double;
15+ function RoundExInteger (const ATemp: Double): Integer;
5216
5317implementation
5418
55- uses
56- Math
57- { $IFDEF FPC}
58- , streamex
59- { $ELSE}
60- , System.Diagnostics
61- { $IF defined(MSWINDOWS)} , Winapi.Windows{ $ENDIF}
62- { $ENDIF}
63- ;
64-
65- const
66- // lineEnding = #13#10;
67- stationsCapacity = 50000 ;
68-
69-
70- function Compare (AList: TStringList; AIndex1, AIndex2: Integer): Integer;
71- var
72- Pos1, Pos2: Integer;
73- Str1, Str2: String;
74- begin
75- Result := 0 ;
76- Str1 := AList.Strings[AIndex1];
77- Str2 := AList.Strings[AIndex2];
78- Pos1 := Pos(' =' , Str1);
79- Pos2 := Pos(' =' , Str2);
80- if (Pos1 > 0 ) and (Pos2 > 0 ) then
81- begin
82- Str1 := Copy(Str1, 1 , Pos1 - 1 );
83- Str2 := Copy(Str2, 1 , Pos2 - 1 );
84- Result := CompareStr(Str1, Str2);
85- end ;
86- end ;
87-
88- { TBaseline }
89-
90- constructor TBaseline.Create(AInputFile: String);
91- begin
92- FInputFile := AInputFile;
93-
94- FHashStationList:= TFPHashList.Create;
95- FHashStationList.Capacity:= stationsCapacity;
96-
97- FStationNames := TStringList.Create;
98- FStationNames.Capacity := stationsCapacity;
99- FStationNames.UseLocale := False;
100- end ;
101-
102- destructor TBaseline.Destroy;
103- var
104- index: Integer;
105- begin
106- FStationNames.Free;
107- for index:= 0 to FHashStationList.Count - 1 do
108- begin
109- Dispose(PWeatherStation(FHashStationList.Items[index]));
110- end ;
111- FHashStationList.Free;
112- inherited Destroy;
113- end ;
114-
115- procedure TBaseline.AddToHashList (AStation: String; ATemp: Int64);
116- var
117- weatherStation: PWeatherStation;
118- Index: Integer;
19+ function Ceiling (const ANumber: Double): integer;
11920begin
120- Index := FHashStationList.FindIndexOf(AStation);
121- if Index = -1 then
122- begin
123- New(weatherStation);
124- weatherStation^.FStation := AStation;
125- weatherStation^.FMin := ATemp;
126- weatherStation^.FMax := ATemp;
127- weatherStation^.FTot := ATemp;
128- weatherStation^.FCnt := 1 ;
129- FHashStationList.Add(AStation, weatherStation);
130- end
131- else
132- begin
133- weatherStation := FHashStationList.Items[Index];
134- weatherStation^.FMin := Min(weatherStation^.FMin, ATemp);
135- weatherStation^.FMax := Max(weatherStation^.FMax, ATemp);
136- weatherStation^.FTot := weatherStation^.FTot + ATemp;
137- weatherStation^.FCnt := weatherStation^.FCnt + 1 ;
138- end ;
21+ Result := Trunc(ANumber) + Ord(Frac(ANumber) > 0 );
13922end ;
14023
141- procedure TBaseline.BuildHashList ;
24+ function RoundExDouble ( const ATemp: Double): Double ;
14225var
143- inputFileStream: TFileStream;
144- streamReader: TStreamReader;
145- position, Code: Integer;
146- strLine: String;
147- strStation: String;
148- strTemp: String;
149- temparature: Int64;
150- begin
151- if FileExists(FInputFile) then
152- begin
153- inputFileStream:= TFileStream.Create(FInputFile, fmOpenRead);
154- try
155- streamReader:= TStreamReader.Create(inputFileStream);
156- try
157- while not streamReader.Eof do
158- begin
159- strLine:= streamReader.ReadLine;
160- position := Pos(' ;' , strLine);
161- if position > 0 then
162- begin
163- strStation := Copy(strLine, 1 , position - 1 );
164- strTemp := Copy(strLine, position + 1 , Length(strLine));
165- strTemp := StringReplace(strTemp, ' .' , ' ' , [rfReplaceAll]);
166- Val(strTemp, temparature, Code);
167- if Code <> 0 then
168- Continue;
169- AddToHashList(strStation, temparature);
170- end ;
171- end ;
172- finally
173- streamReader.Free;
174- end ;
175- finally
176- inputFileStream.Free;
177- end ;
178- end
179- else
180- begin
181- raise Exception.Create(Format(' File "%s" not found.' , [FInputFile]));
182- end ;
183- end ;
184-
185- function TBaseline.RoundEx (x: Currency): Double;
26+ tmp: Double;
18627begin
187- Result := Ceil(x * 10 ) / 10 ;
28+ tmp:= ATemp * 10 ;
29+ Result := Ceiling(tmp) / 10 ;
18830end ;
18931
190- procedure TBaseline.Generate ;
32+ function RoundExInteger ( const ATemp: Double): Integer ;
19133var
192- index: Integer;
193- strTemp: String;
194- min: Double;
195- max: Double;
196- mean: Double;
197- weatherStation: PWeatherStation;
34+ tmp: Double;
19835begin
199-
200- BuildHashList;
201-
202- FStationNames.BeginUpdate;
203- for index := 0 to FHashStationList.Count - 1 do
204- begin
205- weatherStation := FHashStationList.Items[index];
206- Min := RoundEx(weatherStation^.FMin/10 );
207- Max := RoundEx(weatherStation^.FMax/10 );
208- Mean := RoundEx(weatherStation^.FTot/weatherStation^.FCnt/10 );
209- strTemp := weatherStation^.FStation + ' =' + FormatFloat(' 0.0' , Min) + ' /' + FormatFloat(' 0.0' , Mean) + ' /' + FormatFloat(' 0.0' , Max) + ' ,' ;
210- FStationNames.Add(strTemp);
211- end ;
212- FStationNames.EndUpdate;
213- FStationNames.CustomSort(@Compare);
214-
215- strTemp:= ' ' ;
216- for index:= 0 to FStationNames.Count - 1 do
217- begin
218- strTemp:= strTemp + FStationNames[index] + ' ' ;
219- end ;
220- SetLength(strTemp, Length(strTemp) - 2 );
221- WriteLn(' {' , strTemp, ' }' );
222-
36+ tmp:= ATemp * 10 ;
37+ Result := Ceiling(tmp);
22338end ;
22439
22540end .
0 commit comments