- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 授業/C言語基礎/プログラミングを学ぶための心構え へ行く。
(このページはまだ書きかけです。)
プログラミングを学ぶにあたっては、心構えが重要です。 きちんと心構えをして学ぶのと心構えをしないで学ぶのとでは、雲泥の差があり、上達の度合いに大きな差が出ます。
そこで、プログラミングを学ぶための心構えを示します。 (ここではC言語を対象にしていますが、他のプログラミング言語でもほぼ同じです。)
Level 1: はじめてのプログラムを書く前に †
プログラミングは知識ではなくスキル †
デジタル大辞林によると、スキルとは、「手腕。技量。また、訓練によって得られる、特殊な技能や技術」です。
プログラミングを学ぶということは、プログラミング言語についての知識を学ぶだけでなく、プログラミングのスキルを獲得するということであり、そのためには訓練が必要です。
身近なものに例えると、スポーツ、料理、楽器演奏、絵を描くことなどによく似ています。
例えば、自転車に乗れるようになるためには、自転車そのものや自転車の乗り方についての知識がある程度は必要ですが、知識を得ただけで自転車に上手に乗ることはできません。
実際に自分で自転車に乗ってみて、何度も練習して、少しずつ上手に乗れるようになります。
プログラミングも、知識を学んだだけでは実際にできるようにはなりません。 実際に自分でやってみて、何度も練習して、少しずつ上手にできるようになります。
良い道具を使う †
いい道具を使わないと、なかなか上達できません。
- エディタ(プログラムを書くためのソフトウェア)
- 構文を解釈して色をつけることができる(シンタックス・ハイライティング機能)
- 自動的に字下げできる(自動インデント機能)
- 行番号が表示できる
- 文字の違い(下記参照)が解りやすいフォントが選べる
- 空白、タブ、改行など見えない文字を可視化できる
- 文字コードと改行コードを変更できる
- ディスプレイ
- 大きい(解像度が高い)もの
- キーボード
- 打ちやすいもの
ある程度上達したらもっといい道具を使いますが、最初のうちはこのくらいのもので十分です。
プログラムを見ただけでわかったつもりにならない †
プログラムを見て勉強することは大切ですが、プログラムを見ているだけではプログラミングは上達しません。
とにかくやってみる †
スキーを履いたことがない人がいきなりスキーのジャンプ競技をやったら、あるいは、フグの毒についての知識がない人がフグを料理して食べたら、死んでしまうかもしれません。
でも、パソコンを触ったことがない人がいきなりプログラムを書いて失敗しても、死ぬことはもちろん、コンピューターが壊れることもありません。
しかも、間違ったプログラムを書いたらどうなるのかは、やってみなくてはわかりません。
間違いや失敗を恐れず、とにかくやってみましょう。
上手なプログラムを真似る †
スポーツ、料理、楽器演奏、絵を描くことなど、スキルを上達させるための方法として、上手な人のやり方を真似るという方法があります。
プログラミングも、上手なプログラムを真似ることで上達します。
友達や先輩が書いた下手なプログラムを真似する人がよくいますが、これではほとんど上達しません。
上手なプログラムを真似ましょう。
文字の違いに気をつける †
プログラミングは、文字の違いに厳しいです。
たとえば、次のCプログラムは正しいプログラムです。
int main(void) { return 0; }
でも、次のプログラムは正しくありません。
int main(void){ return 0; }
上のプログラムと同じように見えますが、このプログラムは全角の英字で書かれています。
また、次のプログラムも正しくありません。
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...
プログラムを書くときは、文字の違いに気をつけましょう。
バックスラッシュ \ と円記号 ¥ は同じもの †
コンピューターは、アメリカやヨーロッパで開発されました。
アメリカやヨーロッパでは円記号 ¥ を使う必要がなかったため、初期のコンピューターでは ¥ は使えませんでした。
日本に輸入されたとき、¥ が使えないのは困るので、日本で最も使わないであろうバックスラッシュ \ の代わりに、¥ を使うことにして、コンピューターの内部では \ ですが、画面に表示するときや印刷するときは ¥ に置き換えるようにしました。
このため、バックスラッシュ \ を使う場合と円記号 ¥ を使う場合がありますが、これらは同じものです。
文字コードを意識する †
コンピューター内部で文字を表見する方法を文字コードといい、次のようないくつかの種類があります。
- Shift-JIS
- EUC (EUC-JP)
- Unicode (UTF-8)
日本語を使うときは、プログラムを保存するときの文字コードを、プログラムを実行する環境の文字コードに合わせておかないと、実行した結果が文字化けします。
たとえば、次のプログラムをShift-JISで保存し、UTF-8の環境で実行すると、次のように表示されます。
#include <stdio.h> int main(void) { printf("こんにちは\n"); }
????ɂ???
Level 2: はじめてのプログラムが実行できたら †
プログラムを綺麗に書く †
プログラムを綺麗に書かないと、プログラミングは上達しません。
たとえば、最初のサンプルとしてよく出てくるHello Worldプログラムは次のようなものです。
#include <stdio.h> int main(void) { printf("Hello World!\n"); }
たったこれだけのプログラムにも、以下のような工夫がされています。
- #includeで始まる行の次の行を空行にして見やすくしている
- { の行が始まる位置とそれに対応する } の始まる位置を揃えて対応をわかりやすくしている
- printf命令を字下げ(インデント)して、{ } に囲まれている行をわかりやすくしている
次のプログラムは、C言語として間違ってはいませんが、とてもわかりにくいです。
#include <stdio.h> int main ( void ) { printf ( "Hello World!\n" ) ; return 0 ; }
プログラムは、読みやすいよう、綺麗に書きましょう。
いつでも動かせるようにしながら少しずつ完成させていく †
プログラミングの勉強をしていくと、だんだんプログラムが長く、複雑になっていきます。
長く、複雑なプログラムを一気に書き上げてコンパイルすると、大量のコンパイルエラーになってしまうことがよくあります。
そこで、プログラムを書くときは、1行目から順番に書くのではなく、いつでもコンパイルして構文エラーをチェックできるようにしながら書きましょう。
たとえば、Hello Worldプログラムの場合、最初から書き始めて次のようなところで中断すると、コンパイルはできません。
#include <stdio.h> int main(void) { p
でも、次のようなところで中断した場合には、コンパイルができて、ここまでの部分に構文エラーがないことを確認できます。
#include <stdio.h> int main(void){ }
上手に書けるようになるまで同じプログラムを何度も作る †
料理は、たまたま一回おいしく作れたとしても、さらに同じ料理を何度も作らないと上達しません。
プログラムも、たまたま一回正しく動くものが作れたとしても、同じプログラムを何度も作らないと上達しません。
なぜか、課題プログラムをひとつ作っただけで、その課題のテーマを全部できるようになったと勘違いしてしまう人が多いです。
一度作ったからもういいと思わずに、上手に書けるようになるまで同じプログラムを何度も作りましょう。
コンパイルエラーは一つずつ直す †
プログラムの構文が間違っていると、コンパイルエラーが出ます。 このとき、たくさんのメッセージが表示されることがあります。
例えば、次のプログラムをコンパイルします。
#include <stdio.h int main(void) { printf("Hello World!\n"); }
すると、次のようなエラーメッセージが表示されます。
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命令でデバッグする †
プログラムの構文に誤りがないときは、エラーメッセージは表示されません。
でも、プログラムを実行しても正しく動かないことがあります。 多くの場合、Segmentation faultsとか、セグメンテーション違反というメッセージが表示されます。
このとき、プログラムは、全く動いていないのではなくて、途中まで動いてそこで止まってしまったのです。
これに対処する手っ取り早い方法が、プログラムのブロックごとにprintf命令を挿入し、どこまで実行されたのかを確認するというものです。
やり方は簡単で、次のような命令を入れるだけです。
printf("####\n");
繰り返し処理の最中に止まってしまう場合には、繰り返し回数を表示させます。
for (i = 0; i < n; i++) { printf(">> %d\n", i); }
printf命令で指定した文字列は改行が出力されるタイミングで画面に表示されるので、最後に改行を入れておかないと、printf命令が実行されたときに出力されません。