プログラミング演習Ⅲ(2023)

【課題6-04】連想配列の練習 - その3

プロジェクトタイプC#コンソールアプリ※
プロジェクト名Prac_6_04
ソリューション名PET6
ターゲットフレームワーク.NET 6.0 (長期的なサポート)
最上位レベルのステートメントを使用しない使用しない(チェックオン)

※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!

_のテンプレートコードでは,あらかじめDateTime型の 変数targetDateが宣言・初期化されている(中身は秘密).

【課題6-03】で作成した連想配列holyDaysのなかに,変数targetDateに 格納された日付データに対応する エントリーが存在するかどうかをチェック するプログラム作成せよ. 存在する場合は,その日付に加えて対応付けられた文字列を表示せよ

注意
  • この設問を解くには先に以下の課題を完了する必要がある.
  • 後述の空欄は前提課題の回答と 全く同じ にすること(変えてはならない).

表示の際は,出力結果のように_の形式で表示すること.

その日付に対応するエントリーが存在する場合
targetDate(←に対応する文字列)
  • 凡例
    • targetDate
      • 変数targetDateの値.「年4桁-月2桁-日2桁」のフォーマットで表示すること.
    • (
      • 文言.半角開き丸カッコ
    • ←に対応する文字列
      • 連想配列holyDaysに含まれている,targetDateに対応する文字列.
    • )
      • 文言.半角閉じ丸カッコ
    • 改行
それ以外の場合
targetDate(なし)
  • 凡例
    • targetDate
      • 変数targetDateの値.「年4桁-月2桁-日2桁」のフォーマットで表示すること.
    • (なし)
      • 文言.半角開き丸カッコ + "なし" + 半角閉じ丸カッコ
    • 改行
出力フォーマット

なお,仮に変数の内容が変更されたとしても正しく動作するようにすること.

プログラムの概形は_のようにすること(必ず以下をコピーしProgram.cs全体を上書きすること).

テンプレートコード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
namespace Prac_6_04
{
    class Program
    {
        static void Main(string[] args)
        {
            // 連想配列の宣言(【課題6-03】と同じ)
            Dictionary</*** 空欄1 ***/, /*** 空欄2 ***/> holyDays = /*** 空欄3 ***/;

            /************************************************************/
            /*                                                          */
            /*                         空欄4                            */
            /*                                                          */
            /*              設問に指定されたエントリーを                */
            /*           連想配列の変数 holyDays に登録する.           */
            /*                   【課題6-03】と同じ                     */
            /*                                                          */
            /************************************************************/

            // チェック対象の DateTime 型の変数
            DateTime targetDate = GetRandomDate();

            /************************************************************/
            /*                                                          */
            /*                         空欄5                            */
            /*                                                          */
            /*       連想配列の変数 holyDays に                         */
            /*       変数 targetDate に格納された日付に                 */
            /*       対応するエントリーがあるかどうかをチェックし,     */
            /*       設問に指定されたフォーマットで表示を行う.         */
            /*                                                          */
            /************************************************************/

            #region チェック (ここは決して変更しないこと)
            var aType = holyDays.GetType();
            var gargs = aType.GetGenericArguments();
            if (!(aType.IsGenericType && gargs != null && gargs.Length == 2
                && gargs[0] == typeof(DateTime) && gargs[1] == typeof(string)))
                throw new Exception($"変数 {nameof(holyDays)} の型が設問に指定されているものと異なる.");
            if (!(holyDays.Count == 5))
                throw new Exception($"変数 {nameof(holyDays)} に登録されているエントリーの数が" +
                    $"設問に指定されているものと異なる(期待: 5, 検出: {holyDays.Count})");
            if (!holyDays.Any(e => e.Key.Ticks == 638345664000000000 && e.Value == "文化の日"))
                throw new Exception($"変数 holyDaysに「文化の日」に対応するエントリーが" +
                    $"存在しないか,値が設問に指定されているものと異なる.");
            if (!holyDays.Any(e => e.Key.Ticks == 638183232000000000 && e.Value == "昭和の日"))
                throw new Exception($"変数 holyDaysに「昭和の日」に対応するエントリーが" +
                    $"存在しないか,値が設問に指定されているものと異なる.");
            if (!holyDays.Any(e => e.Key.Ticks == 638188416000000000 && e.Value == "こどもの日"))
                throw new Exception($"変数 holyDaysに「こどもの日」に対応するエントリーが" +
                    $"存在しないか,値が設問に指定されているものと異なる.");
            if (!holyDays.Any(e => e.Key.Ticks == 638362944000000000 && e.Value == "勤労感謝の日"))
                throw new Exception($"変数 holyDaysに「勤労感謝の日」に対応するエントリーが" +
                    $"存在しないか,値が設問に指定されているものと異なる.");
            if (!holyDays.Any(e => e.Key.Ticks == 638186688000000000 && e.Value == "憲法記念日"))
                throw new Exception($"変数 holyDaysに「憲法記念日」に対応するエントリーが" +
                    $"存在しないか,値が設問に指定されているものと異なる.");
            #endregion

        }// end of Main()

        #region ここは決して変更しないこと
        static Random sRandom = new Random(245);
        static long NextLong(long max)
        {
            var bin = new byte[7];
            sRandom.NextBytes(bin);
            return (((long)bin[0]) | ((long)bin[1] << 8) | ((long)bin[2] << 16) | ((long)bin[3] << 24)
                    | ((long)bin[4] << 32) | ((long)bin[5] << 40) | ((long)bin[6] << 48)) % max;
        }
        static DateTime GetRandomDate() => new DateTime(638291664000000000 + NextLong(86400000000000)).Date;
        #endregion

    }// end of class Program

}// end of namespace

正しく実装できた場合,実行結果は_のようになる.

2023-11-23(勤労感謝の日)
実行結果

ヒント

  • 連想配列に,指定したキーに対応するエントリーが存在するかどうかは.ContainsKey()メソッドで確認することができる(本日の授業資料を参照せよ).
Last updated on 2023-11-14
Published on 2023-11-14

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.