# einfachen kalender Programmieren HA!



## lilalas (4. Dez 2010)

hallihallo! ich habe eine hausaufgabe auf und hänge irgendwie fest...
hier die aufgabenstellung: 

Ihre Aufgabe ist es, eine Anwendung Kalender zu schreiben, die
zuerst einen Monat und ein Jahr einliest und den Kalender des Monats wie folgt ausgibt:

javac Kalender.java
java Kalender
Bitte geben Sie den Monat ein: 12
Bitte geben Sie das Jahr ein: 2010

Dezember 2010
Mo Di Mi Do Fr Sa So
01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Im zweiten Schritt soll ein Jahr eingegeben und ein Jahreskalender ausgegeben werden:
Bitte geben Sie das Jahr ein: 2011

Januar 2011
Mo Di Mi Do Fr Sa So
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

....

Dezember 2011
Mo Di Mi Do Fr Sa So
01 02 03 04
05 06 07 08 09 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

bin in programmieren leider noch ein absoluter anfänger, daher habe ich echt schwierigkeiten bei dieser aufgabe...wäre echt toll wenn ihr mir helfen könntet!! lg laune :bahnhof:


----------



## U2nt (4. Dez 2010)

Poste mal bitte deinen Ansatz



			
				thE_29 hat gesagt.:
			
		

> Wir machen keine Hausaufgaben. Ihr müsst schon eigene Ideen, bzw. Lösungsvorschläge haben.


----------



## lilalas (4. Dez 2010)

also das ist der anfang, habe was aus nem anderen programm von mir kopiert und wollte das dort einbinden, mit der gaußschen wochentagsberechnung...also damit rechnet er halt immer aus welcher wochentag der 1. eines bestimmten monats ist... guck mal bei switch(w)-anweisung bei case 3. so wollte ich das eigentlich machen, nur das ist viel zu billig, einfach nur die out.prints verrücken und so...würde das gerne irgendwie mit nem array machen, nur weiß leider nicht wirklich wie das funktioniert.... daher würde ich mich sehr über hilfe freuen ! 


```
import java.util.Scanner;
public class Kalender {
  public static void main (String [] args) {
  
  
    String Mon = "falscher Eingabewert" , 
           Tag = "falscher Eingabewert" ; 
    int max = 31 ,
	    
	
  Scanner sc = new Scanner(System.in); 
  System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
  System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
	int y = jahr % 100 ,
	    c = jahr / 100 ;
		
	switch (m)	  { 
		case 1: 
		 m = 11 ;
	      Mon = "Januar";  
		  max = 31; 
		  break;
        case 2: 
		  m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0) 
 		  max = 29;
		  else
          max = 28;
          break;
        case 3: 
		  m = 1 ;
          Mon = "Maerz";
          max = 31;
		  break;
        case 4:
  		  m = 2 ;
          Mon = "April";
	      max = 30;
          break;
        case 5: 
		  m = 3 ;
          Mon = "Mai";
          max = 31;
		  break;
        case 6: 
		  m = 4 ;
          Mon = "Juni";
	      max = 30;
		  break;
        case 7: 
		  m = 5 ;
          Mon = "Juli";
	      max = 31;
		  break;
        case 8: 
		  m = 6 ;
          Mon = "August";
	      max = 31;
		  break;
        case 9: 
		  m = 7 ;
          Mon = "September";
	      max = 30;
		  break;
        case 10: 
		  m = 8 ;
          Mon = "Oktober";
		  max = 31;
		  break;
        case 11: 
		  m = 9 ;
          Mon = "November";
		  max = 30;
		  break;
        case 12: 
		  m = 10 ;
          Mon = "Dezember";
		  max = 31;
		  break;
      }
	  
      if (m == 11 || m == 12)  
        y = y-1 ;
	  if (y < 0)  
		y = 99;
      if (jahr >= 1600 && jahr % 400 ==0) 
        c = c-1 ;
   int w = (((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c)%7)+7)%7 ;
      switch (w) {  
        case 0: 
		  w = 0 ;
          Tag = "Sonntag";
		 
          break;
        case 1: 
		  w = 1 ;
          Tag = "Montag";
		  
          break;
        case 2: 
		  w = 2 ;
          Tag = "Dienstag";
		  
          break;
        case 3: 
		  w = 3 ;
          Tag = "Mittwoch";
		  System.out.println("     ");
		  System.out.println("     "+Mon+" "+jahr);
		  System.out.println("     ");
		  System.out.println("Mo "+"Di "+"Mi "+"Do "+"Fr "+"Sa "+"So ");
		  
		  
		  System.out.println("      "+"1  "+"2  "+"3  "+"4  "+"5  ");
		  System.out.println("6  "+"7  "+"8  "+"9  "+"10 "+"11 "+"12");
		  System.out.println("13 "+"14 "+"15 "+"16 "+"17 "+"18 "+"19");
		  System.out.println("20 "+"21 "+"22 "+"23 "+"24 "+"25 "+"26");
		  for (m== 11 || m==1 || m==3 || m==5 || m==6 || m==10 || m==8){
		  System.out.println("27 "+"28 "+"29 "+"30 "+"31");
		  }
		  for (m==2 || m==4|| m==7 || m==9) {
		  System.out.println("27 "+"28 "+"29 "+"30 ");
		  }
		  for (m==12){
		    if (jahr % 4 == 0)
			System.out.println("27 "+"28 "+"29 ");
			else
			System.out.println("27 "+"28 ");
			}
		  break;
        case 4: 
		  w = 4 ;
          Tag = "Donnerstag";
		 
          break;
        case 5: 
		  w = 5 ;
          Tag = "Freitag";
		  
          break;
        case 6: 
		  w = 6 ; 
          Tag = "Samstag";
		  
		  break;	
  	 }

	
	
  }
}
```


----------



## torbo (4. Dez 2010)

hey ich steh vor der gleichen aufgabe.. 
weiss auch nicht so richtig wie ich das ganze angehen soll da ich ebenfalls anfänger bin.
ich lass nach abfrage des monats/jahres immer den 1. wochentag dieses monats via gauß-formel berechnen um zu sehen um welchen wochentag es sich handelt. 
bei der ausgabe des ergebnis weiss ich nun leider nich wie ich das am geschicktesten mache?

z.b. Dezember 2010  spurckt mir die formel dann ja aus dass der 1. ein Mittwoch ist. wie bring ich die ausgabe jetzt auf folgendes format:

Mo Di Mi Do Fr Sa So
         1  2   3  4  5 
6   7   8  9  10 11 12
 usw..

switch anweisung klingt ja schon mal ganz gut, aber wie hat die auszusehen?

bin für jeden tipp dankbar!
gruß


----------



## lilalas (5. Dez 2010)

hat denn niemand einen tipp für mich? weiß nicht wie ich das mit dem 1. jedes monats fortführe...habe das bei switch(w) unter case 3 ja schon einwenig versucht, aber da habe ich nur out.prints verschoben und so, das is eigentlich viel zu billig...gibt doch sicher bessere schönere methoden! würde mich sehr freuen über eine antwort!


----------



## Final_Striker (5. Dez 2010)

lilalas hat gesagt.:


> hat denn niemand einen tipp für mich?



Wahrscheinlich liegt es daran, dass Java eine objektorientierte Sprache ist, wo man Objekte und Methoden hat und nicht alles in die Main-Methode rein quetscht. ;-)


----------



## lilalas (5. Dez 2010)

danke, sehr nützlicher tipp!


----------



## torbo (5. Dez 2010)

