Frage zu Anfänger Java Übungsaufgabe (Arrays)

11/28/2016 18:02 sonti#1
Hi, hab hier ne Übung zu arrays und mir fehlt leider grade der Ansatz wie ich das anstellen soll... Haben gerade erst mit Arrays angefangen, bitte Rücksicht für mein Unwissen :bandit:

[Only registered and activated users can see links. Click Here To Register...]

Was Arrays sind konnte ich mithilfe des Skripts zwar nachvollziehen, einen Ansatz für die Aufgabe finde ich leider gerade trotzdem nicht. Kann jemand weiterhelfen oder zumindest ein paar Hinweise geben?

Danke im Vorraus.

(Nein das sind keine Hausaufgaben, ich würde nur gerne vor nächster Woche wissen wie ich das löse.)
11/28/2016 18:11 #FaiL'#2
Da Java nicht so... mein Gebiet ist, hab ichs mal gegoogelt und tada eine (hoffentlich) brauchbare Lösung gefunden.

[Only registered and activated users can see links. Click Here To Register...]

Wichtig: Google ist dein bester Freund :D

#FaiL'
11/29/2016 00:18 Moneypulation#3
Der Ansatz ist durch int[] arr gegeben. Zuerst würde ich schauen, ob das Jahr ein Schaltjahr ist. Wenn ja, arr[1] einfach um 1 erhöhen, da der Februar dann einen Tag mehr hat. Dann in einer for-Schleife die Tage der Monate die bereits um sind alle aufsummieren (z.B. wenn du den 29. November 2016 berechnen sollst, alles von Januar bis Oktober aufsummieren). Zuletzt noch die Tage addieren, die du als Parameter bekommen hast
11/29/2016 00:23 Sycrog#4
Theoretisch könntest du nach der Schaltjahr-Überprüfung auch ermitteln, anhand einer if-Abfrage, von welcher Richtung aus, also Jahresanfang oder Jahresende, man effizienter rechnet. Im Beispiel von Moneypulation wäre die Berechnung auf Basis des Jahresende effizienter.
11/29/2016 14:00 sonti#5
Quote:
Originally Posted by Moneypulation View Post
Dann in einer for-Schleife die Tage der Monate die bereits um sind alle aufsummieren (z.B. wenn du den 29. November 2016 berechnen sollst, alles von Januar bis Oktober aufsummieren)
Sonst ist eigentlich alles klar, wie for-Schleifen funktionieren verstehe ich in der Theorie auch, aber irgendwie scheiterts hier... Kannst du vll mit der konkreten Zeile aushelfen? Wie summiere ich alle Werte von den Arrays [0] bis [eingegebener monat-1] auf? (Es geht mir wirklich nicht drum das von euch lösen zu lassen, aber dann hätte ich ein Beispiel und kanns mir für die anderen Aufgaben selbst erklären)

Danke für die Antworten!
11/29/2016 14:09 Sycrog#6
Also dein Array beinhaltet ja die Tage der Monate 1 - 12. Da Arrays bei 0 anfangen, hast du die Indizes 0 - 11.

Nehmen wir an, wir haben Monat Mai, also den 5. Monat eines Jahres. Dann musst du bis zum Monat 4 zählen, da du bis dahin jeweils komplette Monate hast.
Um dir nun die Gesamttage zu merken, benötigst du eine Variable außerhalb der for-Schleife, die wir mit der Anzahl der Tagen des laufenden Monats Mai initialisieren.

Code:
short daysTotal = dateDays;

// dateMonth (= 5) - 2 = 3 -> 4 (volle) Monate
for(byte month = 0; month <= (dateMonth - 2); month++) {
    daysTotal += arr[month];
}
Du musst aufgrund der Verschiebung, also dass Arrays bei 0, Monate aber bei 1 (= Januar) beginnen, dann jeweils 1 abziehen.

edit:
Du kannst bei der For-Schleife, wie ich zuvor schrieb, ermitteln, von welcher Seite du weniger Schleifendurchläufe benötigst (was aber in dem Fall Mikrooptimierung wäre). In dem Fall würdest du mit month = 11 anfangen und dekrementieren (month--), solange month >= ist.
11/29/2016 14:22 sonti#7
Quote:
Originally Posted by Sycrog View Post
Also dein Array beinhaltet ja die Tage der Monate 1 - 12. Da Arrays bei 0 anfangen, hast du die Indizes 0 - 11.

Nehmen wir an, wir haben Monat Mai, also den 5. Monat eines Jahres. Dann musst du bis zum Monat 4 zählen, da du bis dahin jeweils komplette Monate hast.
Um dir nun die Gesamttage zu merken, benötigst du eine Variable außerhalb der for-Schleife, die wir mit der Anzahl der Tagen des laufenden Monats Mai initialisieren.

Code:
int daysTotal = dateDays;

// dateMonth (= 5) - 2 = 3 -> 4 (volle) Monate
for(int month = 0; month <= (dateMonth - 2); month++) {
    daysTotal += arr[month];
}
Du musst aufgrund der Verschiebung, also dass Arrays bei 0, Monate aber bei 1 (= Januar) beginnen, dann jeweils 1 abziehen.

edit:
Du kannst bei der For-Schleife, wie ich zuvor schrieb, ermitteln, von welcher Seite du weniger Schleifendurchläufe benötigst (was aber in dem Fall Mikrooptimierung wäre). In dem Fall würdest du mit month = 11 anfangen und dekrementieren (month--), solange month >= ist.
Müsste es nicht (dateMonth - 1) sein?

Falls ja, hab ichs verstanden und das ganze zum laufen gebracht. Spuckt auch die richtige Tageszahl aus. Danke für die ausführliche Hilfe! Den edit mit der Optimierung ist auch verständlich, werd das gleich noch ausprobieren.
11/29/2016 14:28 Sycrog#8
Im Beispiel haben wir Monat Mai (5). Das heißt, wir ,,schleifen" bis zum Monat April (4), also einen Monat weniger, als dateMonth angibt. Nun fangen Arrays ja bei 0 und nicht bei 1 an, daher müssen wir deswegen nochmal 1 abziehen. Das ergibt in Summe 2 (dateMonth - 2).

Was mir gerade noch einfällt (passend zum Thema Mikrooptimierung):
a) für daysTotal den Datentyp short (16 bit) nehmen
b) für die Schleifenvariable month den Datentyp byte (8 bit) nehmen

[Only registered and activated users can see links. Click Here To Register...]
ich ergänze das oben mal. :D