Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Problem integer


Sack2000 - Di 31.05.05 15:30
Titel: Problem integer
Hi, Community

Im Informatikunterricht programmieren wir einen Elternsprechtagmanager, bei dem die Anfangszeiten und die Endzeiten jeweils in zwei integer Variablen gespeichert sind. Zum einen in start_hour, start_minute , end_hour und end_minute.

Ich möchte jetzt gerne wissen, wenn jetzt in start_hour 15 steht und in start_minute 30, wie kann ich die beiden Zahlen in einer anderen Variable benutzen, sodass sie hintereinander stehen, also dann so "1530".

Ich brauche nämlich die Differenz aus der Endzeit - Anfangszeit, aber dies geht nur wenn die Zahlen 4 Ziffern haben...

Ich hoffe das Problem wird klar :D


WeBsPaCe - Di 31.05.05 15:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
start_hour, start_minute , end_hour, end_minute: Integer;
start, ende: Integer;
begin
start := StrToInt(IntToStr(start_hour)+IntToStr(start_minute));
ende := StrToInt(IntToStr(end_hour)+IntToStr(end_minute));
end;


Beispiel:
start_hour :arrow: 15
start_minute :arrow: 30

:arrow: start :arrow: 1530


Delete - Di 31.05.05 15:40

So kannst du nicht mit Zeiten rechnen. 1530 - 1450 = 80. Bei mir sind es von 10 vor drei bis halb vier aber nur 40 Minuten. :roll:

Nimm ein Edit (TMaskEdit), lass diort die Zeit im Format hh:mm eingeben und wandele das in TTime um und rechen damit.


WeBsPaCe - Di 31.05.05 15:41

Ich nehme mal an, das das Info-Unterricht ist. Und dann kann man da wunderschön irgendwelche Prozeduren schreiben, die überprüfen ob die erste Zahl größer ist oder die zweite. Ich kenn sie doch die Info-Lehrer. :mrgreen: ;)


Delete - Di 31.05.05 15:44

Und was nützt dir das? Guck dir mein Rechenbeispiel in meinem vorherigen Post an. Dir ist wohl noch nie aufgefallen, dass eine Stunde nur 60 Minuten hat und nicht hundert.


WeBsPaCe - Di 31.05.05 16:00

Dann hab ich deine Problembeschreibung falsch gesehen. ;) Dachte an sowas: 1450-1620 ;) Aber dein Problem ist ja wohl auch zu lösen. Mit div und mod hast du dann ganz schnell folgenden Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
differenz, dauer_stunden, dauer_minuten: Integer;
begin
differenz := 80;
dauer_stunden := differenz div 60;
dauer_minuten := differenz mod 60;
ShowMessage(IntToStr(dauer_stunden));
ShowMessage(IntToStr(dauer_minuten));
end;

;)


Sack2000 - Di 31.05.05 16:08

Danke erstmal

ne es geht draum, dass ich die Anwesenheit programmieren soll, also von wann bis wann ein Lehrer oder Eltern Teil da ist. Und die Anwesenheit wird in zwei Comboboxen angezeigt also die eine heißt halt von und die andere bis.

In dieser Box sollen dann alle möglichen Gespräche eines Tages auftauchen. Und ich dachte daran, dass man halt wenn jetzt der Sprechtag von 15:30 bis 18:30 geht, erstmal rechnet:

1830-1530 dann geteilt durch die Gesprächslänge also 10 Min

dann hat man 300:10 = 30

Also 30 freie Termine und dann wollte ich mit ner for schleife von 1 bis 30 die Gesprächslänge dazu addieren


WeBsPaCe - Di 31.05.05 16:11

Klingt doch ganz ordentlich. Wo ist das Problem? :gruebel:


Delete - Di 31.05.05 16:13

user profile iconSack2000 hat folgendes geschrieben:

1830-1530 dann geteilt durch die Gesprächslänge also 10 Min

dann hat man 300:10 = 30

Du hast es nicht verstanden, was ich versucht habe dir zu erklären. Von 15:30 bis 18:30 sind es drei Stunden also 180 Minuten. 180 geteilt durch 10 Minuten Gesprächslänge ergibt 18 Termine!


Sack2000 - Di 31.05.05 16:16

Stimmt wie muss ich denn jetzt die Rechnung ändern, damit das hinkommt.


WeBsPaCe - Di 31.05.05 16:16

user profile iconLuckie hat folgendes geschrieben:
Du hast es nicht verstanden, was ich versucht habe dir zu erklären. Von 15:30 bis 18:30 sind es drei Stunden also 180 Minuten. 180 geteilt durch 10 Minuten Gesprächslänge ergibt 18 Termine!

Genau. Passt doch. Ich glaube, ich hab's wirklich nicht verstanden, was du meinst. :eyes: :? Versuch's bitte nochmal zu erklären. ;)


