プログラミングを学ぶにあたっては、心構えが重要です。
きちんと心構えをして学ぶのと心構えをしないで学ぶのとでは雲泥の差があり、上達の度合いに大きな差が出ます。
そこで、プログラミングを学ぶための心構えを示します。
(ここではC言語を対象にしていますが、他のプログラミング言語でもほぼ同じです。)
#contents
*Level 1: はじめてのプログラムを書く前に [#wed3eabf]
**プログラミングは知識ではなくスキル [#iae8eab0]
デジタル大辞林によると、スキルとは、「手腕。技量。また、訓練によって得られる、特殊な技能や技術」です。
プログラミングを学ぶということは、プログラミング言語についての知識を学ぶだけでなく、プログラミングのスキルを獲得するということであり、そのためには訓練が必要です。
身近なものに例えると、スポーツ、料理、楽器演奏、絵を描くことなどによく似ています。
例えば、自転車に乗れるようになるためには、自転車そのものや自転車の乗り方についての知識がある程度は必要ですが、知識を得ただけで自転車に上手に乗ることはできません。
実際に自分で自転車に乗ってみて、何度も練習して、少しずつ上手に乗れるようになります。
プログラミングも、知識を学んだだけでは実際にできるようにはなりません。
実際に自分でやってみて、何度も練習して、少しずつ上手にできるようになります。
**プログラミングは楽しい [#zbdf0c1d]
プログラミングは、最初は難しいと感じるかもしれませんが、ある程度できるようになれば楽しくなります。
スポーツ選手が苦しい表情をしながら厳しいトレーニングをしている姿を見かけますが、その競技に興味がない人からすれば、なぜそんな苦しいトレーニングをするのかわからないことでしょう。
しかし、できなかったことができるようになったときの喜びや、できたときの楽しさを味わうために、苦しいトレーニングに励むのです。
プログラミングも、できるようになるまではすこし苦しいかもしれませんが、できるようになったときの喜び、できたときの楽しさを味わうために、がんばりましょう。
**良い道具を使う [#ndafce00]
いい道具を使わないと、なかなか上達できません。
-エディター(プログラムを書くためのソフトウェア)
--構文を解釈して色をつけることができる(シンタックス・ハイライティング機能)
--自動的に字下げできる(自動インデント機能)
--行番号が表示できる
--文字の違い(下記参照)が解りやすいフォントが選べる
--空白、タブ、改行など見えない文字を可視化できる
--文字コードと改行コードを変更できる
-ディスプレイ
--画面が広い(解像度が高い)もの
-キーボード
--打ちやすいもの
Windows PCであれば、外出先では13.3型のノートPC、自宅ではこれに液晶モニタを外部接続して2画面にすれば十分でしょう。
エディターにはTeraPadを使います。
ある程度上達したらもっといい道具を使いますが、最初のうちはこのくらいのもので十分です。
**上手なプログラムと上手な人のプログラミングを真似る [#e751813a]
スポーツ、料理、楽器演奏、絵を描くことなど、スキルを上達させるための方法として、上手な人のやり方を真似るという方法があります。
プログラミングも、上手なプログラムを真似ること、上手な人のプログラミングのやり方を真似ることで上達します。
友達や先輩が書いた下手なプログラムを見せてもらって、それを真似する人がよくいますが、これでは下手なやり方しか身につきません。
上手なプログラムと上手い人のプログラミングを真似ましょう。
**プログラムを見ただけでわかったつもりにならない [#pe3dfe67]
完成されたプログラムや他の人のプログラミングを見て勉強することは大切ですが、見ているだけでは上達しません。
**とにかくやってみる [#dd66d475]
スキーを履いたことがない人がいきなりスキーのジャンプ競技をやったら、あるいは、フグの毒についての知識がない人がフグを料理して食べたら、死んでしまうかもしれません。
でも、パソコンを触ったことがない人がいきなりプログラムを書いて失敗しても、死ぬことはもちろん、コンピューターが壊れることもありません。
しかも、間違ったプログラムを書いたらどうなるのかは、やってみなくてはわかりません。
間違いや失敗を恐れず、とにかくやってみましょう。
**アルゴリズムとプログラムの違いを意識する [#tcf34fc7]
アルゴリズムとは、問題の解き方のことです。
問題が同じであれば、プログラミング言語が違っても、ほとんどの場合、アルゴリズムは同じです。
アルゴリズムの部分は、プログラミング言語を使わずに流れ図(フロー・チャート)でも書けます。
また、アルゴリズムがわからないと、プログラムはかけません。
例えば、ある整数nが与えられて、1からnまでの整数の和を求めるプログラムについて考えてみましょう。
このとき、どうやって1からnまでの和を求めるかという部分がアルゴリズム、それをどうやって実際のプログラムとして書くかという部分がプログラミングです。
プログラムが難しいと感じたら、アルゴリズムがわからないのか、それともアルゴリズムはわかったけどプログラムが書けないのか、ここを意識するようにしましょう。
*Level 2: はじめてのプログラムを書くときに [#oa5b9a90]
**文字の違いに気をつける [#x23ff807]
プログラミングは、文字の違いに厳しいです。
たとえば、次のCプログラムは正しいプログラムです。
#geshi(c){{
int main(void) {
return 0;
}
}}
でも、次のプログラムは正しくありません。
#geshi(c){{
int main(void){
return 0;
}
}}
上のプログラムと同じように見えますが、このプログラムは全角の英字で書かれています。
また、次のプログラムも正しくありません。
#geshi(c){{
Int Main(Void) {
Return zero;
}
}}
このプログラムは一部が大文字で書かれています。
人間は、mainとMain、0とzeroは、同じ意味だと理解しますが、プログラムにおいてはコンピューターはこれらを違うものだと認識します。
間違えやすい文字を挙げておきます。
-大文字と小文字がほとんど同じ形の英字 Cc, Oo, Pp, Ss, Uu, Vv, Ww, Xx, Zz
-小文字のエル l と大文字のアイ I と数字のイチ 1 と記号の縦棒 |
-大文字のオー O と数字のゼロ 0
-ドット . とコンマ ,
-ダブル・クオーテーション " とシングル・クオーテーションふたつ ''
-マイナス - とアンダーバー _
-カッコ < ( { [ ] } ) >
-空白 と日本語変換された空白
-英数字 abc... と日本語変換された英数字 abc...
プログラムを書くときは、文字の違いに気をつけましょう。
**バックスラッシュ \ と円記号 ¥ は同じもの [#l1750256]
コンピューターが最初に開発されたアメリカやヨーロッパでは円記号 ¥ を使う必要がなかったため、初期のコンピューターでは ¥ は使えませんでした。
日本にコンピューターが持ち込まれたとき、¥ が使えないのは困るので、バックスラッシュ \ の代わりに ¥ を使うことにして、コンピューターの内部では \ だが画面に表示するときや印刷するときは ¥ に置き換えるようにしました。
このため、バックスラッシュ \ を使う場合と円記号 ¥ を使う場合がありますが、これらは同じものです。
この説明も、Windowsでは、\ と ¥ が両方とも ¥ に見えているかもしれません。
OS X (Mac) やiOSでは、\ はバックスラッシュに、 ¥ は円記号に見えていると思います。
**プログラムの最後に改行を入れる [#baeb776d]
Cプログラムの最後、つまり閉じ波括弧 ''}'' の後に改行を入れましょう。
改行がないと、次のような警告が出ます。
警告: ファイル末尾に改行がありません
**文字コードを意識する [#iec75aa6]
コンピューター内部で文字を表見する方法を文字コードといい、次のようないくつかの種類があります。
-Shift-JIS
-EUC (EUC-JP)
-Unicode (UTF-8)
日本語を使うときは、プログラムを保存するときの文字コードを、プログラムを実行する環境の文字コードに合わせておかないと、実行した結果が文字化けします。
たとえば、次のプログラムをShift-JISで保存し、UTF-8の環境で実行すると、次のように表示されます。
#geshi(c){{
#include <stdio.h>
int main(void) {
printf("こんにちは\n");
}
}}
#geshi(sh){{
????ɂ???
}}
*Level 3: はじめてのプログラムが書けたら [#m84057d0]
**プログラムを綺麗に書く [#hdecef90]
プログラムを綺麗に書かないと、プログラミングは上達しません。
たとえば、最初のサンプルとしてよく出てくるHello Worldプログラムは次のようなものです。
#geshi(c){{
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
}
}}
たったこれだけのプログラムにも、以下のような工夫がされています。
-#includeで始まる行の次の行を空行にして見やすくしている
-{ の行が始まる位置とそれに対応する } の始まる位置を揃えて対応をわかりやすくしている
-printf命令を字下げ(インデント)して、{ } に囲まれている行をわかりやすくしている
次のプログラムは、C言語として間違ってはいませんが、とてもわかりにくいです。
#geshi(c){{
#include <stdio.h>
int
main
(
void
)
{
printf
(
"Hello World!\n"
)
;
return
0
;
}
}}
プログラムは、読みやすいよう、綺麗に書きましょう。
**いつでも動かせるようにしながら少しずつ完成させていく [#b42f44e8]
プログラミングの勉強をしていくと、だんだんプログラムが長く、複雑になっていきます。
長く、複雑なプログラムを一気に書き上げてコンパイルすると、大量のコンパイルエラーになってしまうことがよくあります。
そこで、プログラムを書くときは、1行目から順番に書くのではなく、いつでもコンパイルして構文エラーをチェックできるようにしながら書きましょう。
たとえば、Hello Worldプログラムの場合、最初から書き始めて次のようなところで中断すると、コンパイルはできません。
#geshi(c){{
#include <stdio.h>
int main(void) {
p
}}
でも、次のようなところで中断した場合には、コンパイルができて、ここまでの部分に構文エラーがないことを確認できます。
#geshi(c){{
#include <stdio.h>
int main(void){
}
}}
**コンパイルエラーは一つずつ直す [#c9ae083c]
プログラムの構文が間違っていると、コンパイルエラーが出ます。
このとき、たくさんのメッセージが表示されることがあります。
例えば、次のプログラムをコンパイルします。
#geshi(c){{
#include <stdio.h
int main(void) {
printf("Hello World!\n");
}
}}
すると、次のようなエラーメッセージが表示されます。
#geshi(sh){{
hello.c:1:18: error: expected "FILENAME" or <FILENAME>
#include <stdio.h
^
hello.c:4:3: warning: implicitly declaring library function 'printf' with type
'int (const char *, ...)'
printf("Hello World!\n");
^
hello.c:4:3: note: include the header <stdio.h> or explicitly provide a
declaration for 'printf'
1 warning and 1 error generated.
}}
全部で3箇所のメッセージが出ていますが、実は、エラーは最初の一つだけで、あとは警告と注釈です。
1行目の最後の > が抜けているだけです。
これが原因で、警告と注釈が表示されています。
ですから、たくさんメッセージが出ていても、直す所は1つしかありません。
誤りを直したら、再びコンパイルします。
まだエラーが残っていたら、また、最初の1つを直します。
エラーが出なくなるまで、これを繰り返します。
**実行時のエラーはprintf命令で誤りを探す [#ca9a2fa0]
プログラムの構文に誤りがないときは、コンパイル時にはエラーメッセージが表示されません。
でも、プログラムを実行しても正しく動かないことがあります。
多くの場合、Segmentation faultsとか、セグメンテーション違反というエラー・メッセージが表示されます。
このとき、プログラムは、全く動いていないのではなくて、途中まで動いてそこで止まってしまったのです。
これに対処するための簡単な方法が、プログラムの区切りごとにprintf命令を挿入し、どこまで実行されたのかを確認するというものです。
やり方は簡単で、次のような命令を入れるだけです。
#geshi(c){{
printf("####\n");
}}
繰り返し処理の最中に止まってしまう場合には、繰り返し回数を表示させます。
#geshi(c){{
for (i = 0; i < n; i++) {
printf(">> %d\n", i);
}
}}
printf命令で指定した文字列は改行が出力されるタイミングで画面に表示されるので、最後に改行を入れておかないと、printf命令が実行されたときに出力されません。
**エラーが解決できないときはGoogleで検索する [#n29d87c1]
コンパイル時や実行時にエラー・メッセージが表示されても、そのメッセージが理解できないことや、そのメッセージだけでは問題が解決できないことがあります。
そんなときは、Googleでエラー・メッセージの一部を''そのまま''検索しましょう。
同じエラー・メッセージで困っている人とそれを助けている人が見つかることがあります。
Googleでエラー・メッセージを検索するときは、フレーズ検索を使います。
コピペしただけだと、空白で区切られた文字列のAND検索として検索されてしまいます。
フレーズ検索にするためには、エラー・メッセージ全体をダブル・クオーテーション " で囲みます。
ファイル名やエラーの位置など自分のプログラムだけに関係しているところを検索文字列に含めないようにし、エラー・メッセージの後に空白を入れてエラーの原因と思われる関数の名前などを追加します。
**上手に書けるようになるまで同じプログラムを何度も作る [#u25c3020]
料理は、たまたま一回おいしく作れたとしても、さらに同じ料理を何度も作らないと上達しません。
プログラムも、たまたま一回正しく動くものが作れたとしても、同じプログラムを何度も作らないと上達しません。
なぜか、課題プログラムをひとつ作っただけで、その課題のテーマを全部できるようになったと勘違いしてしまう人が多いです。
一度作ったからもういいと思わずに、上手に書けるようになるまで同じプログラムを何度も作りましょう。
**わざとエラーを起こしてエラー・メッセージを確認する [#g76297fd]
教科書や参考書には正しいプログラムしか載っていません。
正しいプログラムはコンパイル時も実行時もエラーが出ませんが、実際にプログラミングを勉強しているとたくさんのエラーに遭遇します。
そこで、正しいプログラムを作るだけ出なく、わざとエラーが起きるプログラムを作成して、実際にどんなエラー・メッセージが出るのか確認しておくと、将来、エラー・メッセージが出たときに対処しやすくなります。
*Level 4: ある程度プログラミングができるようになったら [#n28062b8]
**複数のプログラミング言語を学ぶ [#l78afa15]
C言語を勉強していくと''ポインター''が出てきたところで多くの人がつまづきます。
C言語ではポインターはとても重要ですから、C言語を勉強するときにポインターを避けて通ることはできません。
しかし、ポインターが存在しないプログラミング言語や変数の型宣言が必要ないプログラミング言語もたくさんあります。
また、C言語にはない''オブジェクト''や''メソッド''という概念が出てくるプログラミング言語もあります。
でも、ほとんどのプログラミング言語に''変数''、''条件分岐''、''繰り返し''、''配列''などが出てきます。
複数のプログラミング言語を学ぶことによって、プログラミングに共通して重要なこととC言語の特徴的な部分が分かるようになります。
**デバッガーを使ってデバッグする [#h703b869]
**デバッガーを使ってデバグする [#h703b869]
プログラムの誤りのことを''バグ''(虫)といい、プログラムからバグを取り除くことを''デバッグ''といいます。
プログラムの誤りのことを''バグ'' (bug) といい、プログラムからバグを取り除くことを''デバグ'' (debug) といいます。
作成するプログラムの規模が大きくなると、printf命令によるデバッグは効率が悪くなるので、''デバッガー''というデバッグ専用のツールを使ってデバッグします。
作成するプログラムの規模が大きくなると、printf命令によるデバグは効率が悪くなるので、''デバッガー''というデバグ専用のツールを使ってデバグします。
C言語でコンパイラーにgccを使っている場合、''gdb''というデバッガーを使います。
*Level 5: かなりプログラミングができるようになったら [#d3d660d2]
**統合開発環境を使う [#wee58a96]
統合開発環境 (IDE) は、プログラムを開発するためのツールです。
IDEには、エディター、コンパイラー、デバッガー、ランタイム(実行環境)など、プログラミングに必要なものがすべて含まれています。
Windows用のIDEとして''Visual Studio''があります。
また、様々なOSとプログラミング言語に対応した''Eclipse''というIDEもあります。
作成するプログラムの規模が大きくなってきたら、エディターを卒業してIDEを使いましょう。