Представить число

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Представить число

Re: Представить число

Колядин Максим » 25 дек 2006, 23:56

Да уж... На первый взгляд задачка-то лёгкая. Только на первый взгляд. Спасибо за подробное пояснение, после него я понял, что ты очень-очень умный, и что я очень while глупый...

Re: Представить число

somewhere » 25 дек 2006, 21:22

Начнем попорядку:
&quot писал(а):Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;
Описывается структура записи, Time - время в минутах, Beat - число ударов в это время.
&quot писал(а):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
Описание переменных
&quot писал(а):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 - отсюда единички.
&quot писал(а):For x := 1 to 24 do times[x*2-1].Beat := 1;
Каждые полчаса по одному удару.
&quot писал(а):move(times[1], times[49], 48*sizeof(TTimeBeats));
Дублируем массив, чтобы проще считать переходы на новые сутки.
&quot писал(а):sh := 10; sm := 25;
eh := 5; em := 20;
t1 := sh*60 + sm;
t2 := eh*60 + em;
Задаем время, переводим его в минуты
&quot писал(а):sp := 1;
while (t1 > times[sp].Time) do inc(sp);
Ищем начальную позицию в массиве после заданного момента времени, т.е. если задано 10:15 укажет на позицию элемента в массиве, соотв. 10:30
&quot писал(а):ep := sp;
if t2 < t1 then ep := 49;
while (t2 > times[ep].Time) do inc(ep);
dec(ep);
Ищем конечную позицию перед заданным моментом, если есть переход на новые сутки, то начинаем искать с позиции новых суток.
&quot писал(а):t1 := 0;
for x := sp to ep do inc(t1, times[x].Beat);
А теперь все что осталось - сложить число ударов в массиве с начальной по конечную позицию времени.

Re: Представить число

Колядин Максим » 25 дек 2006, 20:14

times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
Можно обьяснить смысл... я не пойму зачем это. И вообще, если можно, поясни ход своих действий. А за задачу - спасибо, работает на 5+...

Re: Представить число

somewhere » 25 дек 2006, 17:50

В принципе, идея такая. Будет массив из записей: в каждой есть время в минутах и число ударов на это время. Первый элемент соответствует 0:30, и далее по полчаса. Минуты записываются с учетом 24 часового времени, число ударов по формуле с учетом 12 часового. Потом вычисляем элементы массива соотв. начальному и конечному времени, которые пересекут данный интервал. Массив был удлинен в 2 раза чтобы проще считать циклическое время. Вообщем будут вопросы, пишите :-)

Код: Выделить всё

uses Crt;

Type
TTimeBeats = Record  Time : Word;
		     Beat : Word;
		end;

var
times : Array[1..96] of TTimeBeats;
x     : Integer;
sh, sm: Integer;
eh, em: Integer;
t1, t2: Integer;
sp, ep: Integer;

begin
For x := 1 to 48 do
	begin
	times[x].Time := x*30;
        times[x].Beat := ((x div 2)-1) mod 12 + 1;
        end;
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);
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);
Writeln('Beats : ', t1);

end.

Re: Представить число

Хыиуду » 25 дек 2006, 15:15

Задачка интересная. Главные загвоздки - 12-часовая система (или все-таки 24-часовая?) и переход через полночь. В общем, я так думаю, надо разбивать весь заданный интервал на промежутки, границами которого являются границы заданного, полдень и полночь, и просчитывать количество ударов в каждом промежутке. Подробнее сейчас времени просто нет расписывать.

Re: Представить число

Колядин Максим » 25 дек 2006, 14:36

Я так конечно же пробывал, - неполучается... почему-то. Наверное с компом проблемы..Только вот так

Код: Выделить всё

u:=1; j:=2;
for i:= 1 to 24 do
x[1]:=1;
while j<>24 do begin
x[1+u]:=1+u;
u:=u+1;
j:=j+1;
end;
Ну всё равно, спасибо! И ещё, вы не могли бы помоч с задачкой -
____
Старинные часы бьют каждые полчаса. Причем в начале каждого часа они бьют столько раз, сколько сейчас часов (по 1 разу – в час ночи и в час дня, по 2 раза – в два часа ночи в два часа дня и т.д., в полночь и в полдень они бьют, соответственно, по 12 раз). И еще 1 раз они бьют в середине каждого часа.
Дан промежуток времени (известно, что прошло строго меньше 24 часов). Напишите программу, определяющую, сколько ударов сделали часы за это время.

