Compare commits

..

10 Commits

Author SHA1 Message Date
kemasama
7a7656ad26 add: quick sort split array 2022-04-28 19:53:55 +09:00
kemasama
a3d60a1acc fix: readme 2022-04-27 19:14:16 +09:00
kemasama
0bcafe6854 add: diamond art 2022-04-27 19:13:20 +09:00
kemasama
a0c8b41fbc fix: quick sort 2022-04-27 18:32:13 +09:00
kemasama
511de8b71f code: code clean 2022-04-26 19:03:03 +09:00
kemasama
00f061fa5b add: quick sort from file 2022-04-26 18:59:07 +09:00
kemasama
c89b8ed91f add: compile option 2022-04-26 18:41:23 +09:00
kemasama
dfe16c7756 fix: quick sort 2022-04-26 18:39:33 +09:00
kemasama
258c67f37b fix: readme 2022-04-25 20:21:19 +09:00
kemasama
f0f5ffaf5e fix: quick sort 2022-04-25 20:16:09 +09:00
15 changed files with 650 additions and 3 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,11 +1,35 @@
# C言語学習
## このレポジトリについて
このレポジトリは私がC言語学習で躓いたところを復習を兼ねて作成したプログラムになります。
もし同じように躓いた方がいましたら、確認してみると参考になるかもしれません。
ただし、以下のことに注意してください。
- 基本的な文法がわかること
- 配列の渡し方がわかること
- 構造体の定義の仕方がわかること
- アルゴリズムを理解していること
- コメントは基本ないこと
## コンパイル
GCCを使用してコンパイルしています。
基本的には引数を特に指定してません。
作業環境により、GCCのバージョンが違うためここで明記しませんが、どのバージョンでも動くように作成しているつもりです。
`gcc quick_sort.c -o quick_sort`
### 構造体とポインタ
構造体とポインタについての学習
2022/04/09
- 2022/04/09
#### 処理内容
@ -18,7 +42,9 @@
数値配列のクイックソートを行う
2022/04/22
- 2022/04/22 q_sort
- 2022/04/26 quick_sort
- 2022/04/28 array_quick_sort
#### 処理内容
@ -32,6 +58,31 @@
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.

BIN
diamond_art/diamond Executable file

Binary file not shown.

86
diamond_art/diamond.c Normal file
View File

@ -0,0 +1,86 @@
#include <stdio.h>
#include <stdlib.h>
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;
}

BIN
diamond_art/diamond2 Executable file

Binary file not shown.

86
diamond_art/diamond2.c Normal file
View File

@ -0,0 +1,86 @@
#include <stdio.h>
#include <stdlib.h>
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;
}

BIN
diamond_art/diamond3 Executable file

Binary file not shown.

108
diamond_art/diamond3.c Normal file
View File

@ -0,0 +1,108 @@
#include <stdio.h>
#include <stdlib.h>
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;
}

BIN
quick_sort/array_quick_sort Executable file

Binary file not shown.

View File

@ -0,0 +1,118 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int
array_copy(
int *array1,
int *array2,
int array2_size
)
{
int i;
for ( i = 0 ; i < array2_size ; i++ ) {
array1[i] = array2[i];
}
return 0;
}
int
quick_sort(
int *array,
int left,
int right
)
{
int *group_small;
int *group_large;
int small_index = 0;
int small_size = 0;
int large_index = 0;
int large_size = 0;
int i = 0;
int range = right - left;
int pivot;
int pivot_index = 0;
if ( left >= right ) {
return -1;
}
group_small = (int *)malloc(sizeof(int) * range);
if ( group_small == NULL ) {
return -1;
}
group_large = (int *)malloc(sizeof(int) * range);
if ( group_large == NULL ) {
free(group_small);
return -1;
}
pivot = array[left];
for ( i = left + 1 ; i <= right ; i++ ) {
if ( array[i] < pivot ) {
group_small[small_index] = array[i];
small_index++;
small_size++;
} else {
group_large[large_index] = array[i];
large_index++;
large_size++;
}
}
pivot_index = left + small_size;
array_copy(array + left, group_small, small_size);
array[pivot_index] = pivot;
array_copy(array + pivot_index + 1, group_large, large_size);
free(group_small);
free(group_large);
quick_sort(array, left, pivot_index - 1);
quick_sort(array, pivot_index + 1, right);
return 0;
}
int
main(
int argc,
char *argv[]
)
{
int i;
int length = 200;
int rand_limit = 100;
if ( argc > 1 ) {
length = atoi(argv[1]);
}
int array[length];
srand((int)time(NULL));
for ( i = 0 ; i < length ; i++ ) {
array[i] = rand() % rand_limit + 1;
}
time_t start_at = time(NULL);
quick_sort(array, 0, length - 1);
time_t end_at = time(NULL);
for ( i = 0 ; i < length ; i++ ) {
printf("%d\n", array[i]);
}
printf("elapsed: %lds\n", end_at - start_at);
return 0;
}

