コラム

最速でプログラマーを育てるアクセライトメソッド ~Lesson2~

カテゴリ:システム開発
Author:大下知樹
programming_lesson2

こんにちは、システム開発部の大下です。
前回は本シリーズのガイダンスにあたる「Linuxとエディタに関するチュートリアル」でした。
最速でプログラマーを育てるアクセライトメソッド ~Lesson1~
今回は一番コアとなるプログラミング言語の基本機能/構文について扱っていきます。

始めの一歩をどのような言語で勉強するか

利用する言語はPHPを想定しています。採用基準としては

  • 流行っていること
  • 構文に癖が少ないこと
  • 一通りの機能をカバーしていること
  • オブジェクト指向であること
  • スクリプト言語であること

あたりです。一部主観的評価も含まれています。

PHPは特有の機能もないため学習コストが低く、プログラミング言語の基本構文を学ぶのに最適であると考えており、弊社でも特に制限のない限りはPHPでコードを書いています。

ギークな人にはダサいと揶揄されるかもしれません。ですがあなたは初学者です。言語の違いに意見するのは、ある程度ものが書けるようになってからにしましょう。

何かしらのこだわりがあるようならPython, Rubyあたりも流行っていますし、Webサービスも作りやすいので良いですね。

さすがにCとかC++はお勧めしません。あまり本質的でないところでつまづきますし(ポインタのことです)、ライトなWebサービス構築にも不向きです。
JavaはAndroid開発にも利用できますので割とありですが、初っ端から public static void main とかが出てきてもうまくやり過ごす要領が必要です。

最も簡単なプログラムを実行する

さて、今回は課題の分量が多いですので早速始めていきましょう。
まずはphpのプログラムを書いて実行する方法の説明です。

[hoge@host ~]# vi tutorial.php

エディタでphpのファイルを新規作成、編集します。
中身は以下のように書いてみましょう。

<?php
print ‘Hello, world.’

たった2行です。
そうしましたら再びコンソールに戻り、今書いたプログラムをphpプログラムとして解釈/実行します。

[hoge@host ~]# php tutorial.php
PHP Parse error: syntax error, unexpected $end in /home/hoge/tutorial.php on line 3

エラーが出ましたね。さっきのプログラムには誤りがあります。
エラーメッセージを読んで原因が分かれば修正します。
原因が分からなければエラーメッセージでWeb検索します。

私は何となく原因が分かってきました。

[hoge@host ~]# vi tutorial.php

エディタでphpのファイルを再度編集します。
以下のように修正しましょう。

<?php
print ‘Hello, world.’; ←最後にセミコロンを追加

再び実行すると、

[hoge@host ~]# php tutorial.php
Hello, world

Hello, world と表示されましたね。
これが有名な「Hello world」(Wikipediaページ)です。

お疲れ様でした。あなたは今日からプログラマーです。

プログラミングのフローは至ってシンプル

非常に単純でしたが、以上の一連の流れはとても大切です。

  1. プログラムを書く
  2. 実行する
  3. エラーが出る
  4. 原因を調査、プログラムを修正、再度実行する
  5. うまく動く

至ってシンプルですが、ここにプログラミングのほぼ全てが集約されているといって過言ではありません。
一点言い忘れました。1→2→3→4のあと、たいていは3に戻ります。

今回の課題 ~PHPのチュートリアル~

さあ準備は整いました。
今回の課題は以下の通りです。結構骨太でして、全6回の中でも圧倒的に重い課題となっています。

所要期間の目安は2日~15日です。
解答は記載しませんので、要件を満たしていれば正解ということで良いです。

あとLesson1でも述べましたが、本課題は近くに質問できる先生がいる想定です。
ガイドなしで解答をつくるには相当Web検索を駆使する必要があります。

では各問の出題意図を解説していきます。

問1の解説

引数を二つ受け取り、(それらの和とそれらの積)の和を返す関数を定義せよ。
また、(1, 1), (1, 2), … (N, M) までの二つの整数の組み合わせについて、それらを上記の関数に渡した際の返り値を表示せよ。

変数、関数(function)と引数、ループの使い方を学びます。
用語の意味が分からなければとりあえずWeb検索でお願いします。

問2の解説

(a)配列を任意の要素(整数)で初期化せよ。
(b)配列の要素を順に表示せよ。(for文)
(c)配列の要素を逆順に表示せよ。(for文)
(d)配列の要素を順に表示せよ。(foreach文)
(e)配列の真ん中の要素を変更し、要素を順に表示せよ。
(f)配列の要素の合計を表示せよ。

配列の使い方を学びます。
いままでは1つの変数で、123とか”yamada” とかのスカラー値(的な)ものだけを扱ってきました。今回はスカラー値ではなく、1,3,5 のような組み合わせを配列として管理、扱うことを勉強します。
phpにはforeach文というのがあって、ループを回すのに便利なので一緒に勉強しておきましょう。

問3の解説

(a) 任意の数のコマンドライン引数を受け取り、その配列をソートして標準出力に表示せよ。
ただし、ソート関数は自作し、組み込みの関数は使用しない。

自分で作成したプログラムにコマンドライン引数を渡してみます。これは結構感動的です。
配列の要素をソートして(並び替えて)、3,1,5,4 の配列を 1,3,4,5のように変更してみます。
ソート関数は自力で組んでみましょう。バブルソートで実装(プログラムを書いて機能を実現すること)すればよいでしょう。興味があればクイックソートとかも感動的ですがハードルは結構高めです。

