情報基礎A 「Cプログラミング」(ステップ1・ソフトの基本操作)
このステップの目標
- Cによるプログラム作成に必要なソフト(TurtleEdit)について、作業内容の意味を把握しつつ、基本操作ができるようになる。
0. 何故プログラミングを学ぶのか?
私がまだ若いころ、ソフトウェア関係のマニュアルの中に「適用業務」という単語が頻繁に登場していて、それが「アプリケーション」を意味することはすぐに判ったけれども、日本語としてはなんとも言えない違和感を覚えたことを思い出す。。
パソコンやスマフォにはOS(Operating System)というソフトウェアが入っていて、それ無しでは動かないし、しばしばそれをアップデートするよう「催促」されたりする。 さらに、便利に使うには、アプリ(application softwareの略)を追加でインストールしないといけなかったりする。 いわゆる情報機器以外でも、テレビなどの家電製品もその中身はコンピュータそのものであるし、 普段はあまり気にしないようなちょっとしたデバイスでさえ、不具合を解消するため、ときどきファームウェア(firmware)のアップデートが必要になったりもする。 今や、我々の暮らしのかなりの部分が、コンピュータープログラム(ソフトウェア)によって支えられているのは間違いない。
そういったソフトウェアは、もちろん、その道のプロ(あるいは、優秀なアマチュア)が開発しており、 どんなに自動車が好きでも、部品から車を自作することは(ほとんど)無いように、 ソフトやアプリは、誰かが作ったものをダウンロードしたり購入したりするのが当たり前である。 ところが、この「情報基礎」では、プログラミングの実習に一定の時間が割かれている。 このクラスの学生の多くは、将来その方面に進む可能性は少ないだろうに、全員がプログラミングを学習する意味(あるいは、教える側の意図)はどこにあるのだろう。
- 就職に有利だから?
就職活動を行う際に、プログラミングの経験が有ったほうが入りやすい企業は(もちろん業種に依りますが)確かにあるだろう。 -
研究者になったとき必要だから?
もちろん進む分野に依るけれども、実験データの解析、シミュレーションなどのために、本格的なプログラミングが要求される研究室も多いはずだ。 また、最近は、数理分野に限らず、「ビッグデータ」を活用した研究が注目されており、それを正しく解釈し、扱うための素養が要求されている (データ解析を「下請け」に依頼するにしても、ある程度の内容を知らなくては、適切な指示は出せないだろう)。
また、既製のソフトウェアを購入して研究を行なう場合でも、科学技術系のソフトの多くは自由度を上げるために、「スクリプト」とか「マクロ」などと呼ばれるプログラムの動作環境を内蔵している場合が多いので、結局、プログラミングのスキルが必要になるケースも多い。
事務系の仕事に就いたとしても、エクセルなどの「マクロ」(VBA)は立派なプログラミング環境なので、知っておくと非常に役に立つはずだ。 -
コンピュータの仕組みが分かるようになる?
はい、でもあり、いいえ、でもある。ある程度実用的なプログラムの開発を行う際には、コンピュータの仕組みを知らないと「話にならない」ので、ソフト開発「だけ」勉強する といったやり方はあり得ない。 -
授業で習ったやり方は、他のシステムでも通用するのか?
いいえ。大枠では、これから勉強する内容は所謂UNIX系のオペレーティングシステム(Linux)で動作している環境ではほぼそのまま使えるはずだ(例えばMacやAndroidはその裏側でUNIXが動作している)。しかし、Windowsパソコンなどではやり方がかなり異なるだろうし、AndroidやiPhone,iPadなどのプログラミング作法は、見かけ上は、ずいぶんと違っている。
ただし、C言語の仕様そのものは国際的に標準化されているので、どこに行っても同じ。また、C言語で登場する様々な考え方(変数、式の計算、代入、条件分岐などなど)は、ほとんど全て、他のプログラミング言語にも通用する。Cを理解しておけば、別の言語の習得も格段に(本当に何十倍も!)早くなるだろう。
この授業の目的は「パソコンの使い方教室」ではないので、個別的な使い方ではなく、むしろプログラミングを通じて問題を抽象化して考えたり、論理的な思考を行う能力を養うことが大切。そして、その基本的な考え方は、WindowsでもMacでもスマートフォンでも、CでもJavaでも、皆同じだ。
加えて、是非ここで強調しておきたいのは、プログラミングは知的な「ゲーム」としても、とても面白く刺激的であるということだ。
1. コンピュータの基本的な動作
コンピュータは、記憶装置(メモリ)に書き込まれている数値(機械語命令)を順に読み込んで、それに対応した動作を延々と行うだけの、原理的には、いたって単純な機械だ。コンピュータが処理できるのは、おおざっぱに言って、以下のような単純な仕事だけである:
- データ(数値)を外部装置に出力する
- 外部装置からデータ(数値)を入力する
- メモリーのデータ同士を演算(加減乗除など)して、その結果をメモリーにセットする(式の計算と代入)
- 演算の結果によって(結果が0より大きいかどうか、など)、次に処理する命令を切り替える(条件分岐あるいは選択処理)
- 機械語命令の決められた範囲を反復する(反復処理)
- 機械語命令の決められた範囲に分岐して、そこが終わると、もとの場所から処理を再開する(サブルーチン処理)
これらの処理を何万ステップも組み合わせると、画面に文字や画像を表示したり、数学関数を計算したり、意味のある動作を行わせることができるわけだ。ただ、それを数値(機械語; machine code)で記述するのはとても面倒で複雑なので、人間が分かりやすい記号で書かれたプログラム(ソースプログラム(source program)とかソースコード(source code)と呼ぶ)を、機械語に翻訳するシステムが開発された。それをコンパイラー(compiler)と呼ぶ。
この箇所、とても重要!
こうした手順に対応して、C言語でのプログラム開発は、以下の3つの基本ステップで構成される:
- 何々.c というファイルC言語のソースコードを作成する
- cc (あるいはgcc)というコマンドをつかって、ソースコードをコンパイルする
- a.outというファイルが新しく生成され、その中に機械語が格納されているので、それを(その中身の機械語コードを)実行する
ついでながら、実行する、は英語で execution である(死刑執行、という怖い意味もある)。Windowsのプログラム名の拡張子と使われている"exe"は、このことに由来する。
2. プログラム作成から実行までの流れ
では、ICL演習室の環境で上記の3ステップを行う具体的な方法を紹介しよう。
TurtleEditのアイコン
準備:実習用のソフト(TurtleEdit)を開く
画面左上の「アプリケーション」メニューをクリックし、「アクセサリー」または「プログラミング」の項目の中にあるTurtleEditを選んで起動する。 TurtleEditは情報基礎の実習用に開発されたソフトで、ソースプログラムの作成、コンパイル、実行をこのソフトを使って行うことができる。
TurtleEditの標準設定
TurtleEditの「実行」メニューから「設定」を選ぶと、ソフトの振る舞いを変えることができる。 以下に、標準的な設定をまとめておく。色々といじっているうちに動作がおかしくなったときは、これらの項目を確認すること:
- 「実行」メニューから「設定」を開く。
- 「コンパイルコマンド」の確認:
cc %f -lm
- 「実行コマンド」の欄を確認:
/opt/cite/bin/run ./a.out
- 「亀場のパス」の欄を確認:
/opt/cite/bin/tfield-linux
- 「文字コード」を確認: "UTF-8"
- 「フォント」を選択
- OKボタンを押して設定完了。
ステップ1:ソースプログラムの作成
TurtleEditのウィンドウは上下の2つの区画に分かれている。その上側が、プログラムを記述するための区画で、 ワープロのようにCのプログラムをその中に記述する。
TurtleEditのウィンドウの様子。上側の区画で編集作業を行う。 下側の区画はプログラムの実行結果の表示等に使われる。
C言語のプログラムの記述法などはこれから勉強するとして、ここでは、TurtleEditの画面(上側の区画)に 以下のCプログラムをコピー&ペーストしてみよう:
曜日の計算するCプログラム(dow.c)
なぜこれで曜日を計算することができるのかについては、さらに先のページで説明する。
#include <stdio.h> main() { int year, month, day, year2, month2, dayofweek ; static char dow[][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} ; printf("Year ?: ") ; scanf("%d",&year) ; printf("Month ?: ") ; scanf("%d",&month) ; printf("Day ?: ") ; scanf("%d",&day) ; if (month==1 || month==2) { year2 = year - 1 ; month2 = month + 12 ; } else { year2 = year ; month2 = month ; } dayofweek = (year2 + year2/4 - year2/100 + year2/400 + (13*month2+8)/5 + day) % 7 ; printf("%d/%d/%d is %s.\n",year,month,day,dow[dayofweek]) ; }
コピー&ペーストする際に、最初の #
や、おしまいの }
を選択し忘れないよう気をつけること。
プログラムを記述(コピー&ペースト)したら、必ずその内容をファイルに保存しておく。
「ファイル」メニューの中の「保存」を選んで、自分の決めたディレクトリ(フォルダ)内にファイルを保存する。
その際、 ファイル名の拡張子は必ず .c
にすること
(拡張子cはそれがC言語のソースプログラムであることを表す)。
ここで、ファイル名はdow.c
としておこう。
ステップ2:コンパイル
特に変更しない限り, ボタンを押すと,cc というUnixコマンドが実行されるように設定されている。
保存したソースプログラムをコンパイルするには、TurtleEditのウィンドウ内の
ボタンを押す。もし、ソースプログラムに何かの不具合(エラー)があれば、TurtleEditの下側の区画にエラーメッセージが表示されるので、行番号を手がかりに、エラー箇所を見つけ、修正すること。
コンパイルが正常に終了すると、TurtleEditの下側の区画に「正常終了」と表示される。
コンパイルが成功した状態で、dow.c
は赤字で
表示されている。
リストを注意深く眺めると、a.out
というファイルも見つかるはずだ。
これがコンパイルによって生成された機械語のデータが格納されたファイルになる。
ステップ3:実行(および中断)
特に変更しない限り, ボタンを押すと,a.out というコマンドが実行されるように設定されている。
コンパイルされたプログラムを実行するには、TurtleEditの
ボタンを押す。このとき、もしも予期せぬ動作をした場合は
ボタンを押せば、プログラムを強制終了することができる。この例題プログラムは、西暦年、月、そして日をキーボードから入力するように求めてくる。 TurtleEditの下側の区画をマウスでクリックし、赤い四角いカーソルが出ている状態で、キーボードからそれぞれの項目を入力しEnterを押すと、 最後に、その日の曜日が出力されるはずだ。 例えば、あなたの誕生日は何曜日だろうか?。
練習:実習のための専用のディレクトリを作成
今後の実習のために、各自のホームディレクトリの中に、Cのプログラムを保存するための専用ディレクトリを作成しておくこと。 ディレクトリ名は自由だが、日本語と空白文字(スペース)は使わないこと。 無難な名前の例としては、"c", "cprog", "c_examples", 等々。
亀場で練習:グラフィックスを描いてみる
「亀場」を使うため準備のページを開き、説明を手がかりに、「亀場」の画面に四角形を描けることを確認しなさい。