2016-11-19 5 views
2

현재 12 시간 시계 (예 : 입력 (16, 47))에서 시간을 작성하기 위해 기본 클래스의 입력과 상호 작용하는 데이터 유형 Time()을 작성하려고합니다. (예 : (28, -148)에 대한 입력 값은 28 시간 평가에서 2 시간 28 분을 제거 할 수 있습니다. ~ (25, 32)이고 25는 1로 평가되어 1:32 AM의 시간을 나타냅니다. 이 드라이버 프로그램을 기반으로 지금까지 내가 만든 것에서 잘못된 값을 얻고 있습니다.12 시간 시계 작성

package newProject; 

/** 
* A program to test the Time class. 
* 
* 
*/ 
public class TestTime { 

public static void main(String[] args) { 
    System.out.println("Basic Times\n" 
        + "-----------"); 
    testTime(12, 30, 12, 30, "12:30 PM"); 
    testTime(16, 16, "4:00 PM"); 
    testTime(0, 0, 0, 0, "12:00 AM"); 
    testTime(0, 10, 0, 10, "12:10 AM"); 
    testTime(1, 5, 1, 5, "1:05 AM"); 
    testTime(11, 59, 11, 59, "11:59 AM"); 
    testTime(12, 12, "12:00 PM"); 
    testTime(12,1,12,1, "12:01 PM"); 
    testTime(13,55,13,55, "1:55 PM"); 
    testTime(23,55,23,55, "11:55 PM"); 
    System.out.println(); 

    System.out.println("Invalid Times\n" 
        + "-------------"); 
    testTime(24, 0, "12:00 AM"); 
    testTime(49, 10, 1, 10, "1:10 AM"); 
    testTime(49, 125, 3, 5, "3:05 AM"); 
    testTime(-1, 23, "11:00 PM"); 
    testTime(0, -1, 23, 59, "11:59 PM"); 
    testTime(-27, 21, "9:00 PM"); 
    testTime(10, -125, 7, 55, "7:55 AM"); 
    testTime(-55, -308, 11, 52, "11:52 AM"); 
    System.out.println(); 

    System.out.println("addMinutes\n" 
        + "----------"); 
    testAdd(0, 0, 20, 0, 20, "12:20 AM"); 
    testAdd(0, 0, 90, 1, 30, "1:30 AM"); 
    testAdd(0, 40, 30, 1, 10, "1:10 AM"); 
    testAdd(0, 40, 90, 2, 10, "2:10 AM"); 
    testAdd(23, 50, 11, 0, 1, "12:01 AM"); 
    testAdd(23, 50, 3 * 24 * 60 + 1, 23, 51, "11:51 PM"); 
    System.out.println(); 
} 

/** 
* Test whether Time constructor, getters, and print 
* are behaving properly when zero minutes. 
* 
* @param hrs  what hour to say to the constructor 
* @param finalHrs what hour the Time should end up with 
* @param rep  how that Time should print out 
*/ 
private static void testTime(int hrs, 
          int finalHrs, 
          String rep) { 
    System.out.print("new Time(" + hrs + ", 0) --> " + finalHrs + ", 0: "); 

    Time t = new Time(hrs, 0); 
    if (t.getHour() == finalHrs && t.getMinute() == 0) 
     System.out.println("PASS"); 
    else 
     System.out.println("FAIL"); 
    t.print(); 
    System.out.println(" should be " + rep); 
} 

/** 
* Test whether Time constructor, getters, and print are 
* behaving properly when minutes are not (necessarily) 0. 
* 
* @param hrs   what hour to give the constructor 
* @param mins   what minute to give the constructor 
* @param finalHrs  what hour the Time should end up with 
* @param finalMins  what minute the Time should end up with 
* @param rep   how the Time should print out 
*/ 
private static void testTime(int hrs, int mins, 
          int finalHrs, int finalMins, 
          String rep) { 
    System.out.print("new Time(" + hrs + ", " + mins + ") --> " 
     + finalHrs + ", " + finalMins + ": "); 

    Time t = new Time(hrs, mins); 
    if (t.getHour() == finalHrs && t.getMinute() == finalMins) 
     System.out.println("PASS"); 
    else 
     System.out.println("FAIL"); 
    t.print(); 
    System.out.println(" should be " + rep); 
} 

/** 
* Check whether addMinutes, getters, and print are working properly. 
* @param hrs   what hour to give the constructor 
* @param mins   what minute to give the constructor 
* @param addMins  the number of minutes to add to the Time 
* @param finalHrs  what hour the Time should end up with 
* @param finalMins  what minute the Time should end up with 
* @param rep   how the (later) Time should print out 
*/ 
private static void testAdd(int hrs, int mins, int addMins, 
          int finalHrs, int finalMins, 
          String rep) { 
    Time t = new Time(hrs, mins); 
    Time t2 = t.addMinutes(addMins); 

    System.out.print("Adding " + addMins + " minutes to "); 
    t.print(); 
    System.out.print(" --> "); 
    if (t2.getHour() == finalHrs && t2.getMinute() == finalMins) 
     System.out.println("PASS"); 
    else 
     System.out.println("FAIL"); 
    t2.print(); 
    System.out.println(" should be " + rep); 
} 

}

지금까지 내가이를 수정하는 데 필요한 방법을 함께 넣어했지만, 정말 다음에 어디로 모르는 것입니다.

package newProject; 


public class Time { 

    private final int MAX_HOURS = 23; 
    private final int MIN_HOURS = 0; 
    private final int MAX_MINUTES = 59; 
    private final int MIN_MINUTES = 0; 
    private int hour; 
    private int minute; 

    private Time() { 

    } 

    public Time(int hrs, int mins) { 
     this.hour = hrs; 
     this.minute = mins; 

    } 

    private void fixMe() { 
     if (minute > MAX_MINUTES) { 
      this.minute %= minute/60; 
      this.hour = minute/60 + hour; 
     } 
     if (minute < MIN_MINUTES) { 
      this.minute = minute + 60; 
     } 
     if (hour > MAX_HOURS) { 
      this.hour %= hour/24; 
     } 
     if(hour < MIN_HOURS) { 
      this.hour = hour + 24; 
     } 

    } 

    public int getHour() { 
     return this.hour; 
    } 

    public int getMinute() { 
     return this.minute; 
    } 

    public Time addMinutes(int mins) { 
     Time t = new Time(); 
     t.fixMe(); 
     return t; 

    } 

    public void print() { 

     if (hour == 0) { 
      hour = 12; 
     } 
     if (hour > 1 && hour <= 12) { 
      System.out.print(hour); 
     } else { 
      System.out.print(hour - 12); 
     } 
     if (minute < 10) { 
      System.out.print(":0" + minute); 
     } else { 
      System.out.print(minute); 
     } 
     if (hour <= 11) { 
      System.out.print(" AM"); 
     } else 
      System.out.print(" PM"); 
    } 

} 

이들은 내가 얻고있는 결과이며, 내가 찾고있는 것과는 거리가 멀다.

run: 
Basic Times 
----------- 
new Time(12, 30) --> 12, 30: PASS 
1230 PM should be 12:30 PM 
new Time(16, 0) --> 16, 0: PASS 
4:00 PM should be 4:00 PM 
new Time(0, 0) --> 0, 0: PASS 
12:00 PM should be 12:00 AM 
new Time(0, 10) --> 0, 10: PASS 
1210 PM should be 12:10 AM 
new Time(1, 5) --> 1, 5: PASS 
-11:05 AM should be 1:05 AM 
new Time(11, 59) --> 11, 59: PASS 
1159 AM should be 11:59 AM 
new Time(12, 0) --> 12, 0: PASS 
12:00 PM should be 12:00 PM 
new Time(12, 1) --> 12, 1: PASS 
12:01 PM should be 12:01 PM 
new Time(13, 55) --> 13, 55: PASS 
155 PM should be 1:55 PM 
new Time(23, 55) --> 23, 55: PASS 
1155 PM should be 11:55 PM 

Invalid Times 
------------- 
new Time(24, 0) --> 0, 0: FAIL 
12:00 PM should be 12:00 AM 
new Time(49, 10) --> 1, 10: FAIL 
3710 PM should be 1:10 AM 
new Time(49, 125) --> 3, 5: FAIL 
37125 PM should be 3:05 AM 
new Time(-1, 0) --> 23, 0: FAIL 
-13:00 AM should be 11:00 PM 
new Time(0, -1) --> 23, 59: FAIL 
12:0-1 PM should be 11:59 PM 
new Time(-27, 0) --> 21, 0: FAIL 
-39:00 AM should be 9:00 PM 
new Time(10, -125) --> 7, 55: FAIL 
10:0-125 AM should be 7:55 AM 
new Time(-55, -308) --> 11, 52: FAIL 
-67:0-308 AM should be 11:52 AM 

addMinutes 
---------- 
Adding 20 minutes to 12:00 PM --> FAIL 
12:00 PM should be 12:20 AM 
Adding 90 minutes to 12:00 PM --> FAIL 
12:00 PM should be 1:30 AM 
Adding 30 minutes to 1240 PM --> FAIL 
12:00 PM should be 1:10 AM 
Adding 90 minutes to 1240 PM --> FAIL 
12:00 PM should be 2:10 AM 
Adding 11 minutes to 1150 PM --> FAIL 
12:00 PM should be 12:01 AM 
Adding 4321 minutes to 1150 PM --> FAIL 
12:00 PM should be 11:51 PM 

궁극적으로 프로그램이 필요한 것으로 작동하면 모두 통과로 평가됩니다. 어떤 도움을 크게 나는 기존 fixMe 방법이 작동하도록되어 방법을 잘 모르겠어요

+0

'Time.addMinutes (int)'는 빈'Time' 개체 (0,0)를 반환하는 것처럼 보입니다. – qxz

답변

0

감사하지만, 여기에 작업 구현 될 것이다 :

private void fixMe() { 
    hours += minutes/60; 
    minutes %= 60; 
    if (minutes < 0) { // if minutes was negative, 
     minutes += 60; // correct the result of the modulus 60 to make it positive 
     hours--;  // correct the result of the /60 by subtracting one more hour 
    } 
    hours %= 24; 
    if (hours < 0) { // if hours was negative, 
     hours += 24; // correct the modulus 24 to be positive 
    } 
} 

이 기본적으로 그냥 계수/정수 나누기가를 얻을 않습니다 값을 올바른 범위로 트릭은 부정적인 입력을 처리합니다. 이 경우 모듈러스는 음수가되고 정수 나누기의 결과는 원하는 것보다 하나 더됩니다. 이러한 요소를 수정하면 의도 한대로 작동합니다.

또한 addMinutes(int) 메서드가 실제로 분을 추가하는지 확인하십시오.

0

클래스에서 모든 시간을 내부적으로 초로 표시하고 필요할 때만이 내부 표현을 시간과 분으로 변환하면 수학을 훨씬 간단하게 만들 수 있으므로 결과적으로 오류가 발생하지 않게됩니다. 그런 식으로, 당신의 addMinutes() 방법은 단순한 추가 할 필요가 :

public void addMinutes(int m) { 
    this.seconds += m * 60; 
} 

getHour()getMinute() 방법이 정확한 시간과 분을 알아 내기 위해 몇 가지 간단한 계산을 할 필요가있을 것이다, 그러나 다른 한편으로 당신은 그 확장 할 수 일, 월, 년, 초를 얻을 수있는 메소드를 가진 수업.

실제로 프로그래밍에서 시간 및 날짜 형식을 구현하는 일반적인 방법은 특정 시점 이후로 경과 된 시간 (초)을 저장하는 것입니다. 관심이 있으시면 read more about that here 수 있습니다.

또한 기존 Java date and time APIs을 확인하시기 바랍니다.