# verzweigungen und schleifen



## Synethic (19. Okt 2010)

Hallo ich hab heute schonmal eine Spitzen antwort von euch bekommen und deswegen frag ich euch nochmal um eure Hilfe da ich total anstehe!

Ich habe folgende aufgabe zu lösen: 

"Erstellen Sie ein Programm, das mit dem gegebenen letzten Tag des Vorjahres alle Sonntage ausgiebt, die auf den ersten Tag eines Monates fallen. Verwenden Sie Zahlen von 1 (Montag) bis 7 (Sonntag) für die Tage und 1 (Januar) bis 12 (Dezember) für die Monate"

Habt ihr eine Idee wie ich das realisieren könnte! Ich bin echt überfordert!


DANKE im vorraus!


----------



## timbeau (19. Okt 2010)

Grob gedacht über den Java Calender schauen zu welchem Jahr dein Tag gehört und mittels des Calenders die 12 1. Tage der Monate prüfen. 

Java Date und Calendar


----------



## ARadauer (19. Okt 2010)

Du warst mit dem simplen vergleichen von zwei Zahlen schon überfordert! Willst du nicht mal einen Blick in deine Lehrbuch oder deine Unterlagen werfen und dir das selber beibringen?
Bei deinem Vorgehen wird das ein langes Semester für dich!


----------



## Synethic (19. Okt 2010)

ich hab leider keine Unterlagen hab nur 4 Aufgaben bekommen und die probieren zu lösen! wenn ich es schaffe muss mir ein freund von mir am wochenende ein Bier zahlen (war ne wette von uns) etwas. ^^ ich selbst bin kfz-mechaniker!

trotzdem danke!


----------



## ARadauer (19. Okt 2010)

mhn ein Bier... schlecht... wären es zwei, hättest du eins mir bezahlt und die aufgaben dafür bekommen ;-)



> "Erstellen Sie ein Programm, das mit dem gegebenen letzten Tag des Vorjahres alle Sonntage ausgiebt, die auf den ersten Tag eines Monates fallen. Verwenden Sie Zahlen von 1 (Montag) bis 7 (Sonntag) für die Tage und 1 (Januar) bis 12 (Dezember) für die Monate"


Calendar wirst du wahrscheinlich nicht benutzen dürfenm oder? Weißt du, welcher Wochentag ger gegebene Tag ist?


----------



## Haave (19. Okt 2010)

Und der genaue Wortlaut der Wette ist "Bis zum Wochenende die User eines Java-Forums dazu bringen, die Aufgaben für dich zu schreiben"? :autsch:

Ich würd mich ja nicht trauen, mit was zu wetten, was ich nicht kann…


----------



## Synethic (19. Okt 2010)

Nein darf ich nicht verwenden! 
Es ist nicht mehr gegeben als ich angegeben hab!


----------



## Synethic (19. Okt 2010)

Naja wenn ich sie nicht gewinne ist's auch nicht so schlimm war ja nur so eine scherz wette sozusagen!


----------



## Purgator (19. Okt 2010)

Aloha,
also du hast den Beginn-Wochentag ja gegeben (letzter Tag des Vorjahres).
Wenn du es hässlich (aber vllt. einfach zu verstehen als Anfänger) machen willst gehst du manuell vor:
Du willst zuerst schauen ob der 1. Januar ein Sonntag war. Dazu testest du einfach ob der Tag, nach dem letzten Tag des vorjahres ein Montag war.
Wenn ja, gib das Datum aus.
Danach gehe 31 Tage weiter und teste ob das ein Sonntag war... etc. einfach alle Monate durchgehen.

Um mehrere Tage weiter zu gehen und trotzdem im Wochenzyklus zu bleiben kannst du den Modulo Operator nutzen. Der gibt dir den Rest von einer ganzzahligen Division aus.
So ist z.B. 8 mod 7 = 1.
Angenommen du hättest die Darstellung
Montag = 0
Dienstag = 1
...
Sonntag = 6
Kannst du einfach mit Modulo 7 rechnen.
Wäre z.B. der 1. Januar ein Freitag, und würdest wissen wollen ob der 1. Februar ein Sonntag ist, so könntest du wie folgt rechnen:
(4+31) mod 7 = 0
d.h. der erste Februar ist ein Montag.
Die Aufgabenstellung verstehe ich nicht ganz - vorallem weil da vorgegeben wurde das da mit 1 beim zählen begonnen wird. Entweder du gibst bei der Ausgabe einfach immer (+1) an, oder du rechnest das intern um, um trotzdem den Modulo Operator zu Nutzen.

Hoffe ich habe es halbwegs verständlich gehalten und nicht selber etwas falsch verstanden.


----------



## Synethic (19. Okt 2010)

eine frage hätte ich noch kenn wer von euch ein Programm zum erstellen von Struktogrammen?


----------



## MiDniGG (19. Okt 2010)

