僕は仕事でプログラムを作ります。
仕事は20年ほどやっているんですが、小学生の頃もやってました。
当時は、パソコンなんて持っていなかったんで、友だちが持っていた、ファミリーベーシックと言って、ファミコンにつないでBASIC言語でプログラムが作れるソフトを借りて作ってました。
その頃からプログラミングをやっていたので、かれこれ30年以上、プログラミングに携わっていることになります。
それで、仕事で使ってるプログラミングについてですが、
使っている言語は1つではないんですよね。
最初はVB4でしたが、それもだんだんバージョンアップしてきて、VB5とか、VB6に変わってきました。
また、Windowsだけではなく、いろんなプラットフォーム上で動くプログラムも作る必要が出てきて、C言語やPHP、Perlなども使ってきました。
統計やAI関係に関わることも出てきたのでPythonまで手を出してます。
最近では、Javaを使うことが多くなりました。
色んな言語を使うので、一番最初に苦労するのは、その言語を覚えるときなんですよね。
似たりよったりの部分もあるんですけど、VB系とC言語やPHP、Javaは全然違いますし、
細かい部分で言うと、PHPもJavaもC言語も違います。
しかも、早く覚えないと仕事には締切がありますから、期間内に言語を習得して出来た成果を収めないといけません。
そういうときに、いかに効率よく言語を習得するかがポイントになってくるんですよね。
そこで、この記事では、僕が実践している、
新しいプログラミング言語を”そこそこ”使えるようになるための、オススメの勉強方法をご紹介しますね。
全ては、「Hello World」から
誰が言ったかわかりませんが、プログラミングの最初の門は「Hello World」です。
どういうことかと言うと、画面上に、「Hello World」という文字を表示する、小さなテストプログラムを最初に作ります。
このプログラムを作ることで、プログラムの基本的な書き方と、画面に文字を表示する方法を学ぶわけです。
・・・というか、学ぶと言うよりも確認ですね。
プログラムを作るための基本的な枠や、コンパイルの方法もここで確認するわけです。
ちなみに、この「Hello World」って、誰が最初に考えたんでしょうね。
文字を表示するだけなら、何でも良いんですけどね。プログラム関係の入門書もそうですが、プログラムを解説するサイトでも、最初に表示する文字って、体外「Hello World」なんですよね。
・・・学校で習ったプログラムの授業も、最初は「Hello World」でしたね。
プログラミングに携わる人は、「Hello World」と言えば、ほぼ全員がみんなピンとくるはずです。
(´・ω・`)
「あ~あの、最初のやつね。」
って感じでね。
C言語
#include <stdio.h> int main (void) { printf(“hello world\n”); }
PHP
<?php print(“hello world\n”); ?>
変数を覚える
次に変数の使い方を覚えます。
変数を覚えないと、先に進みませんからね。
変数の定義の仕方や使い方を確認するわけです。
C言語ならば、
「変数の型 変数名」というように定義しますし、
int i; i = 1 + 2; printf(“%d\n”,i);
PHPならば、変数の定義は特に必要ないですが、変数の頭には必ず$をつけますよね。
$i = 1+2; print(“$i”);
Javaの場合はCとほぼ同じですが、変数の定義によっては、privateやpublicを付ける場合もあります。
こんなふうに、言語によって変数の扱い方は変わります。
分岐を覚える
変数の次は分岐です。
分岐は、どの言語でも「if文」です。
if文を覚えることで、プログラム上で判断が可能になりますね。
if文の書き方は、ほぼどんな言語でも似たりよったりなんですが、大事な部分が地味に異なってきます。
例えば、
C言語の場合
if (i==0) { iが0だった場合の処理… }
iという変数が0だった場合の分岐です。
見ての通り、イコールを2つ書くんですよね。
コレがVisual Basicであれば変わってきます。
Visual Basic
If i=0 Then iが0だった場合の処理… End If
イコールは1つで良いわけです。カッコもいりません。
なので、C言語でプログラムを書いた後、Visual Basicでプログラムを書くと、間違う場合が多いんです^^;
PHPの場合は、基本的には、イコール2つで同じ値かどうか判断しますが、イコールを3つ使う場合もあります。
PHP
if ($i===$j) { $iと$jが同じ型だった場合の処理… }
コレって、「変数$iと変数$jが同じ形の場合」ということなんですよね。どういうことかと言うと、
$i = 1;
$j = 2;
であれば、同じ整数(Integer)が入っているから同じ型って言えるんですけど、
$i = 1;
$j = “文字列”;
こういう値が入っているなら 整数と文字列なんで、違う型ってことです。
こういう判断もPHPでは可能ということなんですね。
PHPでは、変数は宣言をする必要がなく使えるので、こんなイコール3つで判断を可能にしているのかもしれませんね。
ループを覚える
分岐を覚えたら、今度はループを覚えます。
どんなプログラム言語も、for文やwhile文でループが可能です。
でも、ループの書き方は、プログラム言語によって、まちまちです。
一見似たような書き方が可能な場合もあれば、ぜ~んぜん違う場合もあります。ループの処理は必ず使う場面が出てくるので、このあたりはしっかりと確認する必要がありますね。
C言語
for (i=0; i < 10; i++) { printf(“%d\n”,i); } int i=0; while(i < 10) { printf(“%d\n”,i); i++; }
Visual Basic
For i=0 to 10 Debug.Print i Next i Dim i As Integer Do While i < 10 Debug Print i i=i+1 Loop
配列を覚える
さて、今度は配列を覚えます。
分岐、ループ、配列が作れれば、大概のプログラムは作れるわけです。
・・・ま、ホントはもっとありますが、プログラムの基本はコレで抑えられます。
配列の書き方は、もーほんとに、言語によって様々あります。
それに、配列を定義した後に、そのサイズを変えられるかどうか、そのサイズの変更方法も確認したほうが良いですね。
Visual Basic
Dim hairetu(10) as Integer Redim hairetu(100) 'これで配列のサイズを変更できます。
Java
int[] hairetu = new int[10]; ArrayList<Integer> hairetu2 = new ArrayList<Integer>(); //可変する場合はListクラスを使うほうが便利
C言語
int hairetu[3]; int *hairetu2; //可変する場合はポインタを使う
C言語の場合、可変する配列を使うならポインタを使うんですが、
このポインタってやつが頭を悩ます一つなんですよねー。
未だに苦手意識が・・・
ライフゲームを作ってみる
変数、分岐、ループ、配列を覚えたら、後はプログラムを作ります。
ここまで来たら、実際に作ってみないと覚えないんですよねー。
ということで、簡単なライフゲームを作ります。
・・・ちなみに、ライフゲームって知っていますか?
簡単に言うと、隣り合う要素の数によって、そのマスの生き/死にの判断を行うゲームです。
死んでいるマスの隣り合うマスが3つあると、そのマスは誕生します。(誕生)
生きているマスの隣り合うますが2~3であれば、そのマスは生存を継続します。(生存)
生きているマスの隣り合うますが1以下であれば、そのマスは死亡します。(過疎)
生きているマスの隣り合うますが4つ以上であれば、そのマスは死亡します。(過密)
この4つのルールに従って、マスの生き死にを判断するプログラムです。
マスの表示に凝ってしまうと、グラフィック関係の処理が必要になってくるので、かなり難しくなってしまうんですが、
マスの表示を Hello World で使ったときの文字表示の方法を使うことで、処理を簡単にできます。
文字で表す、生き死には・・・まっ何でも良いです。
基本的には、■と□でいいですが、0と1でもいいですし、★と☆でもいいです。
ま、違いが分かれば良いんですよね。
さて、ライフゲームが本当に作れるかどうかってことですが、今まで覚えた、変数、分岐、ループ、配列で、作れます。
どういう変数が必要が考えて、ライフゲームのロジックを考えてみてくださいね。
実際に作ってみた
・・・ということで、今までの流れでどんなプログラム学習になるのか、実際に作ってみました。
使った言語はJavaScript。ブラウザさえあれば誰でも使えるプログラム言語です。
今回ご紹介した、Hello World表示~ライフゲームの作成まで、実際にやってみたコードはこちらです。
- <html>
- <body>
- <script>
- //hello world表示
- document.write("hello world<br/>");
- //変数宣言
- var i = 0;
- //分岐とループ
- for (i=0; i < 10; i++) {
- document.write("i=" + i + "<br/>");
- if (i==5) document.write("真ん中<br/>");
- }
- //配列
- var array = new Array(5);
- array[0]=1;
- array[1]=11;
- array[2]=111;
- array[3]=1111;
- array[4]=11111;
- for (i=0; i < array.length; i++) {
- document.write("array[" + i + "]=" + array[i] + "<br/>");
- }
- //ライフゲーム
- var maxloop = 10; //周回数
- var rows = 10; //縦数
- var cols = 12; //列数
- var cells = new Array(
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
- //世代表示
- document.write("0世代 ----------------------------<br/>");
- //今回の結果を表示
- for (i=0; i < cells.length; i++) {
- var buf = "□";
- if (cells[i]==1) buf="■";
- document.write(buf);
- //列数を満たすと改行する
- if ((i+1) % cols==0) {
- document.write("<br/>");
- }
- }
- //処理開始
- for (sedai=0; sedai < maxloop; sedai++) {
- //世代表示
- document.write((sedai+1) + "世代 ----------------------------<br/>");
- //作業バッファ
- var wcells = new Array(cols * rows);
- //全セルをチェック
- for (cellcnt=0; cellcnt < cells.length; cellcnt++) {
- //この場所の位置を特定
- var row = Math.floor(cellcnt / cols); //Math.floor() <= 切り捨て
- var col = Math.floor(cellcnt - row*cols);
- //デバック
- //console.log("cellcnt=" + cellcnt +
- // " row=" + row +
- // " col=" + col +
- // " cells=" + cells[cellcnt]);
- //周りの要素を記録
- var mawari = 0;
- var idx=0;
- //左上
- if (row > 0 && col > 0) {
- idx = (row-1)*cols + col-1;
- mawari += cells[idx];
- //デバック表示
- //console.log("cellcnt=" + cellcnt);
- //console.log("row=" + row);
- //console.log("col=" + col);
- //console.log("idx=" + idx);
- //console.log("cells=" + cells[idx]);
- //console.log("mawari=" + mawari);
- }
- //上
- if (row > 0) {
- idx = (row-1)*cols + col;
- mawari += cells[idx];
- }
- //右上
- if (row > 0 || col < cols-1) {
- idx = (row-1)*cols + col+1;
- mawari += cells[idx];
- }
- //左
- if (col > 0) {
- idx = row*cols + col-1;
- mawari += cells[idx];
- }
- //右
- if (col < cols-1) {
- idx = row*cols + col+1;
- mawari += cells[idx];
- }
- //左下
- if (row < rows-1 && col > 0) {
- var idx = (row+1)*cols + col-1;
- mawari += cells[idx];
- }
- //下
- if (row < rows-1) {
- idx = (row+1)*cols + col;
- mawari += cells[idx];
- }
- //右下
- if (row < rows-1 && col < cols-1) {
- idx = (row+1)*cols + col+1;
- mawari += cells[idx];
- }
- //生死の決定
- var life=0;
- if (cells[cellcnt]==0 && mawari==3) {
- //誕生
- life=1;
- } else if (cells[cellcnt]==1 && mawari >= 2 && mawari <= 3) {
- //生存
- life=1;
- } else if (cells[cellcnt]==1 && mawari <= 1) {
- //過疎
- life=0;
- } else if (cells[cellcnt]==1 && mawari >= 4) {
- //過密
- life=0;
- }
- //作業バッファに格納
- wcells[cellcnt]=life;
- }
- //配列の移動
- for (i=0; i < cells.length; i++) {
- cells[i]=wcells[i];
- }
- //今回の結果を表示
- for (i=0; i < cells.length; i++) {
- var buf = "□";
- if (cells[i]==1) buf="■";
- document.write(buf);
- //列数を満たすと改行する
- if ((i+1) % cols==0) {
- document.write("<br/>");
- }
- }
- }
- </script>
- </body>
- </html>
こちらのページで、実際に動かしてみているので、気になる方はアクセスしてみてくださいね。
・・・ひさびさやったからめんどくさかった・・・
ちなみに、プログラムコードは、こちらのサイトで変換してブログに表示しています。
プログラムをブログで表示したいって思っている人は、こちらの記事も参考にしてくださいね。
まとめ
この記事では、僕がよくやっていたプログラム言語の習得方法をご紹介しました。
基本的には、Hello Worldを表示してから、変数、分岐、ループ、配列を覚えたら、ライフゲームを作ってみると、
そうすると、大概、慣れるってことです。
よく、プログラム言語を勉強するって言う人がいますけど、僕が思うプログラム言語は、勉強してもあんまり覚えません。
プログラム言語って、大工さんが使うトンカチやノコギリと同じようなもんで、目的のものを実現するための道具だと思ってます。
道具ですから、勉強よりも、まず実際に使ってみないと覚えませんし、慣れません。
基本的なことを覚えたら、後は慣れるまでガシガシとプログラム言語を書いてみるしか無いですね。
プログラム言語をおぼえたいと思っている方はこの記事を読んで、ガシガシとプログラム言語を打ち込んでくださいね。
コメント