質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

931閲覧

曜日算出のメソッドのコンパイルエラー

jackie687456

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/09/11 11:50

###前提・実現したいこと
Zellerの公式を使って曜日を算出するメソッドを作ってみたのですが、以下のようなエラーが出てしまいました。
エラーメッセージから察するに、分岐によって値を返せていないときがあるのではと思ったのですが、それがどこなのかわかりません。
7通りしかないはずの w の値で全部のパターンをカバーできているつもりだったのですが・・・。
よろしくお願いいたします。

###発生している問題・エラーメッセージ

値を返さないコード パスがあります

###該当のソースコード

visualC#

1 //曜日を求める 2 //(仮引数)year:西暦年 month:月 day:日 3 //(返却値)曜日 4 private string dayCalculate(int year, int month, int day) 5 { 6 int w; 7 8 if (month == 1) 9 { 10 month = 13; 11 year -= 1; 12 } 13 if (month == 2) 14 { 15 month = 14; 16 year -= 1; 17 } //1月、2月の時は前年の13月、14月に 18 19 w = (5 * year / 4 - year / 100 + year / 400 + (26 * month + 16) / 10 + day) % 7; //Zellerの公式 20 21 switch(w) 22 { 23 case 0: 24 return "日曜日です"; 25 case 1: 26 return "月曜日です"; 27 case 2: 28 return "火曜日です"; 29 case 3: 30 return "水曜日です"; 31 case 4: 32 return "木曜日です"; 33 case 5: 34 return "金曜日です"; 35 case 6: 36 return "土曜日です"; 37 } 38 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Visual Studio のチェッカの詳細はわかりませんが、おそらく、コードから構文木を作って静的に潜在的な問題を報告してくれています。実際にコードを走らせてみる「動的」なテストではなく、走らせなくてもわかる問題の検出です。コードの中身を精査 (たとえば、このコードでは w は 0 から 6 のどれかにしかならないと判断) するのではなく、形式的にわかる問題点を検出しています。

今回のケースでは、switchdefault がない、というのは、直接的なエラー原因ではありません。default がないゆえに、 string 型を返すと宣言されている dayCalculate 関数が return なしで終わる、すなわち void 型になっていることを検出してエラーになっています。
switch では常に default を書く、という習慣がいいと思います。あとからコードを読んだときに、default を忘れただけなのか、なくてもいいと判断したのかの違いもわかりますし。

修正の方法ですが、defaultreturn "エラーです"; とするのもひとつの方法ですが、次のようにするのも簡単です。

c#

1... 2 case 4: 3 return "木曜日です"; 4 case 5: 5 return "金曜日です"; 6 default: 7 return "土曜日です"; 8...

別解としては、必ず string 型を return するために、次のようにするとか。

c#

1 day = "土曜日です"; 2 switch(w) 3 { 4 case 0: 5 day = "日曜日です"; 6 case 1: 7 day = "月曜日です"; 8 case 2: 9 day = "火曜日です"; 10 case 3: 11 day = "水曜日です"; 12 case 4: 13 rday = "木曜日です"; 14 case 5: 15 day = "金曜日です"; 16 default: 17 // do nothing 18 } 19 return day;

元のコードと変わって、質問とも関係なくなってしまいますが、もっとよいのはテーブルにしまうことでしょう。

c#

1 2 string[] weekDays = { "日", "月", "火", "水", "木", "金", "土" }; 3 ... 4 return weekDays[w] + "曜日です";

投稿2017/09/11 13:00

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

wの値次第ではswitch/caseに該当しないパターンがありえる、ということでしょうね。switch/defaultを追加してエラー文字列を返すと良いと思います。たとえば、return "エラーです";とかを追加すればいいと思います。もちろん、全段階で7で割った余りを求めているので実質的な意味はありませんけど。

投稿2017/09/11 11:55

編集2017/09/11 11:56
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jackie687456

2017/09/11 12:03

ご指摘通り、defaultを追加してみるとエラーが出なくなりました。いったいwの何がダメだったのかはわかりませんでしたが・・・。いろいろ値を入れてみてもちゃんと正しい答えが返ってきているようだったのでよしとしました。もし具体的な理由がお分かりになったら教えていただけると嬉しいです。ありがとうございました。
toro1

2017/09/12 05:01 編集

横からすみません。 wはintの型なので、-2,147,483,648 ~ 2,147,483,647の整数値が範囲です。 jackie687456の元のソースだと、このうち、0,1,2,3,4,5,6の場合しかreturnの文字列が設定されていません。 つまり7~ 2,147,483,647、-2,147,483,648~-1がwに入った場合の定義、returnの文字列が設定されていない為「値を返さないコード パスがあります。」と警告されています。 ここのdefaultは、「caseで指定した以外の値の場合」という意味なので、「値を返さないパスコードが無くなる為」、警告が消えます。 ちなみにdatetimeのDayOfWeekを使ったこんな方法もあります。 https://dobon.net/vb/dotnet/system/datetime.html#section4
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問