🐚

[魚戸ホタル] C#勉強備忘録2日目

2022/03/16に公開

おはようございます
こんにちは
ほたー

今回の備忘録は主なテーマは以下の3点です。

使用教材は亀田健司(著)1週間でC#の基礎が学べる本になります。

対象ページは以下の通りです。

  1. 56~58
  2. 59~78
  3. 79~108
C#備忘録アーカイブ

C#における演算処理

まずプログラミングでは足し算、引き算などの計算処理のことを演算と呼びます。
5個のミカンを1個食べると4個、5個のミカンを2人で平等に分けると2個ずつになり1個余るといった計算をするようにコンピュータに伝えます。

さまざまな演算を行うための記号を演算子といい、教材では以下の5種類が紹介されていました。

先ほどのミカンを参考にして計算処理を書き、処理を開始して実行結果を取得しました。
カッコで囲むとカッコ内の(5+3)が先に計算され、足した結果の8を2で割って4が求まります。
PHPの計算処理とおおよそ違わなかったので頭にすっと入りました。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UotoHotaru0315_1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("みかんの数");
            // 足し算
            Console.WriteLine("{0} + {1} = {2}", 5, 1, 5 + 1);
            // 引き算
            Console.WriteLine("{0} - {1} = {2}", 5, 1, 5 - 1);
            // 掛け算
            Console.WriteLine("{0} * {1} = {2}", 5, 2, 5 * 2);
            // 割り算と剰余
            Console.WriteLine("{0} / {1} = {2}余り{3}", 5, 2, 5 / 2, 5 % 2);
	    // カッコで囲むと優先順位が上がる
            Console.WriteLine("({0} + {1}) / 2 = {2}", 5, 3, (5 + 3) / 2);
        }
    }
}

実行結果

C#における変数宣言、代入

変数はデータを格納しておく箱のことです。
変数を定義しておくとソースコード内で使いまわしがきくため、プログラミングの学習を始めるなら必ず学ぶ概念になります。
変数は例えば次のような形で宣言します。

int squid = 5;
int add
add = squid + 1

上記のコードで変数squid、addが宣言されました。
変数squidが3行目にある演算処理で代入され、変数addの値は6になります。
変数の前についているintはデータ型といい、integerの略称です。
他のデータ型には倍精度浮動小数点型、つまり2.5のような小数点以下の数字を扱うときに用いるdouble型や文字列、つまり'魚戸ホタル'のようなシングルクォーテーションで囲む文字を扱うときに用いるstring型があります。
2日目の範囲ではデータ型はint、double、stiringでしたが、真偽値(true or false)を扱うbool型などデータ型は他にもあります。

PHPでも変数の前に型をつけることがあり、指定した型以外の値が入るとTypeErrorが表示され、不適切であることを知らせてくれます。

参考資料↓
https://qiita.com/minato-naka/items/cc9da5fc1bc8cc4240a8

下記のソースコードを書いて実行しました。
するとコンソールで苗字を聞かれるので 魚戸 と入力してEnterキーを押し、次に名前を聞かれるので ホタル と入力すると次の行で 魚戸ホタル と出力されます。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UotoHotaru0315_5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string str1, str2;
            Console.Write("苗字 = ");
            str1 = Console.ReadLine(); // 1つ目の変数に苗字を入力
            Console.Write("名前 = ");
            str2 = Console.ReadLine(); // 2つめの変数に名前を入力
            Console.WriteLine("str1 + str2 = {0}", str1 + str2); // 苗字と名前を組み合わせて氏名を出力
        }
    }
}

実行結果

あとintやstrをつけて宣言した変数は書き変えることができます。
書き換えられたくないのであればintやstrの前に const をつけると後で代入するコードを書いても書き換わりません。
書き換わらない変数を 定数 と呼びます。

また先頭にintやstrではなくvarをつけると 型推論 になります。
変数に値を入れると自動的に変数の型を推論し、数値であればint型、文字列であればstring型の変数として宣言してくれます。
マイクロソフトは右辺の型が明確な時やforのループ変数の型決定で型推論を推奨しているそうなので実際に実務でC#を使う機会が来たら先輩方がどのように変数定義しているか見ようと思います。[1]

C#における条件分岐

if文

1日目で書いたように、アルゴリズムの三大処理は順次処理、分岐処理、繰り返し処理です。
2日目では上記の三大処理のうち分岐処理について勉強しました。

