Beer time homework

Здравейте, моля за съдействие за задачата Beer time, която е част от домашното в Conditional Statements урока. Това е цялата задача. Иска ми се да използвам sub-string, както е подсказано.

Problem 11. Beer Time

  • A beer time is after 1:00 PM and before 3:00 AM .
  • Write a program that enters a time in format “hh:mm tt” (an hour in range [01…12], a minute in range [00…59] and AM / PM designator) and prints beer time or non-beer time according to the definition above or invalid time if the time cannot be parsed.

Hint: Research sub-string functions for string data type.

int hour = Integer.valueOf(time.substring(0, 2));
int minutes = Integer.valueOf(time.substring(3, 5));
String dayNight = String.valueOf(time.substring(6, 8));

Така някак успявам да изведа стойностите от часове, минути, но не знам, как да хване и когато е 01:00 например, когато започва с нула. Ровя и търся някакви неща, но не успявам.
Благодаря предварително. :slight_smile:

Здравей,
Моето решение на тази задача е доста дълго и с много проверки, така че със сигурност не е най-оптималното, но ето го:

Scanner sc = new Scanner(System.in);

    String time = sc.nextLine();

    int z = time.length();

    //I can see that the string length can be either 7 or 8: it depends on whether a leading zero is
    //used before the hours digits - if the hours are written with one or two digits

    //First, I will check if it is AM or PM

    String substringTime = time.substring(z - 2);
    String substring2 = time.substring(0, 2);
    String substring3 = time.substring(0, 1);
    int hours = 0;


    if (z == 8) {
        hours = Integer.parseInt(substring2);
        if (substringTime.equals("PM")) {
            if (hours >= 1 && hours <= 11) {
                System.out.println("beer time");
            } else if (hours == 12) {
                System.out.println("non-beer time");
            } else {
                System.out.println("invalid time");
            }
        } else if (substringTime.equals("AM")) {
            if ((hours >= 1 && hours < 3) || hours == 12) {
                System.out.println("beer time");
            } else if (hours >= 3 && hours < 12) {
                System.out.println("non-beer time");
            } else {
                System.out.println("invalid time");
            }

        } else {
            System.out.println("invalid time");
        }

    } else if (z == 7) {
        hours = Integer.parseInt(substring3);
        if (substringTime.equals("PM")) {
            if (hours >= 1 && hours <= 11) {
                System.out.println("beer time");
          //  } else if (hours == 12) { // I think this case is not necessary but will leave it
              //  System.out.println("non-beer time");
            } else {
                System.out.println("invalid time");
            }
        } else if (substringTime.equals("AM")) {
            if (hours >= 1 && hours < 3) { //here " || hours == 12" can be omitted
                System.out.println("beer time");
            } else if (hours >= 3 && hours < 12) {
                System.out.println("non-beer time");
            } else {
                System.out.println("invalid time");
            }

        } else {
            System.out.println("invalid time");
        }
    }else {
        System.out.println("invalid time");
    }
}
2 Likes

Много благодаря! Опитах се да я реша по друг начин, за да схвана логиката. Ето и моето решение, малко по-различно е, обърнах само проверките малко и добавих само за минутите, ако са повече от 59 да изписва invalid time. Beer time - Pastebin.com

1 Like

Здравейте,
Реших задачата ето така: import java.text.DateFormat;import java.text.Format;import java.text.SimpleD - Pastebin.com
Тестовете минават, но дали има нещо, което не успявам да тествам?
Освен това, ме притеснявам, че нянам провеверка ако бъде въведено нещо различно от зададения формат. Например ако изпиша за вход “тнтьмтжн” програмата спира да работи…
Каква може да бъде проверката, която да изписва “invalid time” в такъв случай?

Здравей, на първо четене се зачудих защо казваш, че ако дължината на стринга е различна от 8 имаме invalid time - доколкото си спомням имаше възможност да се подаде и стринг със 7 символа когато нямаме leading zero преди часовете, поправете ме ако греша …
Иначе за проверка дали се подава валидни данни, ако трябва да направиш такава може да ползваш тези методи, които проверяват дали подаденият символ е Digit или Letter - в началото на стринга трябва задължително да имаме Digit, а в края Letter. Надявам се да съм била полезна :slightly_smiling_face:

1 Like

Благодаря :slight_smile:

1 Like

Ето тук допълвам с конкретните методи които проверяват дали е цифра

Или е буква

В дясно има още много методи които бихте могли да използвате :slightly_smiling_face:

1 Like

Благодаря :slight_smile: за мен информацията е много полезна :slight_smile:

1 Like

Здравей,при мен задачата работи с всички входове,но я реших без да вкарвам в приложение минутите.Не знам колко е удачно да работи по този начин - import java.util.Scanner;public class P11_beerTime { public static void - Pastebin.com