• 締切済み

c# ツェラーの公式を利用した計算方法

利用言語はc# ソフトはvisual studio2022を利用しています。 年・月・日をそれぞれ入力し、ツェラーの公式を利用して曜日を出したいのですがやり方が分からず困っています。 分かる方がいらっしゃいましたらお力を貸していただけましたら幸いです。 曜日の判定をする部分は以下で実現したいです。 Console.WriteLine("{0}曜日", g[dayofweek]);

みんなの回答

回答No.3

ここも間違えてた。 >年ー年÷100+年÷400 年+年÷4ー年÷100+年÷400 普通のうるう年を足すのを忘れてる。

回答No.2

>1月を前年の13月、2月を前年の4月とします。 は、 1月を前年の13月、2月を前年の14月とします。 の間違いです。

回答No.1

https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F にある公式をそのまま計算したらいいだけです。 変形と書かれている公式も、よく使われています。 簡単に言うと、1週間が7日であるのは変わらないので、 通算日の ジュリアン・デイ(ユリウス日)を、 7で割ったあまりが曜日に対応します。 2月29日を計算するのが面倒なので、 1月を前年の13月、2月を前年の4月とします。 1年を3月1日から14月28か29日にして、 経過日数を算出します。 7月と8月、12月と13月(翌年の1月)が31日が続くので 1か月を30×6÷5を小数点以下切り捨ての整数にして、5か月で周期させ、 その時が7月・8月の間、12月・13月の間に来るように 31日が2月続く様に適当に月を補正させ、 月終わりの1年の通算日数を計算させます。 これに、日付を入れて、翌月の日数を加算させ、 (適度の補正を入れることによって、) 年の計算を含めて曜日を合わせます。 年の計算ですが、 通年で、1年経過すると、同日は曜日が後ろに一つズレます。 それだけだったら、年を7で割るだけで曜日のずれが決まりますが、 うるう年があった場合1日増えるため、ふたつズレるので、 その年の補正で、年+うるう年で計算します。 うるう年は、4年に一回ありますが、100で割り切れる年は うるう年ではありません。ただし、400年に一回 100で割り切れてもうるう年にしています。 (地球の自転が割り切れない時間で回っているのでその補正のためです) ですから、 年ー年÷100+年÷400 (を7で割ったあまり)だけ、 年数によって、初日(3月1日)の曜日がずれます。 このズレた曜日と、先に計算した3月1日からの通算日数を足し、 それを7で割ったあまりが、曜日になります。 0の時の曜日から6まで対応させるか、 適度な数値を加算して、 0 の時の曜日を日曜日なり月曜日にするなりして、 曜日を算出します。 wiki の変形以外の変形で、 前年に回した1月・2月を特別扱いして、ここだけ補正値を入れるとか 1月を5月に見せかけると、同じ曜日になるとかの手もあります。 その場合、31日が2回続くのは、7月と8月の間1回だけなので、 特に5か月にこだわらず、それ以上でも構いません。 年の計算で、400年は、 400+400/4-400/100+400/400 =400+100-4+1=497になり、7で割り切れるので、(71) 年の数値を最初に400で割ったあまりだけにしてもいいです。 (1月・2月は先に前の年にしておく方が楽ですが)

