ユリウス暦やグレゴリオ暦など、日付を検証するための式を作成する必要がある、この非常識な宿題があります...
問題は、それがすべて1つの式に含まれている必要があるため、どの式も使用できないことです。;
式で変数を定義するオプションはありますか?何かのようなもの
d < 31 && (bool leapyear = y % 4 == 0) || (leapyear ? d % 2 : 3) ....
ここで、1つ以上の変数を定義して初期化し、それらを1つの式で使用せずに使用でき;
ますか?
編集:それは1行の表現でなければならないと明確に言われています。機能なし..
今のやり方はマクロを書いて展開することなので、こういうものになってしまいます
#define isJulian(d, m, y) (y < 1751 || (y == 1752 && (m < 9) || (m == 9 && d <= 2)))
#define isJulianLoopYear(y) (y % 4 == 0)
#define isGregorian(d, m, y) (y > 1573 || (y == 1752 && (m > 9) || (m == 9 && d > 13)))
#define isGregorianLoopYear(y) ((y % 4 == 0) || (y % 400 = 0))
// etc etc ....
これが問題を解決するための唯一の適切な方法のように見えます
編集:これが元の質問です
変数がd
m
ありy
、日、月、年が含まれているとします。タスクは、日付が有効かどうかを決定する単一の式を作成することです。日付が有効な場合は値がtrue(ゼロ以外の値)であり、日付が無効な場合はfalse(ゼロ)である必要があります。
これは式の例です(正しい式は次のようになります):
d + 4 == y ^ 85 ? ~m : d * (y-2)
これらは間違った答えの例です(表現ではありません):
if ( log ( d ) == 1752 ) m = 1;
また:
for ( i = 0; i < 32; i ++ ) m = m / 2;
最後に1つの式のみを含むファイルのみを送信;
してください。コマンドやプログラム全体を送信しないでください。
- 2.9.1752がユリウス暦になるまで、その後はグレゴリオ暦になります
- ユリウス暦では、毎年うるう年で4で割ることができます。
- グレゴリオ暦では、うるう年であり、4で割り切れるが、100で割り切れるわけではありません。400で割り切れる年は別の例外であり、うるう年です。
- 1800、1801、1802、1803、1805、1806、....、1899、1900、1901、...、2100、...、2200はループ年ではありません。
- 1896、1904、1908、...、1996、2000、2004、...、2396、...、2396、2400はループ年です
- 1752年9月には、2.9.1752の後に14.9.1752が続く場合の別の例外であるため、日付3.9.1752、4.9.1752、...、13.9.1752は無効です。