【C言語】第3章第7回:配列を使った簡単なアルゴリズムの実装
アルゴリズムはプログラミングの基盤となる概念です。この章では、配列を使った基本的なアルゴリズムをいくつか実装し、その仕組みを学びます。
1. 配列を使ったアルゴリズムの重要性
配列は、アルゴリズムを効率的に実行するための基本的なデータ構造です。ソート、検索、統計計算など、多くのアルゴリズムで使用されます。
以下では、配列を使った簡単なアルゴリズムを実装していきます。
2. 最大値と最小値を探すアルゴリズム
配列内の要素を走査して、最大値と最小値を見つけるアルゴリズムを実装します。
例:最大値と最小値を見つけるプログラム
#include <stdio.h>
int main() {
int numbers[] = {12, 7, 19, 3, 8, 15};
int max = numbers[0];
int min = numbers[0];
for (int i = 1; i < 6; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
printf("Maximum value: %d\n", max);
printf("Minimum value: %d\n", min);
return 0;
}
解説:
- 最大値と最小値を配列の最初の要素で初期化します。
- ループ内で各要素を比較し、必要に応じて最大値または最小値を更新します。
3. 配列内の要素の合計と平均を計算
配列内のすべての要素を合計し、その平均値を計算します。
例:合計と平均を計算するプログラム
#include <stdio.h>
int main() {
int numbers[] = {12, 7, 19, 3, 8, 15};
int sum = 0;
double average;
for (int i = 0; i < 6; i++) {
sum += numbers[i];
}
average = (double)sum / 6;
printf("Sum: %d\n", sum);
printf("Average: %.2f\n", average);
return 0;
}
解説:
- ループ内で要素を加算し、合計値を計算します。
- 合計値を要素数で割り、平均値を計算します。
- キャスト
(double)
を使用して整数の割り算を回避します。
4. バブルソート:配列の要素を並び替える
バブルソートアルゴリズムを使って配列の要素を昇順に並び替えます。
例:バブルソートで配列を並び替えるプログラム
#include <stdio.h>
int main() {
int numbers[] = {12, 7, 19, 3, 8, 15};
int n = 6; // 配列の要素数
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (numbers[j] > numbers[j + 1]) {
// 値を交換
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
解説:
- 内側のループで隣接する要素を比較し、大小関係に応じて交換します。
- 外側のループが終了するごとに、最大値が配列の末尾に固定されます。
5. 練習問題
以下の課題に挑戦して、配列を使ったアルゴリズムの理解を深めましょう。
- 配列内の偶数と奇数の数をカウントし、それぞれを出力するプログラムを作成してください。
- 配列内の要素を降順に並び替えるバブルソートアルゴリズムを実装してください。
- ユーザーが入力した値を配列に格納し、その最大値と最小値を出力するプログラムを作成してください。
6. 練習問題の解答と解説
問1の解答
#include <stdio.h>
int main() {
int numbers[] = {12, 7, 19, 3, 8, 15};
int even = 0, odd = 0;
for (int i = 0; i < 6; i++) {
if (numbers[i] % 2 == 0) {
even++;
} else {
odd++;
}
}
printf("Even numbers: %d\n", even);
printf("Odd numbers: %d\n", odd);
return 0;
}
問2の解答
#include <stdio.h>
int main() {
int numbers[] = {12, 7, 19, 3, 8, 15};
int n = 6;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (numbers[j] < numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
printf("Sorted array in descending order: ");
for (int i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
問3の解答
#include <stdio.h>
int main() {
int n, max, min;
printf("Enter the number of elements: ");
scanf("%d", &n);
int numbers[n];
printf("Enter %d elements: ", n);
for (int i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
max = min = numbers[0];
for (int i = 1; i < n; i++) {
if (numbers[i] > max) max = numbers[i];
if (numbers[i] < min) min = numbers[i];
}
printf("Maximum value: %d\n", max);
printf("Minimum value: %d\n", min);
return 0;
}
7. まとめ
配列を使った基本的なアルゴリズムを学ぶことで、効率的なデータ操作が可能になります。ここで紹介したアルゴリズムを応用して、さらに高度なプログラムに挑戦してみましょう。