Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.09.2013, 18:38
Zames Zames вне форума
Прохожий
 
Регистрация: 10.09.2013
Адрес: NVRSK
Сообщения: 20
Версия Delphi: Delphi XE3
Репутация: 10
По умолчанию Помогите разобраться

Я новичок, попробывал написать фун-цию вычисления Юлианской даты, но она ни в какую не хочет работать подскажите где ошибка.
Код:
function TForm1.JDday(Year, Month, Day: real): real;
begin
JDday:=INT(365.25(Year + 4716)) + INT(30.6001(Month + 1)) + Day  - 1524.5;
if Month>2 then begin
Year:=Year;
Month:=Month;
end
else
if (Month=1) or (Month=2) then begin
Year:=Year-1;
Month:=Month+12;
end;
end;
end.
Ответить с цитированием
  #2  
Старый 10.09.2013, 20:03
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Сначала должны идти проверки (if), а потом пересчёт дат (JD = ).

Код:
365.25(Year + 4716)
Здесь пропущен знак умножения? *

Код:
if Month>2 then begin
Year:=Year;
Month:=Month;
end
else
if (Month=1) or (Month=2) then begin
Year:=Year-1;
Month:=Month+12;
end;

А здесь логику нужно сделать наоборот (инвертировать), чтоб не писать первую часть кода:

Код:
if (Month=1) or (Month=2) then begin
Year:=Year-1;
Month:=Month+12;
end;

Но этот кусок, должен быть перед пересчётом JDDay

Последний раз редактировалось Uniq!, 10.09.2013 в 20:07.
Ответить с цитированием
  #3  
Старый 10.09.2013, 20:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Лень читать про "юлианскую дату" и формулы расчета, но могу сказать как минимум две вещи.
1)
Цитата:
if Month>2 then begin
Year:=Year;
Month:=Month;
end
И что это, по-вашему, должно делать? Тут даже без знания программирования очевидно, что это 4 строки совершенно бесполезного кода. Year будет равным Year всегда и без всяких условий. Как и Month.
2)
Цитата:
(Year, Month, Day: real): real;
Судя по всему, возвращаться должны значения через параметры. Тогда а) нужен var и б) не нужна функция, достаточно процедуры.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 10.09.2013 в 20:06.
Ответить с цитированием
  #4  
Старый 11.09.2013, 16:38
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zames
Я новичок, попробывал написать фун-цию вычисления Юлианской даты, но она ни в какую не хочет работать подскажите где ошибка.
Код:
function TForm1.JDday(Year, Month, Day: real): real;
begin
JDday:=INT(365.25(Year + 4716)) + INT(30.6001(Month + 1)) + Day  - 1524.5;
if Month>2 then begin
Year:=Year;
Month:=Month;
end
else
if (Month=1) or (Month=2) then begin
Year:=Year-1;
Month:=Month+12;
end;
end;
end.
А это вообще компилируется?
Ответить с цитированием
  #5  
Старый 12.09.2013, 11:29
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

После беглого прочтения про юлианскую дату и её расчёт, я так понимаю что должно быть что-то типа такого:
Код:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function JDday(const year, month, day:integer):integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Lines.Add(IntToStr(JDday(2013, 9,12)));
end;

function TForm1.JDday(const year, month, day: integer): integer;
var
  a, y, m:integer;
begin
   a:= trunc((14 - month) / 12);
   y:= year + 4800 - a;
   m:= month + 12 * a - 3;
   result := day + trunc((153 * m + 2) / 5) + trunc(365 * y) + trunc(y / 4) - trunc(y / 100) + trunc(y / 400) - 32045;
end;

end.
Ну и далее надо дорабатывать всякие проверки дня, месяца на корректность и т.п.
Ответить с цитированием
  #6  
Старый 12.09.2013, 11:32
Zames Zames вне форума
Прохожий
 
Регистрация: 10.09.2013
Адрес: NVRSK
Сообщения: 20
Версия Delphi: Delphi XE3
Репутация: 10
По умолчанию

Для вычесления Юлианской даты есть формула.
JD=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1 - 1524.5 а также некоторое условие .Если month=1 или Month=2 тогда следует принять Year=Year-1 Month=Month+12.
Учитывая ваши высказывания написал теперь процедуру

