Frage von Fuchsi2001, 24

C# Modulo problem?

Hallo Leute, ich sollte für die schule ein C# Programm schreiben welches als erstes eine eingabe der zeit als sekunden erwartet (z.b 37949) und diese dann als stunden,minuten, sekunden ausgibt....

Nur irgendwie funkt der modulo Operator nicht so ganz...

Static void Main(){ decimal s, a;

Console.Write("Sekunden?"); s = Convert.ToDecimal(Console.Read());

a = s % 3600

Console.Write(a);

} Gibt z.b bei 3600, 51 bei 7562, 55 und bei 36, 51 aus

Ich habe keine Ahnung wieso... Kann mir jemand helfen? LG Julian

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von ceevee, 24

Du setzt den Modulo-Operator falsch ein. Wenn du z.B. wissen möchtest, wie viele Stunden 37949 Sekunden sind, dann musst du die Zahl durch 3600 dividieren (nicht Modulo!) und abrunden. Dann würdest du darauf kommen, dass das in dem Beispiel 10.54 (also 10) Stunden sind.

Wenn du dann beispielsweise ausrechnen willst, wie viele Minuten der Tag hat, dann müsstest du quasi (int)(37949 - (10 * 3600)) / 60) rechnen. Den Modulo brauchst du eigentlich gar nicht, wenn du nicht willst.

Dass du decimal-Variablen nutzt, ist aber trotzdem Quatsch - decimal nutzt man eher selten. In der Regel, wenn man mit Geldbeträgen hantiert und es extrem wichtig ist, dass diese auch nach zig Nachkommastellen noch richtig sind. Ein Integer würde allerdings voll und ganz ausreichen. Ein Tag hat 86400 Sekunden und die Zahlen werden eher kleiner.

Edit: An die Minutenzahl würdest du natürlich mit dem Modulo einfacher kommen...

(int)(37949 % 3600) / 60); (ungetestet)

Kommentar von Fuchsi2001 ,

ich hab gestern das ganze nicht mehr geschafft und es tut mir leid dich erneut um hilfe zu bitten aber du scheinst dich sehr gut mit der Materie aus zu kennen übrigens noch mal danke für die Antwort oben aber jetzt habe ich gerade das eigentliche problem gefunden ... die eingabe funkt generell nicht... ich nutze windows visual studio und der zeit erzeugt jedliche eingabe 51... int secs; Console.WriteLine("Sekunden?"); secs = Console.Read(); Convert.ToInt32(secs); Console.WriteLine(secs); gibt secs in ascii umgewandelt aus... ich glaube ich hab irgendwo einen riesen fehler gemacht Wäre sehr dankbar wenn du mir helfen könntest LG Julian

Kommentar von ceevee ,

Console.WriteLine("Sekunden?");
string secsStrings = Console.ReadLine();
int secs = Convert.ToInt32(secsStrings);
Console.WriteLine(secs);

So müsste es richtig sein. Zum einen hast du die Variablen nicht zugewiesen, zum anderen brauchst du Console.ReadLine() (du willst solange einlesen, bis du Enter eingeben, quasi eine Zeile) Console.Read() liest nur ein einzelnes Zeichen ein.

Falls es dich interessiert: mit Console.Read() liest du nur einen String (also ein einzelnes Zeichen ein), wandelst dieses nicht eine Zahl (also einen Integer) um und bekommst deswegen den ASCII-Code deiner Eingabe aus.

https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange...

Die Zahl "3" hat den ASCII-Code 51, deswegen bekommst du diese Zahl ausgegeben.

Kommentar von Fuchsi2001 ,

Danke!

Antwort
von triopasi, 23

Warum ist s ein decimal? Nimm doch n int... vllt liegst ja daran....

Kommentar von Fuchsi2001 ,

aber int kann nur kleinere zahlen ausgeben... in sekunden rechne ich allerdings mit eingaben weit über dem int berich... aber vl. könnte es mit long klappen wäre mir gerade in den sinn gekommen

Kommentar von triopasi ,

Ja, dan nimm doch mal long oder ulong...

Kommentar von PWolff ,

Oder BigInteger

Antwort
von PWolff, 12

Was gibst du ein, was kommt raus, was sollte rauskommen?

Kommentar von Fuchsi2001 ,

hab das ganze noch mal überarbeitet das problem ist das formatieren nehme ich mal stark an int secs,a; secs = Convert.ToInt32(Console.Read()); a = secs /3600; Console.Writeline(a); wirft beim imput 4550, 0 aus...

Antwort
von Dory1, 19

Warum verwendest du nicht einfach string.format? 

http://stackoverflow.com/questions/463642/what-is-the-best-way-to-convert-second...

Keine passende Antwort gefunden?

Fragen Sie die Community