莫尔斯电码是最古老的数字编码之一:每个字母对应一串点和划。用 C 语言实现英文字母到莫尔斯电码的编码,核心代码只要十几行。

思路

把 26 个字母的莫尔斯码按字母表顺序存进一个字符串指针数组,编码时把字符减去 'a' 得到下标,直接查表输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *code[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-.",
".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

void translate1(char *x, int n)
{
printf("莫斯编码后:\n");
for(int i = 0; i < n; i++)
{
if(x[i] >= 'a' && x[i] <= 'z')
printf("%s ", code[(int)x[i] - 'a']); // 查表编码
else
printf("%c ", x[i]); // 非字母原样输出
}
}

关键点

“字符运算当数组下标” 是这类查表法的核心:'a' 的 ASCII 是 97,'b' 是 98……所以 x[i] - 'a' 正好是字母在表中的位置。同理,数字字符转数值用 c - '0',也是同一个思路。

输入 hello world,输出:

1
.... . .-.. .-.. ---  .-- --- .-. .-.. -..

可以继续玩的方向

  • 补上解码函数:把点和划的序列反查回字母(strcmp 遍历或建一颗二叉树——点走左子树、划走右子树)
  • 用蜂鸣器或 Beep() 把点和划响出来,就是一台声报机