ich sitz an der selben aufgabe wie du und bin auchn bissl am verzweifeln ^^
den ersten teil der aufgabe hab ich gelöst. zwar sicherlich nicht optimal. aber immerhin funktionierts.
beim 2. teil wo das ganze jahr ausgegeben werden soll komm ihc nicht weiter.. ich denke man kann das ganze sicherlich mit for-schleifen lösen. aber ich habe keine richtige idee wie das gehen soll.. 
wäre für nen denkanstoß sehr dankbar!


----------



## lilalas (5. Dez 2010)

Jo hab den ersten Teil auch jetzt,aber halt nur so doof mit dem zeilenverrücken,also total hässlich^^ beim 2. Weiß ich auch nicht weiter...werde da morgen in der uni mal Kollegen Fragen! Gehste auch auf die tu BS oder is Zufall dass du das auch grad machen musst ^^


----------



## StupidAttack (5. Dez 2010)

Und ich habe mich immer Angst gehabt, dass ein Informatikstudium schwer ist :/
Sorry für den Spam.


----------



## XHelp (6. Dez 2010)

Diese Aufgabe lässt sich wunderbar mit der Calendar-Klasse lösen. Da kannst du Wochentag abfragen, Daten verschieben etc.


----------



## ARadauer (6. Dez 2010)

StupidAttack hat gesagt.:


> Und ich habe mich immer Angst gehabt, dass ein Informatikstudium schwer ist :/
> Sorry für den Spam.



Kommt aber echt auf die Hochschule bzw das Fach an.


----------



## homer65 (6. Dez 2010)

XHelp hat gesagt.:


> Diese Aufgabe lässt sich wunderbar mit der Calendar-Klasse lösen. Da kannst du Wochentag abfragen, Daten verschieben etc.



Calendar (Java Platform SE 6)


----------



## ARadauer (6. Dez 2010)

torbo hat gesagt.:


> ich denke man kann das ganze sicherlich mit for-schleifen lösen. aber ich habe keine richtige idee wie das gehen soll..
> wäre für nen denkanstoß sehr dankbar!



naja du kapselst dein verhalten in ein methode, der man jahr und monat übergibt... 
bei der jahresausgabe machst du dir eine for schleife von 1 bis 12 und rufst mit der laufvariable die methode auf...



```
System.out.println("      "+"1  "+"2  "+"3  "+"4  "+"5  ");
System.out.println("6  "+"7  "+"8  "+"9  "+"10 "+"11 "+"12");
```
nicht dein ernst oder? Ganz ehrlich willst du was abgeben? Ich würd den Student aus meiner Vorlesung schmeßen ;-) Habt hier schleifen schon durchgnommen?


```
public class Test {
  

   public static void main(String[] args)  {
      printCal(10, 2010);
  }
   
   public static void printCal(int month, int year){
      
      System.out.println("MO DI MI DO FR SA SO");
      
      int days = 31;// ermitteln anhand des monats wie viele tage dieser hat, entweder mathmatisch google hilft sicher oder mit Calendar
      int firstWeekDay = 3; //was ist der erste für ein Wochentag? Irgendwie erechnen oder über Calendar..
      
      
      for(int i = 1; i < firstWeekDay; i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }      
      int weekDay = firstWeekDay;
      
      for(int d = 1; d <= days; d++){ //wir iterieren über die tage         
         if(d < 10)
            System.out.print("0"); //das geht auch sauberer, aber für den anfang tut es
         
         System.out.print(d+" ");//einfach tag ausgeben
         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
            System.out.println("");
         weekDay++;
      }
   }
}
```
das sollte helfen...
days und firstWeekDay müsst ihr halt irgendwie ermitteln. ich weiß aber nicht ob ihr das mit java boardmitteln machen dürft.. wahrscheinlich schon...


----------



## mariusbopp (6. Dez 2010)

z.b. Dezember 2010  spurckt mir die formel dann ja aus dass der 1. ein Mittwoch ist. wie bring ich die ausgabe jetzt auf folgendes format:

Mo Di Mi Do Fr Sa So
 ........1  2   3  4  5 
6   7   8  9  10 11 12
 usw..

[/QUOTE]

also ich würde es in ne for schleife schreiben und dann halt soviele leerzeichen wie tage also in dem fall für mittwoch muss ja mo und die frei sein also gehst du 2 mal durch die schleife....

und mit der formatierung musst du dir halt ma überlegen an welcher stelle ein zeilenumbruch ge,acht werden muss... ich denke mit-> if (wochen tag % 7==0) mach n zeilenumruch... kommst du weiter


----------



## ARadauer (6. Dez 2010)

meinen code gesehen?


----------



## XHelp (6. Dez 2010)

Entweder so, wie es im Beispiel von ARadauer ist, oder folgendes. Wenn 1 dein Monatbeginn ist und es ist ein Mittwoch, dann rechnest du 
	
	
	
	





```
1-2=-1
```
 und fängst an die Schleife zu lassen. Den Wert gibst du nur aus, wenn der 
	
	
	
	





```
i>1
```
 ist.


----------



## mariusbopp (6. Dez 2010)

ARadauer hat gesagt.:


> meinen code gesehen?



nee hab nicht runter gescrollt im code fenster :noe:

sorry


----------



## lilalas (6. Dez 2010)

sooo zunächst danke schonmal für die vielen antworten ! 
zu den beiträgen: 
1. ist das kein informatikstudium. ^^ 
2. nein, ich wollte das nicht so abgeben, deswegen suche ich ja hier nach einer besseren lösung 
und 3. danke für deine Hilfe ARadauer! ich gehe mal davon aus, dass wir diese bordmittel nutzen dürfen, also um den 1. des monats rauszufinden etc. nur wie hätte das auszusehen?
danke für deine hilfe !


----------



## XHelp (6. Dez 2010)

```
Calendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);//monate fangen bei 0 an
cal.set(Calendar.DAY_OF_MONTH,1);
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
//das liefert dir den Wochentag, wobei 0 der Sonntag ist
```


----------



## mariusbopp (6. Dez 2010)

hier mal eine lösung ohne die von java vorgegebene methode:

```
public class AnfangWoche {
    public int wochenanfang(int tag, int monat, int jahr){

          int h=0, k=0;

          if (monat<=2)

          {

                h=monat+12;

                k=jahr-1;

          }
      
          if (monat >2)

          {
                h=monat;

                k=jahr;
          }

          int wochentag= (tag+ 2*h+(3*h+3) /5 +k + k / 4 - k / 100 + k / 400 + 1) % 7; 

          return wochentag;
    }

}
```

gibt dir den 1. des monats als zahl aus so=0 mo=1 usw...


----------



## lilalas (6. Dez 2010)

Soo, ich habe jetzt mal was gebastelt, ohen irgendwelch anderen java bordmittel (außer dem Scanner). habe das noch von einer vorherigen aufgabe (wochentagsberechnung mit gauß-formel)mit dem zeug von Aradauer kombiniert. funktioniert auch alles soweit, nur dass bei monaten, wo der 1. ein samstag oder sonntag ist, das ganze falsch eingerückt wird...muss was mit switch(w) zu tun haben oder das i am anfang = 1 ist... hab schon mehrere sachen ausprobiert, bin aber anscheinend zu doof ???:L  und dann habe ich noch ne frage, was genau das bedeutet: 
	
	
	
	





```
for(int d = 1; d <= days; d++){ //wir iterieren über die tage         
         if(d < 10)
            System.out.print("0"); //das geht auch sauberer, aber für den anfang tut es
```


hier mein bisheriger quelltext...


