Начнем попорядку:
" писал(а):Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;
Описывается структура записи, Time - время в минутах, Beat - число ударов в это время.
" писал(а):times : Array[1..96] of TTimeBeats; - сам массив по полчаса на 2 дня вперед
x : Integer; так, мусор всякий
sh, sm: Integer; Start hour, Start minute
eh, em: Integer; End hour, End minute
t1, t2: Integer; Time1, Time2
sp, ep: Integer; Start Position & End Position
Описание переменных
" писал(а):For x := 1 to 48 do
begin
times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
end;
Первый элемент массива - это половина первого ночи, потом Time заполняется каждые 30 мин.
Немного посложнее с Beat - объясняю:
Х - это шаги, каждые полчаса - новый элемент массива. Известно, что число ударов от 1 до 12 каждый час, и по удару каждые полчаса. Т.е. каждый четный элемент - это целый час (х div 2). Время указывается в 24 часовом формате, а нам надо 12 часовой. Конструкция mod дает остаток от 0 до 11, а надо от 1 до 12 - отсюда единички.
" писал(а):For x := 1 to 24 do times[x*2-1].Beat := 1;
Каждые полчаса по одному удару.
" писал(а):move(times[1], times[49], 48*sizeof(TTimeBeats));
Дублируем массив, чтобы проще считать переходы на новые сутки.
" писал(а):sh := 10; sm := 25;
eh := 5; em := 20;
t1 := sh*60 + sm;
t2 := eh*60 + em;
Задаем время, переводим его в минуты
" писал(а):sp := 1;
while (t1 > times[sp].Time) do inc(sp);
Ищем начальную позицию в массиве после заданного момента времени, т.е. если задано 10:15 укажет на позицию элемента в массиве, соотв. 10:30
" писал(а):ep := sp;
if t2 < t1 then ep := 49;
while (t2 > times[ep].Time) do inc(ep);
dec(ep);
Ищем конечную позицию перед заданным моментом, если есть переход на новые сутки, то начинаем искать с позиции новых суток.
" писал(а):t1 := 0;
for x := sp to ep do inc(t1, times[x].Beat);
А теперь все что осталось - сложить число ударов в массиве с начальной по конечную позицию времени.