问题描述
摩尔斯电码破译。类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文。请不要使用"zylib.h",只能使用标准库函数。用' * '表示' . ',中间空格用' | '表示,只转化字符表。
摩尔斯码定义见:http://baike.baidu.com/view/84585.htm?fromId=253988。
提示
清橙进行评测时,输入是以EOF结尾的,而不是换行符。(EOF不是一个字符,“以EOF结尾”是一种通俗但不严谨的说法。)因此可以通过以下方式之一获取输入:
1. 一次读入整行字符串,再进行后续解析。
2. 使用getchar或scanf一次读入一个字符,通过它们的返回值判断输入结束。
样例输出
思路:先用二维数组存储摩尔斯电码,再将接收到的电码与之比较,用ACSII码处理更方便
编译器上没有什么问题,但是测试不通过,不知道为什么,也许和循环输入有关,EOF
#include
#include
#include
int main( )
{
char ch[26][5];
strcpy(ch[0],"*-");
strcpy(ch[1],"-***");
strcpy(ch[2],"-*-*");
strcpy(ch[3],"-**");
strcpy(ch[4],"*");
strcpy(ch[5],"**-*");
strcpy(ch[6],"--*");
strcpy(ch[7],"****");
strcpy(ch[8],"**");
strcpy(ch[9],"*---");
strcpy(ch[10],"-*-");
strcpy(ch[11],"*-**");
strcpy(ch[12],"--");
strcpy(ch[13],"-*");
strcpy(ch[14],"---");
strcpy(ch[15],"*--*");
strcpy(ch[16],"--*-");
strcpy(ch[17],"*-*");
strcpy(ch[18],"***");
strcpy(ch[19],"-");
strcpy(ch[20],"**-");
strcpy(ch[21],"***-");
strcpy(ch[22],"*--");
strcpy(ch[23],"-**-");
strcpy(ch[24],"-*--");
strcpy(ch[25],"--**");
int i=0;
char c;
char str[5];
while(scanf("%c",&c)!=EOF)
{
if(c=='|'||c=='\n')
{
str[i]='\0';
for(int j=0;j<26;j++)
{
if(strlen(str)==strlen(ch[j]))
if(!strncmp(str,ch[j],strlen(ch[j])))
{
printf("%c",j+'a');
break;
}
}
i=0;
continue;
}
str[i++]=c;
}
return 0;
}
测试通过
#include
#include
#include
int main( )
{
//将摩尔斯电码存入二维数组
char ch[26][5];
strcpy(ch[0],"*-");
strcpy(ch[1],"-***");
strcpy(ch[2],"-*-*");
strcpy(ch[3],"-**");
strcpy(ch[4],"*");
strcpy(ch[5],"**-*");
strcpy(ch[6],"--*");
strcpy(ch[7],"****");
strcpy(ch[8],"**");
strcpy(ch[9],"*---");
strcpy(ch[10],"-*-");
strcpy(ch[11],"*-**");
strcpy(ch[12],"--");
strcpy(ch[13],"-*");
strcpy(ch[14],"---");
strcpy(ch[15],"*--*");
strcpy(ch[16],"--*-");
strcpy(ch[17],"*-*");
strcpy(ch[18],"***");
strcpy(ch[19],"-");
strcpy(ch[20],"**-");
strcpy(ch[21],"***-");
strcpy(ch[22],"*--");
strcpy(ch[23],"-**-");
strcpy(ch[24],"-*--");
strcpy(ch[25],"--**");
int I,j,k=0;
char str[1000];
char code[5];
scanf("%s",str);//输入摩尔斯电码
for(i=0;i<=strlen(str);i++)//遍历str,长度为 strlen(str)
{
code[k++]=str[i];//单个码单独处理
if(str[i]=='|'||str[i]=='\0')
{
code[k-1]='\0';//'\0'字符串结束标志,k-1表示覆盖掉'|'
for(j=0;j<26;j++)
{
if(strlen(code)==strlen(ch[j]))//码长度相等
{
if(!strncmp(code,ch[j],strlen(ch[j])))//码字符相同 ,strncmp()是字符串比较函数
{
printf("%c",j+'a');//ASCII码,字符'a'加一个整数,则偏移为对应字符
break;//结束当层循环
}
}
}
k=0;
}
}
return 0;
}