-
Notifications
You must be signed in to change notification settings - Fork 0
CS_basic_grammar2
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文を利用して以下の図のような出力をするプログラムを組もう
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文を利用して以下の図のような出力をするプログラムを組もう
繰り返し処理では条件が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演算子によって以下のように定義する。
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]);
}
出力結果
int[] fibonacci = new int[10];
とすると、10個分の要素の配列ができる。(インデックス番号は0から9)
(多次元配列、ジャグ配列は割愛します)