2016-03-21 23 views
1

Ich bin ein Anfänger, der Java selbstständig geübt hat. Ich habe gerade gelernt, wie man Werte aus Methoden zurückgibt. Ich habe diese Übung versucht, die hier gefunden werden kann Weekday Calculator.Wochentag Rechner Logischer Fehler - Java

Ich habe Arbeitscode, der mich eine Weile brauchte, um zu schreiben. (#proudNOOB)

import java.util.Scanner; 

public class WeekdayCalculator { 
    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); 

     int yearsSince1900, total, remainder; 

     System.out.print("Enter your year of birth ~ "); 
     int year = keyboard.nextInt(); 

     System.out.print("Enter the month you were born in " + year + " ~ "); 
     int month = keyboard.nextInt(); 

     System.out.print("Enter the day you were born in " + monthName(month) + " ~ "); 
     int day = keyboard.nextInt(); 

     yearsSince1900 = year - 1900; 
     // System.out.println(yy); 

     total = (yearsSince1900/4) + yearsSince1900 + day + monthOffset(month); 
     if ((isLeap(year) == true) && month == 1 || month == 2) { 
      total = total - 1; 
     } 
     // System.out.println(total); 

     remainder = total % 7; 
     // System.out.println(remainder); 

     // Display (day of week, month, day, year) 
     System.out.println("\nYou were born on " + weekdayName(remainder) + ", " + monthName(month) + " " + day + ", " + year + "."); 
    } 

    public static int monthOffset(int month) { 
     int offset; 

     if (month == 1) { 
      offset = 1; 
     } 
     else if (month == 2) { 
      offset = 4; 
     } 
     else if (month == 3) { 
      offset = 4; 
     } 
     else if (month == 4) { 
      offset = 0; 
     } 
     else if (month == 5) { 
      offset = 2; 
     } 
     else if (month == 6) { 
      offset = 5; 
     } 
     else if (month == 7) { 
      offset = 0; 
     } 
     else if (month == 8) { 
      offset = 3; 
     } 
     else if (month == 9) { 
      offset = 6; 
     } 
     else if (month == 10) { 
      offset = 1; 
     } 
     else if (month == 11) { 
      offset = 4; 
     } 
     else if (month == 12) { 
      offset = 6; 
     } 
     else { 
      offset = -1; 
     } 

     return offset; 
    } 

    public static boolean isLeap(int year) { 
     boolean leap; 

     if (year % 400 == 0) { 
      leap = true; 
     } 
     else if (year % 100 == 0) { 
      leap = false; 
     } 
     else if (year % 4 == 0) { 
      leap = true; 
     } 
     else { 
      leap = false; 
     } 

     return leap; 
    } 

    public static String weekdayName(int remainder) { 
     String weekdayWord = ""; 

     if (remainder == 1) { 
      weekdayWord = "Sunday"; 
     } 
     else if (remainder == 2) { 
      weekdayWord = "Monday"; 
     } 
     else if (remainder == 3) { 
      weekdayWord = "Tuesday"; 
     } 
     else if (remainder == 4) { 
      weekdayWord = "Wednesday"; 
     } 
     else if (remainder == 5) { 
      weekdayWord = "Thursday"; 
     } 
     else if (remainder == 6) { 
      weekdayWord = "Friday"; 
     } 
     else if (remainder == 7) { 
      weekdayWord = "Saturday"; 
     } 

     return weekdayWord; 
    } 

    public static String monthName(int month) { 
     String monthWord = ""; 

     if (month == 1) { 
      monthWord = "January"; 
     } 
     else if (month == 2) { 
      monthWord = "February"; 
     } 
     else if (month == 3) { 
      monthWord = "March"; 
     } 
     else if (month == 4) { 
      monthWord = "April"; 
     } 
     else if (month == 5) { 
      monthWord = "May"; 
     } 
     else if (month == 6) { 
      monthWord = "June"; 
     } 
     else if (month == 7) { 
      monthWord = "July"; 
     } 
     else if (month == 8) { 
      monthWord = "August"; 
     } 
     else if (month == 9) { 
      monthWord = "September"; 
     } 
     else if (month == 10) { 
      monthWord = "October"; 
     } 
     else if (month == 11) { 
      monthWord = "November"; 
     } 
     else if (month == 12) { 
      monthWord = "December"; 
     } 
     else { 
      monthWord = "error"; 
     } 

     return monthWord; 
    } 
} 

