ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

インデクサについて

みなさんこんにちは🌚

家のWi-Fiの調子が良くないのでせっかく無料体験中なのにネットで映画がうまく見れないブルーノです。ルーターはレンタルから自分のものに変えたはずなんですが.....

さて今回はインデクサについてです。インデクサは、使い方がプロパティに似ており、インスタンスを配列のように扱うことができるものです。

 

インデクサについて

インデクサは、次のように定義します。

配列の要素の型 this[インデックスの型 インデックス]

{

      get {};

      set {};

}

 

前回やったプロパティと同じ方法ですね。インデックスとは、単純に訳すなら英語で「索引」のことで、ようは目次みたいなものですね。収納するものの番号がこれに当てはまります。プロパティと同じように、getとsetアクセッサを使うことで配列のそれぞれのインデックスにアクセスすることができます。では、単純な例を下に貼ります。

f:id:covory10101101276:20170923220946p:plain

f:id:covory10101101276:20170923220954p:plain

ちゃんとセットした値全てを表示できましたね。配列には5つ要素がありますが、何も入れない場合も反映されるか見るために4つしか入れていません。普通に実行されるようですね。

一つ気になったことがありこのプログラムのBruno024クラスに配列を2つ入れるとどうなるのか、getやsetアクセッサにある配列の名にアクセスするのかなとも思いましたがそれだと少しスマートじゃない気もしました。アクセスするとスローもなく永遠に進まなくなるだけで、強制終了する時の警告文は「mono32が実行中ですが中止しますか?」でした。これを解決するために、インデクサの数も増やしたり、thisの部分を配列名に変えてみましたが、前者はthisが二つあり実行不可、後者はthisキーワードを用いていないので不可という結果になりました。特に後者はインデクサを使用する際の配列の指定はthisじゃなければならないということでとても興味深かったです。もしどなたかこれらについてわかる方がいらっしゃいましたらぜひ教えていただきたいです。

 

さて今回はここまでにしておきます。ここに書いたこと以上にこの要素は奥が深く、今後重要になってくるはずですので、よく理解を深めておきます。

 

時間というものは本当に一瞬で過ぎていきます。気を抜いたらあっという間に1日が終わっていて、何度も同じ繰り返しのように見えて、絶対に戻ってきているわけではないし、確実に終わりは訪れるものです。子供の頃は時間が経つのが遅く感じていましたが、今思うとあの頃はあらゆるものに対して自分の中で絶え間なく考察を繰り返していたからかなと思います。知っていくことが増えていく中で諦めや妥協は身に付けたくないですね。子供の頃見てたデジモンフロンティアのWith the Willという歌で同じことを言っていました。なんだか明日からまた頑張れそうです😄

スコール(FF8)

f:id:covory10101101276:20170922162934j:plain

みなさんこんにちは🌚

全然あげてなかったのでスコール描いてみました。そういえばスコールも全身真っ黒ですね。FF15の先輩といったところでしょうか。鉛筆で色々ごまかしていますが色を塗るとなると難しいですね。こちらの方も勉強したいです

FF8は昔ハードオフでPS版が100円で売ってたので買ったのですがジャンクションシステムも興味深いですしカードゲームも時間を忘れてやりましたね。過去すぎて記憶がもううっすらとしか残っていませんが😓リノアが不安定すぎてみてて不安になっていた思い出があります。

プロパティについて

みなさんこんにちは🌚

友達がみんなこの夏休みに外国とか実家とか行ってるのに一人だけ相変わらず残ってテニスとプログラミングざんまいのブルーノです!LINEポイント欲しさにU-NEXTの一ヶ月体験を登録したら思いの外楽しいです😆でも勉強もしていきましょう!

さて今回はプロパティについてです。プロパティという言葉ならパソコンを使っている時にたまに目にする人もいるんじゃないでしょうか。それと関係があるのか今日は調べていきたいと思います。

 

プロパティについて

プロパティは、変数に値を入れる時に制限を設けられるシステムです。これはどういうことかというと、例えば身長や体重などの値を入力してもらいたい時、ここに負の値を入れられては困りますよね?そういう時にこのプロパティを使うことで簡単に制限することができます。ifキーワードを使ってもできますが長いメソッドを書く必要があります。プロパティの例としては

