Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие языки > [Глагол] Определение дня по дате


Автор: Сый 15.2.2006, 16:34
Вычисления дня недели по дате (даты ранее 1918 года будут обрабатываться неправильно). Интересный алгоритм (на Глаголе), давно искал, вот и решил с вами поделиться:
Код

ОТДЕЛ ДеньНедели+; 

ИСПОЛЬЗУЕТ Параметр ИЗ "...\Отделы\Обмен\", 
           Текст    ИЗ "...\Отделы\Числа\", 
           Вывод    ИЗ "...\Отделы\Обмен\"; 

ПЕР 
  ДеньНедели : РЯД 15 ИЗ ЗНАК; 
  годЗ, месяцЗ, деньЗ : РЯД 5 ИЗ ЗНАК; 
  год, месяц, день : ЦЕЛ; 

ЗАДАЧА Считать(гггг, мм, дд : ЦЕЛ) : ЦЕЛ; 
ПЕР 
  Добав : УЗКЦЕЛ; 
УКАЗ 
  ЕСЛИ мм < 3 ТО 
     Добав := 1 
  ИНАЧЕ 
     Добав := 0; 
  КОН; 
  ВОЗВРАТ ((( 3 * гггг - (7 * (гггг + (мм + 9) ДЕЛИТЬ 12)) ДЕЛИТЬ 4 + 
          (23 * мм) ДЕЛИТЬ 9 + дд + 2 + ((гггг - Добав) ДЕЛИТЬ 100 + 1) * 
          3 ДЕЛИТЬ 4 - 16) ОСТАТОК 7)) + 1; 
КОН Считать; 

УКАЗ 
  ЕСЛИ Параметр.всего <= 1 ТО Вывод.Цепь("Вычисление дня недели по дате.^Введите день, месяц и год (в числовом виде) в качестве параметров к программе.") 
  ИНАЧЕ 
    Параметр.Текст(1,деньЗ); Параметр.Текст(2,месяцЗ); Параметр.Текст(3,годЗ); 
    год := УЗК(Текст.ВЦел(годЗ)); месяц := УЗК(Текст.ВЦел(месяцЗ)); день := УЗК(Текст.ВЦел(деньЗ)); 
    ВЫБРАТЬ Считать(год, месяц, день) ИЗ 
        1: ДеньНедели := "понедельник"; 
      | 2: ДеньНедели := "вторник"; 
      | 3:ДеньНедели  := "среда"; 
      | 4:ДеньНедели  := "четверг"; 
      | 5:ДеньНедели  := "пятница"; 
      | 6:ДеньНедели  := "суббота"; 
      | 7:ДеньНедели  := "воскресенье"; 
    ИНАЧЕ КОН; 
    Вывод.Цепь(деньЗ); Вывод.Цепь("."); 
    Вывод.Цепь(месяцЗ); Вывод.Цепь("."); 
    Вывод.Цепь(годЗ); Вывод.Цепь(" - "); 
    Вывод.Цепь(ДеньНедели);  Вывод.Цепь("."); 
  КОН; 
КОН ДеньНедели.

Автор: SoWa 15.2.2006, 21:05
Корявый какой-то язык.
Попытаюсь понять, как работает.

Автор: Jilian 15.2.2006, 21:13
Уж лучше написать на С++ или Delphi, но с понятными идентификаторами, в самом деле, так очень сложно разобраться...

Автор: Akina 16.2.2006, 00:20
Господи, зачем? Практически в любом языке есть форматирование даты в нужный формат, в т.ч. с днем недели. А во многих - и непосредственно получение дня недели по дате.

Если нет - используем API.

Автор: dpa 16.2.2006, 00:58
O tempora! O mores!


Цитата(Akina @ 16.2.2006, 00:20 Найти цитируемый пост)
Практически в любом языке есть форматирование даты в нужный формат, в т.ч. с днем недели. А во многих - и непосредственно получение дня недели по дате


А многие не знают как это работает... По моему, пост интересный, в отличие от многих...
Господа, API - не панацея!

