Null Pointer Exception

プログラミングや技術的な記事を綴っていきます。

プログラミング

f:id:haruki_uehara:20170224031654p:plain
どうもこんにちは。
haruki_ueharaです。

皆さんプログラミング楽しんでますか?
また、これから始めようと思っている方、
そうでない方はどんな印象をお持ちでしょうか。


今日は私がプログラミングに対して受けた最初の印象と、
楽しさについてお話ししたいと思います。

私はもっぱら理数系でもなければ、
学校の勉強だって出来る方ではありません。

プログラムも興味で触ってみたいと思ったところからが始まりでした。

最初は書籍を購入し読んでみる訳ですが、
率直な感想は

只々...


意味が分からない。

でした。

この意味の分からなさというのは、
「型」や「変数」や「代入」、「演算子」、「真偽値」などの単語的な意味ももちろんあるのですが、

一番は、

なぜこんな回りくどいことをするのかということ。


細かい説明は省きますが例えばC#では、
コンソール(黒い画面)に文字や文字列を出力するときに
--------------------------------------
Console.Write("こんにちは");
--------------------------------------
と入力します。

これでコンソールには
「こんにちは」
と表示される訳です。
こんにちはと出すだけならこれだけでいいんです。

しかし
プログラム上では、文字や数字をわざわざ箱のようなものに格納する
「型」と「変数」という概念があり、

文字列を格納できるのは「string」という型になります。

 

例えば
string s = "こんにちは";

と入力すると、stringの後ろにあるsに”こんにちは”という文字列が格納されます。

この「s」、どんな名前でもいいのですがstringのような型の後ろにつけることで箱の役割をしています。
この箱が「変数」と呼ばれるものです。

いわゆるこの動作が、文字列”こんにちは”を変数sに「代入」する。
という訳です。

そして先ほど出てきた
Console.Write("こんにちは");
でコンソールに出力できることをお話ししましたが、
下記のような方法でも全く同じ結果が出てきます。

--------------------------------------
string s = "こんにちは";
Console.Write(s);
--------------------------------------

sの中身には”こんにちは”が入っているので、
Console.Write
の後ろにsを入れることで、
sの中身に入っている”こんにちは”という文字列がコンソールに出力されるのです。

ここで私は思います。





え・・・・・?





意味あるの!!?

 

こんな面倒なことしなくてもConsole.Writeの後ろにそのまま”こんにちは”って入れて出力すりゃあ良いじゃないか!!


真っ先に思いました。


他にも、
文字と文字列は異なるものです。

文字列は複数文字入力できますが、
文字は1文字しか入力できません。

文字列が先ほどご紹介した「string」という型に対し
文字が「char」という型になります。

--------------------------------------
char c = 'あ';
--------------------------------------

 

のように変数cには1文字しか入りません。
2文字目を入れるとエラーになるのです。






ん・・・・・?





チャー・・・お前、必要か!!!?


1文字しか格納できないなら

charいらないじゃん!!


全部stringにすりゃ良く無い!!?





そんなことを思い、

なぜその型が必要なのか、
なぜわざわざ変数に値を代入するのか、
結局のところこれをしたことで何ができるのか!!

一切分からないスタートを切りました。

その意味が分からない内容は
数多く出ている初心者用の書籍の中でも、
さも、こんな一般常識分からない奴いないだろうと言わんばかりに
普通に書かれており、困惑しかありませんでした。





しかし、不思議なことに変数の意味や使い方を少しずつ覚えてくると・・・

これ考えた人天才!!

って思えるようになってくるのです。


ロジックを組んだ通りにプログラムが動く快感というのは
言い表せられないものがあります。

これは、組んだことがある人にしか分からないと言っても過言ではありません。


よくプラグラミングは「錬金術」とも言われています。

コンピュータはもともと0か1かの2進法しか読み取れません。
プログラミング言語は人が理解しやすい言葉で記述し、
コンピュータには0か1の信号に変換して命令を送ります。
いわゆる人とコンピュータの橋渡しをしているのがプログラミング言語であり、
最近のjavaC#などはより人間の言葉に近いことから
高級言語」と言われています。

コンピュータに0と1の信号を送るだけで、「無」から「有」を生み出せる。

確かに、錬金術なのかも知れませんね。

ありとあらゆるものを作ることができれば、
自分の時間をもっと効率化させることができたり、
日常の生活も豊かにしてくれます。

そんな実用的な良さが、プログラミングにはあるのです。

よく自分には適正が無いのでは・・・
と言われる方がいますが、
私が思うに・・・

モノを作ることが好きであれば必ずハマる!!

と、思っています。

例えばプラモデルであったり、家具の組み立てなどでもです。


が、実は適正を見極めるための、有名な問題もあります。
最後にご紹介させていただきますので良かったらチャレンジしてみてください。


----------------------------------------------------------------------------

問題

9枚のコインがある。そのうち偽物が1枚だけある。偽物は本物のコインより軽い。このとき天秤を二回だけ使って偽物を見つけ出せ。

----------------------------------------------------------------------------

 

 

正解できるできないに関わらず、
このような問題に時間を掛けても考えることが出来る方は、
よく適正があるというふうに言われています。

如何でしたでしょう。
何にせよ作りたいものがもしあればそれが一番ですが、
最近ではプログラミングも始めるにあたって敷居が低くなってきていますので、
ぜひ機会があれば触れてみてほしいです。

自分の書いたコードでコンピュータが動くのは、たった少しの動作でも楽しいものですよ!

また、このブログで少しずつプログラミングの楽しさなんかももっとお伝えできればとも思っています。
(今日はネガティブな内容ばかりでしたが・・・)



下記に問題の解答をご用意していますので、
ギブアップという方は見てみてください。


ではまた次回に。

 

 

 

 

 

----------------------------------------------------------------------------

解答

一回目は,左の皿に3枚,右の皿に3枚のせる

  • 左が高くなった場合:左の3枚の中に偽物あり
  • 右が高くなった場合:右の3枚の中に偽物あり
  • つりあった場合:残った3枚の中に偽物あり

いずれにせよ偽物の候補を3つに絞れる。

二回目は偽物の候補3枚のうち左の皿に1枚,右の皿に1枚のせる

  • 左が高くなった場合:左に載せたのが偽物
  • 右が高くなった場合:右に載せたのが偽物
  • つりあった場合:残った1枚が偽物