![]() |
durchschnittszeit ermitteln
Hallo an alle,
ich bin gerade dabei mir eine Stoppuhr zu programmieren. Die läuft bis jetzt auch ganz wunderbar. Als zusätzliches Feature hatte ich nun geplant, dass man eine Durchschnittszeit ausrechnen lassen kann. Dabei möchte ich aus 10 Durchläufen den Durchschnitt ermitteln. Meine Überlegung war jetzt, dass man im Falle einer Aktivierung (z.b. über eine Checkbox) der Option "Durchschnitt ermitteln" damit beginnt zehn Variablen mit den entsprechenden Werten zu füllen. Diese Werte sollen dann durch die Anzahl der bereits gefüllten Variablen geteilt werden... Soweit denk ich absolut logisch? Ich geb euch hier jetzt erstmal den Code, mit dem ich die Zeit stoppe:
Delphi-Quellcode:
Wie ihr seht, fülle ich in dem Fall noch keine Variable um die gestoppte Zeit anzuzeigen, sondern lasse es einfach nur ein einem Label anzeigen. Mein Problem ist nämlich, dass ich nicht sicher bin, welche Art von Variable ich am besten nehme.. Falls jemand lust hat ein wenig zu coden, dann freue ich mich über fertige Codezeilen :P Hab mit der SuchFunktion leider keine entsprechenden Ergebnisse gefunden :(
procedure TForm1.StartClock;
begin ClockStarted := True; TimeStarted := GetTickCount; repeat TimeElapsed := GetTickCount-TimeStarted; Label1.Caption := TicksToTime(TimeStopped+TimeElapsed); application.ProcessMessages; // damit sich das Programm nicht "aufhängt" if application.Terminated then // Falls die Anwendung inzwischen beendet wurde exit; sleep(1); // 100% CPU-Auslastung vermeiden until not ClockStarted; end; procedure TForm1.StoppClock; begin ClockStarted := False; TimeStopped := getTickcount-TimeStarted + TimeStopped; Label1.Caption := TicksToTime(TimeStopped); end; function TicksToTime(TickCount: cardinal): string; begin result := Format('%.2d:%.2d:%.2d', [TickCount div 1000 div 60, // Minuten TickCount div 1000 mod 60, // Sekunden TickCount mod 1000 div 10]); // Hundertstel end; Mit besten Grüßen |
AW: durchschnittszeit ermitteln
Eine Variable "Avg" für den bisherigen Durchschnitt und eine Variable "n" für die Anzhal der Zeiten, die bisher eingeflossen sind.
Wenn eine Zeit dazukommt, kannst du einfach sowas machen: Avg := (Avg * n + Time)/(n+1) n := n + 1; |
AW: durchschnittszeit ermitteln
welche art von variable sollte ich denn nehmen für avg?
|
AW: durchschnittszeit ermitteln
Kommt darauf an, welchen Typ die Werte habe von denen du den Durchschnitt ermittelst.
In diesem Fall TTime |
AW: durchschnittszeit ermitteln
TTime?
für AVG Single oder Double. Und falls man es anders speichert, z.B. Integer, Cardinal oder Int64: Cardinal = maximal 49,7 Tage
Delphi-Quellcode:
var Sum, Count: Cardinal;
// Neues hinzufügen Inc(Sum, TimeElapsed ); Inc(Count); // für's Anzeigen Avg := Sum div Count; |
AW: durchschnittszeit ermitteln
Hier mal eine Klasse, die aufgrund der Formel aus Betrag#2 arbeitet.
Wenn man einen Durchschnitt berechnet, dann kommt als Datentyp eigentlich nur ein Fliesskommatyp in Frage.
Delphi-Quellcode:
type
TDurchschnitt = class(TObject) private FAvg : Extended; FCount : Integer; function GetAverage: Extended; function GetCount: Integer; public procedure AddValue(value:Extended); procedure RemoveValue(value:Extended); procedure Clear; property Average:Extended read GetAverage; property Count:Integer read GetCount; end; procedure TDurchschnitt.AddValue(value: Extended); begin FAvg := (FAvg * FCount + Value)/(Count+1); Inc(FCount); end; procedure TDurchschnitt.RemoveValue(value: Extended); begin if FCount > 1 then begin FAvg := (FAvg * FCount - Value)/(Count-1); Dec(FCount); end else Clear; end; procedure TDurchschnitt.Clear; begin FAvg := 0.0; FCount := 0; end; function TDurchschnitt.GetAverage: Extended; begin Result := FAvg; end; function TDurchschnitt.GetCount: Integer; begin Result := FCount; end; |
AW: durchschnittszeit ermitteln
hmmmm, ich muss leider sagen, dass mir die antworten nur sehr begrenz weitergeholfen haben... :( jemand der wirklich plan vom programmieren hat, der kann damit sicher einiges anfangen, aber da ich ziemlicher rookie bin......
vielleicht erbarmt sich irgendein großherziger mensch einen auf meinen code angepassten teil für mich zu posten?! ich leg einfach mal den rest vom code mit offen:
Delphi-Quellcode:
die abfrage sollte nun sein: wenn checkbox aktiv, dann.... variablen der reihe nach füllen und gleichzeitig den durchschnitt ermitteln. andernfalls variablen nicht belegen, bzw. sobald unchecked, dann leeren. (die abfrage schaff ich grade noch selbst^^ nur den darin enthaltenen inhalt dann leider nicht mehr so ganz :/ )function TicksToTime(TickCount: cardinal): string; begin result := Format('%.2d:%.2d:%.2d', [TickCount div 1000 div 60, // Minuten TickCount div 1000 mod 60, // Sekunden TickCount mod 1000 div 10]); // Hundertstel end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin if ClockStarted then StoppClock else StartClock; end; procedure TForm1.SpeedButton3Click(Sender: TObject); begin ResetClock; end; procedure TForm1.FormCreate(Sender: TObject); begin ClockStarted := False; TimeStarted := 0; TimeStopped := 0; end; procedure TForm1.ResetClock; begin StoppClock; TimeStopped := 0; Label1.Caption := TicksToTime(0); // = '00:00:00' end; procedure TForm1.StartClock; begin ClockStarted := True; TimeStarted := GetTickCount; repeat TimeElapsed := GetTickCount-TimeStarted; Label1.Caption := TicksToTime(TimeStopped+TimeElapsed); application.ProcessMessages; // damit sich das Programm nicht "aufhängt" if application.Terminated then // Falls die Anwendung inzwischen beendet wurde exit; sleep(1); // 100% CPU-Auslastung vermeiden until not ClockStarted; end; procedure TForm1.StoppClock; begin ClockStarted := False; TimeStopped := getTickcount-TimeStarted + TimeStopped; Label1.Caption:= TicksToTime(TimeStopped); end; danke schon mal für alle weiterführenden antworten! |
AW: durchschnittszeit ermitteln
Delphi-Quellcode:
procedure TForm1.ResetClock;
begin if Label1.Caption <> '00:00:00' then begin ClockStarted := False; TimeStopped := getTickcount-TimeStarted + TimeStopped; TimeStopped := 0; Label1.Caption := TicksToTime(0); // = '00:00:00' if RadioButton1.Checked=true then begin inc(n); if n>10 then begin antwort:=form3.ShowModal; if antwort=mrok then begin n:=1; end else begin //asdf end; end end end end; procedure TForm1.StartClock; begin ClockStarted := True; TimeStarted := GetTickCount; repeat TimeElapsed := GetTickCount-TimeStarted; Label1.Caption := TicksToTime(TimeStopped+TimeElapsed); application.ProcessMessages; // damit sich das Programm nicht "aufhängt" if application.Terminated then // Falls die Anwendung inzwischen beendet wurde exit; sleep(1); // 100% CPU-Auslastung vermeiden until not ClockStarted; end; so ich habe dann mal ein wenig dran rumgebastelt.. es läuft soweit erstmal, dass er schritt für schritt die einzelnen captions füllt, aber wenn ich es als variablen haben möchte, gibts immer probleme :( im code zu sehen, dass ich immer erst beim reset der uhr den zähler n erhöhe, damit die zeit, wenn ich nur pausiere und dann weiter laufen lasse weiterhin im gleichen label landet und nicht als nächste zeit für den zu ermittelnden durchschnitt ist... die abfrage prüft dann, ob die bereits zehn gefüllten zeiten überschrieben werden sollen, eigentlich unwichtig für mein problem! beim startclock hab ich auch keinerlei probleme.. es hängt immer beim stopclock! da taucht immer ein runtime error auf :/ ich hatte es vorher mal probiert einfach nur in labels zu füllen, damit ich zumindest erst mal alle zeiten habe.. später wollte ich die dann in variablen umwandeln (im ansatz eigentlich falsch, ist mir klar....) zum test hats erst mal geklappt... das sah dann so aus:
Delphi-Quellcode:
und so weiter.. abgeändert habe ich es dann in folgendes:
if n=1
then Label14.Caption:=Label1.Caption; if n=2 then Label15.Caption:=Label1.Caption;
Delphi-Quellcode:
das problem ist, dass er mir dabei jedes mal direkt rausspringt... wo ist der fehler?
procedure TForm1.StoppClock;
begin ClockStarted := False; TimeStopped := getTickcount-TimeStarted + TimeStopped; Label1.Caption:= TicksToTime(TimeStopped); if RadioButton1.Checked=true then begin if n=1 then zeit1:=StrToTime(Label1.Caption); Label14.Caption:=TimeToStr(zeit1); if n=2 then zeit2:=StrToTime(Label1.Caption); Label15.Caption:=TimeToStr(zeit2); if n=3 then zeit3:=StrToTime(Label1.Caption); Label16.Caption:=TimeToStr(zeit3); if n=4 then zeit4:=StrToTime(Label1.Caption); Label17.Caption:=TimeToStr(zeit4); if n=5 then zeit5:=StrToTime(Label1.Caption); Label18.Caption:=TimeToStr(zeit5); if n=6 then zeit6:=StrToTime(Label1.Caption); Label19.Caption:=TimeToStr(zeit6); if n=7 then zeit7:=StrToTime(Label1.Caption); Label20.Caption:=TimeToStr(zeit7); if n=8 then zeit8:=StrToTime(Label1.Caption); Label21.Caption:=TimeToStr(zeit8); if n=9 then zeit9:=StrToTime(Label1.Caption); Label22.Caption:=TimeToStr(zeit9); if n=10 then zeit10:=StrToTime(Label1.Caption); Label23.Caption:=TimeToStr(zeit10); // schnitt:=((zeit1 + zeit2+ zeit3 + zeit4 + zeit5 + zeit6 + zeit7 + zeit8 + zeit9 + zeit10) div n); // Label25.Caption:=TimeToStr(schnitt); end end; |
AW: durchschnittszeit ermitteln
vergessen zu sagen hab ich...
zeit1-zeit10 sind ttime weswegen er als fehler immer ausspuckt ".... '00:32:19' ist keine gültige Uhrzeit ...." |
AW: durchschnittszeit ermitteln
Du weißt aber schon, dass deine Einrückung – wie soll ich sagen – problematisch ist? Und zwar die Zeilen unter den then werden immer ausgeführt:
So sieht es ungefähr der Compiler: Zitat:
MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz