Таблицы поиска в C: руководство для начинающих
Здравствуйте, начинающие программисты! Сегодня мы окунемся в захватывающий мир таблиц поиска в C. Не волнуйтесь, если вы новички в программировании – я проведу вас через этот концепт шаг за шагом, как я уже делал это для countless студентов на протяжении многих лет teaching. Так что отправляемся в это путешествие вместе!
Что такое таблицы поиска?
Прежде чем мы перейдем к примерам, давайте поймем, что такое таблицы поиска. Представьте, что вы находитесь в библиотеке, и вместо того чтобы искать каждую книгу, чтобы найти то, что вам нужно, вы используете каталог, который tells вам exactly, где находится каждая книга. Вот что делает таблица поиска в программировании – это структура данных, которая заменяет вычисления во время выполнения simpler array indexing operation.
Теперь давайте исследуем этот концепт с помощью некоторых prakticheskih примеров.
Пример 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 statements!
Пример 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;
}
Здесь мы создали таблицу поиска для кода Морзе. Each letter's Morse code is stored in the morse
array. When a user enters a word, we translate each letter to its Morse code equivalent by using the ASCII value of the letter as an index into our lookup table.
Пример 3: Преобразование температуры
Давайте создадим таблицу поиска для быстрого преобразования Фаренгейта в Цельсия.
#include <stdio.h>
#define TABLE_SIZE 101
int main() {
float celsius_table[TABLE_SIZE];
int i;
// Populate the lookup table
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;
// Populate the lookup table
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() {
// Lookup table for 7-segment display (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;
}
В этом примере мы используем 2D таблицу поиска для хранения шаблонов сегментов для цифр 0-9 на 7-сегментном индикаторе. Each row represents a digit, and each column represents a segment (1 for on, 0 for off). This allows us to quickly retrieve the correct pattern for any digit.
Заключение
Таблицы поиска – это мощный инструмент в арсенале программиста. Они могут значительно улучшить производительность, торгуя памятью на速度, особенно в ситуациях, где вычисления сложны или часто повторяются. По мере того как вы продолжаете свое путешествие в программировании, вы найдете множество других применений для таблиц поиска.
Remember, practice makes perfect! Try creating your own lookup tables for different scenarios. Happy coding, and don't hesitate to reach out if you have any questions!
Credits: Image by storyset