バイオインフォ道場、くまぞうです。
C言語で配列を使ってみましょう。配列は、複数の値を管理する入れ物のようなものです。他の言語でもよく使う機能ですが、C言語の場合は同じ型のデータを管理します。また、サイズや初期化に注意する必要があります。
スポンサーリンク
配列の基本的な使い方
配列は、データを順番に管理します。この順番のことを「添字」や「インデックス」と呼びますが、配列を使う場合はこれらの番号を使ってデータ操作を行います。配列に名前を付けて生成し、先頭を0番のデータ、次のデータを1番のデータというようにデータを追加します。追加したデータは、番号を使って参照・編集を行います。
生成
配列を使うためには、必要な要素数と型を指定します。メモリ上に連続した領域か確保されます。
int array[10]; # 必要に応じて初期化する
int a[5] = {1, 2, 3, 4, 5}; # 初期化済み5個の配列
int b[] = {1, 2, 3, 4, 5}; # 初期化済み5個の配列(サイズは自動で確保される)
char c[10]; # char型配列。必要に応じて初期化する
参照
配列を参照する場合は、配列名[index番号]でアクセスします。0番が先頭です。最後は「要素数-1」です。
for (i=0; i<SIZE; i++) {
printf("%d", a[i]); # int型の配列を参照する場合(i, SIZEの宣言は別途必要)
}
編集
配列要素は書き換えることが出来ます。配列のインデックスを指定して、新しいデータを代入すると、指定したデータを更新出来ます。
for (i=0; i<SIZE; i++) {
a[i] = i*2; # int型の配列にデータをセット、初期化など(i, SIZEの宣言は別途必要)
}
プログラム
プログラム例
test_sort.c
#include <stdio.h>
#define SIZE_N 20
void main(void)
{
int array[SIZE_N];
int i, j;
for (i=0; i<SIZE_N; i++) {
array[i] = rand() % 10000;
}
int temp;
for (i=1; i<SIZE_N; i++) {
temp = array[i];
for (j=i-1; j>=0 && array[j]>temp; j--) {
array[j+1]=array[j];
}
array[j+1]=temp;
}
for (i=0; i<SIZE_N; i++) {
printf("%6d\n", array[i]);
}
}
test_search.c
#include <stdio.h>
#define SIZE_N 20
int my_search(const int array[], int key, int s_min, int s_max);
void main(void)
{
int array[SIZE_N];
int i;
for (i=0; i<SIZE_N; i++) {
array[i] = 2*i;
}
int key, res;
printf("input number 0-38 ");
scanf("%d", &key);
res = my_search(array, key, 0, SIZE_N-1);
res != -1 ? \
printf("found:array[%d], %d\n", res, array[res]) : \
printf("not found\n");
for (i=0; i<SIZE_N; i++) {
printf("%8d", array[i]);
}
}
int my_search(const int array[], int key, int s_min, int s_max)
{
int s_mid = (s_min+s_max)/2;
int res;
if (key == array[s_mid]) {
return s_mid;
}
if (s_min > s_max) {
return -1;
}
return (key<array[s_mid] ? \
my_search(array, key, s_min, s_mid-1) : \
my_search(array, key, s_mid+1, s_max));
}
プログラム実行
$ gcc test_sort.c -o test_sort $ ./test_sort 27 59 492 ... 8690 9172 9383
$ gcc test_search.c -o test_search $ ./test_search input number 0-38 10 found:array[5], 10 0 2 4 6 8 10 12 ... 38
プログラムについて
test_sort.cでは、配列に格納されたランダムな数値をソートしました。基本挿入法でソートしています。test_search.cでは、ソート済みの配列に対して、二分サーチを行いました。ソートで配列を破壊することがないように、constで修飾しています。また、再帰呼出しで検索を繰り返しています。
スポンサーリンク
![バイオインフォ 道場 [bioinfo-Dojo]](https://bioinfo-dojo.net/wp-content/uploads/2016/03/some_object_luca-bravo-alS7ewQ41M8-unsplash.jpg)

