Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дата, Вычислить... 
V
    Опции темы
skalex
Дата 25.4.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: нет
Всего: 23



Сый, хорошая у тебя работа/развлечение ... Я подобные штуки видел когда в школе учился на уроках информатики ...  smile  было страшно и страшно по сей день!  smile  
PM   Вверх
Сый
Дата 26.4.2006, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Ну надо же такому замечательному языку программирования, как Глагол, помогать развиваться, хотя бы реализуя различные программы/алгоритмы на нём  smile  
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 27.4.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Небольшая ошибка в приведённом мной коде:

В задаче "Дней" нужно не:
Код

ЕСЛИ Високосный(Год) ТО

а:
Код

ЕСЛИ Високосный(Счётчик) ТО
 
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 27.4.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Вычислил я число прошедших веков:
Код

Веков := (Дней ДЕЛИТЬ (400*365+100*1-4*1+1))*4 + (Дней ОСТАТОК (400*365+100*1-4*1+1)) ДЕЛИТЬ (100*365+25*1-1)

Получил число целых четырёхсотлетий, умножил их на 4 (получил число веков в них), прибавил дни неполного четырёхсотлетия, делённые на число дней в сотне лет (то есть прибавил оставшиеся целые века). Как теперь правильно вычислить четырёхлетки, а далее год? 
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 28.4.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Так вычислил четырёхлетки:
Код

  Четырёхлеток := Веков*25 + (Дней ОСТАТОК (400*365+100*1-4*1+1)) ОСТАТОК (100*365+25*1-1) ДЕЛИТЬ (365*4+1);
 
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 4.5.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Вот написал, наконец-то, эту задачу:
Код

ЗАДАЧА ИзЧисла-(Дней: ЦЕЛ; День+,Месяц+,Год+:ЦЕЛ);
ПЕР
  Веков, Четырёхлеток, Годы, Дни: ЦЕЛ;
ЗАДАЧА ВыделитьМесяцы(Дни, Дней+: ЦЕЛ; Високосн: КЛЮЧ): ЦЕЛ;
ПЕР
  ч, ч1, Год: ЦЕЛ;
  Мес: РЯД 12+1 ИЗ ЦЕЛ;
УКАЗ
  Мес[0] := 0; Мес[1] := 31; ЕСЛИ Високосн
  ТО Мес[2] := 29 ИНАЧЕ Мес[2] := 28 КОН; Мес[3] := 31;
  Мес[4] := 30; Мес[5] := 31; Мес[6] := 30; Мес[7] := 31;
  Мес[8] := 31; Мес[9] := 30; Мес[10] := 31;
  Мес[11] := 30; Мес[12] := 31;
  ЕСЛИ Високосн ТО Год := 366 ИНАЧЕ Год := 365 КОН;
  ОТ ч := 12 ДО 0 ПО -1 ВЫП
    ЕСЛИ Год < Дни ТО Дней := Дни - Год; ВОЗВРАТ ч+1 КОН;
    УМЕНЬШИТЬ(Год, Мес[ч])
  КОН
КОН ВыделитьМесяцы;
УКАЗ
  Веков := (Дней ДЕЛИТЬ (400*365+100*1-4*1+1))*4 + (Дней ОСТАТОК (400*365+100*1-4*1+1)) ДЕЛИТЬ (100*365+25*1-1);
  Четырёхлеток := Веков*25 + Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ДЕЛИТЬ (365*4+1);
  ЕСЛИ Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ОСТАТОК (365*4+1) < 365*3 ТО
    Годы := Четырёхлеток*4 + (Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ОСТАТОК (365*4+1)) ДЕЛИТЬ 365 + 1;
    Дни := (Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ОСТАТОК (365*4+1)) ОСТАТОК 365
  ИНАЧЕ
    Годы := Четырёхлеток*4 + (Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ОСТАТОК (365*4+1) - 365*3) ДЕЛИТЬ 366 + 3 + 1;
    Дни := (Дней ОСТАТОК (400*365+100*1-4*1+1) ОСТАТОК (100*365+25*1-1) ОСТАТОК (365*4+1)) ОСТАТОК 366 + 3
  КОН;
  Месяц := ВыделитьМесяцы(Дни, День, Високосный(Годы));
  ЕСЛИ (Месяц = 0) И (День = 0) ТО
    Месяц := 12; День := 31; Год := Годы - 1
  ИНАЧЕ
    Год := Годы
  КОН
КОН ИзЧисла;

Так что учите Глагол  smile  
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 30.5.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Прошу оценить/протестировать готовую программу:
Код

(******************************************************************************) 
(**)                            ОТДЕЛ Дата;                                 (**) 
(******************************************************************************) 
(* НАЗНАЧЕНИЕ: основные функции для работы с календарём.                      *) 
(******************************************************************************) 

