diff --git a/README.md b/README.md index 2cdab7d..742ee80 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,31 @@ GCCを使用してコンパイルしています。 8. ピボットより小さいデータをクイックソートする 9. ピボットより大きいデータをクイックソートする +### ダイヤモンドアート + +コマンドラインで指定されたサイズのダイヤモンドを生成する + +2022/04/27 diamond, diamond2, diamond3 + +#### 考え方 + +1. 一度にすべてを出力することはできないので、処理の分割を行う +2. まず文字列として出力することを考えると、一行ずつ出力することができる +3. 次にダイヤモンドの形にするには左と右で分割して考えたほうが簡単だとわかる +4. 以上を踏まえ、上左側、上右側、下左側、下右側で処理を分割する +5. 共通化できる部分を関数化する + +#### 処理内容 + +1. コマンドラインの入力を確認する +2. 出力関数を呼び出す +3. 上から順に一行ずつ再起地点まで出力する +4. 左側を出力する +5. 右側を出力する +6. 再起地点まで来たら降順に上から順に出力する +7. 左側を出力する +8. 右側を出力する + # Copyright Copyright (c) 2022 kema All Rights Reserved. diff --git a/diamond_art/diamond b/diamond_art/diamond new file mode 100755 index 0000000..f1df82f Binary files /dev/null and b/diamond_art/diamond differ diff --git a/diamond_art/diamond.c b/diamond_art/diamond.c new file mode 100644 index 0000000..43645d3 --- /dev/null +++ b/diamond_art/diamond.c @@ -0,0 +1,86 @@ +#include +#include + +int +output_whitespace( + int length +) +{ + int i; + + for ( i = 0 ; i < length ; i++ ) { + printf(" "); + } + + return 0; +} + +int +output_diamond_line( + int diamond_size, + int current_line +) +{ + int i; + int j; + + output_whitespace(diamond_size - current_line); + + for ( i = 1 ; i < current_line ; i++ ) { + printf("%d", i); + } + + for ( i = 0 ; i < current_line ; i++ ) { + printf("%d", current_line - i); + } + + printf("\n"); + + return 0; +} + +int +output_diamond( + int diamond_size +) +{ + int i; + int j; + + for ( i = 0 ; i < diamond_size; i++ ) { + output_diamond_line(diamond_size, i); + } + + for ( j = diamond_size ; j > 0 ; j-- ) { + output_diamond_line(diamond_size, j); + } + + return 0; +} + +int +main( + int argc, + char *argv[] +) +{ + int diamond_size; + + if (argc < 2) + { + printf("Invalid command line arguments.\n"); + return -1; + } + + diamond_size = atoi(argv[1]); + + if (diamond_size < 1 || diamond_size > 9) + { + printf("Can not create diamond (s: %d).\n", diamond_size); + return -1; + } + + output_diamond(diamond_size); + + return 0; +} diff --git a/diamond_art/diamond2 b/diamond_art/diamond2 new file mode 100755 index 0000000..486b1cb Binary files /dev/null and b/diamond_art/diamond2 differ diff --git a/diamond_art/diamond2.c b/diamond_art/diamond2.c new file mode 100644 index 0000000..6c224a9 --- /dev/null +++ b/diamond_art/diamond2.c @@ -0,0 +1,86 @@ +#include +#include + +int +output_whitespace( + int length +) +{ + int i; + + for ( i = 0 ; i < length ; i++ ) { + printf(" "); + } + + return 0; +} + +int +output_diamond_line( + int diamond_size, + int current_line +) +{ + int i; + int j; + + output_whitespace(diamond_size - current_line); + + for ( i = 1 ; i < current_line ; i++ ) { + printf("#"); + } + + for ( i = 0 ; i < current_line ; i++ ) { + printf("#"); + } + + printf("\n"); + + return 0; +} + +int +output_diamond( + int diamond_size +) +{ + int i; + int j; + + for ( i = 0 ; i < diamond_size; i++ ) { + output_diamond_line(diamond_size, i); + } + + for ( j = diamond_size ; j > 0 ; j-- ) { + output_diamond_line(diamond_size, j); + } + + return 0; +} + +int +main( + int argc, + char *argv[] +) +{ + int diamond_size; + + if (argc < 2) + { + printf("Invalid command line arguments.\n"); + return -1; + } + + diamond_size = atoi(argv[1]); + + if (diamond_size < 1) + { + printf("Can not create diamond (s: %d).\n", diamond_size); + return -1; + } + + output_diamond(diamond_size); + + return 0; +} diff --git a/diamond_art/diamond3 b/diamond_art/diamond3 new file mode 100755 index 0000000..34a43c5 Binary files /dev/null and b/diamond_art/diamond3 differ diff --git a/diamond_art/diamond3.c b/diamond_art/diamond3.c new file mode 100644 index 0000000..644043d --- /dev/null +++ b/diamond_art/diamond3.c @@ -0,0 +1,108 @@ +#include +#include + +int +output_whitespace( + int length +) +{ + int i; + + for ( i = 0 ; i < length ; i++ ) { + printf(" "); + } + + return 0; +} + +int +output_diamond_line( + int diamond_size, + int current_line +) +{ + int i; + int j; + int k; + int l; + + // Left Side + // Decoration + for ( i = diamond_size - current_line ; i > 0 ; i-- ) { + printf("%d", i); + } + + // Padding + output_whitespace(1); + + // Diamond + for ( j = 1 ; j < current_line ; j++ ) { + printf("%d", j); + } + + // Right Side + // Diamond + for ( k = 0 ; k < current_line ; k++ ) { + printf("%d", current_line - k); + } + + // Padding + if ( current_line != 0 ) { + output_whitespace(1); + } + + // Decoration + for ( l = 1 ; l <= diamond_size - current_line ; l++ ) { + printf("%d", l); + } + + printf("\n"); + + return 0; +} + +int +output_diamond( + int diamond_size +) +{ + int i; + int j; + + for ( i = 0 ; i < diamond_size; i++ ) { + output_diamond_line(diamond_size, i); + } + + for ( j = diamond_size ; j >= 0 ; j-- ) { + output_diamond_line(diamond_size, j); + } + + return 0; +} + +int +main( + int argc, + char *argv[] +) +{ + int diamond_size; + + if (argc < 2) + { + printf("Invalid command line arguments.\n"); + return -1; + } + + diamond_size = atoi(argv[1]); + + if (diamond_size < 1 || diamond_size > 9) + { + printf("Can not create diamond (s: %d).\n", diamond_size); + return -1; + } + + output_diamond(diamond_size); + + return 0; +}