ЗЫ
Жаль плюсы лепить не могу. В общем <+> заочно ;)

Автор: Akina 16.2.2006, 09:48
Цитата(dpa @ 16.2.2006, 01:58 Найти цитируемый пост)
А многие не знают как это работает... По моему, пост интересный, в отличие от многих...

Если человеку нужен именно день недели - он использует встроенную или API-функцию.
Если ему просто интересно - он набирает в Гугеле (или где больше нравится) "определение дня недели" и получает вагон ссылок, половина из которых - с кодом, половина которого либо комментирована, либо настолько проста, что в комментариях не нуждается.

А если ему срочно нужно, а он начинет искать не "как", а "почему" - он просто дурак.

Автор: Сый 16.2.2006, 20:32
> Господи, зачем? Практически в любом языке есть форматирование даты в нужный формат, в т.ч. с днем недели. А во многих - и непосредственно получение дня недели по дате. Если нет - используем API.
Я не говорил, что это единственный рабочий алгоритм, и что иначе никак нельзя произвести данные вычисления. Я привёл этот алгоритм для тех, кому это интересно, я же никого не заставляю разбираться в нём и использовать только его.

> Корявый какой-то язык. Попытаюсь понять, как работает.
> Уж лучше написать на С++ или Delphi, но с понятными идентификаторами, в самом деле, так очень сложно разобраться...
Ничего подобного. Красивый язык, понятные идентификаторы. Вкратце объясняю принцип работы всей программки: сперва определяются и присваиваются параметры, переданные через командную строку, преобразуются в числовой вид, потом, используя полученные данные, вызывается задача Считать, в которой и заключён этот алгоритм. Перебираются 7 вариантов ответа этой задачи, в зависимости от которого и выводится названия дня недели.

> Жаль плюсы лепить не могу. В общем <+> заочно ;)
Спасибо smile

Автор: III.nfo 17.2.2006, 23:07
Это уже обсуждалось http://forum.vingrad.ru/index.php?showtopic=35160&st=0&#entry261431.

Автор: Сый 18.2.2006, 08:54
> Это уже обсуждалось здесь.
Ну там приведён алгоритм на С++, а тут на Глаголе (паскалевидном языке).

Автор: SoWa 18.2.2006, 20:35
Пиши на Алголе тогда. Не режь нам глаза, а?

Автор: Сый 18.2.2006, 22:59
Нет уж. Предпочитаю писать по-русски даже исходные тексты программ.

Автор: maxim1000 19.2.2006, 00:39
Модератор:
обсуждение языков никак не соответствует тематике этого форума
Добавлено @ 00:50
думал разделить тему на две: в Алгоритмах оставить те сообщения, которые относятся к обсуждению самого алгоритма...
и, представьте себе, не нашел таких
цирк smile
а учитывая
Цитата(Сый @ 18.2.2006, 07:54 Найти цитируемый пост)
> Это уже обсуждалось здесь.
Ну там приведён алгоритм на С++, а тут на Глаголе (паскалевидном языке).

и первое сообщение можно не оставлять...
переношу "Красную книгу"...

Автор: Cr@$h 24.2.2006, 01:05
Цитата(SoWa @ 18.2.2006, 21:35 Найти цитируемый пост)
Пиши на Алголе тогда. Не режь нам глаза, а?

smile Стоп. Алгол полностью вымер. smile Программистское сообщество понесло большие потери, особенно в СССР, уделив слишком много внимания этому языку и придав ему особенное значение. Тем не менее, очень много хороших алгоритмов написанно именно на нем. Против языка ничего не имею, но считаю его перегруженным и не глубоко продуманным (например, взять подвижные массивы).

Автор: Cr@$h 25.8.2006, 17:25
Цитата(dpa @  16.2.2006,  01:58 Найти цитируемый пост)
Жаль плюсы лепить не могу. В общем <+> заочно ;) 


Добавлено @ 17:32 

M
Cr@$h
Done.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)