是的,它的功课
我们假设有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/