1st term 2nd week - dsuz/csharp GitHub Wiki

制御構文1: 条件分岐 (if, switch)

if 命令の基本(単純分岐)

paiza ラーニングの演習問題 をやりましょう。

まずは、以下を覚えましょう。

if (条件式)
{
    // 処理
}

と書くと、条件式が真 (true) の時だけ "// 処理" の部分の処理(ブロックの内側)が実行される。 条件式が偽 (false) の時はブロック内の処理は実行されず、次の処理に移る。

ブロックを書く時は必ずインデントを正しく保つこと。

条件式と関係演算子

条件式を作るためには関係演算子を使う。最初に覚えなければならない関係演算子は ==, !=, <, >, <=, >= である。ほとんどは数学と同じ記号を同じ用法で使うが、以下の2つはそうではないので注意すること。

  1. == は両辺が等しいかどうか評価する(= はプログラミング言語では代入演算子である)
  2. != は両辺が等しくないかどうか評価する(! はプログラミング言語では否定を表す)

if 命令の多岐分岐 (else if, else)

paiza ラーニングの演習問題 をやりましょう。

次は、以下を覚えましょう。

if (条件式1)
{
    // 処理 1
}
else if (条件式2)
{
    // 処理 2
}
else if (条件式3)
{
    // 処理 3
}
else
{
    // 処理 4
}

と書くと、以下のような条件分岐ができる。

  • 条件式1 が true の時は "// 処理1" の処理が実行される
  • 条件式1 が false で 条件式2 が true の時は "// 処理2" が実行される
  • 条件式1, 条件式2 が共に false で 条件式3 が true の時は "// 処理3" が実行される
  • 条件式1, 2, 3 が全て false の時は、"// 処理4" が実行される
  • else if で条件をいくらでも分岐することができる

つまり、「もし A なら、そうではなくて B なら、そうではなくて C ならば、...、それらのいずれでもなければ」という条件分岐ができる。

ブロックごとのインデントは必ず正しく保つこと。

switch 命令

switch 命令については今はやりません。教科書に載っているので、興味があったら読んでみて使ってみるとよいでしょう。switch 命令を使う事で条件分岐を簡潔に書ける場合がありますが、switch で書けることはすべて if で書くことができます。

参考資料

  • 『独習 C#』
    • 3.3 関係演算子
    • 4.1 条件分岐

その他の型、型の変換

その他の型

現時点では int(整数), string(文字列)型を使っているが、他に基本的な型(よく使う、必ず覚えておかなければならない型)には以下がある。

  • bool - true か false しか入らない
  • char - string は文字列だが、char は文字である。つまり「一文字」しか入らない。string が "abc" と " " で囲むのに対して、char は 'a' と ' ' で囲む。
  • double - 実数
  • float - 実数

double と float は表すことができる範囲が異なる。double の方が範囲が広い。しかしその分メモリを多く使う。一般的なプログラミングでは double が多く使われるが、ゲーム開発においては基本的に float を使う。なぜなら一般的なゲームでは float の範囲が使えれば十分であり、なるべくメモリ使用量を抑えたいためである。

以下のプログラムを実行してみましょう。Visual Studio でも paiza.io でもよいでしょう。

using System;

public class Program
{
    public static void Main()
    {
        int n = 100;
        bool flg = (n < 10);  // bool 型の変数に条件式の評価結果を代入する
        
        if (flg)
        {
            Console.WriteLine($"{n}は10より小さい");	// この書き方は「2.3.5 文字列リテラル」の「文字列への変数展開」に説明がある
        }
        else
        {
            Console.WriteLine($"{n}は10以上");  // 「以上・以下」と「より大きい・より小さい」は正確に理解すること
        }
        
        // char 型
        char chr = 'x';
        Console.WriteLine(chr);
        
        // double と float
        int a = 5, b = 11;
        double d = b / a;
        Console.WriteLine(d);   // 整数と整数を計算しても整数になってしまう
        d = (double) b / a;     // 実数として扱いたければ、どちらかを変換(キャスト)する
        Console.WriteLine(d);
        
        d = 5.85213;
        Console.WriteLine(d);
        
        float f = 1.285f;       // float の場合は値の後ろに f をつける必要がある
        // float g = 1.2456;    // f をつけないとコンパイル エラーになる
        Console.WriteLine(f);   // float を出力しても後ろ f とはつかない
    }
}

