C中的摩尔斯电码转换器

Her*_*erp -3 c encoder decoder

是的它的功课我们假设有char二维数组保持字符,大小限制为255个字符 char string[100][255];

程序neede:用户将输入的莫尔斯码改为字母/英文字母(大写字母)

样本输入

2

 .... . .-.. .-.. --- / .-- --- .-. .-.. -..

 .--- --- -.- .
Run Code Online (Sandbox Code Playgroud)

样品OutPut

我唯一的想法是让一个单词的第一个字符由用户输入..要检查它是否是'.' 或' - '然后仔细并手动分配..嵌套if(string[i][c]=='.') 和最后一个如果在每个嵌套上将if(string[i][c]==' ')打印出字母"E"示例

if(string[i][c]=='.') {
    isspace(string[i][c+1])
    printf("E");
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是..有没有更简单的方法来解决这个问题?我不需要输入相同的' - '和'.' 如果声明..和东西?我的思绪爆炸了吗?因为我用if或case语句丢失了对应下一个char的跟踪?

M O*_*ehm 11

你已经发现了,你可以在每个莫尔斯信号,它是烦人硬编码的所有作为该部门if- else语句.当您这样做时,您将注意到具有更深嵌套条件的特定结构.您可以将此结构表示为树:

                       *
                   /       \
               E               T
             /   \           /   \
           I       A       N       M
          / \     / \     / \     / \ 
         S   U   R   W   D   K   G   O
        / \ / \ / \ / \ / \ / \ / \ / \ 
        H V F * L * P J B X C Y Z Q * *
Run Code Online (Sandbox Code Playgroud)

同样的树可以在莫斯科代码维基百科条目中间部分(稍微)更漂亮的形式中找到.(最下面一行中的星号表示编码不是英文字母的26个字母之一.)

你从顶部开始.分支留在dit上,分支在dah上,并在完成后读取值.

有很多方法可以实现树.在这种情况下,树的分支都具有相同的深度,至少如果我们考虑星号也是如此.您可以通过逐行索引节点将树表示为线性数组.当toe top node为1时,你得到:

                       1
                   /       \
               2               3
             /   \           /   \
           4       5       6       7
          / \     / \     / \     / \ 
         8   9  10  11  12  13  14  15
        / \ / \ / \ / \ / \ / \ / \ / \
       16 ...                     ... 31
Run Code Online (Sandbox Code Playgroud)

您可以看到从节点左侧的分支n将您带到节点,2*n并且分支右侧将您带到索引的右邻居2*n + 1.从1开始构建索引,然后在数组中查找你的字母:

const char *letter = "**ETIANMSURWDKGOHVF?L?PJBXCYZQ??";
Run Code Online (Sandbox Code Playgroud)

(前面的两个星号表示非法指数.)