Muhahaha. Eine Wette also... :-D


----------



## timbeau (19. Okt 2010)

So, noch nie mit Datum gearbeitet aber so funktionierts in meiner Lösung:


```
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class JavaCalenderFirstDays {

    public static void main(String[] args) {
        System.out.println("Geben Sie bitte das Jahr ein: ");
        Scanner scanner = new Scanner(System.in);
        int jahr = scanner.nextInt();
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.YEAR, jahr);
        DateFormatSymbols dfs = new DateFormatSymbols();
        DateFormat df = DateFormat.getDateInstance(DateFormat.YEAR_FIELD  );
        String[] dayOfWeek = dfs.getWeekdays();
        for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {

            for (int tag = cal.getActualMinimum(Calendar.DAY_OF_MONTH); tag <= cal
                    .getActualMaximum(Calendar.DAY_OF_MONTH); tag++) {
                cal.set(Calendar.MONTH, month);
                cal.set(Calendar.DAY_OF_MONTH, tag);
                if(tag == cal.getActualMinimum(Calendar.DAY_OF_MONTH) && dayOfWeek[cal.get(Calendar.DAY_OF_WEEK)].equals("Sonntag")){
                    System.out.print((dayOfWeek[cal.get(Calendar.DAY_OF_WEEK)]) + " ");
                    System.out.println(df.format(cal.getTime()));
                }
                


            }
        }

    }

}
```


----------



## nrg (19. Okt 2010)

@timbeau: ich glaube es soll eher eine ganz primitive (und damit meine ich die Datentypen ) bzw. mathematische Lösung werden

@to: bedenke auch schaltjahre (für den Fall, dass das Jahr mit angeben wird. wenn nicht, bleibt eh die Frage offen, wie man den Februrar handhaben soll..)


----------



## Synethic (19. Okt 2010)

Es sollte eig. ohne Kalender sein da es ja um Schleifen und so geht! Steht so in der Übung!
Das mit dem Mathematischen Weg ist schon gut nur weiß ich leider nicht wie ich es umsetzten soll!


----------



## timbeau (19. Okt 2010)

@nrg: Hab nicht mehr reingeguckt, daher hab ich das nicht beachtet. 

Letzendlich aber unmöglich ohne Kalender wenn man auch Jahre betrachtet in der Zeit in der alle möglichen Änderungen durchgeführt wurden. Tage weglassen, Monate etc.


----------



## Sonecc (19. Okt 2010)

Sehr umfrangreich mit UML und Co für ne Scherz-Wette


----------



## Michael... (19. Okt 2010)

Für eine Scherzwette könnte die Antwort ja wie folgt aussehen:

```
import java.util.Scanner;

public class SundayOnFirst {
	public static void main(String[] s) {
		int[] days = {1, 2, 2, 1, 2, 1, 2, 2, 1, 3, 1, 1, 3};
		System.out.println("Geben Sie bitte das Jahr ein: ");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        if (year<2000 || year>2012)
        	System.out.println("Die Bestimmung erfolgt nur für Jahre zwischen 2000 und 2012!");
        else
        	System.out.println("Im Jahr " + year + " fiel(en) " + days[year-2000] + " Sonntag(e) auf den ersten eines Monats!");
	}
}
```
Mit genügend Fleiss, könnte man das auf die gesamte menliche Zeitreichnung ausweiten ;-)


----------



## Purgator (20. Okt 2010)

Ich glaube ja garnicht das man Schaltjahre berücksichtigen soll.
So wie ich die Aufgabenstellung verstanden hätte, bekommt man nur einen Tag und kein Jahr als Eingabe geliefert, d.h. egal mit welchen Mitteln man arbeitet, es ist unmöglich Schaltjahre zu berücksichtigen.
Da das Thema Verzweigungen und Schleifen heißt wird es wohl auf so etwas hinauslaufen (halber Pseudocode):

```
Eingabe: int start //letzter Tag des Vorjahres, von 0-6 (Montag - Sonntag)
//Array welches die Monatslaengen beinhaltet, zuerst 1 Tag, weil es nur ein Tag vom letzten des jahres bis zum ersten des nächsten ist
int[] monatslaenge = {1, 31, 28, 31,..., 30};
int tag = start;
//Monate überprüfen
for(int i=0; i<monatslaenge;i++) {
  tag = (tag + monatslaenge[i]) % 7;
  //prüfen ob der 1. ein Sonntag ist - wenn ja Ausgabe
  if(tag == 6) {
     syso("1."+(i+1)+". ist ein Sonntag");
  }
}
```
Ich habe wieder nicht berücksichtigt, dass ein "Zahlensystem" benutzt werden soll, wo bei 1. angefangen wird zu zählen. Wenn das unbedingt erforderlich ist müssen natürlich anpassungen vorgenommen werden.
Ansonsten habe ich das nicht getestet, müsste aber denke ich grob funktionieren.


----------



