yumeの日記: C#学習 9 5
コメントありがとうございます。
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);
}
}
}
ルールと規則は人が作る物 (スコア:0)
規則に従って名前をつけるのは統一感とぱっと見でなにかわかるようにするためですね。
なので統一されていれば規則を自作してもよいのです。
まあ考えるのも面倒なので既存のものを使えば良いとは思いますが。
あとクラスと定数にも変数とは別の形式の名前をつけたほうがわかりやすい。
||や&&は分岐、|や&は演算 (スコア:0)
個人的には、modeA()、modeB()、modeC()、modeD()を常にtrueを返す関数に書き換えて、
にしたくなる。余計な改行が入っていまうけど。
もっとも、今どきのナウい言語を使えば、inputOrderは1回だけ書けばいいし、比較演算子もいらないし、switch文のようにbreakもいらない。C#がナウいかどうかは知らない。
ともかく、||や&&は分岐なので、if文の代わりに使えることがある。|や&は演算なので分岐の代わりに使うのはトリッキー。
{}省略するのやめようよ (スコア:0)
過剰に難読性を上げるのはやめてください。
個人的には事前に入力を大文字か小文字に統一しますね。それやると演習問題の意味がなくなりますが。
組み込みだとアンドを取って、見たいフラグ以外をマスクしたりする。
ナウい言語のやり方が何を指すのかについての私の認識が100%正しい確信はありません。がシーシャープはナウい言語なのでifやスイッチなしでオッケーです。
こんな感じかなぁ (スコア:0)
static void Main()
{
(省略)
string inputOrder = Console.ReadLine();
inputOrder = inputOrder.ToUpper();
// switch式は使ってるけど
var resultCode = inputOrder switch
{
"A" => modeA(),
"B" => modeB(),
Re: (スコア:0)
ディクショナリに関数を入れるのを考えてました。
C#だとちょっと冗長気味な記述になりますが。