パスワードを忘れた? アカウント作成
14271870 journal
日記

yumeの日記: C#学習 9 5

日記 by yume

コメントありがとうございます。

Microsoft Learn 『C# で規則、空白文字、コメントを使用して読みやすいコードを作成する』
●ルールと規則に従う変数名を選択する
・変数名にはキャメルケースを使う
・単語は短縮せずに使う
>自分はいわゆるスネークケース記法を使っていた
●コードコメント
●空白文字を使用して読みやすいコードを作成する
・改行で似たような処理をグループ分けする
・コードブロックの始まりと終わりの位置を揃える
●課題
・コードを整形したり変数名をわかりやすく直すなど
●知識チェック
>問題なし
>変数名は雑に省略したものを使うことも多かったが、気を付けた方がよさそう。

これで、『C#最初のステップ』のラーニングパスはすべて修了したらしい。
Learnからまた別の課題を探していこう。

++C++;

●組込み演算子
・演算子おさらい
・シフトは2進数でシフト
・論理演算子 &|^
> 0 ^ 1 = 1、1 ^ 1 = 0。
・条件演算子 ?:
c ? x : y;
cがtrueならxを、falseならyを返す。
>if文で表すなら
int a;
if(c) a = x;
else a = y;
・null合体演算子 ??
nullを許容する型(stringなど)のh年数がnullのとき、規定値を入れるときに便利
・短絡評価
論理演算子を二個並べると、短絡評価される。
例えば「&&」ならオペランドがどちらもTrueでないといけないので、左辺がFalseであれば、その時点で右辺の評価をせずに終える。
「&」ひとつなら、例え左辺がFalseでも右辺の評価をする。
「||」の場合は、どちらかがTrueであればよいので、左辺がTrueであればその時点で右辺を評価せずに答えを返す。
短絡評価ならオペランドの計算をしない場合があるので、処理的には賢いけどコードによっては困る。
>論理演算をするときに、同時に計算もしよう、みたいな書き方でなく、行を分けておいて、初めから短絡評価だけ使えばよいと思うけど、どうなんだろう。

・演習問題
>入力を得る命令は、変数aに入れるなら
int a = int.Parse(Console.ReadLine());
・Console.ReadLine()で入力をstringで受け取る
・int.Parse()で数値の文字列をintに変える。
>演習問題は全部で5つある。ひとつのプログラムで全部解けるようにしてみる。
>複素数は全然わからないので解答例からコピペ。


using System;

namespace ConsoleApp1
{
        class Program
        {
                static void Main()
                {
                        Console.WriteLine("A:四則計算");
                        Console.WriteLine("B:複素数 x + iy の逆数");
                        Console.WriteLine("C:円の面積");
                        Console.WriteLine("D:BMI");
                        Console.Write("計算モードを選択して:");
                        string inputOrder = Console.ReadLine();

                        if (inputOrder == "A" | inputOrder == "a") modeA();
                        else if (inputOrder == "B" | inputOrder == "b") modeB();
                        else if (inputOrder == "C" | inputOrder == "c") modeC();
                        else if (inputOrder == "D" | inputOrder == "d") modeD();
                        else Console.WriteLine("error 終了します");
                }

                static void modeA()
                {
                        Console.Write("好きな数字を入力して:");
                        string inputA = Console.ReadLine();

                        Console.Write("もう一度、好きな数字を:");
                        string inputB = Console.ReadLine();

                        if (inputA.Contains('.') | inputB.Contains('.'))
                        {
                                calculator(decimal.Parse(inputA), decimal.Parse(inputB));
                        }
                        else
                        {
                                calculator(int.Parse(inputA), int.Parse(inputB));
                        }
                }

                static void modeB()
                {
                        Console.Write("実部を入力してください: ");
                        double x = double.Parse(Console.ReadLine());
                        Console.Write("虚部を入力してください: ");
                        double y = double.Parse(Console.ReadLine());

                        double norm = x * x + y * y;
                        Console.Write("{0} + i({1}) の逆数は {2} + i({3})", x, y, x / norm, -y / norm);
                }

                static void modeC()
                {
                        Console.Write("半径は?: ");
                        double r = double.Parse(Console.ReadLine());
                        double area = r * r * Math.PI;
                        Console.WriteLine("その円の面積は:{0}", area);
                }
                static void modeD()
                {
                        //BMI = 体重(kg)÷{身長(m)×身長(m)}
                        double weight, height;
                        Console.Write("身長は?: ");
                        height = double.Parse(Console.ReadLine()) / 100;
                        Console.Write("体重は?: ");
                        weight = double.Parse(Console.ReadLine());
                        Console.WriteLine("あなたのBMIは……{0}!",(weight / (height * height)));
                }

                static void calculator(int a, int b)
                {
                        Console.WriteLine("足したら:{0}", a + b);
                        Console.WriteLine("引いたら:{0}", a - b);
                        Console.WriteLine("賭けたら:{0}", a * b);
                        Console.WriteLine("割ったら:{0}", a / b);
                }
                static void calculator(decimal a, decimal b)
                {
                        Console.WriteLine("足したら:{0}", a + b);
                        Console.WriteLine("引いたら:{0}", a - b);
                        Console.WriteLine("賭けたら:{0}", a * b);
                        Console.WriteLine("割ったら:{0}", a / b);
                }
        }
}

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2020年08月20日 8時58分 (#3873245)

    規則に従って名前をつけるのは統一感とぱっと見でなにかわかるようにするためですね。
    なので統一されていれば規則を自作してもよいのです。
    まあ考えるのも面倒なので既存のものを使えば良いとは思いますが。
    あとクラスと定数にも変数とは別の形式の名前をつけたほうがわかりやすい。

  • by Anonymous Coward on 2020年08月20日 18時17分 (#3873675)

    個人的には、modeA()、modeB()、modeC()、modeD()を常にtrueを返す関数に書き換えて、

    Console.WriteLine((((inputOrder == "A" || inputOrder == "a") && modeA()) ||
    ((inputOrder == "B" || inputOrder == "b") && modeB()) ||
    ((inputOrder == "C" || inputOrder == "c") && modeC()) ||
    ((inputOrder == "D" || inputOrder == "d") && modeD())) ? "" : "error 終了します");

    にしたくなる。余計な改行が入っていまうけど。

    もっとも、今どきのナウい言語を使えば、inputOrderは1回だけ書けばいいし、比較演算子もいらないし、switch文のようにbreakもいらない。C#がナウいかどうかは知らない。

    ともかく、||や&&は分岐なので、if文の代わりに使えることがある。|や&は演算なので分岐の代わりに使うのはトリッキー。

    • 過剰に難読性を上げるのはやめてください。
      個人的には事前に入力を大文字か小文字に統一しますね。それやると演習問題の意味がなくなりますが。
      組み込みだとアンドを取って、見たいフラグ以外をマスクしたりする。
      ナウい言語のやり方が何を指すのかについての私の認識が100%正しい確信はありません。がシーシャープはナウい言語なのでifやスイッチなしでオッケーです。

      • by Anonymous Coward

        static void Main()
        {
                (省略)
                string inputOrder = Console.ReadLine();
                inputOrder = inputOrder.ToUpper();

                // switch式は使ってるけど
                var resultCode = inputOrder switch
                {
                        "A" => modeA(),
                        "B" => modeB(),
               

        • by Anonymous Coward

          ディクショナリに関数を入れるのを考えてました。
          C#だとちょっと冗長気味な記述になりますが。

typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...