Practice 8: %S コマンドの実装(整列)

最後はソートです.まず解説を読んでみてください.

解答例(前半後半)を用意しました.解答例を見るのは,慎重に.

練習8-1 配列データの交換

ソートにおいて,配列中の2つのデータを交換する必要がある.例えば,2つのint型のポインタを引数に取り,両ポインタが指す2要素を入れ替える関数swap()は,以下のように記述できる.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

void swap(int *a, int *b)
{                             // S0
  int tmp;

  tmp = *a;                   // S1
  *a = *b;                    // S2
  *b = tmp;                   // S3
}

int main()
{
  int data[] = {1, 2};

  printf("Before: data[0] = %d, data[1] = %d\n", data[0], data[1]);
  swap(&data[0], &data[1]);
  printf("After:  data[0] = %d, data[1] = %d\n", data[0], data[1]);
}

実行結果:

Before: data[0] = 1, data[1] = 2
After:  data[0] = 2, data[1] = 1

このswap()関数を,以下のように書くと期待通りの動作をしない.それはなぜか?図解して説明せよ.(参考:関数とポインタ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

void swap(int a, int b)
{                               // F0
  int tmp;

  tmp = a;                      // F1
  a = b;                        // F2
  b = tmp;                      // F3
}

int main()
{
  int data[] = {1, 2};

  printf("Before: data[0] = %d, data[1] = %d\n", data[0], data[1]);
  swap(data[0], data[1]);
  printf("After:  data[0] = %d, data[1] = %d\n", data[0], data[1]);
}

実行結果:

Before: data[0] = 1, data[1] = 2
After:  data[0] = 1, data[1] = 2

練習8-2 簡単なソートの実装

数値型や文字列型のデータに対して,簡単なソートを実行するプログラムを作り,ソートの基本処理を理解せよ.

練習8-3 %Sコマンドの実装

これまで仮実装していたcmd_sort()を完成させよ.

練習8-4 %S のテスト

ソート結果が正しいことを確認するためのテストを実施したい.自分の作成したコマンドがsample.csvを正しくソートできているか確認する方法を示して,結果を確認せよ.