我的程序应该读取文本文件并以莫尔斯电码输出。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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
答案 0 :(得分:2)
尽管有一个可怕的问题, 是一个很好的项目imo,让我思考:你怎么能以优雅的方式进行这种文本到莫斯的转换。这导致我不可避免地要实现以下实现(对于OP:接受我简单的代码并从中学习)。
最好的怪癖imo就是带有cell2mat和arrayfun的单行代码(如果你想调试每一步,可以将代码分成更多行和一个中间变量)。
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'