Разместите нашу кнопку!

Новые статьи:

Programming articles

Создание сайтов на шаблонах

Множество вариантов работы с графикой на канве

Шифруем файл с помощью другого файла

Перехват API функций - Основы

Как сделать действительно хороший сайт

Создание почтового клиента в Delphi 7

Применение паскаля для решения геометрических задач

Управление windows с помощью Delphi

Создание wap сайта

Операционная система unix, термины и понятия

SQL враг или друг

Возникновение и первая редакция ОС UNIX

Оптимизация проекта в Delphi

Ресурсы, зачем нужны ресурсы

Термины программистов 20 века

Советы по созданию собственного сайта с нуля

Шифруем файл с помощью пароля

Фракталы - геометрия природы

Crypt - Delphi программа для шифрования

Рассылка, зачем она нужна и как ее организовать?

Учебник по C++ для начинающих программистов

Уроки для изучения ассемблера

Загадочный тип PCHAR

Средства по созданию сайтов

Операторы преобразования классов is и as

Borland Developer studio 2006. Всё в одном

Создание базы данных в Delphi, без сторонних БД


Software engineering articles



Архив рассылки

    В нашей рассылке вы узнаете о новых статьях, программах, и темах на форуме. Рассылка выходит один раз в неделю, каждый четверг.
Подписаться на рассылку можно в этой форме:
Клуб программистов
Последний выпуск

2 выпуск

Последний выпуск

КЛУБ ПРОГРАММИСТОВ

в рассылке статьи, ссылки, инфо и многое другое о программировании и программистах

Новости

Лабораторные работы

Справочники

Книги

Основы Delphi

Клуб

Чат

Форум

От ведущего

Приветствую всех подписчиков "Клуба программистов". Иногда я , ведущий рассылки, буду появляться в выпусках с рубрикой "От редактора". Сегодня я приглашаю вас всех на наш форум . Здесь постоянно идут обсуждения проблем, связанных не только с программированием, но и с многими другими вещами.

А также всех подписчиков призываю принять участие в обсуждении нашей рассылки, перспектив ее развития. Вы можете высказать свое мнение здесь . Мой ник на форуме - Hallo , так что обращайтесь.

__________________________________________________________

 

Нестандартные функции работы с датой/временем

Язык программирования Borland Delphi в своем составе содержит огромное количество функций для работы с типом данных TDateTime (внутренним форматом BorlandDelphi описывающим обобщенный формат дата/время) , позволяющие производить практически любые манипуляции с вышеуказанными типами данных. Однако, при всем этом изобилии ощущается острая нехватка более статистических функций таких например сложение периодов трудовой деятельности или вычитание праздничных дней из отпуска сотрудника. Если, чего-то нехватает, то требуется это реализовать, что собственно и толкнуло к написанию этой статьи.

Задача первая:

    Что, получиться если мы вычтем одну дату из другой? Правильный ответ на этот вопрос, будет период работы, а что нам скажет Delphi?

     23.01.07- 21.11.06= 03.03.1900 круто, да … и кто же из нас не прав, черт побери. Общепризнанной практикой исчисления стажа является, примерно такой алгоритм.
23.01.07 -
21.11.06
-------------
2

    Итого 2 месяца 2 дня. Два месяца получились при переброске года в месяцы (12 месяцев). Вот этот алгоритм и требуется описать. Сразу сойдемся на мнении, что в году у нас 360 дней (12 месяцев по 30 дней), это, по-моему, еще из Excel вылезло. Алгоритм очень простой мы расщепляем дату на дни месяцы и годы, и производим, то, что выше указанно, а ответ мы вернем в виде строки.

function Period(BeginDate, EndDate: Tdatetime): string;
var
SubDate:Tdatetime;
md,mm,my:integer;
begin
SubDate:=EndDate-BeginDate;
md:=dayof(EndDate)-dayof(begindate);
mm:=monthof(EndDate)-monthof(begindate);
my:=yearof(EndDate)-yearof(begindate);
if md<0 then begin
         md:=md+30;
         mm:=mm-1;
         end;
if mm<0 then begin
         my:=my-1;
         mm:=mm+12;
         end;
Period:=inttostr(md)+'.'+inttostr(mm)+'.'+inttostr(my);
end;


    Вот таким образом вы считаем период работы.

Задача вторая:

    Что же дальше? Период мы почитали, а теперь надо сложить периоды, что бы не шокировать себя, складывать TDateTime'ы мы не станем. А сразу напишем функцию, которая сложит нам две даты, полученные в прошлой задачке.

function SummaPeriod(BeginDate, EndDate: string): string;
var
bd,bm,by:integer;
ed,em,ey:integer;
sd,sm,sy:integer;
begin
randomize;
bd:=dayof(strtodate(BeginDate));
bm:=monthof(strtodate(BeginDate));
by:=yearof(strtodate(BeginDate))-2000;
ed:=dayof(strtodate(EndDate));
em:=monthof(strtodate(EndDate));
ey:=yearof(strtodate(EndDate))-2000;
sd:=bd+ed;
sm:=bm+em;
sy:=by+ey;
if sd>=30 then
         begin
         sd:=sd-30;
         sm:=sm+1;
         end;
if sm>=12 then
         begin
         sm:=sm-12;
         sy:=sy+1;
         end;
SummaPeriod:=inttostr(sd)+'.'+inttostr(sm)+'.'+inttostr(sy);
end;


     Сразу предвижу ваш вопрос, а что это за хрень? by:=yearof(strtodate(BeginDate))-2000; Вы можете разложить строку и получить то, же самое.