```
import java.util.Scanner;
public class Kalender {
  public static void main (String [] args) {
  
  
    String Mon = "falscher Eingabewert" , 
           Tag = "falscher Eingabewert" ; 
    int max = 31 ;
	    
	
  Scanner sc = new Scanner(System.in); 
  System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
  System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
	int y = jahr % 100 ,
	    c = jahr / 100 ;
		
	switch (m)	  { 
		case 1: 
		 m = 11 ;
	      Mon = "Januar";  
		  max = 31; 
		  break;
        case 2: 
		  m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0) 
 		  max = 29;
		  else
          max = 28;
          break;
        case 3: 
		  m = 1 ;
          Mon = "Maerz";
          max = 31;
		  break;
        case 4:
  		  m = 2 ;
          Mon = "April";
	      max = 30;
          break;
        case 5: 
		  m = 3 ;
          Mon = "Mai";
          max = 31;
		  break;
        case 6: 
		  m = 4 ;
          Mon = "Juni";
	      max = 30;
		  break;
        case 7: 
		  m = 5 ;
          Mon = "Juli";
	      max = 31;
		  break;
        case 8: 
		  m = 6 ;
          Mon = "August";
	      max = 31;
		  break;
        case 9: 
		  m = 7 ;
          Mon = "September";
	      max = 30;
		  break;
        case 10: 
		  m = 8 ;
          Mon = "Oktober";
		  max = 31;
		  break;
        case 11: 
		  m = 9 ;
          Mon = "November";
		  max = 30;
		  break;
        case 12: 
		  m = 10 ;
          Mon = "Dezember";
		  max = 31;
		  break;
      }
	  
      if (m == 11 || m == 12)  
        y = y-1 ;
	  if (y < 0)  
		y = 99;
      if (jahr >= 1600 && jahr % 400 ==0) 
        c = c-1 ;
   int w =(((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c)%7)+7)%7;
      switch (w) {  
        case 0: 
		  w = 0;
          Tag = "Sonntag";
		 
		  break;
        case 1: 
		  w = 1;
          Tag = "Montag";
		  
          break;
        case 2: 
		  w = 2;
          Tag = "Dienstag";
		  
          break;
        case 3: 
		  w = 3;
          Tag = "Mittwoch";
		  
		break;
        case 4: 
		  w = 4;
          Tag = "Donnerstag";
		 
          break;
        case 5: 
		  w = 5;
          Tag = "Freitag";
		  
          break;
        case 6: 
		  w = 6;
          Tag = "Samstag";
		  
		  break;	
  	 }

	System.out.println("MO DI MI DO FR SA SO");
      
      int days = max;// ermitteln anhand des monats wie viele tage dieser hat, entweder mathmatisch google hilft sicher oder mit Calendar
      int firstWeekDay = w; //was ist der erste für ein Wochentag? Irgendwie erechnen oder über Calendar..
      
      
      for(int i =1;i < firstWeekDay; i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }      
      int weekDay = firstWeekDay;
      
      for(int d = 1; d <= days; d++){ //wir iterieren über die tage         
         if(d < 10)
            System.out.print("0"); //das geht auch sauberer, aber für den anfang tut es
         
         System.out.print(d+" ");//einfach tag ausgeben
         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
            System.out.println("");
         weekDay++;
      }
	System.out.println(w);
  }
}
```


----------



## bone2 (6. Dez 2010)

hm sonntag ist bei dir 0 aber die überschrift fängt mit MO DI MI an

und warum setzt du beim tagesswitch w = 0 wenn w == 0 ist? sinnlos


----------



## lilalas (6. Dez 2010)

Sonntag muss aber 0 sein,weil die Berechnung des 1. Des Monats sonst nicht hinhaut!das ist aus soner Tabelle die wir bekommen haben,womit man die Wochentage ausrechnen kann!und das mit w==0 soll doch kein Vergleich sein,sondern bei Case 0: (Sonntag) wird w der wert 0 zugewiesen,was für die Ausgabe des wochenags wichtig ist!


----------



## bone2 (6. Dez 2010)

```
for(int i =1;i < firstWeekDay; i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }
```

ist der erste ein sonntag, dann ist firstWeekDAy == 0 und damit wird eben nicht eingerückt


----------



## XHelp (6. Dez 2010)

mit sowas wie 
	
	
	
	





```
(firstWeekDay+6)%7
```
 kannst du die Anzahl der Einrückungen bei So=0, Mo=1 berechnen.


----------



## bone2 (6. Dez 2010)

deine schaltjahrberechnung ist auch falsch.

1900 ist kein schaltjahr, 2000 schon

regeln:
muss durch 4 teilbar sein, darf nicht durch 100 teilbar sein aber ist es durch 400 teilbar ist es ein schaltjahr


```
int februar = 1/(month%2*2 + month/2) * (2 - 1/(year%4+1) + 1/(year%100+1) - 1/(year%400+1));
maxday = 30 + month/8 + month%2 - (month/8 * month%2 * 2) - februar;
```
so kann man die maxtage für jeden beliebigen monat ausrechnen


----------



## lilalas (6. Dez 2010)

jo mit dem schaltjahr haste recht, das geht aber auch noch einfacher, ist aber grade auch nicht so relevant ^^ 
bei deiner lösung stimmt das ergebnis jedoch nicht ganz...wenn ich ...+6%7 mache ist die lösung falsch...
bei +7%7 ist das ergebnis für den Samstag als 1. des monats richtig, nur beim Sonntag rückt er das ganze wieder nicht ein...also case 6 funktioniert, case 0 leider noch nicht^^


----------



## lilalas (6. Dez 2010)

so hab ne lösung ^^ dein ansatz funktioniert doch, aber nur wenn man bei i=0 anfängt zu zählen und nicht bei i=1.

```
for(int i = 0;i < (firstWeekDay+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }
```

so funktionierts, danke für deine hilfe !


----------



## bone2 (6. Dez 2010)

lilalas hat gesagt.:


> jo mit dem schaltjahr haste recht, das geht aber auch noch einfacher



ach ja? wie denn bitte? die formel wie man max leichter ausrechnet interessiert mich


```
int schaltjahr = 1/(jahr%4+1) - 1/(jahr%100+1) + 1/(jahr%400+1);
```
 ist der schaltjahr teil, 0 ist keins, 1 ist eins

hab deinen code mal zusammengekürzt und alles sinnlose entfernt

```
import java.util.Scanner;
public class Test {
    public static void main (String [] args) {

        Scanner sc = new Scanner(System.in);
        System.out.print("Bitte geben Sie den Monat ein:");
        int monat = sc.nextInt();
        System.out.print("Bitte geben Sie das Jahr ein:");
        int jahr = sc.nextInt();

        String monatsName = null;

        switch (monat) {
            case 1:
                monatsName = "Januar";
                break;
            case 2:
                monatsName = "Februar";
                break;
            case 3:
                monatsName = "Maerz";
                break;
            case 4:
                monatsName = "April";
                break;
            case 5:
                monatsName = "Mai";
                break;
            case 6:
                monatsName = "Juni";
                break;
            case 7:
                monatsName = "Juli";
                break;
            case 8:
                monatsName = "August";
                break;
            case 9:
                monatsName = "September";
                break;
            case 10:
                monatsName = "Oktober";
                break;
            case 11:
                monatsName = "November";
                break;
            case 12:
                monatsName = "Dezember";
                break;
            default : monatsName = "ungültiger Monat";
        }

        int februar = 1/(monat%2*2 + monat/2) * (2 - 1/(jahr%4+1) + 1/(jahr%100+1) - 1/(jahr%400+1));
        int max = 30 + monat/8 + monat%2 - (monat/8 * monat%2 * 2) - februar;

        monat -= 2;
        if (monat <= 0) {
            monat += 12;
        }

        int jahrzehnt = jahr % 100;
        int jahrhundert = jahr / 100 ;

        if (monat == 11 || monat == 12)
            jahrzehnt = jahrzehnt-1;
        if (jahrzehnt < 0)
            jahrzehnt = 99;
        if (jahr >= 1600 && jahr % 400 == 0)
            jahrhundert = jahrhundert-1;

        int firstWeekDay =(((1+(int)(2.6*monat-0.2)+jahrzehnt+(jahrzehnt/4)+(jahrhundert/4)-2*jahrhundert)%7)+7)%7;

        System.out.println(monatsName + " " + jahr);
        System.out.println("MO DI MI DO FR SA SO");

        for(int i = 0; i < (firstWeekDay+6)%7; i++) { //wir rücken richtig ein, für den ersten
            System.out.print("   ");
        }
        
        int weekDay = firstWeekDay;

        for(int d = 1; d <= max; d++){ //wir iterieren über die tage
            if(d < 10)
                System.out.print("0"); //das geht auch sauberer, aber für den anfang tut es

            System.out.print(d+" ");//einfach tag ausgeben
            if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
                System.out.println();
            weekDay++;
        }
    }
}
```


