文字列巡回置換
こちらの問題に、チャレンジしてみました。m(_ _)m
http://rina.jpn.ph/rance/
[出力結果]
anny bany chery domy --------------------------- A B C D D A B C C D A B B C D A A B C D
put_row()関数は、指定された配列とその分割位置について、
1.分割位置の要素〜配列の最終要素までを表示
2.配列の先頭要素〜分割位置-1の要素までを表示
という処理を行なっています。
また、main()関数からput_row()関数の呼出し時、分割位置を[配列の最終要素+1...0]と先頭方向に移動させています。イメージとしては、以下の通り。
A B C D ▲ ↓ A B C D ▲ ↓ A B C D ▲ ↓ 以下略 ※"▲"…分割位置
初回の呼び出しでは、配列の最終要素を超えた分割位置が指定されますが、for文の続行判定で弾かれるため、1のループは実行されません。
[ソースコード]
1 #include <stdio.h> 2 3 #define NUM_OF(array) (sizeof(array)/sizeof(*array)) 4 5 /* 6 * Disp array content splited by specified index. 7 */ 8 void put_row(const char *array, const int element_num, const int split_pos) 9 { 10 int i; 11 12 for(i=split_pos; i<element_num; i++){ 13 printf("%c\t", array[i]); 14 } 15 for(i=0; i<split_pos; i++){ 16 printf("%c\t", array[i]); 17 } 18 } 19 20 int main(void) 21 { 22 const char anny = 'A'; 23 const char bany = 'B'; 24 const char chery = 'C'; 25 const char domy = 'D'; 26 char array[] = {anny, bany, chery, domy}; 27 int row; 28 29 /* header */ 30 printf("%s\t%s\t%s\t%s\n", "anny", "bany", "chery", "domy"); 31 printf("---------------------------\n"); 32 33 /* content */ 34 for(row=0; row<=NUM_OF(array); row++){ 35 put_row(array, NUM_OF(array), NUM_OF(array) - row); 36 printf("\n"); 37 } 38 39 return 0; 40 }