Java Programm verbessern/vereinfachen

ausgetrixt

Aktives Mitglied
Hallo!
Ich habe ein Programm geschrieben, das das Datum im Dezember in den dazugehörigen Tag umwandelt und ausgibt. Ich bräuchte eure Erfahrung und Java-Kenntnisse um das Programm zu "komprimieren" und den Aufbau und die Struktur des Java Programmes zu verbessern!

Das Programm funktioniert so einwandfrei!
Vielen Dank für eure Hilfe!!!

Hier der Code:
Java:
import java.util.Scanner;

public class Weekdays_in_December {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
       
        int x = 0;
        while(x < 31) {
            try {
                String s = new String(scanner.nextLine());
                int date = 0;
           
                if (s.equals("end")) {
                    x = 31;
                }
           
                else {
                    String ss = new String(s.substring(9));
                    date = Integer.parseInt(ss);
                }
               
                if (date > 31) {
                    System.out.println("The date is too high!");
                }
               
                if (date == 4 || date == 11 || date == 18 || date == 25) {
                    System.out.println("Monday");
                }
                if (date == 5 || date == 12 || date == 19 || date == 26) {
                    System.out.println("Tuesday");
                }
                if (date == 6 || date == 13 || date == 20 || date == 27) {
                    System.out.println("Wednesday");
                }
                if (date == 7 || date == 14 || date == 21 || date == 28) {
                    System.out.println("Thursday");
                }
                if (date == 1 || date == 8 || date == 15 || date == 22 || date == 29) {
                    System.out.println("Friday");
                }
                if (date == 2 || date == 9 || date == 16 || date == 23 || date == 30) {
                    System.out.println("Saturday");
                }
                if (date == 3 || date == 10 || date == 17 || date == 24 || date == 31) {
                    System.out.println("Sunday");
                }
                x++;
            }
            catch (Exception e) {
                System.out.println("Invalid input!");
            }
        }
       
    }
 
Mal davon abgesehen, dass man mit der Date API das in einem Einzeiler machen kann, was ja sicher nicht Deine Intention war, so würde ich den Rest ermitteln wenn man die eingegebene Zahl durch 7 teile (Nennt sich Modulo). Dann kannst Du die Tage in ein Array von Freitag bis Donnerstag packen und einfach den ArrayInhalt vom Restwert -1 nehmen.

Gruß

Claus
 
Ok, danke...
Dass es so was wie eine Date API gibt wusste ich nicht 😀, aber ja war nicht wirklich meine Intention,
das mit dem Modulo werde ich versuchen Danke!
 
@Thallius: Kannst du uns zeigen wie das geht? Ich habe bereits das:

Java:
import java.text.DateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class Hauptprogramm {

    public static void main(String[] args) {

        // ##############
        // # Beispiel 1 #
        // ##############

        System.out.println("Beispiel 1:");

        // Syntax:

        // Jahr minus 1900.

        // Danach der index von dem Monat.
        // 0 = Januar
        // 1 = Februar
        // 2 = Maerz
        // 3 = April
        // ...
        // 11 = Dezember

        // Danach kommt der Tag.
        // 1 = 1
        // 2 = 2
        // ...
        // 31 = 31
        Date gebdatum = new Date(2004 - 1900, 3, 30);

        System.out.println("Geburtsdatum:       " + gebdatum);
        System.out.println("Wochentag als Zahl: " + gebdatum.getDay());

        // ##############
        // # Beispiel 2 #
        // ##############

        System.out.println("\nBeispiel 2:");

        GregorianCalendar now = new GregorianCalendar();
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
        System.out.println("Aktuelles Datum:    " + df.format(now.getTime()));

    }
}

Ausgabe:
Code:
Beispiel 1:
Geburtsdatum:       Fri Apr 30 00:00:00 CEST 2004
Wochentag als Zahl: 5

Beispiel 2:
Aktuelles Datum:    Samstag, 2. Dezember 2017 14:28 Uhr MEZ

In Beispiel 1 wird Date in Eclipse durchgestrichen dargestellt da es als deprecated gilt.
 
OK. Ich habe es jetzt so gemacht:
Java:
import java.time.LocalDate;

public class Hauptprogramm {

    public static void main(String[] args) {
        System.out.println("Aktuelles Datum:    " + LocalDate.now());
        System.out.println("Wochentag:          " + LocalDate.now().getDayOfWeek());
        System.out.println("Wochentag als Zahl: " + LocalDate.now().getDayOfWeek().getValue());
    }

}
Ausgabe:
Code:
Aktuelles Datum:    2017-12-02
Wochentag:          SATURDAY
Wochentag als Zahl: 6
Aber wie mache ich das für ein beliebiges Datum?
 