データ型 プロパティ名

{

   get 

      {

          return xxx;

      }

   set

      {

          xxx = value;

      }

}

 

 

といった感じです。このgetsetがそれぞれ取得する際収納する際に用いられるアクセッサというものです。このアクセッサはどうやら最初から決められている一つのメソッドのようです。value; とありますが意味の通り値であり、プロパティに入れる値はここに収まります。なおポイントとしては、プロパティは値を格納するものではないということです。あくまでフィルターのような役割を果たすだけなので、上に xxx とあるように収納する変数は事前に宣言しておきましょう。では例として、昔作ったBMIを測るプログラムに負の値を入れられないよう、このプロパティを使ってみましょう

f:id:covory10101101276:20170921214342p:plain

f:id:covory10101101276:20170921214345p:plain

f:id:covory10101101276:20170921214349p:plain

こんな感じですね。64行めと72行めにあるようにBruno023クラスのメインメソッドで用意した身長と体重の値をそれぞれblpropメソッドとbwpropメソッドに入れています。この時の値が0以下なら弾かれるというわけですね。

では今回はここまでにします。{}の数が多くて一見複雑なように見えますがよく見ると大したことはないですね。もっとこの中身が増えていけば複雑なプログラムになるんだろうなと思います。

 

すっかり夏の暑さもいなくなり日の出る時間も短くなって行ったように感じます。今年も今年もまた冬が始まりますね。それはまだ早いか🤧

槇原敬之さんの「冬がはじまるよ」いいですよね!マッキーはほんと名曲ばっかりです。

静的メンバについて

みなさんこんにちは🌚

スーパーマリオオデッセイがとっても面白そうだなとYoutubeをみて思いましたブルーノです。まあニンテンドースイッチ持ってないんで私はプレイできないんですが(笑)さて今回は静的クラスについてです。読み方は「せいてき」であってるんでしょうか。

 

静的メンバとは?

この静的クラスについて私は一口で飲み込むことができませんでしたが、何度か調べているうちに感じたことを私なりにまとめてみようと思います。静的クラスとは、文字通り静か、動的ではないメンバのことです。静的メンバの特徴は大まかに

といったことが挙げられます。インスタンス化とは

Bruno000 b = new Bruno000()

というアレですね。

シールとは英語で封印するという意味ですね。今はまだやっていませんがシールされると継承ができません。封印とか継承とかめっちゃかっこいいですね。これらについてはまた別の機会にまとめます。

要はこのstaticキーワードを使うと、無駄なインスタンス化の手間が省けるということですね。他にも理由はありそうですが、とりあえずざっとみた感じはこんな感じでした。では例として、下に摂氏と華氏の相互計算を行うプログラムを組んでみました。なお、これはマイクロソフト社のC#の説明をしているサイトのものをそのまま使っているので詳しいことや細くはそちらを見ることで補完できます。

f:id:covory10101101276:20170920202229p:plain

f:id:covory10101101276:20170920202233p:plain

f:id:covory10101101276:20170920202238p:plain

あ、クラス名をブルーノにし忘れた😅 下のクラスの中身を見ればわかるように上のクラスをインスタンス化せずに使用していますね。はっきり言って現段階ではこれがなんの役に立つのかは今の私には具体的にわかりませんがあとで活かせるように覚えておきます。

では今回はここまでにしておきます。

勉強のモチベーションを上げるために映画の「ソーシャル・ネットワーク」や「スティーブ・ジョブズ」を見たんですが世界が違いました(笑)しかし後者はジョブズの理念などを描いていてそちらの面でも参考になりました。

将来何やってるんだろ。見当もつかないや

メソッドのオーバーロードについて

みなさんこんにちは🌚

台風に見舞われて明日試合だというのにちっともテニスの練習ができないブルーノです。こんな日はプログラミングの勉強に限りますね。さて今回はメソッドのオーバロードについて勉強していきます。なんか突然かっこいいワードが出てきましたね。楽しみです

 

メソッドのオーバーロード

メソッドは基本的に同じクラスに一つしか持つことはできませんが、実はパラメータリスト(引数)が異なれば、同じ名前のメソッドを持つことができます。これをメソッドのオーバーロードと言います。では具体的にどういうことか、実際にプログラムを組んでみます

