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

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

ただいまの
回答率

90.99%

  • C#

    5790questions

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

  • Visual Studio

    1498questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 202

jackie687456

score 10

前提・実現したいこと

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

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

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

該当のソースコード

        //曜日を求める
        //(仮引数)year:西暦年 month:月 day:日
        //(返却値)曜日
        private string dayCalculate(int year, int month, int day)
        {
            int w;

            if (month == 1)
            {
                month = 13;
                year -= 1;
            }
            if (month == 2)
            {
                month = 14;
                year -= 1;
            }                 //1月、2月の時は前年の13月、14月に

            w = (5 * year / 4 - year / 100 + year / 400 + (26 * month + 16) / 10 + day) % 7;    //Zellerの公式

            switch(w)
            {
                case 0:
                    return "日曜日です";
                case 1:
                    return "月曜日です";
                case 2:
                    return "火曜日です";
                case 3:
                    return "水曜日です";
                case 4:
                    return "木曜日です";
                case 5:
                    return "金曜日です";
                case 6:
                    return "土曜日です";
            }
        }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

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

...
                case 4:
                    return "木曜日です";
                case 5:
                    return "金曜日です";
                default:
                    return "土曜日です";
...


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

            day = "土曜日です";
            switch(w)
            {
                case 0:
                    day = "日曜日です";
                case 1:
                    day = "月曜日です";
                case 2:
                    day = "火曜日です";
                case 3:
                    day = "水曜日です";
                case 4:
                    rday = "木曜日です";
                case 5:
                    day = "金曜日です";
                default:
                    // do nothing
            }
       return day;

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/11 21:03

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

    キャンセル

  • 2017/09/12 14: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

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    明解Java入門編演習9−3

    この演習はDayクラスを使わずに行う演習なのでしょうか? Dayクラスを使うのなら、銀行口座クラスにtoStringメソッドを作る理由が分かりません。 また、もしDayクラスを

  • 解決済

    java カレンダー 土曜日改行

    4/22質問内容を少々修正いたしました。 ?????に何を入れれば土曜日で改行となりますでしょうか? ヒントとして、【int week = cal.get(java.util.

  • 解決済

    現在の日時の取得、使い方がわかりません

    現在パネルにカレンダーを作る事をしているのですが、 一応出力はできているのですがよく分からない月からしか出力されませんどこを直せばいいでしょうか? お願いいたします。

  • 解決済

    呼び出すメソッドで戻り値を変えたい

    CalendarClassを使って、1年分の日付を取得するPGを作ってます。 メソッドに返す戻り値を変える良い方法はありませんか。 例えば、mainClassでthisMo

  • 解決済

    Swift3でのカレンダー実装について

    前提・実現したいこと iOSにてカレンダーのアプリを作るため、以下の記事を参考に製作しています。 http://qiita.com/sakuran/items/3c2c9f22

  • 解決済

    JavaScript と Perl の正規表現に関して

    タイトルがわかりにくくてすみません。 とある質問で、横から質問したのですが、思った以上私の理解が進まなかったため、質問を新たに建てました^^; JavaScript の正規

  • 解決済

    do〜while文の複数条件を適用させたい

    //降順にソートするプログラム import java.util.Arrays; import java.util.Comparator; import java.io.*; c

  • 解決済

    PHP 月別アーカイブを自動で

     実現したいこと 月別のアーカイブを自動で表示されるようにしたく 基本的なところは下記のページと同じなのですが https://teratail.com/questions/292

同じタグがついた質問を見る

  • C#

    5790questions

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

  • Visual Studio

    1498questions

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