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

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

静的メンバについて

みなさんこんにちは🌚

スーパーマリオオデッセイがとっても面白そうだなと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はそのまま式に当てはめちゃうと値がマイナスになって変なことになるのでコンティニューで飛ばし、先に書いておきました。今回はここまでとします。

 

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

数値-文字列間の変換と入力された型の判別について

みなさんこんにちは

"ヒトは飢えれば飢えるほどご飯を買い過ぎてしまう"

ブルーノです。今回はちょっとおさらいも兼ねて型の変換や判別の仕方についてまとめていきます。

 

Parseメソッド

今回は型変換の中でもよく使われるParseメソッドについて紹介します。例えば入力された値を計算に使いたい時、入力された値をそのまま使おうと思っても文字列型のため、うまく計算できません

Console.WriteLine("二乗したい数字を入力してください");

str nijou = Console.ReadLine();

このまま ReadLine で nijou を取得してもstring型なので加工できませんね。

じゃあ最初からintで代入させて

int nijou = Console.ReadLine にすればいいんじゃないか?って思ったんですがどうやらReadLineメソッドは文字列型しか返さないので入れる先は必然的にstring型になるようです。

そこで Parse メソッドを中に入れることで、任意の数字の型にしていれることができます。こんな風に

Console.WriteLine("二乗したい数字を入力してください");
int nijou = int.Parse(Console.ReadLine());

int.Parseの後の()に文字列型を入れることで左辺の用意した数値型の変数に変換できるのです。これで入力内容を数値型にできますね。では次に入力された内容が何型であるかを判別する方法に行きたいと思います。

 

Char.Is〇〇〇(str)について

先ほどは変換する方法についてやりましたが、そもそも入力された内容が必ず変換できるとは限らないのです。ユーザーの入力とは様々なのでそれを全てカバーする必要があります。今回はよく使われる

・Char.IsNumber()

・Char.IsDigit()

についてまとめます。この二つ、それぞれ()内に入力された内容が数字か、10進数かを求められます。返す値はbool型なので、主にif文で使われそうですね。

例)

 

f:id:covory10101101276:20170526142228p:imagef:id:covory10101101276:20170526142342p:image 