## timbeau (20. Okt 2010)

> das mit dem gegebenen letzten Tag des Vorjahres



Ist wirklich nicht ganz eindeutig. Dachte man bekommt einen Tag geliefert und dieser ist der letzte Tag des zu "scannenden" Jahres. Müll-Aufgabe


----------



## hLsyAsd78A (21. Okt 2010)

Ich glaub ich hab das mal in einem Übungsbuch machen wüssen wie ich Programmieren gelernt habe...
Es geht glaub ich nur um ein Jahr (z.B. 2009) und das ohne eingabefelder! Aber ich weiß nicht mehr wie ich da angefangen habe!


----------



## nrg (21. Okt 2010)

timbeau hat gesagt.:


> @nrg: Hab nicht mehr reingeguckt, daher hab ich das nicht beachtet.
> 
> Letzendlich aber unmöglich ohne Kalender wenn man auch Jahre betrachtet in der Zeit in der alle möglichen Änderungen durchgeführt wurden. Tage weglassen, Monate etc.



was ist daran unmöglich ???:L

das ist ein boolean mit 3 Modulos und du weisst, ob es ein Schaltjahr ist oder nicht...

edit: vorausgesetzt man hat natürlich das Jahr . das ging ja aus der Aufgabenstellen (hatte ich ja im Vorpost schon geschrieben) nicht unbedingt hervor


----------



## mariusbopp (21. Okt 2010)

Purgator hat gesagt.:


> Ich glaube ja garnicht das man Schaltjahre berücksichtigen soll.
> So wie ich die Aufgabenstellung verstanden hätte, bekommt man nur einen Tag und kein Jahr als Eingabe geliefert, d.h. egal mit welchen Mitteln man arbeitet, es ist unmöglich Schaltjahre zu berücksichtigen.
> Da das Thema Verzweigungen und Schleifen heißt wird es wohl auf so etwas hinauslaufen



ja aber wie willst du es dann rechnen du musst doch wissen wieviel tage im monat sind oder irre ich mich??
das ganze vill mit einer "_*switch*_" anweisung oder is das wieder zu umständlich??
und schaltjahre könnte man vereinfacht z.b so rechnen das alle jahre die durch 4 teilbar sind schaltjahre sind! wobei dann jahre wie 1700 und 1800 oder 2000(was ein schaltjahr war) nicht als solche erkannt werden also müsste man dann die jahre durch 400 teile und wenn diese ohne rest bleiben = schalt jahr:rtfm:

naja soviel dazu... obs weiter hilft???:L#

das thema ist ja schleifen verzweigung...aber es hat noch niemand wirklich was dazu gesagt sondern nur auf die aufgabe bezogen....
also:
bsp. für eine while schleife:

```
int zaehler = 0;
while(zaehler<10){
System.out.println(zaehler);
zaehler++;
}
```
verzweigungen via if anweisungen...

```
if (x>=0)
a=x;
else
a=-x;
```

ich hoffe das passt hier rein!!!

lg


----------



## nrg (21. Okt 2010)

mariusbopp hat gesagt.:


> und schaltjahre könnte man vereinfacht z.b so rechnen das alle jahre die durch 4 teilbar sind schaltjahre sind! wobei dann jahre wie 1700 und 1800 oder 2000(was ein schaltjahr war) nicht als solche erkannt werden also müsste man dann die jahre durch 400 teile und wenn diese ohne rest bleiben = schalt jahr:rtfm:



naja nicht ganz. ist ein Jahr durch 400 teilbar, ist es immer ein Schaltjahr. ist ein Jahr durch 4 *aber nicht durch 100 teilbar* ist es ebenfalls eins. alle anderen Fälle -> kein Schaltjahr


----------



## java2978 (8. Nov 2010)

Ich weiß von wo die Übung stammt: "Programmierung - Grundlagen, Neubearbeitung 2009, der Verlag heißst HERDT" ich hab das Buch selbst finde aber leider die Lösungen nicht mehr! Hat keiner von euch die Lösungen für das Buch?


----------



## Synethic (8. Nov 2010)

was haltet ihr davon?

```
class sonntag {

  public static void main(String[] args)
  {
    
    int letzterTag = 3; 
    int tag = 1; 
    int monat = 1;  
    int monatstage = 1;
    int schaltjahr = 0; 
    
    System.out.println("Monate, beginnend mit einem Sonntag:");
    
    for (monat = 1; monat <= 12; monat++) 
    {
      switch(monat) 
      {
        case 2: monatstage = 28+schaltjahr; break;
        case 4: case 6: case 9: case 11: monatstage = 30; break;
        default: monatstage = 31;
      }
      for (tag = 1; tag <= monatstage; tag++) 
      {
        letzterTag = letzterTag%7 +1;
        if (tag == 1 && letzterTag == 7) 
        System.out.println("Sonntag der " + tag + ". " + monat + ".");
      }
    }
  }
}
```


----------

