2
insertion_procedure (int a[], int p [], int N)
{
    int i,j,k;
    for (i=0; i<=N; i++) p[i] = i;
    for (i=2; i<=N; i++)
    {
        k = p[i];
        j = 1;
        while (a[p[j-1]] > a[k]) {p[j] = p[j-1]; j--}
        p[j] = k;
    }
}

この特定の挿入手順のいくつかの良いテストケースは何でしょうか?

4

2 に答える 2

1

この関数を正しく読み取ると、このプロパティ a[0] > a[2] を持つ入力はすべて seg fault になります

最初のループスルーfor (i=2; i<=N; i++)

頭の中で変数を追跡します。

  1. i = 2
  2. k = p[i] == 2
  3. j = 1
  4. p[j-1] = p[0] == 0
  5. a[0] > a[2]while ループ条件が true であるため、j-- == 0
  6. while 条件の次の評価: while (a[p[-1] > k)-> SEGFAULT

それは良いテストかもしれません:-)

そのwhileループをセグメンテーション違反なしで複数回実行させる有用な入力があるようには見えないので、そこに論理エラーがあると思います

于 2010-04-20T09:37:51.427 に答える
1

私はこれらから始めます

  • [] 内の負の数。結果はどうあるべきですか?
  • p[] に負の数。
  • 負の数 N。
  • 空の配列。
  • 空の p 配列。
  • N = 0

実装を見て (私は c でプログラミングしていません)、これらのいくつかは AV になるのではないかと思います。

簡単に言えば、少なくとも入力パラメーターの境界分析を行い、各パラメーターの範囲外、境界およびインバウンドでのテストを行う必要があります。


パラメータが 1 つあり、境界が 0 と 10 であると判断した場合、テストケースは 6 つになります。-1、0、1、9、10、および 11 を渡す必要があります。

さらなる研究
パラメータの量が増えると、すべての組み合わせをテストすることはすぐに不可能になります。これは、すべてのペアのテストが役立つ場所です。

于 2010-04-20T09:40:00.960 に答える