プログラムの作成と実行(印刷したもの)(6/15

2015-06-10
情報科学 1
プログラムの作成と実行
情報科学 1 の講義ではいろいろなプログラムを実際に作成して実行する。この時の一般
的な手順について解説する。
1 プログラムの入力、コンパイル (compile) と実行
プログラムの
作成と実行
ターミナルを起動する
emacsを起動する
ソースファイルを入力
コンパイル
エラーがある
$%
オブジェクトを実行
!"#
ソースファイルを修正
!"#
エラーがある
$%
END
図1
プログラムの作成と実行についてのフローチャート 人間が入力したプログラム(ソースプログラム、ソースコードもしくはソースファイルと
呼ぶ)を、計算機が実行できる機械語に書き換える操作をコンパイルという。コンパイルを
おこなうプログラムをコンパイラと言い、コンパイルの結果できたファイルをオブジェクト
プログラム、オブジェクトファイルまたは単にオブジェクトと呼ぶ。プログラムの作成から
実行までの流れをフローチャートで表すと図 1 のようになる。
プログラムのための言語には、機械語もしくはアセンブリ言語 (機械語を少し拡張したも
の) と高級言語がある。高級とは「人間が読んで意味が理解できる」という意味であり、高
1
級言語には FORTRAN, COBOL, Lisp, Scheme, CommonLisp, BASIC, Pascal, C, C++,
Java, Haskel, Ruby などたくさんある。情報科学1で使用するのは C という言語であり、
gcc というコンパイラを使用する。プログラムの入力にはエディタと呼ばれるプログラムを
使用する。この講義では、emacs を使用する。コンパイラとコンパイルされたオブジェクト
の実行は、ターミナルを使用して行なう。
2 コマンドのキー入力
emacs とターミナルのコマンドについてはキーボードからの実行方法について説明する。
以下の表は、キー入力の表記とその操作を表している。ここで、 は return キーを入力す
ることを表す。なお、表の中で*がついた操作は emacs のみで使用される。
C-n
M-n
コントロールキーcontrol を押しながら n キーを押す
コマンドキーcommand を押しながら n キーを押す *
コマンドキーcommand を押しながら C-n キーを押す *
エスケープキーesc を押してから C-n を押す(2 回のキー入力操作) *
エスケープキーesc を押してから n を押す(2 回のキー入力操) *
C-M-n
3 「ターミナル」の起動
ターミナルのアイコンをクリックして起動する。外見や文字の大きさはメニューで変更
できる。また、複数のターミナルを開きたい場合はメニューの「シェル」から新規ウィンド
ウを選択する。起動した時のディレクトリはホームディレクトリ (~) である。
4 ディレクトリを作る
講義の中ではいろいろなプログラムを作るので、混乱しないようにディレクトリを作る。
ターミナルで以下のようなコマンドを実行して、ディレクトリを作りそこへ移動する。
ターミナル
mkdir 0617
cd 0617 pwd
ディレクトリの名前は何でもよいが、作成した日付がわかる 0617 などが単純でよいと思
う。ディレクトリを作ったらそこへ移動(cd) する。念のため、pwd コマンドで現在のディ
レクトリを確認する。
2
5 emacs でプログラムを作成
5.1 emacs を起動する
emacs のアイコンをクリックして emacs を起動する。 起動したときのディレクトリは
ホームディレクトリ (~) である。
!"#$%&'()(
!*#$)+,-
!.#$/(0123
!4#$5&)+,-
図 2 emacs の起動画面 5.2 ファイルを作成する
まず、作成したディレクトリに移動して新しいファイル名を指定する。プログラムのファ
イル名も何でもよいが、一回の講義の中でいくつものプログラムを作ることもあるので、区
別しやすい名前、たとえば p3-1.c とか問題に合わせた名前 helloworld.c とかにする。ま
た、ファイル名の最後に.c をつけること。
emacs の画面はいくつかの部分に分かれている(図 2)。バッファはコマンドやファイル
の入力を行なう部分で、ミニバッファは画面の下部にある部分である。
emacs : バッファ
C-x C-f
3
emacs : ミニバッファ
~/0617/helloworld.c
図3
emacs:ファイルの作成 キー入力 C-x C-f は File メニューの Visit New File コマンドに対応し、ミニバッ
ファでファイルを指定する。図 3 のように入力するが、~/までの部分は emacs が表示する
ので、移動先のディレクトリ名である 0617 とファイル名 helloworld.c を組み合わせて、
0617/helloworld.c
を入力すれば良い。
5.3 プログラムを打ち込む
emacs は、C の文法に従って単語の色を変え自動時にインデント(段付け)を付けるの
で、入力の際に参考にする。打ち間違えたら、カーソルキーや移動コマンドで間違えた場所
に移動して修正する。プログラムを修正すると、インデントが崩れることがある。その場合
は、それぞれの行の先頭でTAB を入力するとインデントも修正される。プログラムの入力
は1行あたり1文を原則とし、{ や } も別の行とすること。
教科書では\(逆スラッシュ)の代わりに¥が使われているので注意すること。また、印
刷したときに区別できるように、ファイルの先頭に学籍番号と名前をコメントとして追加す
ること。
図 4 emacs:プログラムを打ち込む 4
5.4 ファイルをセーブする
キー入力 C-x C-s は File メニューの Save コマンドに対応する。
emacs : バッファ
C-x C-s
図 5 emacs:ファイルをセーブする なお、ファイルを別の名前でセーブしたいときは、C-x C-w (Save As ... コマンド) でディレ
クトリとファイル名を指定する。新しい名前を helloworld2.c とするには以下の様に入力
する。~/0617/までの部分は emacs が表示するので、作成するファイル名 helloworld2.c
を入力すれば良い。
emacs : バッファ
emacs : ミニバッファ
C-x C-w
~/0617/helloworld2.c
6 ファイルの確認
ターミナルに移動して、作成したソースファイルを確認する。emacs でディレクトリの指
定を間違えてなければ、cat コマンドでファイルの内容が確認できる。ファイルの行数が大
きくなってスクロールしてしまう場合は less コマンドを用いる。
ターミナル
ls
cat helloworld.c
7 プログラムのコンパイル
コンパイルは gcc コマンドで行う。
ターミナル
gcc helloworld.c
5
gcc により C のソースファイルがコンパイルされて a.out という名前のオブジェクト
ファイルが作られる。コンパイラがエラーを見つけた場合はエラーメッセージが出力され
る。エラーメッセージが出力されたら、メッセージを良く読んでソースファイルを修正す
る。a.out が作成されていることは ls コマンドで確認できる。
ターミナル
ls
8 プログラムの実行
ターミナル
./a.out
./を前につけるのを忘れないこと。 ./a.out はカレントディレクトリの a.out を実行する
ことを意味する。
図 6 ターミナル:プログラムのコンパイルと実行 9 プログラムの一部を変更していくつもプログラムを作るとき
いくつもプログラムを作るときは、その都度ソースファイル名を変えること。すでにある
プログラムを一部変更して別のプログラムを作る場合は、C-x C-f でプログラムを読み込
んだ後、C-x C-w で別の名前でセーブしてから修正を加える。これは、元のプログラムを壊
してしまわないようするためである。
6
プログラムをコンパイルするといつでも a.out という名前のオブジェクトが作られ、前
の a.out は上書きされてしまうので、必要に応じてファイルの名前 a.out を helloworld
などに mv コマンドで変える。
ターミナル
mv a.out helloworld
なお、コンパイラがエラーを見つけた場合、コンパイラはオブジェクトを作成しない。以
前に作られたオブジェクトがあった場合にはそのファイルはそのまま残される。つまり、プ
ログラムを修正した後エラーに気がつかず a.out を実行すると修正する前のプログラムが
実行されることになる。
コンパイルするときにオブジェクトの名前を指定することもできる。
ターミナル
gcc -o helloworld helloworld.c
コンパイラにより helloworld という名前のオブジェクトを作るので、./helloworld
で
プログラムを実行することができる。
10 エラーメッセージが出力されたら
コンパイルの結果、エラーが見つかったらプログラムを修正する。コンパイラは文法的な
誤り(エラー)を見つけた場合オブジェクトを作成しないので、エラーを完全になくさない
とプログラムの実行は出来ない。新しいオブジェクトが作成されない場合、以前に作られた
オブジェクトがそのまま残っていることがあるので注意すること。
10.1 エラーメッセージをよく読む
コンパイラはエラーを見つけた行番号との内容をエラーメッセージとして出力する。エ
ラーメッセージを読んでも意味がよくわからない場合は、ともかく行番号を確認してエディ
タでその行で移動する。gcc は、以下の様な形式でエラーメッセージを出力する。
ターミナル
one-1.c: In function ‘main’:
one-1.c:11: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
このメッセージは、one-1.c というファイルをコンパイルしたところ、11 行目に問題を
発見したことを表している。emacs では M-x goto-line n または M-g g n (n は先頭か
らの行数)でカーソルを指定した行へ移動できる。
7
10.2 エディタでファイルを修正する
エディタを使ってファイルを修正する。このとき、どの行でエラーが起きているかが問題
になる。エラーが表示される行はコンパイラが多分ここがおかしいと見つけた場所なので、
一行前、一行後ろに問題のある個所があることもある。
プログラムを修正するとインデントが崩れることがあるが、インデントも必ず修正するこ
と。それぞれの行の先頭でTAB を入力するとインデントも修正される。プログラムの入力
は1行あたり1文を原則とし、{ や } も別の行とすること。
練習問題などのプログラムは短いのですべて打ち直してしまいたくなるが、それだと何
を間違えたかわからないし、また同じ間違いをする可能性があるので、必ずエディタで修正
する。
10.3 再度コンパイル
修正が終わったら再度コンパイルする。まだエラーがあったら同じように修正する。す
べてのエラーの原因を修正したはずなのにエラーが出ることもある。これは、出力するエ
ラーの数を制限するために、コンパイラが重要と判断したエラーのみを出力することがある
からである。
10.4 なおす!、なおす!、なおす!
エラーがなくなるまで、何度でも繰り返すこと!! なお、コンパイラがエラーを出力
しないようになっても、プログラムが正しく動いていないように思えることがある。これ
は、プログラムは文法的には正しいが論理(ロジック)が間違っている状態で、いわゆる
「バグ」のある状態である。この場合もプログラムを修正する。
10.5 ありがちな間違い
• .(ピリオド)と,(カンマ)、;(セミコロン)と:(コロン)、数字 1 と 英文字の l、
数字の 0 と英文字の O、数字の 2 と英文字の Z など見間違えやすい文字の区別。
• main、int、include 等のつづり。
• {と}、(と)、[と] の対応関係、"で始まる文字列がきちんと"で閉じられているか?
• \を¥としていないか?
• 文の終わりが; になっているか?
• 日本語のコード(いわゆる全角)で記号や英文字を入力していないか?
• 変数名が予約語でないか?(予約語については教科書を参照)
8
11 プログラムの作成、修正、実行の繰り返し
プログラムの作成と実行を行なっている際に使用するターミナルのコマンドは限られた
ものになるので、いちいち打ち込むのは面倒である。このような場合、カーソルキーなどで
過去に実行したコマンドを編集すると簡単にコマンド入力が出来る。
12 ソースコードの印刷
演習課題の提出などのためにソースコードを印刷する場合は、次のようにする。
ターミナル
pr -n foobar.c | lpr
このコマンドでは、C のソースコード foobar.c に行番号と印刷した日付、ファイル名の
入ったヘッダーを付けて印刷している。この行番号とヘッダーを付ける処理を pr -n で行
い、その出力をパイプで lpr コマンドに送っている。出力先は「システム環境設定」で指定
したプリンタである。印刷された紙の持ち主がわかるように、学生番号や氏名をソースコー
ドの先頭にコメントとして入れておくこと。
13 実行結果の印刷
実行結果を印刷したい場合は、プログラムの出力をリダイレクトしてファイルに書きその
ファイルを印刷する方法とターミナルの表示をそのまま印刷する方法がある。いずれの方
法でも、印刷された紙の持ち主がわかるように、学生番号や氏名が印刷した紙に残るように
すること。
ターミナルの表示を印刷する場合は、印刷する範囲をマウスで選択し、ターミナルのメ
ニューから「シェル」→「選択したテキストを書き出す.....」でファイルに書き出しそれを
印刷するか、
「シェル」→「選択部分を印刷」で印刷する。
14 emacs のコマンド
14.1 起動と終了
emacs アイコンをクリック 起動
C-x C-c
終了
14.2 エラーからの脱出
C-g エラーからの脱出(複数回入力が必要なこともある)
9
14.3 ファイルの操作
File メニューからコマンドを選択するか、以下のキー入力で操作
C-x
M-x
C-x
C-x
C-f
revert-buffer
C-s
C-w
新しいファイルを開く
ファイルを読み直す
バッファの内容をファイルに書き出す
バッファの内容を別のファイルに書き出す
14.4 カーソルの移動
↑ → ↓ ← カーソルを移動
1画面前進.
C-v
M-v
C-a
C-e
M-<
M->
M-g g n
C-l
1画面後退.
行の先頭.
行の末尾.
ファイルの先頭.
ファイルの末尾.
カーソルを指定した行へ移動.(n は先頭からの行数)
画面を表示し直してカーソルのある行を中央にする.
14.5 削除
Delete カーソルの左側の文字を削除
カーソル位置から行末までを削除
C-k
14.6 インデント
C-x h
C-M-\
Tab バッファすべてをリージョンとする
リージョンのすべての行をインデントする
行をインデントする
15 ターミナルのコマンド
15.1 起動
ターミナルのアイコンをクリックする
10
15.2 おかしなことが起こって,ターミナルが反応しないとき
(リターン)、 C-q、C-c、C-d、C-z を入力してみる
ターミナルをクローズして,もう一度,起動する
15.3 コマンド行の編集と再利用
↑ 1つ前のコマンドを表示
← カーソルを左へ移動
↓
1つ後のコマンドを表示
→ カーソルを右へ移動
!!
C-a
C-e
delete C-d
直前のコマンドを再度実行する
行の先頭
行の末尾
カーソルの1つ前の文字を削除
カーソル位置の文字を削除
15.4 コマンド
gcc file-name
mkdir dir-name
cd dir-name
pwd
ls
ls -l
cat file-name
less file-name
mv name1 name2
rm name1
C のソースファイルのコンパイル
ディレクトリを作る
指定されたディレクトリへ移動
カレントディレクトリを表示
ファイルの情報を表示.
(名前など)
ファイルの情報を表示.
(名前,大きさなど)
ファイルを表示する.(画面はスクロールする)
ファイルを表示する.(1画面ごとに表示)
ファイルの移動/名前を変える.(name1 が name2 になる)
ファイルを消す.(復活できない!!)
11