jasocul - Di 31.05.05 16:16

Das Problem?
Manoman.
15:30 bis 18:30 sind 3 Stunden. Macht 180 Minuten.
Das durch 10 sind 18 Termine.

Sind euch die warmen Tage zu Kopf gestiegen? :lol:


WeBsPaCe - Di 31.05.05 16:18

user profile iconSack2000 hat folgendes geschrieben:
Stimmt wie muss ich denn jetzt die Rechnung ändern, damit das hinkommt.

Welche Rechnung? :shock:


Sack2000 - Di 31.05.05 16:20

Ja das Programm muss doch jetzt die 3 Stunden erkennen und wissen, dass 3 Stunden 180 Minuten haben. Und dann 180 : 10 teilen. Oder nicht


Delete - Di 31.05.05 16:22

Du musst mit Variablen vom Typ TTime rechnen.


jasocul - Di 31.05.05 16:24

Du kannst mit Zeitwerten rechnen. Z.B.: Differenzen bilden.
Wenn du dir noch die Funktionen StrToTime und TimeToStr in der Hilfe ansiehst, solltest du eigentlich zurecht kommen.
Kleiner Tipp: Intern werden Zeitwerte als Zahlen behandelt.


WeBsPaCe - Di 31.05.05 16:27

Häh? :shock:

Du hast doch zwei Zahlen wie z.B. 16, 20, 15 und 40 oder nicht? Die fügst du mit meinem Code von da oben zusammen. Dann hast du 1620 und 1540. Das subtrahieren: 1620-1540. Dann hast du 80. Teilst die 80 durch 10: 80/10. Und hast deine Anzahl der Termine raus: 8.

:gruebel:


jasocul - Di 31.05.05 16:30

@webspace:
Schau mal auf die Uhr und zähl die Minuten. Das sind nämlich nur 40.


Allesquarks - Di 31.05.05 16:30

integers die man in Delphi mit einem Wert belegt werden ersteinmal als Zahlen im Zehnersystem interpretiert. leider sehen wir unsere Zeitangaben auch so an, was nicht stimmt, da 60 s=1min ; 60 min=1 h und 24 h =1 T ist also total konfus

Tja wie man das rechnet: Vielleicht die Stunden in Minuten umrechnen (*60) (dann hast du nämlich einheitliche Einheiten und kannst dann auch durch 10 min teilen andernfalls kannst du nicht einfach Stunden durch Minuten teilen was soll denn da Einheitenmäßig rauskommen (so wie Äpfel durch Birnen teilen) (Minute durch Minute ist einheitenlos, was ja eine Anzahl auch sein sollte))
Wenn du den Befehl div und mod mit 60 benutzt also Division mit Rest und so kannst du dann beim zurückrechnen sofort wieder Stunden und Minuten bekommen


WeBsPaCe - Di 31.05.05 16:43

user profile iconjasocul hat folgendes geschrieben:
@webspace:
Schau mal auf die Uhr und zähl die Minuten. Das sind nämlich nur 40.

Gut. Jetzt hab ich das Problem verstanden. :mrgreen:


Malo05 - Di 31.05.05 17:01

KLeine Frage am Rande: Schonmal von TDate, TDateTime und TTime gehört? Dann noch die Funktionen EncodeDateTime und DecodeDateTime und die ganze Aufgabe ist schon fast erledigt ;)


Delete - Di 31.05.05 17:41

user profile iconWeBsPaCe hat folgendes geschrieben:
Das subtrahieren: 1620-1540. Dann hast du 80.

Gut, dass du nicht bei der Gewerkschaft arbeitets, du wärst der Traum jedes Arbeitgebers. :mrgreen:


Sack2000 - Di 31.05.05 18:02

Ich kann mit diesen Tdate usw. nicht viel anfangen meine Hilf ist im Eimer :D Und so hab ich auch noch icht mit denen gearbeitet. Das sind auch Variablen wie Integer oder wie muss man die in den Quellcode einbinden ???


alzaimar - Di 31.05.05 22:48

Mach es doch so, wenn Du mit TTime nicht klarkommst: Anstatt aus 15:30 1530 zu machen, rechnest du aus, wie viele Minuten seit Mitternacht vergangen sind. Pro Stunde sind 60 Minuten vergangen, also hier 15*60 Minuten, dann noch die 30 Minuten. Damit kommst du auf äh.. so ca. 930 Minuten. 16:10 wäre dann 16*60+10 = 970. 970-930 = 40 Minuten.
Also:

Delphi-Quelltext
1:
2:
3:
4:
Function MinutenSeitMitternacht (ZeitStunde, ZeitMinute : Integer) : Integer;
Begin
  Result := 60*ZeitStunde + ZeitMinute
End;