(b) aのプログラムについて、組み込みの関数を使用せよ。

(b) では、実は自分で書かなくても組み込みの関数があるんだという虚無感を味わってもらいます。自身で熱心に書いたプログラムが、すでに世の中に存在していたと知ったときの複雑な心境を味わい、プログラムを書く際には、自分で書いた方が良いか、あるいはありものを使った方が良いのかという選択が存在し続けることを知ります。

(c) ファイルを読み込み、配列に格納し、その配列をソートして標準出力に表示せよ。ファイル名はコマンドライン引数で受け取ること。

(c) では、ファイルがデータを格納するのに便利であることを再認識します。

(d) cのファイルを自作して、再度プログラムを実行せよ。ファイルの満たすべき要件は、すべての行が整数で、かつ行数が100000行以上とする。

(d) では、100000個以上の数値が並んだファイルをどうやって作るのかを勉強します。100000個の数字となると手打ちは厳しいですので、このあたりまでできるようになるとプログラミングの強力さを実感し始めます。

問4の解説

(a)整数nを受け取り、階乗の値を返す関数factorialを定義せよ。ただし、再帰呼び出しは使用してはいけない。
また、factorial(1)からfactorial(10)までの値を表示せよ。
(b)整数nを受け取り、階乗の値を返す関数factorialを定義せよ。ただし、再帰呼び出しを使用すること。
また、factorial(1)からfactorial(10)までの値を表示せよ。

再帰関数について勉強します。
再帰関数は避けて通れる課題の類にはなりますが、知っておくと要所要所で便利なのと、すんなり入ってくる人にとってはシンプルで理解しやすい内容ですので課題に突っ込んでいます。
ポイントは数学の漸化式のようにシンプルに考えることですね。

問5の解説

(a)整数nを受け取り、フィボナッチ数列の値を返す関数fiboを定義せよ。
また、fibo(1)からfibo(10)までの値を表示せよ。
(b)fibo(1)からfibo(100)までの値を表示せよ。

また再帰関数を使います。正直なところ私の趣味です。
シンプルに記述ができて便利な再帰関数ですが、ネストレベルが深くなると場合によっては処理量が指数関数的に大きくなってしまい計算結果が返ってこなくなります。計算能力の高いコンピューターにも割と近いところに限界があることを知るとともに、プログラマーが書き方を変えることでそのような事態を打開できるという楽しさにチャレンジしてみましょう。

問6の解説

(a)下記のプログラムを実行し、なぜそのような動きになるのかを確認せよ。
<?php
$i=0;
while (true) {
  $input = fgets(STDIN, 4096);
  if ($input == “q\n”) break;
  $i++;
}

標準入力を利用してインタラクティブなプログラムがかけると、少し世界が開けた気がするはずです。

(b)aのプログラムをベースに、数あてゲームを作成せよ。
ゲームのルールは以下のとおりとする。まず、正解の整数をあらかじめ決めておく。
つぎに、プレイヤーは数字を入力する。入力した数が、正解より大きければ、”大きいです”と表示し、小さければ”小さいです”と表示する。正解であれば、”正解です”と表示しプログラムを終了する。
プレイヤーは10回のチャンスが与えられ、正解できなかった場合は”残念でした”と表示しプログラムを表示する。
(c)bでつくったプログラムの正解を、あらかじめ決めた値ではなく、プログラムの実行時にランダムに決定された値になるよう修正せよ。

なんと、標準入力をつかって簡単なゲームを作ることができます。
ここら辺まで来るとプログラミングをしてる実感がわいてきますね。

問7の解説

(a)単語あてゲームを作成せよ。
ゲームのルールは以下のとおりとする。まず、正解の単語(英単語)をあらかじめ決めておく。ここでは例として、単語を “accelight” とする。
つぎに、プレイヤーはアルファベットを入力する。入力した英数字が’a’であれば、”a********”のように正解の単語のうち、そのアルファベットのaの文字のところだけを表示し、他はアスタリスクで表示する。次に’i’を入力した場合、”a****i***”と表示する。ヒントは5回とする。
ヒントを出すのが完了したら、”正解の単語を入力してください。”と表示し、プレイヤーに正解を入力させ、正否の結果を表示する。

今回の締めくくりです。
6をやや複雑な方向に拡張して、少しだけ楽しめるゲームを作ってみましょう。
誰かに遊んでもらい「すごいね」と言ってもらえたら課題終了です。

7合目あたりすでに結構上まで登ってきています

今回の振り返り

いかがでしたか。
これらの課題をすんなりクリアできたらプログラマーとしての適性はばっちりです。
つまづきまくって挫折しそうになりましたか?
心配ありません、カタコトの言語でもその気になればコミュニケーションが取れます。

必要なことは、できなくても不要に悩まないこと。それと同時に、いつかはできるようになりたいと思って勉強をつづけることです。

次回は、実は見かけ倒しデータベース/SQL編です。

この記事を書いた人

大下知樹

営業/設計をメインに、空いている時間でプログラミングも担当。目的の達成にこだわり、言語にはこだわらない。初学者に優しいPHPが好き。