Skip to content

CS_basic_grammar2

ayutaku edited this page Aug 5, 2021 · 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の倍数は出力されていませんね

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

Clone this wiki locally