関連するQ&A

  • コーディング時カッコの後に「;」を書くのが面倒

    C#をVisual Studioで学んでいます。 Console.WriteLine("hoge"); VSは「(」を入力すれば自動的に「()」が作成され便利なのですが、 最後の「;」を入力するには十字キーを押して移動しないといけません。 離れた十字キー押すのが面倒なのですが、何か良い方法はないですか? キーボードは標準的なフルキーボードを使用しています。

  • Console.writeLineで文字化け

    Console.writeLineで全角文字列が1000戸ぐらい続くStringを出力する場合は文字化けしませんが、半角が1字でも混じると文字化けします。たとえば以下のようなコードです。 line = "アああああああああ【中略】あああああああああああああ" Console.WriteLine(line) 出力結果のところどころに「ああ・あああ」となっている場所があります。なんとなかならないでしょうか? Visual Studio 2003 / 2008 Visual Basic Windows XP

  • C#でカレンダーを作っているのですがここから先がわかりません。どなたかおしえてもらえませんか?

    using System; using System.Collections.Generic; using System.Text; namespace 万年カレンダー { class MyEventCiass { static void Main(string[] args) { int nen, tuki,tukinohi,youbi;    //西暦の入力 System.Console.Out.WriteLine("西暦を入力してください。"); nen = int.Parse(Console.ReadLine()); //月の入力 System.Console.Out.WriteLine("月を入力してください。"); tuki = int.Parse(Console.ReadLine()); //西暦と月の出力 Console.WriteLine(nen + "年" + tuki + "月"); switch (tuki) { case 2: if (nen % 4 == 0 && (nen % 100 != 0 || nen % 400 == 0)) tukinohi = 29; else tukinohi = 28; break; case 4: case 6: case 9: case 11: tukinohi = 30; break; default: tukinohi = 31; break; } if (tuki == 1 || tuki == 2) { nen = nen -1 ; tuki = tuki + 12; } //曜日の出力 Console.WriteLine("日 月 火 水 木 金 土"); youbi = (nen + nen / 4 - nen / 100 + nen / 400 + (13 * tuki + 8) / 5 + 1) % 7; if (youbi == 0) youbi = 7; for (int i = 1; i <= youbi ;i += 1 ) { Console.Write(i.ToString()); } for (int i = 4; i <= tukinohi; i += 1) { Console.Write(i.ToString()); } Console.ReadLine(); } } }

  • C#のnull許容の警告について

    「Visual Studio」のNET6.0の環境でコードを書いています。 static string UserName; という変数の宣言に対して 「null非許容のフィールドUserNameには、コンストラクターの終了時にnull以外の値が入っていなければなりません。フィールドをNULL許容として宣言することをご検討ください。」 という警告を回避するために static string? UserName; というnull条件演算子で対応したのですが、上司に 「トリッキーな方法(?)ではなく、初期化や代入を使え」 と言われてしまい static string UserName = null ; という書き方を試したのですが 「nullリテラルをnull非許容参照型に変換できません」 という警告が出てしまい、警告を出さない書き方が分からず困っている状態です。 どなたか修正方法を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string UserName; static void Name() { Console.WriteLine("ユーザ名を入力してください"); string? enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); UserName = enterName; } 以下省略

  • Visual Studio C++のデータ入力

    C言語を一から勉強しています。 Visual Studio C++を使ってプログラムを入力していて、デバッグの際にscanfでテストデータを入れたいのですが、入力の方法が分かりません。 どうやったらよいのでしょうか。 Visual Studio 2019で、C++のコンソールアプリケーションというものを使っています。

  • C#についての質問です

    Microsoft Visual C# 2010 Express をつかって using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Console { class Program { static void Main(string[] args) { Console.WriteLine("皆様、はじめまして"); } } } と入力して.csで保存したのですが、コマンドプロンプトで 'csc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とでてコンパイルできません。対応を教えてください。

  • F-BASIC ツェラーの公式 年月を入力してカレンダー表示

    F-BASICの下記の問題がどうしても分からなくて困っています。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ツェラーの公式を使い、年と月を入力すればその月のカレンダーを以下の例のように表示するプログラムを作成せよ。ただし、ツェラーの公式は次のように与えられる。西暦年、月、曜日を y%,m%,d% とすると (y%+y%\4-y%\100+y%\400+(13*m%+8)\5+d%)MOD 7 ただし、m%<=2 のときは上の式で y%=y%-1,m%=m%+12 とおく。 この結果、0なら日曜、1なら月曜・・・、6なら土曜となる。 例 2003年6月 1 日 2 月 3 火 4 水 5 木 ・ ・ ・ ・ 28 土 29 日 30 月 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一週間悩んだのですが、分かりませんでした。 どうかよろしくお願いいたします。

  • C言語初心者なんですが

    はじめまして、最近C言語を勉強している初心者です。 グレゴリウス暦の定義を利用して入力した日は何曜日かという問題なのですがいまいちよくわかりません。 4、400で割り切れる年は閏年 100で割り切れる年は閏年ではない 西暦1年1月は月曜日 今のところわかっているのは前年までの日数と前月までの日数と今月の日数を足して一週間(7日)で割るといったところです。 おそらく私の勉強不足だと思うのですがなかなか進めません 備考 ツェラーの公式は使わないこと 途中でexit returnは使わない 外部変数は使わない

  • Console.ReadLineが有効にならない

    VB2008で下記の記述を入れてみました。 Sub test() Dim inStr As String Dim inNum As Double ' キーボードから入力 Console.WriteLine("実数を入力") inStr = Console.ReadLine() ' 文字列を実数に変換 If (Not inStr = "") Then inNum = Double.Parse(inStr) inNum = inNum / 2 ' 結果を表示 Console.WriteLine("結果:" & inNum) End Sub この場合, 上記Console.RealLine()で キーボードから入力ができるとの解説が、 いろりろ出ていますが、小生のプログラムでは、入力できず、上記"結果"を表示して、 終了してしまい困っています。  VB2008のオプションで環境などを調べたのですが、よくわかりません。 どなたか、ご存じの方がいらしゃれば、ご指導をお願いいたします。  当方の環境    OS Vistaです。 OS Xpで行っても同じでした。  VB2008は、Visual Studio 2008 です。上記OSには、同じ環境で行っています。

  • C#言語 ゲーム作りについて質問です

    今C#言語を独学で勉強中です。 Visual Studio 2010でRPGの簡単なゲームを作ろうと頑張っています(ドラクエみたいな) (Console.WriteLineの)戦闘シーンはできました。(プロジェクト?) そこでマップなんですが、絵は大変なので文字だけのマップを作ろうと考えています。 しかし、どこから手をつけていいやら、まったく見当がつきません。 「テキスト?でマップを打ち込み、そのマップ内をキーボードの矢印でキャラクターとなるものを動かす。カメラはキャラクターを中心に動く。ランダムで、用意した戦闘シーンに突入。戦闘終わったらまた元の場所、位置に戻る」というのは大体頭の中で考えています 一番知りたいのはまず初めにどうやってマップをつくり、どうやってそのマップとプログラムをつなげる(?)かということです。 説明不足かもしれませんが おおまか、簡単な説明でいいので、手順を教えてくれるとありがたいです よろしくお願いします。 やはり何かダウンロードとかしなとダメなんですかね・・・

専門家に質問してみよう