Danke!
Java:
System.out.println("30. März 2004:                        " + LocalDate.of(2004, 3, 30));
System.out.println("Wochentag vom 30. März 2004:          " + LocalDate.of(2004, 3, 30).getDayOfWeek());
System.out.println("Wochentag vom 30. März 2004 als Zahl: " + LocalDate.of(2004, 3, 30).getDayOfWeek().getValue());

Ausgabe:
Code:
30. März 2004:                        2004-03-30
Wochentag vom 30. März 2004:          TUESDAY
Wochentag vom 30. März 2004 als Zahl: 2

@ausgetrixt Verstehst du Modulo?
 
@krqewb ja, Modulo errechnet den Rest von einer Division, das heißt:
Java:
int a = 1 % 1 // das % ist das Modulo Zeichen und der Rest der Division ergibt 0

// daraus folgt:
a = 0;
 
Zuletzt bearbeitet:
Meine "Verbesserung" des Programmes sieht dann so aus:
Java:
import java.util.Scanner;

public class Weekdays_in_December {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        String[] weekdays = new String[7];
        weekdays[0] = "Thursday";
        weekdays[1] = "Friday";
        weekdays[2] = "Saturday";
        weekdays[3] = "Sunday";
        weekdays[4] = "Monday";
        weekdays[5] = "Tuesday";
        weekdays[6] = "Wednesday";
      
        int i = 0;
        while (i < 31) {
            try {
                String s = new String(scanner.nextLine());

                if (s.equals("end")) {
                    i = 31;
                } else {
                    String dateString = new String(s.substring(9));
                    int date = 0;
                    int modulo = 100;
                    int index = 100;
                  
                    date = Integer.parseInt(dateString);
                  
                    if (date <= 31 && date > 0) {
                        modulo = (date % 7);
                  
                        for (int j = 0; j < 7; j++) {
                            if (modulo == j) {
                                System.out.println(weekdays[j]);
                            }
                        }
                    } else if (date == 0 || date > 31){
                        System.out.println("The date is too high or does not exist!");
                    }
                }
            } catch (Exception e) {
                System.out.println("Invalid input!");
            }
            i++;
        }
    }

}
 
Zuletzt bearbeitet:
Wichtig für dich sind eigentlich nur die Zeilen:
Java:
modulo = (date % 7);
                
for (int j = 0; j < 7; j++) {
     if(modulo == j) {
         System.out.println(weekdays[j]);
     }
 
Die For Schleife zusammen mit If ABfrage kannst du komplett löschen. Es kann ja nur der richtige Eintrag zutreffen. Denk mal drüber nach 😉

index wird wohl gar nicht benutzt und modulo würde ich dort deklarieren wo es gebraucht wird und nicht darüber. genau genoimmen kannst du natürlich auch direkt

Code:
System.out.println(weekdays[date %7|]);

schreiben. Finde ich persönlich aber schon etwas unleserlicher.

Gruß

Claus
 
Meine "Verbesserung" des Programmes sieht dann so aus:
Java:
import java.util.Scanner;

public class Weekdays_in_December {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        String[] weekdays = new String[7];
        weekdays[0] = "Thursday";
        weekdays[1] = "Friday";
        weekdays[2] = "Saturday";
        weekdays[3] = "Sunday";
        weekdays[4] = "Monday";
        weekdays[5] = "Tuesday";
        weekdays[6] = "Wednesday";
    
        int i = 0;
        while (i < 31) {
            try {
                String s = new String(scanner.nextLine());

                if (s.equals("end")) {
                    i = 31;
                } else {
                    String dateString = new String(s.substring(9));
                    int date = 0;
                    int modulo = 100;
                    int index = 100;
                
                    date = Integer.parseInt(dateString);
                
                    if (date <= 31 && date > 0) {
                        modulo = (date % 7);
                
                        for (int j = 0; j < 7; j++) {
                            if (modulo == j) {
                                System.out.println(weekdays[j]);
                            }
                        }
                    } else if (date == 0 || date > 31){
                        System.out.println("The date is too high or does not exist!");
                    }
                }
            } catch (Exception e) {
                System.out.println("Invalid input!");
            }
            i++;
        }
    }

}

Wenn ich dein Programm ausführe und eine Zahl eingebe erscheint bei jeder Zahl:
Invalid input!

Code:
System.out.println(weekdays[date %7|]);
Was bedeutet der senkrechte Strich?
 
@krqewb weil ich das so gemacht habe, dass du vorher 9 Zeichen eingeben musst, dass heißt z.B.: December 12 dann ließt er die Zahl 12 ein, habe das Programm also nur für "December-Monate" geschrieben
 
Achso! Ja, jetzt funktioniert es!

Du deklarierst
Code:
int index = 100;
aber du verwendest es nirdends.
 

Zurück
Oben