drop-stones / titech-sysdev-2020

システム開発プロジェクト応用第一
0 stars 0 forks source link

Unit test #7

Open drop-stones opened 3 years ago

drop-stones commented 3 years ago

演習1: 自分のOSSにテストを1つ追加せよ

drop-stones commented 3 years ago

演習2: テストフレームワークを使って自分のOSSにテストを追加せよ

drop-stones commented 3 years ago

演習3: テスト駆動開発により自分のOSSに機能を追加せよ

drop-stones commented 3 years ago

演習4: TDD+モブプログラミングで100 doorsを解け

int doors[DOORS] = {0};

int *answer(void) {

return NULL;

}

// start is 0-origin int *pass (int arr[], int size, int start) { int step = start + 1; for (int i = start; i < size; i = i + step) { arr[i] = (arr[i] + 1) % 2; } return arr; }


- hiker.h

// hiker.h

ifndef HIKER_INCLUDED

define HIKER_INCLUDED

define TRUE 1

define FALSE 0

define DOORS 100

define NULL 0

int answer(void); int pass (int arr[], int size, int start);

int isSameArr (int arr1, int arr2, int size);

endif


- hiker.test.c

// hiker.test.c

include "hiker.h"

include

include

// int isSameArr (int arr1, int arr2, int size) { int result = TRUE; for (int i = 0; i < size; i++) { if (arr1[i] != arr2[i]) result = FALSE; } return result;
}

static void first_passing(void) { int init_doors[DOORS] = {FALSE}; int correct[100]; for (int i = 0; i < DOORS; i++) correct [i] = 1; //printf ("%d\n", correct [5]); assert(isSameArr(pass(init_doors, DOORS, 0), correct, DOORS)); }

static void second_passing (void) { int init_doors[DOORS] = {FALSE}; int correct[DOORS]; for (int i = 0; i < DOORS; i++) { if ((i + 1)%2 == 0) correct [i] = FALSE; else correct [i] = TRUE; } pass (init_doors, DOORS, 0);

assert(isSameArr(pass(init_doors, DOORS, 1), correct, DOORS));

}

static void final_passing (void) { assert(isSameArr(, correct)); }

int main(void) { puts("Testing first_passing"); first_passing(); puts("Testing second_passing"); second_passing(); puts("Testing third_passing"); third_passing();

puts("All tests passed");

}



- 感想
  - コーディングスタイルが違うので、やりにくい
    - 命名規則、宣言位置(define,global宣言,local宣言)、関数への切り分け方など
    - でも、ミスリーディングな変数名に気付けたり、いろんな作法があるんだなと気付けた!!
  - オンラインでやると議論がしにくい
    - 話が被ったり、表情が見えないことで理解度の確認が難しかったりする
    - こっからのご時世、慣れないといけないかも
  - 自分一人では書かない(書けない)コードができる
    - 複数人で意見を出し合うため、当然だが一人では書かないようなコードが出来上がり、面白い

- 余談
  - 同じ授業を受けていた友達(チーム2)に話を聞いてみたところ、100 doorsにはとても効率の良いアルゴリズムがあるとのこと
  - 考え方
    - 約数の数だけ訪問(ドアの開け閉め)される
      - 4 = 1 * 4 = 2 * 2: (1, 2, 4)の三回
      - 6 = 1  * 6 = 2 * 3: (1, 2, 3, 6)の四回
      - 8 = 1 * 8 = 2 * 4: (1, 2, 4, 8)の四回
    - 平方数のみ約数の数は奇数、他は偶数になる
      - 平方数: 掛け算で表した時、平方根 * 平方根という式が現れ、この表現から得られる約数は平方根ただ一つ
      - 平方数以外: 掛け算で表すと、a * b (a !=b)で表され、必ず二つの約数a,bが得られる
  - 以上より、ドアが開くのは奇数回開け閉めされる平方数のみ!!