testete ich mein Programm mit den automatischen Tests in der Übungsanleitung. Das Programm arbeitet gegen alle diese Tests außer 2 13 1977, die mir die Ausgabe "Sie wurden am 13. Februar 1977 geboren" und es funktioniert auch gegen mein Geburtsdatum, neben anderen zufälligen Daten. Allerdings habe ich das Geburtsdatum meines Vaters ausprobiert (nur für den Teufel) und die Ausgabe ist genauso fehlerhaft wie beim Testfall (der Wochentagsname fehlt).

INPUT:

Geben Sie Ihr Geburtsjahr ~ 1962

den Monat Geben Sie Sie im Jahr 1962 ~ 12

Geben Sie den Tag Sie in 29. Dezember ~

geboren wurden geboren wurden

OUTPUT :

Sie wurden am 29. Dezember 1962 geboren.

Ich verstehe, dass die Variable yearsSince1900 nach meiner Eingabe und der Programmlogik einen Wert von 62 hat. Dann gilt die Gesamtvariable ((62/4) + 62 + 29 + 6) was 112 entspricht. Dann ist 112% 7 gleich 16 , was bedeutet, dass der Rest gleich 0 ist. Daher gibt die weekdayName-Methode keinen weekdayWord zurück, da es keine Bedingung gibt, bei der rest == 0. Was ist der beste Weg, um diesen logischen Fehler zu beheben, der bestimmte Geburtsdaten durcheinander bringt? Ich möchte, dass dieses Programm auch für das Geburtsdatum meines Vaters (und jedes Geburtsdatum von 1900) funktioniert, damit ich es ihm zeigen kann. : D Außerdem werden alle Tipps zur selbstlernenden Programmierung und wo einfache Spiele oder Übungen wie diese zu finden sind, sehr geschätzt. Vielen Dank!

+0

Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen. – camelCoder

+1

Sie könnten auch 'wochentag' mit' return new SimpleDateFormat ("EEEE, MMMM d, yyyy") implementieren. Format (neues Datum (yyyy - 1900, mm, dd)); ' –

Antwort

1

Es sieht aus wie dieser Fehler kann durch Änderung des Samstag Rest auf Null festgelegt werden, da Ihre Methode nicht für einen Modul von 0.

else if (remainder == 0) { 
    weekdayWord = "Saturday"; 
} 
+1

Es sollte' rest == 0' sein Genug hier, da der Ausdruck 'rest = total% 7' zu einer Zahl zwischen 0 und 6 ausgewertet werden sollte. – apicellaj

+0

Warte ... jetzt gebe ich mein Geburtsdatum (Jahr = 1995, Monat = 2, Tag = 4) und die Ausgabe ein ist um einen Tag weg ... es sollte Samstag sein, aber es zeigt Freitag. – camelCoder

+1

@camelCoder Was apicellaj gesagt hat, macht Sinn. Ich denke, mit der implementierten Logik, die überarbeitet werden muss, ist etwas im Gange. –

0

Dank jeder Person, die ich meine logischen geführten Konto hat beim Debuggen Fehler.

Zunächst einmal, wenn der Rest gleich 0 und der Rest ist gleich 7, sollte die weekdayWord

else if (remainder == 7 || remainder == 0) { 
     weekdayWord = "Saturday"; 
    } 

Zweitens meine Bedingung für das Schaltjahr Prüfung auf „Samstag“ eingestellt werden, was die Gesamt beeinflussen würde , und schließlich der WochentagWort, war als Ergebnis der fehlenden Klammern fehlerhaft. Die korrekte Bedingung ist:

if ((isLeap(year) == true) && (month == 1 || month == 2)) { 
     total = total - 1; 
    } 

Das Programm funktioniert jetzt erfolgreich für alle Fälle, die ich versucht habe. Zeit, das meinem Vater zu zeigen. : P