24
quick_sort/data.txt Normal file
View File

@ -0,0 +1,24 @@
151515
15151
5151
15676
54345
676543
234567
5432
123456
7809876
543
21
23487
65
65
456
100
99
301
314
156615
56215562
61562
61562615

View File

@ -60,6 +60,7 @@ int right
return j;
}
/***********************************
***********************************/
@ -82,6 +83,55 @@ int right
return 0;
}
/***********************************
***********************************/
int
quick_sort(
int *array,
int left,
int right
)
{
int right_index, left_index, pivot;
if ( left >= right )
{
return -1;
}
left_index = left;
right_index = right;
pivot = left;
for ( ; left_index < right_index ; )
{
for ( ; array[left_index] < array[pivot] ; )
{
left_index++;
}
right_index--;
for ( ; array[right_index] > array[pivot] ; )
{
right_index--;
}
if ( left_index < right_index )
{
swap(&array[right_index], &array[left_index]);
}
}
swap(&array[pivot], &array[right_index]);
quick_sort(array, left, right_index - 1);
quick_sort(array, right_index + 1, right);
return 0;
}
/***********************************
***********************************/
@ -102,7 +152,7 @@ main()
int length = sizeof(array) / sizeof(int);
printf("Length: %d\n", length);
q_sort(array, 0, length);
quick_sort(array, 0, length);
int i ;

BIN
quick_sort/quick_sort Executable file

Binary file not shown.

124
quick_sort/quick_sort.c Normal file
View File

@ -0,0 +1,124 @@
#include <stdio.h>
#include <stdlib.h>
int
swap(
int *x,
int *y
)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return 0;
}
/*************************************************************************
*************************************************************************/
int
quick_sort(
int *array, // ソートする配列
int left, // 左端
int right // 右端(※配列の要素数ではない)
)
{
int smaller_index;
int larger_index;
int pivot_index;
int pivot;
if ( left >= right ) {
return -1;
}
smaller_index = left;
larger_index = right;
pivot_index = left;
pivot = array[left];
while ( smaller_index < larger_index ) {
while ( array[smaller_index] < pivot )
{
smaller_index++;
}
while ( array[larger_index] > pivot )
{
larger_index--;
}
if ( array[smaller_index] < array[larger_index] ) {
break;
}
swap(&array[smaller_index], &array[larger_index]);
if ( array[smaller_index] == array[larger_index] ) {
smaller_index++;
}
}
quick_sort(array, left, larger_index - 1);
quick_sort(array, larger_index + 1, right);
return 0;
}
/***********************************
***********************************/
int
main()
{
int i;
int j;
int c;
int length = 0;
int read_line_size = 512;
char read_line[read_line_size];
FILE *fp;
char dataFile[] = "data.txt";
fp = fopen(dataFile, "r");
if ( fp == NULL ) {
printf("file can not open.\n");
return -1;
}
fseek(fp, 0, SEEK_SET);
while ( (c = fgetc(fp)) != EOF )
{
if ( c == '\n')
{
length++;
}
}
int array[length];
fseek(fp, 0, SEEK_SET);
for ( j = 0 ; j < length ; j++ )
{
fgets(read_line, read_line_size, fp);
array[j] = atoi(read_line);
}
fclose(fp);
printf("Length: %d\n", length);
quick_sort(array, 0, length - 1);
for ( i = 0 ; i < length ; i++ )
{
printf("%d", array[i]);
printf("\n");
}
return 0;
}