-6

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

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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
4

2 回答 2

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
于 2013-07-31T20:53:05.287 回答
1

您可以使用该strrep功能开始。不过,你最好先做月经,否则你最终会替换部分已经用莫尔斯电码编码的字母。

例子:

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

将导致testString = '.-BCD'

于 2013-07-31T20:12:16.997 回答