----------



## lilalas (6. Dez 2010)

hast du das programm mal auf seine richtigkeit überprüft ? also bestimmte daten eingegeben und nachgeschaut ob dies richtig ist? weil eigentlich müsste es falsch sein, da du in der 1. switch anweisung diese umwandlung von m rausgenommen hast....damit diese gaußformel (int w=..) funktioniert, muss die eingabe des monats einwenig abgeändert werden...ich probier dein programm mal aus... danke dir !


----------



## bone2 (6. Dez 2010)

```
monat -= 2;
        if (monat <= 0) {
            monat += 12;
        }
```
die m umwandlung ist jetzt unten drunter


----------



## lilalas (6. Dez 2010)

```
monat -= 2;
        if (monat <= 0) {
            monat += 12;
        }
```
hab den teil eben erst entdeckt, das entspircht doch der umwandlung von m, (oder?^^)
jagut dann wäre deine variante in der tat kürzer und besser, habe halt wie schon gesagt, den ersten aufgabenteil aus einer anderen aufgabe kopiert und da eingefügt...
damit ist der erste teil der aufgabe komplett, im 2. soll ja noch ein jahreskalnder ausgegebn werden. mache ich das dann auch mit ner schleife ?


----------



## bone2 (6. Dez 2010)

ich würde den einzelmonatsteil in eine eigene methode packen. dann in einer zweiten methode die erste mit schleife 12 mal aufrufen


```
public void printEinMonat(int monat, int jahr) {
// hier alles nach dem scanner rein aus deiner alten main
}

public void printEinJahr(int jahr) {
    for (i <= 12) {
        printEinMonat(i,jahr);
    }
}

public static void main() {
    // scanner nutzen und ausgabeart/jahr/monat abfragen

    if (monat) {
        printEinMoant(monat, jahr);
    }
    else {
        printEinJahr(jahr);
    }
}
```


----------



## lilalas (6. Dez 2010)

jo klingt auf jedenfall logisch, würde ich gerne so machen...bisher haben wir jedoch noch nicht groß mit verschiedenen methoden gearbeitet, sondern eigentlich alles in die main gekloppt =( 
kannste das nochmal schnell so zusammenkopieren, wie das am ende auszusehen hat? 
bin dir sehr dankbar für deine bemühungen  :applaus:


----------



## bone2 (6. Dez 2010)

das schaffst du schon^^ so schwer ist es das ja nun auch wieder nicht. wir helfen nur, wir machn keine hausaufgaben 

wenn es probleme gibt, frag, alles nötige steht eigentlich in meinem letzten post


----------



## lilalas (6. Dez 2010)

was ich vergessen habe, kannst du meinen ansatz nehmen ?^^ deiner ist zwar zweifelslos besser, aber wenn ich den abgeben sollte, würde das ziemlich nach zusammenkopiert aussehen^^ in meinem ansatz habe ich ja schon große teile aus meiner 1. hausaufgabe drin, daher sieht das dann besser aus und ich kanns dem HiWi auch besser erklären^^ hier nochmal das was ich bisjetz habe: 

```
import java.util.Scanner;
public class Kalender {
  public static void main (String [] args) {
  
  
    String Mon = "falscher Eingabewert" , 
           Tag = "falscher Eingabewert" ; 
    int max = 31 ;
	    
	
  Scanner sc = new Scanner(System.in); 
  System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
  System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
	int y = jahr % 100 ,
	    c = jahr / 100 ;
		
	switch (m)	  { 
		case 1: 
		 m = 11 ;
	      Mon = "Januar";  
		  max = 31; 
		  break;
        case 2: 
		  m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0) 
 		  max = 29;
		  else
          max = 28;
          break;
        case 3: 
		  m = 1 ;
          Mon = "Maerz";
          max = 31;
		  break;
        case 4:
  		  m = 2 ;
          Mon = "April";
	      max = 30;
          break;
        case 5: 
		  m = 3 ;
          Mon = "Mai";
          max = 31;
		  break;
        case 6: 
		  m = 4 ;
          Mon = "Juni";
	      max = 30;
		  break;
        case 7: 
		  m = 5 ;
          Mon = "Juli";
	      max = 31;
		  break;
        case 8: 
		  m = 6 ;
          Mon = "August";
	      max = 31;
		  break;
        case 9: 
		  m = 7 ;
          Mon = "September";
	      max = 30;
		  break;
        case 10: 
		  m = 8 ;
          Mon = "Oktober";
		  max = 31;
		  break;
        case 11: 
		  m = 9 ;
          Mon = "November";
		  max = 30;
		  break;
        case 12: 
		  m = 10 ;
          Mon = "Dezember";
		  max = 31;
		  break;
      }
	  
      if (m == 11 || m == 12)  
        y = y-1 ;
	  if (y < 0)  
		y = 99;
      if (jahr >= 1600 && jahr % 400 ==0) 
        c = c-1 ;
   int w =(((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c)%7)+7)%7;
   
	System.out.println("");
	System.out.println("     "+Mon+" "+jahr); 
    System.out.println("");
	System.out.println("MO DI MI DO FR SA SO");
      
      
     for(int i = 0;i < (w+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }      
      int weekDay = w;
      
      for(int d = 1; d <= max; d++){ //wir iterieren über die tage         
         if(d < 10)
            System.out.print("0"); 
         
         System.out.print(d+" ");//einfach tag ausgeben
         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
            System.out.println("");
         weekDay++;
      }
  }
}
```


----------



## lilalas (6. Dez 2010)

jo danke dir, das ding ist nur ich weiß an sich gar nicht genau wie das mit den methoden auszusehen hat^^ aber ich werds mal versuchen, danke


----------



## bone2 (6. Dez 2010)

wie  es auszusehen hat, habe ich oben bereits 1:1 gezeigt  nur noch zusammenkopieren


----------



## mariusbopp (6. Dez 2010)

jetzt habe ich auch mal eine frage zum kalender und zwar mach ich grad auch einen  aber hab noch ein problem mim zeilenumbruch am ende der woche... namche monate macht er ihn richtig manche nicht...

ich fange die woche mit so=0 an und höre mit sa=6 auf
umbruch mache ich wie follgt:

```
if (((aw.wochenanfang(tag, jahr, monat)) + i)% 7== 0)
                      System.out.println();
                else
                      System.out.print(" ");
```
stimmt da was nciht oder fehlt da was nicht i ist quasi der tag an dem es er ist da ich das in ner for schleife drinne hab und i++...


----------



## bone2 (6. Dez 2010)

mit was fangen denn die monate an, die nicht gehen?

@lilalas
kleiner fehler meinerseits:
[c]public static void printxxx (){}[/c] damit du sie in der mainmethode aufrufen kannst, das static ist wichtig


----------



## ARadauer (6. Dez 2010)

@mariusbopp : ich empfehl dir {} zu benutzen...


----------



## mariusbopp (6. Dez 2010)

ARadauer hat gesagt.:


> @mariusbopp : ich empfehl dir {} zu benutzen...



aber macht das einen unterschied wenn nur eine anweisung drinne steht??

```
if(blabla){
anweisung1
}
else{
anweisung2
}
```
zu

```
if(blabla)
anweisung1

else
anweisung2
```

edit: also den 1.5.2010 gibt er richtig aus den  1.2.2010 zb nicht mehr da macht er den umbruch einen zu fruh...


----------



## ARadauer (6. Dez 2010)

nein aber ich hab schon genug Anfängern bei solchen einfachen Themen geholfen, dass ich weiß das das ein Stolperstein sein kann... dann kommt aufeinmal eine zweite Anweisung hinzu oder irgendwo noch ein if und dann hat keiner mehr einen Plan warum da jetzt was nicht geht. Saubere Eeinrückung und Klammern helfen da doch sehr.

Es funktioniert auch ohne aber ich hab auch "empfehl" gesagt...


----------



## mariusbopp (6. Dez 2010)

naja mit der sauberkeit is so ne sache^^ wir basteln quasi zu 2 an dem prog rum...

aber ich verstehe einfach nicht wieso ers beim februar macht und beim märz z.b wieder nicht...???:L


----------



## bone2 (6. Dez 2010)

naja ein bischen mehr code vlt


```
for(int d = 1; d <= max; d++){ //wir iterieren über die tage
            if(d < 10)
                System.out.print("0"); //das geht auch sauberer, aber für den anfang tut es

            System.out.print(d);//einfach tag ausgeben

            if ((d+firstWeekDay) % 7 == 0)
                System.out.println();
            else
                System.out.print(" ");
            //weekDay++;
        }
```
funktioniert


----------



## ARadauer (6. Dez 2010)

> aber ich verstehe einfach nicht wieso ers beim februar macht und beim märz z.b wieder nicht...


habt ihr eigentlich keinen debugger? oder dürft ihr sowas wie eclipse nicht verwenden?
da ist ja nix komplizierte daran oder? das sieht man ja nach 40 sekunden debuggen, warum er jetzt genau bei einer stelle etwas anders macht...


----------



## mariusbopp (6. Dez 2010)

ja  so mache ich es auch... nur statt ner null sage ich wenn i<=9 ist dann " "

ich komm einfach nicht dahinter...


----------



## mariusbopp (6. Dez 2010)

ARadauer hat gesagt.:


> habt ihr eigentlich keinen debugger? oder dürft ihr sowas wie eclipse nicht verwenden?
> da ist ja nix komplizierte daran oder? das sieht man ja nach 40 sekunden debuggen, warum er jetzt genau bei einer stelle etwas anders macht...


 doch debuggt hab ich auch schon...an manchen monaten ist die zahl für den umbruch zu groß bzw zu klein aber ich hab noch keine logig gefunden um das zu lösen bzw seh meinen fehler nicht...


----------



## bone2 (6. Dez 2010)

anscheinend ja nicht.
a) debugger
b) mehr code posten
c) fehler genauer beschreiben, als manchmal gehts nicht