f:id:covory10101101276:20170917100557p:plain

結果は下のようになります。

f:id:covory10101101276:20170917100603p:plain

5, 10, 15, 20行めにあるように、4つとも同じ名前ですが、引数が違いますね。このメソッドの名前+引数の組み合わせのことをシグニチャ(signature)と言います。オーバロードは、メソッドの中身がほぼ同じで、引数の型が違うプログラムなどを作る際に用いられるようです。

params キーワード

では、この入力される引数の数が変動する場合はどうでしょうか。例えばユーザーが入力した分だけ引数を設けたいときなどです。3個くらいと決まっていれば、1〜3の引数を持つメソッドのオーバーロードですみますが、引数の数が確定されていない場合はいくら設けてもキリがありませんよね。そんな時は、paramsキーワードが使えます。

戻り値 メソッド名(params 型[] 引数名)

とすることで呼び出し側の用意した引数がその数だけ配列に格納されます。メソッド内でこの配列を調べることでその内容を取り出せます。ただしこの場合、引数は全て同じ型でなければなりません。では、その例を下に載せます

f:id:covory10101101276:20170917104826p:plain

f:id:covory10101101276:20170917104831p:plain

どれだけお寿司を頼んでもちゃんと全て作って出してくれましたね。私もこれくらい正確に素早く全てのお客さんのオーダーを捌けるようになりたいです。

 

今回はここまでにしておきたいと思います。paramsの引数をユーザーの入力分だけ増やすにはforループとConsole.ReadLineを使えばいいのかな?うーん。

少しずつ理解はしてきたような気もしますがまだ自分で自由に組むことは難しいようです。自分で使えなければ理解したことにはなりませんよね。もしアドバイスをいただけるならどなたでもどうかお力添えを賜りたいです。

明日はテニスの試合だし、学校も始まったら勉強しなきゃ行けないし、時間がいくらあっても足りない😂😭

メソッドの参照について

みなさんこんにちは🌞

