-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

ひどい質問にもかかわらず、これ素晴らしいプロジェクトであり、考えさせられました:このテキストからモールスへの変換をエレガントな方法で行うにはどうすればよいでしょうか。これにより、必然的に次の実装にたどり着きました(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 に答える