一桁でない場合や数字でない場合は弾かれるようにしました。にしてもアプリの仕様上インデントがすごく見づらくてスミマセン(汗

でも野球ファンの方は2桁がお気に入りの可能性があると思います。じつはTryParseメソッドというのを使えば2桁でしかももっと短くできるようです。c#内蔵のメソッドには便利そうなものがたくさんありますね。もっと勉強が必要そうです。

ArrayListクラスについて(既存のクラス)

みなさんおはようございます

梅雨に入りかけているのでしょうか雨の日が多くなってきてテニスがあまりできない日々が続いております。私はテニスを2日もやらないと感覚が狂ってしまう超不安定体質なので筋トレでなんとか運動している感覚をごまかしています。さて今回は既存の、用意されているクラスを使ってみたいと思います。

 

既存のクラスとは?

今までは自分でクラスをこしらえ、メソッドを定義してきましたが、実はC#にもともと入っているクラスというものがあるのです。Microsoftのホームページにはその中身が全部載っているのですがとても個人では定義しきれません。そんな膨大なクラスを内蔵してくれているおかげで我々はその一部を呼び出し使うことができるんですね。今回はその中でも便利なArrayListクラスについてやっていきましょう。ArrayListクラスはその名の通り列のリストを作るクラスで、Addメソッドで中にデータを格納し、Countプロパティでその要素数を確認します。

ArrayList インスタンス名 = new ArrayList(); でインスタンスを生成し、

Addメソッド:インスタンス.Add(格納するデータ);

Countプロパティ:int 変数 = インスタンス名.Count;

f:id:covory10101101276:20170526083155p:plain

f:id:covory10101101276:20170526083207p:plain

Addメソッドでarという名前のArraListクラスに数字を入れていき、ar.Countで要素の数を取得して平均値を出し表示するというものです。これも少し穴があり、入力画面で数字以外を入力するとスローされてしまいます。今度はそこらへんのケアの仕方も書いていきたいと思います。以上でArrayListクラスの説明を終わります。

コンストラクタとデストラクタ

みなさんこんばんは

給料日を迎えて少しウキウキしているブルーノです。しかしお金を貯めても使うのがもったいなくて結局ご飯くらいしか高いものを買えない貧乏性なのです(笑)さて今回は少し特殊なコンストラクタとデストラクタというメソッドについてやっていきます。

 

コンストラクタとは?

コンストラクタとは、インスタンスフィールドの初期値を設定したり、そのほかのものの初期設定をするためのものです。全てのクラスはコンストラクタ(constructor)というメソッドを持っています。ん?今までそんなメソッド定義した覚えないぞ?どうやら自分でコンストラクタを書かない場合、引数を取らないコンストラクタが自動で作成されているそうです。この自動で作成されているコンストラクタをデフォルトコンストラクタと言います。コンストラクタには以下の特徴があります。

・戻り値はなし(voidという意味ではない)

・クラスと同じ名前になる

・パラメータ(引数)を持つことができる(自分で書く場合は)

オーバーロードができる

・オブジェクトが生成されると同時に勝手に呼び出される

 4番目の中二感溢れるかっこいい名前のは後で書きます。

単純な例を書いてインスタンスフィールドの初期設定をしてみます

f:id:covory10101101276:20170525000519p:plain

f:id:covory10101101276:20170525000529p:plain

24行目でshowxメソッドしか呼び出していないのに実行時にコンストラクタ部分が呼び出されていますね。これは23行目でオブジェクトを生成した時に自動でコンストラクタが呼び出され、xに10を代入しその旨を伝えたからなのです。このようにクラス内で生成した変数の初期設定をするのに主に使われるようです。では次に先ほどでたオーバーロードについて説明します。

 

オーバーロードとは?

とってもかっこいいですよね。オーバーロードオーバーロードとは、その引数のデータ型や数が違う同名のメソッドを定義することです。ん?どういうこと?ちょっと言葉じゃ難しいですね。実際に作ってみます。

f:id:covory10101101276:20170525230312p:plain

f:id:covory10101101276:20170525230318p:plain

f:id:covory10101101276:20170525230323p:plain

19, 27, 35行目において同じ名前のコンストラクタを3つ定義しています。これらの違いは引数の組み合わせで、渡す引数によってどのコンストラクタが呼び出されるかが変わるわけです。この引数とメソッドの名前の組み合わせをシグニチャと呼びます

ちなみに13,14行目の〇〇◯.ToStringとはその前のデータを文字列(string型)に変換するメソッドです。

このように同じ名前のメソッドを多重に定義することをオーバーロードと言います。そして最後にデストラクタについて説明します。

 

デストラクタとは?

new演算子の役割はオブジェクトを生成することだと前回説明しました。オブジェクトを生成するにはメモリ容量の空きが必要です。C#では、不要になったオブジェクトのメモリ容量を自動的に解放する機能がついています。この機能をガベージコレクションというのですが、ガベージコレクションが行われる前にデストラクタというメソッドが実行されます。これはコンストラクタと同じように定義しなければデフォルトコンストラクタが自動で実行されます。メソッドではありますが他の普通のものに比べてパラメータリスト(引数)はありませんし戻り値もありません。普通の言語では生成したオブジェクトの後始末をこのデストラクタで色々書くようですがC#にはガベージコレクションがあるのであまり使われることはありません。短い説明になってしまいましたがこんな感じです。

 

いかがでしたでしょうか。インスタンス変数を初期化する目的で主に使われるコンストラクタ、そして呼び出し元が渡す引数によって初期設定を変更できるオーバーロードについて今回はやりました。だんだん難しくなってきました。外では雨続きで楽しみのテニスもできない分こっちに専念したいと思います。