型の変換

参考資料

  • 『独習 C#』
    • 2.2 データ型
    • 2.3.3 数値リテラルにおける型サフィックス
      • f を数値の後ろにつけて float を表すことについて載っている
    • 2.3.5 文字列リテラル
      • 「文字列への変数展開」の箇所に $"文字列{変数}文字列" で文字列と変数を結合する方法について紹介されている
    • 2.4 型変換

配列

paiza ラーニングの演習問題 をやりましょう。

ここで必ず覚えなければいけないのは次の事です。

  1. 配列 (array) は複数の変数をまとめて一つの変数にすることができる
  2. 配列には複数の「要素」があり、各「要素」には値が入っている
  3. 配列の要素数の事を「(配列の)長さ」という
  4. 一つの配列の要素は全て同じ型でなければならない
  5. 配列に含まれる「要素」に値を代入(書き込み)したり、値を使う(読み込み)時は「添え字」を使って要素を指定する
    • 添え字は 0 から始まる。1 からではない。従って「3 番目の要素」の添え字は「2」になる。
    • 「添え字」は「そえじ」と読む。「てんじ」ではない。
    • 「添え字」は英語では index という
  6. 配列変数を宣言するにはいくつかの方法がある(後述)
  7. 配列の要素数は宣言時に決まり、後から要素数を変えることはできない

引き続き演習2, 3 を一緒に解答していきましょう。

配列変数の宣言方法

以下のように、配列には複数の宣言方法がある。

// 例1: 配列変数を宣言だけして、値は入れない
int[] intArray1 = new int[5];		// 要素数 5、要素の型が int の配列を宣言した。この時点では全ての要素の値は 0(int の既定値)である。
string[] strArray1 = new string[4];	// 要素数 4、要素の型が string の配列を宣言した。この時点では全ての要素の値は空である。

// 例2: 配列変数を宣言して初期化する、つまり値を入れる
int[] intArray2 = { 4, 3, 93, 6, 321, 13 };				// int の配列を宣言し、値を入れて初期化した。要素数は 6 である。
string[] strArray2 = { "apple", "orange", "banana" }; 	// string の配列を宣言し、値を入れて初期化した。要素数は 3 である。

配列の概念

よくある配列の説明(ゆるゆるプログラミング より)

参考資料

  • 『独習 C#』2.5.3 配列型

Split() を使って分割された文字列を配列にする

これはとてもよく使うので、必ず覚えてください。

"banana,apple,orange" といった「カンマ区切り」の文字列や、"39 25 1" といった「スペース区切り」の文字列を分割して配列に入れたい事が非常によくあります。paiza の問題でも頻繁に出てきます。

このような時には文字列に対して Split() を呼んで分割します。以下のコードを実行してみましょう。

using System;

public class Program
{
    public static void Main()
    {
        string fruitString = "banana,apple,orange";
        var fruits = fruitString.Split(',');    // ',' (char型)で区切って配列変数に代入している。string[] と入力するのが面倒なら var でよい。
        Console.WriteLine(fruits[0]);
        Console.WriteLine(fruits[1]);
        Console.WriteLine(fruits[2]);
        
        fruits = "kiwi-strawberry-pineapple".Split('-');    // '-' で区切っている。文字列から直接 Split() を呼ぶこともできる。
        Console.WriteLine(fruits[0]);
        Console.WriteLine(fruits[1]);
        Console.WriteLine(fruits[2]);
        
        // とてもよく使うやり方(スペース区切りで与えられた複数の値の平均値を求める)
        string numString = "2 3 5";
        var numbers = numString.Split(' '); // ' '(半角スペース)で区切っている
        int sum = int.Parse(numbers[0]) + int.Parse(numbers[1]) + int.Parse(numbers[2]);    // sum とは「合計」のこと
        Console.WriteLine((float) sum / numbers.Length); // 平均値を求める。配列変数.Length で「配列の要素数」を表す
    }
}

