0

日付クラスをコーディングしていますが、後置増分に問題があります (前置増分は問題ないようです)。

サンプルコードは次のとおりです。

public class date
{
    int year,
        month,
        day;

    public date(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }

    static public date operator ++(date d)
    { 
        return d.Next(d);
    }
}

メソッド「Next(date d)」は日付を取り、明日の日付を返します (簡潔にするために省略しました)。接頭辞は問題ないが、接尾辞のインクリメントが何もしない理由を理解するには、C#で若いです。しかし、C++ では、接頭辞と接尾辞のインクリメントのために、1 つではなく 2 つのメソッドが必要になることを思い出してください。

また、コンパイル時にエラーや警告はありません。

4

5 に答える 5

6

System.DateTime.AddDays

壮大な日付ベースの頭痛の種を自分で救ってください。

于 2009-12-24T12:04:20.817 に答える
4

メソッドを示していませんが、これはちょっと便利です...特に、引数としてNexta を取る必要がある理由を示しています。date私の推測では、あなたのNext方法には欠陥があると思います。

また、ポストインクリメントで失敗する例も示していません。これが機能することを示す簡単な例を次に示します。

using System;

public class Date
{
    int year, month, day;

    public Date(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }

    public static Date operator ++(Date d)
    { 
        return d.Next();
    }

    private Date Next()
    {
        // Just a toy implementation, obviously
        return new Date(day + 1, month, year);
    }

    static void Main()
    {
        Date x = new Date(1, 2, 3);
        x++;
        Console.WriteLine(x.day); // Prints 2
    }
}

2 がどのように出力されるかに注意してください。これは、日が増分されたことを示しています (または、増分された日の値を持つxの新しいインスタンスを参照してDateいます)。

Date個人的には、とにかくクラスに ++ 演算子を導入するとは思いませんが、気にしないでください。また、コンストラクターは、日/月/年ではなく、年/月/日にすることをお勧めします。これはより慣習的であり、より多くのパラメーターでより高い精度を許可したい状況により適しています。

于 2009-12-24T11:30:50.733 に答える
0
DateTime SchDate= DateTime.Now;
SchDate= SchDate.AddDays(1);

追加できる日または月/年は何でも

于 2010-02-09T12:45:00.797 に答える
0

ジョンのおかげで、クラス内にある不足している next() メソッドを添付させてください。

    public date Next(date d)
    {
        if (!d.valid()) return new date();
        date ndat = new date((d.Day() + 1), d.Month(), d.Year());
        if (ndat.valid()) return ndat;
        ndat = new date(1, (d.Month() + 1), d.Year());
        if (ndat.valid()) return ndat;
        ndat = new date(1, 1, (d.Year() + 1));
        return ndat;
    }    

これは valid() を使用するため、これも添付します。

    public bool valid()
    {
        // This method will check the given date is valid or not.
        // If the date is not valid then it will return the value false.
        if (year < 0) return false;
        if (month > 12 || month < 1) return false;
        if (day > 31 || day < 1) return false;
        if ((day == 31 && (month == 2 || month == 4 || month == 6 || month == 9 || month == 11)))
            return false;
        if (day == 30 && month == 2) return false;
        if (day == 29 && month == 2 && (year % 4) != 0) return false;
        if (day == 29 && month == 2 && (((year % 100) == 0) && ((year % 400) != 0))) return false;
        /* ASIDE. The duration of a solar year is slightly less than 365.25 days. Therefore,
        years that are evenly divisible by 100 are NOT leap years, unless they are also
        evenly divisible by 400, in which case they are leap years. */
        return true;
    }

Day()、Month()、Year() は自明だと思いますが、必要な場合はお知らせください。--decrement メソッドで使用したい next() の反対を行う previous() メソッドもあります。

今私のプログラムでは、私は持っています

class Program
{
    static void Main()
    {
        date today = new date(7,10,1985);
        date tomoz = new date();

        tomorrow = today++; 

        tomorrow.Print();  // prints "7/10/1985" i.e. doesn't increment      
        Console.Read();
    }
}

したがって、実際には失敗するわけではなく、明日の代わりに今日の日付を出力するだけですが、代わりに ++today を使用した場合は正しく機能します。

D/M/Y の順序については、同意します。より高い頻度のデータを使用すると、それがどのように改善されるかがわかります。次の修正に進みます。

于 2009-12-24T12:02:45.607 に答える
0

元のポスターにはおそらく遅すぎる追加のコメントがありますが、将来読む人には役立つかもしれません.

「有効」の実装を見る:

    if (day == 29 && month == 2 && (year % 4) != 0) return false; 
    if (day == 29 && month == 2 && (((year % 100) == 0) && ((year % 400) != 0))) return false; 

有効な日付である 2100 年 2 月 29 日に失敗しますが、メソッドはそうではないと言っています。

于 2012-03-07T12:14:19.610 に答える