Loading...
Vixy_P avatar Vixy_P 0 Точки

Имам проблем с часовника. Не знам къде греша

Здравейте, имам проблем със следната задача:

8.Навреме за изпит

Студент трябва да отиде на изпит в определен час (например в 9:30 часа). Той идва в изпитната зала в даден час на пристигане (например 9:40). Счита се, че студентът е дошъл навреме, ако е пристигнал в часа на изпита или до половин час преди това. Ако е пристигнал по-рано повече от 30 минути, той е подранил. Ако е дошъл след часа на изпита, той е закъснял. Напишете програма, която прочита време на изпит и време на пристигане и отпечатва дали студентът е дошъл навреме, дали е подранил или е закъснял и с колко часа или минути е подранил или закъснял.

Вход

От конзолата се четат 4 цели числа (по едно на ред), въведени от потребителя:

  • Първият ред съдържа час на изпита - цяло число от 0 до 23;
  • Вторият ред съдържа минута на изпита - цяло число от 0 до 59;
  • Третият ред съдържа час на пристигане - цяло число от 0 до 23;
  • Четвъртият ред съдържа минута на пристигане - цяло число от 0 до 59.

Изход

На първия ред отпечатайте:

  • "Late", ако студентът пристига по-късно от часа на изпита;
  • "On time", ако студентът пристига точно в часа на изпита или до 30 минути по-рано;
  • "Early", ако студентът пристига повече от 30 минути преди часа на изпита.

Ако студентът пристига с поне минута разлика от часа на изпита, отпечатайте на следващия ред:

  • "mm minutes before the start" за идване по-рано с по-малко от час;
  • "hh:mm hours before the start" за подраняване с 1 час или повече. Минутите винаги печатайте с 2 цифри, например "1:05”;
  •  "mm minutes after the start" за закъснение под час;
  • "hh:mm hours after the start" за закъснение от 1 час или повече. Минутите винаги печатайте с 2 цифри, например "1:03”.

Примерен вход и изход

Вход

Изход

 

Вход

Изход

 

Вход

Изход

9

30

9

50

Late

20 minutes after the start

9

00

10

30

Late

1:30 hours after the start

10

00

10

00

On time

9

00

8

30

On time

30 minutes before the start

 

14

00

13

55

On time

5 minutes before the start

11

30

10

55

Early

35 minutes before the start

16

00

15

00

Early

1:00 hours before the start

 

11

30

8

12

Early

3:18 hours before the start

11

30

12

29

Late

59 minutes after the start

 Може би има нещо, което не разбирам в логиката на задачата. Това е моето решение, което е грешно:

 

 

hour_of_exam = int(input())
minute_of_exam = int(input())
hour_of_arrival = int(input())
minute_of_arrival = int(input())

exam_time_in_minutes = (hour_of_exam * 60) + minute_of_exam
arrival_time_in_minutes = (hour_of_arrival * 60) + minute_of_arrival
hour = hour_of_exam // 60
minute = minute_of_exam % 60
difference = abs(exam_time_in_minutes - arrival_time_in_minutes)

if arrival_time_in_minutes == exam_time_in_minutes:
    print("On time")

if arrival_time_in_minutes < exam_time_in_minutes:
    if difference <= 30:
        print("On time")
        print(f"{minute:02d} minutes before the start")
    else:
        if difference <= 59:
            print("Early")
            print(f"{minute:02d} minutes before the start")
        else:
            print("Early")
            print(f"{hour}:{minute:02d} hours before the start")
elif arrival_time_in_minutes > exam_time_in_minutes:
    if difference <= 59:
        print("Late")
        print(f"{minute:02d} minutes after the start")
    else:
        print("Late")
        print(f"{hour}:{minute:02d} hours after the start")

 

 

Не си отривам грешките, а решението ми няма кой знае колко разлика с това на преподавателя, освен в имената на променливите и структурата на проверките:

 

 

hour_of_exam = int(input())
minute_of_exam = int(input())
hour_of_arrive = int(input())
minute_of_arrive = int(input())

exam_time_in_minutes = (hour_of_exam * 60) + minute_of_exam
arrive_time_in_minutes = (hour_of_arrive * 60) + minute_of_arrive
diff = (exam_time_in_minutes - arrive_time_in_minutes)
hour = diff // 60
minutes = diff % 60

if exam_time_in_minutes == arrive_time_in_minutes:
    print("On time")
elif exam_time_in_minutes > arrive_time_in_minutes:
    if diff <= 30:
        print("On time")
        print(f"{diff} minutes before the start")
    elif 30 < diff <= 59:
        print("Early")
        print(f"{diff} minutes before the start")
    else:
        print("Early")
        print(f"{hour}:{minutes:02d} hours before the start")
elif arrive_time_in_minutes > exam_time_in_minutes:
    if diff < 60:
        print("Late")
        print(f"{diff} minutes after the start")
    else:
        print("Late")
        print(f"{hour}:{minutes:02d} hours after the start")

 


 

Дори това решение не премина всички тестове в judje, а при тестване на входни данни получавах и отрицателни числа. Също така не разбирам това с принтирането на часовете. При по-малко от час се изписва difference, а при повече hour и форматирана minute. Но разликата не е ли именно минутите? Къде е разликата? Моля ви да посочите грешките ми.

 

 

0
Programming Basics 10/01/2022 10:04:02
svephoto avatar svephoto 1182 Точки

Здравей, Vixy_P,

 

За да не получаваш отрицателни числа като резултати, трябва да пресмяташ diff с вземане на абсолютна стойност и като допълнение да обърнеш полученото в цяло число с int():

diff = int(math.fabs(exam_time_in_minutes - arrive_time_in_minutes))

Добави си и

import math

в началото на кода. С тези промени програмата ще заработи коректно.

1
Vixy_P avatar Vixy_P 0 Точки

Много благодаря за помощта! Между другото, каква е разликата между abs и fabs и защо трябва да се вземе цялото число? Също, има ли значение дали при принтиране си написал difference или minute? 

0
svephoto avatar svephoto 1182 Точки

Няма функция math.abs(), има math.fabs(), справка: https://docs.python.org/3.8/library/math.html#math.fabs

Тя връща дробно число като резултат, а на нас ни трябват цели числа за минутите и часовете. Пробвай да видиш какво ще се получи, ако няма int(), a e само с math.fabs() - или дава резултат с .0 накрая, или гърми.

А относно difference или minute - при така написаното решение diff се ползва, ако общият брой на минутите са < 60, иначе се прилагат вече изчислените hour и minute.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.