Compare commits
No commits in common. "7a7656ad2609592f835cd09409b7185b6dad4838" and "b1e74292c46231427c8b3acac1155d19b035dcac" have entirely different histories.
7a7656ad26
...
b1e74292c4
55
README.md
55
README.md
@ -1,35 +1,11 @@
|
||||
|
||||
# C言語学習
|
||||
|
||||
## このレポジトリについて
|
||||
|
||||
このレポジトリは私がC言語学習で躓いたところを復習を兼ねて作成したプログラムになります。
|
||||
|
||||
もし同じように躓いた方がいましたら、確認してみると参考になるかもしれません。
|
||||
|
||||
ただし、以下のことに注意してください。
|
||||
|
||||
- 基本的な文法がわかること
|
||||
- 配列の渡し方がわかること
|
||||
- 構造体の定義の仕方がわかること
|
||||
- アルゴリズムを理解していること
|
||||
- コメントは基本ないこと
|
||||
|
||||
## コンパイル
|
||||
|
||||
GCCを使用してコンパイルしています。
|
||||
|
||||
基本的には引数を特に指定してません。
|
||||
|
||||
作業環境により、GCCのバージョンが違うためここで明記しませんが、どのバージョンでも動くように作成しているつもりです。
|
||||
|
||||
`gcc quick_sort.c -o quick_sort`
|
||||
|
||||
### 構造体とポインタ
|
||||
|
||||
構造体とポインタについての学習
|
||||
|
||||
- 2022/04/09
|
||||
2022/04/09
|
||||
|
||||
#### 処理内容
|
||||
|
||||
@ -42,9 +18,7 @@ GCCを使用してコンパイルしています。
|
||||
|
||||
数値配列のクイックソートを行う
|
||||
|
||||
- 2022/04/22 q_sort
|
||||
- 2022/04/26 quick_sort
|
||||
- 2022/04/28 array_quick_sort
|
||||
2022/04/22
|
||||
|
||||
#### 処理内容
|
||||
|
||||
@ -58,31 +32,6 @@ 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.
|
||||
|
Binary file not shown.
@ -1,86 +0,0 @@
|
||||
#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;
|
||||
}
|
Binary file not shown.
@ -1,86 +0,0 @@
|
||||
#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;
|
||||
}
|
Binary file not shown.
@ -1,108 +0,0 @@
|
||||
#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;
|
||||
}
|
Binary file not shown.
@ -1,118 +0,0 @@
|
||||
#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;
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
151515
|
||||
15151
|
||||
5151
|
||||
15676
|
||||
54345
|
||||
676543
|
||||
234567
|
||||
5432
|
||||
123456
|
||||
7809876
|
||||
543
|
||||
21
|
||||
23487
|
||||
65
|
||||
65
|
||||
456
|
||||
100
|
||||
99
|
||||
301
|
||||
314
|
||||
156615
|
||||
56215562
|
||||
61562
|
||||
61562615
|
@ -60,7 +60,6 @@ int right
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
/***********************************
|
||||
クイックソートを行う
|
||||
***********************************/
|
||||
@ -83,55 +82,6 @@ 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;
|
||||
}
|
||||
|
||||
/***********************************
|
||||
メイン関数
|
||||
***********************************/
|
||||
@ -152,7 +102,7 @@ main()
|
||||
int length = sizeof(array) / sizeof(int);
|
||||
|
||||
printf("Length: %d\n", length);
|
||||
quick_sort(array, 0, length);
|
||||
q_sort(array, 0, length);
|
||||
|
||||
int i ;
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -1,124 +0,0 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user