Skip to content

CS_basic_grammar2

ayutaku edited this page Feb 3, 2022 · 23 revisions

基本文法2

Swiftの基本文法です。自分のパソコンで実際にコードを書きながら覚えていきましょう。

目次

参考コードはこちら


復習 基本文法1の変数の型の部分でbool型を学びました。trueとfalseの2つの値を持つ型です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        bool isMac = true;
        Debug.Log(isMac);//trueが出力
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

(Debug.Log()でboolを出力する場合はtrue,falseでなく、True,Falseと出力される場合がありますが、意味は同じと考えて頂いて問題ありません)

ここでは比較演算子と論理演算子について学んでいきます

比較演算子

2つの値を比較するための演算子です。まずは「==」についてです。これは左右の値を比較して、等しい場合はtrue、等しくない場合はfalseを返す演算子です。数学の「=」の意味に近いかもしれません。

int x = 10;
int y = 5;
int z = 5;

Debug.Log(x == y);//falseが出力
Debug.Log(z == y);//trueが出力

次に「!=」は「==」の否定の意味となり、逆の値が出力されます。

int x = 10;
int y = 5;
int z = 5;

Debug.Log(x != y);//trueが出力
Debug.Log(z != y);//falseが出力

続いて大小比較です。以下の例を見てみましょう。

int x = 10;
int y = 5;

Debug.Log(x < y);//falseが出力
Debug.Log(x <= y);//falseが出力

Debug.Log(x > y);//trueが出力
Debug.Log(x >= y);//trueが出力

//ちなみに式を比較することも可能
Debug.Log(x/2 < y);//falseが出力
Debug.Log(x/2 <= y);//trueが出力

数学の<,>と同じような意味なので直観的に理解しやすいと思います。注意点は、数学の≦や≧をプログラミングではぞれぞれ<=、>=と記述する点です。

練習問題2-1. 12*30と365を「==」で比較して、結果を出力しましょう。

論理演算子

 数学の「かつ」、「または」、「否定」の意味です。以下の表がのように対応しています。

演算子 意味
&& かつ
|| または
! 否定

AND演算子の&&は左右の両方がtrueの場合にtrueを出力します。それ以外はfalseです。

int x = 10;
Debug.Log(x > 0 && x < 30);//trueが出力

OR演算子の||は左右のどちらか少なくとも一つがtrueの場合にtrueを出力します。それ以外はfalseです。

int x = 10;
Debug.Log(x > 0 || x == -10);//trueが出力

NOT演算子は後に続く値を否定します。

Debug.Log(!false);//trueが出力

練習問題2-2. 「10 < 5」かつ「4 >= 2」の結果を出力しましょう

if文を用いると、場合分け処理を行うことができる。「もし~ならば、××」の意味。

if文は以下のような形で書き、もし条件式がtrueでならば、{}内の処理が行われる。

if (条件式){
    処理
}

以下が具体例

int value = 5;
if (value > 0){
    Debug.Log("valueは正の数");
}

出力結果
valueは正の数

また、else(「そのほかの」という意味)を用いることで、「もし~ならば、××、そうでなければ〇〇」という意味になる。以下のように書く。

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

具体例は以下

int value = -5;
if (value > 0){
    Debug.Log("valueは正の数");
}else{
    Debug.Log("valueは正の数ではありません");
}

出力結果
valueは正の数ではありません

またelse ifによってさらに条件分岐をすることができます。「もし~ならば、××、もし~~~ならば△△、そうでなければ〇〇」という意味になる。以下のように書く。

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

具体例は以下

int value = -5;
if (value > 0){
    Debug.Log("valueは正の数");
}else if(value == 0){
    Debug.Log("valueは0");
}else{
    Debug.Log("valueは負の数");
}

出力結果
valueは負の数

なお、複数の条件に合致しても、実行されるのは最初に合致した条件式の処理のみです。また、else ifはいくつでも書くことができます。必要がなければelseは書く必要はありません。

練習問題 2-3. 成績判定システムをつくろう!int型でscoreを定義し、0から100までの任意の整数で初期化する。そして、scoreが90以上なら「あなたの成績はA」、70以上なら「あなたの成績はB」、それ以外ならば「あなたの成績はC」と出力させよう。またscoreの初期化の値をいろいろと変えてみて、正常に動いているか確認しよう。

