Другие языки программирования и технологии

Подскажите пожалуйста, какая ошибка в программе на Pascal ABC.NET?

Давалась задача: Иван уже давно занимается карате и мечтает попасть на Олимпийские игры. И тут он узнаёт, что в программу Олимпийских
игр в Токио впервые включено карате. Иван задумался - а как же нужно проводить тренировки спортсменам, живущим в разных

часовых поясах, чтобы «подстроить» биоритмы под токийское время?

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

проживает спортсмен.

Время соревнований – число t от 1 часа до 12 часов (в стране «восходящего солнца» все соревнования начинаются до полудня :) и

часовой пояс – число N от -11 до +12. Часовой пояс Японии принято считать +9.

В результате программа должна вывести одно число Х - начало тренировки спортсмена по своему местному времени,

соответствующему времени начала соревнований в Токио.

Входные данные.

Во входных данных в первой строке вводят два целых числа, разделенные одним пробелом: t (1<= t <=12) и N (-11<= N <= +12).

Выходные данные.

В выходных данных вывести одно целое число X (1<= X <=24) – начало тренировки по местному времени.

Я - новичок в программировании, поэтому не обессудьте. Написала такую программу:

var

t, N: integer;

X, c: real;

begin

writeln ('Введите Ваше местное время и через пробел Ваш часовой пояс');

readln (t, N);

while (t>=1)and(t<=12) do

while (N>=1)and(N<=12) do

c:= (t -(9 - N));

if c > 0 then X:=(c)

else

if c < 0 then X:= 24 - abs(c);

writeln (X)

end.

Программа запускается, но решения не даёт. Скажите пожалуйста, в чём проблема?
Программа зацикливается тут

while (t>=1) and (t<=12) do
while (N>=1)and(N<=12) do

и бесконечно выполняется c:= (t -(9 - N));

Зачем вообще эти 2 цикла нужны?

А если вам нужна проверка корректности ввода, то лучше это сделать так:

var
t, N: integer;
X, c: real;
begin
repeat
writeln ('Введите Ваше местное время и через пробел Ваш часовой пояс');
readln (t, N);
until (t>=1) and (t<=12) and (t>=1) and (t<=12);
c:= (t -(9 - N));
if c > 0 then X:=(c)
else
if c < 0 then X:= 24 - abs(c);
writeln (X)
end.
Серик Кобелдесов
Серик Кобелдесов
95 712
Лучший ответ
Евгений Коваленко Спасибо за разъяснение! Я просто хотела как-то уместить два значения, т. е. 1<=t<=12 1<=N<=12 так, чтобы они непременно выполнялись. Вот и попробовала "выкрутиться" с помощью while.
Евгений Коваленко Спасибо! Программа действительно заработала!
Задача решается одним элементарным выражением БЕЗ циклов и БЕЗ условий:
readln(t, N);
writeln((t - 1 - 9 + N + 24) mod 24 + 1);

И НИКАКИХ real в задаче быть не может.

t - 1 - приводим время к диапазону 0..23
t - 1 - 9 - время относительно нулевого часового пояса
t - 1 - 9 + N - время в часовом поясе спортсмена
t - 1 - 9 + N + 24 - добавляем сутки: чтобы время всегда было >= 0
(t - 1 - 9 + N + 24) mod 24 - время внутри суток в диапазоне 0..23
(t - 1 - 9 + N + 24) mod 24 + 1 - искомое время

Упрощая получаем:
(t + N + 14) mod 24 + 1
Евгений Коваленко Попробовала Ваш вариант! Сработало! Спасибо Вам большое!