情報基礎A 「Cプログラミング」(ステップ1)

このステップの目標

0. 何故プログラミングを学ぶのか?

コンピュータがプログラム(ソフトウェア、ついでながら「アプリ」とはapplication softwareの略)によって動作することは誰でも知っているが、一般に、ソフトは店頭で購入したり、ダウンロードして、指示された方法でインストールしてから使うもの、であろう。そして、そうして流通しているソフトは、プロの開発者が仕事として、あるいは、「オタク」が趣味として作成しているらしいことは知っていても、それがどのように開発されているのか、それに触れるチャンスは案外少ない。情報基礎では、プログラミングの習得に一定の時間が裂かれている。このクラスの多くが、将来その方面に進む可能性は少ないだろうに、全員がプログラミングを学習する意味(あるいは、教える側の意図)はどこにあるのだろう。

この授業の目的は「パソコンの使い方教室」ではないので、個別的な使い方ではなく、むしプログラミングを通じて問題を抽象化して考えたり、論理的な思考を行う能力を養うことが大切。そして、その基本的な考え方は、WindowsでもMacでもスマートフォンでも、CでもJavaでも、皆同じだ。

そして是非ここで強調しておきたいのは、プログラミングは知的なゲームとしてみてもとても面白く刺激的であるということだ。

1. コンピュータの基本的な動作

コンピュータは、記憶装置(メモリ)に書き込まれている数値(機械語命令)を順に読み込んで、それに対応した動作を延々と行うだけの、(原理的には)いたって単純な機械だ。コンピュータが処理できるのは、おおざっぱに言って、以下のような単純な仕事だけである:

  1. データ(数値)を外部装置に出力する
  2. 外部装置からデータ(数値)を入力する
  3. メモリーのデータ同士を演算(加減乗除など)して、その結果をメモリーにセットする(式の計算と代入)
  4. 演算の結果によって(結果が0より大きいかどうか、など)、次に処理する命令を切り替える(条件分岐あるいは選択処理)
  5. 機械語命令の決められた範囲を反復する(反復処理)
  6. 機械語命令の決められた範囲に分岐して、そこが終わると、もとの場所から処理を再開する(サブルーチン処理)

これらの処理を何万ステップも組み合わせると、画面に文字や画像を表示したり、数学関数を計算したり、意味のある動作を行わせることができるわけだ。ただ、それを数値(機械語)で記述するのはとても面倒で複雑なので、人間が分かりやすい記号で書かれたプログラム(ソースプログラム)を、機械語に翻訳するシステムが開発された。それをコンパイラーと呼ぶ。

c-2-basic-workflow

この箇所、とても重要!

こうした手順に対応して、C言語でのプログラム開発は、以下の3つの基本ステップで構成される:

  1. 何々.c というファイルC言語のソースプログラムを作成する
  2. cc (あるいはgcc)というコマンドをつかって、ソースプログラムをコンパイルする
  3. a.outというファイルが新しく生成され、その中に機械語が格納されているので、それを(その中身の機械語コードを)実行する

ついでながら、実行する、は英語で execution である(死刑執行、という怖い意味もある)。Windowsのプログラム名の拡張子と使われている"exe"は、このことに由来する。

2. プログラム作成から実行までの流れ

ステップ0:端末エミュレータ―を開く

konsole-icon

ログインがうまくいったら、最初に端末エミュレータ(「端末」、"Konsole")を開くようにしよう。端末エミュレータを開くには、デスクトップの「端末」アイコンをダブルクリックするか、画面下部のアプリケーションのパネルの左端(Kメニュー)をクリックし、システム→端末 を選ぶ。すると、次のようなウィンドウが現れるはずだ。これが、プログラム開発の言わば司令塔となる。

cmd-line-example

上記のこの操作を何度も行うと、複数の端末エミュレータを開くことができるし、Konsoleのウィンドウの下端のタブで、複数個のセッションを管理する機能もある。

端末エミュレータの操作は、コマンドと呼ばれる文字列(指示)をタイプし、Enterキーを押す動作によって行う。コマンドの列によってコンピュータを操作することから、このような使い方をCLI(コマンドラインインターフェース)と呼んでいる。それに対して、マウスやタッチ操作等で行ういつものような操作方法をGUI(グラフィックユーザーインターフェース)と呼んでいる。昔のコンピュータは、基本的に、CLIばかりだったし、現在でも、プログラム開発やシステム管理にはCLIが使われる場面が多い。

上の図で、赤線部を引いた箇所がコマンド行である。図には見えていないけれども、コマンド行の最後には、Enterキーが押されている。図と全く同じコマンドをタイプしてみて、動作を確認してみよう。画面に見えている "bash 3.2$" は、コンピュータからの「コマンドを受け付けています」というサインである(コマンドプロンプトと呼ぶ)。これが出ていない状態は、まだコマンドの処理中ということになる。

UNIXコマンドの基本的な使い方

端末エミュレータの操作の仕方は、Windowsの「コマンドプロンプト」の使い方とほぼ同様と考えてよい。ただし、UNIXとWindows(のコマンドプロンプト)とは、コマンドの種類と作法が若干異なるので、Windowsの操作に慣れている方は注意が必要。

以下のコマンドは、今後の実習に最低限必要なので、ここで覚えてしまおう。(UNIXコマンドのさらに詳しい使い方を勉強したい方は、例えば、 こちらのPDF資料こちらのWEBページを参照のこと。)

コマンド 動作 使用例 Windowsでの
同等なコマンド
ls ディレクトリー内の
ファイルの一覧を表示
ls  <enter>
dir
cd ディレクトリ名 名前で指定したディレク
トリ内に移動する
cd MyDocument <enter>
cd フォルダ名
cd .. ひとつ上の階層の
ディレクトリに移動
cd ..  <enter>
cd ..
pwd ディレクトリの
現在位置を表示
pwd  <enter>
pwd
cd ホームディレクトリに戻る
cd <enter>
cd