条件分岐の式としてswitch文があります。特に、条件が多い時はif文よりも場合分けをさらに簡潔に書くことが可能です。
以下のように書きます。

switch(条件の値){
    case 値1:
        処理1 
        break;
    case 値2:
        処理2 
        break;
    case 値3:
        処理3 
        break;
    default:
        処理4 
        break;
}

条件の値とcaseの後ろにある値が一致した時、その部分にある処理が実行されます。それぞれの処理の最後にbreakを書くことを忘れないようにしましょう。breakを書かないと、そのまま次のcaseの値の比較を続けます(最後までいかないとswitch文を抜け出せなくなる)。また、defaultはどのcaseにも一致しなかった場合に実行されます。必要がなければdefaultは書かなくても問題ありません。

if文との対比で具体例をみてみましょう

int rank = 2;
if(rank == 1){
    Debug.Log("金メダル"); 
}else if(rank == 2){
    Debug.Log("銀メダル");
}else if(rank == 3){
    Debug.Log("銅メダル");
}else{
    Debug.Log("参加賞");
}

出力結果
銀メダル

int rank = 2;
switch(rank){
    case 1:
        Debug.Log("金メダル"); 
        break;
    case 2:
        Debug.Log("銀メダル"); 
        break;
    case 3:
        Debug.Log("銅メダル"); 
        break;
    default:
        Debug.Log("参加賞"); 
        break;
}

練習問題 2-4. おみくじシステムをつくろう!int型でnumberを定義し、任意の整数で初期化する。switch文を用いて、numberを5で割ったあまりが0の時は「大吉」、1の時は「中吉」、2の時は「吉」、3の時は「凶」、それ以外の時は「大凶」と出力させよう。

for文を使うと繰り返し処理を簡単に行うことができる。例えば以下のようなコードを考えてみよう。

