はじめに

今までのソフテクC言語研修では、1人でプログラムを書いてきました。しかし、現実のソフトウェア開発やプロコンに向けての活動では、チームで開発をすることが要求されます。チームで開発を進めるためには、個々人の技術力だけでなく、様々な能力やノウハウが要求されます。

今日はその演習として、2人1組になってチーム開発をやってみましょう。

プログラム同士の連携

ある程度大規模なシステムを作るとなると、複数のプログラムを開発することが必要です。そして、それらのプログラムを連携させる必要があります。例えばTwitterのようなSNSアプリを作るとなれば、データを保存したりするサーバ側のプログラムと、実際にユーザがスマートフォンで操作するモバイル側のプログラムが必要になります。

どのようにプログラム同士を連携すればよいのでしょうか。一定のルールを決めて通信を行ったり、どこかにデータを保存しておいて、それを読み書きすることによってプログラム同士の連携をすることです。
例えば、TwitterはHTTPというプロトコル(ルール)に基づいてサーバ側のプログラムとモバイル側のプログラムを通信させています。 また、コンビニなどのPOSレジは、全国の店舗での売上を本社のサーバに保存し、その売れ行き等のデータを分析してどの商品をどれくらい入荷するかなどを決めています。

演習

チームで開発するために作業を分担するときは、動作するハードウェア単位(iOS/Androidやサーバ側・クライアント側など)だったり、機能単位だったりしますが、今回は機能単位で分担してみましょう。

今回開発するのは、コマンドラインで動作する「売上記録・集計システム」です。機能は大きく分けて2つあります。2人1組でチームを組んで、それぞれ分担して開発してみましょう。

手順

  1. プログラムの仕様を確認する。
  2. それぞれの担当を決める。
  3. それぞれで開発する。
  4. それぞれでテストする。
  5. 最後に、システムのテストを行う。

それぞれでテストをする際は、動作例01、動作例02のようにしてテストしましょう。 最終的にシステムをテストする際は、動作例03のようにしてテストしましょう。

要求仕様

  • 売上記録・集計システム
  • 機能は以下の2つ
    • 売上の記録
    • 売上の集計
  • 売上の記録機能
    • 商品名(アルファベット小文字1文字)と、売上個数(自然数)をスペース区切りで入力する。
      • 例: a 10
    • 入力された商品名と売上個数を標準出力にカンマ区切りで出力する。
      • 例: a,10 など
        • 余計なスペース等入れないように注意!
    • 上記をEOFの入力があるまで繰り返す。
  • 売上の集計機能
    • コマンドライン引数で商品名を与える。
    • 標準入力からカンマ区切りの商品名と売上個数を読み込み、与えられた商品名の合計を標準出力に出力する。

動作例

動作例01: 記録機能

記録機能

動作例02: 集計機能

集計機能

動作例03: 最終的なシステムの動作

最終的な動作

補足

EOF

EOFは、End of Fileの略で、ファイルの終わりを示します。また、Ctrl + dを押下することによってEOFを入力する事もできます。

仕様にあるEOFの入力があるまで繰り返すという処理は、以下のようにして実現することが出来ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ファイル名: eof_sample.c
#include <stdio.h>

int main(void)
{
  char input;

  while(scanf("%c", &item) != EOF) {
    printf("入力は %c です。\n", input)
  }
  printf("Ctrl + Dが押されたので終了します。\n")

    return 0;
}
$ gcc -o eof_sample eof_sample.c
$ ./eof_sample.c
a
入力されたのはaです。
b
入力されたのはbです。
c
入力されたのはcです。
# ここでCtrl + Dを押す
Ctrl + Dが押されたので終了します。

標準出力・標準入力とは

  • 「標準出力に出力せよ」は、printf()で出力してくださいという意味。
  • 「標準入力から読み込み」は、scanf()で入力してくださいという意味。

printf()での出力は、プログラムの実行時に ./実行ファイル名 > ファイル名 とすることで、printf()での出力内容をファイルに書き込むことが出来る。
同様に、scanf()での入力は、プログラムの実行時に ./実行ファイル名 < ファイル名 とすることで、ファイルの内容をscanf()の入力とすることが出来る。

上記の説明はあまり正確ではないので、詳しいことはこのへんとかどうぞ。

標準入力・標準出力ってなに? - Qiita

コマンドライン引数

コマンドライン引数とは、コマンドやプログラムの実行時にコマンドラインから渡す引数のことです。例えば、 cd prog は、cdというコマンドに、 “prog” というコマンドライン引数を渡していると説明することが出来ます。

自作のプログラムでも、 ./sample aaa などと実行すれば、sampleというプログラムに “aaa” というコマンドライン引数を渡す事ができます。

C言語でコマンドライン引数は文字列で渡されます。以下に、コマンドライン引数を利用したプログラムのサンプルを示します。

1
2
3
4
5
6
7
8
9
10
// ファイル名: cmdline_sample.c
#include <stdio.h>

int main(int argc, char *argv[])
{
  printf("argv[0]はファイル名: %s", argv[0]);
  printf("argv[1]は1つ目のコマンドライン引数: %s", argv[1]);

  return 0;
}
$ gcc -o cmd_sample cmd_sample.c
$ ./cmd_sample hello
argv[0]はファイル名: ./cmd_sample
argv[1]は1つ目のコマンドライン引数: hello

コマンドライン引数は文字列で渡されますが、今回は文字がほしいので、以下のようにすると良いでしょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
// ファイル名は、 cmd_sample2.c
#include <stdio.h>

int main(int argc, char *argv[])
{
  char item_name;

  item_name = argv[1][0];   // 1つ目のコマンドライン引数(文字列)の1文字目を取得

  printf("%c\n", item_name);

  return 0;
}
$ gcc -o cmd_sample2 cmd_sample2.c
$ ./cmd_sample2 a
a