経営システムデザイン実験III(実験の手引き) - Yusuke Sakumoto's Homepage
目次
1 はじめに
ここでは,実験III において Mac を使ったプログラミングおよび Excel での統計データ処理について簡単にまとめています. Mac は 40年以上の歴史を持つ UNIX の流れを汲んでいる OS です.Mac を通じて UNIX 流のプログラミングを勉強しましょう. UNIX について詳しく知りたい人は こちら を参考に.
2 ターミナルの使い方
ターミナルとは,コマンドを入力して Mac に仕事をさせるためのアプリケーションです. UNIX 流のプログラミングは,基本的にはターミナルで行います. 実験III でもターミナルはよく使うので,使い方をマスターしてください.
2.1 ターミナルの起動
いづれかの方法で起動できます.
- Dock(図 1) 中のアイコン(ターミナル)をクリックする.
- Dock中のアイコン(アプリケーション)をクリックする.そして,アプリケーション内でユーティリティ→ターミナル.app とクリックする.
- TA の人に起動してもらう.
図1: Dock (アプリケーションランチャー)
すると次のようなウィンドウ(図 2 )が立ち上がります.$はプロンプトと呼ばれます.プロンプトの横にコマンドをうち,指示を与えます.
図2: Terminal のウィンドウ
2.2 ターミナルでのコマンドの実行
プロンプトの横にコマンドをうち,指示を与え,Mac に仕事をさせます. 実験でよく使用するコマンドを表 1 にまとめました.
コマンド名 | 指示内容 |
---|---|
cd dir | カレントディレクトリを dir に移動 |
(補足)「cd ..」で親ディレクトリに移動 | |
(補足)「cd ~/」でホームディレクトリに移動 | |
pwd | カレントディレクトリの場所を表示 |
ls | カレントディレクトリのファイル一覧表示 |
(補足)「ls -l」で詳細情報も表示 | |
mkdir dir | ディレクトリ dir を作成 |
rm file | ファイル file を削除 |
cp file dir | ファイル file をディレクトリ dir にコピー |
(補足) dir にファイル名を指定するとファイルが複製される | |
mv file dir | ファイル file をディレクトリ dir に移動 |
(補足) dir にファイル名を指定するとファイル名が変更される | |
gcc prog1.c | ソースファイル prog1.c をコンパイル |
./a.out | プログラム a.out を実行 |
3 ソースコードの編集
3.1 テキストエディタ mi の起動
ソースコードの編集には,テキストエディタ mi を使って行います. Mac での プログラミング用エディタとしては,Xcode をイメージしやすいですが,実験室の環境ではバックスラッシュ('\')がうまく入力でいないとの報告が多数あるため,mi を使うようにしています.
mi の起動は,ターミナルの起動と同様に,Dock にある mi か,アプリケーション内の mi をクリックすることによって行います.
図3: mi のウィンドウ
3.2 新規ソースファイルの作成
画面上にあるメニューバーから,ファイル → 新規 → C と選んで下さい.
3.3 ソースファイルの保存
画面上にあるメニューバーから,ファイル → 保存(or 名前を付けて保存) と選んで下さい.
3.4 既存のソースファイルを開く
画面上にあるメニューバーから,ファイル → 開く と選んで下さい.
4 ソースファイルのコンパイルの仕方(GCC の使い方)およびプログラムの実行
実験III のプログラムは C 言語で書きます.
プログラムが書き込まれたファイルのことをソースファイルと呼びます.
C言語で書かれたソースファイルは人には理解しやすいですが,コンピュータの処理系には理解できないので,プログラムを実行するためにはソースファイルをコンパイル(翻訳)をする必要があります.
ここでは,GCC を使って,C 言語で書かれたソースファイルのコンパイル方法を説明します.
コンパイルは以下の手順で行います.
4.1 ソースファイルのあるディレクトリへの移動
cd コマンドを使って,ソースファイルのあるディレクトリ(保存場所.ウィンドウズでいうフォルダ)に移動しましょう. 現在の位置が分からない場合は,pwd コマンドを使って現在の位置を調べてから,cd コマンドで移動しましょう. ちなみに,ターミナルを起動した時は,ホームディレクトリ(Users[ユーザ名]) にいます. 下図 4 ) では,現在位置が /Users/jikken09 (ホームディレクトリ)で,ソースファイルのあるディレクトリは /Users/jikken09/Destop (デスクトップ)となっています.
図4: ソースファイルのあるディレクトリへの移動
4.2 GCC によるコンパイル
以下の Hello world プログラムが書きこまれた exam.c をコンパイルする例を示します.
#include<stdio.h> int main(void) { printf("Hello world!\n"); return 0; }
exam.c が用意できたら,プロンプトの横にコンパイルコマンド(gcc)を打ちます. すなわち,
gcc exam.c
と打てば,exam.c をコンパイルできます.
これで,何もエラーが表示されなければ,ソースファイル名 exam.c がコンパイルされて,a.out という名前の実行プログラムファイルができます.
ソースファイルに誤りがある時は,エラーが表示されます.エラーに従って,ソースファイルを修正して下さい.
もし,何かおかしなことが起きたら gcc ではなく g++ を使ってください.(無意識に C++ 言語の構文を使っている場合はこれで解決できます)
g++ exam.c
また,実行ファイルに a.out 以外の名前(例えば,sugoi_program)を付けたい場合には,以下のように コンパイル時に –o オプションを使用して下さい.
gcc -o sugoi_program exam.c
※ g++ でも同じように -o オプションが使えます.
4.3 プログラムの実行
プロンプトの横に,実行プログラムファイル名を打って,プログラムを実行します.(ファイル名の先頭に './' を付けることを忘れずに!) ここでは,実行プログラムファイル名が a.out であるとしています.
./a.out
プログラムの実行結果をファイル (file.res) に保存するには,以下のようにします.(出力のリダイレクト機能)
./a.out > file.res
5 プログラミングにおける注意点
以下のことに注意しましょう.
- for 文や if 文などを追加した時はタブを正しく入れましょう.プログラムの間違いが少なくなるだけではなく,他の人に間違いを見てもらう時の時間が節約できます.
- ソースファイル名には,全角文字を使わずに,半角英数字および記号(ドット'.',アンダーバー'\_',バー'-')のみを使って下さい.それ以外の文字を使うと,ターミナルでコンパイルするのがややこしくなります.
- ソースファイル名の拡張子は 'c' か 'cpp' にして下さい.
- main関数は,次のいづれかのように定義しましょう.以下のように,main 関数の型は void とし,return で値をなにも返さない.
void main (void) { ... ... return; }
もしくは,main 関数の型は int とし,return 0 で値を返すようにしてください.
int main (void) { ... ... return 0; }
- 一様乱数を発生させるプログラム等で,なにかおかしくなる時は,RANDMAX の頭に (double) をつけてください.例えば,
y = (rand()+0.5)/(RAND_MAX+1.0);
ではなく,以下のように,必ず RANDMAX の頭に (double) をつけるようにして下さい. #+BEGINSRC C y = (rand()+0.5)/((double)RANDMAX+1.0); #+ENDEXAMPLE
6 プログラミングにおける FAQ
- Q1. プログラムはあっているのにエラーが出るのですが.
- A1. ソースコード内に2バイトコード(漢字,ひらがな,カタカナ等の全角文字)がないか確認してください.特に括弧は間違えやすいです(半角(は○.全角(は×).それでも解決しない場合には,教員かTAに聞いてください.
- Q2. printfで表示した文字が化けてしまいます.
A2. ソースファイルの文字コードが UTF-8 になっているか確認しましょう.もし,UTF-8 に,なっていなければ,UTF-8に変更してみてください. ターミナルでは以下のコマンドで UTF-8 に変更できます.
nkf -u exam.c > exam-utf8.c
exam.c が元のソースファイルで,exam-utf8.c が 文字コードが UTF-8 となったソースファイルです.
- Q3. コンパイルしようとしても "no such file or directory" と返ってきてしまいます.
- A3. lsコマンドを使用して,カレントディレクトリにコンパイル対象となるソースファイルがあるか確認してください.ない場合には,カレントディレクトリを移動するかファイルを現在のカレントディレクトリに移動してください.
- Q4. よくわかりませんが,'\'が入力できません.
- A4. エディタに Xcode を使っていると,'\'が入力できないことがあります.Xcode を使っている場合は,エディタを mi に変更してみてください. ちなみに,ソースファイル(拡張子が '.c'のファイル)をダブルクリックすると,Xcode で開いてしまいますので気をつけて下さい.
- Q5. C 言語 で '…' をどうやるのかが分かりません.
- A5. google で 'C 言語' と '…' のキーワードで検索しましょう.もし,それで分からない時は,TA や教員に聞いてください.
- Q6. Mac の Excel で '…' をどうやるのかが分かりません.
- A6. google で 'Mac','Excel' と '…' のキーワードで検索しましょう.もし,それで分からない時は,TA や教員に聞いてください.
- Q7. どうせコマンド打ってプログラムをコンパイルしてくれるなら,自動でやってくれればいいのに.
- A7. コンパイルには時間がかかります.毎回コンパイルすると,同じプログラムを実行する時に,同じだけ余計に時間がかかってしまいます.
- Q4-1. じゃあ,プログラムを書き換えた時だけ,コンパイルしてよ.
- A4-1. そういうことをしてくれるツールとして make があります.実験の時間は限られているので,教えられませんでした.
- Q4-1. じゃあ,プログラムを書き換えた時だけ,コンパイルしてよ.
- A7. コンパイルには時間がかかります.毎回コンパイルすると,同じプログラムを実行する時に,同じだけ余計に時間がかかってしまいます.
- Q8. 同じプログラムをいちいち何度も実行するのは面倒なんですが.
A8. ターミナルにまかせましょう.以下のようにすると,'a.out' というプログラムを 10 回実行できます.
for i in `jot 10` do ./a.out done
プロンプトから enter ボタンを押して改行し,4行いっきに入力してます. 二行目以降の '>' は自動で入力されます. `jot 10` を `jot 20` にすれば,20回繰替えせます.
- Q9. Excel ファイルに実行結果をコピペするのが面倒なのですが.
A9. プログラムの実行結果をそのままファイルに書き込みましょう.
./a.out > result.csv
とすると,a.out の実行結果が result.csv に書き込まれます.
- Q10. 実行結果が多すぎて,Excel で図を作るのに時間がかかってしまうのですが.
A10. プログラムの実行結果を間引いて,実行結果を少なくしましょう.
./a.out | awk 'NR % 100 == 0 {print $0}' > result.csv
とすると,a.out の実行結果を 100行間隔で間引いたものが result.csv に書き込まれます.'NR % 100' のところを 'NR % 10' とすれば,10行間隔になります.
もし,すでに,a.out の実行結果が,あるファイル result.csv に書き込まれているならば,以下を試してください.cat result.csv | awk 'NR % 100 == 0 {print $0}' > result2.csv
すると,result.csv を 100行間隔で間引いたものが,result2.csv に出力されます.
7 Excel での統計データ処理に使う関数や機能
- セル内改行
optionキー + commandキー + Enterキー を同時に押す
- 範囲内の合計の計算
= SUM(範囲)
- 範囲内の平均の計算
= AVERAGE(範囲)
- 範囲内の標準偏差の計算
= STDEV(範囲)
- 累乗( \(X^a\) ) の計算 (例: A1 に X の値が入っているとする)
= A1^a
- 指数関数 ( \(e^a\) ) の計算
= EXP(a)
- 自然対数 ( \(log(a)\) ) の計算
= LOG(a)
- 階乗 (n!) の計算
= FACT(n)