是的,它的功课
我们假设有char 2D数组,其字符的大小限制为255 char char string[100][255];

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

样本输入

2

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

 .--- --- -.- .


样品输出


情况1:

HELLO WORLD

情况#2:

JOKE



我唯一的想法是让用户输入单词的第一个字符,以检查其是否为“。”或'-'然后仔细地手动分配..嵌套的if(string[i][c]=='.'),如果每个嵌套的最后一个if(string[i][c]==' ')是,则打印出字母“ E”的示例

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


现在我的问题是..有没有更简单的方法来解决这个问题?我不必输入相同的“-”和“。”如果声明..和东西?我的头脑爆炸了吗?因为我无法使用if或case语句跟踪下一个字符的对应关系?

最佳答案

您已经发现可以在每个摩尔斯信号上分支,并且很难将所有这些都硬编码为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 * *


可以在middle sections of the Wikipedia entry on Morse code中以(稍微)漂亮的形式找到同一棵树。 (最下面一行的星号表示的编码不是英语字母的26个字母之一。)

您从顶部开始。在dit上向左分支,在dah上向右分支,完成后读取值。

有很多方法可以实现树。在这种情况下,至少在考虑星号的情况下,树的分支都具有相同的深度。您可以通过按行索引节点来将树表示为线性数组。当脚趾顶部节点为1时,您将获得:

                       1
                   /       \
               2               3
             /   \           /   \
           4       5       6       7
          / \     / \     / \     / \
         8   9  10  11  12  13  14  15
        / \ / \ / \ / \ / \ / \ / \ / \
       16 ...                     ... 31


您可以看到,从节点n左分支将您带到节点2*n,向右分支将您带到索引为2*n + 1的右邻居。从1开始建立索引,然后在数组中查找字母:

const char *letter = "**ETIANMSURWDKGOHVF?L?PJBXCYZQ??";


(前面的两个星号表示非法索引。)

关于c - C语言中的摩尔斯电码转换器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28045172/

10-10 06:39