![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Дано:
Код:
type месяц = ( янв, фев, мар, апр, май, июн, июл, авг, сен, окт, ноя, дек ); var k1:1..366; d:1..31; m:месяц; d, m - дату k-го по счету дня невисокосного года (о присвоенных значениях сообщить). Задачку решил, используя case для вычислений, но беда в том, что использовать его можно только для вывода... все вычисления должны происходить до него... Не прошу решить полностью, хотя бы натолкните в какую сторону думать. Буду очень благодарен ![]() |
|
#2
|
||||
|
||||
|
Как я понял, это задачка из универовских/школьных? Какие же программисты оттуда выйдут...
Вопщем, создай константу-массив с количеством дней в месяцах. А дальше цикл while и Код:
dec(k1,ЧИСЛО_ДНЕЙ_В_МЕСЯЦЕ[m]); inc(m); |
|
#3
|
|||
|
|||
|
Не в специалистах проблема.
Если бы мне можно было создать константу-массив, я бы ее создал или по-другому как-то решил. В этом и проблема, что решить нужно стандартными способами (div, mod) или что-то в этом роде, ну циклы само-собой разумеется можно использовать... Вот такой у нас бзик. |
|
#4
|
||||
|
||||
|
Это и есть стандартный способ. Хотя бы в исходники Дельфи заглянул для интереса.
Код:
type
PDayTable = ^TDayTable;
TDayTable = array[1..12] of Word;
const
MonthDays: array [Boolean] of TDayTable =
((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
function IsLeapYear(Year: Word): Boolean;
begin
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
function DoEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean;
var
I: Integer;
DayTable: PDayTable;
begin
Result := False;
DayTable := @MonthDays[IsLeapYear(Year)];
if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
(Day >= 1) and (Day <= DayTable^[Month]) then
begin
for I := 1 to Month - 1 do Inc(Day, DayTable^[i]);
I := Year - 1;
Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
Result := True;
end;
end;
procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
const
D1 = 365;
D4 = D1 * 4 + 1;
D100 = D4 * 25 - 1;
D400 = D100 * 4 + 1;
var
Y, M, D, I: Word;
T: Integer;
DayTable: PDayTable;
begin
T := DateTimeToTimeStamp(Date).Date;
if T <= 0 then
begin
Year := 0;
Month := 0;
Day := 0;
end else
begin
Dec(T);
Y := 1;
while T >= D400 do
begin
Dec(T, D400);
Inc(Y, 400);
end;
DivMod(T, D100, I, D);
if I = 4 then
begin
Dec(I);
Inc(D, D100);
end;
Inc(Y, I * 100);
DivMod(D, D4, I, D);
Inc(Y, I * 4);
DivMod(D, D1, I, D);
if I = 4 then
begin
Dec(I);
Inc(D, D1);
end;
Inc(Y, I);
DayTable := @MonthDays[IsLeapYear(Y)];
M := 1;
while True do
begin
I := DayTable^[M];
if D < I then Break;
Dec(D, I);
Inc(M);
end;
Year := Y;
Month := M;
Day := D + 1;
end;
end;Перебори свою лень. |
|
#5
|
|||
|
|||
|
Если бы это была лень, я бы не мучил людей на форуме.
Просто четко сказано: никаких функций, case только для вывода, по максимуму использовать перечисляемый тип и уж точно никаких массивов. |
|
#6
|
||||
|
||||
|
Я плюсану репутацию тому, кто кодом докажет, что возможно выполнить все эти условия.
|
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
я то понимаю, что деление бесполезно.
Как писал выше, предлагаемые вами способы использовать нельзя. вариант решения, с использование case делал, показывал, забраковали) Ладно, пойду юзать, если долго мучиться, может и получится) |