情報基礎A 「Cプログラミング」(ステップ1・ソフトの基本操作)

このステップの目標

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

私がまだ若いころ、ソフトウェア関係のマニュアルの中に「適用業務」という単語が頻繁に登場していて、それが「アプリケーション」を意味することはすぐに判ったけれども、日本語としてはなんとも言えない違和感を覚えたことを思い出す。。

パソコンやスマフォにはOS(Operating System)というソフトウェアが入っていて、それ無しでは動かないし、しばしばそれをアップデートするよう「催促」されたりする。 さらに、便利に使うには、アプリ(application softwareの略)を追加でインストールしないといけなかったりする。 いわゆる情報機器以外でも、テレビなどの家電製品もその中身はコンピュータそのものであるし、 普段はあまり気にしないようなちょっとしたデバイスでさえ、不具合を解消するため、ときどきファームウェア(firmware)のアップデートが必要になったりもする。 今や、我々の暮らしのかなりの部分が、コンピュータープログラム(ソフトウェア)によって支えられているのは間違いない。

そういったソフトウェアは、もちろん、その道のプロ(あるいは、優秀なアマチュア)が開発しており、 どんなに自動車が好きでも、部品から車を自作することは(ほとんど)無いように、 ソフトやアプリは、誰かが作ったものをダウンロードしたり購入したりするのが当たり前である。 ところが、この「情報基礎」では、プログラミングの実習に一定の時間が割かれている。 このクラスの学生の多くは、将来その方面に進む可能性は少ないだろうに、全員がプログラミングを学習する意味(あるいは、教える側の意図)はどこにあるのだろう。

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

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

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

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

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

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

c-2-basic-workflow

この箇所、とても重要!

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

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

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

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

では、ICL演習室の環境で上記の3ステップを行う具体的な方法を紹介しよう。

c-1-turtleedit-icon
TurtleEditのアイコン

準備:実習用のソフト(TurtleEdit)を開く

画面左上の「アプリケーション」メニューをクリックし、「アクセサリー」または「プログラミング」の項目の中にあるTurtleEditを選んで起動する。 TurtleEditは情報基礎の実習用に開発されたソフトで、ソースプログラムの作成、コンパイル、実行をこのソフトを使って行うことができる。

TurtleEditの標準設定

TurtleEditの「実行」メニューから「設定」を選ぶと、ソフトの振る舞いを変えることができる。 以下に、標準的な設定をまとめておく。色々といじっているうちに動作がおかしくなったときは、これらの項目を確認すること:

  1. 「実行」メニューから「設定」を開く。
  2. 「コンパイルコマンド」の確認: cc %f -lm
  3. 「実行コマンド」の欄を確認: /opt/cite/bin/run ./a.out
  4. 「亀場のパス」の欄を確認: /opt/cite/bin/tfield-linux
  5. 「文字コード」を確認: "UTF-8"
  6. 「フォント」を選択
  7.  OKボタンを押して設定完了。

ステップ1:ソースプログラムの作成

TurtleEditのウィンドウは上下の2つの区画に分かれている。その上側が、プログラムを記述するための区画で、 ワープロのようにCのプログラムをその中に記述する。

TurtleEditのウィンドウの様子。上側の区画で編集作業を行う。 下側の区画はプログラムの実行結果の表示等に使われる。

c-1-turtleedit-main

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:コンパイル

コンパイルボタンを押した際の具体的な動作は、TurtleEditの「実行」メニューの中の「設定」を選んだ際に表示される「コンパイルコマンド」の欄で設定されている。
特に変更しない限り,コンパイルボタンを押すと,cc というUnixコマンドが実行されるように設定されている。

保存したソースプログラムをコンパイルするには、TurtleEditのウィンドウ内のコンパイルボタンを押す。

もし、ソースプログラムに何かの不具合(エラー)があれば、TurtleEditの下側の区画にエラーメッセージが表示されるので、行番号を手がかりに、エラー箇所を見つけ、修正すること。

コンパイルが正常に終了すると、TurtleEditの下側の区画に「正常終了」と表示される。

コンパイルが成功した状態で、作業ディレクトリ確認ボタンを押すと、ソースプログラムの保存先の ディレクトリ名と、その中のファイルの一覧が表示される。現在作業中のファイル名(この場合はdow.cは赤字で 表示されている。 リストを注意深く眺めると、a.outというファイルも見つかるはずだ。 これがコンパイルによって生成された機械語のデータが格納されたファイルになる。

ステップ3:実行(および中断)

実行ボタンを押した際の具体的な動作は、TurtleEditの「実行」メニューの中の「設定」を選んだ際に表示される「実行コマンド」の欄で設定されている。
特に変更しない限り,実行ボタンを押すと,a.out というコマンドが実行されるように設定されている。

コンパイルされたプログラムを実行するには、TurtleEditの実行ボタンを押す。

このとき、もしも予期せぬ動作をした場合は中断ボタンを押せば、プログラムを強制終了することができる。

この例題プログラムは、西暦年、月、そして日をキーボードから入力するように求めてくる。 TurtleEditの下側の区画をマウスでクリックし、赤い四角いカーソルが出ている状態で、キーボードからそれぞれの項目を入力しEnterを押すと、 最後に、その日の曜日が出力されるはずだ。 例えば、あなたの誕生日は何曜日だろうか?。

icon-pc 練習:実習のための専用のディレクトリを作成

今後の実習のために、各自のホームディレクトリの中に、Cのプログラムを保存するための専用ディレクトリを作成しておくこと。 ディレクトリ名は自由だが、日本語と空白文字(スペース)は使わないこと。 無難な名前の例としては、"c", "cprog", "c_examples", 等々。

tfield-icon亀場で練習:グラフィックスを描いてみる

「亀場」を使うため準備のページを開き、説明を手がかりに、「亀場」の画面に四角形を描けることを確認しなさい。