main関数への引数渡し(コマンドライン引数)

 C言語で記述されたプログラムは、実行するとまず main() 関数が実行されます。
 実は main() 関数も、前回演習した「自作」関数の仲間で、これは unix のコマンドラインから 呼ばれる関数と考えることができます。
 これまでの演習では、プログラムに対してデータを与えることはしなかったのですが、 それを main() 関数に対する引数渡しという形で実現できます。

演習課題1

 以下のプログラムは、コマンドラインに入力された文字列の個数と、文字列を表示するプログラムです。

#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
%

演習課題2

以下のプログラムは、ライブラリ関数 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
%

演習課題3

コマンドラインに入力された数字の平均値、分散を計算し、印字するプログラムを作成せよ。 ただし数値は実数型で取り扱うこと
平均・分散  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 の和を考える。

演習課題4

 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で作成したプログラムを印刷して提出せよ。


TOP