C程序-蓝桥-摩尔斯电码

 

问题描述

  摩尔斯电码破译。类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文。请不要使用"zylib.h",只能使用标准库函数。用' * '表示' . ',中间空格用' | '表示,只转化字符表。

  摩尔斯码定义见:http://baike.baidu.com/view/84585.htm?fromId=253988。
 

提示

  清橙进行评测时,输入是以EOF结尾的,而不是换行符。(EOF不是一个字符,“以EOF结尾”是一种通俗但不严谨的说法。)因此可以通过以下方式之一获取输入:

  1. 一次读入整行字符串,再进行后续解析。

  2. 使用getchar或scanf一次读入一个字符,通过它们的返回值判断输入结束。

样例输出

 

思路:先用二维数组存储摩尔斯电码,再将接收到的电码与之比较,用ACSII码处理更方便

 

编译器上没有什么问题,但是测试不通过,不知道为什么,也许和循环输入有关,EOF

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>


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;
}

 C++语法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <map>
using namespace std;


int main( )
{
    //将摩尔斯电码存入map容器
    map<string,string> morseCode = map<string,string>();
    morseCode["*-"]     = "a";
    morseCode["-***"]   = "b";
    morseCode["-*-*"]   = "c";
    morseCode["-**"]    = "d";
    morseCode["*"]      = "e";
    morseCode["**-*"]   = "f";
    morseCode["--*"]    = "g";
    morseCode["****"]   = "h";
    morseCode["**"]     = "i";
    morseCode["*---"]   = "j";
    morseCode["-*-"]    = "k";
    morseCode["*-**"]   = "l";
    morseCode["--"]     = "m";
    morseCode["-*"]     = "n";
    morseCode["---"]    = "o";
    morseCode["*--*"]   = "p";
    morseCode["--*-"]   = "q";
    morseCode["*-*"]    = "r";
    morseCode["***"]    = "s";
    morseCode["-"]      = "t";
    morseCode["**-"]    = "u";
    morseCode["***-"]   = "v";
    morseCode["*--"]    = "w";
    morseCode["-**-"]   = "z";
    morseCode["-*--"]   = "y";
    morseCode["--**"]   = "z";

    string arr = string();
    cin >> arr; // 输入字符串

    int aStart = 0;
    int aEnd = 0;
    while(true)
    {
        // 查找分割符位置
        aEnd = arr.find('|', aStart);

        // 找不到分隔符位置,只有一个码,或者末尾
        if(aEnd < 0)
            aEnd = arr.size();

        // 分割字符串
        string aSubStr = arr.substr(aStart, aEnd - aStart);
        // 在map容器中查找该码
        auto it = morseCode.find(aSubStr);
        if(it != morseCode.end())
        {
            // 找到就直接输出
            cout << it->second;
        }

        // 处理结束退出循环
        if(aEnd == (int)arr.size())
            break;

        aStart = aEnd + 1;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值