Split() を使った演習問題はこの後に出てきます。

参考資料

  • 『独習 C#』5.1.7 文字列を特定の区切り文字で分割する

制御構文2: 反復処理 (for, foreach, while, do...while)

for 命令

paiza ラーニングの演習問題 をやりましょう。

ここで必ず覚えなければいけないのは次の事です。

for 命令の文法

for 命令の文法は以下の通り。

for (;;)
{
	// ループさせたい処理
}

と書いた時ブロック内の処理は以下のルールで繰り返し実行される
  • ①は最初のループに入る前に実行される。ループカウンタ変数の初期化に使われることが多い。
  • ②はループが実行される条件を表す。この条件が真の時、ループ内の処理が実行される。偽の時は、ループ内の処理は実行せず次の処理に移る。
  • ③は一回ループが実行されるたびに実行される処理を書く。ループカウンタのインクリメント処理を書くことが多い。

今やった練習問題のように配列と組み合わせて使われることも多いです。

以下の事も知っておくとよいでしょう。

  1. ループカウンタ変数は int 型の i という名前が使われることが多い
  2. ループカウンタのインクリメント (i = i + 1) は、i += 1 とか i++ とも書ける
    • i++ を使う事が多い
  3. ループカウンタ変数 i の有効範囲(スコープ)はブロック内のみである

引き続き この演習問題 をやりましょう。

foreach 命令

paiza ラーニングの演習問題 をやりましょう。

ここで必ず覚えなければいけないのは次の事です。

foreach 命令の文法

foreach 命令の文法は次の通り。

foreach (var item in array)
{
	// ループさせたい処理
}

と書いた時ブロック内の処理は以下のルールで繰り返し実行される
  • 配列 array の中から先頭の要素を取り出して変数 item に入れてループを回す
  • ループが一周回ったら、配列から次の要素を取り出してまた変数 item に入れてループを回す
  • これを配列の全ての要素に対して行う

配列内の全ての要素に対して同じことをしたい時に使いやすいです。ゲーム開発ではよく使います。for より使用頻度が高いかもしれません。

以下のことも知っておくとよいでしょう。

  1. var はデータ型を書いてもよいが、配列から取り出す要素の型は(コンピュータには)書かなくてもわかるので、var で代用できる

Split() と反復処理を組み合わせる

paiza ラーニングの演習問題 をやりましょう。

break と continue

これについては多重ループを学ぶ際に詳しいことを学びます。ここでは簡単な説明だけしておきます。

break 命令を実行する (break; と書く)と、ループを強制的に中断して抜けることができる。

continue 命令を実行する(continue; と書く)と、今回のループをそこで中止し、次のループを始めることができる。

break 命令の方が圧倒的に使用頻度が高いです。continue は使用頻度はそれほど高くなく、やや難しい処理で使われます。

while 命令, do...while 命令

この2つの命令については教科書を参照してください。for 命令に比べて非常に簡単で、「条件式を満たしている間、ブロック内の処理を繰り返す」だけです。なお、while/do...while で書ける処理はすべて for で書くことができます。

参考資料

  • 『独習 C#』
    • 4.2 繰り返し処理
      • while, do...while, for, foreach
    • 4.3 ループの制御
      • break, continue

List を使う

paiza ラーニングの演習問題 をやりましょう。

ここで必ず覚えなければいけないのは次の事です。

List の使い方

リストは配列に似ています。配列は長さが決まっていて後から要素を追加・削除することができませんが、リストは後から要素を追加・削除することができます。

