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:
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 !
Java:
importjava.util.Scanner;publicclassKalender{publicstaticvoid main (String[] args){StringMon="falscher Eingabewert",Tag="falscher Eingabewert";int max =31,Scanner sc =newScanner(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){case1:
m =11;Mon="Januar";
max =31;break;case2:
m =12;Mon="Februar";if(jahr %4==0)
max =29;else
max =28;break;case3:
m =1;Mon="Maerz";
max =31;break;case4:
m =2;Mon="April";
max =30;break;case5:
m =3;Mon="Mai";
max =31;break;case6:
m =4;Mon="Juni";
max =30;break;case7:
m =5;Mon="Juli";
max =31;break;case8:
m =6;Mon="August";
max =31;break;case9:
m =7;Mon="September";
max =30;break;case10:
m =8;Mon="Oktober";
max =31;break;case11:
m =9;Mon="November";
max =30;break;case12:
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){case0:
w =0;Tag="Sonntag";break;case1:
w =1;Tag="Montag";break;case2:
w =2;Tag="Dienstag";break;case3:
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 ");elseSystem.out.println("27 "+"28 ");}break;case4:
w =4;Tag="Donnerstag";break;case5:
w =5;Tag="Freitag";break;case6:
w =6;Tag="Samstag";break;}}}
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?
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!
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. ;-)
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!
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 ^^
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...
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?
Java:
publicclassTest{publicstaticvoidmain(String[] args){printCal(10,2010);}publicstaticvoidprintCal(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 Calendarint 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 erstenSystem.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 esSystem.out.print(d+" ");//einfach tag ausgebenif(weekDay %7==0)//am sonntag machen wir einen zeilenumbruchSystem.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...
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
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 !
Calendar cal =newGregorianCalendar();
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
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:
Java:
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...
Java:
importjava.util.Scanner;publicclassKalender{publicstaticvoid main (String[] args){StringMon="falscher Eingabewert",Tag="falscher Eingabewert";int max =31;Scanner sc =newScanner(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){case1:
m =11;Mon="Januar";
max =31;break;case2:
m =12;Mon="Februar";if(jahr %4==0)
max =29;else
max =28;break;case3:
m =1;Mon="Maerz";
max =31;break;case4:
m =2;Mon="April";
max =30;break;case5:
m =3;Mon="Mai";
max =31;break;case6:
m =4;Mon="Juni";
max =30;break;case7:
m =5;Mon="Juli";
max =31;break;case8:
m =6;Mon="August";
max =31;break;case9:
m =7;Mon="September";
max =30;break;case10:
m =8;Mon="Oktober";
max =31;break;case11:
m =9;Mon="November";
max =30;break;case12:
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){case0:
w =0;Tag="Sonntag";break;case1:
w =1;Tag="Montag";break;case2:
w =2;Tag="Dienstag";break;case3:
w =3;Tag="Mittwoch";break;case4:
w =4;Tag="Donnerstag";break;case5:
w =5;Tag="Freitag";break;case6:
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 Calendarint 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 erstenSystem.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 esSystem.out.print(d+" ");//einfach tag ausgebenif(weekDay %7==0)//am sonntag machen wir einen zeilenumbruchSystem.out.println("");
weekDay++;}System.out.println(w);}}
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!
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^^
ach ja? wie denn bitte? die formel wie man max leichter ausrechnet interessiert mich
Java:
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
Java:
importjava.util.Scanner;publicclassTest{publicstaticvoid main (String[] args){Scanner sc =newScanner(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){case1:
monatsName ="Januar";break;case2:
monatsName ="Februar";break;case3:
monatsName ="Maerz";break;case4:
monatsName ="April";break;case5:
monatsName ="Mai";break;case6:
monatsName ="Juni";break;case7:
monatsName ="Juli";break;case8:
monatsName ="August";break;case9:
monatsName ="September";break;case10:
monatsName ="Oktober";break;case11:
monatsName ="November";break;case12:
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 erstenSystem.out.print(" ");}int weekDay = firstWeekDay;for(int d =1; d <= max; d++){//wir iterieren über die tageif(d <10)System.out.print("0");//das geht auch sauberer, aber für den anfang tut esSystem.out.print(d+" ");//einfach tag ausgebenif(weekDay %7==0)//am sonntag machen wir einen zeilenumbruchSystem.out.println();
weekDay++;}}}
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 !
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 ?
ich würde den einzelmonatsteil in eine eigene methode packen. dann in einer zweiten methode die erste mit schleife 12 mal aufrufen
Java:
publicvoidprintEinMonat(int monat,int jahr){// hier alles nach dem scanner rein aus deiner alten main}publicvoidprintEinJahr(int jahr){for(i <=12){printEinMonat(i,jahr);}}publicstaticvoidmain(){// scanner nutzen und ausgabeart/jahr/monat abfragenif(monat){printEinMoant(monat, jahr);}else{printEinJahr(jahr);}}
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:
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:
Java:
importjava.util.Scanner;publicclassKalender{publicstaticvoid main (String[] args){StringMon="falscher Eingabewert",Tag="falscher Eingabewert";int max =31;Scanner sc =newScanner(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){case1:
m =11;Mon="Januar";
max =31;break;case2:
m =12;Mon="Februar";if(jahr %4==0)
max =29;else
max =28;break;case3:
m =1;Mon="Maerz";
max =31;break;case4:
m =2;Mon="April";
max =30;break;case5:
m =3;Mon="Mai";
max =31;break;case6:
m =4;Mon="Juni";
max =30;break;case7:
m =5;Mon="Juli";
max =31;break;case8:
m =6;Mon="August";
max =31;break;case9:
m =7;Mon="September";
max =30;break;case10:
m =8;Mon="Oktober";
max =31;break;case11:
m =9;Mon="November";
max =30;break;case12:
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 erstenSystem.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 ausgebenif(weekDay %7==0)//am sonntag machen wir einen zeilenumbruchSystem.out.println("");
weekDay++;}}}
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:
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...
for(int d =1; d <= max; d++){//wir iterieren über die tageif(d <10)System.out.print("0");//das geht auch sauberer, aber für den anfang tut esSystem.out.print(d);//einfach tag ausgebenif((d+firstWeekDay)%7==0)System.out.println();elseSystem.out.print(" ");//weekDay++;}
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...
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...