-2

ラボの一部として、現在の月日と年を計算する方法を考案する必要があります。1970 年 1 月 1 日からの秒数を取得する gettimeofday() 関数を使用します。

変換を行う関数があることは知っていますが、設計要件は、秒を月日および年に変換するための独自のアルゴリズムを作成することです。設計を実装する方法は、12 か月ごとのルックアップ テーブルと対応する日数です。ロジックは今、私には少し混乱しています。

トリッキーな部分は、うるう年の処理です。1972 年が 1970 年以来最初の閏年であることは知っています。閏年はその日から 4 年ごとに発生します。この課題で私に与えられたヒントは、数日後の次の最大のサイクルは 4 年であるということです。したがって、1970 年からの日数を 1461 (4 年間の日数) で割ると、残りの日数を取得できることがわかります。この時点で、私の一連の論理は失われます。これを 1461 で割ると、4 年間の経過回数がわかります。

実装したいテーブルは次のようになります (コーディングが完全に正しくないことはわかっていますが、何が得られているかを示すためだけです):

struct Monthdays
{
int days;
char* Monthname[]
};

Monthdays lookupMonths[]
{
{31,"January"}
{28,"February"}
.
.
.

};

日数などを使用して適切なインデックスを作成し、この「テーブル」を確認する方法を見つけようとしています........ここで質問しても問題ないことを願っています。私は今、ロジックまたは数日で苦労しています....

これは、私が現在抱えているこの問題のコードであり、非常に非効率的です。

    ExpandedTime* localTime(
                        struct timeval* tv,     // Pointer to timeval struct
                        ExpandedTime* etime     // '' '' to expandedtime strct
                        )
{
    tzset();                                    // Corrects for timezone

    int epochT = (tv->tv_sec) - timezone;       // Epoch seconds with
    int epochUT = tv->tv_usec;                  // epochtime microseconds
    int edays;                                  // Days since epochtime

    etime->et_usec = (epochUT/milli) % milli;   // Find the milliseconds

    etime->et_sec = epochT % 60;
    epochT /= 60;                               // Turn into minutes

    etime->et_min = epochT % 60;
    epochT /= 60;                               // Turn into hours

    if (localtime(&tv->tv_sec)->tm_isdst !=0)
        etime->et_hour = (epochT % 24) + daylight;      // Hours with DST correc
    else
        etime->et_hour = (epochT % 24);

    edays = epochT /= 24;                       // Turn into days

    etime->et_day = epochT;                     // Delete up to here
    etime->et_year = (epochT/365) + epochyear;  // Get the current year

    int trackyear;                              // Counter for years
    int trackdays = -1;                         // Subtracting janurary 1st
                                                // from days
   // This will determine if it is a leapyear and adjust days accordingly
    // from 1970 to current year (2013)

    for (trackyear = epochyear; trackyear < etime->et_year; trackyear++)
    {
        if (trackyear % leapy == 0)
        {
            trackdays = trackdays + 366;
        }
        else
        {
            trackdays = trackdays + 365;
        }
    }
    etime->et_day = edays - trackdays;

    int trackmonth = -1;                        // Counter for months
                                                // with offset to make
                                                // january = 0

    // This will give me the number of months for the buffer

    do
    {
        switch (trackmonth)
        {

            // Months with 31 days
            case 0:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) - 31;
            break;
            case 9:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) - 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) - 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) - 28;
            }
            else
            {
                etime->et_day = (etime->et_day) - 29;
            }

            break;

        }
        trackmonth++;

    }
    while(etime->et_day > 0);

    etime->et_mon = trackmonth - 1;
    // Reverts day offset from previous switch to
    // accurately represent the current day

    switch (etime->et_mon)
    {
            // Months with 31 days

            case 0:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 9:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) + 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) + 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) + 28;
            }
            else
            {
                etime->et_day = (etime->et_day) + 29;
            }

            break;
    }

    return etime;

}
4

2 に答える 2

0

ユリウス日 (より正確にはユリウス日番号) の計算方法に関する情報を得るために、少し Web サーフィンをしてみてください。

それ以外に、誰かの宿題をするのは非倫理的です..しかし.私はPayPalアカウントを持っています~lol~

于 2013-04-15T16:36:49.720 に答える
-2
if(year % 4 == 0 && year % 100 == 0 && year % 25 != 0) 
    this is a leap year.

これは実際、私が大学で持っていた宿題の中で最も難しいものでした...全体として、これがどれだけ正確である必要があるかに応じて、タイムゾーンと、異なるゾーンが夏時間に入る時期を調べる[しない]ように言います...

答えがあまり役に立たない場合は申し訳ありませんが、これはうるう年の公式です。このまま進むと、中国の定理をここに持ち込む必要があります...

しかし、それができればgettimeofday()、1970 年 1 月 1 日からのミリ秒数が返されます。そのため、秒を「浪費」し、現在までの時間の経過をシミュレートする少しの for を入れるだけで、そのループを使い果たすまで実行できます。時間の。停止すると、停止した日付を確認できるはずです ;)

于 2013-04-15T16:39:29.247 に答える