(****************************************************************************** 
 * Вычисляет, является ли год високосным. 
 ******************************************************************************) 
ЗАДАЧА Високосный-(Год: ЦЕЛ): КЛЮЧ; 
УКАЗ 
  ЕСЛИ ((Год ОСТАТОК 4 = 0) И (Год ОСТАТОК 100 # 0)) ИЛИ (Год ОСТАТОК 400 = 0) ТО 
    ВОЗВРАТ ВКЛ ИНАЧЕ ВОЗВРАТ ОТКЛ КОН 
КОН Високосный; 

(****************************************************************************** 
 * Возвращает число дней в указаном месяце. 
 ******************************************************************************) 
ЗАДАЧА ДнейВМесяце(Номер: ЦЕЛ; Високосн: КЛЮЧ): ЦЕЛ; 
УКАЗ 
  ВЫБРАТЬ Номер ИЗ 
    1: ВОЗВРАТ 31 
  | 2: ЕСЛИ Високосн ТО ВОЗВРАТ 29 ИНАЧЕ ВОЗВРАТ 28 КОН 
  | 3: ВОЗВРАТ 31 
  | 4: ВОЗВРАТ 30 
  | 5: ВОЗВРАТ 31 
  | 6: ВОЗВРАТ 30 
  | 7: ВОЗВРАТ 31 
  | 8: ВОЗВРАТ 31 
  | 9: ВОЗВРАТ 30 
  | 10: ВОЗВРАТ 31 
  | 11: ВОЗВРАТ 30 
  | 12: ВОЗВРАТ 31 
  ИНАЧЕ ВОЗВРАТ 0 КОН 
КОН ДнейВМесяце; 

(****************************************************************************** 
 * Переводит дату в число дней, прошедших от начала 1 года н. э. (числовое 
 * представление даты). Года до н. э. (отрицательные или 0) считаются как 1-й 
 * год н. э. 
 ******************************************************************************) 
ЗАДАЧА ВЧисло-(День, Месяц, Год: ЦЕЛ): ЦЕЛ; 
ПЕР 
  Результат, Рез, ч, Счётчик: ЦЕЛ; 
УКАЗ 
  Результат := 0; 
  ОТ Счётчик := 1 ДО Год-1 ВЫП 
    ЕСЛИ Високосный(Счётчик) ТО УВЕЛИЧИТЬ(Результат, 366) ИНАЧЕ УВЕЛИЧИТЬ(Результат, 365) КОН; 
  КОН; 
  ОТ ч := 1 ДО Месяц ВЫП 
    УВЕЛИЧИТЬ(Результат, ДнейВМесяце(ч-1, Високосный(Год))) 
  КОН; 
  ВОЗВРАТ Результат + День 
КОН ВЧисло; 

(****************************************************************************** 
 * Переводит число дней, прошедших от начала 1 года н. э. в дату. 
 * Задачи вГод, вМесяц и вДень возвращают соответственно год, месяц и день 
 * отдельно друг от друга, используя задачу ИзЧисла. 
 ******************************************************************************) 
ЗАДАЧА ИзЧисла-(Дней: ЦЕЛ; День+,Месяц+,Год+:ЦЕЛ); 
ПЕР 
  Годы, Дни: ЦЕЛ; 
ЗАДАЧА ДеньИМесяц(Дн, Дн1+: ЦЕЛ; Високосн: КЛЮЧ): ЦЕЛ; 
ПЕР 
  ч, ч1, Гд: ЦЕЛ; 
УКАЗ 
  ЕСЛИ Високосн ТО Гд := 366 ИНАЧЕ Гд := 365 КОН; 
  ОТ ч := 12 ДО 0 ПО -1 ВЫП 
    ЕСЛИ Гд < Дн ТО Дн1 := Дн - Гд; ВОЗВРАТ ч+1 КОН; 
    УМЕНЬШИТЬ(Гд, ДнейВМесяце(ч, Високосн)) 
  КОН 
КОН ДеньИМесяц; 
УКАЗ 
  ЕСЛИ Дней ОСТАТОК 146097 ОСТАТОК 36524 ОСТАТОК 1461 < 1095 ТО 
    Годы := (((Дней ДЕЛИТЬ 146097) * 4 + (Дней ОСТАТОК 146097) ДЕЛИТЬ 36524) 
            * 25 + Дней ОСТАТОК 146097 ОСТАТОК 36524 ДЕЛИТЬ 1461) 
            * 4 + (Дней ОСТАТОК 146097 ОСТАТОК 36524 ОСТАТОК 1461) ДЕЛИТЬ 365 + 1; 
    Дни := (Дней ОСТАТОК 146097 ОСТАТОК 36524 ОСТАТОК 1461) ОСТАТОК 365 
  ИНАЧЕ 
    Годы := (((Дней ДЕЛИТЬ 146097) * 4 + (Дней ОСТАТОК 146097) ДЕЛИТЬ 36524) 
            * 25 + Дней ОСТАТОК 146097 ОСТАТОК 36524 ДЕЛИТЬ 1461) 
            * 4 + (Дней ОСТАТОК 146097 ОСТАТОК 36524 ОСТАТОК 1461 - 1095) ДЕЛИТЬ 366 + 4; 
    Дни := Дней ОСТАТОК 146097 ОСТАТОК 36524 ОСТАТОК 1461 ОСТАТОК 366 + 3 
  КОН; 
  Месяц := ДеньИМесяц(Дни, День, Високосный(Годы)); 
  ЕСЛИ (Месяц = 0) И (День = 0) ТО 
    Месяц := 12; День := 31; Год := Годы - 1 
    (* Обработка частных случаев *) 
      АЕСЛИ (Месяц = 12) И (День = 31) ТО Год := Годы - 1 
      АЕСЛИ День > 31 ТО Месяц := 12; День := 31; Год := Годы - 1 
      АЕСЛИ Месяц > 12 ТО Месяц := 1; Год := Годы; 
        ЕСЛИ (НЕ Високосный(Годы)) И (Годы ОСТАТОК 100 = 0) И (Месяц = 1) И (День < 4) ТО 
          ЕСЛИ День = 1 ТО 
            Месяц := 12; День := 31; Год := Годы - 1 ИНАЧЕ УМЕНЬШИТЬ(День); Год := Годы КОН 
        КОН 
      АЕСЛИ (Месяц = 0) И (День < 31) ТО Месяц := 12; УВЕЛИЧИТЬ(День) 
  ИНАЧЕ 
    Год := Годы 
  КОН 
КОН ИзЧисла; 

(******************************************************************************) 
ЗАДАЧА вГод-(Дней: ЦЕЛ): ЦЕЛ; 
ПЕР 
  д, м, г: ЦЕЛ; 
УКАЗ 
  д := 0; м := 0; г := 0; 
  ИзЧисла(Дней, д, м, г); 
  ВОЗВРАТ г 
КОН вГод; 

ЗАДАЧА вМесяц-(Дней: ЦЕЛ): ЦЕЛ; 
ПЕР 
  д, м, г: ЦЕЛ; 
УКАЗ 
  д := 0; м := 0; г := 0; 
  ИзЧисла(Дней, д, м, г); 
  ВОЗВРАТ м 
КОН вМесяц; 

ЗАДАЧА вДень-(Дней: ЦЕЛ): ЦЕЛ; 
ПЕР 
  д, м, г: ЦЕЛ; 
УКАЗ 
  д := 0; м := 0; г := 0; 
  ИзЧисла(Дней, д, м, г); 
  ВОЗВРАТ д 
КОН вДень; 

(****************************************************************************** 
 * Возвращает число дней, которое необходимо прибавить к дате, чтобы перевести её 
 * из даты Грегорианского календаря в дату Юлианского календаря (старый стиль), 
 * используя числовое представление текущей даты. 
 ******************************************************************************) 
ЗАДАЧА СтарыйСтиль-(Дней: ЦЕЛ): ЦЕЛ; 
ПЕР 
  Век: ЦЕЛ; 
УКАЗ 
  Век := (Дней ДЕЛИТЬ (400*365+100*1-4*1+1))*4 + (Дней ОСТАТОК (400*365+100*1-4*1+1)) ДЕЛИТЬ (100*365+25*1-1) + 1; 
  ВОЗВРАТ (Век - ((Век - 1) ДЕЛИТЬ 4) - 3) 
КОН СтарыйСтиль; 

(****************************************************************************** 
 * Возвращает номер текущего дня недели (1 - понедельник, ..., 7 - воскресенье), 
 * используя числовое представление текущей даты. 
 ******************************************************************************) 
ЗАДАЧА ДеньНедели-(Дней: ЦЕЛ): ЦЕЛ; 
ПЕР 
  Добав : УЗКЦЕЛ; 
  гггг, мм, дд : ЦЕЛ; 
УКАЗ 
  ИзЧисла(Дней, дд, мм, гггг); 
  ЕСЛИ мм < 3 ТО 
     Добав := 1 
  ИНАЧЕ 
     Добав := 0; 
  КОН; 
  ВОЗВРАТ (( 3 * гггг - (7 * (гггг + (мм + 9) ДЕЛИТЬ 12)) ДЕЛИТЬ 4 + 
          (23 * мм) ДЕЛИТЬ 9 + дд + 2 + ((гггг - Добав) ДЕЛИТЬ 100 + 1) * 
          3 ДЕЛИТЬ 4 - 16) ОСТАТОК 7) + 1 
КОН ДеньНедели; 

КОН Дата.
 
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.