ステップ1:エディターを開いて、ソースプログラムを作成する。

kwrite-icon

Cでプログラミングを行うためには、C言語で書かれたソースプログラムをコンピュータに入力したり、そのソースプログラムを変更したりする作業が(快適に!)行えなければいけない。そのための基本的なツールがエディタだ。教育情報基盤センターのシステムには何種類ものエディタが利用可能だけれども、この授業では習得の容易な KWrite を使って実習を進めることにしよう。 (KWriteのもう少し使い方は、こちらのPDF文書も併せて参照のこと)

KWriteを開くには、

すると、ワープロに似たソフトが立ち上がるはずだ。基本的な操作は(機能が限定された)ワープロと同様なので、使い方に戸惑うことは殆ど無いだろう。

編集が終わりファイルを保存したら,ファイルメニューから「閉じる」を選んで終了する。KWriteの操作に特に難しいところはないと思うが、いくつか注意点を挙げておく:

  1. ファイルメニューで「保存」しない限り、変更内容はファイルには反映されない
  2. 保存の際に、ファイル名の中にスペース(空白文字)を入れないこと。名前にスペースの混じったファイルを作ってしまうと、混乱のもとです。また、日本語文字の入ったファイル名もトラブルの元です。
  3. myprogram1.c というファイルを残したまま、名前を付け替えたい場合には ファイルメニューの「名前を付けて保存」を選んで、例えば myprogram2.c という名前で保存すればよい
  4. 保存先の場所(ディレクトリ)をきちんと把握しておくこと。保存場所とは違う場所で作業しているのに「ファイルが消えた!!」と勘違いする学生がとても多い。

基本的なルールとして、Cのソースファイル(プログラムのファイル)は、.c という拡張子をつけることを覚えておこう。c は C言語のC だ。

では、さっそく、以下のソースプログラムをエディタ(KWrite)で入力し、dow.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]) ;
}

入力が終わったら、間違いがないかどうか確かめて、最後にファイルメニューで「保存」または「別名で保存」する。その際、保存ファイル名は dow.c で統一しておこう。

ステップ2:プログラムのコンパイル

次に、端末エミュレータ(Konsole)の画面に移って、ファイルがちゃんと保存されているかどうか確認してみよう。

上記のコマンドをうまく操作して、先ほど作成して保存したファイル(dow.c)が置かれているディレクトリ(フォルダ)に移動する。ファイルがその場所にあることが確認できたら、次のコマンドで、Cコンパイラーを起動する:

cc dow.c

ccはCコンパイラ(C Compiler)のキモチ。少しだけ待ったあとに、何事もなくプロンプトが「返って」きたら、コンパイルは成功。もし色々とエラーメッセージが出てきたらきっとタイプミスがあるはずなので、エディタに戻ってチェックする。修正が終わったら「保存」をお忘れなく。コンパイラーはほんのちょっとしたミスでも見逃してくれません。これから先の実習で困ったら、こちらのページなども参考に。

ステップ3:プログラムの実行

では、最後に実行してみよう。コンパイルに成功したら、そのディレクトリに a.out という名前のファイル(実行ファイル)が出来ているはずだ。ls で確認してみよう。a.out というのは、特に何も指定しなかった場合に作られる実行ファイルの名前:実行ファイルというのは、その名前をタイプするだけで自動的に実行される。そこで

a.out  <enter>

とタイプすると、a.outというファイルの中に格納された機械語のコードが自動的に処理(実行)される。プログラムが走り出すと、とやると、プログラムが走り出して、Year(西暦), Month, Day の順に尋ねられるはず。それぞれについて数字を入れると、最後にその日の曜日が表示されるはず。このプログラムを使って、自分の誕生日が何曜日だったのか調べてみよう。

実行ファイルにa.out以外の名前をつける

実行ファイル名としてa.out 以外の名前を付けたければ、コンパイル時に -o 実行ファイル名 オプションを付けて

cc -o dayofweek dow.c

のように指定することもできる。

このようにコンパイルして出来た実行ファイルを起動するには(a.outではなくて)、

dayofweek <enter>

とタイプすればよい(dayofweekという新しいUNIXコマンドを作成したことになる)。

ファイルの管理(補足)

file-maneger-home

ファイルやディレクトリの管理は、ファイルマネージャー(Konqueror:左のアイコン)を使って操作することもできるが、ここではUNIXのコマンドを使った操作方法をまとめておく。 慣れてくるとCLIのほうが効率的に作業できる場合が多い。

作業内容 使用コマンド 操作例
ディレクトリを作成する
mkdir ディレクトリ名
mkdir c
ディレクトリ名を変更する*1
mv 元の名前 新しい名前
mv c clang
ディレクトリを別の場所に移動する
mv ディレクトリ名 移動先ディレクトリ
mv clang ./MyDocument
ディレクトリを削除する*2
rmdir ディレクトリ名
rmdir ./MyDocument/clang

*1ディレクトリ abc を cdf に名前を付け替えようとして mv abc cdf を実行したとしよう。そのとき、もしすでに cdf というディレクトリが存在していたら、abc は ./cdf/abc に移動されるので注意。
*2 ディレクトリを削除する場合は、その中身を空にしておかなければいけない。

icon-pc 練習:演習用のディレクトリを作成

今後の実習のために、各自のホームディレクトリの中に、Cのプログラムを保存するための専用ディレクトリを作成しておくこと。 練習のため、上記のUNIXコマンドを使ってみることをお勧めする。 ディレクトリ名は自由だが、日本語は決して使わないこと。 無難な名前の例としては、"c", "cprog", "c_examples", 等々。