Здесь вроде тоже ничего сложного вот что начеркал (ещё не доделал);

Код: Выделить всё

uses crt;
var  c,m,kc,km,otv,i,sum,y,u,j,r: integer;
x: array [1..24] of integer;

begin
clrscr;
writeln('Начальное время.');
read(c); gotoxy(3,2); write(':'); readln(m);
writeln('Конечное время.');
read(kc);gotoxy(3,4); write(':'); readln(km);
u:=1; j:=2;

for i:= 1 to 24 do
x[1]:=1;
while j<>24 do begin
x[1+u]:=1+u;
u:=u+1;
j:=j+1;
{the}end;

{-------------Инициализация часов-----------}
u:=1;j:=0;r:=13;


if c=0 then c:=12;
while j<>24 do begin
if c=r then c:=u;
inc(j);
inc(r);
inc(u);
end;

u:=1;j:=0;r:=13;

if kc=0 then kc:=12;
while j<>24 do begin
if kc=r then kc:=u;
inc(j);
inc(r);
inc(u);
end;
{---------------------------------------}

for i:= c to kc do begin
sum:=sum+x[i];
end;

if sum=0 then begin
 for i:= c downto kc do sum:=sum+x[i];
   end;


if km-m>=30 then sum:=sum+1;
writeln('Стукнуло ',sum,' раз');
readkey;
end. 
Время трудно полностью инициализировать....
Вот примеры входных и выходных данных
Ввод: 5 :20
10:25
Вывод: 45
Ещё,
Ввод: 10 :25
5 :20
Вывод: 135
....Как тут полностью доделать????

Re: Представить число

shpi0 » 25 дек 2006, 10:42

да, можно. я написал чтоб человеку по аналогии понятно было

Re: Представить число

Хыиуду » 25 дек 2006, 09:55

shpi0 писал(а):

Код: Выделить всё

FOR i:= 1 to 10 do begin
 m[i]:=i;
end;
Здесь можно даже без бегина и энда

Re: Представить число

shpi0 » 25 дек 2006, 08:46

Код: Выделить всё

FOR i:= 1 to 10 do begin
 m[i]:=i;
end;

Re: Представить число

Колядин Максим » 24 дек 2006, 22:25

Извините, поспешил с вопросом - уже сам решил. Задача была действительно лёгкой. Но меня волнует ещё один нетрудный, но, как бы это ни было удевительно, для меня неизвестный вопрос. Даже не знаю как вам его описать... Кароче, нужно чтобы элементы массива не вводить самому, а чтобы они шли в последовательном порядке (var mas: array [1..5] of integer; элементы массива - 1, 2, 3, 4, 5.).
___
Если не поняли в чём вопрос, тогда рассмотрите следующий пример:
[C]Написать программу, которая сначала вводит 10 чисел, затем определяет сумму элементов массива и выдаёт результат на экран[/C]

Код: Выделить всё

program ex_1;
var m: array [1..10] of real; {декларация массива}
      i: integer;                      {параметр цикла FOR}
      s: real;                          {сумма}
FOR i:= 1 to 10 do begin
   writeln('ВВедите элемент массива №',i);
   readln(m[i]);
 end;
s:=0;
FOR i:= 1 to 30 do s:=s+m[i];
writeln('Cумма элементов массива равна ',s);
readln;
END.
Сдесь нужно вводить элементы массива

Код: Выделить всё

....
FOR i:= 1 to 10 do begin
   writeln('ВВедите элемент массива №',i);
   readln(m[i]);
 end;
....
А мне нужно, как я уже сказал, чтобы элементы шли в последовательном порядке (в данном случае это 1,2,3,4,5,6,7,8,9,10).
_____
Заранее благодарен...

Вернуться к началу