----------



## mariusbopp (6. Dez 2010)

bone2 hat gesagt.:


> anscheinend ja nicht.



hast du mal lust über meinen code drüber zu gucken dann schick ich ihn dir gerne mal per mail... oder jemand anderes?


----------



## bone2 (6. Dez 2010)

wovor hast du angst, post ihn doch einfach.

sonst pm


----------



## mariusbopp (6. Dez 2010)

hab es dir mal per pm geschickt !
danke im voraus schonmal :toll:


----------



## lilalas (6. Dez 2010)

aaalso habe mich dazu entschlossen das programm in 2 teile aufzuteilen...der 1. schritt ist jetzt komplett und funktioniert auch...also monat und jahr eingeben und er gibt n monatskalender aus!
im 2. schritt soll nur ein jahr eingegeben werden und dann ein entsprechender jahreskalender ausgegeben werden...wollte das mit ner for schleife machen und m=1 setzen und eifach immer um 1 erhöhen! habe das so gemacht:

```
import java.util.Scanner;
public class Kalender2 {
  public static void main (String [] args) {
  
  
  Scanner sc = new Scanner(System.in); 
  System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
	int y = jahr % 100 ,
	    c = jahr / 100 ,
		max = 31;
	
	
for (int m=1 ; m<=12; m++){

  

    
    String Mon = null;
	 switch (m)	  { 
		case 1: 
		 m = 11 ;
	      Mon = "Januar";  
		  max = 31; 
		  break;
        case 2: 
		  m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0) 
 		  max = 29;
		  else
          max = 28;
          break;
        case 3: 
		  m = 1 ;
          Mon = "Maerz";
          max = 31;
		  break;
        case 4:
  		  m = 2 ;
          Mon = "April";
	      max = 30;
          break;
        case 5: 
		  m = 3 ;
          Mon = "Mai";
          max = 31;
		  break;
        case 6: 
		  m = 4 ;
          Mon = "Juni";
	      max = 30;
		  break;
        case 7: 
		  m = 5 ;
          Mon = "Juli";
	      max = 31;
		  break;
        case 8: 
		  m = 6 ;
          Mon = "August";
	      max = 31;
		  break;
        case 9: 
		  m = 7 ;
          Mon = "September";
	      max = 30;
		  break;
        case 10: 
		  m = 8 ;
          Mon = "Oktober";
		  max = 31;
		  break;
        case 11: 
		  m = 9 ;
          Mon = "November";
		  max = 30;
		  break;
        case 12: 
		  m = 10 ;
          Mon = "Dezember";
		  max = 31;
		  break;
      }
		
    System.out.println("");
	System.out.println("     "+Mon+" "+jahr); 
    System.out.println("");
	System.out.println("MO DI MI DO FR SA SO");
if (m == 11 || m == 12)  
        y = y-1 ;
	  if (y < 0)  
		y = 99;
      if (jahr >= 1600 && jahr % 400 ==0) 
        c = c-1 ;
   int w =(((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c)%7)+7)%7;
  
      
     for(int i = 0;i < (w+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }      
      int weekDay = w;
      
      for(int d = 1; d <= max; d++){      
         if(d < 10)
            System.out.print("0"); 
         
         System.out.print(d+" ");//einfach tag ausgeben
         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
            System.out.println("");
         weekDay++;
      }
	  
}		
  }
}
```
nur so funktioniert das ganze natürlich nicht richtig, weil die monate aufgrund der switch-umwandlung vertauscht werden...auch mit deiner "kurzschreibweise" gehts nicht @bone... (is ja auch das gleiche^^)
weiß jetzt nicht wie ich das in der richtigen Reihengole (januar,februar,...,dezember) ausgeben kann und dass die einzelnen monatskalender natürlich auch noch korrekt sind...freue mich wie immer über eure hilfe


----------



## XHelp (6. Dez 2010)

Lager doch den Code in eine Methode aus, wie es dir bereits gesagt wurde, dann ist das ganze übersichtlicher.


----------



## lilalas (6. Dez 2010)

