查找表在C语言中:初学者指南
こんにちは、将来のプログラマーさんたち!今日は、C言語における查找表(ルックアップテーブル)の素晴らしい世界に飛び込みます。プログラミングが初めての方也不用担心——私はこの概念をステップバイステップで案内します。これまでに多くの学生さんたちに教えたようにです。それでは、一緒にこの旅に出発しましょう!
什么是指查找表?
具体例之前に、查找表とは何かを理解しましょう。図書館にいるとします。必要な本を探すためにすべての本を探す代わりに、各本の場所を正確に教えてくれるカタログを使用します。プログラミングにおける查找表も基本的に同じです——ランタイムの計算をよりシンプルな配列インデックス操作に置き換えるデータ構造です。
では、いくつかの具体的な例を通じてこの概念を見ていきましょう。
例1:星期
まずは簡単な例——星期の查找表から始めます。
#include <stdio.h>
int main() {
const char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int day_number;
printf("Enter a day number (0-6): ");
scanf("%d", &day_number);
if (day_number >= 0 && day_number <= 6) {
printf("The day is: %s\n", days[day_number]);
} else {
printf("Invalid day number!\n");
}
return 0;
}
この例では、days
という配列を作成し、週の名前を格納しています。ユーザーが0から6の間の数字を入力すると、配列インデックスを使用して対応する日名を迅速に取得できます。これは、一系列のif-elseステートメントを使用するよりもはるかに速くてクリーンです!
例2:モールス信号翻訳
次に少し複雑なもの——モールス信号翻訳を試みます。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
const char *morse[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
char text[100];
int i;
printf("Enter a word in uppercase: ");
scanf("%s", text);
for (i = 0; i < strlen(text); i++) {
if (isalpha(text[i])) {
printf("%s ", morse[text[i] - 'A']);
}
}
printf("\n");
return 0;
}
ここでは、モールス信号の查找表を作成しています。各文字のモールス信号はmorse
配列に格納されています。ユーザーが単語を入力すると、各文字をモールス信号相当に翻訳するためにASCII値をインデックスとして使用します。
例3:温度変換
快速な華氏温度から摂氏温度への変換のための查找表を作成しましょう。
#include <stdio.h>
#define TABLE_SIZE 101
int main() {
float celsius_table[TABLE_SIZE];
int i;
// 查找表を填充
for (i = 0; i < TABLE_SIZE; i++) {
celsius_table[i] = (i - 32) * 5.0 / 9.0;
}
int fahrenheit;
printf("Enter temperature in Fahrenheit (0-100): ");
scanf("%d", &fahrenheit);
if (fahrenheit >= 0 && fahrenheit <= 100) {
printf("%.2f°C\n", celsius_table[fahrenheit]);
} else {
printf("Temperature out of range!\n");
}
return 0;
}
この例では、華氏0から100度までの摂氏温度を事前に計算し、查找表中に格納しています。これにより、ランタイムでの計算を必要とせずに即座に温度変換ができます。
例4:三角関数
查找表は、三角関数などの計算コストが高い操作において特に有用です。以下は正弦查找表の例です。
#include <stdio.h>
#include <math.h>
#define TABLE_SIZE 360
#define PI 3.14159265
int main() {
float sine_table[TABLE_SIZE];
int i;
// 查找表を填充
for (i = 0; i < TABLE_SIZE; i++) {
sine_table[i] = sin(i * PI / 180);
}
int angle;
printf("Enter an angle in degrees (0-359): ");
scanf("%d", &angle);
if (angle >= 0 && angle < 360) {
printf("sin(%d°) = %.4f\n", angle, sine_table[angle]);
} else {
printf("Angle out of range!\n");
}
return 0;
}
この例では、0から359度までの角度の正弦値を事前に計算し、查找表中に格納しています。これにより、計算コストの高い正弦関数のランタイム実行を避けることができます。
7セグメントLEDディスプレイでの查找表の使用
最後に、実際の応用——7セグメントLEDディスプレイの制御に查找表を使用してみましょう。
#include <stdio.h>
#define SEGMENTS 7
int main() {
// 7セグメントディスプレイ用の查找表 (0-9)
const unsigned char seven_seg_digits[10][SEGMENTS] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
int digit;
printf("Enter a digit (0-9): ");
scanf("%d", &digit);
if (digit >= 0 && digit <= 9) {
printf("7-segment display for %d:\n", digit);
for (int i = 0; i < SEGMENTS; i++) {
printf("%c ", seven_seg_digits[digit][i] ? '*' : ' ');
}
printf("\n");
} else {
printf("Invalid digit!\n");
}
return 0;
}
この例では、2次元查找表を使用して、数字0から9の7セグメントディスプレイのパターンを格納しています。各行は数字を表し、各列はセグメント(1はオン、0はオフ)を表します。これにより、任意の数字に対して迅速に正しいパターンを取得できます。
結論
查找表はプログラマーのツールキットにおける強力なツールです。特に計算が複雑で頻繁に繰り返される場合、メモリと速度のトレードオフを利用してパフォーマンスを大幅に向上させることができます。プログラミングの旅を続ける中で、查找表の応用はさらに多く見つかるでしょう。
実践は完璧を生みます!さまざまなシナリオでの查找表を作成してみてください。お楽しみください、そして質問があればお気軽にどうぞ!
Credits: Image by storyset