条件分岐にはif文を使います。
「もしも~だったら、…する」という処理に用います。
またif文の条件が成り立たない場合はif文を閉じた後にelse文を書き、else文中に書いた処理が実行されます。
さらに条件が複数なる場合はif文とelse文の間にelse if文を書きます。

以上の文法を踏まえ、条件分岐があるプログラムのソースコードを書くと次のようになります。
コンソールで1,2,3のいずれかが入力された場合は女性、4,5,6のいずれかが入力された場合は男性、7が入力された場合は女の子、どれでもない場合は"不適切な値です。"と表示します。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UotoHotaru0315_7
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ナレーター番号を入力
            Console.Write("ナレーター番号:");
            // コンソールから数値を入力
            int narratornumber = int.Parse(Console.ReadLine());
            if (1 <= narratornumber && narratornumber <= 7)
            {
                // 入力された番号で処理を分ける
                if (narratornumber == 7)
                {
                    // 7であれば女の子
                    Console.WriteLine("女の子");
                }
                else if (narratornumber <= 3)
                {
                    // 1,2,3であれば女性
                    Console.WriteLine("女性");
                }
                else
                {
                    // 4,5,6であれば男性
                    Console.WriteLine("男性");
                }
            }
            else
            {
                Console.WriteLine("不適切な値です。");
            }
        }
    }
}

実行結果

実行結果からコンソールで3が入力されたためelse if文の条件に合致し処理が行われたことが確認できました。
まず数値を入力してから次の文にあるif文で1以上7以下の数値であれば文中の処理を実行するようにしています。
7が入力されていれば narratornumber == 7 の条件に合致し処理が行われ「女の子」という文字が表示されます。
4, 5, 6のいずれかが入力されていればどれにも当てはまらないためelse文中の処理が実行され「男性」という文字が表示されます。

上記のようにif文を使って条件によって処理を分けることができることを確認しました。
条件分岐にはif文だけでなくswitch文もございますので、次はswitch文を紹介します。

switch文

switch文はカッコ内に書いた変数の値で条件を分岐させる構文です。
変数と数値の一致判定のみできるため、if文を限定させた形になります。
一致判定であればswitch文を使った方がよりシンプルに条件分岐処理を書くことができます。

switch文の書式は以下の通りです。

条件はcase(ケース)で書き、来た値からどの処理を実行するか決めます。
最後にdefault(デフォルト)という条件でいずれの条件にもあてはまらない場合実行する処理を示します。
break(ブレイク)は処理の終了を意味しており、caseの最後に書いておかないとエラーになります。
breakを入れない処理をフォロースルーといいますが、C#ではフォロースルーを禁止しています。

if文の例として書いたソースコードをswitch文を使って書き直すと下記のようになります。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UotoHotaru0315_7
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ナレーター番号を入力
            Console.Write("ナレーター番号:");
            // コンソールから数値を入力
            int narratornumber = int.Parse(Console.ReadLine());
		switch (narratornumber)
		{
			case 7:
				Console.WriteLine("女の子");
				break;
			case 1:
			case 2:
			case 3:
				Console.WriteLine("女性");
				break;
			case 4:
			case 5:
			case 6:
				Console.WriteLine("男性");
				break;
			default:
				Console.WriteLine("不適切な値です。");
				break;
		}
	}
    }
}

実行結果

実行結果からif文の例と同様の結果を返したことがわかりました。
case 1 の後に改行して case 2case 3 を書いていますが、1と同じ処理を2と3でも実行するという意味です。
先ほどif文で書いたソースコードよりも必要な分量が抑えられ見やすくなりました。

switch文は一致条件の場合に使うとコードが整理されて読みやすくなります。

最後に

条件分岐のソースコードで例に出したナレーター番号はDreamtonics社が開発し(株)AHSが販売しているVOICEPEAKにおけるナレーターの番号です。
今月3/11に製品版が販売開始され、前々から合成音声技術に注目していたため購入しました。
メモをコピペして貼り付け、音声を聞くことで振り返りに使っています。
聞き取りやすく、顔写真等の設定がないため人間臭くないのが良いです。

https://www.ah-soft.com/voice/6nare/

ありがとうございました。Thank you。

脚注
  1. https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables ↩︎

Discussion