从文件输出摩尔斯电码

时间:2013-07-31 19:50:20

标签: matlab

我的程序应该读取文本文件并以莫尔斯电码输出。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function morse(filename)

% MORSE converts text morse code and writes it to a file



% Defining Characters & Numbers
    A = ['.-'];
    B = ['-...'];
    C = ['-.-.'];
    D = ['-..'];
    E = ['.'];
    F = ['..-.'];
    G = ['--.'];
    H = ['....'];
    I = ['..'];
    J = ['.---'];
    K = ['-.-'];
    L = ['.-..'];
    M = ['--'];
    N = ['-.'];
    O = ['---'];
    P = ['.--.'];
    Q = ['--.-'];
    R = ['.-.'];
    S = ['...'];
    T = ['-'];
    U = ['..-'];
    V = ['...-'];
    W = ['.--'];
    X = ['-..-'];
    Y = ['-.--'];
    Z = ['--..'];
    period = ['.-.-.-'];
    comma = ['--..--'];
    question = ['..--..'];
    slash_ = ['-..-.'];
    n1 = ['.----'];
    n2 = ['..---'];
    n3 = ['...--'];
    n4 = ['....-'];
    n5 = ['.....'];  
    n6 = ['-....'];
    n7 = ['--...'];
    n8 = ['---..']; 
    n9 = ['----.'];
    n0 = ['-----'];

    text = upper(text);
    vars ={'period','comma','question','slash_'};
    morsecode=[];
    for i=1:length(text)
        if isvarname(text(i))
        morsecode = [morsecode;eval(text(i))];
        elseif ismember(text(i),'.,?/')
            x = findstr(text(i),'.,?/');
            morsecode = [morsecode;eval(vars{x})];
        elseif ~isempty(str2num(text(i)))
            morsecode = [morsecode;eval(['n' text(i)])];
        elseif text(i)==' '
            morsecode = [' '];
        end
        morsecode = [morsecode;eval(text(i))];
    end
     code = morsecode;
    if exist('file','var')
        fprintf(code, '%c')
    end

2 个答案:

答案 0 :(得分:2)

尽管有一个可怕的问题, 是一个很好的项目imo,让我思考:你怎么能以优雅的方式进行这种文本到莫斯的转换。这导致我不可避免地要实现以下实现(对于OP:接受我简单的代码并从中学习)。

最好的怪癖imo就是带有cell2matarrayfun的单行代码(如果你想调试每一步,可以将代码分成更多行和一个中间变量)。

  

text2morsefile.m:

function text2morsefile(txt,filename)
    fid = fopen(filename,'w');
    fprintf(fid,text2morse(txt));
    fclose(fid);
end
function m = text2morse(str)
    m=cell2mat(arrayfun(@char2morse,str,'uni',false));
end
function m = char2morse(ch)
    persistent morsemap;
    if isempty(morsemap)
        morsemap ={'   ','-.-.--', '.-..-.', NaN, '...-..-', NaN, '.-...', '.----.',...
            '-.--.', '-.--.-', NaN, '.-.-.', '--..--', '-....-', '.-.-.-', '-..-.',...
            '-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...',...
            '---..', '----.', '---...', '-.-.-.', NaN, '-...-', NaN, '..--..',...
            '.--.-.', '.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..',...
            '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...',...
            '-', '..-', '...-', '.--', '-..-', '-.--', '--..', NaN,NaN,NaN,NaN,'..--.-'};    
    end
    % specify char for non-morse character:
    missingmorse_symbol = '';
    ch = double(upper(ch));
    m = NaN;
    if ch>=32 && ch<=95
        m = morsemap{ch-31};
    end
    if isnan(m)
        m = missingmorse_symbol;
    else
        % might add extra space between characters?
        m = [m ' '];
    end
end

答案 1 :(得分:1)

您可以使用strrep功能开始。你最好先做你的时期,否则你最终会替换部分已经用莫尔斯代码化的字母。

示例:

testString = sttrep('ABCD','A','.-');

将导致testString = '.-BCD'