List<int> intList = new List<int>();	// 新しく int 型の List である変数 intList を宣言し、初期化する
intList.Add(1);	// Add で要素を追加できる
Console.WriteLine(intList[0]);	// 配列のように添え字を指定して要素を取り出せる

List<string> strList = new List<string> { "black", "red", "white" };	// 配列のように要素を初期化することもできる
strList.Remove("red");	// 要素の値を指定して削除することができる
strList.RemoveAt(1);	// 要素の添え字を指定して削除することもできる(よく使うが、なぜか教科書に載っていない)

次のことも必ず覚えなければなりません。

  1. List を使う時はプログラムの先頭に "using System.Collections.Generic;" と追加する必要があります
    • これを忘れた時でも、Visual Studio を使っていれば指摘してもらえます
  2. 配列変数.Length で配列長を知ることができましたが、List の場合は List変数.Count で要素数を取れます
    • 最初の内は Visual Studio にガイドしてもらいながら慣れましょう
  3. 配列を List に変換したい時は 配列変数.ToList() で変換できる
  4. List を配列に変換したい時は List変数.ToArray() で変換できる

参考資料

  • 『独習 C#』6.2 リスト

デバッグ実行とブレークポイント

プログラムを実行中に「変数の中身」を知りたいことがよくあります。Console.WriteLine() で変数の中身を出力して調べることもありますが、Visual Studio を使っている場合は便利な機能があります。以下のようにして、任意の行で実行を止めて一行ずつ実行しながら変数の中身を見ることができます。

  1. 止めたい行の左側をクリックして「ブレークポイントを張る」
  2. F5 を押して「デバッグ実行」する
  3. ブレークポイントで実行が止まる
  4. 「ローカル」ウインドウで現在の変数の中身が見られる
  5. 変数にマウスのポインタを当てると変数の中身が(見られる場合は)見られる
  6. F10 を押すと一行ずつ進める(ステップ オーバーする)ことができる
  7. F5 を押すと次のブレークポイントまで実行される
    • 次のブレークポイントがなければそのままプログラムは終了する

Visual Studio には便利な機能がたくさんあります。なるべく使いこなせるようになりましょう。

参考資料

  • 『独習 C#』1.3.3 デバッグの基本

オンライン実行環境

ちょっと確認したいが Visual Studio を起動するほどのことでもない時、オンライン実行環境を使えばブラウザのみでプログラムを入力して実行することができます。このようなものは以下のようにたくさんあります。コードを人に送りたい時にも活用できます。

名前 特徴
paiza.io 日本製。入力をまとめて事前に入れておくことができる。コードを保存して共有できる。
.NET Fiddle C#, VB.NET, F# のみ対応。自動補完ができる。コードを保存して共有できる。
myCompiler 対応言語が豊富。入力をまとめて事前に入れておくことができる。コードを保存して共有できる。
OneCompiler
ideone.com

課題

  1. paiza ラーニングの C#体験編1: C#をはじめよう の「10:条件に一致したら処理を実行する」から「16:複数のデータを分類する」までの演習を全て正解する
    • 合計 11 問あります
    • 受講する(動画を見る)必要はありませんが、演習が解けない場合は動画を見て学んでもよいでしょう
    • 動画は見ていなくても受講済みにしてしまって構いません
  2. paiza ラーニングの C#入門編2: 条件によって処理を変えてみよう, C#入門編3: ループ処理を学ぶ, C#入門編4: 配列の基礎 の演習を全て正解する
    • 合計 50 問あります
    • 受講する(動画を見る)必要はありませんが、演習が解けない場合は動画を見て学んでもよいでしょう
    • 動画は見ていなくても受講済みにしてしまって構いません

次回の予告

次回は以下について学びます。

  1. メソッド(関数)
  2. 引数(パラメーター)
  3. 戻り値
  4. 多重ループ
  5. 多次元配列
⚠️ **GitHub.com Fallback** ⚠️