Код:
Procedure JDday(Year1, Month1:integer; Day1:real);
begin
 if (month1=1) or ( Month1=2) then begin
 Year1:=Year1-1;
 Month1:=Month1+12;
  JDday:=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1  - 1524.5;
 end;

Но при попытки скомпилировать и вывести в лейбл результат выдаёт ошибку [dcc32 Error] Unit1.pas(55): E2010 Incompatible types: 'Real' and 'procedure, untyped pointer or untyped parameter'.

В капчу вывожу через FloatToStr
Ответить с цитированием
  #7  
Старый 12.09.2013, 13:22
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zames
Для вычесления Юлианской даты есть формула.
JD=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1 - 1524.5 а также некоторое условие .Если month=1 или Month=2 тогда следует принять Year=Year-1 Month=Month+12.
Учитывая ваши высказывания написал теперь процедуру

Код:
Procedure JDday(Year1, Month1:integer; Day1:real);
begin
 if (month1=1) or ( Month1=2) then begin
 Year1:=Year1-1;
 Month1:=Month1+12;
  JDday:=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1  - 1524.5;
 end;

Но при попытки скомпилировать и вывести в лейбл результат выдаёт ошибку [dcc32 Error] Unit1.pas(55): E2010 Incompatible types: 'Real' and 'procedure, untyped pointer or untyped parameter'.

В капчу вывожу через FloatToStr
Ну так конечно, потому что у вас это procedure, а вы пытаетесь вернуть из неё значение, когда присваиваете переменной JDday какое-то значение. Присвоение значение переменной с именем функции аналогично присвоению значения переменной result. У procedure нет возвращаемого значения, вот он и не компилирует. Это раз. Потом у вас всё написано внутри условия. Т.е. ваш расчёт произойдет только в том случае, если month1=1 или month1=2, иначе процедура ни чего не делает.
Ответить с цитированием
  #8  
Старый 12.09.2013, 13:33
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zames
Для вычесления Юлианской даты есть формула.
JD=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1 - 1524.5 а также некоторое условие .Если month=1 или Month=2 тогда следует принять Year=Year-1 Month=Month+12.
Если предположить, что этот алгоритм правильный, то тогда у вас должно быть что-то типа того:
Код:
function TForm1.jd(year, month, day: real): real;
begin
  if (month=1) or ( month=2) then
    begin
      Year:=Year-1;
      Month:=Month+12;
    end;
  result:=INT(365.25*(Year + 4716)) + INT(30.6001*(Month + 1)) + Day  - 1524.5;
end;
Но тогда ваша функция возвращает неправильное значение. Есть сайт http://planetcalc.ru/503/, там калькулятор возвращает 2456547.50, моя функция возвращает 2456548, а ваша 2456560,5.
Ответить с цитированием
  #9  
Старый 13.09.2013, 14:28
Zames Zames вне форума
Прохожий
 
Регистрация: 10.09.2013
Адрес: NVRSK
Сообщения: 20
Версия Delphi: Delphi XE3
Репутация: 10
По умолчанию

Спасибо Annihilator за помощь. Всё работает на ура! Нашёл другую формулу. теперь всё работает как надо!

Код:
function TForm1.JD(year, month, day: real): real;
begin
  if (month=1) or ( month=2) then
    begin
      Year:=Year-1;
      Month:=Month+12;
    end;
  result:=INT(365.25*Year)+ INT(30.6001*(Month + 1)) -15+1720996.5+ Day;
end;
Ответить с цитированием
  #10  
Старый 13.09.2013, 17:23
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
Хорошо

Цитата:
Сообщение от Zames
Спасибо Annihilator за помощь. Всё работает на ура! Нашёл другую формулу. теперь всё работает как надо!

Код:
function TForm1.JD(year, month, day: real): real;
begin
  if (month=1) or ( month=2) then
    begin
      Year:=Year-1;
      Month:=Month+12;
    end;
  result:=INT(365.25*Year)+ INT(30.6001*(Month + 1)) -15+1720996.5+ Day;
end;
Пожалуйста
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:12.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025