ずいぶん久しぶりの更新になりますブルーノです。夏も終わりを迎えつつあり日も短くなってきましたね。私は夏よりも冬の方が温度的には好きなんですが日が短いと大好きなテニスをする時間も少なってしまうんですよね(´;Д;`)

 

さて今回は、メソッドに渡した引数、パラメータについてです。私がこれまで練習してきた引数を扱うメソッドは主に、呼び出した引数を加工するものでした。

例)

int x, y;

....

 

p.method (x, y); 

 この時、メソッドがxやyの値を変更したとして、そのクラス内でその変更された値を使おうとしても呼び出したxやyの値を変更することはできません。例として、下の画像のようになります。

f:id:covory10101101276:20170913220704p:plain

f:id:covory10101101276:20170913220716p:plain

これは、メソッドで普通に値を呼び出した場合、そのまま値が渡されるのではなく、そのコピーが渡されているからです。この方法は値渡しと呼ばれています。以前、値型と参照型についてやりましたが、これとは別物であることに注意が必要です。別に参照型の値を渡しても(ex. string型)値渡しと呼ぶので気をつけましょう。

 

では一方で、引数そのものを加工したい時はどうすれば良いのでしょうか。この場合は、引数の前にrefキーワードをつけて呼び出します。

例)p.method (ref x, ref y);

例として、さっきのプログラムに付け足して以下のようになります。

f:id:covory10101101276:20170913220905p:plain

f:id:covory10101101276:20170913220915p:plain

この場合、呼び出し元の値を加工することで呼び出し側の値を変更することができます。一つ注意すべきことは、メソッドのパラメータリストだけでなく、呼び出し側にもrefキーワードをつけなければならないことです(上の画像でいう5行めと19行め)。これを怠ると、バグが発生してしまう恐れがあります。

 

さて、これで呼び出し側の値も変更できることがわかりましたが、ここで2点refキーワードについて特筆することがあります。それは

・呼び出し側を初期化しておく必要がある

・メソッド内で値を代入しなくてもコンパイルエラーにならない

ということです。前者は初期化した値に意味がなくても初期化しておかなくてはならない、後者はメソッド内で代入を忘れてしまっても気付けないというデメリットがあります。それをなくすために今度はoutキーワードというものを使います。先の例のプログラムで表すと以下のようになります。

f:id:covory10101101276:20170913230434p:plain

f:id:covory10101101276:20170913230441p:plain

先の例ではメソッド内で代入をすることがないためこのoutキーワードは使えなかったので、中身を代入するものに変えてみました。それ以外でさっきと違うのは13, 14行めにあるようにaやbを初期化せず、そのまま使用していることです。outキーワードの特徴としてはさっきのrefキーワードと対比させて書き表すと

・引数を初期化しなくても良い

・メソッド内で必ず値を代入しなくてはならない

ということがわかります。今回はこの3つの引数の渡し方について説明したところで終わります。

 

今年のテニスのUSオープンもすごい試合がたくさんありましたね。ナダルが優勝したのはナダルファンとしてはとても嬉しかったです。もう一つ目を見張ったのはフェデラーとデルポトロの試合ですね。デルポトロのサーブやらストロークやら強すぎて勝てる人はいないんじゃないかと思ってしまうくらいでした。

長い間更新をサボっていましたが、またどんどん勉強成果を載せていきます(別に更新していないからって全く勉強していないわけではないですよ....?)。

 

メソッドの再帰呼び出しについて

みなさんこんにちは

「疲れる」ってムダ機能じゃね?って最近思い始めたブルーノです。一日中疲れない体が欲しいなあ。さて今回はメソッドの再帰呼び出しというものについてまとめたいと思います。

 

メソッドの再帰呼び出しとは?

メソッドを書く際、その中で自らのメソッド自身を呼び出すことができます。

例)

public int method()

{

   .....;

   method();

   ......;

}

メソッドという名前のメソッド内で自らを呼び出しています。しかし単純にこう書いてしまいますといつまでたってもこのメソッドは終わらなくなってしまうため、終了させる工夫が必要になってきます。そこで今回は有名な再帰呼び出しの例として階乗の計算とフィボナッチ数列を紹介します。 

 

階乗の計算

階乗の計算とは、「n!」で表される特定の数nとそれ以下の全ての整数の積の計算のことですね。

例)5! = 5 × 4 × 3 × 2 × 1 = 120

これを再帰呼び出しを使って求めてみます。

f:id:covory10101101276:20170605160959p:imagef:id:covory10101101276:20170605161007p:image

CalcKaijoメソッドの中、13行目で自身であるCalcKaijoメソッドを呼び出しています。このメソッドの引数は与えられたnよりも1小さい数字になっています。ここがミソになっており、メソッドを呼び出すたびにこの再起呼び出しの方のCalcKaijoは1小さくなります。そのおかげでもしnが0になれば11行目で引っかかり、再帰呼び出しが終了する仕組みになっています。このように同じものを引き出すギミックを仕込む場合は当然ですがそのループを抜け出す工夫をしなければなりません。

f:id:covory10101101276:20170609135506j:image

 

同じような再帰呼び出しの例として、フィボナッチ数列というものも紹介しておきます。

 

フィボナッチ数列とは?

イタリアの数学者のフィボナッチさんが発見した数列で以下のような定義があります。

F1 = 1, F2 = 1,

nが3以上の時、Fn = Fn-1 + Fn-2

 つまり具体的に書くとこのようになります

F1 = 1

F2 = 1

F3 = F2 + F1 = 2

F4 = F3 + F2 = 3

F5 = F4 + F3 = 5

F6 = F5 + F4 = 8

.....

F3以降の式は再帰呼び出しを用いることで再現できます。実際にそれっぽく起こしてみましょう。

f:id:covory10101101276:20170807151857p:plain

f:id:covory10101101276:20170807151905p:plain

 

 F1とF2はそのまま式に当てはめちゃうと値がマイナスになって変なことになるのでコンティニューで飛ばし、先に書いておきました。今回はここまでとします。

 

大学生活の中では楽しいことも苦しいこともあるんですが自分から動くと結構楽しいことがあるんですねこれが(笑)ここ最近こそテストやらレポートやらで忙しかったですがこれからもどんどん書いていきたいと思います。早速台風には見舞われてますが、プログラミングは屋内でカタカタできるので楽で良いですね。宇宙兄弟おもしれー