Start(){
    Debug.Log("羊が1匹");
    Debug.Log("羊が2匹");
    Debug.Log("羊が3匹");
    Debug.Log("羊が4匹");
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹

これを100匹まで行うとしたら、100回コピペすることになる。そうではなく、繰り返しの処理を使うことで簡単に書くことができる。

Start(){
    for(int i = 1;i <= 4;i++){
        Debug.Log("羊が" + i + "匹");
    }
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹

for文は以下のように書く。

for(変数の初期化;条件;変数の更新){
    処理
}

まず最初に変数の初期化を行い、その後条件判定をする。この値がtrueであれば、処理を実行し、最後に変数を更新する。そして、もう一度条件判定し、falseであればこのfor文は終了する。trueであれば処理が行われ、変数の更新、条件判定。。。。。と続いていく。

練習問題2-5. for文を利用して以下の図のような出力をするプログラムを組もう

forの練習

while文を用いても繰り返し処理を行うことができる。while文は以下のように書く。

while(条件){
処理
}

条件がtrueである限り、処理を繰り返す。

for文と比較してみよう!

Start(){
    for(int i = 1;i <= 4;i++){
        Debug.Log("羊が" + i + "匹");
    }
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹
Start(){
    int i = 1;
    while(i <= 4){
        Debug.Log("羊が" + i + "匹");
        i++;
    }
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹
注意点:無限ループ

for文やwhile文では条件がずっとtrueであれば無限にループしてしまう。コンピュータへの負荷が大きくなってしまうので、無限ループしないようなコードを書きましょう。以下無限ループの例

Start(){
    int i = 1;
    while(i <= 4){
        Debug.Log("羊が" + i + "匹");
        //i++;//iの値がプラスされない
    }
}

出力結果

羊が1匹
羊が1匹
羊が1匹
羊が1匹
・
・
・
羊が1匹
・
・

練習問題2-6. while文を利用して以下の図のような出力をするプログラムを組もう

forの練習
break,continue

繰り返し処理では条件がfalseになればその繰り返しが終了します。それ以外にもbreakを使ってそのループを強制終了させることができます。

Start(){
    int i = 1;
    while(i <= 16){
        if(i%5 == 0){
            break;//iの値が5の倍数であればループを抜ける
        }
        Debug.Log("羊が" + i + "匹");
        i++;
    }
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹

ちなみにswitch文でもbreakが出てきましたね。あれも同じ意味です。

continueはbreakと異なり、その周回のループを打ち切りにし、次の周回へ移行する命令です。

Start(){
    int i = 1;
    while(i <= 16){
        if(i%5 == 0){
            i++;
            continue;//iの値が5の倍数であればこの周回のループを抜けて、次の周回のループへ移行する
        }
        Debug.Log("羊が" + i + "匹");
        i++;
    }
}

出力結果

羊が1匹
羊が2匹
羊が3匹
羊が4匹
羊が6匹
羊が7匹
羊が8匹
羊が9匹
羊が11匹
羊が12匹
羊が13匹
羊が14匹
羊が16匹

5の倍数は出力されていませんね

配列は同じ種類のデータ型をまとめた変数のセットのようなものです。配列は仕切りがある箱のようなものです。配列のそれぞれの値は要素と呼びます。

配列

配列を宣言する際にはint型の配列ならint[],string型ならstring[]というように宣言します。そして、下のように{}の中に,(カンマ)で区切ることで値を書くことができます。

int[] numbers = {15,32,100};

配列の要素は前から「0,1,2・・・」と数字が割り振られています(インデックス番号)。インデックス番号は0からスタートすることに注意!!以下のように配列名[インデックス番号]で値を得ることができます。

int[] numbers = {15,32,100};
Debug.Log("私の好きな数字は" + numbers[1] + "です");//私の好きな数字は32です が出力

練習問題2-7. string[] names を定義し、要素にグー、チョキ、パーを入れよう。そして、2番目の要素を出力させよう。

変数に代入して、その変数を上書きできるように、配列も同じようにして代入することができます。

string[] feelings = {"好き","普通","うーん"};
Debug.Log(feelings[0]);//好き が出力
feelings[0] = "大好き!";
Debug.Log(feelings[0]);//大好き! が出力

ちなみに配列で存在しない要素に値を代入しようとするとエラーになりますので注意してください。

string[] feelings = {"好き","普通","うーん"};
feelings[3] = "わーい!";//エラーになる。0,1,2番目の要素はあるが3番目の要素は存在しないため

配列と繰り返し

配列を利用すると繰り返し処理が簡単にできます。

for文を使わない場合は以下のようになります。

string[] names = {"まぐろ","いくら","あゆ"};
Debug.Log("私の好きな食べ物は" + names[0]);
Debug.Log("私の好きな食べ物は" + names[1]);
Debug.Log("私の好きな食べ物は" + names[2]);

for文を使うことで簡潔に書くことができます。

string[] names = {"まぐろ","いくら","あゆ"};
for(int i = 0; i < 3; i++){
    Debug.Log("私の好きな食べ物は" + names[i]);
}

ちなみに配列の要素の数を数えるLengthという機能が存在しています。配列名.Lengthという風に使います。

string[] names = {"まぐろ","いくら","あゆ"};
for(int i = 0; i < names.Length; i++){   //names.Lengthの値は3
    Debug.Log("私の好きな食べ物は" + names[i]);
}

練習問題2-8. string[] names を定義し、要素にグー、チョキ、パーを入れよう。そして、for文を使って「私が出したのはグー」、「私が出したのはチョキ」、「私が出したのはパー」と出力させよう。

new演算子

初期値が最初から決まっていない場合はnew演算子によって以下のように定義する。

int[] fibonacci = new int[10];//フィボナッチ数列を計算するシステム

fibonacci[0] = 1;
fibonacci[1] = 1;

Debug.Log("0番目は" + fibonacci[0]);
Debug.Log("1番目は" + fibonacci[1]);

for(int n = 2; n < fibonacci.Length; n++){   
    fibonacci[n] = fibonacci[n-1] + fibonacci[n-2];
    Debug.Log(n + "番目は" + fibonacci[n]);
}

出力結果

fib
int[] fibonacci = new int[10];

とすると、10個分の要素の配列ができる。(インデックス番号は0から9)

(多次元配列、ジャグ配列は割愛します)

Clone this wiki locally