C言語で記述されたプログラムは、実行するとまず main() 関数が実行されます。
実は main() 関数も、前回演習した「自作」関数の仲間で、これは unix のコマンドラインから
呼ばれる関数と考えることができます。
これまでの演習では、プログラムに対してデータを与えることはしなかったのですが、
それを main() 関数に対する引数渡しという形で実現できます。
以下のプログラムは、コマンドラインに入力された文字列の個数と、文字列を表示するプログラムです。
#include <stdio.h> int main(int argc, char *argv[]){ int i; printf("文字列の個数 %d\n",argc); for(i=0;i<argc;i++) printf("%d 番目の文字列 %s\n",i,argv[i]); return 0; }
実行例
% ./a.out This is a pen 文字列の個数 5 0 番目の文字列 ./a.out 1 番目の文字列 This 2 番目の文字列 is 3 番目の文字列 a 4 番目の文字列 pen %
解説
main() 関数は2つの引数を取ります(これまでの演習では、コマンドラインから引数をとる
ようなことはしなかったので、省略をしてきました)。
一つ目の引数 argc はコマンドラインに入力された文字列の個数が代入されます。
二つ目の引数 argv は入力されたコマンドラインの文字列(へのポインタ)の配列です。
課題
上記のソースコードを参考にして、コマンドラインに入力された文字列で0番目の文字列を除いた
ものを逆順に表示するプログラムを作りなさい:
% ./a.out This is a pen 4 番目の文字列 pen 3 番目の文字列 a 2 番目の文字列 is 1 番目の文字列 This % ./a.out This is a pen. And that is a pencil. 9 番目の文字列 pencil. 8 番目の文字列 a 7 番目の文字列 is 6 番目の文字列 that 5 番目の文字列 And 4 番目の文字列 pen. 3 番目の文字列 a 2 番目の文字列 is 1 番目の文字列 This %
以下のプログラムは、ライブラリ関数 atoi() を用いることで、コマンドライン入力の文字列を数値に変換し、 その値を2倍して表示するプログラムである。
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int i; int n; for(i=1;i<argc;i++){ n=atoi(argv[i]); printf("%d\n",n*2); } return 0; }
実行例
% ./a.out 10 2 34 abc -5 3.5 20 4 68 0 -10 6 %
解説
関数 atoi() は文字列を整数型(int)の数値に変換する関数です。これを利用するためには
#include <stdlib.h> をプログラムの先頭に書き加える必要があります。
同様の処理をする関数に atof() 関数があります。これは文字列を実数型(float)に変換するものです。
実行例を見ればわかるように、変換できない場合(数字でない場合)の戻り値は 0 になります。
課題
コマンドラインに入力された数字の和を計算し、その結果を表示するプログラムを作成せよ:
% ./a.out 1 2 3 4 5 15 %
コマンドラインに入力された数字の平均値、分散を計算し、印字するプログラムを作成せよ。
ただし数値は実数型で取り扱うこと
平均・分散 n 個の数値 x1,...xn の
平均 μ, 分散 σ2は、次のように与えられる:
μ=(x1+...+xn)/n
σ2=((x1-μ)2+...+(xn-μ)2)/n
実行例
% ./a.out 1.0 2.5 3 4.5 0.1 平均 2.220000 分散 2.373600 %
ヒント 平均を求めるには、入力された数の和をいったん求めて、それを入力された数の個数で割ればよい。 分散の計算も同様に、ただし (xi-μ)2 の和を考える。
3つの実数 x0, x1, dx を与えると
plot [0:2*pi] [-1:1] sin(x+x0) pause 0.5 plot [0:2*pi] [-1:1] sin(x+x0+dx) pause 0.5 plot [0:2*pi] [-1:1] sin(x+x0+2dx) pause 0.5 ・ ・ ・ plot [0:2*pi] [-1:1] sin(x+x1)のように印字するプログラムを作成せよ。つまり実行例としては
%./a.out 5 6.5 0.25 plot [0:2*pi] [-1:1] sin(x+5.00) pause 0.5 plot [0:2*pi] [-1:1] sin(x+5.25) pause 0.5 plot [0:2*pi] [-1:1] sin(x+5.50) pause 0.5 plot [0:2*pi] [-1:1] sin(x+5.75) pause 0.5 plot [0:2*pi] [-1:1] sin(x+6.00) pause 0.5 plot [0:2*pi] [-1:1] sin(x+6.25) pause 0.5 plot [0:2*pi] [-1:1] sin(x+6.50) %
となるようなものである。
演習課題3で作成したプログラムを印刷して提出せよ。