bone2 hat gesagt.:


> public static void main() {
> // scanner nutzen und ausgabeart/jahr/monat abfragen
> 
> if (monat) {
> ...



was genau habe ich mir unter   // scanner nutzen und ausgabeart/jahr/monat abfragen vorzustellen? tut mir leid, dass diese fragen auf euch vermutlich absolut doof wirken, aber hab halt wirklich keinen plan..^^


----------



## XHelp (6. Dez 2010)

Da musst du einlesen, was der Benutzer haben will: bestimmten Monat+Jahr oder Jahresübersicht.


----------



## lilalas (6. Dez 2010)

muss ich dann die namen der methoden abfragen oder wie mache ich das ? wie hat soetwas auszusehen ?


----------



## ARadauer (6. Dez 2010)

lilalas hat gesagt.:


> muss ich dann die namen der methoden abfragen oder wie mache ich das ? wie hat soetwas auszusehen ?



hat heute schon mal wer gepostet...

http://www.java-forum.org/java-basi...n-kalender-programmieren-ha-2.html#post706589

habr ihr noch nie eine methode geschrieben?

bzw braucht mein ein forum um sich das beizubringen?


----------



## lilalas (6. Dez 2010)

ne hab das bisher noch nicht gemacht, hatte ich auch vorhin schon erwähnt, dass wir bisher alles in die main methode gequetscht haben...und jein man brauch mit sicherheit kein forum um sich das beizubringen, aber wenn man das zum 1. mal macht ist ein wenig hilfe schon nützlich...
ich habs ja ans ich auch verstanden, weiß halt nur nich wie ich das hier abrufe "// scanner nutzen und ausgabeart/jahr/monat abfragen", also fürn befehl ich da eingeben soll....


----------



## bone2 (6. Dez 2010)

```
public void printEinMonat(int monat, int jahr) {
// hier alles aus deiner alten main rein, außer den scanner
}
 
public void printEinJahr(int jahr) {
    for (i <= 12) {
        printEinMonat(i,jahr);
    }
}
 
public static void main() {
    Scanner sc = new Scanner(System.in);
    System.out.println("ein jahr (j) oder einen monat (m) ausgeben?");
    char entscheidung = sc.nextChar();
    System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
    System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
 
    if (entscheidung == 'm') {
        printEinMoant(m, jahr);
    }
    else if (entscheidung == 'j') {
        printEinJahr(jahr);
    }
```


----------



## lilalas (6. Dez 2010)

aaalso, ersteinmal danke für deine bemühungen @bone ! 
habe jetzt hier eigentlich alles gemacht was du meintest...


```
public void printEinMonat(int m, int jahr) {
System.out.print("Bitte geben Sie den Monat ein:");
     m = sc.nextInt();
  System.out.print("Bitte geben Sie das Jahr ein:");
     jahr = sc.nextInt();
	int y = jahr % 100 ,
	    c = jahr / 100 ;
	String Mon = "falscher Eingabewert" , 
           Tag = "falscher Eingabewert" ; 
    int max = 31 ;	
	switch (m)	  { 
		case 1: 
		 m = 11 ;
	      Mon = "Januar";  
		  max = 31; 
		  break;
        case 2: 
		  m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0) 
 		  max = 29;
		  else
          max = 28;
          break;
        case 3: 
		  m = 1 ;
          Mon = "Maerz";
          max = 31;
		  break;
        case 4:
  		  m = 2 ;
          Mon = "April";
	      max = 30;
          break;
        case 5: 
		  m = 3 ;
          Mon = "Mai";
          max = 31;
		  break;
        case 6: 
		  m = 4 ;
          Mon = "Juni";
	      max = 30;
		  break;
        case 7: 
		  m = 5 ;
          Mon = "Juli";
	      max = 31;
		  break;
        case 8: 
		  m = 6 ;
          Mon = "August";
	      max = 31;
		  break;
        case 9: 
		  m = 7 ;
          Mon = "September";
	      max = 30;
		  break;
        case 10: 
		  m = 8 ;
          Mon = "Oktober";
		  max = 31;
		  break;
        case 11: 
		  m = 9 ;
          Mon = "November";
		  max = 30;
		  break;
        case 12: 
		  m = 10 ;
          Mon = "Dezember";
		  max = 31;
		  break;
      }
	  
      if (m == 11 || m == 12)  
        y = y-1 ;
	  if (y < 0)  
		y = 99;
      if (jahr >= 1600 && jahr % 400 ==0) 
        c = c-1 ;
   int w =(((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c)%7)+7)%7;
   
	System.out.println("");
	System.out.println("     "+Mon+" "+jahr); 
    System.out.println("");
	System.out.println("MO DI MI DO FR SA SO");
      
      
     for(int i = 0;i < (w+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
         System.out.print("   ");
      }      
      int weekDay = w;
      
      for(int d = 1; d <= max; d++){ //wir iterieren über die tage         
         if(d < 10)
            System.out.print("0"); 
         
         System.out.print(d+" ");//einfach tag ausgeben
         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
            System.out.println("");
         weekDay++;
      }
}

public void printEinJahr(int jahr) {
    for (i <= 12) {
        printEinMonat(i,jahr);
    }
}

public static void main() {

Scanner sc = new Scanner(System.in);
    System.out.println("ein jahr (j) oder einen monat (m) ausgeben?");
    char entscheidung = sc.nextChar();
    System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
    System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();
 
    if (entscheidung == 'm') {
        printEinMoant(m, jahr);
    }
    else if (entscheidung == 'j') {
        printEinJahr(jahr);
    }
```

gibt aber leider nur endlos fehlermeldungen beim kompilieren...


----------



## XHelp (6. Dez 2010)

Wenn es alles ist, was du hast, dann ist es gänzlich falsch, weil keine Klasse, main-Methode nicht zu etc. Aber das wird dir der Compiler auch selber gezeigt haben.


----------



## ARadauer (6. Dez 2010)

```
public void printEinMonat(int m, int jahr) {
System.out.print("Bitte geben Sie den Monat ein:");
     m = sc.nextInt();
```
Ich würd mal aufhören das einfach alles zu kopieren und mal versuchen das zu versthen, was du da machst!
Beschreib mal die drei Zeilen Code.


----------



## lilalas (6. Dez 2010)

ja gut dass das nich funzen kann is mir klar, weil ich was mitm scanner einlesen will, der dadrüber aber nicht auftaucht...habe halt nur irgendwie versucht die tipps von bone zu befolgen..^^


----------



## XHelp (6. Dez 2010)

bone2 hat gesagt.:


> ```
> public void printEinMonat(int monat, int jahr) {
> // hier alles aus deiner alten main rein, außer den scanner
> }
> ```





lilalas hat gesagt.:


> habe halt nur irgendwie versucht die tipps von bone zu befolgen..^^



Sicher, dass du die Tipps gelesen hast?


----------



## lilalas (7. Dez 2010)

eigentlich schon ^^ aber wiesagt, absoluter newb =(


----------



## ARadauer (7. Dez 2010)

ok vielleicht fehlt dir das grundverständnis für eine Methode.
Eine Methode ist wie eine Maschine. Du wirfst was rein und sie macht was. Du wirfst hier die Werte int monat, int jahr rein. Also Monat und Jahr und die Maschine soll einfach die Kalender Monats Darstellung anzeigen. Warum willst du da drinnen jetzt das Monat einlesen, wenn du das schon übergeben hast.



> absoluter newb =(


keine ausrede, du beschäftigst dich schon seit samstag mit dem thema..
ich würd mir an deiner stelle einfach mal 2-3 Stunden Zeit nehmen und die ersten 3-4 Kapitel im Java Insel Buch lesen... dan fällt dir das viel einfacher und du sparst dir viel zeit..


----------



## bone2 (7. Dez 2010)

ja, du musst natürlich die class rumwickeln, am ende fehlt glaube ein klammer, wie man ein for schleife schreibt weißt du auch, meine ist pseudocode und dient nur zur veranschaulichung.

das programm soll am ende in der main methode einlesen, das hab ich dir schon gebaut.
dann gibt sie die eingelesenen angaben an die beiden printxx weiter, die arbeiten dann damit. du musst da also logischerweise nicht nochmal einlesen.


----------



## lilalas (7. Dez 2010)

alles klar ihr habt recht. hat keinen sinn hier irgendwas zusammenzukopieren, muss ja schließlich irgendwann auch mal ne klausur schreiben ^^ habe mir das buch hier bestellt Grundkurs Programmieren in Java kennt das jmd von euch ? werde mich da mal mit besdchäftigen, um das ganze auch wirklich zu verstehen ! danke euch aber trotzdem für eure bemühungen ! 
lg lilalas


----------



## Z_E_R_O (10. Dez 2010)

Ich grüße euch

Ich habe ein ähnliches Problem wie das hier beschriebene. Die Aufgabenstellung ist so ziemlich die gleiche. Mein Problem ist momentan, dass ich kein Schimmer hab wie ich meinen Monaten die maximale anzahl an Tagen zuordnen soll. Habe die hier gezeigten Varianten schon versucht aber es ergibt immer Fehler die ich auch nicht beheben kann. Wenn ich sie behebe, tauchen neue fehler auf :/
Vieleicht könnt ihr mir einen Tipp geben. Da ich auch nicht sonderlich viel Erfahrung habe mit Methoden, möchte ich diese erst einmal Aussen vor lassen. 


```
import java.util.Scanner;
public class Kalender6 {
  public static void main(String[] args){
     
    Scanner sc=new Scanner(System.in);

    
    System.out.println("Bitte den Monat eingeben: ");
    int m = sc.nextInt();
    System.out.println("Bitte das Jahr eingeben: ");
    int jahr = sc.nextInt();
       
    int c = (jahr/100);
    int y = jahr%100;
    int w;  
    int d = 1;
    

    if(jahr<=1582 && m<=10){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }
    if(jahr%4==0 && m==2 && jahr%100!=0|| jahr%400==0);

 
  
    if(m<1){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }
    if(m>12){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }

     if(m==1||m==2)
      y=y-1;

    if(y<0)
      y=99;

    if(jahr%400==0 && jahr >1600 && m==1 || m==2)
      c= c-1;
    
    
    
    switch (m){  //Initialisierung der neuen Werte für die Monate
      case 1: m = 11;
       break;
      case 2: m = 12;
       break;
      case 3: m = 1;
       break;
      case 4: m = 2;
       break;
      case 5: m = 3;
       break;
      case 6: m = 4;
       break;
      case 7: m = 5;
       break;
      case 8: m = 6;
       break;
      case 9: m = 7;
       break;
      case 10: m = 8;
       break;
      case 11: m = 9;
       break;
      case 12: m = 10;
       break;
      }
      
//Gaußsche Wochenberechnungsformel

    w = ((1+(int)(2.6*m-0.2)+y+(int)(y/4)+(int)(c/4)-2*c) % 7 +7) % 7;

    
   
    
    String m2 = "";
	
// Zuordnung der Werte für die Monate

    switch (m){  
      case 11: m2 = "Januar";
       break;
      case 12: m2 = "Februar";
       break;
      case 1: m2 = "März";
       break;
      case 2: m2 = "April";
       break;
      case 3: m2 = "Mai";
       break;
      case 4: m2 = "Juni";
       break;
      case 5: m2 = "Juli";
       break;
      case 6: m2 = "August";
       break;
      case 7: m2 = "September";
       break;
      case 8: m2 = "Oktober";
       break;
      case 9: m2 = "November";
       break;
      case 10: m2 = "Dezember";
       break;
      }	

   


    System.out.println("");
    System.out.println("     "+m2+" "+jahr); 
    System.out.println("");
    System.out.println("MO DI MI DO FR SA SO");
      
      
      for(int i = 0;i < (w+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
        System.out.print("   ");
      }
      
      int weekDay = w;
      
      for(d = 1; d <= 31 ; d++){ //wir iterieren über die tage         
         if(d < 10)
         System.out.print("0"); 
         
         System.out.print(d+" ");//einfach tag ausgeben

         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
           System.out.println("");
           weekDay++;
      }
    }
  }
```

Danke im Voraus


----------



## ARadauer (10. Dez 2010)

Als erste würde ich mal die Variablen sinnvoll bennen. was ist m? Monat?


```
switch (m){
      case 1: m = 11;
...
```
versteh ich nicht... warum machst du das?


```
switch (m){  
      case 11: m2 = "Januar";
```
sinnvolle variablen namen!!!!! m2! nö auf keinen Fall ;-)



> Mein Problem ist momentan, dass ich kein Schimmer hab wie ich meinen Monaten die maximale anzahl an Tagen zuordnen soll. Habe die hier gezeigten Varianten schon versucht aber es ergibt immer Fehler die ich auch nicht beheben kann. Wenn ich sie behebe, tauchen neue fehler


vielleicht so wies deine vorredner schon gemacht haben... du definerst einfach eine variable für die maximalen tage und setzt diese dann im switch..



> Wenn ich sie behebe, tauchen neue fehler auf :/


genauer arbeiten und nicht irgenwas hinmurksen!



> Da ich auch nicht sonderlich viel Erfahrung habe mit Methoden, möchte ich diese erst einmal Aussen vor lassen.


naja die 30 Minuten sich das beizugringen würd ich mir nicht sparen...


if(jahr%4==0 && m==2 && jahr%100!=0|| jahr%400==0);

das ist ein einfacher ausdruck der gar nichts macht!
also ; weg und { } dran ...


----------



## Z_E_R_O (10. Dez 2010)

So bin mal deinen Anweisungen gefolgt....


```
import java.util.Scanner;
public class Kalender6 {
  public static void main(String[] args){
     
    Scanner sc=new Scanner(System.in);

    
    System.out.println("Bitte den Monat eingeben: ");
    int monat = sc.nextInt();
    System.out.println("Bitte das Jahr eingeben: ");
    int jahr = sc.nextInt();
       
    int c = (jahr/100);
    int y = jahr%100;
    int w;  
    int d = 1;
    int monatsName;

    if(jahr<=1582 && monat<=10){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }
    if(jahr%4==0 && monat==2 && jahr%100!=0|| jahr%400==0){
   }

 
  
    if(monat<1){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }
    if(monat>12){
      System.out.println("Ungültiges Eingabedatum");
      System.exit(0);
      }

     if(monat==1||monat==2)
      y=y-1;

    if(y<0)
      y=99;

    if(jahr%400==0 && jahr >1600 && monat==1 || monat==2)
      c= c-1;
    
    
    int max = 31;
    switch (monat){  //Initialisierung der neuen Werte für die Monate
      case 1: 
        monat = 11;
          monatsName = "Januar";
            max = 31;
       break;
      case 2: 
        monat = 12;
          monatsName = "Februar";
            max = 28;
       break;
      case 3: 
        monat = 1;
          monatsName = "Maerz";
            max = 31;
       break;
      case 4: 
        monat = 2;
          monatsName = "April";
            max = 30;
       break;
      case 5: 
        monat = 3;
          monatsName = "Mai";
            max = 31;
       break;
      case 6: 
        monat = 4;
          monatsName = "Juni";
            max = 30;
       break;
      case 7: 
        monat = 5;
          monatsName = "Juli";
            max = 31;
       break;
      case 8: 
        monat = 6;
          monatsName = "August";
            max = 31;
       break;
      case 9: 
        monat = 7;
          monatsName = "September";
            max = 30;
       break;
      case 10: 
        monat = 8;
          monatsName = "Oktober";
            max = 31;
       break;
      case 11: 
        monat = 9;
         monatsName = "November";
           max = 30;
       break;
      case 12: 
        monat = 10;
          monatsName = "Dezember";
            max = 31;
       break;
      }
      
//Gaußsche Wochenberechnungsformel

    w = ((1+(int)(2.6*monat-0.2)+y+(y/4)+(c/4)-2*c) % 7 +7) % 7;

   

    System.out.println("");
    System.out.println("     "+monatsName+" "+jahr); 
    System.out.println("");
    System.out.println("MO DI MI DO FR SA SO");
      
      
      for(int i = 0;i < (w+6)%7 ;i++){ //wir rücken richtig ein, für den ersten
        System.out.print("   ");
      }
      
      int weekDay = w;
      
      for(d = 1; d <= 31 ; d++){ //wir iterieren über die tage         
         if(d < 10)
         System.out.print("0"); 
         
         System.out.print(d+" ");//einfach tag ausgeben

         if(weekDay %7 ==0) //am sonntag machen wir einen zeilenumbruch
           System.out.println("");
           weekDay++;
      

    }
  }
 }
```

Und dazu die passenden Fehlermeldungen:

Kalender6.java:57: incompatible types
found   : java.lang.String
required: int
          monatsName = "Januar";
                                ^
Kalender6.java:62: incompatible types
found   : java.lang.String
required: int
          monatsName = "Februar";
                               ^
Kalender6.java:67: incompatible types
found   : java.lang.String
required: int
          monatsName = "Maerz";
                                ^
Kalender6.java:72: incompatible types
found   : java.lang.String
required: int
          monatsName = "April";
                                ^
Kalender6.java:77: incompatible types
found   : java.lang.String
required: int
          monatsName = "Mai";
                               ^
Kalender6.java:82: incompatible types
found   : java.lang.String
required: int
          monatsName = "Juni";
                                ^
Kalender6.java:87: incompatible types
found   : java.lang.String
required: int
          monatsName = "Juli";
                               ^
Kalender6.java:92: incompatible types
found   : java.lang.String
required: int
          monatsName = "August";
                               ^
Kalender6.java:97: incompatible types
found   : java.lang.String
required: int
          monatsName = "September";
                               ^
Kalender6.java:102: incompatible types
found   : java.lang.String
required: int
          monatsName = "Oktober";
                                ^
Kalender6.java:107: incompatible types
found   : java.lang.String
required: int
         monatsName = "November";
                              ^
Kalender6.java:112: incompatible types
found   : java.lang.String
required: int
          monatsName = "Dezember";
                               ^
12 errors

hmpf... Der Pfeil zeigt eigentlich auf die ersten Häckchen

Required int...ja toll. Welches int will er denn haben? SOrry aber mir scheint noch das Logische Verständnis zu fehlen oder so :bahnhof:


----------



## XHelp (10. Dez 2010)

Bei dir sonn 
	
	
	
	





```
monatsName
```
 ja auch eine Zahl. Dieser Zahl willst du ein Wort zuweisen... Also müsste 
	
	
	
	





```
monatsName
```
 ein String sein. Vllt solltest du ja erstmal etwas Zeit in die Grundlagen investieren...


----------



## Z_E_R_O (11. Dez 2010)

So es funktioniert jetzt dür einen Monat. Jetzt muss ich ein ganzes jahr ausgeben. Habe es mit Methoden versucht aber ich steig nicht durch. Bekomme dann Felhler wie "Illegal expression". Gibt es keine einfache Variante das er das alles im anschluss für alle monate ausführt? Mein Buch hilft mir auch nicht viel weiter 


```
import java.util.Scanner;
public class Kalenderneu {
  public static void main (String [] args) {
   
  Scanner sc = new Scanner(System.in); 

  System.out.print("Bitte geben Sie den Monat ein:");
    int m = sc.nextInt();
  System.out.print("Bitte geben Sie das Jahr ein:");
    int jahr = sc.nextInt();

    int y = jahr % 100 ;
    int c = jahr / 100 ;
    int max = 31 ;   
 
    if(jahr<=1582 && m<=10){
      System.out.println("Bitte geben Sie mindestens das Jahr 1582 ein.");
      System.exit(0);
      }

  

    String Mon = "" ; 
            
    switch (m)    { 
        case 1: 
          m = 11 ;
          Mon = "Januar";  
          max = 31; 
          break;
        case 2: 
          m = 12 ;
          Mon = "Februar";
          if (jahr % 4 == 0 && m==2 && jahr%100!=0 || jahr%400==0) 
          max = 29;
          else
          max = 28;
          break;
        case 3: 
          m = 1 ;
          Mon = "Maerz";
          max = 31;
          break;
        case 4:
          m = 2 ;
          Mon = "April";
          max = 30;
          break;
        case 5: 
          m = 3 ;
          Mon = "Mai";
          max = 31;
          break;
        case 6: 
          m = 4 ;
          Mon = "Juni";
          max = 30;
          break;
        case 7: 
          m = 5 ;
          Mon = "Juli";
          max = 31;
          break;
        case 8: 
          m = 6 ;
          Mon = "August";
          max = 31;
          break;
        case 9: 
          m = 7 ;
          Mon = "September";
          max = 30;
          break;
        case 10: 
          m = 8 ;
          Mon = "Oktober";
          max = 31;
          break;
        case 11: 
          m = 9 ;
          Mon = "November";
          max = 30;
          break;
        case 12: 
          m = 10 ;
          Mon = "Dezember";
          max = 31;
          break;
    }
      

    if (m == 11 || m == 12) {  
      y = y-1 ;
    }

    if (y < 0) { 
      y = 99;
    }

    if (jahr >= 1600 && jahr % 400 ==0) {
      c = c-1 ;
    }

    int w =(((1+(int)(2.6*m-0.2)+y+(y/4)+(c/4)-2*c)%7)+7)%7;
   

    System.out.println("");
    System.out.println("     "+Mon+" "+jahr); 
    System.out.println("");
    System.out.println("MO DI MI DO FR SA SO");
      
      
    for(int i = 0;i < (w+6)%7 ;i++){  // Einrücken des ersten Wochentags
      System.out.print("   ");
    } 
     
    int wochentag = w;
      
    for(int d = 1; d <= max; d++){  // Hochzählung der Tage        
      if(d < 10)
      System.out.print("0"); 
         
      System.out.print(d+" ");  // Ausgabe des Tages
         
      if(wochentag %7 ==0)      // Zeilenumbruch für den Snnntag
        System.out.println("");
        wochentag++;
      }
   }
  }
```


----------



## newbie2009 (11. Dez 2010)

StupidAttack hat gesagt.:


> Und ich habe mich immer Angst gehabt, dass ein Informatikstudium schwer ist :/
> Sorry für den Spam.



Wenn man im Informatikstudium nur Programmieren würde^^
Vielleicht änderst deine Meinung wenn du dir andere Module wie die Mathemodule anschaust:applaus:


----------



## XHelp (11. Dez 2010)

Doch, die gibt es. Vorschläge dazu stehen in diesem Thread auf 4 Seiten verteilt. Einfach mal durchlesen.


----------

