C語言中的查找表:初學者指南

您好,有抱負的程序员!今天,我們將進入C語言中查找表的精彩世界。如果你是编程新手,別擔心——我會一步一步地引導你了解這個概念,就像我過去幾年來為無數學生做的那樣。所以,讓我們一起踏上這個旅程吧!

C - Lookup Tables

什麼是查找表?

在我們跳到示例之前,讓我們先了解查找表是什麼。想像你在一個圖書館裡,不是通過翻遍每一本書來找到你需要的東西,而是使用一個目錄,告訴你每本書的具體位置。在編程中,查找表基本上就是這麼做的——它是一種數據結構,用簡單的數組索引操作替換運行時計算。

現在,讓我們通過一些實際示例來探索這個概念。

示例 1:星期天

讓我們從一個簡單的例子開始——星期的查找表。

#include <stdio.h>

int main() {
const char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int day_number;

printf("輸入星期的數字 (0-6): ");
scanf("%d", &day_number);

if (day_number >= 0 && day_number <= 6) {
printf("那天是: %s\n", days[day_number]);
} else {
printf("無效的星期的數字!\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("輸入大寫的單詞: ");
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("輸入華氏溫度 (0-100): ");
scanf("%d", &fahrenheit);

if (fahrenheit >= 0 && fahrenheit <= 100) {
printf("%.2f°C\n", celsius_table[fahrenheit]);
} else {
printf("溫度超出範圍!\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("輸入角度 (0-359): ");
scanf("%d", &angle);

if (angle >= 0 && angle < 360) {
printf("sin(%d°) = %.4f\n", angle, sine_table[angle]);
} else {
printf("角度超出範圍!\n");
}

return 0;
}

這個示例預先計算了從0到359度的正弦值。使用這個查找表,我們可以快速獲取正弦值,而不需要在運行時執行計算成本高昂的正弦函數。

7段LED顯示查找表

最後,讓我們看看查找表如何在實際應用中使用的——驅動7段LED顯示。

#include <stdio.h>

#define SEGMENTS 7

int main() {
// 7段LED顯示的查找表 (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("輸入一個數字 (0-9): ");
scanf("%d", &digit);

if (digit >= 0 && digit <= 9) {
printf("7段LED顯示 %d:\n", digit);
for (int i = 0; i < SEGMENTS; i++) {
printf("%c ", seven_seg_digits[digit][i] ? '*' : ' ');
}
printf("\n");
} else {
printf("無效的數字!\n");
}

return 0;
}

在這個示例中,我們使用一個2維查找表來存儲數字0-9在7段LED顯示上的段模式。每行代表一個數字,每列代表一段(1表示亮,0表示滅)。這樣可以讓我們快速獲取任何數字的正確模式。

結論

查找表是程序员工具箱中的強大工具。它們可以通過交換記憶體和速度來顯著提高性能,特別是在計算複雜或經常重複的情況下。隨著你編程旅程的繼續,你會發現查找表的更多應用。

記住,熟能生巧!試著為不同的場景創建自己的查找表。祝編程愉快,如果你有任何問題,請隨時聯繫我!

Credits: Image by storyset