摩尔斯电码破译。类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文。请不要使用"zylib.h",只能使用标准库函数。用' * '表示' . ',中间空格用' | '表示,只转化字符表。
首先是读入问题,采用scanf一次将所有输入全部放入一个字符组中。然后搜素保存好的字符,输出对应的字母。
问题是,如何判断字符串与字母的对应关系。
观察题中所给表格,发现只存在“-”和“*”两种符号且一共24种组合。可以考虑使用二叉树保存表格往左为“*”往右为“-”使字母与二叉树的节点相对应。
二叉树编号从一开始由上至下由左至右依次排列,在根据表格在相应位置填入字母,在没有字母的节点使用特殊数字表示(我用1表示没有相应字母)。最后将该二叉树保存,我使用一维数组保存,用数组下标表示结点编号,数组存储字母和特殊字符。
在树中搜索时只需定义变量i=1;当为*时i=i*2;为-时i=i*2+1;为|时输出以当前i值为下标的字母并且将i值重新置1.
#include <stdio.h>
#include<string.h>
int main(void)
{
char str[100000];
char found[33]={"11etianmsurwdkgohvf1l1p1b1cyzq11"};/*保存了整颗树*/
int cur,i,a;
scanf("%s",str);
a=strlen(str);
for(cur=0,i=1;cur<a;cur++) /*遍历完输入的所有字符*/
{
switch(str[cur]) /*搜索树*/
{
case 42:i*=2;break;
case '-':i=i*2+1;break;
case '|':printf("%c",found[i]);i=1;break;
default:;
}
}
printf("%c",found[i]); /*由于最后一组字母没有以|结束,这里用于将其直接输出*/
return 0;
}