Horoskop Tag Monat

  • Guten Tag, sollen ein Programm programmieren was für bestimmte Tage ein Satz ausgeben soll.


    Dabei soll die Zehner und einer Stellen + der Monat berücksichtigt werden.


    Also bei dem Datum:
    24.7


    Soll für die 2 ein vorgegeben Text ausgegeben werden, für die 4 und für die 7. Also 3 Textausschnitte insgesamt.


    Das ganze ist ja auch einfach, wenn man mit 3 Eingaben arbeitet: (Eingabe 1(Zehnerstelle):2, Eingabe 2(Einerstelle): 4, Eingabe 3(Monat): 7
    Eingabe Zehner, eingabe Einerstelle und Eingabe des Monats


    Wir würden allerdings gerne nur 2 Eingaben tätige. (Einmal Tag und Monat)
    Nun wissen wir allerdings nicht, wie die Zehnerstelle erkannt werden kann.
    Umsetzen müssen wir das ganze mit einer Switch-case Anweisung, wovon wir ja 3 Stück brauchen. (Eine für die Zehnerstelle, eine für die Einerstelle und eine für den Monat)


    Bei der 1. switch-case Anweisungen müssen wir es also irgendwie hinkriegen, dass diese nur die Zehnerstelle (erste Stelle des Tages) ausliest.


    Uns wurde ganz kurz etwas mit arrays erklärt, was wir noch nicht wirklich verstanden haben. Das brauchen wir auch eig. nicht für die Aufgabe wenn man mit 3 Eingaben arbeitet und wir werden das im Unterricht zu einem späteren Zeitpunkt noch lernen.


    Hoffe ist verständlich erklärt und mir kann jemand weiterhelfen :P

  • Zitat

    Sin 3 ganz einfache rechnungen


    1. Tag Modulu 10
    2. Tag - Ergebnis aus 1
    3. Ergebnis aus 2 / 10


    was rechnest du da kompliziert rum?
    wenn man eine integer-division durchführt, also beige operanden integer sind, kommt am ende wieder ein integer raus.
    und mit einem double kannst du kein modulO machen.. also doppelt fürn hugo.




  • xaw um deine signatur zu zitieren: "weil Baum!"


    nein, ich finde das einfach unsauber! wenn ich eine int durch eine int teile und weiß das dabei eine zahl mit nachkommastelle rauskommt find ichs einfach unsauber wenn die nachkommastelle so abgeschnitten wird....


    deswegen:


    Code
    1. int ten = (day - (day % 10)) / 10;

  • also wirklich... wir haben hier einen absoluten anfänger, und du willst ihm inneffizienten, unsauberen code als sauber verkaufen?
    wenn man mit einer programmiersprache Unterwegs ist, muss man sich mi seinen eigenheiten, und vorteilen auseinandersetzen.
    eines der dinge die in Java existieren (eigentlich in fast allen sprachen) ist die ganzzahldivision. das ist eine verdammt sinnvolle und viel verwendete Technik.


    bei deiner "Lösung" ist 1. nicht gut erkennbar was passiert, und 2. braucht der computer zwei bis drei mal so lange... gut letzteres ist in dem fall egal, aber aber trotzdem!


    ich habe in meinem code

    Code
    1. int ten = ((int)day)/10;


    absichtlich zusätzlich einen redundanten Cast auf int hinzugefügt, um zu signalisieren "Achtung, das ist eine integer-Division - da wird was abgeschnitten!!".
    ... bevor du jetzt sagst "AHA, da muss ja bei dir auch rumgerechnet werden!!".. nein muss es nicht - der Compiler wird erkennen, dass ich von int auf int caste, und das ignorieren, und so tun als wär das gar nicht dagestanden.


    danke für die aufmerksamkeit

  • ganz ehrlich?
    Ich verstehe nur Bahnhof. :D


    Wir haben jetzt 26 string Variablen deklariert mit dem jeweiligen Möglichkeiten (Zehner 0-4) (Einer 0-9) und Monat 1-12 und den jeweiligen Text zugewiesen.
    Zudem noch 2 Int Variablen für die Eingabe Tag und Monat
    Nun wollen wir in der ersten switch-case Anweisung eben die Zehner stelle analysieren, damit er die Zehnerstelle auswerten kann und dementsprechend den Text verwendet.

  • lachnicht
    26 string variablen? schlecht!
    du brauchst 3 array varriablen in die du die strings schreibst..
    eine 1 dimensionale array ist mehr oder weniger eine liste.. d.h. alles steht untereinander.


    Beispiel:

    Code
    1. String[] tenTexts = {"bla0", "bla1", "bla2"};


    bedeutet ausgeschrieben nix anderes wie:

    Code
    1. tenTexts[0] = "bla0";
    2. tenTexts[1] = "bla1";
    3. tenTexts[2] = "bla2";


    In den eckigen klammern steht welches element du aus der array ansprechen möchtest. Dort muss aber keine zahl stehn sondern kann auch eine int variable stehn die eben die zahl enthält welches element angesprochen werden soll. dabei musst du aber immer darauf achten das wenn dies aufgerufen wird die zahl in der variable niemals größer ist als die array groß.


    Beispiel:

    Code
    1. int intvariable = 1;
    2. System.out.print(tenText[intvariable]);


    ist nichts anderes wie:

    Code
    1. System.out.print(tenText[1]);


    Xaw und ich haben dir ja gezeigt wie du die Zehner und Einerstelle trennst. Diese getrennten Variablen setzt du jetzt in die eckigen Klammern und voila, das passende Element aus der Array wird ausgewählt. :)


    Xaw.4

  • Ohne jetzt alles gelesen zu haben, kann man natürlich auch die Ganzzahldivision verwenden. So eine Lösung mit dem subtrahieren des Rests hab ich noch nie gesehen und würd ich auch ned verwenden. Dafür gibts in fast jeder Programmiersprache eine Math Klasse (zum runden, abschneiden usw...)


    Gesendet von meinem GT-I9100 mit Tapatalk 2

  • lachnicht
    ich hab noch vergessen das du von der "einer tag" und der monats variable immer noch 1 abziehn musst, da die array ja bei 0 beginnt aber du ja frühstens am 1 ten geburtstag haben kannst. bei der "zehner tag" variable ist dies nicht nötig, da dort ja eine 0 stehn kann ;)



    dongdong
    muss ja keiner so machen ;)
    es is meine lösung und ein vorschlag (den ich auch begründet hab), dafür allerdings gleich so "angeschnauzt" zu werden gehört nicht zum feinen umgangston. das geht auch anders wie du (dongdong) beweist.

  • Um ehrlich zu sein finde ich beide Lösungen eher schlecht als Recht, allerdings nehme ich ein paar Dinge an über die Eingabe des Datums. Also hier erstmal die Basis für meine Lösung:



    • Der Nutzer gibt das Datum als String in die Konsole oder so ein
    • Das Datum ist immer dd.m und niemals d.m also 01.5 bei Tagen < 10
    • Es werden nur Zahlen eingegeben also nicht bspw. aa.b
    • Eingabe ist die Eingabe als String!


    Code
    1. int ten = Integer.parseInt(eingabe.substring(0,1));
    2. int digit = Interger.parseInt(eingabe.substring(1,2));
    3. int month = Integer.parseInt(eingabe.substring(3));



    Damit hast du die jeweiligen Ziffern als Integer und kannst die dann wie schon gesagt wurde als Index für Arrays nutzen. Ich bin mir jetzt nicht sicher welche Lösung die effektivste ist, aber ich denke solange es keine Zeitkritische Anwendung ist, macht der Unterschied nicht viel aus.

  • Also die anderen beiden Lösungen sind definitiv besser als die von Ennosuke. Operationen auf primitiven Datentypen (int, short, byte, usw.) sind immer schneller als eine Umwandlung von String zu integer.


    Aber mal ganz ehrlich wir streiten uns gerade darum, welcher Code sauberer ist, um eine Zahl umzuformen?! Kann natürlich auch mal wichtig sein, aber in diesem Fall und vor allem für einen Anfänger ist das erstmal egal. Viel wichtiger ist, dass die Struktur des Programms sauber ist und den Regeln der OOP entspricht!

  • Habe die Aufgabe mal nachgebaut (so wie ich sie jetzt verstanden habe)
    Leider in C# da ich gerade kein Java zur Verfügung hatte.


    Die Arrays passen sind nicht richtig befüllt, hatte ich kb zu :D
    Link zum Pastbin


    Bin selber nicht so der Held, aber so sollte es richtig sein ^-^

  • Nochmal kurz zusammengefasst wenn du es mit 2 Eingaben machen willst:


    1. String einlesen
    2. String zu int konvertieren
    3. Prüfen ob die Zahl größer als 31 ist -> kein gültiger Kalendertag-> Fehler
    4. Prüfen ob die Zahl kleiner als 1 ist -> kein gültiger Kalendertag-> Fehler
    5. Prüfen ob die Zahl kleiner als 10 ist -> keiner Zehnerstelle -> keine zusätzliche Rechnung nötig
    5a. Zahl größer als 10 -> Zahl durch 10 teilen um Zehnerstelle zu bekommen
    5b. Zahl modulo 10 um Einerstelle zu bekommen
    6. 1-5 nochmal machen für Monat (Grenzen natürlich anpassen) bzw. Monat einfach als Index nehmen, wenn da nicht nach Zehner und einerstelle unterschieden wird

  • Ich hab mir mal die Mühe gemacht die hier geschrieben Lösungen umzusetzen bei Fragen stell sie einfach.
    Hier der Paste



    Vorweg ich habe das mit deiner Idee zur Eingabe nicht gesehen und muss direkt sagen, dass es für den Nutzer am Ende total umständlich ist und unsere aller Lösungen somit total überflüssig ^^


    P.S. Mal als Frage wie lange Programmierst du schon bzw. wie lernst du es?

  • ennosuke, deine lösung erscheint mir etwas "over-Engineered".
    lachnicht macht warscheinlich noch micht länger als 3 Monate Programmieren mit Java ( er kennt noch weder modulo, noch arrays).
    OOP wäre da noch ein schritt zu viel...

  • Sorry aber OOP ist in Java Pflicht, wenn man sich nicht damit auseinander setzen will dann sollte man eine andere Sprache lernen.
    Meine Lösung ist auch eigentlich nur als Art eine Referenz gedacht, damit er sieht wie man es machen Kann, natürlich sollte er es nochmal selber machen in seinem Stil.


    Ich habe ja nicht ohne Grund gefragt wie weit er ist, weil mich gerade das mit dem Modulo sehr stutzig gemacht hat, ist es doch eine Recht simple Operation die einfach auch relativ wichtig ist.

  • natürlich ist OOP in java Pflicht - man kann ja auch keine main methode schreiben, ohne sie in eine Klasse zu packen.
    aber mit den Konzepten der OOP rumzuspielen, bevor man weiß was eine for-schleife ist, ist meiner Meinung nach nicht gerade Zielführend.