Задача третья:

     Имеется период работы, описанный двумя переменными типа TdateTime (начало периода и конец периода) требуется определить входит некоторая дата в этот интервал. Сложность заключается, прежде всего, в том, что невозможно описать тип TdateTime без указания года. Как, например, в случае 23 февраля, 8 марта, новый год (самый веселый праздник). Для описания веселых "Красных дней календаря" будем использовать тип String. Функция, которая определяет вхождение даты в заданный диапазон, получилась примерно такой:

function Holydays(BeginDate, EndDate: Tdatetime;holyday: string): integer;
var
output:integer;
md:string;
begin
md:=holyday+'.'+inttostr(yearof(EndDate));
if (CompareDateTime(strtodate(md), EndDate)<=0) and
     (CompareDateTime(BeginDate,strtodate(md))<=0)then
         begin
         output:=1;
         end else output:=0;
if output=0 then
       begin
md:=holyday+'.'+inttostr(yearof(BeginDate));
if (CompareDateTime(strtodate(md), EndDate)<=0) and
       (CompareDateTime(BeginDate,strtodate(md))<=0)then
         begin
         output:=1;
         end else output:=0;
         end;
Holydays:=output;
end;


    Если в результате выполнения получается "1", то дата в заданный диапазон входит, в противном случае нет.
    Рассмотрим алгоритм действий данной функции поподробнее. BeginDate - начало периода, EndDate - окончание периода, holyday - собственно праздник (в формате "23.02") md:=holyday+'.'+inttostr(yearof(EndDate)); - приводим дату праздника в соответствие с типом TDateTime значение года берется из окончания периода (для случая, когда начало периода, было в одном году, а окончание уже в другом). После чего проводим проверку на вхождение в заданный диапазон:

if (CompareDateTime(strtodate(md), EndDate)<=0) and
      (CompareDateTime(BeginDate,strtodate(md))<=0)then
         begin
         output:=1;
         end else output:=0;


    Но, не все так гладко как может показаться, в случае с входными данными вида начало периода- 27.11.06, окончание периода - 10.01.07, праздник 29.11 (маловероятно звучит, но у нас и такие чудеса бывают), а посему мы приводим дату в соответствие md:=holyday+'.'+inttostr(yearof(BeginDate)); и работает! Вот такая полезная статистическая функция получилась. Теперь можно создавать базу данных русских праздников и вычитать их из отпуска сотрудника. -- С уважением, Антон mailto:AntonCH82@mail.ru .

Обсуждение на форуме . Автор статьи: Антон Черноусов .

__________________________________________________________

 

Полезная программа

Визуальный редактор графов

Это именно Визуальный редактор графов, аналогов редактора мне не известно, все алгоритмы классические, а вот реализация их моя, авторская (а библиотеки алгоритмов в инете есть :).
Графы (матрицы смежности и стоимости) хранятся в текстовом виде, файлы .tgr, в перспективе переход на международный формат .gml (текст с разметкой, весит больше чем txt)
Справка со временем будет дополнена.
Программа участвовала в конкурсе от Microsoft & Intel...

С помощью данной программы можно построить граф, изменять пропускную способность, изменить матрицу стоимости, задать ориентацию. Также есть возможность ручной расстановки точек.
Поддерживаются следующие алгоритмы:

    1. Дейкстра
     Алгоритм поиска пути минимального веса в графе.

    2. Прим-Краскал
    Алгоритм построения остова минимального веса в графе.

    3. Минимальная раскраска
     Алгоритм раскраски вершин графа в минимальное количество цветов.

    4. Форд-Фалкерсон
     Алгоритм поиска максимального потока в ориентированном графе.

    5. Басакер-Гоуэн
     Алгоритм поиска потока минимальной стоимости, заданной размерности.

Скачать EXE- файл здесь . Скачать HELP здесь .

__________________________________________________________

 

Интересные темы форума

Помогите перевести из CDR в GIF

Люди, помогите найти прогу, с помощью которой можно было бы переводить изображения из CDR в GIF или JPEG или че-нить другое подобное.

***

Игра "Одна неделя без компа"

Забавная игра. Все участники форума создают одну смешную историю о том как человек, проводящий все свое время за компьютером сможет выдержать без него целую неделю. Составляем список вещей которые он будет делать день за днем, куда он пойдет и чем займет свое время, в общем посмотрим что получится в итоге.

***

Помогите с проблемой Outlook...

Ситуация такая у меня в офисе 3 компа WinXP и OfficeXP на всех на них одна и таже учётная запись но один комп главный и снего идёт раздача сообщений на другие компы. Происходит это так : Главный комп принял почту и сохраняет на сети письма для других компов например одному компу 1.msg а другому 2.msg они перетаскивают почту (выделил файл и перетащил в Outlook только так, крайне не удобно почему в письме 1.msg не горит кнопка перетащить в Outlook )после обработки письмо отсылается. Т.е. Главный комп на приём и на отправку а остальные 2-а тока на отправку.
Можно ли как то поудобней сделать импорт файлов. Спасибо огромное.

Остальные темы читайте на форуме . А главная страница сайта здесь .

__________________________________________________________

 

Программистам на заметку

Если у вас есть желание поделиться своим опытом с читателями, вы являетесь обладателем ценных, интересных статей, или вы просто хотите высказать свое мнение или замечание о рассылке, просто напишите мне . Я постараюсь уделить внимание каждому. А " Клуб программистов " всегда рад приветствовать в своих рядах новых пользователей.

 
 

© 2006, Кочари Арнольд и "Клуб программистов"